diff --git a/btgui/FontFiles/DroidSansJapanese.ttf b/btgui/FontFiles/DroidSansJapanese.ttf new file mode 100644 index 000000000..412fa3de0 Binary files /dev/null and b/btgui/FontFiles/DroidSansJapanese.ttf differ diff --git a/btgui/FontFiles/DroidSerif-Bold.ttf b/btgui/FontFiles/DroidSerif-Bold.ttf new file mode 100644 index 000000000..838d25588 Binary files /dev/null and b/btgui/FontFiles/DroidSerif-Bold.ttf differ diff --git a/btgui/FontFiles/DroidSerif-Italic.ttf b/btgui/FontFiles/DroidSerif-Italic.ttf new file mode 100644 index 000000000..2972809da Binary files /dev/null and b/btgui/FontFiles/DroidSerif-Italic.ttf differ diff --git a/btgui/FontFiles/DroidSerif-Regular.ttf b/btgui/FontFiles/DroidSerif-Regular.ttf new file mode 100644 index 000000000..5b4fe815d Binary files /dev/null and b/btgui/FontFiles/DroidSerif-Regular.ttf differ diff --git a/btgui/FontFiles/OpenSans.cpp b/btgui/FontFiles/OpenSans.cpp new file mode 100644 index 000000000..a0f685f6d --- /dev/null +++ b/btgui/FontFiles/OpenSans.cpp @@ -0,0 +1,21738 @@ +char OpenSansData[]={char(0),char(1),char(0),char(0),char(0),char(19),char(1),char(0),char(0),char(4), +char(0),char(48),char(68),char(83),char(73),char(71),char(158),char(18),char(68),char(29), +char(0),char(3),char(59),char(156),char(0),char(0),char(21),char(116),char(71),char(68), +char(69),char(70),char(0),char(38),char(3),char(175),char(0),char(3),char(55),char(124), +char(0),char(0),char(0),char(30),char(71),char(80),char(79),char(83),char(11),char(55), +char(15),char(55),char(0),char(3),char(55),char(156),char(0),char(0),char(0),char(56), +char(71),char(83),char(85),char(66),char(14),char(43),char(61),char(183),char(0),char(3), +char(55),char(212),char(0),char(0),char(3),char(198),char(79),char(83),char(47),char(50), +char(161),char(62),char(158),char(201),char(0),char(0),char(1),char(184),char(0),char(0), +char(0),char(96),char(99),char(109),char(97),char(112),char(41),char(171),char(47),char(104), +char(0),char(0),char(16),char(180),char(0),char(0),char(4),char(26),char(99),char(118), +char(116),char(32),char(15),char(77),char(24),char(164),char(0),char(0),char(29),char(144), +char(0),char(0),char(0),char(162),char(102),char(112),char(103),char(109),char(126),char(97), +char(182),char(17),char(0),char(0),char(20),char(208),char(0),char(0),char(7),char(180), +char(103),char(97),char(115),char(112),char(0),char(21),char(0),char(35),char(0),char(3), +char(55),char(108),char(0),char(0),char(0),char(16),char(103),char(108),char(121),char(102), +char(116),char(56),char(153),char(75),char(0),char(0),char(37),char(140),char(0),char(1), +char(47),char(180),char(104),char(101),char(97),char(100),char(247),char(118),char(226),char(166), +char(0),char(0),char(1),char(60),char(0),char(0),char(0),char(54),char(104),char(104), +char(101),char(97),char(13),char(204),char(9),char(115),char(0),char(0),char(1),char(116), +char(0),char(0),char(0),char(36),char(104),char(109),char(116),char(120),char(232),char(53), +char(60),char(221),char(0),char(0),char(2),char(24),char(0),char(0),char(14),char(154), +char(107),char(101),char(114),char(110),char(84),char(43),char(9),char(126),char(0),char(1), +char(85),char(64),char(0),char(1),char(182),char(54),char(108),char(111),char(99),char(97), +char(41),char(20),char(220),char(241),char(0),char(0),char(30),char(52),char(0),char(0), +char(7),char(86),char(109),char(97),char(120),char(112),char(5),char(67),char(2),char(10), +char(0),char(0),char(1),char(152),char(0),char(0),char(0),char(32),char(110),char(97), +char(109),char(101),char(115),char(176),char(136),char(133),char(0),char(3),char(11),char(120), +char(0),char(0),char(5),char(199),char(112),char(111),char(115),char(116),char(2),char(67), +char(239),char(108),char(0),char(3),char(17),char(64),char(0),char(0),char(38),char(43), +char(112),char(114),char(101),char(112),char(67),char(183),char(150),char(164),char(0),char(0), +char(28),char(132),char(0),char(0),char(1),char(9),char(0),char(1),char(0),char(0), +char(0),char(1),char(25),char(154),char(33),char(199),char(245),char(95),char(95),char(15), +char(60),char(245),char(0),char(9),char(8),char(0),char(0),char(0),char(0),char(0), +char(201),char(53),char(49),char(139),char(0),char(0),char(0),char(0),char(201),char(232), +char(76),char(76),char(251),char(154),char(253),char(213),char(9),char(162),char(8),char(98), +char(0),char(0),char(0),char(9),char(0),char(2),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(1),char(0),char(0),char(8),char(141),char(253),char(168), +char(0),char(0),char(9),char(172),char(251),char(154),char(254),char(123),char(9),char(162), +char(0),char(1),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(3),char(163),char(0),char(1), +char(0),char(0),char(3),char(170),char(0),char(138),char(0),char(22),char(0),char(86), +char(0),char(5),char(0),char(2),char(0),char(16),char(0),char(47),char(0),char(92), +char(0),char(0),char(1),char(14),char(0),char(248),char(0),char(3),char(0),char(1), +char(0),char(3),char(4),char(182),char(1),char(144),char(0),char(5),char(0),char(8), +char(5),char(154),char(5),char(51),char(0),char(0),char(1),char(31),char(5),char(154), +char(5),char(51),char(0),char(0),char(3),char(209),char(0),char(102),char(1),char(241), +char(8),char(2),char(2),char(11),char(6),char(6),char(3),char(5),char(4),char(2), +char(2),char(4),char(224),char(0),char(2),char(239),char(64),char(0),char(32),char(91), +char(0),char(0),char(0),char(40),char(0),char(0),char(0),char(0),char(49),char(65), +char(83),char(67),char(0),char(64),char(0),char(32),char(255),char(253),char(6),char(31), +char(254),char(20),char(0),char(132),char(8),char(141),char(2),char(88),char(32),char(0), +char(1),char(159),char(0),char(0),char(0),char(0),char(4),char(72),char(5),char(182), +char(0),char(0),char(0),char(32),char(0),char(3),char(4),char(205),char(0),char(193), +char(0),char(0),char(0),char(0),char(4),char(20),char(0),char(0),char(2),char(20), +char(0),char(0),char(2),char(35),char(0),char(152),char(3),char(53),char(0),char(133), +char(5),char(43),char(0),char(51),char(4),char(147),char(0),char(131),char(6),char(150), +char(0),char(104),char(5),char(215),char(0),char(113),char(1),char(197),char(0),char(133), +char(2),char(94),char(0),char(82),char(2),char(94),char(0),char(61),char(4),char(106), +char(0),char(86),char(4),char(147),char(0),char(104),char(1),char(246),char(0),char(63), +char(2),char(147),char(0),char(84),char(2),char(33),char(0),char(152),char(2),char(240), +char(0),char(20),char(4),char(147),char(0),char(102),char(4),char(147),char(0),char(188), +char(4),char(147),char(0),char(100),char(4),char(147),char(0),char(94),char(4),char(147), +char(0),char(43),char(4),char(147),char(0),char(133),char(4),char(147),char(0),char(117), +char(4),char(147),char(0),char(94),char(4),char(147),char(0),char(104),char(4),char(147), +char(0),char(106),char(2),char(33),char(0),char(152),char(2),char(33),char(0),char(63), +char(4),char(147),char(0),char(104),char(4),char(147),char(0),char(119),char(4),char(147), +char(0),char(104),char(3),char(111),char(0),char(27),char(7),char(49),char(0),char(121), +char(5),char(16),char(0),char(0),char(5),char(47),char(0),char(201),char(5),char(12), +char(0),char(125),char(5),char(213),char(0),char(201),char(4),char(115),char(0),char(201), +char(4),char(33),char(0),char(201),char(5),char(211),char(0),char(125),char(5),char(231), +char(0),char(201),char(2),char(170),char(0),char(84),char(2),char(35),char(255),char(96), +char(4),char(233),char(0),char(201),char(4),char(39),char(0),char(201),char(7),char(57), +char(0),char(201),char(6),char(8),char(0),char(201),char(6),char(59),char(0),char(125), +char(4),char(209),char(0),char(201),char(6),char(59),char(0),char(125),char(4),char(242), +char(0),char(201),char(4),char(100),char(0),char(106),char(4),char(109),char(0),char(18), +char(5),char(211),char(0),char(186),char(4),char(195),char(0),char(0),char(7),char(104), +char(0),char(27),char(4),char(158),char(0),char(8),char(4),char(123),char(0),char(0), +char(4),char(145),char(0),char(82),char(2),char(162),char(0),char(166),char(2),char(240), +char(0),char(23),char(2),char(162),char(0),char(51),char(4),char(86),char(0),char(49), +char(3),char(150),char(255),char(252),char(4),char(158),char(1),char(137),char(4),char(115), +char(0),char(94),char(4),char(231),char(0),char(176),char(3),char(207),char(0),char(115), +char(4),char(231),char(0),char(115),char(4),char(125),char(0),char(115),char(2),char(182), +char(0),char(29),char(4),char(98),char(0),char(39),char(4),char(233),char(0),char(176), +char(2),char(6),char(0),char(162),char(2),char(6),char(255),char(145),char(4),char(51), +char(0),char(176),char(2),char(6),char(0),char(176),char(7),char(113),char(0),char(176), +char(4),char(233),char(0),char(176),char(4),char(213),char(0),char(115),char(4),char(231), +char(0),char(176),char(4),char(231),char(0),char(115),char(3),char(68),char(0),char(176), +char(3),char(209),char(0),char(106),char(2),char(211),char(0),char(31),char(4),char(233), +char(0),char(164),char(4),char(2),char(0),char(0),char(6),char(57),char(0),char(23), +char(4),char(49),char(0),char(39),char(4),char(8),char(0),char(2),char(3),char(190), +char(0),char(82),char(3),char(8),char(0),char(61),char(4),char(104),char(1),char(238), +char(3),char(8),char(0),char(72),char(4),char(147),char(0),char(104),char(2),char(20), +char(0),char(0),char(2),char(35),char(0),char(152),char(4),char(147),char(0),char(190), +char(4),char(147),char(0),char(63),char(4),char(147),char(0),char(123),char(4),char(147), +char(0),char(31),char(4),char(104),char(1),char(238),char(4),char(33),char(0),char(123), +char(4),char(158),char(1),char(53),char(6),char(168),char(0),char(100),char(2),char(213), +char(0),char(70),char(3),char(250),char(0),char(82),char(4),char(147),char(0),char(104), +char(2),char(147),char(0),char(84),char(6),char(168),char(0),char(100),char(4),char(0), +char(255),char(250),char(3),char(109),char(0),char(127),char(4),char(147),char(0),char(104), +char(2),char(199),char(0),char(49),char(2),char(199),char(0),char(33),char(4),char(158), +char(1),char(137),char(4),char(244),char(0),char(176),char(5),char(61),char(0),char(113), +char(2),char(33),char(0),char(152),char(1),char(209),char(0),char(37),char(2),char(199), +char(0),char(76),char(3),char(0),char(0),char(66),char(3),char(250),char(0),char(80), +char(6),char(61),char(0),char(75),char(6),char(61),char(0),char(46),char(6),char(61), +char(0),char(26),char(3),char(111),char(0),char(51),char(5),char(16),char(0),char(0), +char(5),char(16),char(0),char(0),char(5),char(16),char(0),char(0),char(5),char(16), +char(0),char(0),char(5),char(16),char(0),char(0),char(5),char(16),char(0),char(0), +char(6),char(252),char(255),char(254),char(5),char(12),char(0),char(125),char(4),char(115), +char(0),char(201),char(4),char(115),char(0),char(201),char(4),char(115),char(0),char(201), +char(4),char(115),char(0),char(201),char(2),char(170),char(0),char(60),char(2),char(170), +char(0),char(84),char(2),char(170),char(255),char(255),char(2),char(170),char(0),char(60), +char(5),char(199),char(0),char(47),char(6),char(8),char(0),char(201),char(6),char(59), +char(0),char(125),char(6),char(59),char(0),char(125),char(6),char(59),char(0),char(125), +char(6),char(59),char(0),char(125),char(6),char(59),char(0),char(125),char(4),char(147), +char(0),char(133),char(6),char(59),char(0),char(125),char(5),char(211),char(0),char(186), +char(5),char(211),char(0),char(186),char(5),char(211),char(0),char(186),char(5),char(211), +char(0),char(186),char(4),char(123),char(0),char(0),char(4),char(227),char(0),char(201), +char(4),char(250),char(0),char(176),char(4),char(115),char(0),char(94),char(4),char(115), +char(0),char(94),char(4),char(115),char(0),char(94),char(4),char(115),char(0),char(94), +char(4),char(115),char(0),char(94),char(4),char(115),char(0),char(94),char(6),char(221), +char(0),char(94),char(3),char(207),char(0),char(115),char(4),char(125),char(0),char(115), +char(4),char(125),char(0),char(115),char(4),char(125),char(0),char(115),char(4),char(125), +char(0),char(115),char(2),char(6),char(255),char(218),char(2),char(6),char(0),char(169), +char(2),char(6),char(255),char(179),char(2),char(6),char(255),char(236),char(4),char(197), +char(0),char(113),char(4),char(233),char(0),char(176),char(4),char(213),char(0),char(115), +char(4),char(213),char(0),char(115),char(4),char(213),char(0),char(115),char(4),char(213), +char(0),char(115),char(4),char(213),char(0),char(115),char(4),char(147),char(0),char(104), +char(4),char(213),char(0),char(115),char(4),char(233),char(0),char(164),char(4),char(233), +char(0),char(164),char(4),char(233),char(0),char(164),char(4),char(233),char(0),char(164), +char(4),char(8),char(0),char(2),char(4),char(231),char(0),char(176),char(4),char(8), +char(0),char(2),char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94), +char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94),char(5),char(16), +char(0),char(0),char(4),char(115),char(0),char(94),char(5),char(12),char(0),char(125), +char(3),char(207),char(0),char(115),char(5),char(12),char(0),char(125),char(3),char(207), +char(0),char(115),char(5),char(12),char(0),char(125),char(3),char(207),char(0),char(115), +char(5),char(12),char(0),char(125),char(3),char(207),char(0),char(115),char(5),char(213), +char(0),char(201),char(4),char(231),char(0),char(115),char(5),char(199),char(0),char(47), +char(4),char(231),char(0),char(115),char(4),char(115),char(0),char(201),char(4),char(125), +char(0),char(115),char(4),char(115),char(0),char(201),char(4),char(125),char(0),char(115), +char(4),char(115),char(0),char(201),char(4),char(125),char(0),char(115),char(4),char(115), +char(0),char(201),char(4),char(125),char(0),char(115),char(4),char(115),char(0),char(201), +char(4),char(125),char(0),char(115),char(5),char(211),char(0),char(125),char(4),char(98), +char(0),char(39),char(5),char(211),char(0),char(125),char(4),char(98),char(0),char(39), +char(5),char(211),char(0),char(125),char(4),char(98),char(0),char(39),char(5),char(211), +char(0),char(125),char(4),char(98),char(0),char(39),char(5),char(231),char(0),char(201), +char(4),char(233),char(0),char(176),char(5),char(231),char(0),char(0),char(4),char(233), +char(0),char(20),char(2),char(170),char(255),char(226),char(2),char(6),char(255),char(144), +char(2),char(170),char(0),char(42),char(2),char(6),char(255),char(218),char(2),char(170), +char(0),char(30),char(2),char(6),char(255),char(204),char(2),char(170),char(0),char(84), +char(2),char(6),char(0),char(53),char(2),char(170),char(0),char(84),char(2),char(6), +char(0),char(176),char(4),char(205),char(0),char(84),char(4),char(12),char(0),char(162), +char(2),char(35),char(255),char(96),char(2),char(6),char(255),char(145),char(4),char(233), +char(0),char(201),char(4),char(51),char(0),char(176),char(4),char(37),char(0),char(176), +char(4),char(39),char(0),char(201),char(2),char(6),char(0),char(163),char(4),char(39), +char(0),char(201),char(2),char(6),char(0),char(89),char(4),char(39),char(0),char(201), +char(2),char(6),char(0),char(176),char(4),char(39),char(0),char(201),char(2),char(131), +char(0),char(176),char(4),char(47),char(0),char(29),char(2),char(23),char(255),char(252), +char(6),char(8),char(0),char(201),char(4),char(233),char(0),char(176),char(6),char(8), +char(0),char(201),char(4),char(233),char(0),char(176),char(6),char(8),char(0),char(201), +char(4),char(233),char(0),char(176),char(5),char(115),char(0),char(1),char(6),char(8), +char(0),char(201),char(4),char(233),char(0),char(176),char(6),char(59),char(0),char(125), +char(4),char(213),char(0),char(115),char(6),char(59),char(0),char(125),char(4),char(213), +char(0),char(115),char(6),char(59),char(0),char(125),char(4),char(213),char(0),char(115), +char(7),char(98),char(0),char(125),char(7),char(137),char(0),char(113),char(4),char(242), +char(0),char(201),char(3),char(68),char(0),char(176),char(4),char(242),char(0),char(201), +char(3),char(68),char(0),char(96),char(4),char(242),char(0),char(201),char(3),char(68), +char(0),char(130),char(4),char(100),char(0),char(106),char(3),char(209),char(0),char(106), +char(4),char(100),char(0),char(106),char(3),char(209),char(0),char(106),char(4),char(100), +char(0),char(106),char(3),char(209),char(0),char(106),char(4),char(100),char(0),char(106), +char(3),char(209),char(0),char(106),char(4),char(109),char(0),char(18),char(2),char(211), +char(0),char(31),char(4),char(109),char(0),char(18),char(2),char(211),char(0),char(31), +char(4),char(109),char(0),char(18),char(2),char(211),char(0),char(31),char(5),char(211), +char(0),char(186),char(4),char(233),char(0),char(164),char(5),char(211),char(0),char(186), +char(4),char(233),char(0),char(164),char(5),char(211),char(0),char(186),char(4),char(233), +char(0),char(164),char(5),char(211),char(0),char(186),char(4),char(233),char(0),char(164), +char(5),char(211),char(0),char(186),char(4),char(233),char(0),char(164),char(5),char(211), +char(0),char(186),char(4),char(233),char(0),char(164),char(7),char(104),char(0),char(27), +char(6),char(57),char(0),char(23),char(4),char(123),char(0),char(0),char(4),char(8), +char(0),char(2),char(4),char(123),char(0),char(0),char(4),char(145),char(0),char(82), +char(3),char(190),char(0),char(82),char(4),char(145),char(0),char(82),char(3),char(190), +char(0),char(82),char(4),char(145),char(0),char(82),char(3),char(190),char(0),char(82), +char(2),char(143),char(0),char(176),char(4),char(158),char(0),char(195),char(5),char(20), +char(0),char(0),char(4),char(115),char(0),char(94),char(6),char(252),char(255),char(254), +char(6),char(221),char(0),char(94),char(6),char(59),char(0),char(125),char(4),char(213), +char(0),char(115),char(4),char(100),char(0),char(106),char(3),char(209),char(0),char(106), +char(4),char(188),char(1),char(12),char(4),char(188),char(1),char(12),char(4),char(178), +char(1),char(45),char(4),char(188),char(1),char(37),char(2),char(6),char(0),char(162), +char(4),char(158),char(1),char(111),char(1),char(147),char(0),char(37),char(4),char(188), +char(1),char(8),char(4),char(158),char(0),char(231),char(4),char(158),char(1),char(252), +char(4),char(158),char(1),char(27),char(5),char(16),char(0),char(0),char(2),char(33), +char(0),char(152),char(4),char(242),char(255),char(212),char(6),char(125),char(255),char(212), +char(3),char(152),char(255),char(228),char(6),char(129),char(255),char(228),char(5),char(133), +char(255),char(212),char(6),char(129),char(255),char(228),char(2),char(182),char(255),char(233), +char(5),char(16),char(0),char(0),char(5),char(47),char(0),char(201),char(4),char(41), +char(0),char(201),char(4),char(147),char(0),char(39),char(4),char(115),char(0),char(201), +char(4),char(145),char(0),char(82),char(5),char(231),char(0),char(201),char(6),char(59), +char(0),char(125),char(2),char(170),char(0),char(84),char(4),char(233),char(0),char(201), +char(4),char(211),char(0),char(0),char(7),char(57),char(0),char(201),char(6),char(8), +char(0),char(201),char(4),char(109),char(0),char(72),char(6),char(59),char(0),char(125), +char(5),char(213),char(0),char(201),char(4),char(209),char(0),char(201),char(4),char(137), +char(0),char(74),char(4),char(109),char(0),char(18),char(4),char(123),char(0),char(0), +char(6),char(98),char(0),char(106),char(4),char(158),char(0),char(8),char(6),char(94), +char(0),char(109),char(6),char(66),char(0),char(80),char(2),char(170),char(0),char(60), +char(4),char(123),char(0),char(0),char(4),char(227),char(0),char(115),char(3),char(205), +char(0),char(90),char(4),char(233),char(0),char(176),char(2),char(182),char(0),char(168), +char(4),char(223),char(0),char(164),char(4),char(227),char(0),char(115),char(5),char(6), +char(0),char(176),char(4),char(25),char(0),char(10),char(4),char(164),char(0),char(113), +char(3),char(205),char(0),char(90),char(3),char(221),char(0),char(115),char(4),char(233), +char(0),char(176),char(4),char(188),char(0),char(115),char(2),char(182),char(0),char(168), +char(4),char(37),char(0),char(176),char(4),char(70),char(255),char(242),char(4),char(244), +char(0),char(176),char(4),char(86),char(0),char(0),char(3),char(205),char(0),char(113), +char(4),char(213),char(0),char(115),char(5),char(51),char(0),char(25),char(4),char(213), +char(0),char(166),char(3),char(219),char(0),char(115),char(4),char(231),char(0),char(115), +char(3),char(201),char(0),char(18),char(4),char(223),char(0),char(164),char(5),char(190), +char(0),char(115),char(4),char(94),char(255),char(236),char(6),char(6),char(0),char(164), +char(6),char(47),char(0),char(115),char(2),char(182),char(0),char(9),char(4),char(223), +char(0),char(164),char(4),char(213),char(0),char(115),char(4),char(223),char(0),char(164), +char(6),char(47),char(0),char(115),char(4),char(115),char(0),char(201),char(5),char(223), +char(0),char(18),char(4),char(41),char(0),char(201),char(5),char(29),char(0),char(125), +char(4),char(100),char(0),char(106),char(2),char(170),char(0),char(84),char(2),char(170), +char(0),char(60),char(2),char(35),char(255),char(96),char(7),char(111),char(0),char(0), +char(7),char(160),char(0),char(201),char(5),char(223),char(0),char(18),char(4),char(229), +char(0),char(201),char(4),char(248),char(0),char(27),char(5),char(213),char(0),char(201), +char(5),char(16),char(0),char(0),char(4),char(231),char(0),char(201),char(5),char(47), +char(0),char(201),char(4),char(41),char(0),char(201),char(5),char(119),char(0),char(14), +char(4),char(115),char(0),char(201),char(6),char(193),char(0),char(2),char(4),char(166), +char(0),char(74),char(6),char(25),char(0),char(203),char(6),char(25),char(0),char(203), +char(4),char(229),char(0),char(201),char(5),char(162),char(0),char(0),char(7),char(57), +char(0),char(201),char(5),char(231),char(0),char(201),char(6),char(59),char(0),char(125), +char(5),char(213),char(0),char(201),char(4),char(209),char(0),char(201),char(5),char(12), +char(0),char(125),char(4),char(109),char(0),char(18),char(4),char(248),char(0),char(27), +char(6),char(98),char(0),char(106),char(4),char(158),char(0),char(8),char(5),char(229), +char(0),char(201),char(5),char(143),char(0),char(170),char(8),char(66),char(0),char(201), +char(8),char(68),char(0),char(201),char(5),char(129),char(0),char(18),char(6),char(211), +char(0),char(201),char(5),char(37),char(0),char(201),char(5),char(10),char(0),char(61), +char(8),char(102),char(0),char(201),char(5),char(23),char(0),char(51),char(4),char(115), +char(0),char(94),char(4),char(197),char(0),char(119),char(4),char(141),char(0),char(176), +char(3),char(109),char(0),char(176),char(4),char(147),char(0),char(41),char(4),char(125), +char(0),char(115),char(5),char(227),char(0),char(4),char(3),char(221),char(0),char(68), +char(5),char(18),char(0),char(176),char(5),char(18),char(0),char(176),char(4),char(39), +char(0),char(176),char(4),char(145),char(0),char(16),char(5),char(225),char(0),char(176), +char(5),char(18),char(0),char(176),char(4),char(213),char(0),char(115),char(4),char(248), +char(0),char(176),char(4),char(231),char(0),char(176),char(3),char(207),char(0),char(115), +char(3),char(188),char(0),char(41),char(4),char(8),char(0),char(2),char(5),char(184), +char(0),char(113),char(4),char(49),char(0),char(39),char(5),char(2),char(0),char(176), +char(4),char(221),char(0),char(156),char(7),char(31),char(0),char(176),char(7),char(45), +char(0),char(176),char(5),char(143),char(0),char(41),char(6),char(41),char(0),char(176), +char(4),char(188),char(0),char(176),char(3),char(240),char(0),char(57),char(6),char(166), +char(0),char(176),char(4),char(113),char(0),char(37),char(4),char(125),char(0),char(115), +char(4),char(233),char(0),char(20),char(3),char(109),char(0),char(176),char(3),char(240), +char(0),char(115),char(3),char(209),char(0),char(106),char(2),char(6),char(0),char(162), +char(2),char(6),char(255),char(236),char(2),char(6),char(255),char(145),char(6),char(178), +char(0),char(16),char(7),char(23),char(0),char(176),char(4),char(233),char(0),char(20), +char(4),char(39),char(0),char(176),char(4),char(8),char(0),char(2),char(4),char(248), +char(0),char(176),char(4),char(55),char(0),char(201),char(3),char(109),char(0),char(176), +char(7),char(104),char(0),char(27),char(6),char(57),char(0),char(23),char(7),char(104), +char(0),char(27),char(6),char(57),char(0),char(23),char(7),char(104),char(0),char(27), +char(6),char(57),char(0),char(23),char(4),char(123),char(0),char(0),char(4),char(8), +char(0),char(2),char(4),char(0),char(0),char(82),char(8),char(0),char(0),char(82), +char(8),char(0),char(0),char(82),char(3),char(74),char(255),char(252),char(1),char(92), +char(0),char(25),char(1),char(92),char(0),char(25),char(1),char(246),char(0),char(63), +char(1),char(92),char(0),char(25),char(2),char(205),char(0),char(25),char(2),char(205), +char(0),char(25),char(3),char(61),char(0),char(25),char(4),char(4),char(0),char(123), +char(4),char(20),char(0),char(123),char(3),char(2),char(0),char(164),char(6),char(70), +char(0),char(152),char(9),char(158),char(0),char(100),char(1),char(197),char(0),char(133), +char(3),char(37),char(0),char(133),char(2),char(111),char(0),char(82),char(2),char(111), +char(0),char(80),char(3),char(227),char(0),char(152),char(1),char(10),char(254),char(121), +char(3),char(39),char(0),char(109),char(4),char(147),char(0),char(98),char(4),char(147), +char(0),char(68),char(6),char(27),char(0),char(154),char(4),char(184),char(0),char(63), +char(6),char(152),char(0),char(141),char(4),char(41),char(0),char(119),char(8),char(39), +char(0),char(201),char(6),char(53),char(0),char(37),char(6),char(66),char(0),char(80), +char(4),char(244),char(0),char(102),char(6),char(61),char(0),char(71),char(6),char(61), +char(0),char(32),char(6),char(61),char(0),char(71),char(6),char(61),char(0),char(106), +char(4),char(166),char(0),char(102),char(4),char(147),char(0),char(39),char(5),char(233), +char(0),char(201),char(5),char(12),char(0),char(76),char(4),char(147),char(0),char(104), +char(4),char(100),char(0),char(37),char(5),char(164),char(0),char(119),char(3),char(18), +char(0),char(12),char(4),char(147),char(0),char(98),char(4),char(147),char(0),char(104), +char(4),char(147),char(0),char(104),char(4),char(147),char(0),char(104),char(4),char(170), +char(0),char(111),char(4),char(188),char(0),char(29),char(4),char(188),char(0),char(29), +char(4),char(158),char(0),char(219),char(2),char(6),char(255),char(145),char(4),char(0), +char(1),char(137),char(4),char(0),char(1),char(113),char(4),char(0),char(1),char(129), +char(2),char(199),char(0),char(39),char(2),char(199),char(0),char(20),char(2),char(199), +char(0),char(59),char(2),char(199),char(0),char(41),char(2),char(199),char(0),char(57), +char(2),char(199),char(0),char(51),char(2),char(199),char(0),char(35),char(4),char(0), +char(0),char(0),char(8),char(0),char(0),char(0),char(4),char(0),char(0),char(0), +char(8),char(0),char(0),char(0),char(2),char(170),char(0),char(0),char(2),char(0), +char(0),char(0),char(1),char(86),char(0),char(0),char(4),char(121),char(0),char(0), +char(2),char(33),char(0),char(0),char(1),char(154),char(0),char(0),char(0),char(205), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(8),char(0),char(0),char(84),char(8),char(0),char(0),char(84),char(2),char(6), +char(255),char(145),char(1),char(92),char(0),char(25),char(4),char(250),char(0),char(10), +char(4),char(133),char(0),char(0),char(6),char(184),char(0),char(18),char(7),char(57), +char(0),char(201),char(7),char(113),char(0),char(176),char(5),char(16),char(0),char(0), +char(4),char(115),char(0),char(94),char(6),char(82),char(254),char(223),char(2),char(170), +char(0),char(117),char(3),char(51),char(0),char(152),char(7),char(117),char(0),char(29), +char(7),char(117),char(0),char(29),char(6),char(61),char(0),char(125),char(4),char(223), +char(0),char(115),char(6),char(37),char(0),char(186),char(5),char(82),char(0),char(164), +char(0),char(0),char(252),char(83),char(0),char(0),char(253),char(13),char(0),char(0), +char(252),char(25),char(0),char(0),char(253),char(8),char(0),char(0),char(253),char(59), +char(4),char(115),char(0),char(201),char(6),char(25),char(0),char(203),char(4),char(125), +char(0),char(115),char(5),char(18),char(0),char(176),char(8),char(23),char(0),char(133), +char(6),char(141),char(0),char(0),char(5),char(102),char(0),char(23),char(5),char(14), +char(0),char(23),char(7),char(90),char(0),char(201),char(5),char(227),char(0),char(176), +char(5),char(109),char(0),char(0),char(4),char(131),char(0),char(10),char(7),char(94), +char(0),char(201),char(6),char(33),char(0),char(176),char(5),char(197),char(0),char(20), +char(5),char(35),char(0),char(12),char(7),char(203),char(0),char(201),char(6),char(197), +char(0),char(176),char(4),char(168),char(0),char(63),char(3),char(221),char(0),char(25), +char(6),char(94),char(0),char(109),char(6),char(6),char(0),char(164),char(6),char(61), +char(0),char(125),char(4),char(213),char(0),char(115),char(5),char(2),char(0),char(0), +char(4),char(12),char(0),char(0),char(5),char(2),char(0),char(0),char(4),char(12), +char(0),char(0),char(9),char(172),char(0),char(125),char(8),char(125),char(0),char(115), +char(6),char(141),char(0),char(125),char(5),char(66),char(0),char(115),char(7),char(254), +char(0),char(125),char(6),char(119),char(0),char(115),char(7),char(223),char(0),char(94), +char(6),char(141),char(0),char(0),char(5),char(29),char(0),char(125),char(3),char(231), +char(0),char(115),char(4),char(223),char(0),char(106),char(4),char(117),char(0),char(203), +char(4),char(158),char(0),char(248),char(4),char(158),char(1),char(223),char(4),char(158), +char(1),char(225),char(7),char(233),char(0),char(41),char(7),char(166),char(0),char(41), +char(6),char(41),char(0),char(201),char(5),char(37),char(0),char(176),char(4),char(231), +char(0),char(47),char(4),char(188),char(0),char(20),char(4),char(227),char(0),char(201), +char(4),char(231),char(0),char(176),char(4),char(55),char(0),char(47),char(3),char(109), +char(0),char(18),char(5),char(35),char(0),char(201),char(4),char(51),char(0),char(176), +char(7),char(31),char(0),char(2),char(6),char(61),char(0),char(4),char(4),char(166), +char(0),char(74),char(3),char(221),char(0),char(68),char(5),char(74),char(0),char(201), +char(4),char(92),char(0),char(176),char(4),char(233),char(0),char(201),char(4),char(68), +char(0),char(176),char(4),char(233),char(0),char(47),char(4),char(35),char(0),char(20), +char(5),char(131),char(0),char(16),char(4),char(236),char(0),char(41),char(5),char(248), +char(0),char(201),char(5),char(47),char(0),char(176),char(6),char(129),char(0),char(201), +char(5),char(227),char(0),char(176),char(8),char(137),char(0),char(201),char(6),char(236), +char(0),char(176),char(6),char(59),char(0),char(125),char(5),char(31),char(0),char(115), +char(5),char(12),char(0),char(125),char(3),char(207),char(0),char(115),char(4),char(109), +char(0),char(16),char(3),char(188),char(0),char(41),char(4),char(123),char(0),char(0), +char(4),char(2),char(0),char(0),char(4),char(123),char(0),char(0),char(4),char(2), +char(0),char(0),char(4),char(244),char(0),char(8),char(4),char(86),char(0),char(39), +char(6),char(215),char(0),char(16),char(5),char(188),char(0),char(41),char(5),char(137), +char(0),char(170),char(4),char(223),char(0),char(156),char(5),char(143),char(0),char(170), +char(4),char(205),char(0),char(156),char(5),char(143),char(0),char(201),char(4),char(174), +char(0),char(176),char(6),char(180),char(0),char(61),char(5),char(70),char(0),char(51), +char(6),char(180),char(0),char(61),char(5),char(70),char(0),char(51),char(2),char(170), +char(0),char(84),char(6),char(193),char(0),char(2),char(5),char(227),char(0),char(4), +char(5),char(131),char(0),char(201),char(4),char(100),char(0),char(176),char(5),char(166), +char(0),char(0),char(4),char(147),char(0),char(16),char(5),char(209),char(0),char(201), +char(4),char(238),char(0),char(176),char(5),char(246),char(0),char(201),char(5),char(57), +char(0),char(176),char(5),char(143),char(0),char(170),char(4),char(221),char(0),char(156), +char(7),char(59),char(0),char(201),char(5),char(227),char(0),char(176),char(2),char(170), +char(0),char(84),char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94), +char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94),char(6),char(252), +char(255),char(254),char(6),char(221),char(0),char(94),char(4),char(115),char(0),char(201), +char(4),char(125),char(0),char(115),char(5),char(215),char(0),char(117),char(4),char(121), +char(0),char(102),char(5),char(215),char(0),char(117),char(4),char(121),char(0),char(102), +char(6),char(193),char(0),char(2),char(5),char(227),char(0),char(4),char(4),char(166), +char(0),char(74),char(3),char(221),char(0),char(68),char(4),char(170),char(0),char(74), +char(3),char(233),char(0),char(27),char(6),char(25),char(0),char(203),char(5),char(18), +char(0),char(176),char(6),char(25),char(0),char(203),char(5),char(18),char(0),char(176), +char(6),char(59),char(0),char(125),char(4),char(213),char(0),char(115),char(6),char(61), +char(0),char(125),char(4),char(213),char(0),char(115),char(6),char(61),char(0),char(125), +char(4),char(213),char(0),char(115),char(5),char(10),char(0),char(61),char(3),char(240), +char(0),char(57),char(4),char(248),char(0),char(27),char(4),char(8),char(0),char(2), +char(4),char(248),char(0),char(27),char(4),char(8),char(0),char(2),char(4),char(248), +char(0),char(27),char(4),char(8),char(0),char(2),char(5),char(143),char(0),char(170), +char(4),char(221),char(0),char(156),char(4),char(55),char(0),char(201),char(3),char(109), +char(0),char(176),char(6),char(211),char(0),char(201),char(6),char(41),char(0),char(176), +char(4),char(55),char(0),char(47),char(3),char(109),char(0),char(18),char(4),char(248), +char(0),char(8),char(4),char(82),char(0),char(39),char(4),char(158),char(0),char(6), +char(4),char(49),char(0),char(39),char(4),char(231),char(0),char(131),char(4),char(231), +char(0),char(115),char(7),char(49),char(0),char(131),char(7),char(43),char(0),char(115), +char(7),char(59),char(0),char(78),char(6),char(106),char(0),char(80),char(5),char(0), +char(0),char(78),char(4),char(47),char(0),char(80),char(7),char(217),char(0),char(0), +char(6),char(207),char(0),char(16),char(8),char(25),char(0),char(201),char(7),char(78), +char(0),char(176),char(6),char(12),char(0),char(125),char(5),char(31),char(0),char(115), +char(5),char(174),char(0),char(16),char(5),char(45),char(0),char(41),char(4),char(170), +char(0),char(111),char(3),char(205),char(0),char(90),char(5),char(154),char(0),char(0), +char(4),char(145),char(0),char(16),char(5),char(16),char(0),char(0),char(4),char(115), +char(0),char(94),char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94), +char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94),char(5),char(16), +char(0),char(0),char(4),char(115),char(0),char(45),char(5),char(16),char(0),char(0), +char(4),char(115),char(0),char(94),char(5),char(16),char(0),char(0),char(4),char(115), +char(0),char(94),char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94), +char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94),char(5),char(16), +char(0),char(0),char(4),char(115),char(0),char(94),char(5),char(16),char(0),char(0), +char(4),char(115),char(0),char(94),char(5),char(16),char(0),char(0),char(4),char(115), +char(0),char(94),char(5),char(16),char(0),char(0),char(4),char(115),char(0),char(94), +char(4),char(115),char(0),char(201),char(4),char(125),char(0),char(115),char(4),char(115), +char(0),char(201),char(4),char(125),char(0),char(115),char(4),char(115),char(0),char(201), +char(4),char(125),char(0),char(115),char(4),char(115),char(0),char(201),char(4),char(125), +char(0),char(115),char(4),char(115),char(0),char(93),char(4),char(125),char(0),char(74), +char(4),char(115),char(0),char(201),char(4),char(125),char(0),char(115),char(4),char(115), +char(0),char(201),char(4),char(125),char(0),char(115),char(4),char(115),char(0),char(201), +char(4),char(125),char(0),char(115),char(2),char(170),char(0),char(84),char(2),char(6), +char(0),char(123),char(2),char(170),char(0),char(84),char(2),char(6),char(0),char(157), +char(6),char(59),char(0),char(125),char(4),char(213),char(0),char(115),char(6),char(59), +char(0),char(125),char(4),char(213),char(0),char(115),char(6),char(59),char(0),char(125), +char(4),char(213),char(0),char(115),char(6),char(59),char(0),char(125),char(4),char(213), +char(0),char(97),char(6),char(59),char(0),char(125),char(4),char(213),char(0),char(115), +char(6),char(59),char(0),char(125),char(4),char(213),char(0),char(115),char(6),char(59), +char(0),char(125),char(4),char(213),char(0),char(115),char(6),char(61),char(0),char(125), +char(4),char(223),char(0),char(115),char(6),char(61),char(0),char(125),char(4),char(223), +char(0),char(115),char(6),char(61),char(0),char(125),char(4),char(223),char(0),char(115), +char(6),char(61),char(0),char(125),char(4),char(223),char(0),char(115),char(6),char(61), +char(0),char(125),char(4),char(223),char(0),char(115),char(5),char(211),char(0),char(186), +char(4),char(233),char(0),char(164),char(5),char(211),char(0),char(186),char(4),char(233), +char(0),char(164),char(6),char(37),char(0),char(186),char(5),char(82),char(0),char(164), +char(6),char(37),char(0),char(186),char(5),char(82),char(0),char(164),char(6),char(37), +char(0),char(186),char(5),char(82),char(0),char(164),char(6),char(37),char(0),char(186), +char(5),char(82),char(0),char(164),char(6),char(37),char(0),char(186),char(5),char(82), +char(0),char(164),char(4),char(123),char(0),char(0),char(4),char(8),char(0),char(2), +char(4),char(123),char(0),char(0),char(4),char(8),char(0),char(2),char(4),char(123), +char(0),char(0),char(4),char(8),char(0),char(2),char(4),char(231),char(0),char(115), +char(0),char(0),char(251),char(229),char(0),char(0),char(252),char(113),char(0),char(0), +char(251),char(154),char(0),char(0),char(252),char(113),char(0),char(0),char(252),char(104), +char(0),char(0),char(252),char(121),char(0),char(0),char(252),char(121),char(0),char(0), +char(252),char(121),char(0),char(0),char(252),char(104),char(1),char(164),char(0),char(49), +char(1),char(164),char(0),char(25),char(1),char(164),char(0),char(25),char(3),char(45), +char(0),char(52),char(4),char(137),char(0),char(115),char(2),char(244),char(0),char(45), +char(4),char(20),char(0),char(41),char(4),char(147),char(0),char(94),char(4),char(143), +char(0),char(23),char(4),char(147),char(0),char(133),char(4),char(147),char(0),char(117), +char(4),char(147),char(0),char(94),char(4),char(147),char(0),char(104),char(4),char(147), +char(0),char(106),char(5),char(109),char(0),char(29),char(6),char(90),char(0),char(92), +char(4),char(109),char(0),char(18),char(2),char(211),char(0),char(31),char(4),char(231), +char(0),char(113),char(4),char(231),char(0),char(113),char(4),char(231),char(0),char(113), +char(4),char(231),char(0),char(113),char(4),char(231),char(0),char(113),char(2),char(59), +char(0),char(201),char(2),char(59),char(0),char(5),char(2),char(59),char(0),char(179), +char(2),char(59),char(255),char(199),char(2),char(59),char(0),char(5),char(2),char(59), +char(255),char(171),char(2),char(59),char(255),char(243),char(2),char(59),char(255),char(231), +char(2),char(59),char(0),char(86),char(2),char(59),char(0),char(187),char(4),char(94), +char(0),char(201),char(2),char(229),char(255),char(228),char(2),char(59),char(0),char(201), +char(0),char(5),char(0),char(201),char(0),char(5),char(0),char(201),char(0),char(201), +char(0),char(153),char(0),char(184),char(0),char(0),char(0),char(0),char(0),char(1), +char(0),char(3),char(0),char(1),char(0),char(0),char(0),char(12),char(0),char(4), +char(4),char(14),char(0),char(0),char(0),char(176),char(0),char(128),char(0),char(6), +char(0),char(48),char(0),char(72),char(0),char(73),char(0),char(126),char(0),char(203), +char(0),char(207),char(1),char(39),char(1),char(50),char(1),char(97),char(1),char(127), +char(1),char(146),char(1),char(161),char(1),char(176),char(1),char(240),char(1),char(255), +char(2),char(27),char(2),char(55),char(2),char(188),char(2),char(199),char(2),char(201), +char(2),char(221),char(2),char(243),char(3),char(1),char(3),char(3),char(3),char(9), +char(3),char(15),char(3),char(35),char(3),char(138),char(3),char(140),char(3),char(161), +char(3),char(170),char(3),char(206),char(3),char(210),char(3),char(214),char(4),char(13), +char(4),char(79),char(4),char(95),char(4),char(134),char(4),char(145),char(4),char(191), +char(4),char(207),char(5),char(19),char(30),char(1),char(30),char(63),char(30),char(133), +char(30),char(199),char(30),char(202),char(30),char(241),char(30),char(249),char(31),char(77), +char(32),char(11),char(32),char(21),char(32),char(30),char(32),char(34),char(32),char(38), +char(32),char(48),char(32),char(51),char(32),char(58),char(32),char(60),char(32),char(68), +char(32),char(112),char(32),char(121),char(32),char(127),char(32),char(164),char(32),char(167), +char(32),char(172),char(33),char(5),char(33),char(19),char(33),char(22),char(33),char(32), +char(33),char(34),char(33),char(38),char(33),char(46),char(33),char(94),char(34),char(2), +char(34),char(6),char(34),char(15),char(34),char(18),char(34),char(26),char(34),char(30), +char(34),char(43),char(34),char(72),char(34),char(96),char(34),char(101),char(37),char(202), +char(251),char(4),char(254),char(255),char(255),char(253),char(255),char(255),char(0),char(0), +char(0),char(32),char(0),char(73),char(0),char(74),char(0),char(160),char(0),char(204), +char(0),char(208),char(1),char(40),char(1),char(51),char(1),char(98),char(1),char(146), +char(1),char(160),char(1),char(175),char(1),char(240),char(1),char(250),char(2),char(24), +char(2),char(55),char(2),char(188),char(2),char(198),char(2),char(201),char(2),char(216), +char(2),char(243),char(3),char(0),char(3),char(3),char(3),char(9),char(3),char(15), +char(3),char(35),char(3),char(132),char(3),char(140),char(3),char(142),char(3),char(163), +char(3),char(171),char(3),char(209),char(3),char(214),char(4),char(0),char(4),char(14), +char(4),char(80),char(4),char(96),char(4),char(136),char(4),char(146),char(4),char(192), +char(4),char(208),char(30),char(0),char(30),char(62),char(30),char(128),char(30),char(160), +char(30),char(200),char(30),char(203),char(30),char(242),char(31),char(77),char(32),char(0), +char(32),char(19),char(32),char(23),char(32),char(32),char(32),char(38),char(32),char(48), +char(32),char(50),char(32),char(57),char(32),char(60),char(32),char(68),char(32),char(112), +char(32),char(116),char(32),char(127),char(32),char(163),char(32),char(167),char(32),char(171), +char(33),char(5),char(33),char(19),char(33),char(22),char(33),char(32),char(33),char(34), +char(33),char(38),char(33),char(46),char(33),char(91),char(34),char(2),char(34),char(6), +char(34),char(15),char(34),char(17),char(34),char(26),char(34),char(30),char(34),char(43), +char(34),char(72),char(34),char(96),char(34),char(100),char(37),char(202),char(251),char(0), +char(254),char(255),char(255),char(252),char(255),char(255),char(255),char(227),char(0),char(0), +char(255),char(227),char(255),char(194),char(0),char(0),char(255),char(194),char(0),char(0), +char(255),char(194),char(0),char(0),char(255),char(176),char(0),char(191),char(0),char(178), +char(0),char(97),char(255),char(73),char(0),char(0),char(0),char(0),char(255),char(150), +char(254),char(133),char(254),char(132),char(254),char(118),char(255),char(104),char(255),char(99), +char(255),char(98),char(255),char(93),char(0),char(103),char(255),char(68),char(0),char(0), +char(253),char(207),char(0),char(0),char(0),char(0),char(253),char(205),char(254),char(130), +char(254),char(127),char(0),char(0),char(253),char(154),char(0),char(0),char(254),char(12), +char(0),char(0),char(254),char(9),char(0),char(0),char(254),char(9),char(228),char(88), +char(228),char(24),char(227),char(122),char(228),char(125),char(0),char(0),char(228),char(125), +char(0),char(0),char(227),char(13),char(226),char(66),char(225),char(239),char(225),char(238), +char(225),char(237),char(225),char(234),char(225),char(225),char(225),char(224),char(225),char(219), +char(225),char(218),char(225),char(211),char(225),char(203),char(225),char(200),char(225),char(153), +char(225),char(118),char(225),char(116),char(0),char(0),char(225),char(24),char(225),char(11), +char(225),char(9),char(226),char(110),char(224),char(254),char(224),char(251),char(224),char(244), +char(224),char(200),char(224),char(37),char(224),char(34),char(224),char(26),char(224),char(25), +char(224),char(18),char(224),char(15),char(224),char(3),char(223),char(231),char(223),char(208), +char(223),char(205),char(220),char(105),char(0),char(0),char(3),char(79),char(2),char(83), +char(0),char(1),char(0),char(0),char(0),char(174),char(0),char(0),char(0),char(0), +char(0),char(170),char(0),char(0),char(0),char(174),char(0),char(0),char(0),char(192), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(240),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(224),char(0),char(0),char(0),char(234), +char(1),char(16),char(0),char(0),char(0),char(0),char(0),char(0),char(1),char(24), +char(0),char(0),char(1),char(48),char(0),char(0),char(1),char(76),char(0),char(0), +char(1),char(92),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(1),char(112),char(0),char(0),char(1),char(114),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(1),char(96),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(1),char(60),char(0),char(0),char(0),char(0),char(0),char(0),char(3),char(150), +char(3),char(151),char(3),char(152),char(3),char(153),char(3),char(154),char(3),char(155), +char(0),char(235),char(3),char(156),char(0),char(237),char(3),char(157),char(0),char(239), +char(3),char(158),char(0),char(241),char(3),char(159),char(0),char(243),char(3),char(160), +char(3),char(143),char(3),char(144),char(1),char(38),char(1),char(39),char(1),char(40), +char(1),char(41),char(1),char(42),char(1),char(43),char(1),char(44),char(1),char(45), +char(1),char(46),char(1),char(47),char(1),char(48),char(1),char(49),char(1),char(50), +char(1),char(51),char(1),char(52),char(1),char(53),char(1),char(54),char(1),char(55), +char(1),char(56),char(1),char(57),char(1),char(58),char(1),char(59),char(1),char(60), +char(1),char(61),char(1),char(62),char(1),char(63),char(1),char(64),char(1),char(65), +char(1),char(73),char(1),char(74),char(1),char(36),char(1),char(37),char(1),char(84), +char(1),char(85),char(1),char(86),char(1),char(87),char(1),char(88),char(1),char(89), +char(3),char(161),char(1),char(92),char(1),char(93),char(1),char(94),char(1),char(95), +char(1),char(96),char(1),char(97),char(1),char(98),char(1),char(99),char(1),char(100), +char(1),char(101),char(1),char(102),char(3),char(162),char(1),char(104),char(1),char(105), +char(1),char(106),char(1),char(107),char(1),char(108),char(1),char(109),char(1),char(110), +char(1),char(111),char(1),char(112),char(1),char(113),char(1),char(114),char(1),char(115), +char(1),char(116),char(1),char(117),char(1),char(118),char(3),char(163),char(2),char(104), +char(1),char(156),char(1),char(157),char(1),char(158),char(1),char(159),char(1),char(160), +char(3),char(164),char(3),char(165),char(1),char(163),char(1),char(164),char(1),char(165), +char(1),char(166),char(1),char(167),char(2),char(105),char(2),char(106),char(1),char(234), +char(1),char(235),char(1),char(236),char(1),char(237),char(1),char(238),char(1),char(239), +char(1),char(240),char(1),char(241),char(1),char(242),char(1),char(243),char(1),char(244), +char(1),char(245),char(2),char(107),char(1),char(246),char(1),char(247),char(2),char(147), +char(2),char(148),char(2),char(149),char(2),char(150),char(2),char(151),char(2),char(152), +char(2),char(153),char(2),char(154),char(1),char(248),char(1),char(249),char(3),char(166), +char(2),char(202),char(2),char(203),char(2),char(204),char(2),char(205),char(2),char(206), +char(2),char(207),char(2),char(208),char(2),char(209),char(2),char(210),char(2),char(211), +char(2),char(212),char(2),char(213),char(2),char(214),char(2),char(215),char(3),char(167), +char(3),char(168),char(3),char(70),char(3),char(169),char(2),char(0),char(2),char(1), +char(3),char(111),char(3),char(112),char(3),char(113),char(3),char(114),char(3),char(115), +char(3),char(116),char(3),char(117),char(2),char(28),char(3),char(141),char(2),char(52), +char(2),char(53),char(2),char(93),char(2),char(94),char(0),char(0),char(64),char(71), +char(91),char(90),char(89),char(88),char(85),char(84),char(83),char(82),char(81),char(80), +char(79),char(78),char(77),char(76),char(75),char(74),char(73),char(72),char(71),char(70), +char(69),char(68),char(67),char(66),char(65),char(64),char(63),char(62),char(61),char(60), +char(59),char(58),char(57),char(56),char(55),char(54),char(53),char(49),char(48),char(47), +char(46),char(45),char(44),char(40),char(39),char(38),char(37),char(36),char(35),char(34), +char(33),char(31),char(24),char(20),char(17),char(16),char(15),char(14),char(13),char(11), +char(10),char(9),char(8),char(7),char(6),char(5),char(4),char(3),char(2),char(1), +char(0),char(44),char(32),char(176),char(1),char(96),char(69),char(176),char(3),char(37), +char(32),char(17),char(70),char(97),char(35),char(69),char(35),char(97),char(72),char(45), +char(44),char(32),char(69),char(24),char(104),char(68),char(45),char(44),char(69),char(35), +char(70),char(96),char(176),char(32),char(97),char(32),char(176),char(70),char(96),char(176), +char(4),char(38),char(35),char(72),char(72),char(45),char(44),char(69),char(35),char(70), +char(35),char(97),char(176),char(32),char(96),char(32),char(176),char(38),char(97),char(176), +char(32),char(97),char(176),char(4),char(38),char(35),char(72),char(72),char(45),char(44), +char(69),char(35),char(70),char(96),char(176),char(64),char(97),char(32),char(176),char(102), +char(96),char(176),char(4),char(38),char(35),char(72),char(72),char(45),char(44),char(69), +char(35),char(70),char(35),char(97),char(176),char(64),char(96),char(32),char(176),char(38), +char(97),char(176),char(64),char(97),char(176),char(4),char(38),char(35),char(72),char(72), +char(45),char(44),char(1),char(16),char(32),char(60),char(0),char(60),char(45),char(44), +char(32),char(69),char(35),char(32),char(176),char(205),char(68),char(35),char(32),char(184), +char(1),char(90),char(81),char(88),char(35),char(32),char(176),char(141),char(68),char(35), +char(89),char(32),char(176),char(237),char(81),char(88),char(35),char(32),char(176),char(77), +char(68),char(35),char(89),char(32),char(176),char(4),char(38),char(81),char(88),char(35), +char(32),char(176),char(13),char(68),char(35),char(89),char(33),char(33),char(45),char(44), +char(32),char(32),char(69),char(24),char(104),char(68),char(32),char(176),char(1),char(96), +char(32),char(69),char(176),char(70),char(118),char(104),char(138),char(69),char(96),char(68), +char(45),char(44),char(1),char(177),char(11),char(10),char(67),char(35),char(67),char(101), +char(10),char(45),char(44),char(0),char(177),char(10),char(11),char(67),char(35),char(67), +char(11),char(45),char(44),char(0),char(176),char(40),char(35),char(112),char(177),char(1), +char(40),char(62),char(1),char(176),char(40),char(35),char(112),char(177),char(2),char(40), +char(69),char(58),char(177),char(2),char(0),char(8),char(13),char(45),char(44),char(32), +char(69),char(176),char(3),char(37),char(69),char(97),char(100),char(176),char(80),char(81), +char(88),char(69),char(68),char(27),char(33),char(33),char(89),char(45),char(44),char(73), +char(176),char(14),char(35),char(68),char(45),char(44),char(32),char(69),char(176),char(0), +char(67),char(96),char(68),char(45),char(44),char(1),char(176),char(6),char(67),char(176), +char(7),char(67),char(101),char(10),char(45),char(44),char(32),char(105),char(176),char(64), +char(97),char(176),char(0),char(139),char(32),char(177),char(44),char(192),char(138),char(140), +char(184),char(16),char(0),char(98),char(96),char(43),char(12),char(100),char(35),char(100), +char(97),char(92),char(88),char(176),char(3),char(97),char(89),char(45),char(44),char(138), +char(3),char(69),char(138),char(138),char(135),char(176),char(17),char(43),char(176),char(41), +char(35),char(68),char(176),char(41),char(122),char(228),char(24),char(45),char(44),char(69), +char(101),char(176),char(44),char(35),char(68),char(69),char(176),char(43),char(35),char(68), +char(45),char(44),char(75),char(82),char(88),char(69),char(68),char(27),char(33),char(33), +char(89),char(45),char(44),char(75),char(81),char(88),char(69),char(68),char(27),char(33), +char(33),char(89),char(45),char(44),char(1),char(176),char(5),char(37),char(16),char(35), +char(32),char(138),char(245),char(0),char(176),char(1),char(96),char(35),char(237),char(236), +char(45),char(44),char(1),char(176),char(5),char(37),char(16),char(35),char(32),char(138), +char(245),char(0),char(176),char(1),char(97),char(35),char(237),char(236),char(45),char(44), +char(1),char(176),char(6),char(37),char(16),char(245),char(0),char(237),char(236),char(45), +char(44),char(176),char(2),char(67),char(176),char(1),char(82),char(88),char(33),char(33), +char(33),char(33),char(33),char(27),char(70),char(35),char(70),char(96),char(138),char(138), +char(70),char(35),char(32),char(70),char(138),char(96),char(138),char(97),char(184),char(255), +char(128),char(98),char(35),char(32),char(16),char(35),char(138),char(177),char(12),char(12), +char(138),char(112),char(69),char(96),char(32),char(176),char(0),char(80),char(88),char(176), +char(1),char(97),char(184),char(255),char(186),char(139),char(27),char(176),char(70),char(140), +char(89),char(176),char(16),char(96),char(104),char(1),char(58),char(89),char(45),char(44), +char(32),char(69),char(176),char(3),char(37),char(70),char(82),char(75),char(176),char(19), +char(81),char(91),char(88),char(176),char(2),char(37),char(70),char(32),char(104),char(97), +char(176),char(3),char(37),char(176),char(3),char(37),char(63),char(35),char(33),char(56), +char(27),char(33),char(17),char(89),char(45),char(44),char(32),char(69),char(176),char(3), +char(37),char(70),char(80),char(88),char(176),char(2),char(37),char(70),char(32),char(104), +char(97),char(176),char(3),char(37),char(176),char(3),char(37),char(63),char(35),char(33), +char(56),char(27),char(33),char(17),char(89),char(45),char(44),char(0),char(176),char(7), +char(67),char(176),char(6),char(67),char(11),char(45),char(44),char(33),char(33),char(12), +char(100),char(35),char(100),char(139),char(184),char(64),char(0),char(98),char(45),char(44), +char(33),char(176),char(128),char(81),char(88),char(12),char(100),char(35),char(100),char(139), +char(184),char(32),char(0),char(98),char(27),char(178),char(0),char(64),char(47),char(43), +char(89),char(176),char(2),char(96),char(45),char(44),char(33),char(176),char(192),char(81), +char(88),char(12),char(100),char(35),char(100),char(139),char(184),char(21),char(85),char(98), +char(27),char(178),char(0),char(128),char(47),char(43),char(89),char(176),char(2),char(96), +char(45),char(44),char(12),char(100),char(35),char(100),char(139),char(184),char(64),char(0), +char(98),char(96),char(35),char(33),char(45),char(44),char(75),char(83),char(88),char(138), +char(176),char(4),char(37),char(73),char(100),char(35),char(69),char(105),char(176),char(64), +char(139),char(97),char(176),char(128),char(98),char(176),char(32),char(97),char(106),char(176), +char(14),char(35),char(68),char(35),char(16),char(176),char(14),char(246),char(27),char(33), +char(35),char(138),char(18),char(17),char(32),char(57),char(47),char(89),char(45),char(44), +char(75),char(83),char(88),char(32),char(176),char(3),char(37),char(73),char(100),char(105), +char(32),char(176),char(5),char(38),char(176),char(6),char(37),char(73),char(100),char(35), +char(97),char(176),char(128),char(98),char(176),char(32),char(97),char(106),char(176),char(14), +char(35),char(68),char(176),char(4),char(38),char(16),char(176),char(14),char(246),char(138), +char(16),char(176),char(14),char(35),char(68),char(176),char(14),char(246),char(176),char(14), +char(35),char(68),char(176),char(14),char(237),char(27),char(138),char(176),char(4),char(38), +char(17),char(18),char(32),char(57),char(35),char(32),char(57),char(47),char(47),char(89), +char(45),char(44),char(69),char(35),char(69),char(96),char(35),char(69),char(96),char(35), +char(69),char(96),char(35),char(118),char(104),char(24),char(176),char(128),char(98),char(32), +char(45),char(44),char(176),char(72),char(43),char(45),char(44),char(32),char(69),char(176), +char(0),char(84),char(88),char(176),char(64),char(68),char(32),char(69),char(176),char(64), +char(97),char(68),char(27),char(33),char(33),char(89),char(45),char(44),char(69),char(177), +char(48),char(47),char(69),char(35),char(69),char(97),char(96),char(176),char(1),char(96), +char(105),char(68),char(45),char(44),char(75),char(81),char(88),char(176),char(47),char(35), +char(112),char(176),char(20),char(35),char(66),char(27),char(33),char(33),char(89),char(45), +char(44),char(75),char(81),char(88),char(32),char(176),char(3),char(37),char(69),char(105), +char(83),char(88),char(68),char(27),char(33),char(33),char(89),char(27),char(33),char(33), +char(89),char(45),char(44),char(69),char(176),char(20),char(67),char(176),char(0),char(96), +char(99),char(176),char(1),char(96),char(105),char(68),char(45),char(44),char(176),char(47), +char(69),char(68),char(45),char(44),char(69),char(35),char(32),char(69),char(138),char(96), +char(68),char(45),char(44),char(69),char(35),char(69),char(96),char(68),char(45),char(44), +char(75),char(35),char(81),char(88),char(185),char(0),char(51),char(255),char(224),char(177), +char(52),char(32),char(27),char(179),char(51),char(0),char(52),char(0),char(89),char(68), +char(68),char(45),char(44),char(176),char(22),char(67),char(88),char(176),char(3),char(38), +char(69),char(138),char(88),char(100),char(102),char(176),char(31),char(96),char(27),char(100), +char(176),char(32),char(96),char(102),char(32),char(88),char(27),char(33),char(176),char(64), +char(89),char(176),char(1),char(97),char(89),char(35),char(88),char(101),char(89),char(176), +char(41),char(35),char(68),char(35),char(16),char(176),char(41),char(224),char(27),char(33), +char(33),char(33),char(33),char(33),char(89),char(45),char(44),char(176),char(2),char(67), +char(84),char(88),char(75),char(83),char(35),char(75),char(81),char(90),char(88),char(56), +char(27),char(33),char(33),char(89),char(27),char(33),char(33),char(33),char(33),char(89), +char(45),char(44),char(176),char(22),char(67),char(88),char(176),char(4),char(37),char(69), +char(100),char(176),char(32),char(96),char(102),char(32),char(88),char(27),char(33),char(176), +char(64),char(89),char(176),char(1),char(97),char(35),char(88),char(27),char(101),char(89), +char(176),char(41),char(35),char(68),char(176),char(5),char(37),char(176),char(8),char(37), +char(8),char(32),char(88),char(2),char(27),char(3),char(89),char(176),char(4),char(37), +char(16),char(176),char(5),char(37),char(32),char(70),char(176),char(4),char(37),char(35), +char(66),char(60),char(176),char(4),char(37),char(176),char(7),char(37),char(8),char(176), +char(7),char(37),char(16),char(176),char(6),char(37),char(32),char(70),char(176),char(4), +char(37),char(176),char(1),char(96),char(35),char(66),char(60),char(32),char(88),char(1), +char(27),char(0),char(89),char(176),char(4),char(37),char(16),char(176),char(5),char(37), +char(176),char(41),char(224),char(176),char(41),char(32),char(69),char(101),char(68),char(176), +char(7),char(37),char(16),char(176),char(6),char(37),char(176),char(41),char(224),char(176), +char(5),char(37),char(176),char(8),char(37),char(8),char(32),char(88),char(2),char(27), +char(3),char(89),char(176),char(5),char(37),char(176),char(3),char(37),char(67),char(72), +char(176),char(4),char(37),char(176),char(7),char(37),char(8),char(176),char(6),char(37), +char(176),char(3),char(37),char(176),char(1),char(96),char(67),char(72),char(27),char(33), +char(89),char(33),char(33),char(33),char(33),char(33),char(33),char(33),char(45),char(44), +char(2),char(176),char(4),char(37),char(32),char(32),char(70),char(176),char(4),char(37), +char(35),char(66),char(176),char(5),char(37),char(8),char(176),char(3),char(37),char(69), +char(72),char(33),char(33),char(33),char(33),char(45),char(44),char(2),char(176),char(3), +char(37),char(32),char(176),char(4),char(37),char(8),char(176),char(2),char(37),char(67), +char(72),char(33),char(33),char(33),char(45),char(44),char(69),char(35),char(32),char(69), +char(24),char(32),char(176),char(0),char(80),char(32),char(88),char(35),char(101),char(35), +char(89),char(35),char(104),char(32),char(176),char(64),char(80),char(88),char(33),char(176), +char(64),char(89),char(35),char(88),char(101),char(89),char(138),char(96),char(68),char(45), +char(44),char(75),char(83),char(35),char(75),char(81),char(90),char(88),char(32),char(69), +char(138),char(96),char(68),char(27),char(33),char(33),char(89),char(45),char(44),char(75), +char(84),char(88),char(32),char(69),char(138),char(96),char(68),char(27),char(33),char(33), +char(89),char(45),char(44),char(75),char(83),char(35),char(75),char(81),char(90),char(88), +char(56),char(27),char(33),char(33),char(89),char(45),char(44),char(176),char(0),char(33), +char(75),char(84),char(88),char(56),char(27),char(33),char(33),char(89),char(45),char(44), +char(176),char(2),char(67),char(84),char(88),char(176),char(70),char(43),char(27),char(33), +char(33),char(33),char(33),char(89),char(45),char(44),char(176),char(2),char(67),char(84), +char(88),char(176),char(71),char(43),char(27),char(33),char(33),char(33),char(89),char(45), +char(44),char(176),char(2),char(67),char(84),char(88),char(176),char(72),char(43),char(27), +char(33),char(33),char(33),char(33),char(89),char(45),char(44),char(176),char(2),char(67), +char(84),char(88),char(176),char(73),char(43),char(27),char(33),char(33),char(33),char(89), +char(45),char(44),char(32),char(138),char(8),char(35),char(75),char(83),char(138),char(75), +char(81),char(90),char(88),char(35),char(56),char(27),char(33),char(33),char(89),char(45), +char(44),char(0),char(176),char(2),char(37),char(73),char(176),char(0),char(83),char(88), +char(32),char(176),char(64),char(56),char(17),char(27),char(33),char(89),char(45),char(44), +char(1),char(70),char(35),char(70),char(96),char(35),char(70),char(97),char(35),char(32), +char(16),char(32),char(70),char(138),char(97),char(184),char(255),char(128),char(98),char(138), +char(177),char(64),char(64),char(138),char(112),char(69),char(96),char(104),char(58),char(45), +char(44),char(32),char(138),char(35),char(73),char(100),char(138),char(35),char(83),char(88), +char(60),char(27),char(33),char(89),char(45),char(44),char(75),char(82),char(88),char(125), +char(27),char(122),char(89),char(45),char(44),char(176),char(18),char(0),char(75),char(1), +char(75),char(84),char(66),char(45),char(44),char(177),char(2),char(0),char(66),char(177), +char(35),char(1),char(136),char(81),char(177),char(64),char(1),char(136),char(83),char(90), +char(88),char(185),char(16),char(0),char(0),char(32),char(136),char(84),char(88),char(178), +char(2),char(1),char(2),char(67),char(96),char(66),char(89),char(177),char(36),char(1), +char(136),char(81),char(88),char(185),char(32),char(0),char(0),char(64),char(136),char(84), +char(88),char(178),char(2),char(2),char(2),char(67),char(96),char(66),char(177),char(36), +char(1),char(136),char(84),char(88),char(178),char(2),char(32),char(2),char(67),char(96), +char(66),char(0),char(75),char(1),char(75),char(82),char(88),char(178),char(2),char(8), +char(2),char(67),char(96),char(66),char(89),char(27),char(185),char(64),char(0),char(0), +char(128),char(136),char(84),char(88),char(178),char(2),char(4),char(2),char(67),char(96), +char(66),char(89),char(185),char(64),char(0),char(0),char(128),char(99),char(184),char(1), +char(0),char(136),char(84),char(88),char(178),char(2),char(8),char(2),char(67),char(96), +char(66),char(89),char(185),char(64),char(0),char(1),char(0),char(99),char(184),char(2), +char(0),char(136),char(84),char(88),char(178),char(2),char(16),char(2),char(67),char(96), +char(66),char(89),char(177),char(38),char(1),char(136),char(81),char(88),char(185),char(64), +char(0),char(2),char(0),char(99),char(184),char(4),char(0),char(136),char(84),char(88), +char(178),char(2),char(64),char(2),char(67),char(96),char(66),char(89),char(185),char(64), +char(0),char(4),char(0),char(99),char(184),char(8),char(0),char(136),char(84),char(88), +char(178),char(2),char(128),char(2),char(67),char(96),char(66),char(89),char(89),char(89), +char(89),char(89),char(89),char(177),char(0),char(2),char(67),char(84),char(88),char(64), +char(10),char(5),char(64),char(8),char(64),char(9),char(64),char(12),char(2),char(13), +char(2),char(27),char(177),char(1),char(2),char(67),char(84),char(88),char(178),char(5), +char(64),char(8),char(186),char(1),char(0),char(0),char(9),char(1),char(0),char(179), +char(12),char(1),char(13),char(1),char(27),char(177),char(128),char(2),char(67),char(82), +char(88),char(178),char(5),char(64),char(8),char(184),char(1),char(128),char(177),char(9), +char(64),char(27),char(178),char(5),char(64),char(8),char(186),char(1),char(128),char(0), +char(9),char(1),char(64),char(89),char(185),char(64),char(0),char(0),char(128),char(136), +char(85),char(185),char(64),char(0),char(2),char(0),char(99),char(184),char(4),char(0), +char(136),char(85),char(90),char(88),char(179),char(12),char(0),char(13),char(1),char(27), +char(179),char(12),char(0),char(13),char(1),char(89),char(89),char(89),char(66),char(66), +char(66),char(66),char(66),char(45),char(44),char(69),char(24),char(104),char(35),char(75), +char(81),char(88),char(35),char(32),char(69),char(32),char(100),char(176),char(64),char(80), +char(88),char(124),char(89),char(104),char(138),char(96),char(89),char(68),char(45),char(44), +char(176),char(0),char(22),char(176),char(2),char(37),char(176),char(2),char(37),char(1), +char(176),char(1),char(35),char(62),char(0),char(176),char(2),char(35),char(62),char(177), +char(1),char(2),char(6),char(12),char(176),char(10),char(35),char(101),char(66),char(176), +char(11),char(35),char(66),char(1),char(176),char(1),char(35),char(63),char(0),char(176), +char(2),char(35),char(63),char(177),char(1),char(2),char(6),char(12),char(176),char(6), +char(35),char(101),char(66),char(176),char(7),char(35),char(66),char(176),char(1),char(22), +char(1),char(45),char(44),char(176),char(128),char(176),char(2),char(67),char(80),char(176), +char(1),char(176),char(2),char(67),char(84),char(91),char(88),char(33),char(35),char(16), +char(176),char(32),char(26),char(201),char(27),char(138),char(16),char(237),char(89),char(45), +char(44),char(176),char(89),char(43),char(45),char(44),char(138),char(16),char(229),char(45), +char(64),char(153),char(9),char(33),char(72),char(32),char(85),char(32),char(1),char(30), +char(85),char(31),char(72),char(3),char(85),char(31),char(30),char(1),char(15),char(30), +char(63),char(30),char(175),char(30),char(3),char(77),char(75),char(38),char(31),char(76), +char(75),char(51),char(31),char(75),char(70),char(37),char(31),char(38),char(52),char(16), +char(85),char(37),char(51),char(36),char(85),char(25),char(19),char(255),char(31),char(7), +char(4),char(255),char(31),char(6),char(3),char(255),char(31),char(74),char(73),char(51), +char(31),char(73),char(70),char(37),char(31),char(19),char(51),char(18),char(85),char(5), +char(1),char(3),char(85),char(4),char(51),char(3),char(85),char(31),char(3),char(1), +char(15),char(3),char(63),char(3),char(175),char(3),char(3),char(71),char(70),char(25), +char(31),char(235),char(70),char(1),char(35),char(51),char(34),char(85),char(28),char(51), +char(27),char(85),char(22),char(51),char(21),char(85),char(17),char(1),char(15),char(85), +char(16),char(51),char(15),char(85),char(15),char(15),char(79),char(15),char(2),char(31), +char(15),char(207),char(15),char(2),char(15),char(15),char(255),char(15),char(2),char(6), +char(2),char(1),char(0),char(85),char(1),char(51),char(0),char(85),char(111),char(0), +char(127),char(0),char(175),char(0),char(239),char(0),char(4),char(16),char(0),char(1), +char(128),char(22),char(1),char(5),char(1),char(184),char(1),char(144),char(177),char(84), +char(83),char(43),char(43),char(75),char(184),char(7),char(255),char(82),char(75),char(176), +char(9),char(80),char(91),char(176),char(1),char(136),char(176),char(37),char(83),char(176), +char(1),char(136),char(176),char(64),char(81),char(90),char(176),char(6),char(136),char(176), +char(0),char(85),char(90),char(91),char(88),char(177),char(1),char(1),char(142),char(89), +char(133),char(141),char(141),char(0),char(66),char(29),char(75),char(176),char(50),char(83), +char(88),char(176),char(32),char(29),char(89),char(75),char(176),char(100),char(83),char(88), +char(176),char(16),char(29),char(177),char(22),char(0),char(66),char(89),char(115),char(115), +char(43),char(43),char(94),char(115),char(116),char(117),char(43),char(43),char(43),char(43), +char(43),char(116),char(43),char(115),char(116),char(43),char(43),char(43),char(43),char(43), +char(43),char(43),char(43),char(43),char(43),char(43),char(43),char(43),char(115),char(116), +char(43),char(43),char(43),char(24),char(94),char(0),char(0),char(0),char(6),char(20), +char(0),char(23),char(0),char(78),char(5),char(182),char(0),char(23),char(0),char(117), +char(5),char(182),char(5),char(205),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(4),char(72), +char(0),char(20),char(0),char(145),char(0),char(0),char(255),char(236),char(0),char(0), +char(0),char(0),char(255),char(236),char(0),char(0),char(0),char(0),char(255),char(236), +char(0),char(0),char(254),char(20),char(255),char(236),char(0),char(0),char(5),char(182), +char(0),char(19),char(252),char(148),char(255),char(237),char(254),char(133),char(255),char(234), +char(254),char(169),char(255),char(236),char(0),char(24),char(254),char(188),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(8),char(0),char(0),char(0),char(0),char(0),char(0),char(139), +char(0),char(129),char(0),char(221),char(0),char(152),char(0),char(143),char(0),char(142), +char(0),char(153),char(0),char(136),char(0),char(129),char(1),char(15),char(0),char(138), +char(0),char(0),char(0),char(0),char(0),char(31),char(0),char(31),char(0),char(31), +char(0),char(31),char(0),char(81),char(0),char(119),char(0),char(255),char(1),char(123), +char(1),char(236),char(2),char(106),char(2),char(131),char(2),char(174),char(2),char(217), +char(3),char(21),char(3),char(65),char(3),char(95),char(3),char(116),char(3),char(150), +char(3),char(175),char(3),char(241),char(4),char(26),char(4),char(91),char(4),char(185), +char(4),char(251),char(5),char(70),char(5),char(163),char(5),char(197),char(6),char(52), +char(6),char(145),char(6),char(199),char(6),char(251),char(7),char(27),char(7),char(68), +char(7),char(100),char(7),char(187),char(8),char(65),char(8),char(128),char(8),char(219), +char(9),char(25),char(9),char(85),char(9),char(138),char(9),char(184),char(10),char(8), +char(10),char(57),char(10),char(108),char(10),char(148),char(10),char(195),char(10),char(225), +char(11),char(31),char(11),char(86),char(11),char(156),char(11),char(217),char(12),char(44), +char(12),char(121),char(12),char(204),char(12),char(240),char(13),char(36),char(13),char(75), +char(13),char(143),char(13),char(191),char(13),char(230),char(14),char(18),char(14),char(54), +char(14),char(79),char(14),char(114),char(14),char(147),char(14),char(169),char(14),char(200), +char(15),char(36),char(15),char(121),char(15),char(180),char(16),char(7),char(16),char(84), +char(16),char(148),char(17),char(40),char(17),char(102),char(17),char(148),char(17),char(210), +char(18),char(16),char(18),char(39),char(18),char(127),char(18),char(185),char(18),char(250), +char(19),char(79),char(19),char(163),char(19),char(214),char(20),char(40),char(20),char(104), +char(20),char(165),char(20),char(204),char(21),char(23),char(21),char(71),char(21),char(128), +char(21),char(172),char(21),char(238),char(22),char(6),char(22),char(75),char(22),char(133), +char(22),char(133),char(22),char(182),char(23),char(1),char(23),char(83),char(23),char(161), +char(23),char(245),char(24),char(26),char(24),char(149),char(24),char(203),char(25),char(71), +char(25),char(148),char(25),char(207),char(25),char(237),char(25),char(245),char(26),char(127), +char(26),char(149),char(26),char(205),char(26),char(217),char(27),char(19),char(27),char(99), +char(27),char(130),char(27),char(193),char(27),char(241),char(28),char(19),char(28),char(69), +char(28),char(108),char(28),char(165),char(28),char(221),char(28),char(243),char(29),char(8), +char(29),char(30),char(29),char(123),char(29),char(140),char(29),char(157),char(29),char(174), +char(29),char(191),char(29),char(209),char(29),char(221),char(30),char(43),char(30),char(55), +char(30),char(72),char(30),char(89),char(30),char(106),char(30),char(124),char(30),char(141), +char(30),char(158),char(30),char(175),char(30),char(193),char(31),char(25),char(31),char(42), +char(31),char(59),char(31),char(76),char(31),char(93),char(31),char(110),char(31),char(128), +char(31),char(174),char(32),char(25),char(32),char(42),char(32),char(59),char(32),char(76), +char(32),char(94),char(32),char(111),char(32),char(177),char(33),char(24),char(33),char(40), +char(33),char(56),char(33),char(72),char(33),char(88),char(33),char(105),char(33),char(122), +char(34),char(5),char(34),char(17),char(34),char(33),char(34),char(49),char(34),char(65), +char(34),char(82),char(34),char(99),char(34),char(116),char(34),char(133),char(34),char(151), +char(34),char(255),char(35),char(15),char(35),char(31),char(35),char(47),char(35),char(63), +char(35),char(79),char(35),char(96),char(35),char(166),char(36),char(12),char(36),char(28), +char(36),char(44),char(36),char(60),char(36),char(77),char(36),char(93),char(36),char(180), +char(36),char(197),char(36),char(214),char(36),char(230),char(36),char(247),char(37),char(7), +char(37),char(19),char(37),char(31),char(37),char(48),char(37),char(64),char(37),char(81), +char(37),char(97),char(37),char(114),char(37),char(131),char(37),char(148),char(37),char(164), +char(37),char(181),char(37),char(198),char(37),char(206),char(38),char(58),char(38),char(75), +char(38),char(91),char(38),char(108),char(38),char(124),char(38),char(141),char(38),char(158), +char(38),char(170),char(38),char(182),char(38),char(199),char(38),char(215),char(38),char(232), +char(38),char(248),char(39),char(9),char(39),char(25),char(39),char(42),char(39),char(59), +char(39),char(71),char(39),char(87),char(39),char(104),char(39),char(121),char(39),char(201), +char(40),char(34),char(40),char(51),char(40),char(68),char(40),char(85),char(40),char(102), +char(40),char(119),char(40),char(136),char(40),char(147),char(40),char(158),char(40),char(175), +char(40),char(198),char(40),char(210),char(40),char(222),char(40),char(239),char(41),char(0), +char(41),char(12),char(41),char(23),char(41),char(76),char(41),char(93),char(41),char(110), +char(41),char(121),char(41),char(133),char(41),char(150),char(41),char(166),char(41),char(178), +char(41),char(190),char(41),char(248),char(42),char(45),char(42),char(62),char(42),char(78), +char(42),char(90),char(42),char(101),char(42),char(118),char(42),char(134),char(42),char(151), +char(42),char(222),char(43),char(39),char(43),char(56),char(43),char(72),char(43),char(89), +char(43),char(105),char(43),char(123),char(43),char(140),char(43),char(239),char(44),char(105), +char(44),char(122),char(44),char(138),char(44),char(149),char(44),char(161),char(44),char(178), +char(44),char(195),char(44),char(212),char(44),char(228),char(44),char(245),char(45),char(5), +char(45),char(17),char(45),char(29),char(45),char(46),char(45),char(62),char(45),char(73), +char(45),char(84),char(45),char(101),char(45),char(117),char(45),char(178),char(46),char(4), +char(46),char(21),char(46),char(37),char(46),char(54),char(46),char(70),char(46),char(87), +char(46),char(103),char(46),char(121),char(46),char(138),char(46),char(156),char(46),char(173), +char(46),char(185),char(46),char(197),char(46),char(214),char(46),char(231),char(46),char(248), +char(47),char(8),char(47),char(26),char(47),char(43),char(47),char(59),char(47),char(76), +char(47),char(93),char(47),char(110),char(47),char(126),char(47),char(165),char(47),char(248), +char(48),char(119),char(49),char(22),char(49),char(39),char(49),char(56),char(49),char(73), +char(49),char(89),char(49),char(100),char(49),char(111),char(49),char(152),char(49),char(193), +char(49),char(215),char(49),char(255),char(50),char(31),char(50),char(84),char(50),char(123), +char(50),char(180),char(50),char(230),char(51),char(5),char(51),char(78),char(51),char(95), +char(51),char(103),char(51),char(120),char(51),char(138),char(51),char(156),char(51),char(173), +char(51),char(191),char(51),char(208),char(51),char(227),char(51),char(235),char(51),char(243), +char(52),char(18),char(52),char(26),char(52),char(34),char(52),char(42),char(52),char(50), +char(52),char(139),char(52),char(147),char(52),char(155),char(52),char(193),char(52),char(201), +char(52),char(209),char(53),char(6),char(53),char(14),char(53),char(50),char(53),char(58), +char(53),char(113),char(53),char(121),char(53),char(129),char(53),char(232),char(53),char(240), +char(54),char(60),char(54),char(144),char(54),char(162),char(54),char(180),char(54),char(196), +char(54),char(212),char(54),char(228),char(54),char(245),char(55),char(7),char(55),char(107), +char(55),char(208),char(56),char(6),char(56),char(103),char(56),char(197),char(57),char(18), +char(57),char(76),char(57),char(166),char(57),char(210),char(57),char(218),char(58),char(44), +char(58),char(52),char(58),char(95),char(58),char(202),char(58),char(210),char(59),char(16), +char(59),char(92),char(59),char(168),char(59),char(237),char(60),char(37),char(60),char(93), +char(60),char(186),char(61),char(16),char(61),char(95),char(61),char(185),char(61),char(203), +char(61),char(220),char(61),char(236),char(61),char(252),char(62),char(13),char(62),char(31), +char(62),char(111),char(62),char(128),char(62),char(202),char(62),char(210),char(62),char(218), +char(62),char(236),char(62),char(244),char(63),char(83),char(63),char(166),char(63),char(229), +char(63),char(246),char(64),char(7),char(64),char(55),char(64),char(63),char(64),char(134), +char(64),char(142),char(64),char(150),char(64),char(223),char(64),char(231),char(65),char(44), +char(65),char(137),char(65),char(193),char(65),char(210),char(66),char(1),char(66),char(60), +char(66),char(68),char(66),char(76),char(66),char(84),char(66),char(92),char(66),char(100), +char(66),char(108),char(66),char(116),char(66),char(179),char(66),char(187),char(66),char(195), +char(66),char(244),char(67),char(43),char(67),char(91),char(67),char(149),char(67),char(219), +char(68),char(35),char(68),char(97),char(68),char(175),char(69),char(15),char(69),char(86), +char(69),char(94),char(69),char(186),char(70),char(21),char(70),char(52),char(70),char(124), +char(70),char(132),char(70),char(202),char(71),char(35),char(71),char(91),char(71),char(107), +char(71),char(155),char(71),char(209),char(72),char(20),char(72),char(73),char(72),char(81), +char(72),char(117),char(72),char(125),char(72),char(133),char(72),char(170),char(72),char(178), +char(73),char(19),char(73),char(27),char(73),char(76),char(73),char(131),char(73),char(180), +char(73),char(239),char(74),char(52),char(74),char(125),char(74),char(184),char(75),char(8), +char(75),char(101),char(75),char(169),char(75),char(186),char(76),char(37),char(76),char(53), +char(76),char(131),char(76),char(139),char(76),char(147),char(76),char(165),char(76),char(173), +char(77),char(6),char(77),char(88),char(77),char(96),char(77),char(112),char(77),char(128), +char(77),char(177),char(77),char(214),char(77),char(253),char(78),char(14),char(78),char(30), +char(78),char(47),char(78),char(64),char(78),char(82),char(78),char(100),char(78),char(117), +char(78),char(134),char(78),char(155),char(78),char(176),char(78),char(184),char(78),char(218), +char(78),char(247),char(79),char(21),char(79),char(29),char(79),char(58),char(79),char(105), +char(79),char(154),char(79),char(180),char(79),char(242),char(80),char(90),char(80),char(122), +char(80),char(138),char(81),char(36),char(81),char(44),char(81),char(52),char(81),char(87), +char(81),char(123),char(81),char(135),char(81),char(160),char(81),char(211),char(82),char(24), +char(82),char(134),char(82),char(248),char(83),char(110),char(83),char(212),char(84),char(44), +char(84),char(160),char(84),char(244),char(84),char(252),char(85),char(75),char(85),char(98), +char(85),char(121),char(85),char(144),char(85),char(167),char(86),char(10),char(86),char(62), +char(86),char(99),char(86),char(151),char(86),char(174),char(86),char(210),char(87),char(50), +char(87),char(98),char(87),char(227),char(88),char(44),char(88),char(62),char(88),char(80), +char(88),char(125),char(88),char(137),char(88),char(149),char(88),char(188),char(88),char(227), +char(89),char(2),char(89),char(33),char(89),char(64),char(89),char(117),char(89),char(183), +char(89),char(252),char(90),char(77),char(90),char(110),char(90),char(211),char(91),char(39), +char(91),char(39),char(91),char(39),char(91),char(39),char(91),char(39),char(91),char(39), +char(91),char(39),char(91),char(39),char(91),char(39),char(91),char(39),char(91),char(39), +char(91),char(39),char(91),char(39),char(91),char(39),char(92),char(113),char(92),char(204), +char(92),char(221),char(92),char(229),char(93),char(108),char(93),char(167),char(94),char(11), +char(94),char(28),char(94),char(45),char(94),char(57),char(94),char(69),char(94),char(87), +char(94),char(140),char(94),char(195),char(94),char(211),char(94),char(227),char(95),char(64), +char(95),char(151),char(95),char(224),char(96),char(49),char(96),char(58),char(96),char(67), +char(96),char(76),char(96),char(122),char(96),char(153),char(96),char(170),char(96),char(187), +char(96),char(203),char(96),char(219),char(97),char(78),char(97),char(153),char(97),char(237), +char(98),char(59),char(98),char(155),char(98),char(254),char(99),char(63),char(99),char(128), +char(99),char(214),char(100),char(44),char(100),char(143),char(100),char(244),char(101),char(105), +char(101),char(224),char(102),char(140),char(103),char(48),char(103),char(56),char(103),char(64), +char(103),char(157),char(103),char(246),char(104),char(47),char(104),char(103),char(104),char(121), +char(104),char(139),char(105),char(1),char(105),char(13),char(105),char(128),char(105),char(243), +char(106),char(157),char(107),char(59),char(107),char(209),char(108),char(58),char(108),char(125), +char(108),char(191),char(109),char(3),char(109),char(51),char(109),char(96),char(109),char(134), +char(109),char(172),char(110),char(144),char(111),char(27),char(111),char(129),char(111),char(223), +char(112),char(49),char(112),char(130),char(112),char(215),char(113),char(67),char(113),char(123), +char(113),char(180),char(114),char(6),char(114),char(85),char(114),char(168),char(114),char(251), +char(115),char(7),char(115),char(19),char(115),char(80),char(115),char(140),char(115),char(205), +char(116),char(16),char(116),char(88),char(116),char(172),char(116),char(230),char(117),char(30), +char(117),char(93),char(117),char(162),char(117),char(221),char(118),char(29),char(118),char(115), +char(118),char(198),char(119),char(66),char(119),char(185),char(119),char(197),char(119),char(209), +char(120),char(2),char(120),char(52),char(120),char(60),char(120),char(111),char(120),char(173), +char(120),char(241),char(121),char(48),char(121),char(113),char(121),char(174),char(121),char(236), +char(122),char(48),char(122),char(115),char(122),char(191),char(123),char(11),char(123),char(67), +char(123),char(122),char(123),char(232),char(124),char(75),char(124),char(193),char(125),char(45), +char(125),char(53),char(125),char(70),char(125),char(87),char(125),char(172),char(125),char(252), +char(126),char(68),char(126),char(135),char(126),char(204),char(127),char(21),char(127),char(85), +char(127),char(150),char(127),char(218),char(128),char(30),char(128),char(111),char(128),char(189), +char(128),char(197),char(128),char(214),char(128),char(230),char(128),char(248),char(129),char(9), +char(129),char(17),char(129),char(25),char(129),char(42),char(129),char(58),char(129),char(139), +char(129),char(218),char(129),char(236),char(129),char(253),char(130),char(15),char(130),char(33), +char(130),char(51),char(130),char(68),char(130),char(144),char(130),char(218),char(130),char(235), +char(130),char(251),char(131),char(13),char(131),char(30),char(131),char(48),char(131),char(65), +char(131),char(73),char(131),char(81),char(131),char(99),char(131),char(116),char(131),char(134), +char(131),char(151),char(131),char(168),char(131),char(184),char(131),char(202),char(131),char(219), +char(131),char(237),char(131),char(254),char(132),char(16),char(132),char(33),char(132),char(76), +char(132),char(119),char(132),char(137),char(132),char(155),char(132),char(167),char(132),char(178), +char(132),char(190),char(132),char(202),char(133),char(16),char(133),char(86),char(133),char(148), +char(133),char(156),char(133),char(246),char(134),char(100),char(134),char(201),char(135),char(39), +char(135),char(129),char(135),char(212),char(136),char(43),char(136),char(121),char(136),char(196), +char(137),char(19),char(137),char(102),char(137),char(176),char(137),char(239),char(138),char(45), +char(138),char(138),char(138),char(146),char(138),char(158),char(138),char(170),char(138),char(182), +char(138),char(194),char(138),char(211),char(138),char(228),char(138),char(246),char(139),char(8), +char(139),char(26),char(139),char(44),char(139),char(62),char(139),char(80),char(139),char(98), +char(139),char(116),char(139),char(137),char(139),char(157),char(139),char(175),char(139),char(193), +char(139),char(211),char(139),char(229),char(139),char(247),char(140),char(9),char(140),char(27), +char(140),char(45),char(140),char(66),char(140),char(86),char(140),char(98),char(140),char(110), +char(140),char(127),char(140),char(144),char(140),char(161),char(140),char(177),char(140),char(195), +char(140),char(213),char(140),char(231),char(140),char(249),char(141),char(11),char(141),char(29), +char(141),char(47),char(141),char(65),char(141),char(86),char(141),char(106),char(141),char(123), +char(141),char(140),char(141),char(152),char(141),char(164),char(141),char(176),char(141),char(188), +char(141),char(205),char(141),char(222),char(141),char(240),char(142),char(2),char(142),char(20), +char(142),char(38),char(142),char(56),char(142),char(74),char(142),char(92),char(142),char(110), +char(142),char(131),char(142),char(151),char(142),char(168),char(142),char(184),char(142),char(201), +char(142),char(217),char(142),char(234),char(142),char(251),char(143),char(12),char(143),char(28), +char(143),char(40),char(143),char(52),char(143),char(64),char(143),char(76),char(143),char(93), +char(143),char(110),char(143),char(127),char(143),char(143),char(143),char(160),char(143),char(176), +char(143),char(193),char(143),char(210),char(143),char(227),char(143),char(243),char(143),char(255), +char(144),char(11),char(144),char(23),char(144),char(35),char(144),char(52),char(144),char(69), +char(144),char(86),char(144),char(102),char(144),char(114),char(144),char(166),char(144),char(225), +char(145),char(29),char(145),char(106),char(145),char(194),char(145),char(250),char(146),char(50), +char(146),char(123),char(146),char(205),char(146),char(245),char(147),char(24),char(147),char(59), +char(147),char(68),char(147),char(131),char(147),char(173),char(147),char(238),char(148),char(78), +char(148),char(147),char(148),char(222),char(148),char(230),char(149),char(9),char(149),char(17), +char(149),char(110),char(149),char(122),char(149),char(246),char(150),char(2),char(150),char(14), +char(150),char(113),char(150),char(129),char(150),char(145),char(150),char(162),char(150),char(178), +char(150),char(199),char(150),char(216),char(150),char(233),char(150),char(250),char(151),char(12), +char(151),char(29),char(151),char(46),char(151),char(63),char(151),char(74),char(151),char(91), +char(151),char(103),char(151),char(121),char(151),char(129),char(151),char(147),char(151),char(155), +char(151),char(173),char(151),char(181),char(151),char(189),char(151),char(206),char(151),char(218), +char(0),char(0),char(0),char(2),char(0),char(193),char(0),char(0),char(4),char(10), +char(5),char(182),char(0),char(3),char(0),char(7),char(0),char(21),char(183),char(4), +char(3),char(5),char(2),char(4),char(3),char(7),char(0),char(0),char(47),char(50), +char(47),char(51),char(1),char(47),char(51),char(47),char(51),char(49),char(48),char(19), +char(33),char(17),char(33),char(55),char(33),char(17),char(33),char(193),char(3),char(73), +char(252),char(183),char(104),char(2),char(121),char(253),char(135),char(5),char(182),char(250), +char(74),char(104),char(4),char(230),char(0),char(2),char(0),char(152),char(255),char(227), +char(1),char(137),char(5),char(182),char(0),char(3),char(0),char(14),char(0),char(43), +char(64),char(20),char(3),char(9),char(9),char(2),char(4),char(4),char(15),char(16), +char(1),char(1),char(12),char(2),char(12),char(6),char(79),char(89),char(12),char(22), +char(2),char(3),char(0),char(63),char(63),char(43),char(17),char(18),char(0),char(57), +char(24),char(47),char(17),char(18),char(1),char(57),char(17),char(51),char(51),char(17), +char(51),char(49),char(48),char(1),char(35),char(3),char(51),char(3),char(52),char(51), +char(50),char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(1),char(70), +char(105),char(51),char(207),char(225),char(120),char(58),char(63),char(64),char(57),char(52), +char(68),char(1),char(147),char(4),char(35),char(250),char(180),char(136),char(70),char(66), +char(64),char(71),char(63),char(0),char(0),char(2),char(0),char(133),char(3),char(166), +char(2),char(176),char(5),char(182),char(0),char(3),char(0),char(7),char(0),char(31), +char(64),char(13),char(0),char(3),char(7),char(4),char(3),char(4),char(8),char(9), +char(6),char(2),char(7),char(3),char(3),char(0),char(63),char(51),char(205),char(50), +char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(3),char(35),char(3),char(33),char(3),char(35),char(3),char(1), +char(63),char(40),char(105),char(41),char(2),char(43),char(41),char(104),char(41),char(5), +char(182),char(253),char(240),char(2),char(16),char(253),char(240),char(2),char(16),char(0), +char(0),char(2),char(0),char(51),char(0),char(0),char(4),char(246),char(5),char(182), +char(0),char(27),char(0),char(31),char(0),char(153),char(64),char(85),char(8),char(31), +char(28),char(21),char(4),char(20),char(9),char(17),char(12),char(12),char(9),char(18), +char(15),char(14),char(11),char(4),char(10),char(19),char(19),char(20),char(22),char(29), +char(30),char(7),char(4),char(6),char(23),char(4),char(1),char(0),char(25),char(4), +char(24),char(5),char(5),char(6),char(20),char(6),char(10),char(33),char(3),char(26), +char(23),char(3),char(24),char(10),char(24),char(32),char(33),char(8),char(4),char(12), +char(13),char(12),char(78),char(89),char(28),char(1),char(13),char(31),char(0),char(16), +char(17),char(16),char(78),char(89),char(25),char(21),char(17),char(79),char(13),char(1), +char(79),char(17),char(1),char(13),char(17),char(13),char(17),char(5),char(23),char(19), +char(3),char(10),char(5),char(0),char(47),char(51),char(63),char(51),char(18),char(57), +char(57),char(47),char(47),char(93),char(93),char(17),char(51),char(51),char(43),char(17), +char(0),char(51),char(51),char(17),char(51),char(51),char(43),char(17),char(0),char(51), +char(51),char(17),char(18),char(1),char(57),char(57),char(17),char(23),char(51),char(17), +char(18),char(57),char(57),char(17),char(51),char(17),char(18),char(23),char(57),char(17), +char(18),char(23),char(57),char(17),char(51),char(17),char(18),char(23),char(57),char(50), +char(50),char(17),char(51),char(17),char(18),char(23),char(57),char(49),char(48),char(1), +char(3),char(33),char(21),char(33),char(3),char(35),char(19),char(33),char(3),char(35), +char(19),char(33),char(53),char(33),char(19),char(33),char(53),char(33),char(19),char(51), +char(3),char(33),char(19),char(51),char(3),char(33),char(21),char(1),char(33),char(19), +char(33),char(3),char(213),char(66),char(1),char(27),char(254),char(205),char(84),char(137), +char(84),char(254),char(209),char(82),char(136),char(80),char(254),char(250),char(1),char(31), +char(68),char(254),char(235),char(1),char(43),char(82),char(139),char(82),char(1),char(49), +char(84),char(134),char(84),char(1),char(8),char(252),char(229),char(1),char(47),char(66), +char(254),char(209),char(3),char(131),char(254),char(172),char(129),char(254),char(82),char(1), +char(174),char(254),char(82),char(1),char(174),char(129),char(1),char(84),char(127),char(1), +char(180),char(254),char(76),char(1),char(180),char(254),char(76),char(127),char(254),char(172), +char(1),char(84),char(0),char(3),char(0),char(131),char(255),char(137),char(4),char(12), +char(6),char(18),char(0),char(32),char(0),char(38),char(0),char(45),char(0),char(102), +char(64),char(53),char(39),char(17),char(37),char(29),char(23),char(4),char(4),char(42), +char(20),char(13),char(5),char(33),char(0),char(0),char(25),char(5),char(17),char(9), +char(5),char(46),char(47),char(37),char(13),char(6),char(13),char(77),char(89),char(3), +char(6),char(36),char(14),char(42),char(14),char(76),char(89),char(29),char(42),char(43), +char(28),char(20),char(28),char(77),char(89),char(23),char(42),char(20),char(6),char(20), +char(6),char(20),char(5),char(22),char(5),char(0),char(47),char(47),char(18),char(57), +char(57),char(47),char(47),char(18),char(57),char(50),char(43),char(17),char(0),char(51), +char(17),char(51),char(43),char(17),char(0),char(51),char(17),char(51),char(43),char(17), +char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(51),char(51),char(51),char(17),char(51),char(51),char(51),char(17),char(51), +char(49),char(48),char(1),char(20),char(6),char(7),char(21),char(35),char(53),char(34), +char(38),char(39),char(53),char(22),char(22),char(51),char(17),char(38),char(38),char(53), +char(52),char(54),char(55),char(53),char(51),char(21),char(22),char(23),char(7),char(38), +char(39),char(17),char(30),char(2),char(7),char(52),char(38),char(39),char(17),char(54), +char(1),char(20),char(22),char(23),char(17),char(6),char(6),char(4),char(12),char(204), +char(183),char(129),char(112),char(210),char(67),char(83),char(217),char(89),char(205),char(165), +char(203),char(167),char(129),char(184),char(171),char(52),char(149),char(154),char(157),char(156), +char(74),char(170),char(89),char(128),char(217),char(253),char(221),char(90),char(111),char(99), +char(102),char(1),char(193),char(136),char(177),char(23),char(232),char(223),char(35),char(31), +char(156),char(37),char(47),char(1),char(184),char(65),char(172),char(136),char(131),char(168), +char(18),char(182),char(180),char(5),char(69),char(131),char(59),char(11),char(254),char(78), +char(50),char(95),char(123),char(101),char(72),char(89),char(44),char(254),char(123),char(30), +char(3),char(7),char(76),char(92),char(41),char(1),char(131),char(16),char(93),char(0), +char(0),char(5),char(0),char(104),char(255),char(236),char(6),char(45),char(5),char(203), +char(0),char(9),char(0),char(21),char(0),char(33),char(0),char(45),char(0),char(49), +char(0),char(69),char(64),char(36),char(0),char(16),char(5),char(10),char(22),char(40), +char(28),char(34),char(34),char(46),char(40),char(10),char(48),char(16),char(6),char(50), +char(51),char(3),char(13),char(31),char(43),char(13),char(43),char(13),char(43),char(48), +char(49),char(6),char(48),char(24),char(25),char(37),char(25),char(7),char(19),char(7), +char(0),char(63),char(51),char(63),char(51),char(63),char(63),char(18),char(57),char(57), +char(47),char(47),char(17),char(51),char(17),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(19),char(20),char(22),char(51),char(50),char(17),char(16),char(35),char(34), +char(6),char(5),char(20),char(6),char(35),char(34),char(38),char(53),char(52),char(54), +char(51),char(50),char(22),char(1),char(20),char(22),char(51),char(50),char(54),char(53), +char(52),char(38),char(35),char(34),char(6),char(5),char(20),char(6),char(35),char(34), +char(38),char(53),char(52),char(54),char(51),char(50),char(22),char(1),char(1),char(35), +char(1),char(242),char(74),char(83),char(164),char(164),char(83),char(74),char(1),char(202), +char(153),char(148),char(140),char(155),char(149),char(146),char(145),char(156),char(1),char(166), +char(74),char(84),char(84),char(80),char(80),char(84),char(84),char(74),char(1),char(203), +char(153),char(148),char(142),char(153),char(149),char(146),char(142),char(159),char(254),char(254), +char(252),char(213),char(147),char(3),char(43),char(4),char(2),char(170),char(170),char(1), +char(84),char(1),char(82),char(168),char(170),char(228),char(233),char(238),char(223),char(227), +char(230),char(238),char(252),char(219),char(171),char(169),char(167),char(173),char(171),char(165), +char(165),char(171),char(227),char(233),char(238),char(222),char(227),char(230),char(235),char(3), +char(32),char(250),char(74),char(5),char(182),char(0),char(0),char(3),char(0),char(113), +char(255),char(236),char(5),char(211),char(5),char(205),char(0),char(11),char(0),char(21), +char(0),char(53),char(0),char(81),char(64),char(48),char(19),char(22),char(0),char(29), +char(6),char(35),char(42),char(43),char(46),char(43),char(45),char(35),char(14),char(38), +char(25),char(29),char(22),char(9),char(54),char(55),char(51),char(12),char(73),char(89), +char(51),char(19),char(15),char(39),char(45),char(14),char(48),char(5),char(47),char(3), +char(25),char(38),char(3),char(42),char(42),char(32),char(47),char(18),char(32),char(9), +char(74),char(89),char(32),char(4),char(0),char(63),char(43),char(0),char(24),char(63), +char(18),char(57),char(47),char(23),char(57),char(18),char(23),char(57),char(63),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(20),char(22),char(23),char(54), +char(54),char(53),char(52),char(38),char(35),char(34),char(6),char(19),char(50),char(55), +char(1),char(14),char(2),char(21),char(20),char(22),char(37),char(52),char(54),char(55), +char(46),char(2),char(53),char(52),char(54),char(51),char(50),char(22),char(21),char(20), +char(6),char(7),char(1),char(54),char(54),char(55),char(51),char(2),char(7),char(1), +char(35),char(39),char(6),char(6),char(35),char(34),char(38),char(1),char(158),char(72), +char(87),char(129),char(101),char(103),char(86),char(89),char(111),char(155),char(241),char(159), +char(254),char(75),char(111),char(92),char(44),char(155),char(254),char(185),char(139),char(180), +char(85),char(61),char(36),char(196),char(175),char(162),char(186),char(136),char(157),char(1), +char(151),char(56),char(67),char(23),char(168),char(68),char(137),char(1),char(43),char(229), +char(185),char(118),char(244),char(150),char(215),char(237),char(4),char(147),char(69),char(125), +char(88),char(75),char(127),char(83),char(77),char(97),char(96),char(251),char(157),char(154), +char(1),char(168),char(68),char(89),char(102),char(65),char(117),char(137),char(250),char(130), +char(200),char(102),char(95),char(98),char(106),char(57),char(150),char(168),char(167),char(149), +char(107),char(181),char(93),char(254),char(121),char(62),char(167),char(99),char(254),char(226), +char(148),char(254),char(221),char(178),char(106),char(92),char(212),char(0),char(0),char(1), +char(0),char(133),char(3),char(166),char(1),char(63),char(5),char(182),char(0),char(3), +char(0),char(20),char(183),char(0),char(3),char(3),char(4),char(5),char(2),char(3), +char(3),char(0),char(63),char(205),char(17),char(18),char(1),char(57),char(17),char(51), +char(49),char(48),char(1),char(3),char(35),char(3),char(1),char(63),char(40),char(105), +char(41),char(5),char(182),char(253),char(240),char(2),char(16),char(0),char(0),char(1), +char(0),char(82),char(254),char(188),char(2),char(33),char(5),char(182),char(0),char(13), +char(0),char(28),char(64),char(12),char(7),char(0),char(10),char(4),char(0),char(4), +char(14),char(15),char(11),char(39),char(3),char(3),char(0),char(63),char(63),char(17), +char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(19),char(16),char(18),char(55),char(51),char(6),char(2),char(21),char(20),char(18), +char(23),char(35),char(38),char(2),char(82),char(155),char(146),char(162),char(144),char(145), +char(148),char(139),char(160),char(147),char(154),char(2),char(49),char(1),char(9),char(1), +char(206),char(174),char(193),char(254),char(50),char(244),char(240),char(254),char(54),char(189), +char(170),char(1),char(198),char(0),char(0),char(1),char(0),char(61),char(254),char(188), +char(2),char(12),char(5),char(182),char(0),char(13),char(0),char(28),char(64),char(12), +char(4),char(10),char(7),char(0),char(10),char(0),char(14),char(15),char(10),char(3), +char(4),char(39),char(0),char(63),char(63),char(17),char(18),char(1),char(57),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(2),char(7), +char(35),char(54),char(18),char(53),char(52),char(2),char(39),char(51),char(22),char(18), +char(2),char(12),char(155),char(146),char(160),char(139),char(148),char(145),char(144),char(162), +char(147),char(154),char(2),char(49),char(254),char(249),char(254),char(58),char(168),char(188), +char(1),char(203),char(240),char(244),char(1),char(206),char(193),char(175),char(254),char(49), +char(0),char(1),char(0),char(86),char(2),char(127),char(4),char(14),char(6),char(20), +char(0),char(14),char(0),char(48),char(64),char(27),char(3),char(5),char(4),char(1), +char(7),char(13),char(10),char(9),char(11),char(9),char(15),char(16),char(4),char(10), +char(1),char(13),char(2),char(12),char(12),char(13),char(10),char(7),char(4),char(6), +char(8),char(14),char(0),char(0),char(63),char(196),char(50),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(18),char(1),char(23),char(57), +char(49),char(48),char(1),char(3),char(37),char(23),char(5),char(19),char(7),char(3), +char(3),char(39),char(19),char(37),char(55),char(5),char(3),char(2),char(145),char(43), +char(1),char(142),char(26),char(254),char(131),char(248),char(172),char(176),char(160),char(176), +char(242),char(254),char(135),char(29),char(1),char(135),char(43),char(6),char(20),char(254), +char(117),char(111),char(182),char(31),char(254),char(186),char(94),char(1),char(106),char(254), +char(150),char(94),char(1),char(70),char(31),char(182),char(111),char(1),char(139),char(0), +char(0),char(1),char(0),char(104),char(0),char(227),char(4),char(41),char(4),char(195), +char(0),char(11),char(0),char(40),char(64),char(19),char(0),char(4),char(4),char(9), +char(5),char(5),char(12),char(13),char(3),char(7),char(8),char(7),char(80),char(89), +char(0),char(15),char(8),char(1),char(8),char(0),char(47),char(93),char(51),char(43), +char(17),char(0),char(51),char(17),char(18),char(1),char(57),char(17),char(51),char(51), +char(17),char(51),char(49),char(48),char(1),char(33),char(21),char(33),char(17),char(35), +char(17),char(33),char(53),char(33),char(17),char(51),char(2),char(141),char(1),char(156), +char(254),char(100),char(139),char(254),char(102),char(1),char(154),char(139),char(3),char(23), +char(138),char(254),char(86),char(1),char(170),char(138),char(1),char(172),char(0),char(1), +char(0),char(63),char(254),char(248),char(1),char(109),char(0),char(238),char(0),char(8), +char(0),char(17),char(181),char(5),char(0),char(9),char(10),char(5),char(0),char(0), +char(47),char(205),char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(37), +char(23),char(6),char(2),char(7),char(35),char(54),char(18),char(55),char(1),char(94), +char(15),char(26),char(98),char(53),char(125),char(27),char(65),char(13),char(238),char(23), +char(100),char(254),char(247),char(114),char(104),char(1),char(50),char(92),char(0),char(1), +char(0),char(84),char(1),char(217),char(2),char(63),char(2),char(113),char(0),char(3), +char(0),char(17),char(181),char(2),char(0),char(5),char(4),char(0),char(1),char(0), +char(47),char(51),char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(19), +char(53),char(33),char(21),char(84),char(1),char(235),char(1),char(217),char(152),char(152), +char(0),char(1),char(0),char(152),char(255),char(227),char(1),char(137),char(0),char(242), +char(0),char(11),char(0),char(24),char(64),char(11),char(6),char(0),char(0),char(12), +char(13),char(9),char(3),char(79),char(89),char(9),char(22),char(0),char(63),char(43), +char(17),char(18),char(1),char(57),char(17),char(51),char(49),char(48),char(55),char(52), +char(54),char(51),char(50),char(22),char(21),char(20),char(6),char(35),char(34),char(38), +char(152),char(61),char(57),char(58),char(65),char(66),char(57),char(51),char(67),char(106), +char(67),char(69),char(69),char(67),char(65),char(70),char(63),char(0),char(0),char(1), +char(0),char(20),char(0),char(0),char(2),char(219),char(5),char(182),char(0),char(3), +char(0),char(19),char(183),char(2),char(0),char(4),char(5),char(3),char(3),char(2), +char(18),char(0),char(63),char(63),char(17),char(18),char(1),char(57),char(57),char(49), +char(48),char(1),char(1),char(35),char(1),char(2),char(219),char(253),char(223),char(166), +char(2),char(33),char(5),char(182),char(250),char(74),char(5),char(182),char(0),char(2), +char(0),char(102),char(255),char(236),char(4),char(45),char(5),char(205),char(0),char(11), +char(0),char(23),char(0),char(40),char(64),char(20),char(18),char(0),char(12),char(6), +char(0),char(6),char(25),char(24),char(9),char(21),char(75),char(89),char(9),char(7), +char(3),char(15),char(75),char(89),char(3),char(25),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(16),char(2),char(35),char(34),char(2), +char(17),char(16),char(18),char(51),char(50),char(18),char(1),char(16),char(18),char(51), +char(50),char(18),char(17),char(16),char(2),char(35),char(34),char(2),char(4),char(45), +char(239),char(246),char(236),char(246),char(238),char(244),char(238),char(247),char(252),char(225), +char(150),char(164),char(166),char(149),char(149),char(166),char(164),char(150),char(2),char(221), +char(254),char(133),char(254),char(138),char(1),char(127),char(1),char(114),char(1),char(126), +char(1),char(114),char(254),char(126),char(254),char(146),char(254),char(193),char(254),char(221), +char(1),char(39),char(1),char(59),char(1),char(59),char(1),char(37),char(254),char(223), +char(0),char(1),char(0),char(188),char(0),char(0),char(2),char(203),char(5),char(182), +char(0),char(10),char(0),char(36),char(64),char(16),char(9),char(0),char(1),char(8), +char(1),char(11),char(12),char(4),char(9),char(7),char(7),char(1),char(9),char(6), +char(1),char(24),char(0),char(63),char(63),char(18),char(57),char(47),char(18),char(57), +char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(51),char(49),char(48), +char(33),char(35),char(17),char(52),char(55),char(6),char(6),char(7),char(39),char(1), +char(51),char(2),char(203),char(162),char(8),char(21),char(52),char(212),char(88),char(1), +char(131),char(140),char(4),char(18),char(130),char(116),char(21),char(46),char(172),char(114), +char(1),char(43),char(0),char(1),char(0),char(100),char(0),char(0),char(4),char(37), +char(5),char(203),char(0),char(25),char(0),char(43),char(64),char(23),char(24),char(1), +char(7),char(19),char(0),char(19),char(14),char(1),char(4),char(26),char(27),char(16), +char(10),char(75),char(89),char(16),char(7),char(1),char(24),char(76),char(89),char(1), +char(24),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(33), +char(33),char(53),char(1),char(62),char(2),char(53),char(52),char(38),char(35),char(34), +char(6),char(7),char(39),char(54),char(51),char(50),char(22),char(21),char(20),char(2), +char(7),char(1),char(21),char(33),char(4),char(37),char(252),char(63),char(1),char(129), +char(176),char(112),char(56),char(142),char(126),char(91),char(163),char(100),char(88),char(202), +char(238),char(206),char(234),char(156),char(214),char(254),char(192),char(2),char(240),char(143), +char(1),char(131),char(178),char(152),char(144),char(83),char(117),char(137),char(60),char(79), +char(113),char(168),char(211),char(178),char(139),char(254),char(240),char(208),char(254),char(199), +char(8),char(0),char(0),char(1),char(0),char(94),char(255),char(236),char(4),char(27), +char(5),char(203),char(0),char(39),char(0),char(67),char(64),char(36),char(27),char(0), +char(19),char(7),char(7),char(0),char(3),char(22),char(34),char(13),char(6),char(40), +char(41),char(3),char(23),char(22),char(23),char(22),char(75),char(89),char(23),char(23), +char(10),char(37),char(37),char(30),char(75),char(89),char(37),char(7),char(10),char(17), +char(75),char(89),char(10),char(25),char(0),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18), +char(0),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(20),char(6),char(7),char(21),char(22),char(22), +char(21),char(20),char(4),char(33),char(34),char(38),char(39),char(53),char(22),char(22), +char(51),char(32),char(17),char(16),char(33),char(35),char(53),char(51),char(50),char(54), +char(53),char(52),char(38),char(35),char(34),char(6),char(7),char(39),char(54),char(54), +char(51),char(50),char(22),char(3),char(238),char(157),char(144),char(176),char(170),char(254), +char(222),char(254),char(245),char(116),char(193),char(91),char(95),char(215),char(96),char(1), +char(123),char(254),char(94),char(144),char(146),char(171),char(200),char(147),char(126),char(96), +char(170),char(109),char(84),char(90),char(235),char(130),char(213),char(236),char(4),char(94), +char(140),char(178),char(30),char(8),char(22),char(180),char(146),char(209),char(225),char(35), +char(44),char(158),char(47),char(49),char(1),char(41),char(1),char(10),char(143),char(151), +char(134),char(107),char(122),char(52),char(70),char(112),char(71),char(81),char(195),char(0), +char(0),char(2),char(0),char(43),char(0),char(0),char(4),char(106),char(5),char(190), +char(0),char(10),char(0),char(18),char(0),char(60),char(64),char(30),char(18),char(5), +char(9),char(2),char(2),char(11),char(7),char(3),char(0),char(3),char(5),char(3), +char(19),char(20),char(1),char(5),char(18),char(5),char(76),char(89),char(9),char(15), +char(7),char(18),char(18),char(3),char(7),char(6),char(3),char(24),char(0),char(63), +char(63),char(18),char(57),char(47),char(18),char(57),char(51),char(43),char(17),char(0), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(35),char(17),char(35), +char(17),char(33),char(53),char(1),char(51),char(17),char(51),char(33),char(17),char(52), +char(55),char(35),char(6),char(7),char(1),char(4),char(106),char(217),char(159),char(253), +char(57),char(2),char(182),char(176),char(217),char(254),char(136),char(10),char(8),char(48), +char(42),char(254),char(55),char(1),char(80),char(254),char(176),char(1),char(80),char(145), +char(3),char(221),char(252),char(41),char(1),char(230),char(143),char(180),char(96),char(63), +char(253),char(118),char(0),char(1),char(0),char(133),char(255),char(236),char(4),char(29), +char(5),char(182),char(0),char(26),char(0),char(58),char(64),char(31),char(15),char(3), +char(25),char(20),char(8),char(20),char(23),char(3),char(4),char(28),char(27),char(0), +char(17),char(75),char(89),char(0),char(0),char(6),char(21),char(21),char(24),char(76), +char(89),char(21),char(6),char(6),char(12),char(75),char(89),char(6),char(25),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57), +char(24),char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(50),char(4),char(21),char(20),char(0), +char(35),char(34),char(39),char(53),char(22),char(22),char(51),char(50),char(54),char(53), +char(16),char(33),char(34),char(7),char(39),char(19),char(33),char(21),char(33),char(3), +char(54),char(2),char(45),char(231),char(1),char(9),char(254),char(223),char(254),char(247), +char(130),char(70),char(208),char(101),char(176),char(195),char(254),char(137),char(95),char(159), +char(86),char(55),char(2),char(215),char(253),char(183),char(37),char(115),char(3),char(125), +char(229),char(199),char(227),char(254),char(254),char(79),char(160),char(45),char(51),char(166), +char(157),char(1),char(50),char(29),char(55),char(2),char(172),char(153),char(254),char(73), +char(23),char(0),char(0),char(2),char(0),char(117),char(255),char(236),char(4),char(47), +char(5),char(203),char(0),char(22),char(0),char(36),char(0),char(68),char(64),char(35), +char(26),char(17),char(11),char(33),char(33),char(0),char(0),char(6),char(17),char(3), +char(38),char(37),char(12),char(11),char(14),char(29),char(77),char(89),char(11),char(14), +char(14),char(20),char(3),char(20),char(23),char(75),char(89),char(20),char(25),char(3), +char(8),char(77),char(89),char(3),char(7),char(0),char(63),char(43),char(0),char(24), +char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(57),char(43), +char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(19),char(16),char(0),char(33), +char(50),char(23),char(21),char(38),char(35),char(34),char(2),char(3),char(51),char(54), +char(51),char(50),char(22),char(21),char(20),char(2),char(35),char(34),char(0),char(5), +char(50),char(54),char(53),char(52),char(38),char(35),char(34),char(6),char(6),char(21), +char(20),char(22),char(22),char(117),char(1),char(79),char(1),char(72),char(113),char(65), +char(77),char(99),char(235),char(248),char(12),char(12),char(110),char(238),char(197),char(227), +char(249),char(212),char(227),char(254),char(246),char(1),char(235),char(142),char(157),char(146), +char(145),char(90),char(150),char(89),char(80),char(147),char(2),char(113),char(1),char(175), +char(1),char(171),char(19),char(143),char(25),char(254),char(219),char(254),char(198),char(172), +char(238),char(204),char(228),char(254),char(251),char(1),char(85),char(200),char(179),char(169), +char(145),char(166),char(74),char(130),char(70),char(103),char(178),char(104),char(0),char(1), +char(0),char(94),char(0),char(0),char(4),char(43),char(5),char(182),char(0),char(6), +char(0),char(31),char(64),char(16),char(1),char(5),char(5),char(0),char(2),char(3), +char(7),char(8),char(3),char(2),char(76),char(89),char(3),char(6),char(0),char(24), +char(0),char(63),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(49),char(48),char(33),char(1),char(33),char(53),char(33),char(21),char(1), +char(1),char(29),char(2),char(94),char(252),char(227),char(3),char(205),char(253),char(170), +char(5),char(29),char(153),char(133),char(250),char(207),char(0),char(3),char(0),char(104), +char(255),char(236),char(4),char(41),char(5),char(203),char(0),char(22),char(0),char(34), +char(0),char(46),char(0),char(77),char(64),char(41),char(23),char(15),char(38),char(20), +char(44),char(3),char(29),char(9),char(9),char(3),char(6),char(17),char(20),char(15), +char(6),char(47),char(48),char(6),char(17),char(41),char(32),char(41),char(32),char(75), +char(89),char(41),char(41),char(12),char(0),char(12),char(26),char(77),char(89),char(12), +char(25),char(0),char(35),char(77),char(89),char(0),char(7),char(0),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(0),char(57),char(57),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(50),char(22),char(21),char(20),char(6),char(7),char(22),char(22), +char(21),char(20),char(6),char(35),char(34),char(38),char(53),char(52),char(37),char(38), +char(38),char(53),char(52),char(54),char(3),char(20),char(22),char(51),char(50),char(54), +char(53),char(52),char(38),char(39),char(6),char(6),char(1),char(34),char(6),char(21), +char(20),char(22),char(23),char(54),char(54),char(53),char(52),char(38),char(2),char(72), +char(200),char(234),char(134),char(147),char(178),char(150),char(254),char(221),char(234),char(252), +char(1),char(50),char(138),char(120),char(235),char(119),char(167),char(151),char(149),char(166), +char(156),char(194),char(149),char(134),char(1),char(58),char(125),char(142),char(118),char(159), +char(143),char(119),char(145),char(5),char(203),char(186),char(164),char(108),char(178),char(73), +char(85),char(187),char(123),char(182),char(217),char(205),char(188),char(251),char(140),char(78), +char(181),char(112),char(159),char(189),char(251),char(166),char(120),char(134),char(140),char(122), +char(97),char(151),char(71),char(64),char(155),char(3),char(103),char(120),char(100),char(92), +char(132),char(66),char(60),char(138),char(92),char(101),char(119),char(0),char(0),char(2), +char(0),char(106),char(255),char(236),char(4),char(37),char(5),char(203),char(0),char(23), +char(0),char(37),char(0),char(65),char(64),char(34),char(27),char(17),char(34),char(10), +char(10),char(0),char(0),char(4),char(17),char(3),char(38),char(39),char(14),char(30), +char(77),char(89),char(11),char(20),char(14),char(14),char(2),char(20),char(20),char(24), +char(75),char(89),char(20),char(7),char(2),char(7),char(77),char(89),char(2),char(25), +char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0), +char(57),char(24),char(47),char(18),char(57),char(43),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(16),char(33),char(34),char(39),char(53),char(22),char(51),char(50),char(18),char(19), +char(35),char(6),char(6),char(35),char(34),char(38),char(53),char(52),char(18),char(51), +char(50),char(22),char(18),char(1),char(34),char(6),char(21),char(20),char(22),char(51), +char(50),char(54),char(54),char(53),char(52),char(38),char(38),char(4),char(37),char(253), +char(104),char(116),char(68),char(80),char(102),char(240),char(245),char(11),char(12),char(55), +char(182),char(114),char(194),char(228),char(255),char(208),char(149),char(223),char(120),char(254), +char(20),char(143),char(156),char(144),char(147),char(91),char(153),char(88),char(82),char(147), +char(3),char(70),char(252),char(166),char(20),char(143),char(26),char(1),char(41),char(1), +char(51),char(83),char(87),char(232),char(208),char(228),char(1),char(8),char(153),char(254), +char(219),char(1),char(48),char(184),char(164),char(144),char(165),char(74),char(128),char(70), +char(105),char(178),char(102),char(0),char(0),char(2),char(0),char(152),char(255),char(227), +char(1),char(137),char(4),char(100),char(0),char(11),char(0),char(21),char(0),char(40), +char(64),char(20),char(16),char(6),char(6),char(12),char(0),char(0),char(22),char(23), +char(14),char(19),char(79),char(89),char(14),char(16),char(9),char(3),char(79),char(89), +char(9),char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(1),char(57),char(17),char(51),char(51),char(17),char(51),char(49),char(48), +char(55),char(52),char(54),char(51),char(50),char(22),char(21),char(20),char(6),char(35), +char(34),char(38),char(17),char(52),char(51),char(50),char(21),char(20),char(6),char(35), +char(34),char(38),char(152),char(61),char(57),char(58),char(65),char(66),char(57),char(51), +char(67),char(118),char(123),char(66),char(57),char(51),char(67),char(106),char(67),char(69), +char(69),char(67),char(65),char(70),char(63),char(3),char(187),char(135),char(135),char(65), +char(70),char(63),char(0),char(2),char(0),char(63),char(254),char(248),char(1),char(133), +char(4),char(100),char(0),char(8),char(0),char(18),char(0),char(34),char(64),char(16), +char(1),char(13),char(13),char(5),char(9),char(9),char(20),char(19),char(11),char(16), +char(79),char(89),char(11),char(16),char(5),char(0),char(0),char(47),char(205),char(63), +char(43),char(17),char(18),char(1),char(57),char(17),char(51),char(51),char(17),char(51), +char(49),char(48),char(37),char(23),char(6),char(2),char(7),char(35),char(54),char(18), +char(55),char(3),char(52),char(51),char(50),char(21),char(20),char(6),char(35),char(34), +char(38),char(1),char(94),char(15),char(26),char(98),char(53),char(125),char(27),char(65), +char(13),char(21),char(119),char(123),char(66),char(57),char(58),char(61),char(238),char(23), +char(100),char(254),char(247),char(114),char(104),char(1),char(50),char(92),char(2),char(239), +char(135),char(135),char(65),char(70),char(70),char(0),char(0),char(1),char(0),char(104), +char(0),char(242),char(4),char(41),char(4),char(217),char(0),char(6),char(0),char(21), +char(64),char(9),char(4),char(0),char(5),char(1),char(4),char(7),char(8),char(3), +char(0),char(0),char(47),char(47),char(17),char(18),char(1),char(23),char(57),char(49), +char(48),char(37),char(1),char(53),char(1),char(21),char(1),char(1),char(4),char(41), +char(252),char(63),char(3),char(193),char(252),char(242),char(3),char(14),char(242),char(1), +char(166),char(98),char(1),char(223),char(149),char(254),char(141),char(254),char(184),char(0), +char(0),char(2),char(0),char(119),char(1),char(193),char(4),char(25),char(3),char(227), +char(0),char(3),char(0),char(7),char(0),char(42),char(64),char(21),char(7),char(2), +char(4),char(0),char(2),char(0),char(9),char(8),char(4),char(5),char(80),char(89), +char(4),char(1),char(0),char(80),char(89),char(15),char(1),char(1),char(1),char(0), +char(47),char(93),char(43),char(0),char(24),char(47),char(43),char(17),char(18),char(1), +char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(19),char(53), +char(33),char(21),char(1),char(53),char(33),char(21),char(119),char(3),char(162),char(252), +char(94),char(3),char(162),char(3),char(90),char(137),char(137),char(254),char(103),char(137), +char(137),char(0),char(0),char(1),char(0),char(104),char(0),char(242),char(4),char(41), +char(4),char(217),char(0),char(6),char(0),char(21),char(64),char(9),char(5),char(1), +char(2),char(0),char(4),char(7),char(8),char(6),char(3),char(0),char(47),char(47), +char(17),char(18),char(1),char(23),char(57),char(49),char(48),char(19),char(1),char(1), +char(53),char(1),char(21),char(1),char(104),char(3),char(15),char(252),char(241),char(3), +char(193),char(252),char(63),char(1),char(137),char(1),char(70),char(1),char(117),char(149), +char(254),char(33),char(98),char(254),char(90),char(0),char(0),char(2),char(0),char(27), +char(255),char(227),char(3),char(57),char(5),char(203),char(0),char(27),char(0),char(38), +char(0),char(57),char(64),char(29),char(33),char(28),char(27),char(0),char(7),char(19), +char(19),char(0),char(28),char(14),char(4),char(39),char(40),char(0),char(0),char(36), +char(16),char(36),char(30),char(79),char(89),char(36),char(22),char(16),char(10),char(73), +char(89),char(16),char(4),char(0),char(63),char(43),char(0),char(24),char(63),char(43), +char(17),char(18),char(0),char(57),char(24),char(47),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(53),char(52),char(54),char(55),char(54),char(54),char(53),char(52),char(38),char(35), +char(34),char(6),char(7),char(39),char(54),char(51),char(50),char(22),char(21),char(20), +char(6),char(6),char(7),char(6),char(6),char(21),char(21),char(3),char(52),char(51), +char(50),char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(1),char(33), +char(72),char(98),char(136),char(71),char(131),char(123),char(79),char(150),char(97),char(59), +char(189),char(206),char(191),char(212),char(39),char(76),char(126),char(101),char(65),char(178), +char(120),char(58),char(63),char(64),char(57),char(52),char(68),char(1),char(147),char(54), +char(117),char(151),char(84),char(115),char(116),char(82),char(102),char(111),char(37),char(49), +char(135),char(99),char(188),char(171),char(73),char(111),char(99),char(110),char(86),char(114), +char(95),char(33),char(254),char(215),char(136),char(70),char(66),char(64),char(71),char(63), +char(0),char(2),char(0),char(121),char(255),char(70),char(6),char(184),char(5),char(180), +char(0),char(53),char(0),char(63),char(0),char(69),char(64),char(34),char(35),char(46), +char(54),char(14),char(59),char(7),char(20),char(27),char(0),char(0),char(41),char(20), +char(14),char(46),char(5),char(64),char(65),char(24),char(56),char(56),char(4),char(61), +char(8),char(17),char(11),char(17),char(11),char(17),char(43),char(31),char(50),char(3), +char(38),char(43),char(0),char(47),char(51),char(63),char(51),char(18),char(57),char(57), +char(47),char(47),char(18),char(57),char(50),char(51),char(51),char(17),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(20),char(6),char(6),char(35), +char(34),char(38),char(39),char(35),char(6),char(6),char(35),char(34),char(38),char(53), +char(52),char(54),char(51),char(50),char(22),char(23),char(3),char(21),char(20),char(51), +char(50),char(54),char(53),char(52),char(2),char(36),char(35),char(34),char(4),char(2), +char(21),char(16),char(0),char(33),char(50),char(55),char(21),char(6),char(35),char(32), +char(0),char(17),char(16),char(18),char(36),char(33),char(50),char(4),char(18),char(1), +char(20),char(51),char(50),char(19),char(19),char(38),char(35),char(34),char(6),char(6), +char(184),char(88),char(160),char(104),char(86),char(118),char(11),char(8),char(40),char(149), +char(102),char(150),char(169),char(236),char(192),char(68),char(172),char(69),char(25),char(133), +char(91),char(114),char(148),char(254),char(239),char(177),char(223),char(254),char(182),char(174), +char(1),char(66),char(1),char(47),char(210),char(226),char(192),char(244),char(254),char(149), +char(254),char(111),char(214),char(1),char(140),char(1),char(0),char(215),char(1),char(79), +char(183),char(251),char(246),char(195),char(207),char(18),char(14),char(72),char(85),char(130), +char(147),char(2),char(217),char(142),char(236),char(130),char(104),char(81),char(87),char(98), +char(205),char(176),char(204),char(255),char(25),char(22),char(254),char(42),char(22),char(178), +char(215),char(172),char(181),char(1),char(16),char(147),char(185),char(254),char(169),char(225), +char(254),char(207),char(254),char(184),char(86),char(133),char(84),char(1),char(143),char(1), +char(102),char(1),char(4),char(1),char(150),char(223),char(181),char(254),char(179),char(254), +char(164),char(254),char(1),char(57),char(1),char(5),char(20),char(180),char(0),char(2), +char(0),char(0),char(0),char(0),char(5),char(16),char(5),char(188),char(0),char(7), +char(0),char(14),char(0),char(57),char(64),char(30),char(2),char(14),char(11),char(8), +char(1),char(5),char(0),char(3),char(0),char(7),char(3),char(4),char(7),char(4), +char(16),char(15),char(14),char(2),char(73),char(89),char(11),char(5),char(14),char(14), +char(4),char(5),char(3),char(0),char(4),char(18),char(0),char(63),char(51),char(63), +char(18),char(57),char(47),char(18),char(57),char(43),char(17),char(18),char(1),char(57), +char(57),char(17),char(51),char(17),char(51),char(17),char(18),char(23),char(57),char(49), +char(48),char(33),char(3),char(33),char(3),char(35),char(1),char(51),char(1),char(1), +char(3),char(38),char(39),char(6),char(7),char(3),char(4),char(96),char(182),char(253), +char(182),char(180),char(172),char(2),char(66),char(143),char(2),char(63),char(254),char(101), +char(170),char(33),char(35),char(22),char(41),char(172),char(1),char(209),char(254),char(47), +char(5),char(188),char(250),char(68),char(2),char(106),char(1),char(197),char(86),char(125), +char(96),char(115),char(254),char(59),char(0),char(3),char(0),char(201),char(0),char(0), +char(4),char(190),char(5),char(182),char(0),char(14),char(0),char(23),char(0),char(32), +char(0),char(73),char(64),char(38),char(19),char(4),char(29),char(10),char(15),char(25), +char(25),char(14),char(10),char(4),char(7),char(14),char(4),char(33),char(34),char(8), +char(15),char(24),char(15),char(24),char(74),char(89),char(15),char(15),char(14),char(0), +char(14),char(25),char(74),char(89),char(14),char(18),char(0),char(23),char(74),char(89), +char(0),char(3),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18),char(0),char(57), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(19),char(33),char(32),char(4),char(21), +char(20),char(6),char(7),char(21),char(4),char(17),char(20),char(4),char(35),char(33), +char(19),char(33),char(50),char(54),char(53),char(52),char(38),char(35),char(35),char(17), +char(17),char(33),char(50),char(54),char(53),char(52),char(38),char(35),char(201),char(1), +char(157),char(1),char(35),char(1),char(4),char(145),char(139),char(1),char(77),char(254), +char(247),char(238),char(254),char(2),char(170),char(1),char(24),char(180),char(158),char(176), +char(192),char(250),char(1),char(49),char(177),char(179),char(183),char(187),char(5),char(182), +char(174),char(188),char(130),char(169),char(25),char(10),char(57),char(254),char(219),char(196), +char(220),char(3),char(68),char(113),char(134),char(123),char(109),char(253),char(145),char(253), +char(221),char(137),char(146),char(136),char(128),char(0),char(0),char(1),char(0),char(125), +char(255),char(236),char(4),char(207),char(5),char(203),char(0),char(22),char(0),char(38), +char(64),char(20),char(3),char(14),char(20),char(9),char(14),char(3),char(23),char(24), +char(18),char(0),char(73),char(89),char(18),char(4),char(11),char(6),char(73),char(89), +char(11),char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(34), +char(0),char(17),char(16),char(0),char(51),char(50),char(55),char(21),char(6),char(35), +char(32),char(0),char(17),char(52),char(18),char(36),char(51),char(50),char(23),char(7), +char(38),char(3),char(59),char(241),char(254),char(233),char(1),char(13),char(249),char(153), +char(196),char(152),char(223),char(254),char(189),char(254),char(161),char(169),char(1),char(63), +char(216),char(230),char(172),char(72),char(166),char(5),char(51),char(254),char(191),char(254), +char(233),char(254),char(225),char(254),char(199),char(55),char(149),char(57),char(1),char(136), +char(1),char(105),char(226),char(1),char(84),char(184),char(84),char(146),char(78),char(0), +char(0),char(2),char(0),char(201),char(0),char(0),char(5),char(88),char(5),char(182), +char(0),char(8),char(0),char(17),char(0),char(40),char(64),char(20),char(14),char(4), +char(9),char(0),char(4),char(0),char(18),char(19),char(5),char(13),char(74),char(89), +char(5),char(3),char(4),char(14),char(74),char(89),char(4),char(18),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(1),char(57),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(0),char(33), +char(33),char(17),char(33),char(32),char(0),char(3),char(16),char(0),char(33),char(35), +char(17),char(51),char(32),char(0),char(5),char(88),char(254),char(119),char(254),char(143), +char(254),char(107),char(1),char(192),char(1),char(85),char(1),char(122),char(180),char(254), +char(225),char(254),char(229),char(247),char(207),char(1),char(48),char(1),char(50),char(2), +char(233),char(254),char(150),char(254),char(129),char(5),char(182),char(254),char(134),char(254), +char(167),char(1),char(30),char(1),char(34),char(251),char(112),char(1),char(43),char(0), +char(0),char(1),char(0),char(201),char(0),char(0),char(3),char(248),char(5),char(182), +char(0),char(11),char(0),char(58),char(64),char(31),char(6),char(10),char(10),char(1), +char(4),char(0),char(8),char(1),char(4),char(12),char(13),char(6),char(9),char(73), +char(89),char(6),char(6),char(1),char(2),char(2),char(5),char(73),char(89),char(2), +char(3),char(1),char(10),char(73),char(89),char(1),char(18),char(0),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(33),char(33),char(17),char(33),char(21),char(33),char(17),char(33), +char(21),char(33),char(17),char(33),char(3),char(248),char(252),char(209),char(3),char(47), +char(253),char(123),char(2),char(94),char(253),char(162),char(2),char(133),char(5),char(182), +char(151),char(254),char(41),char(150),char(253),char(230),char(0),char(1),char(0),char(201), +char(0),char(0),char(3),char(248),char(5),char(182),char(0),char(9),char(0),char(50), +char(64),char(26),char(6),char(0),char(0),char(1),char(3),char(8),char(1),char(3), +char(10),char(11),char(6),char(9),char(73),char(89),char(6),char(6),char(1),char(2), +char(2),char(5),char(73),char(89),char(2),char(3),char(1),char(18),char(0),char(63), +char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(33),char(35),char(17),char(33),char(21),char(33),char(17),char(33),char(21),char(33), +char(1),char(115),char(170),char(3),char(47),char(253),char(123),char(2),char(94),char(253), +char(162),char(5),char(182),char(151),char(253),char(233),char(151),char(0),char(0),char(1), +char(0),char(125),char(255),char(236),char(5),char(61),char(5),char(203),char(0),char(27), +char(0),char(58),char(64),char(31),char(20),char(8),char(25),char(2),char(2),char(14), +char(27),char(8),char(4),char(28),char(29),char(0),char(27),char(73),char(89),char(0), +char(0),char(5),char(12),char(12),char(17),char(73),char(89),char(12),char(4),char(5), +char(23),char(73),char(89),char(5),char(19),char(0),char(63),char(43),char(0),char(24), +char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(33),char(17),char(6),char(6),char(35),char(32),char(0),char(17),char(52), +char(18),char(36),char(51),char(50),char(23),char(7),char(38),char(35),char(32),char(0), +char(17),char(16),char(0),char(33),char(50),char(55),char(17),char(33),char(3),char(76), +char(1),char(241),char(116),char(240),char(158),char(254),char(180),char(254),char(142),char(183), +char(1),char(88),char(231),char(234),char(202),char(66),char(198),char(183),char(254),char(245), +char(254),char(212),char(1),char(33),char(1),char(24),char(152),char(145),char(254),char(185), +char(2),char(254),char(253),char(57),char(37),char(38),char(1),char(139),char(1),char(100), +char(228),char(1),char(87),char(181),char(86),char(150),char(84),char(254),char(194),char(254), +char(230),char(254),char(216),char(254),char(206),char(35),char(1),char(194),char(0),char(1), +char(0),char(201),char(0),char(0),char(5),char(31),char(5),char(182),char(0),char(11), +char(0),char(51),char(64),char(25),char(9),char(1),char(1),char(0),char(8),char(4), +char(4),char(5),char(0),char(5),char(13),char(12),char(8),char(3),char(73),char(89), +char(8),char(8),char(5),char(10),char(6),char(3),char(1),char(5),char(18),char(0), +char(63),char(51),char(63),char(51),char(18),char(57),char(47),char(43),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(33),char(35),char(17),char(33),char(17),char(35),char(17), +char(51),char(17),char(33),char(17),char(51),char(5),char(31),char(170),char(252),char(254), +char(170),char(170),char(3),char(2),char(170),char(2),char(176),char(253),char(80),char(5), +char(182),char(253),char(146),char(2),char(110),char(0),char(0),char(1),char(0),char(84), +char(0),char(0),char(2),char(86),char(5),char(182),char(0),char(11),char(0),char(55), +char(64),char(28),char(5),char(1),char(10),char(3),char(8),char(0),char(0),char(3), +char(1),char(3),char(12),char(13),char(9),char(4),char(6),char(4),char(74),char(89), +char(6),char(3),char(10),char(3),char(1),char(3),char(74),char(89),char(1),char(18), +char(0),char(63),char(43),char(17),char(0),char(51),char(24),char(63),char(43),char(17), +char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(33),char(33),char(53),char(55),char(17), +char(39),char(53),char(33),char(21),char(7),char(17),char(23),char(2),char(86),char(253), +char(254),char(172),char(172),char(2),char(2),char(172),char(172),char(98),char(35),char(4), +char(170),char(37),char(98),char(98),char(37),char(251),char(86),char(35),char(0),char(1), +char(255),char(96),char(254),char(127),char(1),char(104),char(5),char(182),char(0),char(13), +char(0),char(29),char(64),char(13),char(11),char(8),char(8),char(14),char(15),char(9), +char(3),char(0),char(5),char(73),char(89),char(0),char(34),char(0),char(63),char(43), +char(0),char(24),char(63),char(17),char(18),char(1),char(57),char(17),char(51),char(49), +char(48),char(3),char(34),char(39),char(53),char(22),char(51),char(50),char(54),char(53), +char(17),char(51),char(17),char(20),char(6),char(12),char(94),char(54),char(71),char(77), +char(99),char(103),char(170),char(192),char(254),char(127),char(27),char(145),char(20),char(120), +char(113),char(5),char(182),char(250),char(88),char(190),char(209),char(0),char(0),char(1), +char(0),char(201),char(0),char(0),char(4),char(233),char(5),char(182),char(0),char(11), +char(0),char(42),char(64),char(21),char(8),char(4),char(4),char(5),char(5),char(2), +char(11),char(10),char(0),char(5),char(13),char(12),char(2),char(8),char(5),char(9), +char(6),char(3),char(1),char(5),char(18),char(0),char(63),char(51),char(63),char(51), +char(18),char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(33),char(35),char(1),char(7),char(17),char(35), +char(17),char(51),char(17),char(1),char(51),char(1),char(4),char(233),char(200),char(253), +char(235),char(153),char(170),char(170),char(2),char(151),char(201),char(253),char(180),char(2), +char(197),char(136),char(253),char(195),char(5),char(182),char(253),char(43),char(2),char(213), +char(253),char(133),char(0),char(1),char(0),char(201),char(0),char(0),char(3),char(248), +char(5),char(182),char(0),char(5),char(0),char(31),char(64),char(14),char(3),char(0), +char(0),char(4),char(6),char(7),char(1),char(3),char(0),char(3),char(73),char(89), +char(0),char(18),char(0),char(63),char(43),char(0),char(24),char(63),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(49),char(48),char(51),char(17),char(51), +char(17),char(33),char(21),char(201),char(170),char(2),char(133),char(5),char(182),char(250), +char(228),char(154),char(0),char(1),char(0),char(201),char(0),char(0),char(6),char(113), +char(5),char(182),char(0),char(19),char(0),char(50),char(64),char(24),char(8),char(5), +char(5),char(6),char(11),char(14),char(14),char(13),char(6),char(13),char(20),char(21), +char(1),char(10),char(17),char(3),char(6),char(11),char(7),char(3),char(14),char(0), +char(6),char(18),char(0),char(63),char(51),char(51),char(63),char(51),char(18),char(23), +char(57),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(1),char(35),char(22), +char(21),char(17),char(35),char(17),char(33),char(1),char(51),char(1),char(51),char(17), +char(35),char(17),char(52),char(55),char(35),char(1),char(3),char(80),char(254),char(16), +char(8),char(14),char(157),char(1),char(0),char(1),char(207),char(8),char(1),char(211), +char(254),char(170),char(14),char(8),char(254),char(12),char(5),char(16),char(154),char(212), +char(252),char(94),char(5),char(182),char(251),char(74),char(4),char(182),char(250),char(74), +char(3),char(174),char(162),char(190),char(250),char(242),char(0),char(1),char(0),char(201), +char(0),char(0),char(5),char(63),char(5),char(182),char(0),char(16),char(0),char(46), +char(64),char(21),char(9),char(6),char(6),char(7),char(1),char(15),char(15),char(0), +char(7),char(0),char(17),char(18),char(11),char(3),char(7),char(15),char(8),char(3), +char(1),char(7),char(18),char(0),char(63),char(51),char(63),char(51),char(18),char(57), +char(57),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(35),char(1),char(35), +char(22),char(21),char(17),char(35),char(17),char(51),char(1),char(51),char(38),char(2), +char(55),char(17),char(51),char(5),char(63),char(194),char(252),char(225),char(8),char(16), +char(157),char(192),char(3),char(29),char(8),char(2),char(14),char(2),char(159),char(4), +char(203),char(216),char(180),char(252),char(193),char(5),char(182),char(251),char(58),char(27), +char(1),char(37),char(63),char(3),char(71),char(0),char(0),char(2),char(0),char(125), +char(255),char(236),char(5),char(190),char(5),char(205),char(0),char(11),char(0),char(23), +char(0),char(40),char(64),char(20),char(18),char(0),char(12),char(6),char(0),char(6), +char(25),char(24),char(9),char(21),char(73),char(89),char(9),char(4),char(3),char(15), +char(73),char(89),char(3),char(19),char(0),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(16),char(0),char(33),char(32),char(0),char(17),char(16), +char(0),char(33),char(32),char(0),char(1),char(16),char(18),char(51),char(50),char(18), +char(17),char(16),char(2),char(35),char(34),char(2),char(5),char(190),char(254),char(157), +char(254),char(196),char(254),char(189),char(254),char(161),char(1),char(96),char(1),char(68), +char(1),char(59),char(1),char(98),char(251),char(115),char(253),char(241),char(243),char(248), +char(247),char(242),char(243),char(253),char(2),char(221),char(254),char(161),char(254),char(110), +char(1),char(139),char(1),char(104),char(1),char(101),char(1),char(137),char(254),char(112), +char(254),char(160),char(254),char(215),char(254),char(205),char(1),char(50),char(1),char(42), +char(1),char(39),char(1),char(49),char(254),char(205),char(0),char(2),char(0),char(201), +char(0),char(0),char(4),char(104),char(5),char(182),char(0),char(9),char(0),char(18), +char(0),char(52),char(64),char(26),char(10),char(5),char(5),char(6),char(14),char(0), +char(6),char(0),char(19),char(20),char(10),char(4),char(74),char(89),char(10),char(10), +char(6),char(7),char(7),char(18),char(74),char(89),char(7),char(3),char(6),char(18), +char(0),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(20),char(4),char(33),char(35),char(17), +char(35),char(17),char(33),char(32),char(1),char(51),char(50),char(54),char(53),char(52), +char(38),char(35),char(35),char(4),char(104),char(254),char(209),char(254),char(230),char(172), +char(170),char(1),char(123),char(2),char(36),char(253),char(11),char(153),char(226),char(202), +char(190),char(201),char(190),char(4),char(12),char(222),char(239),char(253),char(193),char(5), +char(182),char(253),char(27),char(146),char(161),char(145),char(142),char(0),char(0),char(2), +char(0),char(125),char(254),char(164),char(5),char(190),char(5),char(205),char(0),char(15), +char(0),char(27),char(0),char(52),char(64),char(27),char(16),char(10),char(22),char(0), +char(0),char(4),char(3),char(10),char(4),char(28),char(29),char(3),char(13),char(7), +char(13),char(25),char(73),char(89),char(13),char(4),char(7),char(19),char(73),char(89), +char(5),char(7),char(19),char(0),char(63),char(198),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(2),char(7), +char(1),char(35),char(1),char(7),char(32),char(0),char(17),char(16),char(0),char(33), +char(32),char(0),char(1),char(16),char(18),char(51),char(50),char(18),char(17),char(16), +char(2),char(35),char(34),char(2),char(5),char(190),char(226),char(206),char(1),char(92), +char(247),char(254),char(227),char(55),char(254),char(189),char(254),char(161),char(1),char(96), +char(1),char(68),char(1),char(59),char(1),char(98),char(251),char(115),char(253),char(241), +char(243),char(248),char(247),char(242),char(243),char(253),char(2),char(221),char(254),char(231), +char(254),char(140),char(66),char(254),char(150),char(1),char(74),char(2),char(1),char(139), +char(1),char(104),char(1),char(101),char(1),char(137),char(254),char(112),char(254),char(160), +char(254),char(215),char(254),char(205),char(1),char(50),char(1),char(42),char(1),char(39), +char(1),char(49),char(254),char(205),char(0),char(2),char(0),char(201),char(0),char(0), +char(4),char(207),char(5),char(182),char(0),char(12),char(0),char(21),char(0),char(72), +char(64),char(37),char(13),char(1),char(1),char(2),char(12),char(9),char(17),char(7), +char(11),char(10),char(10),char(7),char(9),char(2),char(4),char(22),char(23),char(9), +char(13),char(0),char(13),char(0),char(74),char(89),char(13),char(13),char(2),char(3), +char(3),char(21),char(73),char(89),char(3),char(3),char(11),char(2),char(18),char(0), +char(63),char(51),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(0),char(57),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(17),char(35),char(17),char(33),char(32),char(4),char(21), +char(16),char(5),char(1),char(35),char(1),char(37),char(51),char(50),char(54),char(53), +char(52),char(38),char(35),char(35),char(1),char(115),char(170),char(1),char(145),char(1), +char(13),char(1),char(1),char(254),char(218),char(1),char(141),char(201),char(254),char(158), +char(254),char(207),char(233),char(180),char(168),char(171),char(189),char(221),char(2),char(96), +char(253),char(160),char(5),char(182),char(206),char(207),char(254),char(222),char(102),char(253), +char(111),char(2),char(96),char(146),char(143),char(143),char(145),char(128),char(0),char(1), +char(0),char(106),char(255),char(236),char(4),char(2),char(5),char(203),char(0),char(36), +char(0),char(52),char(64),char(27),char(30),char(19),char(12),char(0),char(0),char(24), +char(19),char(5),char(4),char(37),char(38),char(12),char(30),char(3),char(22),char(22), +char(27),char(73),char(89),char(22),char(4),char(3),char(9),char(73),char(89),char(3), +char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18), +char(0),char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(20),char(4),char(35),char(32),char(39), +char(53),char(22),char(22),char(51),char(50),char(54),char(53),char(52),char(38),char(38), +char(39),char(38),char(38),char(53),char(52),char(54),char(51),char(50),char(23),char(7), +char(38),char(35),char(34),char(6),char(21),char(20),char(22),char(22),char(23),char(22), +char(22),char(4),char(2),char(254),char(232),char(240),char(254),char(252),char(140),char(90), +char(212),char(104),char(170),char(172),char(61),char(143),char(146),char(204),char(175),char(254), +char(209),char(218),char(183),char(53),char(181),char(171),char(135),char(152),char(56),char(133), +char(137),char(230),char(173),char(1),char(133),char(193),char(216),char(67),char(164),char(38), +char(44),char(129),char(115),char(76),char(97),char(82),char(52),char(73),char(200),char(161), +char(169),char(200),char(80),char(148),char(76),char(116),char(103),char(76),char(97),char(81), +char(49),char(82),char(188),char(0),char(0),char(1),char(0),char(18),char(0),char(0), +char(4),char(90),char(5),char(182),char(0),char(7),char(0),char(36),char(64),char(18), +char(0),char(1),char(5),char(1),char(3),char(3),char(8),char(9),char(7),char(3), +char(4),char(3),char(73),char(89),char(4),char(3),char(1),char(18),char(0),char(63), +char(63),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(49),char(48),char(33),char(35),char(17),char(33),char(53),char(33), +char(21),char(33),char(2),char(139),char(170),char(254),char(49),char(4),char(72),char(254), +char(49),char(5),char(31),char(151),char(151),char(0),char(0),char(1),char(0),char(186), +char(255),char(236),char(5),char(25),char(5),char(182),char(0),char(17),char(0),char(37), +char(64),char(17),char(16),char(1),char(10),char(7),char(1),char(7),char(19),char(18), +char(17),char(8),char(3),char(4),char(13),char(73),char(89),char(4),char(19),char(0), +char(63),char(43),char(0),char(24),char(63),char(51),char(17),char(18),char(1),char(57), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(20), +char(0),char(33),char(32),char(0),char(53),char(17),char(51),char(17),char(20),char(22), +char(51),char(50),char(54),char(53),char(17),char(5),char(25),char(254),char(210),char(254), +char(248),char(254),char(248),char(254),char(223),char(170),char(200),char(194),char(185),char(200), +char(5),char(182),char(252),char(78),char(250),char(254),char(226),char(1),char(32),char(252), +char(3),char(174),char(252),char(70),char(183),char(196),char(197),char(184),char(3),char(184), +char(0),char(1),char(0),char(0),char(0),char(0),char(4),char(195),char(5),char(182), +char(0),char(10),char(0),char(26),char(64),char(11),char(1),char(4),char(12),char(11), +char(8),char(3),char(0),char(4),char(3),char(3),char(18),char(0),char(63),char(63), +char(51),char(18),char(57),char(17),char(18),char(1),char(57),char(57),char(49),char(48), +char(1),char(51),char(1),char(35),char(1),char(51),char(1),char(22),char(23),char(54), +char(55),char(4),char(12),char(183),char(253),char(241),char(168),char(253),char(244),char(180), +char(1),char(80),char(58),char(34),char(36),char(58),char(5),char(182),char(250),char(74), +char(5),char(182),char(252),char(78),char(163),char(154),char(162),char(161),char(0),char(1), +char(0),char(27),char(0),char(0),char(7),char(76),char(5),char(182),char(0),char(25), +char(0),char(36),char(64),char(16),char(25),char(10),char(27),char(26),char(21),char(14), +char(14),char(5),char(9),char(24),char(17),char(10),char(3),char(1),char(9),char(18), +char(0),char(63),char(51),char(63),char(51),char(51),char(18),char(57),char(57),char(17), +char(51),char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(33),char(35), +char(1),char(38),char(38),char(39),char(6),char(7),char(1),char(35),char(1),char(51), +char(19),char(22),char(23),char(54),char(55),char(1),char(51),char(1),char(22),char(23), +char(54),char(55),char(19),char(51),char(5),char(197),char(168),char(254),char(217),char(21), +char(52),char(1),char(22),char(48),char(254),char(226),char(168),char(254),char(123),char(180), +char(231),char(48),char(22),char(27),char(53),char(1),char(6),char(180),char(1),char(19), +char(48),char(33),char(19),char(53),char(230),char(180),char(3),char(211),char(65),char(198), +char(20),char(132),char(157),char(252),char(51),char(5),char(182),char(252),char(121),char(190), +char(154),char(183),char(175),char(3),char(121),char(252),char(127),char(155),char(195),char(142), +char(204),char(3),char(133),char(0),char(0),char(1),char(0),char(8),char(0),char(0), +char(4),char(150),char(5),char(182),char(0),char(11),char(0),char(35),char(64),char(18), +char(4),char(6),char(5),char(11),char(10),char(0),char(6),char(13),char(12),char(2), +char(8),char(4),char(9),char(6),char(3),char(1),char(4),char(18),char(0),char(63), +char(51),char(63),char(51),char(18),char(57),char(57),char(17),char(18),char(1),char(23), +char(57),char(49),char(48),char(33),char(35),char(1),char(1),char(35),char(1),char(1), +char(51),char(1),char(1),char(51),char(1),char(4),char(150),char(193),char(254),char(119), +char(254),char(112),char(180),char(1),char(230),char(254),char(59),char(188),char(1),char(107), +char(1),char(110),char(181),char(254),char(59),char(2),char(131),char(253),char(125),char(2), +char(252),char(2),char(186),char(253),char(189),char(2),char(67),char(253),char(76),char(0), +char(0),char(1),char(0),char(0),char(0),char(0),char(4),char(123),char(5),char(182), +char(0),char(8),char(0),char(32),char(64),char(15),char(4),char(5),char(2),char(5), +char(7),char(3),char(9),char(10),char(0),char(5),char(1),char(7),char(3),char(5), +char(18),char(0),char(63),char(63),char(51),char(18),char(57),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(1),char(51),char(1), +char(17),char(35),char(17),char(1),char(51),char(2),char(61),char(1),char(134),char(184), +char(254),char(24),char(172),char(254),char(25),char(186),char(2),char(219),char(2),char(219), +char(252),char(129),char(253),char(201),char(2),char(47),char(3),char(135),char(0),char(1), +char(0),char(82),char(0),char(0),char(4),char(63),char(5),char(182),char(0),char(9), +char(0),char(43),char(64),char(23),char(8),char(1),char(3),char(7),char(0),char(7), +char(4),char(1),char(4),char(10),char(11),char(5),char(4),char(73),char(89),char(5), +char(3),char(1),char(8),char(73),char(89),char(1),char(18),char(0),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(49),char(48),char(33),char(33),char(53),char(1),char(33), +char(53),char(33),char(21),char(1),char(33),char(4),char(63),char(252),char(19),char(3), +char(8),char(253),char(16),char(3),char(191),char(252),char(248),char(3),char(30),char(133), +char(4),char(152),char(153),char(133),char(251),char(105),char(0),char(1),char(0),char(166), +char(254),char(188),char(2),char(111),char(5),char(182),char(0),char(7),char(0),char(32), +char(64),char(14),char(6),char(1),char(4),char(0),char(1),char(0),char(8),char(9), +char(5),char(2),char(3),char(6),char(1),char(39),char(0),char(63),char(51),char(63), +char(51),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(33),char(17),char(33),char(21),char(33),char(17),char(33), +char(2),char(111),char(254),char(55),char(1),char(201),char(254),char(223),char(1),char(33), +char(254),char(188),char(6),char(250),char(141),char(250),char(33),char(0),char(0),char(1), +char(0),char(23),char(0),char(0),char(2),char(221),char(5),char(182),char(0),char(3), +char(0),char(19),char(183),char(3),char(1),char(4),char(5),char(3),char(3),char(2), +char(18),char(0),char(63),char(63),char(17),char(18),char(1),char(57),char(57),char(49), +char(48),char(19),char(1),char(35),char(1),char(186),char(2),char(35),char(166),char(253), +char(224),char(5),char(182),char(250),char(74),char(5),char(182),char(0),char(0),char(1), +char(0),char(51),char(254),char(188),char(1),char(252),char(5),char(182),char(0),char(7), +char(0),char(32),char(64),char(14),char(3),char(0),char(1),char(6),char(0),char(6), +char(8),char(9),char(0),char(7),char(39),char(3),char(4),char(3),char(0),char(63), +char(51),char(63),char(51),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(23),char(33),char(17),char(33),char(53),char(33), +char(17),char(33),char(51),char(1),char(33),char(254),char(223),char(1),char(201),char(254), +char(55),char(182),char(5),char(223),char(141),char(249),char(6),char(0),char(0),char(1), +char(0),char(49),char(2),char(39),char(4),char(35),char(5),char(193),char(0),char(6), +char(0),char(24),char(64),char(9),char(0),char(3),char(7),char(8),char(5),char(2), +char(0),char(4),char(2),char(0),char(47),char(47),char(51),char(18),char(57),char(17), +char(18),char(1),char(57),char(57),char(49),char(48),char(19),char(1),char(51),char(1), +char(35),char(1),char(1),char(49),char(1),char(178),char(99),char(1),char(221),char(152), +char(254),char(140),char(254),char(178),char(2),char(39),char(3),char(154),char(252),char(102), +char(2),char(233),char(253),char(23),char(0),char(1),char(255),char(252),char(254),char(197), +char(3),char(154),char(255),char(72),char(0),char(3),char(0),char(17),char(181),char(0), +char(5),char(1),char(4),char(1),char(2),char(0),char(47),char(51),char(17),char(1), +char(51),char(17),char(51),char(49),char(48),char(1),char(33),char(53),char(33),char(3), +char(154),char(252),char(98),char(3),char(158),char(254),char(197),char(131),char(0),char(1), +char(1),char(137),char(4),char(217),char(3),char(18),char(6),char(33),char(0),char(9), +char(0),char(19),char(182),char(0),char(4),char(11),char(10),char(6),char(128),char(1), +char(0),char(47),char(26),char(205),char(17),char(18),char(1),char(57),char(57),char(49), +char(48),char(1),char(35),char(38),char(38),char(39),char(53),char(51),char(22),char(22), +char(23),char(3),char(18),char(110),char(65),char(178),char(40),char(203),char(32),char(114), +char(44),char(4),char(217),char(52),char(192),char(63),char(21),char(69),char(181),char(53), +char(0),char(2),char(0),char(94),char(255),char(236),char(3),char(205),char(4),char(90), +char(0),char(25),char(0),char(36),char(0),char(71),char(64),char(37),char(34),char(8), +char(11),char(30),char(30),char(25),char(25),char(18),char(8),char(3),char(37),char(38), +char(1),char(2),char(11),char(30),char(71),char(89),char(2),char(11),char(11),char(0), +char(21),char(21),char(15),char(70),char(89),char(21),char(16),char(5),char(26),char(70), +char(89),char(5),char(22),char(0),char(21),char(0),char(63),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(57), +char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(39),char(35), +char(6),char(6),char(35),char(34),char(38),char(53),char(16),char(37),char(55),char(53), +char(52),char(38),char(35),char(34),char(7),char(39),char(54),char(54),char(51),char(50), +char(22),char(21),char(17),char(37),char(50),char(54),char(53),char(53),char(7),char(6), +char(6),char(21),char(20),char(22),char(3),char(82),char(33),char(8),char(82),char(163), +char(122),char(163),char(185),char(2),char(19),char(186),char(111),char(122),char(137),char(173), +char(51),char(81),char(193),char(97),char(196),char(189),char(254),char(14),char(155),char(177), +char(166),char(198),char(175),char(109),char(156),char(103),char(73),char(168),char(155),char(1), +char(76),char(16),char(6),char(68),char(129),char(123),char(84),char(127),char(44),char(50), +char(174),char(192),char(253),char(20),char(117),char(170),char(153),char(99),char(7),char(7), +char(109),char(115),char(90),char(94),char(0),char(2),char(0),char(176),char(255),char(236), +char(4),char(117),char(6),char(20),char(0),char(19),char(0),char(31),char(0),char(68), +char(64),char(34),char(10),char(23),char(23),char(15),char(15),char(12),char(29),char(3), +char(12),char(3),char(32),char(33),char(13),char(0),char(12),char(21),char(18),char(17), +char(10),char(17),char(6),char(0),char(6),char(26),char(70),char(89),char(6),char(22), +char(0),char(20),char(70),char(89),char(0),char(16),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(57),char(17),char(51), +char(24),char(63),char(63),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(50), +char(18),char(17),char(16),char(2),char(35),char(34),char(38),char(39),char(35),char(7), +char(35),char(17),char(51),char(17),char(20),char(7),char(51),char(54),char(23),char(34), +char(6),char(21),char(20),char(22),char(51),char(50),char(54),char(53),char(52),char(38), +char(2),char(174),char(216),char(239),char(241),char(214),char(107),char(177),char(60),char(12), +char(35),char(119),char(166),char(8),char(8),char(116),char(204),char(170),char(150),char(154), +char(170),char(153),char(150),char(150),char(4),char(90),char(254),char(217),char(254),char(242), +char(254),char(242),char(254),char(213),char(79),char(82),char(141),char(6),char(20),char(254), +char(134),char(127),char(101),char(164),char(139),char(195),char(231),char(231),char(199),char(223), +char(209),char(214),char(210),char(0),char(0),char(1),char(0),char(115),char(255),char(236), +char(3),char(139),char(4),char(92),char(0),char(22),char(0),char(38),char(64),char(20), +char(15),char(3),char(3),char(21),char(9),char(3),char(24),char(23),char(6),char(13), +char(70),char(89),char(6),char(16),char(0),char(18),char(70),char(89),char(0),char(22), +char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(49),char(48),char(5),char(34),char(0),char(17), +char(16),char(0),char(51),char(50),char(22),char(23),char(7),char(38),char(38),char(35), +char(32),char(17),char(20),char(22),char(51),char(50),char(55),char(21),char(6),char(2), +char(102),char(238),char(254),char(251),char(1),char(9),char(245),char(79),char(158),char(45), +char(51),char(55),char(130),char(50),char(254),char(178),char(163),char(160),char(137),char(144), +char(110),char(20),char(1),char(37),char(1),char(12),char(1),char(19),char(1),char(44), +char(34),char(23),char(141),char(22),char(29),char(254),char(86),char(202),char(216),char(59), +char(147),char(57),char(0),char(2),char(0),char(115),char(255),char(236),char(4),char(55), +char(6),char(20),char(0),char(18),char(0),char(31),char(0),char(66),char(64),char(33), +char(29),char(6),char(23),char(0),char(14),char(14),char(17),char(6),char(17),char(32), +char(33),char(18),char(21),char(15),char(0),char(0),char(1),char(1),char(12),char(3), +char(9),char(9),char(26),char(70),char(89),char(9),char(16),char(3),char(19),char(70), +char(89),char(3),char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(43), +char(17),char(18),char(0),char(57),char(57),char(17),char(51),char(24),char(63),char(63), +char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(51), +char(17),char(51),char(49),char(48),char(37),char(35),char(6),char(35),char(34),char(2), +char(17),char(16),char(18),char(51),char(50),char(23),char(51),char(39),char(39),char(17), +char(51),char(17),char(35),char(37),char(50),char(54),char(53),char(53),char(52),char(38), +char(35),char(34),char(6),char(21),char(20),char(22),char(3),char(154),char(9),char(115), +char(229),char(215),char(239),char(240),char(214),char(223),char(119),char(13),char(7),char(4), +char(166),char(135),char(254),char(158),char(170),char(153),char(155),char(170),char(146),char(155), +char(154),char(147),char(167),char(1),char(38),char(1),char(15),char(1),char(15),char(1), +char(44),char(162),char(79),char(77),char(1),char(190),char(249),char(236),char(119),char(185), +char(206),char(35),char(233),char(199),char(227),char(207),char(210),char(214),char(0),char(2), +char(0),char(115),char(255),char(236),char(4),char(18),char(4),char(92),char(0),char(19), +char(0),char(26),char(0),char(59),char(64),char(31),char(24),char(10),char(23),char(11), +char(3),char(3),char(17),char(10),char(3),char(28),char(27),char(23),char(11),char(70), +char(89),char(23),char(23),char(0),char(6),char(6),char(20),char(70),char(89),char(6), +char(16),char(0),char(14),char(70),char(89),char(0),char(22),char(0),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(17), +char(51),char(49),char(48),char(5),char(34),char(0),char(17),char(16),char(0),char(51), +char(50),char(18),char(21),char(21),char(33),char(22),char(22),char(51),char(50),char(55), +char(21),char(6),char(6),char(3),char(34),char(6),char(7),char(33),char(52),char(38), +char(2),char(127),char(243),char(254),char(231),char(1),char(5),char(220),char(206),char(240), +char(253),char(13),char(5),char(185),char(168),char(177),char(173),char(88),char(157),char(156), +char(132),char(157),char(14),char(2),char(61),char(140),char(20),char(1),char(40),char(1), +char(7),char(1),char(9),char(1),char(56),char(254),char(241),char(222),char(105),char(193), +char(200),char(74),char(148),char(38),char(33),char(3),char(229),char(172),char(152),char(157), +char(167),char(0),char(0),char(1),char(0),char(29),char(0),char(0),char(3),char(14), +char(6),char(31),char(0),char(20),char(0),char(57),char(64),char(29),char(20),char(12), +char(12),char(19),char(2),char(2),char(7),char(3),char(5),char(3),char(21),char(22), +char(10),char(15),char(70),char(89),char(10),char(0),char(1),char(5),char(7),char(5), +char(70),char(89),char(19),char(7),char(15),char(3),char(21),char(0),char(63),char(63), +char(51),char(43),char(17),char(0),char(51),char(24),char(63),char(43),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(51),char(17),char(51),char(51),char(18), +char(57),char(49),char(48),char(1),char(33),char(17),char(35),char(17),char(35),char(53), +char(55),char(53),char(16),char(33),char(50),char(23),char(7),char(38),char(35),char(34), +char(6),char(21),char(21),char(33),char(2),char(158),char(254),char(233),char(166),char(196), +char(196),char(1),char(97),char(87),char(117),char(43),char(96),char(68),char(94),char(90), +char(1),char(23),char(3),char(199),char(252),char(57),char(3),char(199),char(75),char(60), +char(61),char(1),char(148),char(35),char(133),char(31),char(125),char(138),char(71),char(0), +char(0),char(3),char(0),char(39),char(254),char(20),char(4),char(49),char(4),char(92), +char(0),char(42),char(0),char(55),char(0),char(65),char(0),char(110),char(64),char(62), +char(43),char(25),char(56),char(37),char(12),char(31),char(61),char(5),char(49),char(19), +char(1),char(19),char(5),char(2),char(42),char(34),char(28),char(31),char(37),char(25), +char(10),char(66),char(67),char(28),char(15),char(53),char(15),char(53),char(70),char(89), +char(8),char(59),char(71),char(89),char(10),char(34),char(8),char(42),char(15),char(8), +char(15),char(8),char(22),char(42),char(42),char(2),char(71),char(89),char(42),char(15), +char(40),char(63),char(71),char(89),char(40),char(16),char(22),char(46),char(71),char(89), +char(22),char(27),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(57),char(24),char(47), +char(47),char(17),char(18),char(57),char(57),char(43),char(43),char(17),char(18),char(0), +char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(21), +char(7),char(22),char(22),char(21),char(20),char(6),char(35),char(34),char(39),char(6), +char(21),char(20),char(22),char(51),char(51),char(50),char(22),char(21),char(20),char(4), +char(33),char(34),char(38),char(53),char(52),char(54),char(55),char(38),char(38),char(53), +char(52),char(54),char(55),char(38),char(38),char(53),char(52),char(54),char(51),char(50), +char(23),char(1),char(20),char(22),char(51),char(50),char(54),char(53),char(52),char(38), +char(35),char(35),char(34),char(6),char(19),char(20),char(22),char(51),char(50),char(53), +char(52),char(35),char(34),char(6),char(4),char(49),char(203),char(28),char(44),char(220), +char(192),char(49),char(43),char(106),char(74),char(90),char(194),char(178),char(191),char(254), +char(220),char(254),char(232),char(215),char(233),char(128),char(116),char(42),char(57),char(64), +char(69),char(85),char(107),char(216),char(198),char(86),char(69),char(254),char(17),char(150), +char(140),char(209),char(201),char(110),char(152),char(199),char(113),char(126),char(90),char(130), +char(116),char(243),char(246),char(117),char(126),char(4),char(72),char(105),char(24),char(35), +char(113),char(71),char(161),char(192),char(8),char(56),char(85),char(45),char(43),char(150), +char(143),char(182),char(191),char(160),char(146),char(100),char(146),char(26),char(19),char(80), +char(53),char(60),char(90),char(42),char(35),char(168),char(108),char(180),char(195),char(20), +char(251),char(0),char(89),char(92),char(125),char(107),char(89),char(69),char(108),char(3), +char(60),char(115),char(118),char(236),char(247),char(126),char(0),char(1),char(0),char(176), +char(0),char(0),char(4),char(68),char(6),char(20),char(0),char(22),char(0),char(51), +char(64),char(25),char(14),char(12),char(8),char(8),char(9),char(0),char(22),char(9), +char(22),char(23),char(24),char(14),char(9),char(18),char(18),char(4),char(70),char(89), +char(18),char(16),char(10),char(0),char(0),char(9),char(21),char(0),char(63),char(51), +char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(17),char(18),char(1), +char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(51),char(49), +char(48),char(33),char(17),char(52),char(38),char(35),char(34),char(6),char(21),char(17), +char(35),char(17),char(51),char(17),char(20),char(7),char(51),char(54),char(54),char(51), +char(50),char(22),char(21),char(17),char(3),char(158),char(122),char(130),char(173),char(159), +char(166),char(166),char(8),char(10),char(49),char(181),char(116),char(201),char(201),char(2), +char(197),char(134),char(132),char(188),char(214),char(253),char(195),char(6),char(20),char(254), +char(41),char(85),char(56),char(79),char(91),char(191),char(208),char(253),char(53),char(0), +char(0),char(2),char(0),char(162),char(0),char(0),char(1),char(102),char(5),char(223), +char(0),char(3),char(0),char(15),char(0),char(35),char(64),char(17),char(10),char(0), +char(0),char(4),char(1),char(1),char(16),char(17),char(13),char(7),char(72),char(89), +char(13),char(2),char(15),char(1),char(21),char(0),char(63),char(63),char(206),char(43), +char(17),char(18),char(1),char(57),char(17),char(51),char(51),char(17),char(51),char(49), +char(48),char(33),char(35),char(17),char(51),char(3),char(52),char(54),char(51),char(50), +char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(1),char(86),char(166), +char(166),char(180),char(56),char(42),char(40),char(58),char(58),char(40),char(42),char(56), +char(4),char(72),char(1),char(41),char(57),char(53),char(54),char(56),char(56),char(55), +char(55),char(0),char(0),char(2),char(255),char(145),char(254),char(20),char(1),char(102), +char(5),char(223),char(0),char(12),char(0),char(24),char(0),char(44),char(64),char(22), +char(19),char(11),char(11),char(13),char(8),char(8),char(25),char(26),char(22),char(16), +char(72),char(89),char(22),char(64),char(9),char(15),char(0),char(5),char(70),char(89), +char(0),char(27),char(0),char(63),char(43),char(0),char(24),char(63),char(26),char(206), +char(43),char(17),char(18),char(1),char(57),char(17),char(51),char(51),char(17),char(51), +char(49),char(48),char(19),char(34),char(39),char(53),char(22),char(51),char(50),char(54), +char(53),char(17),char(51),char(17),char(16),char(3),char(52),char(54),char(51),char(50), +char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(43),char(95),char(59), +char(69),char(67),char(78),char(73),char(166),char(180),char(56),char(42),char(40),char(58), +char(58),char(40),char(42),char(56),char(254),char(20),char(25),char(135),char(20),char(85), +char(87),char(4),char(252),char(251),char(16),char(254),char(188),char(7),char(93),char(57), +char(53),char(54),char(56),char(56),char(55),char(55),char(0),char(1),char(0),char(176), +char(0),char(0),char(4),char(29),char(6),char(20),char(0),char(16),char(0),char(54), +char(64),char(27),char(16),char(14),char(10),char(10),char(11),char(11),char(8),char(6), +char(4),char(5),char(8),char(4),char(17),char(18),char(12),char(0),char(0),char(16), +char(16),char(8),char(8),char(3),char(7),char(11),char(21),char(3),char(15),char(0), +char(63),char(63),char(51),char(18),char(57),char(47),char(57),char(17),char(51),char(63), +char(17),char(18),char(1),char(23),char(57),char(17),char(57),char(17),char(51),char(17), +char(51),char(51),char(49),char(48),char(1),char(54),char(55),char(1),char(51),char(1), +char(1),char(35),char(1),char(7),char(17),char(35),char(17),char(51),char(17),char(20), +char(7),char(1),char(84),char(43),char(88),char(1),char(98),char(197),char(254),char(68), +char(1),char(219),char(201),char(254),char(125),char(125),char(164),char(164),char(8),char(2), +char(49),char(61),char(99),char(1),char(119),char(254),char(45),char(253),char(139),char(2), +char(6),char(108),char(254),char(102),char(6),char(20),char(252),char(199),char(55),char(115), +char(0),char(1),char(0),char(176),char(0),char(0),char(1),char(86),char(6),char(20), +char(0),char(3),char(0),char(22),char(64),char(9),char(0),char(1),char(1),char(4), +char(5),char(2),char(0),char(1),char(21),char(0),char(63),char(63),char(17),char(18), +char(1),char(57),char(17),char(51),char(49),char(48),char(33),char(35),char(17),char(51), +char(1),char(86),char(166),char(166),char(6),char(20),char(0),char(1),char(0),char(176), +char(0),char(0),char(6),char(203),char(4),char(92),char(0),char(35),char(0),char(70), +char(64),char(35),char(21),char(17),char(17),char(18),char(8),char(9),char(0),char(35), +char(9),char(18),char(35),char(3),char(36),char(37),char(28),char(22),char(21),char(21), +char(18),char(25),char(4),char(13),char(25),char(13),char(70),char(89),char(31),char(25), +char(16),char(19),char(15),char(9),char(0),char(18),char(21),char(0),char(63),char(51), +char(51),char(63),char(63),char(51),char(43),char(17),char(0),char(51),char(17),char(18), +char(57),char(24),char(47),char(51),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48), +char(33),char(17),char(52),char(38),char(35),char(34),char(6),char(21),char(17),char(35), +char(17),char(52),char(38),char(35),char(34),char(6),char(21),char(17),char(35),char(17), +char(51),char(23),char(51),char(54),char(54),char(51),char(32),char(23),char(51),char(54), +char(54),char(51),char(50),char(22),char(21),char(17),char(6),char(37),char(112),char(118), +char(155),char(148),char(166),char(112),char(119),char(156),char(145),char(166),char(135),char(27), +char(8),char(47),char(171),char(106),char(1),char(1),char(79),char(8),char(49),char(186), +char(119),char(186),char(185),char(2),char(201),char(131),char(131),char(178),char(185),char(253), +char(156),char(2),char(201),char(131),char(131),char(187),char(213),char(253),char(193),char(4), +char(72),char(150),char(80),char(90),char(186),char(86),char(100),char(191),char(210),char(253), +char(53),char(0),char(0),char(1),char(0),char(176),char(0),char(0),char(4),char(68), +char(4),char(92),char(0),char(20),char(0),char(49),char(64),char(24),char(0),char(20), +char(12),char(8),char(8),char(9),char(20),char(9),char(22),char(21),char(12),char(9), +char(16),char(16),char(4),char(70),char(89),char(16),char(16),char(10),char(15),char(0), +char(9),char(21),char(0),char(63),char(51),char(63),char(63),char(43),char(17),char(18), +char(0),char(57),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(33),char(17),char(52),char(38),char(35), +char(34),char(6),char(21),char(17),char(35),char(17),char(51),char(23),char(51),char(54), +char(54),char(51),char(50),char(22),char(21),char(17),char(3),char(158),char(122),char(130), +char(172),char(160),char(166),char(135),char(27),char(8),char(51),char(184),char(113),char(198), +char(200),char(2),char(197),char(134),char(132),char(186),char(214),char(253),char(193),char(4), +char(72),char(150),char(81),char(89),char(191),char(210),char(253),char(53),char(0),char(2), +char(0),char(115),char(255),char(236),char(4),char(98),char(4),char(92),char(0),char(12), +char(0),char(24),char(0),char(40),char(64),char(20),char(19),char(0),char(13),char(7), +char(0),char(7),char(26),char(25),char(10),char(22),char(70),char(89),char(10),char(16), +char(3),char(16),char(70),char(89),char(3),char(22),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(16),char(0),char(35),char(34),char(38), +char(2),char(53),char(16),char(0),char(51),char(50),char(0),char(1),char(20),char(22), +char(51),char(50),char(54),char(53),char(52),char(38),char(35),char(34),char(6),char(4), +char(98),char(254),char(242),char(238),char(147),char(228),char(124),char(1),char(12),char(238), +char(230),char(1),char(15),char(252),char(189),char(168),char(163),char(163),char(169),char(169), +char(165),char(163),char(166),char(2),char(37),char(254),char(244),char(254),char(211),char(138), +char(1),char(2),char(173),char(1),char(12),char(1),char(43),char(254),char(206),char(254), +char(251),char(210),char(220),char(219),char(211),char(209),char(217),char(214),char(0),char(2), +char(0),char(176),char(254),char(20),char(4),char(117),char(4),char(92),char(0),char(20), +char(0),char(33),char(0),char(63),char(64),char(32),char(25),char(11),char(4),char(7), +char(7),char(8),char(31),char(18),char(8),char(18),char(34),char(35),char(4),char(11), +char(0),char(15),char(15),char(21),char(70),char(89),char(15),char(16),char(9),char(15), +char(8),char(27),char(0),char(28),char(70),char(89),char(0),char(22),char(0),char(63), +char(43),char(0),char(24),char(63),char(63),char(63),char(43),char(17),char(18),char(0), +char(57),char(57),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(51),char(51),char(49),char(48),char(5),char(34),char(38), +char(39),char(35),char(22),char(21),char(17),char(35),char(17),char(51),char(23),char(51), +char(54),char(54),char(51),char(50),char(18),char(17),char(16),char(2),char(3),char(34), +char(6),char(7),char(21),char(20),char(22),char(51),char(50),char(54),char(53),char(52), +char(38),char(2),char(174),char(107),char(177),char(60),char(12),char(12),char(166),char(135), +char(23),char(8),char(64),char(170),char(110),char(218),char(237),char(241),char(238),char(168), +char(150),char(2),char(154),char(170),char(142),char(161),char(161),char(20),char(79),char(82), +char(96),char(86),char(254),char(61),char(6),char(52),char(150),char(90),char(80),char(254), +char(214),char(254),char(243),char(254),char(242),char(254),char(213),char(3),char(227),char(186), +char(203),char(37),char(231),char(199),char(230),char(202),char(205),char(219),char(0),char(2), +char(0),char(115),char(254),char(20),char(4),char(55),char(4),char(92),char(0),char(12), +char(0),char(31),char(0),char(68),char(64),char(34),char(10),char(16),char(29),char(22), +char(3),char(26),char(26),char(25),char(16),char(25),char(32),char(33),char(26),char(27), +char(23),char(15),char(29),char(30),char(30),char(22),char(13),char(19),char(19),char(7), +char(70),char(89),char(19),char(16),char(13),char(0),char(70),char(89),char(13),char(22), +char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0), +char(57),char(57),char(17),char(51),char(24),char(63),char(63),char(17),char(18),char(1), +char(57),char(57),char(17),char(51),char(17),char(51),char(51),char(51),char(17),char(51), +char(49),char(48),char(37),char(50),char(54),char(55),char(53),char(52),char(38),char(35), +char(34),char(6),char(21),char(20),char(22),char(23),char(34),char(2),char(17),char(16), +char(18),char(51),char(50),char(23),char(51),char(55),char(51),char(17),char(35),char(17), +char(52),char(55),char(35),char(6),char(2),char(78),char(166),char(152),char(5),char(156), +char(169),char(146),char(155),char(153),char(125),char(212),char(238),char(240),char(214),char(225), +char(121),char(9),char(24),char(131),char(166),char(11),char(13),char(115),char(119),char(178), +char(211),char(37),char(230),char(202),char(227),char(207),char(207),char(217),char(139),char(1), +char(42),char(1),char(11),char(1),char(13),char(1),char(46),char(170),char(150),char(249), +char(204),char(1),char(213),char(100),char(70),char(167),char(0),char(1),char(0),char(176), +char(0),char(0),char(3),char(39),char(4),char(92),char(0),char(16),char(0),char(42), +char(64),char(20),char(13),char(9),char(9),char(10),char(10),char(2),char(17),char(18), +char(11),char(15),char(13),char(0),char(10),char(21),char(0),char(5),char(70),char(89), +char(0),char(16),char(0),char(63),char(43),char(0),char(24),char(63),char(18),char(57), +char(63),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(50),char(23),char(7),char(38),char(35),char(34),char(6), +char(21),char(17),char(35),char(17),char(51),char(23),char(51),char(54),char(54),char(2), +char(164),char(73),char(58),char(23),char(68),char(52),char(133),char(189),char(166),char(137), +char(19),char(8),char(61),char(172),char(4),char(92),char(12),char(154),char(15),char(216), +char(161),char(253),char(180),char(4),char(72),char(203),char(107),char(116),char(0),char(1), +char(0),char(106),char(255),char(236),char(3),char(115),char(4),char(92),char(0),char(36), +char(0),char(54),char(64),char(28),char(30),char(19),char(12),char(0),char(0),char(24), +char(5),char(19),char(4),char(37),char(38),char(12),char(30),char(3),char(22),char(22), +char(27),char(70),char(89),char(22),char(16),char(6),char(3),char(9),char(70),char(89), +char(3),char(22),char(0),char(63),char(43),char(0),char(24),char(47),char(63),char(43), +char(17),char(18),char(0),char(57),char(57),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(20),char(6),char(35), +char(34),char(39),char(53),char(22),char(22),char(51),char(50),char(54),char(53),char(52), +char(38),char(39),char(46),char(2),char(53),char(52),char(54),char(51),char(50),char(23), +char(7),char(38),char(35),char(34),char(6),char(21),char(20),char(22),char(22),char(23), +char(22),char(22),char(3),char(115),char(228),char(206),char(218),char(122),char(79),char(181), +char(84),char(130),char(140),char(111),char(161),char(153),char(129),char(63),char(218),char(190), +char(177),char(169),char(59),char(165),char(134),char(118),char(120),char(45),char(100),char(142), +char(195),char(137),char(1),char(43),char(153),char(166),char(69),char(154),char(40),char(46), +char(83),char(85),char(64),char(91),char(62),char(57),char(85),char(108),char(75),char(134), +char(155),char(72),char(135),char(68),char(74),char(65),char(44),char(62),char(56),char(53), +char(71),char(144),char(0),char(1),char(0),char(31),char(255),char(236),char(2),char(168), +char(5),char(70),char(0),char(22),char(0),char(52),char(64),char(27),char(16),char(20), +char(20),char(9),char(11),char(9),char(18),char(3),char(4),char(24),char(23),char(10), +char(19),char(16),char(19),char(71),char(89),char(14),char(64),char(16),char(15),char(7), +char(0),char(70),char(89),char(7),char(22),char(0),char(63),char(43),char(0),char(24), +char(63),char(26),char(205),char(43),char(17),char(0),char(51),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(50), +char(54),char(55),char(21),char(6),char(6),char(35),char(32),char(17),char(17),char(35), +char(53),char(55),char(55),char(51),char(21),char(33),char(21),char(33),char(17),char(20), +char(22),char(2),char(18),char(44),char(82),char(24),char(27),char(105),char(42),char(254), +char(194),char(157),char(157),char(70),char(96),char(1),char(62),char(254),char(194),char(94), +char(117),char(13),char(7),char(127),char(13),char(17),char(1),char(79),char(2),char(140), +char(80),char(69),char(234),char(254),char(129),char(253),char(123),char(99),char(106),char(0), +char(0),char(1),char(0),char(164),char(255),char(236),char(4),char(57),char(4),char(72), +char(0),char(20),char(0),char(52),char(64),char(25),char(1),char(19),char(7),char(12), +char(12),char(10),char(19),char(10),char(21),char(22),char(12),char(13),char(13),char(16), +char(8),char(20),char(15),char(16),char(4),char(70),char(89),char(16),char(22),char(11), +char(21),char(0),char(63),char(63),char(43),char(0),char(24),char(63),char(51),char(18), +char(57),char(17),char(51),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(20),char(22), +char(51),char(50),char(54),char(53),char(17),char(51),char(17),char(35),char(39),char(35), +char(6),char(6),char(35),char(34),char(38),char(53),char(17),char(1),char(76),char(122), +char(130),char(172),char(159),char(166),char(137),char(24),char(9),char(51),char(181),char(116), +char(200),char(199),char(4),char(72),char(253),char(57),char(134),char(132),char(188),char(213), +char(2),char(64),char(251),char(184),char(147),char(81),char(86),char(190),char(209),char(2), +char(205),char(0),char(0),char(1),char(0),char(0),char(0),char(0),char(4),char(2), +char(4),char(72),char(0),char(11),char(0),char(24),char(64),char(10),char(1),char(10), +char(12),char(13),char(5),char(9),char(1),char(15),char(0),char(21),char(0),char(63), +char(63),char(51),char(57),char(17),char(18),char(1),char(57),char(57),char(49),char(48), +char(33),char(1),char(51),char(19),char(22),char(23),char(51),char(54),char(18),char(19), +char(51),char(1),char(1),char(160),char(254),char(96),char(178),char(236),char(80),char(14), +char(8),char(11),char(117),char(204),char(178),char(254),char(96),char(4),char(72),char(253), +char(118),char(228),char(68),char(53),char(1),char(77),char(2),char(48),char(251),char(184), +char(0),char(1),char(0),char(23),char(0),char(0),char(6),char(35),char(4),char(72), +char(0),char(28),char(0),char(44),char(64),char(20),char(9),char(27),char(29),char(30), +char(23),char(22),char(14),char(13),char(3),char(4),char(13),char(4),char(8),char(26), +char(18),char(9),char(15),char(0),char(8),char(21),char(0),char(63),char(51),char(63), +char(51),char(51),char(18),char(57),char(57),char(17),char(51),char(17),char(51),char(51), +char(51),char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(33),char(3), +char(38),char(39),char(35),char(6),char(7),char(3),char(35),char(1),char(51),char(18), +char(18),char(23),char(51),char(54),char(54),char(55),char(19),char(51),char(19),char(22), +char(23),char(51),char(54),char(54),char(19),char(51),char(1),char(4),char(47),char(201), +char(19),char(52),char(8),char(40),char(30),char(207),char(192),char(254),char(213),char(174), +char(106),char(111),char(8),char(8),char(11),char(49),char(18),char(201),char(180),char(196), +char(56),char(20),char(8),char(4),char(35),char(191),char(172),char(254),char(209),char(2), +char(131),char(59),char(209),char(175),char(95),char(253),char(127),char(4),char(72),char(254), +char(99),char(254),char(80),char(75),char(57),char(181),char(53),char(2),char(117),char(253), +char(139),char(172),char(117),char(36),char(150),char(2),char(220),char(251),char(184),char(0), +char(0),char(1),char(0),char(39),char(0),char(0),char(4),char(8),char(4),char(72), +char(0),char(11),char(0),char(34),char(64),char(17),char(7),char(5),char(6),char(0), +char(1),char(5),char(12),char(13),char(9),char(3),char(1),char(8),char(11),char(21), +char(4),char(1),char(15),char(0),char(63),char(51),char(63),char(51),char(18),char(57), +char(57),char(17),char(18),char(1),char(23),char(57),char(49),char(48),char(1),char(1), +char(51),char(1),char(1),char(51),char(1),char(1),char(35),char(1),char(1),char(35), +char(1),char(184),char(254),char(131),char(189),char(1),char(33),char(1),char(32),char(187), +char(254),char(131),char(1),char(145),char(188),char(254),char(205),char(254),char(202),char(188), +char(2),char(49),char(2),char(23),char(254),char(92),char(1),char(164),char(253),char(233), +char(253),char(207),char(1),char(188),char(254),char(68),char(0),char(1),char(0),char(2), +char(254),char(20),char(4),char(6),char(4),char(72),char(0),char(21),char(0),char(36), +char(64),char(18),char(9),char(15),char(0),char(3),char(22),char(23),char(4),char(13), +char(0),char(13),char(18),char(70),char(89),char(13),char(27),char(8),char(0),char(15), +char(0),char(63),char(50),char(63),char(43),char(17),char(18),char(0),char(57),char(17), +char(18),char(1),char(23),char(57),char(49),char(48),char(19),char(51),char(19),char(22), +char(23),char(51),char(54),char(54),char(19),char(51),char(1),char(6),char(6),char(35), +char(34),char(39),char(53),char(22),char(51),char(50),char(55),char(55),char(2),char(178), +char(240),char(79),char(19),char(8),char(13),char(83),char(230),char(178),char(254),char(41), +char(70),char(187),char(136),char(76),char(74),char(55),char(68),char(171),char(73),char(61), +char(4),char(72),char(253),char(143),char(214),char(95),char(51),char(247),char(2),char(124), +char(251),char(32),char(185),char(155),char(17),char(133),char(12),char(192),char(156),char(0), +char(0),char(1),char(0),char(82),char(0),char(0),char(3),char(109),char(4),char(72), +char(0),char(9),char(0),char(43),char(64),char(23),char(8),char(1),char(3),char(7), +char(0),char(7),char(4),char(1),char(4),char(10),char(11),char(5),char(4),char(71), +char(89),char(5),char(15),char(1),char(8),char(71),char(89),char(1),char(21),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(33),char(53), +char(1),char(33),char(53),char(33),char(21),char(1),char(33),char(3),char(109),char(252), +char(229),char(2),char(86),char(253),char(207),char(2),char(231),char(253),char(178),char(2), +char(93),char(113),char(3),char(86),char(129),char(129),char(252),char(186),char(0),char(1), +char(0),char(61),char(254),char(188),char(2),char(193),char(5),char(182),char(0),char(28), +char(0),char(44),char(64),char(21),char(25),char(26),char(26),char(11),char(23),char(0), +char(0),char(15),char(7),char(20),char(3),char(3),char(7),char(11),char(3),char(29), +char(30),char(19),char(3),char(4),char(39),char(0),char(63),char(63),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(20),char(22),char(23), +char(21),char(38),char(38),char(53),char(17),char(52),char(38),char(35),char(53),char(54), +char(54),char(53),char(17),char(52),char(54),char(51),char(21),char(6),char(21),char(17), +char(20),char(7),char(21),char(22),char(21),char(1),char(219),char(117),char(113),char(190), +char(208),char(126),char(120),char(130),char(116),char(216),char(182),char(230),char(223),char(223), +char(12),char(102),char(92),char(2),char(140),char(2),char(170),char(154),char(1),char(47), +char(104),char(89),char(141),char(2),char(92),char(96),char(1),char(50),char(155),char(172), +char(139),char(6),char(193),char(254),char(217),char(215),char(39),char(12),char(39),char(215), +char(0),char(1),char(1),char(238),char(254),char(16),char(2),char(123),char(6),char(20), +char(0),char(3),char(0),char(22),char(64),char(9),char(2),char(3),char(3),char(4), +char(5),char(3),char(27),char(0),char(0),char(0),char(63),char(63),char(17),char(18), +char(1),char(57),char(17),char(51),char(49),char(48),char(1),char(51),char(17),char(35), +char(1),char(238),char(141),char(141),char(6),char(20),char(247),char(252),char(0),char(1), +char(0),char(72),char(254),char(188),char(2),char(203),char(5),char(182),char(0),char(29), +char(0),char(44),char(64),char(21),char(21),char(5),char(10),char(18),char(18),char(2), +char(25),char(0),char(29),char(29),char(14),char(14),char(25),char(5),char(3),char(30), +char(31),char(21),char(39),char(6),char(3),char(0),char(63),char(63),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(38),char(53),char(17), +char(52),char(39),char(53),char(50),char(22),char(21),char(17),char(20),char(22),char(23), +char(21),char(34),char(6),char(21),char(17),char(20),char(6),char(7),char(53),char(54), +char(54),char(53),char(17),char(52),char(54),char(55),char(2),char(10),char(223),char(227), +char(184),char(211),char(118),char(130),char(122),char(126),char(205),char(190),char(111),char(116), +char(110),char(113),char(2),char(63),char(39),char(215),char(1),char(39),char(193),char(6), +char(139),char(174),char(153),char(254),char(206),char(97),char(91),char(2),char(141),char(89), +char(104),char(254),char(209),char(153),char(171),char(2),char(140),char(2),char(92),char(102), +char(1),char(41),char(114),char(120),char(20),char(0),char(0),char(1),char(0),char(104), +char(2),char(80),char(4),char(41),char(3),char(84),char(0),char(23),char(0),char(36), +char(64),char(17),char(3),char(15),char(24),char(25),char(18),char(12),char(80),char(89), +char(3),char(18),char(15),char(6),char(6),char(0),char(80),char(89),char(6),char(0), +char(47),char(43),char(0),char(16),char(24),char(196),char(47),char(196),char(43),char(17), +char(18),char(1),char(57),char(57),char(49),char(48),char(1),char(34),char(6),char(7), +char(53),char(54),char(51),char(50),char(22),char(23),char(22),char(22),char(51),char(50), +char(54),char(55),char(21),char(6),char(35),char(34),char(38),char(39),char(38),char(38), +char(1),char(82),char(53),char(127),char(54),char(100),char(144),char(68),char(113),char(89), +char(66),char(98),char(47),char(54),char(128),char(54),char(102),char(142),char(72),char(126), +char(72),char(75),char(90),char(2),char(201),char(67),char(54),char(151),char(109),char(28), +char(38),char(28),char(27),char(64),char(57),char(150),char(110),char(33),char(32),char(32), +char(24),char(0),char(0),char(2),char(0),char(152),char(254),char(139),char(1),char(137), +char(4),char(94),char(0),char(3),char(0),char(14),char(0),char(43),char(64),char(20), +char(2),char(4),char(4),char(3),char(9),char(9),char(15),char(16),char(0),char(0), +char(3),char(12),char(12),char(6),char(79),char(89),char(12),char(16),char(3),char(34), +char(0),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(17),char(18),char(1),char(57),char(17),char(51),char(51),char(17),char(51),char(49), +char(48),char(19),char(51),char(19),char(35),char(19),char(20),char(35),char(34),char(38), +char(53),char(52),char(54),char(51),char(50),char(22),char(219),char(105),char(51),char(207), +char(225),char(121),char(60),char(60),char(63),char(57),char(51),char(70),char(2),char(172), +char(251),char(223),char(5),char(76),char(135),char(71),char(64),char(63),char(72),char(64), +char(0),char(1),char(0),char(190),char(255),char(236),char(3),char(219),char(5),char(203), +char(0),char(27),char(0),char(62),char(64),char(30),char(22),char(8),char(13),char(3), +char(3),char(10),char(4),char(0),char(16),char(16),char(4),char(8),char(3),char(28), +char(29),char(25),char(5),char(2),char(19),char(10),char(13),char(2),char(13),char(2), +char(13),char(4),char(11),char(7),char(4),char(25),char(0),char(63),char(63),char(18), +char(57),char(57),char(47),char(47),char(17),char(51),char(51),char(17),char(51),char(51), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(6),char(7),char(21), +char(35),char(53),char(38),char(2),char(53),char(16),char(37),char(53),char(51),char(21), +char(22),char(22),char(23),char(7),char(38),char(35),char(34),char(6),char(21),char(20), +char(22),char(51),char(50),char(55),char(3),char(203),char(105),char(147),char(133),char(203), +char(193),char(1),char(140),char(135),char(75),char(142),char(49),char(49),char(133),char(109), +char(172),char(162),char(159),char(167),char(141),char(142),char(240),char(54),char(6),char(200), +char(206),char(32),char(1),char(17),char(250),char(1),char(252),char(62),char(172),char(164), +char(3),char(33),char(23),char(140),char(51),char(211),char(217),char(212),char(203),char(59), +char(0),char(1),char(0),char(63),char(0),char(0),char(4),char(68),char(5),char(201), +char(0),char(29),char(0),char(72),char(64),char(38),char(24),char(19),char(9),char(13), +char(13),char(26),char(22),char(17),char(2),char(11),char(22),char(19),char(5),char(30), +char(31),char(12),char(24),char(25),char(24),char(78),char(89),char(9),char(25),char(25), +char(19),char(0),char(19),char(16),char(76),char(89),char(19),char(24),char(0),char(5), +char(75),char(89),char(0),char(7),char(0),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(51),char(43),char(17), +char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(50),char(23),char(7), +char(38),char(35),char(34),char(6),char(21),char(17),char(33),char(21),char(33),char(21), +char(20),char(6),char(7),char(33),char(21),char(33),char(53),char(54),char(53),char(53), +char(35),char(53),char(51),char(17),char(52),char(54),char(2),char(170),char(190),char(170), +char(61),char(154),char(143),char(123),char(125),char(1),char(166),char(254),char(90),char(65), +char(74),char(3),char(27),char(251),char(251),char(205),char(198),char(198),char(224),char(5), +char(201),char(84),char(133),char(77),char(124),char(140),char(254),char(217),char(127),char(221), +char(100),char(136),char(44),char(154),char(141),char(47),char(244),char(223),char(127),char(1), +char(60),char(178),char(205),char(0),char(0),char(2),char(0),char(123),char(1),char(6), +char(4),char(23),char(4),char(160),char(0),char(27),char(0),char(39),char(0),char(32), +char(64),char(13),char(28),char(0),char(34),char(14),char(0),char(14),char(40),char(41), +char(31),char(21),char(21),char(37),char(7),char(0),char(47),char(51),char(51),char(47), +char(51),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(19),char(52),char(55),char(39),char(55),char(23),char(54),char(51), +char(50),char(23),char(55),char(23),char(7),char(22),char(21),char(20),char(7),char(23), +char(7),char(39),char(6),char(35),char(34),char(39),char(7),char(39),char(55),char(38), +char(55),char(20),char(22),char(51),char(50),char(54),char(53),char(52),char(38),char(35), +char(34),char(6),char(184),char(74),char(135),char(94),char(135),char(104),char(130),char(127), +char(102),char(137),char(95),char(134),char(74),char(74),char(131),char(92),char(137),char(102), +char(127),char(134),char(100),char(135),char(92),char(133),char(74),char(129),char(157),char(116), +char(116),char(158),char(160),char(114),char(116),char(157),char(2),char(211),char(122),char(107), +char(140),char(92),char(133),char(73),char(73),char(133),char(92),char(138),char(113),char(118), +char(131),char(103),char(135),char(92),char(133),char(71),char(73),char(133),char(92),char(136), +char(107),char(124),char(112),char(160),char(159),char(113),char(114),char(162),char(164),char(0), +char(0),char(1),char(0),char(31),char(0),char(0),char(4),char(113),char(5),char(182), +char(0),char(22),char(0),char(86),char(64),char(46),char(18),char(14),char(7),char(11), +char(11),char(16),char(12),char(5),char(9),char(2),char(9),char(3),char(12),char(20), +char(14),char(21),char(7),char(23),char(24),char(10),char(14),char(14),char(7),char(15), +char(6),char(18),char(18),char(3),char(0),char(19),char(21),char(15),char(19),char(31), +char(19),char(2),char(15),char(19),char(15),char(19),char(12),char(1),char(21),char(6), +char(12),char(24),char(0),char(63),char(63),char(51),char(18),char(57),char(57),char(47), +char(47),char(93),char(17),char(18),char(57),char(50),char(50),char(17),char(51),char(17), +char(51),char(51),char(17),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(51),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(1),char(51),char(1),char(33),char(21),char(33),char(21),char(33),char(21), +char(33),char(17),char(35),char(17),char(33),char(53),char(33),char(53),char(33),char(53), +char(33),char(1),char(51),char(2),char(72),char(1),char(123),char(174),char(254),char(96), +char(1),char(6),char(254),char(195),char(1),char(61),char(254),char(195),char(164),char(254), +char(196),char(1),char(60),char(254),char(196),char(1),char(0),char(254),char(101),char(178), +char(2),char(223),char(2),char(215),char(252),char(254),char(127),char(170),char(127),char(254), +char(244),char(1),char(12),char(127),char(170),char(127),char(3),char(2),char(0),char(2), +char(1),char(238),char(254),char(16),char(2),char(123),char(6),char(20),char(0),char(3), +char(0),char(7),char(0),char(36),char(64),char(16),char(2),char(6),char(6),char(3), +char(7),char(7),char(8),char(9),char(4),char(3),char(4),char(3),char(7),char(27), +char(0),char(0),char(0),char(63),char(63),char(57),char(57),char(47),char(47),char(17), +char(18),char(1),char(57),char(17),char(51),char(51),char(17),char(51),char(49),char(48), +char(1),char(51),char(17),char(35),char(17),char(51),char(17),char(35),char(1),char(238), +char(141),char(141),char(141),char(141),char(6),char(20),char(252),char(248),char(254),char(13), +char(252),char(247),char(0),char(2),char(0),char(123),char(255),char(248),char(3),char(150), +char(6),char(29),char(0),char(49),char(0),char(61),char(0),char(67),char(64),char(38), +char(50),char(0),char(19),char(6),char(42),char(30),char(56),char(25),char(25),char(30), +char(12),char(6),char(0),char(35),char(6),char(62),char(63),char(21),char(3),char(59), +char(54),char(28),char(45),char(6),char(33),char(9),char(33),char(39),char(71),char(89), +char(33),char(21),char(9),char(16),char(71),char(89),char(9),char(0),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(23),char(57), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(19),char(52),char(54),char(55),char(38), +char(38),char(53),char(52),char(54),char(51),char(50),char(22),char(23),char(7),char(38), +char(38),char(35),char(34),char(6),char(21),char(20),char(22),char(23),char(22),char(22), +char(21),char(20),char(6),char(7),char(22),char(21),char(20),char(6),char(35),char(34), +char(39),char(53),char(22),char(22),char(51),char(50),char(54),char(53),char(52),char(38), +char(38),char(39),char(46),char(2),char(55),char(20),char(22),char(23),char(23),char(54), +char(53),char(52),char(38),char(39),char(6),char(6),char(139),char(86),char(78),char(74), +char(84),char(207),char(197),char(94),char(159),char(97),char(53),char(98),char(135),char(76), +char(116),char(116),char(123),char(154),char(186),char(150),char(82),char(74),char(153),char(234), +char(212),char(218),char(128),char(78),char(194),char(82),char(134),char(141),char(48),char(108), +char(115),char(142),char(134),char(66),char(146),char(132),char(167),char(49),char(137),char(147), +char(185),char(68),char(85),char(3),char(41),char(86),char(137),char(37),char(40),char(111), +char(85),char(121),char(139),char(29),char(39),char(131),char(39),char(27),char(59),char(64), +char(60),char(84),char(55),char(68),char(151),char(107),char(90),char(141),char(41),char(81), +char(146),char(140),char(153),char(65),char(148),char(37),char(45),char(76),char(71),char(46), +char(58),char(58),char(43),char(52),char(90),char(114),char(98),char(77),char(105),char(61), +char(19),char(80),char(111),char(83),char(112),char(57),char(19),char(100),char(0),char(2), +char(1),char(53),char(5),char(14),char(3),char(104),char(5),char(211),char(0),char(11), +char(0),char(23),char(0),char(30),char(64),char(12),char(6),char(0),char(12),char(18), +char(0),char(18),char(24),char(25),char(15),char(3),char(21),char(9),char(0),char(47), +char(51),char(205),char(50),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(52),char(54),char(51),char(50),char(22), +char(21),char(20),char(6),char(35),char(34),char(38),char(37),char(52),char(54),char(51), +char(50),char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(1),char(53), +char(53),char(37),char(38),char(55),char(55),char(38),char(37),char(53),char(1),char(125), +char(53),char(37),char(37),char(55),char(55),char(37),char(37),char(53),char(5),char(113), +char(52),char(46),char(46),char(52),char(50),char(49),char(49),char(50),char(52),char(46), +char(46),char(52),char(50),char(49),char(49),char(0),char(0),char(3),char(0),char(100), +char(255),char(236),char(6),char(68),char(5),char(203),char(0),char(22),char(0),char(38), +char(0),char(54),char(0),char(70),char(64),char(39),char(39),char(23),char(3),char(15), +char(47),char(31),char(31),char(20),char(9),char(15),char(23),char(5),char(55),char(56), +char(6),char(12),char(0),char(18),char(15),char(12),char(31),char(12),char(2),char(0), +char(18),char(16),char(18),char(2),char(12),char(18),char(12),char(18),char(27),char(43), +char(35),char(19),char(51),char(27),char(4),char(0),char(63),char(51),char(63),char(51), +char(18),char(57),char(57),char(47),char(47),char(93),char(93),char(17),char(51),char(17), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(34),char(6),char(21),char(20),char(22), +char(51),char(50),char(55),char(21),char(6),char(6),char(35),char(34),char(38),char(53), +char(52),char(54),char(51),char(50),char(23),char(7),char(38),char(1),char(52),char(18), +char(36),char(51),char(50),char(4),char(18),char(21),char(20),char(2),char(4),char(35), +char(34),char(36),char(2),char(55),char(20),char(18),char(4),char(51),char(50),char(36), +char(18),char(53),char(52),char(2),char(36),char(35),char(34),char(4),char(2),char(3), +char(125),char(125),char(135),char(127),char(131),char(86),char(125),char(48),char(101),char(70), +char(194),char(208),char(221),char(191),char(128),char(118),char(58),char(108),char(252),char(151), +char(200),char(1),char(94),char(202),char(200),char(1),char(94),char(202),char(194),char(254), +char(162),char(208),char(207),char(254),char(162),char(195),char(105),char(174),char(1),char(45), +char(172),char(174),char(1),char(42),char(175),char(174),char(254),char(215),char(176),char(174), +char(254),char(214),char(175),char(4),char(35),char(174),char(154),char(168),char(162),char(45), +char(124),char(20),char(28),char(241),char(216),char(209),char(246),char(60),char(118),char(51), +char(254),char(184),char(200),char(1),char(94),char(202),char(200),char(254),char(162),char(202), +char(197),char(254),char(166),char(208),char(207),char(1),char(90),char(198),char(173),char(254), +char(211),char(173),char(174),char(1),char(41),char(176),char(174),char(1),char(42),char(175), +char(174),char(254),char(215),char(0),char(0),char(2),char(0),char(70),char(3),char(20), +char(2),char(113),char(5),char(199),char(0),char(22),char(0),char(31),char(0),char(55), +char(64),char(28),char(23),char(6),char(27),char(10),char(1),char(1),char(22),char(22), +char(16),char(6),char(3),char(32),char(33),char(28),char(10),char(10),char(18),char(25), +char(22),char(0),char(3),char(16),char(3),char(2),char(3),char(13),char(18),char(31), +char(0),char(63),char(51),char(212),char(93),char(196),char(51),char(18),char(57),char(47), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(51),char(17),char(51),char(49),char(48),char(1),char(39),char(6),char(35),char(34), +char(38),char(53),char(52),char(54),char(55),char(55),char(53),char(52),char(35),char(34), +char(7),char(39),char(54),char(51),char(50),char(22),char(21),char(17),char(37),char(20), +char(51),char(50),char(53),char(53),char(7),char(6),char(6),char(2),char(20),char(24), +char(92),char(140),char(95),char(111),char(154),char(165),char(117),char(148),char(100),char(104), +char(43),char(114),char(133),char(130),char(137),char(254),char(80),char(112),char(201),char(98), +char(112),char(103),char(3),char(33),char(84),char(97),char(99),char(102),char(102),char(105), +char(6),char(4),char(39),char(133),char(51),char(96),char(56),char(105),char(121),char(254), +char(60),char(188),char(100),char(180),char(49),char(4),char(4),char(57),char(0),char(2), +char(0),char(82),char(0),char(117),char(3),char(170),char(3),char(190),char(0),char(6), +char(0),char(13),char(0),char(41),char(64),char(19),char(3),char(6),char(10),char(13), +char(2),char(4),char(11),char(9),char(9),char(4),char(13),char(6),char(4),char(14), +char(15),char(12),char(5),char(8),char(1),char(0),char(47),char(51),char(47),char(51), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(19),char(1),char(23),char(1),char(1), +char(7),char(1),char(37),char(1),char(23),char(1),char(1),char(7),char(1),char(82), +char(1),char(86),char(119),char(254),char(223),char(1),char(33),char(119),char(254),char(170), +char(1),char(139),char(1),char(88),char(117),char(254),char(225),char(1),char(31),char(117), +char(254),char(168),char(2),char(39),char(1),char(151),char(69),char(254),char(162),char(254), +char(161),char(71),char(1),char(151),char(27),char(1),char(151),char(69),char(254),char(162), +char(254),char(161),char(71),char(1),char(151),char(0),char(0),char(1),char(0),char(104), +char(1),char(8),char(4),char(41),char(3),char(23),char(0),char(5),char(0),char(27), +char(64),char(12),char(2),char(1),char(4),char(1),char(6),char(7),char(5),char(4), +char(80),char(89),char(5),char(2),char(0),char(47),char(47),char(43),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(49),char(48),char(1),char(17),char(35), +char(17),char(33),char(53),char(4),char(41),char(137),char(252),char(200),char(3),char(23), +char(253),char(241),char(1),char(133),char(138),char(0),char(255),char(255),char(0),char(84), +char(1),char(217),char(2),char(63),char(2),char(113),char(2),char(6),char(0),char(16), +char(0),char(0),char(0),char(4),char(0),char(100),char(255),char(236),char(6),char(68), +char(5),char(203),char(0),char(8),char(0),char(22),char(0),char(38),char(0),char(54), +char(0),char(93),char(64),char(51),char(39),char(23),char(0),char(17),char(17),char(18), +char(4),char(9),char(47),char(31),char(31),char(13),char(9),char(12),char(18),char(23), +char(6),char(55),char(56),char(12),char(16),char(16),char(0),char(0),char(14),char(19), +char(14),char(18),char(8),char(19),char(15),char(18),char(31),char(18),char(2),char(0), +char(19),char(16),char(19),char(2),char(18),char(19),char(18),char(19),char(27),char(43), +char(35),char(19),char(51),char(27),char(4),char(0),char(63),char(51),char(63),char(51), +char(18),char(57),char(57),char(47),char(47),char(93),char(93),char(17),char(51),char(17), +char(51),char(17),char(18),char(57),char(47),char(51),char(17),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(51),char(50),char(54),char(53), +char(52),char(38),char(35),char(35),char(5),char(20),char(6),char(7),char(19),char(35), +char(3),char(35),char(17),char(35),char(17),char(33),char(50),char(22),char(1),char(52), +char(18),char(36),char(51),char(50),char(4),char(18),char(21),char(20),char(2),char(4), +char(35),char(34),char(36),char(2),char(55),char(20),char(18),char(4),char(51),char(50), +char(36),char(18),char(53),char(52),char(2),char(36),char(35),char(34),char(4),char(2), +char(2),char(211),char(108),char(80),char(97),char(86),char(93),char(106),char(1),char(178), +char(85),char(77),char(238),char(168),char(207),char(135),char(148),char(1),char(5),char(166), +char(155),char(251),char(223),char(200),char(1),char(94),char(202),char(200),char(1),char(94), +char(202),char(194),char(254),char(162),char(208),char(207),char(254),char(162),char(195),char(105), +char(174),char(1),char(45),char(172),char(174),char(1),char(42),char(175),char(174),char(254), +char(215),char(176),char(174),char(254),char(214),char(175),char(2),char(250),char(83),char(64), +char(75),char(65),char(136),char(80),char(123),char(30),char(254),char(117),char(1),char(98), +char(254),char(158),char(3),char(123),char(130),char(254),char(197),char(200),char(1),char(94), +char(202),char(200),char(254),char(162),char(202),char(197),char(254),char(166),char(208),char(207), +char(1),char(90),char(198),char(173),char(254),char(211),char(173),char(174),char(1),char(41), +char(176),char(174),char(1),char(42),char(175),char(174),char(254),char(215),char(0),char(1), +char(255),char(250),char(6),char(20),char(4),char(6),char(6),char(147),char(0),char(3), +char(0),char(17),char(181),char(0),char(5),char(1),char(4),char(1),char(2),char(0), +char(47),char(51),char(17),char(1),char(51),char(17),char(51),char(49),char(48),char(1), +char(33),char(53),char(33),char(4),char(6),char(251),char(244),char(4),char(12),char(6), +char(20),char(127),char(0),char(2),char(0),char(127),char(3),char(92),char(2),char(238), +char(5),char(203),char(0),char(12),char(0),char(24),char(0),char(33),char(64),char(14), +char(13),char(0),char(19),char(6),char(0),char(6),char(25),char(26),char(16),char(10), +char(192),char(22),char(3),char(4),char(0),char(63),char(51),char(26),char(204),char(50), +char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49), +char(48),char(19),char(52),char(54),char(51),char(50),char(22),char(21),char(20),char(6), +char(6),char(35),char(34),char(38),char(55),char(20),char(22),char(51),char(50),char(54), +char(53),char(52),char(38),char(35),char(34),char(6),char(127),char(181),char(130),char(130), +char(182),char(82),char(146),char(84),char(130),char(181),char(115),char(117),char(81),char(80), +char(115),char(113),char(82),char(83),char(115),char(4),char(147),char(130),char(182),char(181), +char(131),char(84),char(143),char(84),char(180),char(131),char(82),char(114),char(113),char(83), +char(84),char(113),char(114),char(0),char(255),char(255),char(0),char(104),char(0),char(1), +char(4),char(41),char(4),char(195),char(2),char(38),char(0),char(14),char(0),char(0), +char(0),char(7),char(2),char(43),char(0),char(0),char(253),char(116),char(0),char(1), +char(0),char(49),char(2),char(74),char(2),char(141),char(5),char(201),char(0),char(24), +char(0),char(35),char(64),char(17),char(7),char(19),char(23),char(1),char(1),char(14), +char(19),char(0),char(4),char(26),char(25),char(10),char(16),char(31),char(23),char(1), +char(32),char(0),char(63),char(51),char(63),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(33),char(53), +char(55),char(62),char(2),char(53),char(52),char(38),char(35),char(34),char(6),char(7), +char(39),char(54),char(51),char(50),char(22),char(21),char(20),char(6),char(7),char(7), +char(33),char(2),char(141),char(253),char(164),char(236),char(89),char(82),char(33),char(80), +char(63),char(52),char(98),char(69),char(66),char(131),char(152),char(132),char(147),char(89), +char(147),char(174),char(1),char(184),char(2),char(74),char(104),char(230),char(86),char(97), +char(76),char(54),char(68),char(69),char(38),char(50),char(88),char(111),char(130),char(112), +char(80),char(151),char(138),char(165),char(0),char(1),char(0),char(33),char(2),char(57), +char(2),char(141),char(5),char(201),char(0),char(35),char(0),char(57),char(64),char(34), +char(15),char(5),char(5),char(0),char(3),char(18),char(30),char(10),char(6),char(36), +char(37),char(18),char(93),char(19),char(109),char(19),char(2),char(76),char(19),char(1), +char(11),char(19),char(27),char(19),char(2),char(19),char(19),char(8),char(26),char(33), +char(31),char(13),char(8),char(33),char(0),char(63),char(51),char(63),char(51),char(18), +char(57),char(47),char(93),char(93),char(93),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(49),char(48),char(1),char(20),char(6),char(7),char(22), +char(21),char(20),char(6),char(35),char(34),char(39),char(53),char(22),char(51),char(50), +char(53),char(52),char(35),char(35),char(53),char(51),char(50),char(54),char(53),char(52), +char(38),char(35),char(34),char(6),char(7),char(39),char(54),char(54),char(51),char(50), +char(22),char(2),char(115),char(82),char(68),char(176),char(184),char(168),char(152),char(116), +char(147),char(123),char(211),char(231),char(117),char(119),char(103),char(99),char(80),char(67), +char(66),char(112),char(56),char(69),char(63),char(140),char(94),char(136),char(157),char(4), +char(231),char(80),char(103),char(23),char(47),char(162),char(128),char(143),char(56),char(123), +char(68),char(162),char(145),char(107),char(79),char(68),char(61),char(68),char(43),char(35), +char(90),char(45),char(54),char(119),char(0),char(1),char(1),char(137),char(4),char(217), +char(3),char(18),char(6),char(33),char(0),char(9),char(0),char(19),char(182),char(9), +char(4),char(10),char(11),char(4),char(128),char(9),char(0),char(47),char(26),char(205), +char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(1),char(54),char(54), +char(55),char(51),char(21),char(6),char(6),char(7),char(35),char(1),char(137),char(48), +char(111),char(32),char(202),char(44),char(174),char(64),char(111),char(4),char(242),char(62), +char(176),char(65),char(21),char(65),char(190),char(52),char(0),char(1),char(0),char(176), +char(254),char(20),char(4),char(68),char(4),char(72),char(0),char(22),char(0),char(53), +char(64),char(26),char(5),char(10),char(10),char(8),char(16),char(0),char(19),char(19), +char(20),char(8),char(20),char(24),char(23),char(6),char(21),char(15),char(20),char(27), +char(13),char(2),char(70),char(89),char(13),char(22),char(9),char(21),char(0),char(63), +char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(17),char(18),char(1), +char(57),char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(16),char(51),char(50),char(54),char(53),char(17), +char(51),char(17),char(35),char(39),char(35),char(6),char(35),char(34),char(39),char(35), +char(22),char(21),char(17),char(35),char(17),char(51),char(1),char(86),char(254),char(171), +char(159),char(166),char(136),char(26),char(10),char(111),char(229),char(150),char(88),char(10), +char(10),char(166),char(166),char(1),char(125),char(254),char(250),char(189),char(212),char(2), +char(64),char(251),char(184),char(147),char(167),char(92),char(84),char(160),char(254),char(192), +char(6),char(52),char(0),char(1),char(0),char(113),char(254),char(252),char(4),char(96), +char(6),char(20),char(0),char(15),char(0),char(39),char(64),char(18),char(4),char(5), +char(1),char(0),char(0),char(5),char(11),char(3),char(16),char(17),char(8),char(8), +char(5),char(3),char(15),char(5),char(1),char(5),char(0),char(47),char(51),char(63), +char(51),char(18),char(57),char(47),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(35),char(17),char(35),char(17), +char(35),char(17),char(6),char(35),char(34),char(38),char(53),char(16),char(54),char(51), +char(33),char(4),char(96),char(114),char(213),char(115),char(62),char(84),char(216),char(203), +char(218),char(232),char(2),char(45),char(254),char(252),char(6),char(176),char(249),char(80), +char(3),char(51),char(18),char(250),char(251),char(1),char(4),char(254),char(0),char(1), +char(0),char(152),char(2),char(76),char(1),char(137),char(3),char(90),char(0),char(11), +char(0),char(23),char(64),char(10),char(6),char(0),char(0),char(13),char(12),char(3), +char(9),char(79),char(89),char(3),char(0),char(47),char(43),char(17),char(18),char(1), +char(57),char(17),char(51),char(49),char(48),char(19),char(52),char(54),char(51),char(50), +char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(152),char(62),char(56), +char(58),char(65),char(66),char(57),char(51),char(67),char(2),char(211),char(66),char(69), +char(69),char(66),char(65),char(70),char(63),char(0),char(0),char(1),char(0),char(37), +char(254),char(20),char(1),char(180),char(0),char(0),char(0),char(18),char(0),char(36), +char(64),char(16),char(17),char(14),char(11),char(0),char(0),char(14),char(5),char(3), +char(19),char(20),char(14),char(17),char(17),char(8),char(3),char(16),char(0),char(47), +char(204),char(50),char(57),char(47),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(20),char(6),char(35), +char(34),char(39),char(53),char(22),char(51),char(50),char(54),char(53),char(52),char(38), +char(39),char(55),char(51),char(7),char(22),char(1),char(180),char(153),char(150),char(51), +char(45),char(45),char(59),char(79),char(81),char(79),char(109),char(88),char(110),char(55), +char(180),char(254),char(223),char(97),char(106),char(9),char(106),char(8),char(40),char(54), +char(43),char(53),char(17),char(178),char(115),char(39),char(0),char(1),char(0),char(76), +char(2),char(74),char(1),char(225),char(5),char(182),char(0),char(10),char(0),char(32), +char(64),char(14),char(2),char(0),char(3),char(3),char(10),char(12),char(11),char(9), +char(9),char(3),char(32),char(6),char(0),char(30),char(0),char(63),char(50),char(63), +char(57),char(47),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(51), +char(49),char(48),char(1),char(51),char(17),char(35),char(17),char(52),char(55),char(6), +char(6),char(7),char(39),char(1),char(82),char(143),char(133),char(6),char(22),char(54), +char(135),char(67),char(5),char(182),char(252),char(148),char(2),char(67),char(91),char(90), +char(22),char(45),char(95),char(96),char(0),char(2),char(0),char(66),char(3),char(20), +char(2),char(190),char(5),char(199),char(0),char(11),char(0),char(23),char(0),char(37), +char(64),char(18),char(12),char(6),char(18),char(0),char(6),char(0),char(24),char(25), +char(15),char(0),char(3),char(16),char(3),char(2),char(3),char(21),char(9),char(31), +char(0),char(63),char(51),char(196),char(93),char(50),char(17),char(18),char(1),char(57), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(20),char(6), +char(35),char(34),char(38),char(53),char(52),char(54),char(51),char(50),char(22),char(5), +char(20),char(22),char(51),char(50),char(54),char(53),char(52),char(38),char(35),char(34), +char(6),char(2),char(190),char(171),char(150),char(146),char(169),char(168),char(151),char(152), +char(165),char(253),char(254),char(91),char(104),char(105),char(92),char(92),char(105),char(103), +char(92),char(4),char(111),char(164),char(183),char(186),char(161),char(163),char(181),char(182), +char(162),char(122),char(122),char(122),char(122),char(123),char(118),char(118),char(0),char(2), +char(0),char(80),char(0),char(117),char(3),char(168),char(3),char(190),char(0),char(6), +char(0),char(13),char(0),char(35),char(64),char(17),char(11),char(9),char(4),char(2), +char(0),char(3),char(7),char(2),char(10),char(9),char(6),char(14),char(15),char(12), +char(5),char(8),char(1),char(0),char(47),char(51),char(47),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(1),char(39),char(1),char(1),char(55),char(1),char(5),char(1),char(39),char(1), +char(1),char(55),char(1),char(3),char(168),char(254),char(168),char(117),char(1),char(31), +char(254),char(225),char(117),char(1),char(88),char(254),char(117),char(254),char(168),char(117), +char(1),char(31),char(254),char(225),char(117),char(1),char(88),char(2),char(12),char(254), +char(105),char(71),char(1),char(95),char(1),char(94),char(69),char(254),char(105),char(27), +char(254),char(105),char(71),char(1),char(95),char(1),char(94),char(69),char(254),char(105), +char(255),char(255),char(0),char(75),char(0),char(0),char(5),char(209),char(5),char(182), +char(0),char(39),char(2),char(23),char(2),char(131),char(0),char(0),char(0),char(38), +char(0),char(123),char(255),char(0),char(1),char(7),char(2),char(60),char(3),char(29), +char(253),char(183),char(0),char(9),char(179),char(3),char(2),char(18),char(24),char(0), +char(63),char(53),char(53),char(0),char(255),char(255),char(0),char(46),char(0),char(0), +char(5),char(219),char(5),char(182),char(0),char(39),char(2),char(23),char(2),char(63), +char(0),char(0),char(0),char(38),char(0),char(123),char(226),char(0),char(1),char(7), +char(0),char(116),char(3),char(78),char(253),char(183),char(0),char(7),char(178),char(2), +char(16),char(24),char(0),char(63),char(53),char(0),char(255),char(255),char(0),char(26), +char(0),char(0),char(6),char(33),char(5),char(201),char(0),char(38),char(0),char(117), +char(249),char(0),char(0),char(39),char(2),char(23),char(2),char(223),char(0),char(0), +char(1),char(7),char(2),char(60),char(3),char(109),char(253),char(183),char(0),char(9), +char(179),char(3),char(2),char(43),char(24),char(0),char(63),char(53),char(53),char(0), +char(0),char(2),char(0),char(51),char(254),char(119),char(3),char(84),char(4),char(94), +char(0),char(29),char(0),char(40),char(0),char(65),char(64),char(34),char(8),char(20), +char(30),char(35),char(1),char(28),char(15),char(28),char(35),char(20),char(4),char(41), +char(42),char(0),char(29),char(1),char(12),char(3),char(29),char(29),char(17),char(38), +char(38),char(32),char(79),char(89),char(38),char(16),char(17),char(11),char(73),char(89), +char(17),char(35),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(0),char(57),char(24),char(47),char(95),char(94),char(93),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(21),char(20),char(6),char(7),char(14),char(2),char(21),char(20), +char(22),char(51),char(50),char(54),char(55),char(23),char(6),char(35),char(34),char(38), +char(53),char(52),char(62),char(2),char(55),char(54),char(54),char(53),char(53),char(19), +char(20),char(35),char(34),char(38),char(53),char(52),char(54),char(51),char(50),char(22), +char(2),char(78),char(75),char(97),char(121),char(61),char(25),char(132),char(122),char(80), +char(150),char(98),char(59),char(197),char(198),char(190),char(216),char(35),char(64),char(89), +char(54),char(101),char(65),char(180),char(121),char(59),char(62),char(66),char(55),char(51), +char(70),char(2),char(172),char(51),char(122),char(148),char(84),char(106),char(75),char(77), +char(56),char(100),char(113),char(38),char(48),char(135),char(96),char(186),char(170),char(70), +char(105),char(89),char(82),char(47),char(88),char(116),char(93),char(31),char(1),char(43), +char(135),char(69),char(66),char(64),char(71),char(64),char(255),char(255),char(0),char(0), +char(0),char(0),char(5),char(16),char(7),char(115),char(2),char(38),char(0),char(36), +char(0),char(0),char(1),char(7),char(0),char(67),char(255),char(194),char(1),char(82), +char(0),char(8),char(179),char(2),char(16),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(0),char(0),char(0),char(5),char(16),char(7),char(115), +char(2),char(38),char(0),char(36),char(0),char(0),char(1),char(7),char(0),char(118), +char(0),char(133),char(1),char(82),char(0),char(8),char(179),char(2),char(24),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(0),char(0),char(0), +char(5),char(16),char(7),char(115),char(2),char(38),char(0),char(36),char(0),char(0), +char(1),char(7),char(1),char(75),char(0),char(35),char(1),char(82),char(0),char(8), +char(179),char(2),char(29),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(5),char(16),char(7),char(47),char(2),char(38), +char(0),char(36),char(0),char(0),char(1),char(7),char(1),char(82),char(0),char(4), +char(1),char(82),char(0),char(8),char(179),char(2),char(24),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(0),char(0),char(0),char(5),char(16), +char(7),char(37),char(2),char(38),char(0),char(36),char(0),char(0),char(1),char(7), +char(0),char(106),char(0),char(55),char(1),char(82),char(0),char(10),char(180),char(3), +char(2),char(36),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(5),char(16),char(7),char(6),char(2),char(38), +char(0),char(36),char(0),char(0),char(0),char(7),char(1),char(80),char(0),char(57), +char(0),char(129),char(0),char(2),char(255),char(254),char(0),char(0),char(6),char(129), +char(5),char(182),char(0),char(15),char(0),char(19),char(0),char(78),char(64),char(44), +char(10),char(14),char(14),char(17),char(1),char(0),char(8),char(12),char(1),char(16), +char(5),char(5),char(21),char(5),char(20),char(9),char(19),char(6),char(19),char(73), +char(89),char(16),char(3),char(73),char(89),char(10),char(13),char(73),char(89),char(16), +char(10),char(16),char(10),char(1),char(6),char(3),char(5),char(18),char(1),char(14), +char(73),char(89),char(1),char(18),char(0),char(63),char(43),char(0),char(24),char(63), +char(63),char(18),char(57),char(57),char(47),char(47),char(43),char(43),char(43),char(17), +char(0),char(51),char(17),char(1),char(51),char(17),char(18),char(23),char(57),char(17), +char(51),char(51),char(17),char(51),char(49),char(48),char(33),char(33),char(17),char(33), +char(3),char(35),char(1),char(33),char(21),char(33),char(17),char(33),char(21),char(33), +char(17),char(33),char(1),char(33),char(17),char(35),char(6),char(129),char(253),char(18), +char(253),char(254),char(227),char(176),char(2),char(186),char(3),char(201),char(253),char(188), +char(2),char(29),char(253),char(227),char(2),char(68),char(251),char(84),char(1),char(190), +char(118),char(1),char(209),char(254),char(47),char(5),char(182),char(151),char(254),char(41), +char(150),char(253),char(230),char(1),char(210),char(2),char(181),char(0),char(255),char(255), +char(0),char(125),char(254),char(20),char(4),char(207),char(5),char(203),char(2),char(38), +char(0),char(38),char(0),char(0),char(0),char(7),char(0),char(122),char(2),char(2), +char(0),char(0),char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248), +char(7),char(115),char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7), +char(0),char(67),char(255),char(183),char(1),char(82),char(0),char(8),char(179),char(1), +char(13),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201), +char(0),char(0),char(3),char(248),char(7),char(115),char(2),char(38),char(0),char(40), +char(0),char(0),char(1),char(7),char(0),char(118),char(0),char(63),char(1),char(82), +char(0),char(8),char(179),char(1),char(21),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248),char(7),char(115), +char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7),char(1),char(75), +char(255),char(251),char(1),char(82),char(0),char(8),char(179),char(1),char(26),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201),char(0),char(0), +char(3),char(248),char(7),char(37),char(2),char(38),char(0),char(40),char(0),char(0), +char(1),char(7),char(0),char(106),char(0),char(18),char(1),char(82),char(0),char(10), +char(180),char(2),char(1),char(33),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(60),char(0),char(0),char(2),char(86),char(7),char(115), +char(2),char(38),char(0),char(44),char(0),char(0),char(1),char(7),char(0),char(67), +char(254),char(179),char(1),char(82),char(0),char(8),char(179),char(1),char(13),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(84),char(0),char(0), +char(2),char(115),char(7),char(115),char(2),char(38),char(0),char(44),char(0),char(0), +char(1),char(7),char(0),char(118),char(255),char(97),char(1),char(82),char(0),char(8), +char(179),char(1),char(21),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(255),char(255),char(0),char(0),char(2),char(161),char(7),char(115),char(2),char(38), +char(0),char(44),char(0),char(0),char(1),char(7),char(1),char(75),char(254),char(243), +char(1),char(82),char(0),char(8),char(179),char(1),char(26),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(60),char(0),char(0),char(2),char(111), +char(7),char(37),char(2),char(38),char(0),char(44),char(0),char(0),char(1),char(7), +char(0),char(106),char(255),char(7),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(33),char(5),char(38),char(0),char(43),char(53),char(53),char(0),char(2), +char(0),char(47),char(0),char(0),char(5),char(72),char(5),char(182),char(0),char(12), +char(0),char(23),char(0),char(87),char(64),char(50),char(17),char(21),char(21),char(8), +char(4),char(13),char(0),char(0),char(19),char(4),char(6),char(4),char(24),char(25), +char(20),char(6),char(7),char(6),char(73),char(89),char(17),char(15),char(7),char(63), +char(7),char(175),char(7),char(207),char(7),char(223),char(7),char(5),char(11),char(3), +char(7),char(7),char(4),char(9),char(9),char(16),char(74),char(89),char(9),char(3), +char(4),char(21),char(74),char(89),char(4),char(18),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(95), +char(94),char(93),char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(49), +char(48),char(1),char(16),char(0),char(33),char(33),char(17),char(35),char(53),char(51), +char(17),char(33),char(32),char(0),char(3),char(16),char(33),char(35),char(17),char(33), +char(21),char(33),char(17),char(51),char(32),char(5),char(72),char(254),char(119),char(254), +char(143),char(254),char(123),char(154),char(154),char(1),char(178),char(1),char(81),char(1), +char(124),char(181),char(253),char(199),char(231),char(1),char(123),char(254),char(133),char(190), +char(2),char(98),char(2),char(233),char(254),char(150),char(254),char(129),char(2),char(137), +char(150),char(2),char(151),char(254),char(137),char(254),char(164),char(2),char(64),char(253), +char(252),char(150),char(254),char(10),char(255),char(255),char(0),char(201),char(0),char(0), +char(5),char(63),char(7),char(47),char(2),char(38),char(0),char(49),char(0),char(0), +char(1),char(7),char(1),char(82),char(0),char(147),char(1),char(82),char(0),char(8), +char(179),char(1),char(26),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(125),char(255),char(236),char(5),char(190),char(7),char(115),char(2),char(38), +char(0),char(50),char(0),char(0),char(1),char(7),char(0),char(67),char(0),char(121), +char(1),char(82),char(0),char(8),char(179),char(2),char(25),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(125),char(255),char(236),char(5),char(190), +char(7),char(115),char(2),char(38),char(0),char(50),char(0),char(0),char(1),char(7), +char(0),char(118),char(1),char(10),char(1),char(82),char(0),char(8),char(179),char(2), +char(33),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(125), +char(255),char(236),char(5),char(190),char(7),char(115),char(2),char(38),char(0),char(50), +char(0),char(0),char(1),char(7),char(1),char(75),char(0),char(180),char(1),char(82), +char(0),char(8),char(179),char(2),char(38),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(125),char(255),char(236),char(5),char(190),char(7),char(47), +char(2),char(38),char(0),char(50),char(0),char(0),char(1),char(7),char(1),char(82), +char(0),char(154),char(1),char(82),char(0),char(8),char(179),char(2),char(33),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(125),char(255),char(236), +char(5),char(190),char(7),char(37),char(2),char(38),char(0),char(50),char(0),char(0), +char(1),char(7),char(0),char(106),char(0),char(213),char(1),char(82),char(0),char(10), +char(180),char(3),char(2),char(45),char(5),char(38),char(0),char(43),char(53),char(53), +char(0),char(1),char(0),char(133),char(1),char(16),char(4),char(12),char(4),char(152), +char(0),char(11),char(0),char(25),char(64),char(9),char(7),char(9),char(3),char(1), +char(9),char(1),char(12),char(13),char(8),char(0),char(25),char(47),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(23),char(1),char(1),char(7),char(1),char(1),char(39),char(1),char(1),char(55), +char(1),char(3),char(172),char(96),char(254),char(160),char(1),char(94),char(96),char(254), +char(158),char(254),char(164),char(101),char(1),char(94),char(254),char(160),char(100),char(1), +char(97),char(4),char(152),char(99),char(254),char(158),char(254),char(160),char(99),char(1), +char(95),char(254),char(161),char(99),char(1),char(96),char(1),char(96),char(101),char(254), +char(157),char(0),char(0),char(3),char(0),char(125),char(255),char(195),char(5),char(190), +char(5),char(246),char(0),char(19),char(0),char(27),char(0),char(35),char(0),char(78), +char(64),char(44),char(22),char(31),char(23),char(30),char(4),char(28),char(20),char(28), +char(10),char(20),char(0),char(0),char(18),char(15),char(5),char(8),char(10),char(6), +char(36),char(37),char(22),char(30),char(33),char(25),char(13),char(33),char(73),char(89), +char(15),char(18),char(8),char(5),char(4),char(3),char(16),char(13),char(4),char(3), +char(25),char(73),char(89),char(6),char(3),char(19),char(0),char(63),char(198),char(43), +char(0),char(24),char(63),char(198),char(18),char(23),char(57),char(43),char(17),char(18), +char(0),char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(18),char(23),char(57),char(49),char(48),char(1),char(16), +char(0),char(33),char(34),char(39),char(7),char(39),char(55),char(38),char(17),char(16), +char(0),char(33),char(50),char(23),char(55),char(23),char(7),char(22),char(3),char(16), +char(39),char(1),char(22),char(51),char(50),char(18),char(1),char(16),char(23),char(1), +char(38),char(35),char(34),char(2),char(5),char(190),char(254),char(157),char(254),char(196), +char(235),char(148),char(101),char(120),char(108),char(178),char(1),char(96),char(1),char(68), +char(209),char(157),char(97),char(120),char(106),char(192),char(180),char(110),char(253),char(96), +char(115),char(176),char(243),char(248),char(252),char(39),char(101),char(2),char(157),char(106), +char(168),char(243),char(253),char(2),char(221),char(254),char(161),char(254),char(110),char(100), +char(141),char(79),char(154),char(198),char(1),char(109),char(1),char(101),char(1),char(137), +char(94),char(135),char(80),char(148),char(202),char(254),char(149),char(1),char(16),char(154), +char(252),char(76),char(82),char(1),char(50),char(1),char(42),char(254),char(250),char(154), +char(3),char(175),char(73),char(254),char(205),char(0),char(255),char(255),char(0),char(186), +char(255),char(236),char(5),char(25),char(7),char(115),char(2),char(38),char(0),char(56), +char(0),char(0),char(1),char(7),char(0),char(67),char(0),char(70),char(1),char(82), +char(0),char(8),char(179),char(1),char(19),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(186),char(255),char(236),char(5),char(25),char(7),char(115), +char(2),char(38),char(0),char(56),char(0),char(0),char(1),char(7),char(0),char(118), +char(0),char(207),char(1),char(82),char(0),char(8),char(179),char(1),char(27),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(186),char(255),char(236), +char(5),char(25),char(7),char(115),char(2),char(38),char(0),char(56),char(0),char(0), +char(1),char(7),char(1),char(75),char(0),char(125),char(1),char(82),char(0),char(8), +char(179),char(1),char(32),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(186),char(255),char(236),char(5),char(25),char(7),char(37),char(2),char(38), +char(0),char(56),char(0),char(0),char(1),char(7),char(0),char(106),char(0),char(152), +char(1),char(82),char(0),char(10),char(180),char(2),char(1),char(39),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(0),char(0),char(0), +char(4),char(123),char(7),char(115),char(2),char(38),char(0),char(60),char(0),char(0), +char(1),char(7),char(0),char(118),char(0),char(49),char(1),char(82),char(0),char(8), +char(179),char(1),char(18),char(5),char(38),char(0),char(43),char(53),char(0),char(2), +char(0),char(201),char(0),char(0),char(4),char(121),char(5),char(182),char(0),char(12), +char(0),char(21),char(0),char(54),char(64),char(28),char(13),char(9),char(5),char(5), +char(6),char(17),char(0),char(6),char(0),char(22),char(23),char(13),char(4),char(74), +char(89),char(9),char(21),char(74),char(89),char(13),char(9),char(13),char(9),char(6), +char(7),char(3),char(6),char(18),char(0),char(63),char(63),char(18),char(57),char(57), +char(47),char(47),char(43),char(43),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(51),char(49),char(48),char(1),char(20), +char(4),char(33),char(35),char(17),char(35),char(17),char(51),char(17),char(51),char(32), +char(4),char(1),char(51),char(50),char(54),char(53),char(52),char(38),char(35),char(35), +char(4),char(121),char(254),char(209),char(254),char(225),char(184),char(170),char(170),char(215), +char(1),char(25),char(1),char(22),char(252),char(250),char(168),char(226),char(202),char(190), +char(202),char(204),char(3),char(16),char(227),char(238),char(254),char(193),char(5),char(182), +char(255),char(0),char(207),char(253),char(234),char(143),char(164),char(149),char(138),char(0), +char(0),char(1),char(0),char(176),char(255),char(236),char(4),char(156),char(6),char(31), +char(0),char(48),char(0),char(65),char(64),char(34),char(41),char(42),char(5),char(29), +char(35),char(0),char(23),char(12),char(12),char(0),char(29),char(17),char(42),char(5), +char(49),char(50),char(18),char(18),char(42),char(46),char(46),char(38),char(70),char(89), +char(46),char(0),char(42),char(21),char(15),char(21),char(70),char(89),char(15),char(22), +char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(43),char(17),char(18), +char(0),char(57),char(24),char(47),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(20),char(7),char(6),char(6),char(21),char(20),char(22),char(22),char(23),char(22), +char(22),char(21),char(20),char(6),char(35),char(34),char(39),char(53),char(22),char(22), +char(51),char(50),char(53),char(52),char(38),char(39),char(38),char(38),char(53),char(52), +char(54),char(55),char(54),char(54),char(53),char(52),char(38),char(35),char(32),char(21), +char(17),char(35),char(17),char(52),char(54),char(51),char(50),char(22),char(4),char(25), +char(143),char(88),char(56),char(27),char(71),char(78),char(140),char(102),char(194),char(179), +char(188),char(107),char(63),char(156),char(72),char(215),char(83),char(110),char(127),char(96), +char(69),char(71),char(75),char(64),char(136),char(127),char(254),char(236),char(166),char(220), +char(222),char(206),char(225),char(4),char(242),char(135),char(115),char(70),char(67),char(33), +char(32),char(42),char(57),char(51),char(95),char(157),char(101),char(160),char(171),char(69), +char(154),char(39),char(47),char(182),char(75),char(107),char(70),char(82),char(123),char(84), +char(63),char(106),char(53),char(57),char(90),char(53),char(80),char(85),char(223),char(251), +char(76),char(4),char(178),char(178),char(187),char(157),char(255),char(255),char(0),char(94), +char(255),char(236),char(3),char(205),char(6),char(33),char(2),char(38),char(0),char(68), +char(0),char(0),char(1),char(6),char(0),char(67),char(142),char(0),char(0),char(8), +char(179),char(2),char(38),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(94),char(255),char(236),char(3),char(205),char(6),char(33),char(2),char(38), +char(0),char(68),char(0),char(0),char(1),char(6),char(0),char(118),char(43),char(0), +char(0),char(8),char(179),char(2),char(46),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(94),char(255),char(236),char(3),char(205),char(6),char(33), +char(2),char(38),char(0),char(68),char(0),char(0),char(1),char(6),char(1),char(75), +char(216),char(0),char(0),char(8),char(179),char(2),char(51),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(94),char(255),char(236),char(3),char(205), +char(5),char(221),char(2),char(38),char(0),char(68),char(0),char(0),char(1),char(6), +char(1),char(82),char(189),char(0),char(0),char(8),char(179),char(2),char(46),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(94),char(255),char(236), +char(3),char(205),char(5),char(211),char(2),char(38),char(0),char(68),char(0),char(0), +char(1),char(6),char(0),char(106),char(226),char(0),char(0),char(10),char(180),char(3), +char(2),char(58),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(94),char(255),char(236),char(3),char(205),char(6),char(133),char(2),char(38), +char(0),char(68),char(0),char(0),char(1),char(6),char(1),char(80),char(247),char(0), +char(0),char(10),char(180),char(3),char(2),char(40),char(17),char(38),char(0),char(43), +char(53),char(53),char(0),char(3),char(0),char(94),char(255),char(236),char(6),char(115), +char(4),char(92),char(0),char(41),char(0),char(52),char(0),char(59),char(0),char(97), +char(64),char(51),char(42),char(0),char(36),char(17),char(48),char(56),char(25),char(25), +char(4),char(48),char(57),char(24),char(24),char(31),char(48),char(11),char(0),char(5), +char(60),char(61),char(27),char(45),char(39),char(45),char(70),char(89),char(25),char(49), +char(4),char(49),char(71),char(89),char(56),char(36),char(39),char(17),char(4),char(4), +char(14),char(34),char(39),char(22),char(53),char(8),char(14),char(8),char(70),char(89), +char(20),char(14),char(16),char(0),char(63),char(51),char(43),char(17),char(0),char(51), +char(24),char(63),char(51),char(18),char(57),char(47),char(57),char(18),char(57),char(51), +char(43),char(17),char(0),char(51),char(43),char(17),char(0),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51), +char(18),char(57),char(57),char(17),char(51),char(49),char(48),char(19),char(52),char(54), +char(55),char(55),char(53),char(52),char(38),char(35),char(34),char(7),char(39),char(54), +char(54),char(51),char(50),char(22),char(23),char(54),char(54),char(51),char(50),char(18), +char(21),char(21),char(33),char(18),char(33),char(50),char(54),char(55),char(21),char(6), +char(6),char(35),char(32),char(39),char(6),char(6),char(35),char(34),char(38),char(55), +char(20),char(22),char(51),char(50),char(54),char(53),char(53),char(7),char(6),char(6), +char(1),char(34),char(6),char(7),char(33),char(52),char(38),char(94),char(248),char(254), +char(184),char(116),char(119),char(144),char(163),char(52),char(74),char(199),char(98),char(130), +char(165),char(41),char(53),char(171),char(110),char(192),char(232),char(253),char(67),char(8), +char(1),char(58),char(91),char(157),char(84),char(86),char(149),char(101),char(254),char(223), +char(125),char(81),char(197),char(134),char(163),char(185),char(174),char(107),char(88),char(145), +char(168),char(158),char(186),char(164),char(3),char(189),char(121),char(139),char(11),char(2), +char(7),char(128),char(1),char(47),char(161),char(179),char(8),char(6),char(68),char(129), +char(123),char(84),char(127),char(41),char(53),char(87),char(95),char(88),char(96),char(254), +char(245),char(222),char(107),char(254),char(117),char(35),char(39),char(148),char(38),char(33), +char(233),char(127),char(106),char(170),char(151),char(95),char(89),char(169),char(154),char(99), +char(7),char(8),char(109),char(2),char(50),char(166),char(158),char(156),char(168),char(0), +char(255),char(255),char(0),char(115),char(254),char(20),char(3),char(139),char(4),char(92), +char(2),char(38),char(0),char(70),char(0),char(0),char(0),char(7),char(0),char(122), +char(1),char(70),char(0),char(0),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(18),char(6),char(33),char(2),char(38),char(0),char(72),char(0),char(0), +char(1),char(6),char(0),char(67),char(181),char(0),char(0),char(8),char(179),char(2), +char(28),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115), +char(255),char(236),char(4),char(18),char(6),char(33),char(2),char(38),char(0),char(72), +char(0),char(0),char(1),char(6),char(0),char(118),char(78),char(0),char(0),char(8), +char(179),char(2),char(36),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(4),char(18),char(6),char(33),char(2),char(38), +char(0),char(72),char(0),char(0),char(1),char(6),char(1),char(75),char(247),char(0), +char(0),char(8),char(179),char(2),char(41),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(18),char(5),char(211), +char(2),char(38),char(0),char(72),char(0),char(0),char(1),char(6),char(0),char(106), +char(10),char(0),char(0),char(10),char(180),char(3),char(2),char(48),char(17),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(255),char(218),char(0),char(0), +char(1),char(99),char(6),char(33),char(2),char(38),char(0),char(243),char(0),char(0), +char(1),char(7),char(0),char(67),char(254),char(81),char(0),char(0),char(0),char(8), +char(179),char(1),char(5),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(169),char(0),char(0),char(2),char(50),char(6),char(33),char(2),char(38), +char(0),char(243),char(0),char(0),char(1),char(7),char(0),char(118),char(255),char(32), +char(0),char(0),char(0),char(8),char(179),char(1),char(13),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(255),char(179),char(0),char(0),char(2),char(85), +char(6),char(33),char(2),char(38),char(0),char(243),char(0),char(0),char(1),char(7), +char(1),char(75),char(254),char(167),char(0),char(0),char(0),char(8),char(179),char(1), +char(18),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(255),char(236), +char(0),char(0),char(2),char(31),char(5),char(211),char(2),char(38),char(0),char(243), +char(0),char(0),char(1),char(7),char(0),char(106),char(254),char(183),char(0),char(0), +char(0),char(10),char(180),char(2),char(1),char(25),char(17),char(38),char(0),char(43), +char(53),char(53),char(0),char(2),char(0),char(113),char(255),char(236),char(4),char(98), +char(6),char(33),char(0),char(27),char(0),char(38),char(0),char(74),char(64),char(43), +char(33),char(6),char(12),char(28),char(28),char(0),char(0),char(24),char(25),char(22), +char(14),char(17),char(19),char(16),char(6),char(9),char(39),char(40),char(9),char(31), +char(70),char(89),char(11),char(3),char(22),char(17),char(25),char(14),char(15),char(5), +char(20),char(9),char(9),char(3),char(23),char(20),char(1),char(3),char(36),char(70), +char(89),char(3),char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(51), +char(18),char(57),char(47),char(18),char(23),char(57),char(18),char(57),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(16),char(0),char(35),char(34),char(0),char(53),char(52), +char(0),char(51),char(50),char(23),char(55),char(38),char(39),char(5),char(39),char(55), +char(38),char(39),char(55),char(22),char(23),char(55),char(23),char(7),char(22),char(18), +char(3),char(52),char(38),char(35),char(32),char(17),char(20),char(22),char(51),char(50), +char(54),char(4),char(98),char(254),char(251),char(247),char(222),char(254),char(233),char(1), +char(7),char(220),char(226),char(100),char(8),char(57),char(205),char(254),char(241),char(73), +char(233),char(92),char(94),char(69),char(156),char(102),char(238),char(76),char(207),char(152), +char(165),char(168),char(180),char(156),char(254),char(175),char(175),char(162),char(175),char(161), +char(2),char(51),char(254),char(231),char(254),char(210),char(1),char(13),char(226),char(230), +char(1),char(6),char(121),char(4),char(214),char(191),char(155),char(108),char(133),char(62), +char(49),char(117),char(73),char(75),char(138),char(107),char(119),char(143),char(254),char(114), +char(254),char(232),char(147),char(170),char(254),char(152),char(167),char(183),char(201),char(0), +char(255),char(255),char(0),char(176),char(0),char(0),char(4),char(68),char(5),char(221), +char(2),char(38),char(0),char(81),char(0),char(0),char(1),char(6),char(1),char(82), +char(14),char(0),char(0),char(8),char(179),char(1),char(30),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98), +char(6),char(33),char(2),char(38),char(0),char(82),char(0),char(0),char(1),char(6), +char(0),char(67),char(212),char(0),char(0),char(8),char(179),char(2),char(26),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(98),char(6),char(33),char(2),char(38),char(0),char(82),char(0),char(0), +char(1),char(6),char(0),char(118),char(86),char(0),char(0),char(8),char(179),char(2), +char(34),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115), +char(255),char(236),char(4),char(98),char(6),char(33),char(2),char(38),char(0),char(82), +char(0),char(0),char(1),char(6),char(1),char(75),char(14),char(0),char(0),char(8), +char(179),char(2),char(39),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(4),char(98),char(5),char(221),char(2),char(38), +char(0),char(82),char(0),char(0),char(1),char(6),char(1),char(82),char(241),char(0), +char(0),char(8),char(179),char(2),char(34),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98),char(5),char(211), +char(2),char(38),char(0),char(82),char(0),char(0),char(1),char(6),char(0),char(106), +char(27),char(0),char(0),char(10),char(180),char(3),char(2),char(46),char(17),char(38), +char(0),char(43),char(53),char(53),char(0),char(3),char(0),char(104),char(0),char(252), +char(4),char(41),char(4),char(168),char(0),char(3),char(0),char(15),char(0),char(27), +char(0),char(51),char(64),char(24),char(22),char(10),char(10),char(16),char(4),char(2), +char(4),char(1),char(3),char(28),char(29),char(25),char(19),char(19),char(1),char(7), +char(13),char(13),char(1),char(1),char(0),char(80),char(89),char(1),char(0),char(47), +char(43),char(17),char(0),char(51),char(24),char(47),char(51),char(17),char(51),char(47), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(17), +char(51),char(49),char(48),char(19),char(53),char(33),char(21),char(1),char(52),char(54), +char(51),char(50),char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(17), +char(52),char(54),char(51),char(50),char(22),char(21),char(20),char(6),char(35),char(34), +char(38),char(104),char(3),char(193),char(253),char(174),char(59),char(54),char(52),char(58), +char(59),char(51),char(52),char(61),char(59),char(54),char(52),char(58),char(59),char(51), +char(52),char(61),char(2),char(141),char(138),char(138),char(254),char(232),char(60),char(61), +char(63),char(58),char(57),char(64),char(63),char(2),char(244),char(60),char(61),char(63), +char(58),char(57),char(64),char(63),char(0),char(3),char(0),char(115),char(255),char(188), +char(4),char(98),char(4),char(135),char(0),char(19),char(0),char(27),char(0),char(35), +char(0),char(75),char(64),char(41),char(23),char(31),char(28),char(20),char(20),char(10), +char(28),char(0),char(0),char(18),char(15),char(5),char(8),char(10),char(6),char(36), +char(37),char(22),char(30),char(33),char(25),char(13),char(25),char(70),char(89),char(15), +char(18),char(8),char(5),char(4),char(3),char(16),char(13),char(16),char(3),char(33), +char(70),char(89),char(6),char(3),char(22),char(0),char(63),char(198),char(43),char(0), +char(24),char(63),char(198),char(18),char(23),char(57),char(43),char(17),char(18),char(0), +char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(18),char(57),char(57),char(49),char(48),char(1),char(16),char(0), +char(35),char(34),char(39),char(7),char(39),char(55),char(38),char(17),char(16),char(0), +char(51),char(50),char(23),char(55),char(23),char(7),char(22),char(5),char(20),char(23), +char(1),char(38),char(35),char(34),char(6),char(5),char(52),char(39),char(1),char(22), +char(51),char(50),char(54),char(4),char(98),char(254),char(242),char(238),char(154),char(112), +char(84),char(114),char(94),char(129),char(1),char(12),char(238),char(154),char(116),char(84), +char(117),char(97),char(127),char(252),char(189),char(53),char(1),char(209),char(75),char(114), +char(163),char(166),char(2),char(151),char(51),char(254),char(47),char(71),char(113),char(163), +char(169),char(2),char(37),char(254),char(244),char(254),char(211),char(69),char(117),char(78), +char(131),char(152),char(1),char(0),char(1),char(12),char(1),char(43),char(76),char(119), +char(76),char(133),char(152),char(249),char(171),char(102),char(2),char(134),char(53),char(214), +char(212),char(164),char(100),char(253),char(125),char(51),char(219),char(0),char(255),char(255), +char(0),char(164),char(255),char(236),char(4),char(57),char(6),char(33),char(2),char(38), +char(0),char(88),char(0),char(0),char(1),char(6),char(0),char(67),char(196),char(0), +char(0),char(8),char(179),char(1),char(22),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(164),char(255),char(236),char(4),char(57),char(6),char(33), +char(2),char(38),char(0),char(88),char(0),char(0),char(1),char(6),char(0),char(118), +char(113),char(0),char(0),char(8),char(179),char(1),char(30),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(164),char(255),char(236),char(4),char(57), +char(6),char(33),char(2),char(38),char(0),char(88),char(0),char(0),char(1),char(6), +char(1),char(75),char(18),char(0),char(0),char(8),char(179),char(1),char(35),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(164),char(255),char(236), +char(4),char(57),char(5),char(211),char(2),char(38),char(0),char(88),char(0),char(0), +char(1),char(6),char(0),char(106),char(33),char(0),char(0),char(10),char(180),char(2), +char(1),char(42),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(2),char(254),char(20),char(4),char(6),char(6),char(33),char(2),char(38), +char(0),char(92),char(0),char(0),char(1),char(6),char(0),char(118),char(18),char(0), +char(0),char(8),char(179),char(1),char(31),char(17),char(38),char(0),char(43),char(53), +char(0),char(2),char(0),char(176),char(254),char(20),char(4),char(117),char(6),char(20), +char(0),char(22),char(0),char(34),char(0),char(62),char(64),char(31),char(32),char(6), +char(27),char(20),char(16),char(16),char(17),char(6),char(17),char(36),char(35),char(18), +char(0),char(17),char(27),char(12),char(22),char(9),char(3),char(9),char(30),char(70), +char(89),char(9),char(22),char(3),char(23),char(70),char(89),char(3),char(16),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57), +char(57),char(24),char(63),char(63),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(1),char(54), +char(54),char(51),char(50),char(18),char(17),char(16),char(2),char(35),char(34),char(39), +char(35),char(23),char(22),char(21),char(17),char(35),char(17),char(51),char(17),char(20), +char(7),char(37),char(34),char(6),char(7),char(21),char(20),char(22),char(51),char(32), +char(17),char(52),char(38),char(1),char(88),char(66),char(170),char(106),char(215),char(240), +char(241),char(214),char(222),char(122),char(12),char(4),char(8),char(166),char(166),char(6), +char(1),char(72),char(168),char(152),char(2),char(154),char(170),char(1),char(47),char(148), +char(3),char(180),char(89),char(79),char(254),char(212),char(254),char(245),char(254),char(244), +char(254),char(211),char(161),char(34),char(77),char(63),char(254),char(53),char(8),char(0), +char(254),char(46),char(52),char(90),char(27),char(184),char(201),char(41),char(231),char(199), +char(1),char(176),char(215),char(209),char(255),char(255),char(0),char(2),char(254),char(20), +char(4),char(6),char(5),char(211),char(2),char(38),char(0),char(92),char(0),char(0), +char(1),char(6),char(0),char(106),char(181),char(0),char(0),char(10),char(180),char(2), +char(1),char(43),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(5),char(16),char(6),char(180),char(2),char(38), +char(0),char(36),char(0),char(0),char(1),char(7),char(1),char(77),char(0),char(63), +char(1),char(82),char(0),char(8),char(179),char(2),char(18),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(94),char(255),char(236),char(3),char(205), +char(5),char(98),char(2),char(38),char(0),char(68),char(0),char(0),char(1),char(6), +char(1),char(77),char(245),char(0),char(0),char(8),char(179),char(2),char(40),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(0),char(0),char(0), +char(5),char(16),char(7),char(55),char(2),char(38),char(0),char(36),char(0),char(0), +char(1),char(7),char(1),char(78),char(0),char(43),char(1),char(82),char(0),char(8), +char(179),char(2),char(15),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(94),char(255),char(236),char(3),char(205),char(5),char(229),char(2),char(38), +char(0),char(68),char(0),char(0),char(1),char(6),char(1),char(78),char(228),char(0), +char(0),char(8),char(179),char(2),char(37),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(0),char(254),char(66),char(5),char(17),char(5),char(188), +char(2),char(38),char(0),char(36),char(0),char(0),char(0),char(7),char(1),char(81), +char(3),char(160),char(0),char(0),char(255),char(255),char(0),char(94),char(254),char(66), +char(4),char(0),char(4),char(90),char(2),char(38),char(0),char(68),char(0),char(0), +char(0),char(7),char(1),char(81),char(2),char(143),char(0),char(0),char(255),char(255), +char(0),char(125),char(255),char(236),char(4),char(207),char(7),char(115),char(2),char(38), +char(0),char(38),char(0),char(0),char(1),char(7),char(0),char(118),char(1),char(8), +char(1),char(82),char(0),char(8),char(179),char(1),char(32),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236),char(3),char(139), +char(6),char(33),char(2),char(38),char(0),char(70),char(0),char(0),char(1),char(6), +char(0),char(118),char(68),char(0),char(0),char(8),char(179),char(1),char(32),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(125),char(255),char(236), +char(4),char(207),char(7),char(115),char(2),char(38),char(0),char(38),char(0),char(0), +char(1),char(7),char(1),char(75),char(0),char(172),char(1),char(82),char(0),char(8), +char(179),char(1),char(37),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(3),char(139),char(6),char(33),char(2),char(38), +char(0),char(70),char(0),char(0),char(1),char(6),char(1),char(75),char(212),char(0), +char(0),char(8),char(179),char(1),char(37),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(125),char(255),char(236),char(4),char(207),char(7),char(49), +char(2),char(38),char(0),char(38),char(0),char(0),char(1),char(7),char(1),char(79), +char(2),char(27),char(1),char(82),char(0),char(8),char(179),char(1),char(32),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(3),char(139),char(5),char(223),char(2),char(38),char(0),char(70),char(0),char(0), +char(1),char(7),char(1),char(79),char(1),char(80),char(0),char(0),char(0),char(8), +char(179),char(1),char(32),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(125),char(255),char(236),char(4),char(207),char(7),char(115),char(2),char(38), +char(0),char(38),char(0),char(0),char(1),char(7),char(1),char(76),char(0),char(193), +char(1),char(82),char(0),char(8),char(179),char(1),char(34),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236),char(3),char(161), +char(6),char(33),char(2),char(38),char(0),char(70),char(0),char(0),char(1),char(6), +char(1),char(76),char(243),char(0),char(0),char(8),char(179),char(1),char(34),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201),char(0),char(0), +char(5),char(88),char(7),char(115),char(2),char(38),char(0),char(39),char(0),char(0), +char(1),char(7),char(1),char(76),char(0),char(88),char(1),char(82),char(0),char(8), +char(179),char(2),char(29),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(5),char(129),char(6),char(20),char(2),char(38), +char(0),char(71),char(0),char(0),char(1),char(7),char(2),char(56),char(3),char(12), +char(0),char(0),char(0),char(7),char(178),char(2),char(35),char(0),char(0),char(63), +char(53),char(0),char(255),char(255),char(0),char(47),char(0),char(0),char(5),char(72), +char(5),char(182),char(2),char(6),char(0),char(146),char(0),char(0),char(0),char(2), +char(0),char(115),char(255),char(236),char(4),char(211),char(6),char(20),char(0),char(26), +char(0),char(39),char(0),char(100),char(64),char(55),char(37),char(6),char(18),char(14), +char(0),char(30),char(30),char(21),char(25),char(22),char(25),char(16),char(6),char(4), +char(40),char(41),char(26),char(21),char(24),char(16),char(17),char(16),char(71),char(89), +char(21),char(15),char(17),char(31),char(17),char(47),char(17),char(3),char(9),char(3), +char(17),char(17),char(9),char(19),char(0),char(1),char(12),char(3),char(9),char(9), +char(34),char(70),char(89),char(9),char(16),char(3),char(27),char(70),char(89),char(3), +char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18), +char(0),char(57),char(57),char(24),char(63),char(18),char(57),char(47),char(95),char(94), +char(93),char(51),char(43),char(17),char(0),char(51),char(24),char(63),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(51),char(17),char(51),char(51),char(51), +char(17),char(51),char(49),char(48),char(37),char(35),char(6),char(35),char(34),char(2), +char(17),char(16),char(18),char(51),char(50),char(23),char(51),char(38),char(53),char(53), +char(33),char(53),char(33),char(53),char(51),char(21),char(51),char(21),char(35),char(17), +char(35),char(37),char(50),char(54),char(53),char(53),char(52),char(38),char(35),char(34), +char(6),char(21),char(20),char(22),char(3),char(154),char(9),char(115),char(229),char(215), +char(239),char(240),char(214),char(223),char(119),char(13),char(11),char(254),char(64),char(1), +char(192),char(166),char(156),char(156),char(135),char(254),char(158),char(170),char(153),char(155), +char(170),char(146),char(155),char(154),char(147),char(167),char(1),char(38),char(1),char(15), +char(1),char(15),char(1),char(44),char(162),char(83),char(73),char(133),char(129),char(184), +char(184),char(129),char(251),char(37),char(119),char(185),char(206),char(35),char(233),char(199), +char(227),char(207),char(210),char(214),char(255),char(255),char(0),char(201),char(0),char(0), +char(3),char(248),char(6),char(180),char(2),char(38),char(0),char(40),char(0),char(0), +char(1),char(7),char(1),char(77),char(0),char(18),char(1),char(82),char(0),char(8), +char(179),char(1),char(15),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(4),char(18),char(5),char(98),char(2),char(38), +char(0),char(72),char(0),char(0),char(1),char(6),char(1),char(77),char(10),char(0), +char(0),char(8),char(179),char(2),char(30),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248),char(7),char(55), +char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7),char(1),char(78), +char(0),char(16),char(1),char(82),char(0),char(8),char(179),char(1),char(12),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(18),char(5),char(229),char(2),char(38),char(0),char(72),char(0),char(0), +char(1),char(6),char(1),char(78),char(251),char(0),char(0),char(8),char(179),char(2), +char(27),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201), +char(0),char(0),char(3),char(248),char(7),char(20),char(2),char(38),char(0),char(40), +char(0),char(0),char(1),char(7),char(1),char(79),char(1),char(111),char(1),char(53), +char(0),char(8),char(179),char(1),char(21),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(18),char(5),char(223), +char(2),char(38),char(0),char(72),char(0),char(0),char(1),char(7),char(1),char(79), +char(1),char(84),char(0),char(0),char(0),char(8),char(179),char(2),char(36),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201),char(254),char(66), +char(3),char(248),char(5),char(182),char(2),char(38),char(0),char(40),char(0),char(0), +char(0),char(7),char(1),char(81),char(2),char(115),char(0),char(0),char(255),char(255), +char(0),char(115),char(254),char(97),char(4),char(18),char(4),char(92),char(2),char(38), +char(0),char(72),char(0),char(0),char(0),char(7),char(1),char(81),char(2),char(102), +char(0),char(31),char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248), +char(7),char(115),char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7), +char(1),char(76),char(0),char(16),char(1),char(82),char(0),char(8),char(179),char(1), +char(23),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115), +char(255),char(236),char(4),char(18),char(6),char(33),char(2),char(38),char(0),char(72), +char(0),char(0),char(1),char(6),char(1),char(76),char(251),char(0),char(0),char(8), +char(179),char(2),char(38),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(125),char(255),char(236),char(5),char(61),char(7),char(115),char(2),char(38), +char(0),char(42),char(0),char(0),char(1),char(7),char(1),char(75),char(0),char(233), +char(1),char(82),char(0),char(8),char(179),char(1),char(42),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(39),char(254),char(20),char(4),char(49), +char(6),char(33),char(2),char(38),char(0),char(74),char(0),char(0),char(1),char(6), +char(1),char(75),char(202),char(0),char(0),char(8),char(179),char(3),char(80),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(125),char(255),char(236), +char(5),char(61),char(7),char(55),char(2),char(38),char(0),char(42),char(0),char(0), +char(1),char(7),char(1),char(78),char(1),char(0),char(1),char(82),char(0),char(8), +char(179),char(1),char(28),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(39),char(254),char(20),char(4),char(49),char(5),char(229),char(2),char(38), +char(0),char(74),char(0),char(0),char(1),char(6),char(1),char(78),char(206),char(0), +char(0),char(8),char(179),char(3),char(66),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(125),char(255),char(236),char(5),char(61),char(7),char(49), +char(2),char(38),char(0),char(42),char(0),char(0),char(1),char(7),char(1),char(79), +char(2),char(100),char(1),char(82),char(0),char(8),char(179),char(1),char(37),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(39),char(254),char(20), +char(4),char(49),char(5),char(223),char(2),char(38),char(0),char(74),char(0),char(0), +char(1),char(7),char(1),char(79),char(1),char(31),char(0),char(0),char(0),char(8), +char(179),char(3),char(75),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(125),char(254),char(59),char(5),char(61),char(5),char(203),char(2),char(38), +char(0),char(42),char(0),char(0),char(0),char(7),char(2),char(57),char(1),char(39), +char(0),char(0),char(255),char(255),char(0),char(39),char(254),char(20),char(4),char(49), +char(6),char(33),char(2),char(38),char(0),char(74),char(0),char(0),char(1),char(6), +char(2),char(58),char(68),char(0),char(0),char(8),char(179),char(3),char(70),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201),char(0),char(0), +char(5),char(31),char(7),char(115),char(2),char(38),char(0),char(43),char(0),char(0), +char(1),char(7),char(1),char(75),char(0),char(150),char(1),char(82),char(0),char(8), +char(179),char(1),char(26),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(176),char(0),char(0),char(4),char(68),char(7),char(170),char(2),char(38), +char(0),char(75),char(0),char(0),char(1),char(7),char(1),char(75),char(0),char(31), +char(1),char(137),char(0),char(8),char(179),char(1),char(37),char(2),char(38),char(0), +char(43),char(53),char(0),char(2),char(0),char(0),char(0),char(0),char(5),char(231), +char(5),char(182),char(0),char(19),char(0),char(23),char(0),char(84),char(64),char(44), +char(23),char(3),char(15),char(15),char(0),char(16),char(20),char(4),char(12),char(12), +char(7),char(11),char(8),char(11),char(16),char(18),char(4),char(24),char(25),char(23), +char(14),char(73),char(89),char(22),char(10),char(18),char(19),char(18),char(74),char(89), +char(7),char(3),char(19),char(23),char(19),char(23),char(19),char(1),char(12),char(16), +char(18),char(5),char(1),char(3),char(0),char(63),char(51),char(63),char(51),char(18), +char(57),char(57),char(47),char(47),char(17),char(51),char(51),char(43),char(17),char(0), +char(51),char(51),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(51),char(17),char(51),char(51),char(17),char(51),char(51),char(17),char(51),char(51), +char(49),char(48),char(19),char(53),char(51),char(21),char(33),char(53),char(51),char(21), +char(51),char(21),char(35),char(17),char(35),char(17),char(33),char(17),char(35),char(17), +char(35),char(53),char(1),char(53),char(33),char(21),char(201),char(170),char(3),char(2), +char(170),char(200),char(200),char(170),char(252),char(254),char(170),char(201),char(4),char(117), +char(252),char(254),char(4),char(190),char(248),char(248),char(248),char(248),char(141),char(251), +char(207),char(2),char(176),char(253),char(80),char(4),char(49),char(141),char(254),char(138), +char(233),char(233),char(0),char(1),char(0),char(20),char(0),char(0),char(4),char(68), +char(6),char(20),char(0),char(30),char(0),char(89),char(64),char(50),char(22),char(20), +char(16),char(8),char(8),char(13),char(9),char(0),char(30),char(30),char(18),char(9), +char(11),char(4),char(31),char(32),char(23),char(22),char(26),char(4),char(70),char(89), +char(19),char(11),char(12),char(11),char(71),char(89),char(16),char(12),char(15),char(12), +char(31),char(12),char(47),char(12),char(3),char(22),char(26),char(12),char(12),char(26), +char(22),char(3),char(9),char(14),char(0),char(0),char(9),char(21),char(0),char(63), +char(51),char(63),char(18),char(23),char(57),char(47),char(47),char(47),char(93),char(17), +char(51),char(43),char(17),char(0),char(51),char(43),char(17),char(0),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17), +char(51),char(51),char(51),char(49),char(48),char(33),char(17),char(52),char(38),char(35), +char(34),char(6),char(21),char(17),char(35),char(17),char(35),char(53),char(51),char(53), +char(51),char(21),char(33),char(21),char(33),char(21),char(20),char(7),char(51),char(54), +char(54),char(51),char(50),char(22),char(21),char(17),char(3),char(158),char(122),char(130), +char(174),char(158),char(166),char(156),char(156),char(166),char(1),char(193),char(254),char(63), +char(8),char(10),char(49),char(181),char(116),char(201),char(201),char(2),char(158),char(134), +char(132),char(186),char(213),char(253),char(231),char(4),char(219),char(127),char(186),char(186), +char(127),char(196),char(84),char(56),char(79),char(91),char(191),char(210),char(253),char(92), +char(255),char(255),char(255),char(226),char(0),char(0),char(2),char(202),char(7),char(47), +char(2),char(38),char(0),char(44),char(0),char(0),char(1),char(7),char(1),char(82), +char(254),char(218),char(1),char(82),char(0),char(8),char(179),char(1),char(21),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(255),char(144),char(0),char(0), +char(2),char(120),char(5),char(221),char(2),char(38),char(0),char(243),char(0),char(0), +char(1),char(7),char(1),char(82),char(254),char(136),char(0),char(0),char(0),char(8), +char(179),char(1),char(13),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(42),char(0),char(0),char(2),char(130),char(6),char(180),char(2),char(38), +char(0),char(44),char(0),char(0),char(1),char(7),char(1),char(77),char(254),char(253), +char(1),char(82),char(0),char(8),char(179),char(1),char(15),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(255),char(218),char(0),char(0),char(2),char(50), +char(5),char(98),char(2),char(38),char(0),char(243),char(0),char(0),char(1),char(7), +char(1),char(77),char(254),char(173),char(0),char(0),char(0),char(8),char(179),char(1), +char(7),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(30), +char(0),char(0),char(2),char(138),char(7),char(55),char(2),char(38),char(0),char(44), +char(0),char(0),char(1),char(7),char(1),char(78),char(254),char(249),char(1),char(82), +char(0),char(8),char(179),char(1),char(12),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(255),char(204),char(0),char(0),char(2),char(56),char(5),char(229), +char(2),char(38),char(0),char(243),char(0),char(0),char(1),char(7),char(1),char(78), +char(254),char(167),char(0),char(0),char(0),char(8),char(179),char(1),char(4),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(84),char(254),char(66), +char(2),char(86),char(5),char(182),char(2),char(38),char(0),char(44),char(0),char(0), +char(0),char(6),char(1),char(81),char(104),char(0),char(255),char(255),char(0),char(53), +char(254),char(66),char(1),char(129),char(5),char(223),char(2),char(38),char(0),char(76), +char(0),char(0),char(0),char(6),char(1),char(81),char(16),char(0),char(255),char(255), +char(0),char(84),char(0),char(0),char(2),char(86),char(7),char(49),char(2),char(38), +char(0),char(44),char(0),char(0),char(1),char(7),char(1),char(79),char(0),char(80), +char(1),char(82),char(0),char(8),char(179),char(1),char(21),char(5),char(38),char(0), +char(43),char(53),char(0),char(1),char(0),char(176),char(0),char(0),char(1),char(86), +char(4),char(72),char(0),char(3),char(0),char(22),char(64),char(9),char(0),char(1), +char(1),char(5),char(4),char(2),char(15),char(1),char(21),char(0),char(63),char(63), +char(17),char(18),char(1),char(57),char(17),char(51),char(49),char(48),char(33),char(35), +char(17),char(51),char(1),char(86),char(166),char(166),char(4),char(72),char(255),char(255), +char(0),char(84),char(254),char(127),char(4),char(16),char(5),char(182),char(0),char(38), +char(0),char(44),char(0),char(0),char(0),char(7),char(0),char(45),char(2),char(168), +char(0),char(0),char(255),char(255),char(0),char(162),char(254),char(20),char(3),char(108), +char(5),char(223),char(0),char(38),char(0),char(76),char(0),char(0),char(0),char(7), +char(0),char(77),char(2),char(6),char(0),char(0),char(255),char(255),char(255),char(96), +char(254),char(127),char(2),char(101),char(7),char(115),char(2),char(38),char(0),char(45), +char(0),char(0),char(1),char(7),char(1),char(75),char(254),char(183),char(1),char(82), +char(0),char(8),char(179),char(1),char(28),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(255),char(145),char(254),char(20),char(2),char(79),char(6),char(33), +char(2),char(38),char(2),char(55),char(0),char(0),char(1),char(7),char(1),char(75), +char(254),char(161),char(0),char(0),char(0),char(8),char(179),char(1),char(27),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201),char(254),char(59), +char(4),char(233),char(5),char(182),char(2),char(38),char(0),char(46),char(0),char(0), +char(0),char(7),char(2),char(57),char(0),char(137),char(0),char(0),char(255),char(255), +char(0),char(176),char(254),char(59),char(4),char(29),char(6),char(20),char(2),char(38), +char(0),char(78),char(0),char(0),char(0),char(6),char(2),char(57),char(43),char(0), +char(0),char(1),char(0),char(176),char(0),char(0),char(4),char(27),char(4),char(70), +char(0),char(13),char(0),char(47),char(64),char(25),char(13),char(11),char(7),char(7), +char(8),char(3),char(1),char(2),char(5),char(8),char(5),char(14),char(15),char(2), +char(13),char(5),char(6),char(4),char(8),char(0),char(9),char(15),char(4),char(8), +char(21),char(0),char(63),char(51),char(63),char(51),char(18),char(23),char(57),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(49), +char(48),char(1),char(51),char(1),char(1),char(35),char(1),char(7),char(17),char(35), +char(17),char(51),char(17),char(20),char(7),char(3),char(47),char(207),char(254),char(98), +char(1),char(187),char(201),char(254),char(151),char(135),char(178),char(178),char(12),char(4), +char(70),char(254),char(30),char(253),char(156),char(1),char(248),char(113),char(254),char(121), +char(4),char(70),char(254),char(229),char(166),char(113),char(255),char(255),char(0),char(201), +char(0),char(0),char(3),char(248),char(7),char(115),char(2),char(38),char(0),char(47), +char(0),char(0),char(1),char(7),char(0),char(118),char(255),char(99),char(1),char(82), +char(0),char(8),char(179),char(1),char(15),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(163),char(0),char(0),char(2),char(44),char(7),char(172), +char(2),char(38),char(0),char(79),char(0),char(0),char(1),char(7),char(0),char(118), +char(255),char(26),char(1),char(139),char(0),char(8),char(179),char(1),char(13),char(2), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201),char(254),char(59), +char(3),char(248),char(5),char(182),char(2),char(38),char(0),char(47),char(0),char(0), +char(0),char(6),char(2),char(57),char(49),char(0),char(255),char(255),char(0),char(89), +char(254),char(59),char(1),char(87),char(6),char(20),char(2),char(38),char(0),char(79), +char(0),char(0),char(0),char(7),char(2),char(57),char(254),char(232),char(0),char(0), +char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248),char(5),char(183), +char(2),char(38),char(0),char(47),char(0),char(0),char(1),char(7),char(2),char(56), +char(1),char(29),char(255),char(163),char(0),char(7),char(178),char(1),char(9),char(3), +char(0),char(63),char(53),char(0),char(255),char(255),char(0),char(176),char(0),char(0), +char(2),char(160),char(6),char(20),char(2),char(38),char(0),char(79),char(0),char(0), +char(1),char(6),char(2),char(56),char(43),char(0),char(0),char(7),char(178),char(1), +char(7),char(0),char(0),char(63),char(53),char(0),char(255),char(255),char(0),char(201), +char(0),char(0),char(3),char(248),char(5),char(182),char(2),char(38),char(0),char(47), +char(0),char(0),char(0),char(7),char(1),char(79),char(2),char(4),char(253),char(103), +char(255),char(255),char(0),char(176),char(0),char(0),char(2),char(168),char(6),char(20), +char(0),char(38),char(0),char(79),char(0),char(0),char(0),char(7),char(1),char(79), +char(1),char(66),char(253),char(56),char(0),char(1),char(0),char(29),char(0),char(0), +char(3),char(248),char(5),char(182),char(0),char(13),char(0),char(61),char(64),char(33), +char(7),char(11),char(11),char(4),char(0),char(12),char(9),char(0),char(3),char(4), +char(15),char(14),char(9),char(7),char(4),char(10),char(3),char(1),char(6),char(8), +char(2),char(8),char(2),char(8),char(0),char(5),char(3),char(0),char(11),char(73), +char(89),char(0),char(18),char(0),char(63),char(43),char(0),char(24),char(63),char(18), +char(57),char(57),char(47),char(47),char(18),char(23),char(57),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(51), +char(17),char(7),char(39),char(55),char(17),char(51),char(17),char(37),char(23),char(5), +char(17),char(33),char(21),char(201),char(105),char(67),char(172),char(170),char(1),char(41), +char(67),char(254),char(148),char(2),char(133),char(1),char(252),char(59),char(114),char(101), +char(3),char(30),char(253),char(70),char(174),char(121),char(211),char(254),char(60),char(154), +char(0),char(1),char(255),char(252),char(0),char(0),char(2),char(39),char(6),char(20), +char(0),char(11),char(0),char(55),char(64),char(28),char(0),char(4),char(4),char(9), +char(5),char(5),char(12),char(2),char(13),char(8),char(12),char(0),char(2),char(9), +char(3),char(8),char(6),char(6),char(1),char(7),char(1),char(7),char(1),char(5), +char(10),char(0),char(5),char(21),char(0),char(63),char(63),char(18),char(57),char(57), +char(47),char(47),char(18),char(23),char(57),char(17),char(1),char(51),char(17),char(51), +char(18),char(57),char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(1), +char(55),char(23),char(7),char(17),char(35),char(17),char(7),char(39),char(55),char(17), +char(51),char(1),char(86),char(137),char(72),char(209),char(166),char(110),char(70),char(180), +char(166),char(3),char(96),char(94),char(112),char(141),char(253),char(63),char(2),char(84), +char(72),char(113),char(119),char(3),char(32),char(0),char(255),char(255),char(0),char(201), +char(0),char(0),char(5),char(63),char(7),char(115),char(2),char(38),char(0),char(49), +char(0),char(0),char(1),char(7),char(0),char(118),char(1),char(2),char(1),char(82), +char(0),char(8),char(179),char(1),char(26),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(176),char(0),char(0),char(4),char(68),char(6),char(33), +char(2),char(38),char(0),char(81),char(0),char(0),char(1),char(6),char(0),char(118), +char(121),char(0),char(0),char(8),char(179),char(1),char(30),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(201),char(254),char(59),char(5),char(63), +char(5),char(182),char(2),char(38),char(0),char(49),char(0),char(0),char(0),char(7), +char(2),char(57),char(0),char(205),char(0),char(0),char(255),char(255),char(0),char(176), +char(254),char(59),char(4),char(68),char(4),char(92),char(2),char(38),char(0),char(81), +char(0),char(0),char(0),char(6),char(2),char(57),char(86),char(0),char(255),char(255), +char(0),char(201),char(0),char(0),char(5),char(63),char(7),char(115),char(2),char(38), +char(0),char(49),char(0),char(0),char(1),char(7),char(1),char(76),char(0),char(166), +char(1),char(82),char(0),char(8),char(179),char(1),char(28),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(176),char(0),char(0),char(4),char(68), +char(6),char(33),char(2),char(38),char(0),char(81),char(0),char(0),char(1),char(6), +char(1),char(76),char(31),char(0),char(0),char(8),char(179),char(1),char(32),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(1),char(0),char(0), +char(4),char(203),char(5),char(182),char(0),char(39),char(0),char(81),char(0),char(135), +char(0),char(0),char(1),char(6),char(2),char(7),char(232),char(0),char(0),char(7), +char(178),char(1),char(28),char(3),char(0),char(63),char(53),char(0),char(0),char(1), +char(0),char(201),char(254),char(127),char(5),char(63),char(5),char(182),char(0),char(25), +char(0),char(56),char(64),char(28),char(16),char(13),char(13),char(14),char(8),char(20), +char(20),char(23),char(23),char(2),char(14),char(3),char(26),char(27),char(18),char(10), +char(14),char(21),char(15),char(3),char(14),char(18),char(0),char(5),char(73),char(89), +char(0),char(34),char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(51), +char(18),char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(34), +char(39),char(53),char(22),char(51),char(50),char(54),char(53),char(1),char(35),char(18), +char(21),char(17),char(35),char(17),char(51),char(1),char(51),char(38),char(53),char(17), +char(51),char(17),char(20),char(6),char(3),char(201),char(98),char(54),char(71),char(83), +char(105),char(106),char(252),char(192),char(8),char(16),char(157),char(192),char(3),char(29), +char(8),char(14),char(159),char(193),char(254),char(127),char(27),char(145),char(20),char(122), +char(111),char(4),char(203),char(254),char(248),char(158),char(252),char(219),char(5),char(182), +char(251),char(78),char(149),char(224),char(3),char(61),char(250),char(88),char(195),char(204), +char(0),char(1),char(0),char(176),char(254),char(20),char(4),char(68),char(4),char(92), +char(0),char(29),char(0),char(56),char(64),char(30),char(19),char(15),char(15),char(16), +char(7),char(27),char(27),char(2),char(16),char(3),char(30),char(31),char(23),char(11), +char(70),char(89),char(23),char(16),char(19),char(16),char(17),char(15),char(16),char(21), +char(0),char(5),char(70),char(89),char(0),char(27),char(0),char(63),char(43),char(0), +char(24),char(63),char(63),char(18),char(57),char(63),char(43),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(34),char(39),char(53),char(22),char(51),char(50),char(53),char(17),char(52), +char(38),char(35),char(34),char(6),char(21),char(17),char(35),char(17),char(51),char(23), +char(51),char(54),char(54),char(51),char(50),char(22),char(21),char(17),char(20),char(6), +char(3),char(37),char(86),char(55),char(60),char(62),char(140),char(122),char(130),char(172), +char(160),char(166),char(135),char(27),char(10),char(52),char(180),char(110),char(203),char(199), +char(140),char(254),char(20),char(25),char(135),char(20),char(172),char(3),char(121),char(134), +char(132),char(186),char(214),char(253),char(193),char(4),char(72),char(150),char(82),char(88), +char(191),char(210),char(252),char(141),char(154),char(170),char(255),char(255),char(0),char(125), +char(255),char(236),char(5),char(190),char(6),char(180),char(2),char(38),char(0),char(50), +char(0),char(0),char(1),char(7),char(1),char(77),char(0),char(199),char(1),char(82), +char(0),char(8),char(179),char(2),char(27),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98),char(5),char(98), +char(2),char(38),char(0),char(82),char(0),char(0),char(1),char(6),char(1),char(77), +char(18),char(0),char(0),char(8),char(179),char(2),char(28),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(125),char(255),char(236),char(5),char(190), +char(7),char(55),char(2),char(38),char(0),char(50),char(0),char(0),char(1),char(7), +char(1),char(78),char(0),char(193),char(1),char(82),char(0),char(8),char(179),char(2), +char(24),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115), +char(255),char(236),char(4),char(98),char(5),char(229),char(2),char(38),char(0),char(82), +char(0),char(0),char(1),char(6),char(1),char(78),char(14),char(0),char(0),char(8), +char(179),char(2),char(25),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(125),char(255),char(236),char(5),char(190),char(7),char(115),char(2),char(38), +char(0),char(50),char(0),char(0),char(1),char(7),char(1),char(83),char(1),char(20), +char(1),char(82),char(0),char(10),char(180),char(3),char(2),char(43),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(98),char(6),char(33),char(2),char(38),char(0),char(82),char(0),char(0), +char(1),char(6),char(1),char(83),char(90),char(0),char(0),char(10),char(180),char(3), +char(2),char(44),char(17),char(38),char(0),char(43),char(53),char(53),char(0),char(2), +char(0),char(125),char(255),char(236),char(6),char(231),char(5),char(205),char(0),char(20), +char(0),char(31),char(0),char(83),char(64),char(46),char(24),char(6),char(15),char(19), +char(19),char(29),char(0),char(13),char(17),char(29),char(6),char(5),char(32),char(33), +char(15),char(18),char(73),char(89),char(15),char(15),char(0),char(11),char(11),char(14), +char(73),char(89),char(11),char(3),char(9),char(21),char(73),char(89),char(9),char(4), +char(3),char(27),char(73),char(89),char(3),char(18),char(0),char(19),char(73),char(89), +char(0),char(18),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(0), +char(24),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0), +char(57),char(24),char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(33),char(6), +char(35),char(32),char(0),char(17),char(16),char(0),char(33),char(50),char(23),char(33), +char(21),char(33),char(17),char(33),char(21),char(33),char(17),char(33),char(1),char(34), +char(0),char(17),char(16),char(0),char(51),char(50),char(55),char(17),char(38),char(6), +char(231),char(253),char(0),char(102),char(92),char(254),char(185),char(254),char(159),char(1), +char(92),char(1),char(64),char(102),char(90),char(3),char(14),char(253),char(179),char(2), +char(39),char(253),char(217),char(2),char(77),char(252),char(68),char(249),char(254),char(255), +char(1),char(1),char(247),char(112),char(87),char(87),char(20),char(1),char(137),char(1), +char(106),char(1),char(104),char(1),char(134),char(23),char(151),char(254),char(41),char(150), +char(253),char(230),char(4),char(157),char(254),char(207),char(254),char(217),char(254),char(215), +char(254),char(205),char(33),char(4),char(117),char(30),char(0),char(3),char(0),char(113), +char(255),char(236),char(7),char(31),char(4),char(90),char(0),char(30),char(0),char(42), +char(0),char(49),char(0),char(85),char(64),char(45),char(31),char(8),char(14),char(2), +char(22),char(22),char(37),char(47),char(21),char(21),char(28),char(37),char(8),char(4), +char(50),char(51),char(43),char(40),char(11),char(40),char(70),char(89),char(46),char(22), +char(70),char(89),char(2),char(5),char(14),char(11),char(46),char(46),char(5),char(17), +char(11),char(16),char(24),char(34),char(5),char(34),char(70),char(89),char(0),char(5), +char(22),char(0),char(63),char(51),char(43),char(17),char(0),char(51),char(24),char(63), +char(51),char(18),char(57),char(47),char(18),char(57),char(18),char(57),char(43),char(43), +char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(18),char(57),char(57),char(17),char(51),char(49),char(48),char(5), +char(32),char(39),char(6),char(6),char(35),char(34),char(0),char(17),char(16),char(0), +char(51),char(50),char(22),char(23),char(54),char(54),char(51),char(50),char(18),char(21), +char(21),char(33),char(18),char(33),char(50),char(54),char(55),char(21),char(6),char(6), +char(1),char(20),char(22),char(51),char(50),char(54),char(53),char(52),char(38),char(35), +char(34),char(6),char(37),char(34),char(6),char(7),char(33),char(52),char(38),char(5), +char(150),char(254),char(219),char(125),char(62),char(209),char(137),char(223),char(254),char(244), +char(1),char(6),char(235),char(131),char(205),char(62),char(58),char(192),char(126),char(201), +char(238),char(253),char(39),char(8),char(1),char(74),char(94),char(161),char(87),char(88), +char(152),char(251),char(33),char(152),char(167),char(163),char(153),char(155),char(165),char(166), +char(149),char(4),char(71),char(127),char(145),char(12),char(2),char(32),char(132),char(20), +char(235),char(116),char(119),char(1),char(49),char(1),char(8),char(1),char(9),char(1), +char(44),char(119),char(114),char(112),char(121),char(254),char(247),char(226),char(105),char(254), +char(119),char(35),char(39),char(148),char(39),char(32),char(2),char(57),char(211),char(219), +char(213),char(209),char(221),char(213),char(216),char(216),char(164),char(158),char(158),char(164), +char(255),char(255),char(0),char(201),char(0),char(0),char(4),char(207),char(7),char(115), +char(2),char(38),char(0),char(53),char(0),char(0),char(1),char(7),char(0),char(118), +char(0),char(121),char(1),char(82),char(0),char(8),char(179),char(2),char(31),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(176),char(0),char(0), +char(3),char(39),char(6),char(33),char(2),char(38),char(0),char(85),char(0),char(0), +char(1),char(6),char(0),char(118),char(220),char(0),char(0),char(8),char(179),char(1), +char(26),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201), +char(254),char(59),char(4),char(207),char(5),char(182),char(2),char(38),char(0),char(53), +char(0),char(0),char(0),char(6),char(2),char(57),char(125),char(0),char(255),char(255), +char(0),char(96),char(254),char(59),char(3),char(39),char(4),char(92),char(2),char(38), +char(0),char(85),char(0),char(0),char(0),char(7),char(2),char(57),char(254),char(239), +char(0),char(0),char(255),char(255),char(0),char(201),char(0),char(0),char(4),char(207), +char(7),char(115),char(2),char(38),char(0),char(53),char(0),char(0),char(1),char(7), +char(1),char(76),char(0),char(27),char(1),char(82),char(0),char(8),char(179),char(2), +char(33),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(130), +char(0),char(0),char(3),char(39),char(6),char(33),char(2),char(38),char(0),char(85), +char(0),char(0),char(1),char(7),char(1),char(76),char(255),char(118),char(0),char(0), +char(0),char(8),char(179),char(1),char(28),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(106),char(255),char(236),char(4),char(2),char(7),char(115), +char(2),char(38),char(0),char(54),char(0),char(0),char(1),char(7),char(0),char(118), +char(0),char(80),char(1),char(82),char(0),char(8),char(179),char(1),char(46),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(106),char(255),char(236), +char(3),char(115),char(6),char(33),char(2),char(38),char(0),char(86),char(0),char(0), +char(1),char(6),char(0),char(118),char(234),char(0),char(0),char(8),char(179),char(1), +char(46),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(106), +char(255),char(236),char(4),char(2),char(7),char(115),char(2),char(38),char(0),char(54), +char(0),char(0),char(1),char(7),char(1),char(75),char(255),char(234),char(1),char(82), +char(0),char(8),char(179),char(1),char(51),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(106),char(255),char(236),char(3),char(115),char(6),char(33), +char(2),char(38),char(0),char(86),char(0),char(0),char(1),char(6),char(1),char(75), +char(151),char(0),char(0),char(8),char(179),char(1),char(51),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(106),char(254),char(20),char(4),char(2), +char(5),char(203),char(2),char(38),char(0),char(54),char(0),char(0),char(0),char(7), +char(0),char(122),char(1),char(39),char(0),char(0),char(255),char(255),char(0),char(106), +char(254),char(20),char(3),char(115),char(4),char(92),char(2),char(38),char(0),char(86), +char(0),char(0),char(0),char(7),char(0),char(122),char(0),char(213),char(0),char(0), +char(255),char(255),char(0),char(106),char(255),char(236),char(4),char(2),char(7),char(115), +char(2),char(38),char(0),char(54),char(0),char(0),char(1),char(7),char(1),char(76), +char(255),char(228),char(1),char(82),char(0),char(8),char(179),char(1),char(48),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(106),char(255),char(236), +char(3),char(115),char(6),char(33),char(2),char(38),char(0),char(86),char(0),char(0), +char(1),char(6),char(1),char(76),char(153),char(0),char(0),char(8),char(179),char(1), +char(48),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(18), +char(254),char(59),char(4),char(90),char(5),char(182),char(2),char(38),char(0),char(55), +char(0),char(0),char(0),char(6),char(2),char(57),char(25),char(0),char(255),char(255), +char(0),char(31),char(254),char(59),char(2),char(168),char(5),char(70),char(2),char(38), +char(0),char(87),char(0),char(0),char(0),char(6),char(2),char(57),char(130),char(0), +char(255),char(255),char(0),char(18),char(0),char(0),char(4),char(90),char(7),char(115), +char(2),char(38),char(0),char(55),char(0),char(0),char(1),char(7),char(1),char(76), +char(255),char(220),char(1),char(82),char(0),char(8),char(179),char(1),char(19),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(31),char(255),char(236), +char(2),char(215),char(6),char(20),char(2),char(38),char(0),char(87),char(0),char(0), +char(1),char(6),char(2),char(56),char(98),char(0),char(0),char(7),char(178),char(1), +char(26),char(0),char(0),char(63),char(53),char(0),char(0),char(1),char(0),char(18), +char(0),char(0),char(4),char(90),char(5),char(182),char(0),char(15),char(0),char(63), +char(64),char(33),char(7),char(11),char(11),char(0),char(12),char(4),char(9),char(12), +char(14),char(2),char(5),char(16),char(17),char(10),char(14),char(15),char(14),char(74), +char(89),char(7),char(15),char(15),char(3),char(12),char(18),char(6),char(2),char(3), +char(2),char(73),char(89),char(3),char(3),char(0),char(63),char(43),char(17),char(0), +char(51),char(24),char(63),char(18),char(57),char(47),char(51),char(43),char(17),char(0), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(17), +char(51),char(49),char(48),char(1),char(17),char(33),char(53),char(33),char(21),char(33), +char(17),char(33),char(21),char(33),char(17),char(35),char(17),char(33),char(53),char(1), +char(225),char(254),char(49),char(4),char(72),char(254),char(49),char(1),char(54),char(254), +char(202),char(170),char(254),char(199),char(3),char(47),char(1),char(240),char(151),char(151), +char(254),char(16),char(141),char(253),char(94),char(2),char(162),char(141),char(0),char(1), +char(0),char(31),char(255),char(236),char(2),char(168),char(5),char(70),char(0),char(28), +char(0),char(76),char(64),char(41),char(23),char(19),char(27),char(27),char(12),char(8), +char(2),char(21),char(25),char(8),char(10),char(14),char(6),char(29),char(30),char(14), +char(22),char(19),char(22),char(71),char(89),char(26),char(10),char(11),char(10),char(71), +char(89),char(23),char(11),char(11),char(6),char(17),char(64),char(19),char(15),char(6), +char(0),char(70),char(89),char(6),char(22),char(0),char(63),char(43),char(0),char(24), +char(63),char(26),char(205),char(18),char(57),char(47),char(51),char(43),char(17),char(0), +char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(51),char(17),char(51),char(51),char(49),char(48),char(37),char(50), +char(55),char(21),char(6),char(6),char(35),char(32),char(17),char(53),char(35),char(53), +char(51),char(17),char(35),char(53),char(55),char(55),char(51),char(21),char(33),char(21), +char(33),char(17),char(33),char(21),char(33),char(21),char(20),char(2),char(23),char(85), +char(60),char(32),char(106),char(42),char(254),char(200),char(141),char(141),char(157),char(157), +char(70),char(96),char(1),char(62),char(254),char(194),char(1),char(45),char(254),char(211), +char(117),char(20),char(127),char(14),char(16),char(1),char(92),char(254),char(129),char(1), +char(0),char(80),char(69),char(234),char(254),char(129),char(255),char(0),char(129),char(244), +char(221),char(0),char(255),char(255),char(0),char(186),char(255),char(236),char(5),char(25), +char(7),char(47),char(2),char(38),char(0),char(56),char(0),char(0),char(1),char(7), +char(1),char(82),char(0),char(111),char(1),char(82),char(0),char(8),char(179),char(1), +char(27),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(164), +char(255),char(236),char(4),char(57),char(5),char(221),char(2),char(38),char(0),char(88), +char(0),char(0),char(1),char(6),char(1),char(82),char(247),char(0),char(0),char(8), +char(179),char(1),char(30),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(186),char(255),char(236),char(5),char(25),char(6),char(180),char(2),char(38), +char(0),char(56),char(0),char(0),char(1),char(7),char(1),char(77),char(0),char(145), +char(1),char(82),char(0),char(8),char(179),char(1),char(21),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(164),char(255),char(236),char(4),char(57), +char(5),char(98),char(2),char(38),char(0),char(88),char(0),char(0),char(1),char(6), +char(1),char(77),char(25),char(0),char(0),char(8),char(179),char(1),char(24),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(186),char(255),char(236), +char(5),char(25),char(7),char(55),char(2),char(38),char(0),char(56),char(0),char(0), +char(1),char(7),char(1),char(78),char(0),char(139),char(1),char(82),char(0),char(8), +char(179),char(1),char(18),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(164),char(255),char(236),char(4),char(57),char(5),char(229),char(2),char(38), +char(0),char(88),char(0),char(0),char(1),char(6),char(1),char(78),char(18),char(0), +char(0),char(8),char(179),char(1),char(21),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(186),char(255),char(236),char(5),char(25),char(7),char(215), +char(2),char(38),char(0),char(56),char(0),char(0),char(1),char(7),char(1),char(80), +char(0),char(156),char(1),char(82),char(0),char(10),char(180),char(2),char(1),char(21), +char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(164), +char(255),char(236),char(4),char(57),char(6),char(133),char(2),char(38),char(0),char(88), +char(0),char(0),char(1),char(6),char(1),char(80),char(35),char(0),char(0),char(10), +char(180),char(2),char(1),char(24),char(17),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(186),char(255),char(236),char(5),char(25),char(7),char(115), +char(2),char(38),char(0),char(56),char(0),char(0),char(1),char(7),char(1),char(83), +char(0),char(225),char(1),char(82),char(0),char(10),char(180),char(2),char(1),char(37), +char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(164), +char(255),char(236),char(4),char(57),char(6),char(33),char(2),char(38),char(0),char(88), +char(0),char(0),char(1),char(6),char(1),char(83),char(104),char(0),char(0),char(10), +char(180),char(2),char(1),char(40),char(17),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(186),char(254),char(66),char(5),char(25),char(5),char(182), +char(2),char(38),char(0),char(56),char(0),char(0),char(0),char(7),char(1),char(81), +char(2),char(33),char(0),char(0),char(255),char(255),char(0),char(164),char(254),char(66), +char(4),char(101),char(4),char(72),char(2),char(38),char(0),char(88),char(0),char(0), +char(0),char(7),char(1),char(81),char(2),char(244),char(0),char(0),char(255),char(255), +char(0),char(27),char(0),char(0),char(7),char(76),char(7),char(115),char(2),char(38), +char(0),char(58),char(0),char(0),char(1),char(7),char(1),char(75),char(1),char(84), +char(1),char(82),char(0),char(8),char(179),char(1),char(40),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(23),char(0),char(0),char(6),char(35), +char(6),char(33),char(2),char(38),char(0),char(90),char(0),char(0),char(1),char(7), +char(1),char(75),char(0),char(193),char(0),char(0),char(0),char(8),char(179),char(1), +char(43),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(0), +char(0),char(0),char(4),char(123),char(7),char(115),char(2),char(38),char(0),char(60), +char(0),char(0),char(1),char(7),char(1),char(75),char(255),char(224),char(1),char(82), +char(0),char(8),char(179),char(1),char(23),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(2),char(254),char(20),char(4),char(6),char(6),char(33), +char(2),char(38),char(0),char(92),char(0),char(0),char(1),char(6),char(1),char(75), +char(173),char(0),char(0),char(8),char(179),char(1),char(36),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(0),char(0),char(0),char(4),char(123), +char(7),char(37),char(2),char(38),char(0),char(60),char(0),char(0),char(1),char(7), +char(0),char(106),char(255),char(241),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(30),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(82),char(0),char(0),char(4),char(63),char(7),char(115),char(2),char(38), +char(0),char(61),char(0),char(0),char(1),char(7),char(0),char(118),char(0),char(66), +char(1),char(82),char(0),char(8),char(179),char(1),char(19),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(82),char(0),char(0),char(3),char(109), +char(6),char(33),char(2),char(38),char(0),char(93),char(0),char(0),char(1),char(6), +char(0),char(118),char(232),char(0),char(0),char(8),char(179),char(1),char(19),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(82),char(0),char(0), +char(4),char(63),char(7),char(49),char(2),char(38),char(0),char(61),char(0),char(0), +char(1),char(7),char(1),char(79),char(1),char(68),char(1),char(82),char(0),char(8), +char(179),char(1),char(19),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(82),char(0),char(0),char(3),char(109),char(5),char(223),char(2),char(38), +char(0),char(93),char(0),char(0),char(1),char(7),char(1),char(79),char(0),char(223), +char(0),char(0),char(0),char(8),char(179),char(1),char(19),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(82),char(0),char(0),char(4),char(63), +char(7),char(115),char(2),char(38),char(0),char(61),char(0),char(0),char(1),char(7), +char(1),char(76),char(255),char(237),char(1),char(82),char(0),char(8),char(179),char(1), +char(21),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(82), +char(0),char(0),char(3),char(109),char(6),char(33),char(2),char(38),char(0),char(93), +char(0),char(0),char(1),char(6),char(1),char(76),char(134),char(0),char(0),char(8), +char(179),char(1),char(21),char(17),char(38),char(0),char(43),char(53),char(0),char(1), +char(0),char(176),char(0),char(0),char(2),char(219),char(6),char(31),char(0),char(12), +char(0),char(29),char(64),char(14),char(0),char(1),char(1),char(13),char(6),char(14), +char(4),char(9),char(70),char(89),char(4),char(0),char(1),char(21),char(0),char(63), +char(63),char(43),char(17),char(1),char(51),char(18),char(57),char(17),char(51),char(49), +char(48),char(33),char(35),char(17),char(16),char(33),char(50),char(23),char(7),char(38), +char(35),char(34),char(6),char(21),char(1),char(86),char(166),char(1),char(103),char(96), +char(100),char(43),char(87),char(73),char(97),char(89),char(4),char(156),char(1),char(131), +char(37),char(133),char(30),char(123),char(122),char(0),char(0),char(1),char(0),char(195), +char(254),char(20),char(4),char(23),char(5),char(203),char(0),char(32),char(0),char(68), +char(64),char(36),char(26),char(30),char(30),char(12),char(8),char(18),char(28),char(8), +char(10),char(2),char(5),char(33),char(34),char(29),char(10),char(12),char(10),char(70), +char(89),char(26),char(12),char(12),char(16),char(0),char(16),char(22),char(70),char(89), +char(16),char(4),char(0),char(5),char(70),char(89),char(0),char(27),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(1),char(34), +char(39),char(53),char(22),char(51),char(50),char(54),char(53),char(17),char(35),char(53), +char(55),char(53),char(52),char(54),char(51),char(50),char(23),char(7),char(7),char(38), +char(35),char(34),char(6),char(21),char(21),char(33),char(21),char(33),char(17),char(20), +char(6),char(1),char(72),char(69),char(64),char(70),char(61),char(95),char(77),char(222), +char(222),char(162),char(182),char(85),char(120),char(22),char(21),char(102),char(60),char(98), +char(80),char(1),char(26),char(254),char(234),char(158),char(254),char(20),char(19),char(139), +char(18),char(102),char(113),char(3),char(205),char(75),char(60),char(139),char(195),char(178), +char(43),char(64),char(65),char(32),char(105),char(124),char(149),char(129),char(252),char(55), +char(184),char(175),char(0),char(4),char(0),char(0),char(0),char(0),char(5),char(20), +char(7),char(170),char(0),char(16),char(0),char(24),char(0),char(34),char(0),char(46), +char(0),char(97),char(64),char(52),char(17),char(5),char(4),char(24),char(6),char(20), +char(7),char(4),char(3),char(7),char(8),char(35),char(0),char(41),char(11),char(8), +char(11),char(9),char(34),char(20),char(2),char(0),char(29),char(3),char(9),char(48), +char(47),char(38),char(14),char(44),char(2),char(9),char(24),char(6),char(73),char(89), +char(9),char(20),char(14),char(24),char(34),char(14),char(24),char(24),char(14),char(34), +char(3),char(8),char(28),char(4),char(8),char(18),char(0),char(63),char(51),char(47), +char(18),char(23),char(57),char(47),char(47),char(47),char(17),char(18),char(57),char(57), +char(43),char(17),char(0),char(51),char(51),char(17),char(51),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(17),char(18),char(57),char(57),char(17),char(57),char(57),char(49),char(48),char(1), +char(20),char(7),char(1),char(35),char(3),char(33),char(3),char(35),char(1),char(38), +char(53),char(52),char(54),char(51),char(50),char(22),char(19),char(3),char(38),char(39), +char(6),char(6),char(7),char(3),char(19),char(54),char(54),char(55),char(51),char(21), +char(6),char(6),char(7),char(35),char(19),char(52),char(38),char(35),char(34),char(6), +char(21),char(20),char(22),char(51),char(50),char(54),char(3),char(104),char(104),char(2), +char(20),char(174),char(176),char(253),char(158),char(166),char(174),char(2),char(20),char(106), +char(122),char(99),char(100),char(125),char(27),char(178),char(25),char(47),char(14),char(48), +char(9),char(177),char(152),char(49),char(102),char(23),char(203),char(32),char(168),char(66), +char(111),char(211),char(66),char(51),char(51),char(66),char(60),char(57),char(53),char(64), +char(5),char(150),char(133),char(56),char(251),char(39),char(1),char(145),char(254),char(111), +char(4),char(215),char(52),char(136),char(101),char(114),char(117),char(252),char(54),char(1), +char(176),char(58),char(145),char(48),char(135),char(24),char(254),char(84),char(4),char(133), +char(59),char(149),char(42),char(16),char(46),char(161),char(45),char(254),char(245),char(57), +char(60),char(60),char(57),char(55),char(61),char(61),char(0),char(5),char(0),char(94), +char(255),char(236),char(3),char(205),char(7),char(170),char(0),char(9),char(0),char(36), +char(0),char(47),char(0),char(59),char(0),char(71),char(0),char(103),char(64),char(55), +char(45),char(18),char(66),char(54),char(60),char(48),char(41),char(21),char(21),char(11), +char(36),char(36),char(6),char(48),char(0),char(54),char(29),char(18),char(7),char(72), +char(73),char(9),char(9),char(4),char(63),char(57),char(69),char(51),char(17),char(11), +char(12),char(21),char(41),char(71),char(89),char(12),char(21),char(21),char(15),char(32), +char(32),char(25),char(70),char(89),char(32),char(16),char(15),char(37),char(70),char(89), +char(15),char(22),char(10),char(21),char(4),char(0),char(47),char(63),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(57),char(43),char(17),char(0),char(51),char(24),char(63),char(51),char(196),char(50), +char(17),char(57),char(47),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(53),char(54),char(54),char(55),char(33),char(21),char(6),char(6), +char(7),char(1),char(39),char(35),char(6),char(6),char(35),char(34),char(38),char(53), +char(16),char(37),char(55),char(53),char(52),char(38),char(35),char(34),char(6),char(7), +char(39),char(54),char(54),char(51),char(50),char(22),char(21),char(17),char(37),char(50), +char(54),char(53),char(53),char(7),char(6),char(6),char(21),char(20),char(22),char(1), +char(20),char(6),char(35),char(34),char(38),char(53),char(52),char(54),char(51),char(50), +char(22),char(7),char(52),char(38),char(35),char(34),char(6),char(21),char(20),char(22), +char(51),char(50),char(54),char(1),char(215),char(46),char(106),char(22),char(1),char(4), +char(21),char(164),char(128),char(1),char(2),char(33),char(8),char(82),char(163),char(122), +char(163),char(185),char(2),char(25),char(180),char(119),char(133),char(96),char(167),char(71), +char(55),char(84),char(208),char(101),char(209),char(201),char(254),char(14),char(155),char(177), +char(166),char(198),char(175),char(109),char(1),char(170),char(123),char(102),char(101),char(121), +char(121),char(101),char(101),char(124),char(109),char(65),char(51),char(51),char(66),char(60), +char(57),char(52),char(64),char(6),char(217),char(16),char(42),char(120),char(31),char(12), +char(24),char(105),char(68),char(249),char(39),char(156),char(103),char(73),char(168),char(155), +char(1),char(76),char(16),char(6),char(68),char(130),char(122),char(52),char(32),char(127), +char(43),char(51),char(174),char(192),char(253),char(20),char(117),char(170),char(153),char(99), +char(7),char(7),char(109),char(115),char(90),char(94),char(5),char(61),char(98),char(119), +char(116),char(99),char(98),char(115),char(119),char(94),char(56),char(61),char(61),char(56), +char(56),char(61),char(61),char(0),char(255),char(255),char(255),char(254),char(0),char(0), +char(6),char(129),char(7),char(115),char(2),char(38),char(0),char(136),char(0),char(0), +char(1),char(7),char(0),char(118),char(2),char(76),char(1),char(82),char(0),char(8), +char(179),char(2),char(29),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(94),char(255),char(236),char(6),char(115),char(6),char(33),char(2),char(38), +char(0),char(168),char(0),char(0),char(1),char(7),char(0),char(118),char(1),char(133), +char(0),char(0),char(0),char(8),char(179),char(3),char(69),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(125),char(255),char(195),char(5),char(190), +char(7),char(115),char(2),char(38),char(0),char(154),char(0),char(0),char(1),char(7), +char(0),char(118),char(1),char(25),char(1),char(82),char(0),char(8),char(179),char(3), +char(45),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115), +char(255),char(188),char(4),char(98),char(6),char(33),char(2),char(38),char(0),char(186), +char(0),char(0),char(1),char(6),char(0),char(118),char(86),char(0),char(0),char(8), +char(179),char(3),char(45),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(106),char(254),char(59),char(4),char(2),char(5),char(203),char(2),char(38), +char(0),char(54),char(0),char(0),char(0),char(6),char(2),char(57),char(6),char(0), +char(255),char(255),char(0),char(106),char(254),char(59),char(3),char(115),char(4),char(92), +char(2),char(38),char(0),char(86),char(0),char(0),char(0),char(6),char(2),char(57), +char(185),char(0),char(0),char(1),char(1),char(12),char(4),char(217),char(3),char(174), +char(6),char(33),char(0),char(14),char(0),char(24),char(64),char(9),char(7),char(0), +char(16),char(15),char(11),char(4),char(128),char(14),char(9),char(0),char(47),char(51), +char(26),char(205),char(50),char(17),char(18),char(1),char(57),char(57),char(49),char(48), +char(1),char(54),char(54),char(55),char(51),char(22),char(22),char(23),char(21),char(35), +char(38),char(39),char(6),char(7),char(35),char(1),char(12),char(127),char(102),char(23), +char(166),char(22),char(109),char(125),char(119),char(88),char(133),char(136),char(83),char(115), +char(4),char(240),char(136),char(128),char(41),char(42),char(133),char(130),char(23),char(55), +char(131),char(134),char(52),char(0),char(0),char(1),char(1),char(12),char(4),char(217), +char(3),char(174),char(6),char(33),char(0),char(14),char(0),char(24),char(64),char(9), +char(6),char(0),char(16),char(15),char(5),char(1),char(128),char(3),char(11),char(0), +char(47),char(51),char(26),char(205),char(50),char(17),char(18),char(1),char(57),char(57), +char(49),char(48),char(1),char(51),char(22),char(23),char(54),char(55),char(51),char(21), +char(7),char(6),char(7),char(35),char(38),char(38),char(39),char(1),char(12),char(115), +char(114),char(105),char(130),char(91),char(119),char(66),char(144),char(46),char(166),char(23), +char(102),char(127),char(6),char(33),char(74),char(115),char(130),char(59),char(25),char(68), +char(148),char(87),char(41),char(126),char(136),char(0),char(0),char(1),char(1),char(45), +char(4),char(217),char(3),char(133),char(5),char(98),char(0),char(3),char(0),char(17), +char(181),char(0),char(1),char(4),char(5),char(0),char(3),char(0),char(47),char(51), +char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(1),char(33),char(21), +char(33),char(1),char(45),char(2),char(88),char(253),char(168),char(5),char(98),char(137), +char(0),char(1),char(1),char(37),char(4),char(217),char(3),char(145),char(5),char(229), +char(0),char(14),char(0),char(24),char(64),char(9),char(12),char(3),char(16),char(15), +char(11),char(4),char(128),char(8),char(0),char(0),char(47),char(50),char(26),char(204), +char(50),char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(1),char(34), +char(38),char(39),char(51),char(30),char(2),char(51),char(50),char(54),char(55),char(51), +char(6),char(6),char(2),char(86),char(140),char(156),char(9),char(104),char(6),char(41), +char(73),char(85),char(101),char(96),char(10),char(104),char(10),char(167),char(4),char(217), +char(137),char(131),char(49),char(56),char(26),char(64),char(67),char(126),char(142),char(0), +char(0),char(1),char(0),char(162),char(5),char(2),char(1),char(102),char(5),char(223), +char(0),char(11),char(0),char(19),char(182),char(6),char(0),char(0),char(12),char(13), +char(3),char(9),char(0),char(47),char(205),char(17),char(18),char(1),char(57),char(17), +char(51),char(49),char(48),char(19),char(52),char(54),char(51),char(50),char(22),char(21), +char(20),char(6),char(35),char(34),char(38),char(162),char(56),char(42),char(40),char(58), +char(58),char(40),char(42),char(56),char(5),char(113),char(57),char(53),char(54),char(56), +char(56),char(55),char(55),char(0),char(0),char(2),char(1),char(111),char(4),char(217), +char(3),char(45),char(6),char(133),char(0),char(11),char(0),char(23),char(0),char(30), +char(64),char(12),char(18),char(6),char(12),char(0),char(6),char(0),char(24),char(25), +char(15),char(9),char(21),char(3),char(0),char(47),char(51),char(204),char(50),char(17), +char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(20),char(6),char(35),char(34),char(38),char(53),char(52),char(54),char(51), +char(50),char(22),char(7),char(52),char(38),char(35),char(34),char(6),char(21),char(20), +char(22),char(51),char(50),char(54),char(3),char(45),char(123),char(102),char(101),char(120), +char(121),char(100),char(101),char(124),char(108),char(66),char(51),char(51),char(66),char(60), +char(57),char(52),char(65),char(5),char(178),char(98),char(119),char(117),char(98),char(98), +char(115),char(119),char(94),char(56),char(61),char(61),char(56),char(56),char(61),char(61), +char(0),char(1),char(0),char(37),char(254),char(66),char(1),char(113),char(0),char(0), +char(0),char(15),char(0),char(24),char(64),char(10),char(0),char(9),char(4),char(13), +char(9),char(3),char(16),char(17),char(2),char(7),char(0),char(47),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(49),char(48),char(23),char(20), +char(51),char(50),char(55),char(21),char(6),char(35),char(34),char(53),char(52),char(54), +char(55),char(51),char(6),char(6),char(178),char(94),char(42),char(55),char(65),char(60), +char(207),char(86),char(72),char(120),char(68),char(69),char(238),char(94),char(13),char(109), +char(18),char(188),char(70),char(135),char(53),char(66),char(109),char(0),char(0),char(1), +char(1),char(8),char(4),char(217),char(3),char(240),char(5),char(221),char(0),char(23), +char(0),char(36),char(64),char(15),char(9),char(21),char(24),char(25),char(17),char(0), +char(5),char(12),char(0),char(12),char(0),char(12),char(21),char(128),char(9),char(0), +char(47),char(26),char(204),char(57),char(57),char(47),char(47),char(17),char(51),char(17), +char(51),char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(1),char(34), +char(46),char(2),char(35),char(34),char(6),char(7),char(35),char(54),char(54),char(51), +char(50),char(30),char(2),char(51),char(50),char(54),char(55),char(51),char(6),char(6), +char(3),char(20),char(43),char(82),char(79),char(73),char(34),char(50),char(51),char(14), +char(98),char(13),char(115),char(91),char(46),char(86),char(78),char(72),char(32),char(49), +char(48),char(15),char(99),char(13),char(113),char(4),char(219),char(37),char(45),char(37), +char(60),char(61),char(121),char(137),char(37),char(45),char(37),char(59),char(62),char(121), +char(137),char(0),char(0),char(2),char(0),char(231),char(4),char(217),char(3),char(182), +char(6),char(33),char(0),char(9),char(0),char(19),char(0),char(27),char(64),char(12), +char(14),char(5),char(19),char(9),char(4),char(20),char(21),char(13),char(4),char(128), +char(19),char(9),char(0),char(47),char(51),char(26),char(205),char(50),char(17),char(18), +char(1),char(23),char(57),char(49),char(48),char(19),char(54),char(54),char(55),char(51), +char(21),char(6),char(6),char(7),char(35),char(37),char(54),char(54),char(55),char(51), +char(21),char(6),char(6),char(7),char(35),char(231),char(36),char(110),char(31),char(186), +char(37),char(171),char(58),char(97),char(1),char(101),char(49),char(101),char(26),char(186), +char(37),char(171),char(58),char(96),char(4),char(242),char(48),char(186),char(69),char(21), +char(63),char(196),char(48),char(25),char(68),char(177),char(58),char(21),char(63),char(196), +char(48),char(0),char(0),char(1),char(1),char(252),char(4),char(217),char(3),char(16), +char(6),char(115),char(0),char(9),char(0),char(19),char(182),char(4),char(0),char(11), +char(10),char(4),char(128),char(9),char(0),char(47),char(26),char(205),char(17),char(18), +char(1),char(57),char(57),char(49),char(48),char(1),char(54),char(54),char(55),char(51), +char(21),char(6),char(6),char(7),char(35),char(1),char(252),char(27),char(53),char(12), +char(184),char(18),char(109),char(49),char(100),char(4),char(246),char(72),char(227),char(82), +char(23),char(74),char(237),char(76),char(0),char(3),char(1),char(27),char(5),char(14), +char(3),char(131),char(6),char(180),char(0),char(8),char(0),char(20),char(0),char(32), +char(0),char(43),char(64),char(20),char(15),char(9),char(21),char(27),char(27),char(3), +char(8),char(9),char(4),char(33),char(34),char(24),char(12),char(8),char(12),char(8), +char(12),char(3),char(30),char(18),char(0),char(47),char(51),char(204),char(57),char(57), +char(47),char(47),char(17),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(54),char(55),char(51),char(21), +char(6),char(6),char(7),char(35),char(39),char(52),char(54),char(51),char(50),char(22), +char(21),char(20),char(6),char(35),char(34),char(38),char(37),char(52),char(54),char(51), +char(50),char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(2),char(0), +char(65),char(31),char(189),char(33),char(121),char(51),char(80),char(229),char(52),char(38), +char(41),char(49),char(55),char(35),char(38),char(52),char(1),char(180),char(52),char(38), +char(41),char(49),char(55),char(35),char(38),char(52),char(5),char(133),char(169),char(134), +char(20),char(67),char(179),char(61),char(4),char(52),char(46),char(52),char(46),char(50), +char(49),char(49),char(50),char(52),char(46),char(52),char(46),char(50),char(49),char(49), +char(255),char(255),char(0),char(0),char(0),char(0),char(5),char(16),char(6),char(10), +char(2),char(38),char(0),char(36),char(0),char(0),char(1),char(7),char(1),char(84), +char(254),char(32),char(255),char(151),char(0),char(7),char(178),char(2),char(18),char(0), +char(0),char(63),char(53),char(0),char(255),char(255),char(0),char(152),char(2),char(76), +char(1),char(137),char(3),char(90),char(2),char(6),char(0),char(121),char(0),char(0), +char(255),char(255),char(255),char(212),char(0),char(0),char(4),char(117),char(6),char(10), +char(0),char(38),char(0),char(40),char(125),char(0),char(1),char(7),char(1),char(84), +char(253),char(216),char(255),char(151),char(0),char(7),char(178),char(1),char(16),char(0), +char(0),char(63),char(53),char(0),char(255),char(255),char(255),char(212),char(0),char(0), +char(5),char(181),char(6),char(10),char(0),char(39),char(0),char(43),char(0),char(150), +char(0),char(0),char(1),char(7),char(1),char(84),char(253),char(216),char(255),char(151), +char(0),char(7),char(178),char(1),char(16),char(0),char(0),char(63),char(53),char(0), +char(255),char(255),char(255),char(228),char(0),char(0),char(3),char(68),char(6),char(10), +char(0),char(39),char(0),char(44),char(0),char(238),char(0),char(0),char(1),char(7), +char(1),char(84),char(253),char(232),char(255),char(151),char(0),char(7),char(178),char(1), +char(16),char(0),char(0),char(63),char(53),char(0),char(255),char(255),char(255),char(228), +char(255),char(236),char(6),char(2),char(6),char(10),char(0),char(38),char(0),char(50), +char(68),char(0),char(1),char(7),char(1),char(84),char(253),char(232),char(255),char(151), +char(0),char(7),char(178),char(2),char(28),char(0),char(0),char(63),char(53),char(0), +char(255),char(255),char(255),char(212),char(0),char(0),char(5),char(133),char(6),char(10), +char(0),char(39),char(0),char(60),char(1),char(10),char(0),char(0),char(1),char(7), +char(1),char(84),char(253),char(216),char(255),char(151),char(0),char(7),char(178),char(1), +char(13),char(0),char(0),char(63),char(53),char(0),char(255),char(255),char(255),char(228), +char(0),char(0),char(6),char(51),char(6),char(10),char(0),char(38),char(1),char(118), +char(63),char(0),char(1),char(7),char(1),char(84),char(253),char(232),char(255),char(151), +char(0),char(7),char(178),char(1),char(35),char(0),char(0),char(63),char(53),char(0), +char(255),char(255),char(255),char(233),char(255),char(236),char(2),char(147),char(6),char(180), +char(2),char(38),char(1),char(134),char(0),char(0),char(1),char(7),char(1),char(85), +char(254),char(206),char(0),char(0),char(0),char(12),char(181),char(3),char(2),char(1), +char(46),char(17),char(38),char(0),char(43),char(53),char(53),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(5),char(16),char(5),char(188),char(2),char(6), +char(0),char(36),char(0),char(0),char(255),char(255),char(0),char(201),char(0),char(0), +char(4),char(190),char(5),char(182),char(2),char(6),char(0),char(37),char(0),char(0), +char(0),char(1),char(0),char(201),char(0),char(0),char(3),char(248),char(5),char(182), +char(0),char(5),char(0),char(29),char(64),char(14),char(3),char(4),char(4),char(0), +char(6),char(7),char(5),char(2),char(73),char(89),char(5),char(3),char(4),char(18), +char(0),char(63),char(63),char(43),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(49),char(48),char(1),char(21),char(33),char(17),char(35),char(17),char(3), +char(248),char(253),char(123),char(170),char(5),char(182),char(153),char(250),char(227),char(5), +char(182),char(0),char(255),char(255),char(0),char(39),char(0),char(0),char(4),char(109), +char(5),char(182),char(2),char(6),char(2),char(40),char(0),char(0),char(255),char(255), +char(0),char(201),char(0),char(0),char(3),char(248),char(5),char(182),char(2),char(6), +char(0),char(40),char(0),char(0),char(255),char(255),char(0),char(82),char(0),char(0), +char(4),char(63),char(5),char(182),char(2),char(6),char(0),char(61),char(0),char(0), +char(255),char(255),char(0),char(201),char(0),char(0),char(5),char(31),char(5),char(182), +char(2),char(6),char(0),char(43),char(0),char(0),char(0),char(3),char(0),char(125), +char(255),char(236),char(5),char(190),char(5),char(205),char(0),char(3),char(0),char(15), +char(0),char(27),char(0),char(63),char(64),char(32),char(2),char(3),char(16),char(22), +char(16),char(10),char(22),char(4),char(10),char(4),char(28),char(29),char(0),char(3), +char(73),char(89),char(0),char(0),char(7),char(13),char(13),char(25),char(73),char(89), +char(13),char(4),char(7),char(19),char(73),char(89),char(7),char(19),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(43),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17), +char(51),char(17),char(18),char(57),char(57),char(49),char(48),char(1),char(33),char(21), +char(33),char(37),char(16),char(0),char(33),char(32),char(0),char(17),char(16),char(0), +char(33),char(32),char(0),char(1),char(16),char(18),char(51),char(50),char(18),char(17), +char(16),char(2),char(35),char(34),char(2),char(1),char(227),char(2),char(117),char(253), +char(139),char(3),char(219),char(254),char(157),char(254),char(196),char(254),char(189),char(254), +char(161),char(1),char(96),char(1),char(68),char(1),char(59),char(1),char(98),char(251), +char(115),char(250),char(244),char(243),char(248),char(247),char(242),char(245),char(251),char(3), +char(51),char(149),char(63),char(254),char(161),char(254),char(110),char(1),char(139),char(1), +char(104),char(1),char(101),char(1),char(137),char(254),char(112),char(254),char(160),char(254), +char(216),char(254),char(204),char(1),char(48),char(1),char(44),char(1),char(42),char(1), +char(46),char(254),char(206),char(0),char(255),char(255),char(0),char(84),char(0),char(0), +char(2),char(86),char(5),char(182),char(2),char(6),char(0),char(44),char(0),char(0), +char(255),char(255),char(0),char(201),char(0),char(0),char(4),char(233),char(5),char(182), +char(2),char(6),char(0),char(46),char(0),char(0),char(0),char(1),char(0),char(0), +char(0),char(0),char(4),char(211),char(5),char(182),char(0),char(10),char(0),char(26), +char(64),char(11),char(8),char(0),char(12),char(11),char(4),char(8),char(9),char(3), +char(1),char(8),char(18),char(0),char(63),char(51),char(63),char(18),char(57),char(17), +char(18),char(1),char(57),char(57),char(49),char(48),char(33),char(35),char(1),char(38), +char(39),char(6),char(7),char(1),char(35),char(1),char(51),char(4),char(211),char(182), +char(254),char(182),char(87),char(22),char(33),char(71),char(254),char(184),char(182),char(2), +char(16),char(177),char(3),char(160),char(252),char(90),char(139),char(201),char(252),char(94), +char(5),char(182),char(255),char(255),char(0),char(201),char(0),char(0),char(6),char(113), +char(5),char(182),char(2),char(6),char(0),char(48),char(0),char(0),char(255),char(255), +char(0),char(201),char(0),char(0),char(5),char(63),char(5),char(182),char(2),char(6), +char(0),char(49),char(0),char(0),char(0),char(3),char(0),char(72),char(0),char(0), +char(4),char(37),char(5),char(182),char(0),char(3),char(0),char(7),char(0),char(11), +char(0),char(52),char(64),char(29),char(10),char(7),char(3),char(2),char(6),char(8), +char(6),char(13),char(12),char(0),char(3),char(73),char(89),char(0),char(0),char(10), +char(4),char(10),char(11),char(73),char(89),char(10),char(18),char(4),char(7),char(73), +char(89),char(4),char(3),char(0),char(63),char(43),char(0),char(24),char(63),char(43), +char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18),char(1), +char(23),char(57),char(49),char(48),char(19),char(33),char(21),char(33),char(3),char(33), +char(21),char(33),char(1),char(21),char(33),char(53),char(195),char(2),char(231),char(253), +char(25),char(82),char(3),char(139),char(252),char(117),char(3),char(180),char(252),char(35), +char(3),char(72),char(150),char(3),char(4),char(151),char(251),char(121),char(152),char(152), +char(255),char(255),char(0),char(125),char(255),char(236),char(5),char(190),char(5),char(205), +char(2),char(6),char(0),char(50),char(0),char(0),char(0),char(1),char(0),char(201), +char(0),char(0),char(5),char(12),char(5),char(182),char(0),char(7),char(0),char(35), +char(64),char(17),char(1),char(0),char(4),char(5),char(0),char(5),char(9),char(8), +char(6),char(3),char(73),char(89),char(6),char(3),char(1),char(5),char(18),char(0), +char(63),char(51),char(63),char(43),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(17),char(51),char(49),char(48),char(33),char(35),char(17),char(33),char(17), +char(35),char(17),char(33),char(5),char(12),char(170),char(253),char(17),char(170),char(4), +char(67),char(5),char(31),char(250),char(225),char(5),char(182),char(0),char(255),char(255), +char(0),char(201),char(0),char(0),char(4),char(104),char(5),char(182),char(2),char(6), +char(0),char(51),char(0),char(0),char(0),char(1),char(0),char(74),char(0),char(0), +char(4),char(92),char(5),char(182),char(0),char(12),char(0),char(53),char(64),char(28), +char(8),char(10),char(10),char(0),char(9),char(2),char(11),char(6),char(3),char(2), +char(0),char(5),char(13),char(14),char(7),char(8),char(4),char(8),char(73),char(89), +char(4),char(3),char(0),char(10),char(73),char(89),char(0),char(18),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(0),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(51),char(53),char(1),char(1),char(53),char(33),char(21),char(33),char(39), +char(1),char(1),char(33),char(21),char(74),char(1),char(225),char(254),char(43),char(3), +char(203),char(253),char(92),char(96),char(1),char(204),char(254),char(31),char(3),char(84), +char(141),char(2),char(111),char(2),char(43),char(143),char(153),char(2),char(253),char(223), +char(253),char(154),char(152),char(0),char(255),char(255),char(0),char(18),char(0),char(0), +char(4),char(90),char(5),char(182),char(2),char(6),char(0),char(55),char(0),char(0), +char(255),char(255),char(0),char(0),char(0),char(0),char(4),char(123),char(5),char(182), +char(2),char(6),char(0),char(60),char(0),char(0),char(0),char(3),char(0),char(106), +char(255),char(236),char(5),char(248),char(5),char(203),char(0),char(25),char(0),char(34), +char(0),char(43),char(0),char(80),char(64),char(41),char(39),char(20),char(26),char(2), +char(13),char(13),char(43),char(25),char(14),char(30),char(7),char(7),char(14),char(20), +char(3),char(44),char(45),char(12),char(16),char(26),char(42),char(16),char(42),char(74), +char(89),char(34),char(36),char(24),char(36),char(74),char(89),char(2),char(24),char(16), +char(24),char(16),char(24),char(14),char(19),char(0),char(4),char(0),char(63),char(63), +char(57),char(57),char(47),char(47),char(17),char(51),char(43),char(17),char(0),char(51), +char(43),char(17),char(0),char(51),char(17),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(51),char(51),char(17),char(51),char(51), +char(17),char(51),char(49),char(48),char(1),char(51),char(21),char(51),char(50),char(22), +char(22),char(21),char(20),char(2),char(4),char(35),char(35),char(21),char(35),char(53), +char(35),char(34),char(36),char(2),char(53),char(52),char(54),char(54),char(51),char(51), +char(19),char(51),char(50),char(54),char(53),char(52),char(38),char(43),char(3),char(34), +char(6),char(21),char(20),char(22),char(51),char(51),char(2),char(219),char(172),char(70), +char(171),char(251),char(133),char(149),char(254),char(253),char(176),char(41),char(172),char(45), +char(176),char(254),char(254),char(146),char(135),char(252),char(171),char(67),char(172),char(25), +char(201),char(223),char(206),char(185),char(58),char(172),char(57),char(182),char(209),char(222), +char(202),char(24),char(5),char(203),char(180),char(136),char(248),char(159),char(166),char(254), +char(253),char(130),char(225),char(225),char(132),char(1),char(4),char(161),char(158),char(248), +char(139),char(252),char(69),char(219),char(195),char(185),char(210),char(212),char(183),char(197), +char(217),char(0),char(255),char(255),char(0),char(8),char(0),char(0),char(4),char(150), +char(5),char(182),char(2),char(6),char(0),char(59),char(0),char(0),char(0),char(1), +char(0),char(109),char(0),char(0),char(5),char(242),char(5),char(182),char(0),char(29), +char(0),char(62),char(64),char(31),char(10),char(7),char(17),char(0),char(0),char(14), +char(1),char(21),char(24),char(24),char(1),char(7),char(3),char(30),char(31),char(29), +char(3),char(13),char(3),char(73),char(89),char(17),char(13),char(13),char(1),char(22), +char(15),char(8),char(3),char(1),char(18),char(0),char(63),char(63),char(51),char(51), +char(18),char(57),char(47),char(51),char(43),char(17),char(0),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(33),char(35),char(17),char(35),char(34),char(38), +char(38),char(53),char(17),char(51),char(17),char(20),char(22),char(51),char(51),char(17), +char(51),char(17),char(51),char(50),char(54),char(53),char(17),char(51),char(17),char(20), +char(6),char(4),char(35),char(35),char(3),char(131),char(170),char(45),char(176),char(255), +char(144),char(174),char(207),char(212),char(27),char(170),char(29),char(211),char(207),char(176), +char(144),char(254),char(253),char(175),char(45),char(1),char(190),char(122),char(247),char(164), +char(1),char(227),char(254),char(33),char(188),char(201),char(3),char(100),char(252),char(156), +char(198),char(187),char(1),char(227),char(254),char(31),char(165),char(247),char(123),char(0), +char(0),char(1),char(0),char(80),char(0),char(0),char(5),char(244),char(5),char(205), +char(0),char(31),char(0),char(57),char(64),char(32),char(3),char(13),char(29),char(19), +char(24),char(19),char(22),char(25),char(7),char(10),char(13),char(8),char(8),char(32), +char(33),char(16),char(0),char(73),char(89),char(16),char(4),char(26),char(22),char(6), +char(9),char(8),char(9),char(73),char(89),char(25),char(8),char(18),char(0),char(63), +char(51),char(43),char(17),char(0),char(51),char(51),char(51),char(24),char(63),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(34),char(2),char(21),char(20),char(18),char(23),char(21),char(33), +char(53),char(33),char(38),char(2),char(53),char(16),char(0),char(33),char(32),char(0), +char(17),char(20),char(2),char(7),char(33),char(21),char(33),char(53),char(54),char(18), +char(53),char(52),char(2),char(3),char(33),char(238),char(250),char(173),char(180),char(253), +char(182),char(1),char(108),char(151),char(160),char(1),char(98),char(1),char(58),char(1), +char(59),char(1),char(98),char(158),char(151),char(1),char(107),char(253),char(182),char(183), +char(169),char(249),char(5),char(53),char(254),char(255),char(253),char(225),char(254),char(179), +char(132),char(133),char(152),char(118),char(1),char(94),char(203),char(1),char(54),char(1), +char(96),char(254),char(165),char(254),char(199),char(207),char(254),char(166),char(120),char(152), +char(133),char(134),char(1),char(78),char(222),char(252),char(1),char(2),char(255),char(255), +char(0),char(60),char(0),char(0),char(2),char(111),char(7),char(37),char(2),char(38), +char(0),char(44),char(0),char(0),char(1),char(7),char(0),char(106),char(255),char(7), +char(1),char(82),char(0),char(10),char(180),char(2),char(1),char(33),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(0),char(0),char(0), +char(4),char(123),char(7),char(37),char(2),char(38),char(0),char(60),char(0),char(0), +char(1),char(7),char(0),char(106),char(255),char(239),char(1),char(82),char(0),char(10), +char(180),char(2),char(1),char(30),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(199),char(6),char(115), +char(2),char(38),char(1),char(126),char(0),char(0),char(1),char(6),char(1),char(84), +char(29),char(0),char(0),char(8),char(179),char(2),char(52),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(90),char(255),char(236),char(3),char(135), +char(6),char(115),char(2),char(38),char(1),char(130),char(0),char(0),char(1),char(6), +char(1),char(84),char(200),char(0),char(0),char(8),char(179),char(1),char(47),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(176),char(254),char(20), +char(4),char(68),char(6),char(115),char(2),char(38),char(1),char(132),char(0),char(0), +char(1),char(6),char(1),char(84),char(59),char(0),char(0),char(8),char(179),char(1), +char(30),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(168), +char(255),char(236),char(2),char(147),char(6),char(115),char(2),char(38),char(1),char(134), +char(0),char(0),char(1),char(7),char(1),char(84),char(254),char(196),char(0),char(0), +char(0),char(8),char(179),char(1),char(25),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(164),char(255),char(236),char(4),char(113),char(6),char(180), +char(2),char(38),char(1),char(146),char(0),char(0),char(1),char(6),char(1),char(85), +char(59),char(0),char(0),char(12),char(181),char(3),char(2),char(1),char(52),char(17), +char(38),char(0),char(43),char(53),char(53),char(53),char(0),char(2),char(0),char(115), +char(255),char(236),char(4),char(199),char(4),char(92),char(0),char(11),char(0),char(42), +char(0),char(71),char(64),char(36),char(9),char(15),char(39),char(21),char(4),char(4), +char(29),char(34),char(29),char(15),char(3),char(43),char(44),char(24),char(15),char(39), +char(40),char(40),char(22),char(12),char(18),char(18),char(7),char(70),char(89),char(18), +char(16),char(31),char(0),char(12),char(0),char(70),char(89),char(36),char(12),char(22), +char(0),char(63),char(51),char(43),char(17),char(0),char(51),char(24),char(63),char(43), +char(17),char(18),char(0),char(57),char(57),char(17),char(51),char(24),char(63),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17), +char(51),char(49),char(48),char(37),char(50),char(54),char(53),char(53),char(52),char(38), +char(35),char(32),char(17),char(20),char(22),char(23),char(34),char(2),char(17),char(16), +char(18),char(51),char(50),char(22),char(23),char(51),char(54),char(55),char(51),char(6), +char(6),char(21),char(17),char(20),char(51),char(50),char(55),char(21),char(6),char(35), +char(34),char(38),char(39),char(35),char(6),char(6),char(2),char(80),char(169),char(150), +char(152),char(169),char(254),char(209),char(147),char(133),char(214),char(238),char(244),char(225), +char(121),char(161),char(54),char(12),char(24),char(41),char(129),char(21),char(28),char(84), +char(29),char(33),char(46),char(65),char(81),char(89),char(18),char(13),char(59),char(167), +char(119),char(195),char(218),char(15),char(229),char(199),char(254),char(80),char(212),char(212), +char(139),char(1),char(41),char(1),char(12),char(1),char(18),char(1),char(41),char(84), +char(84),char(92),char(56),char(66),char(246),char(116),char(254),char(73),char(114),char(10), +char(119),char(26),char(81),char(86),char(86),char(81),char(0),char(2),char(0),char(176), +char(254),char(20),char(4),char(168),char(6),char(31),char(0),char(19),char(0),char(41), +char(0),char(76),char(64),char(40),char(24),char(15),char(15),char(16),char(39),char(3), +char(30),char(8),char(8),char(3),char(5),char(34),char(16),char(5),char(42),char(43), +char(16),char(27),char(35),char(34),char(70),char(89),char(14),char(35),char(14),char(35), +char(11),char(0),char(11),char(27),char(70),char(89),char(11),char(22),char(0),char(20), +char(70),char(89),char(0),char(0),char(0),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(57),char(24),char(47),char(47),char(43), +char(0),char(24),char(63),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(50), +char(22),char(21),char(16),char(5),char(21),char(4),char(17),char(20),char(4),char(35), +char(34),char(38),char(39),char(17),char(35),char(17),char(52),char(54),char(23),char(34), +char(6),char(21),char(17),char(22),char(22),char(51),char(50),char(54),char(53),char(52), +char(38),char(35),char(35),char(53),char(51),char(50),char(54),char(53),char(52),char(38), +char(2),char(147),char(220),char(249),char(254),char(199),char(1),char(121),char(254),char(248), +char(238),char(109),char(160),char(79),char(166),char(253),char(228),char(158),char(157),char(93), +char(161),char(86),char(171),char(173),char(190),char(177),char(112),char(92),char(155),char(162), +char(156),char(6),char(31),char(208),char(183),char(254),char(218),char(51),char(8),char(42), +char(254),char(145),char(209),char(225),char(31),char(38),char(253),char(227),char(6),char(52), +char(225),char(246),char(140),char(172),char(165),char(252),char(137),char(49),char(37),char(150), +char(157),char(157),char(164),char(142),char(147),char(137),char(123),char(133),char(0),char(1), +char(0),char(10),char(254),char(20),char(4),char(14),char(4),char(72),char(0),char(18), +char(0),char(33),char(64),char(16),char(15),char(4),char(1),char(5),char(4),char(19), +char(20),char(10),char(9),char(9),char(1),char(14),char(5),char(15),char(1),char(27), +char(0),char(63),char(63),char(51),char(18),char(57),char(47),char(51),char(17),char(18), +char(1),char(23),char(57),char(49),char(48),char(1),char(35),char(52),char(18),char(55), +char(1),char(51),char(19),char(22),char(23),char(51),char(62),char(2),char(19),char(51), +char(1),char(6),char(2),char(2),char(20),char(180),char(64),char(43),char(254),char(63), +char(172),char(240),char(94),char(19),char(8),char(5),char(41),char(43),char(234),char(172), +char(254),char(107),char(48),char(53),char(254),char(20),char(96),char(1),char(38),char(114), +char(4),char(60),char(253),char(184),char(235),char(103),char(30),char(142),char(129),char(2), +char(109),char(251),char(211),char(124),char(254),char(220),char(0),char(2),char(0),char(113), +char(255),char(236),char(4),char(96),char(6),char(18),char(0),char(30),char(0),char(42), +char(0),char(59),char(64),char(32),char(37),char(28),char(16),char(3),char(31),char(22), +char(22),char(9),char(0),char(3),char(28),char(5),char(43),char(44),char(16),char(0), +char(34),char(3),char(25),char(6),char(25),char(40),char(70),char(89),char(25),char(22), +char(6),char(13),char(70),char(89),char(6),char(0),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(23),char(57),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(38),char(38),char(53),char(52),char(54),char(51),char(50),char(22), +char(23),char(7),char(38),char(38),char(35),char(34),char(6),char(21),char(20),char(22), +char(23),char(22),char(22),char(21),char(20),char(0),char(35),char(34),char(36),char(53), +char(52),char(18),char(1),char(52),char(38),char(39),char(6),char(6),char(21),char(20), +char(22),char(51),char(50),char(54),char(2),char(33),char(140),char(116),char(194),char(164), +char(103),char(189),char(126),char(72),char(112),char(159),char(81),char(85),char(97),char(107), +char(167),char(210),char(177),char(254),char(240),char(236),char(227),char(254),char(240),char(226), +char(2),char(97),char(123),char(141),char(206),char(191),char(178),char(147),char(162),char(174), +char(3),char(168),char(78),char(159),char(99),char(130),char(152),char(45),char(63),char(135), +char(62),char(44),char(79),char(66),char(71),char(111),char(91),char(115),char(241),char(164), +char(235),char(254),char(248),char(248),char(210),char(177),char(1),char(5),char(254),char(115), +char(128),char(183),char(74),char(53),char(217),char(160),char(144),char(171),char(186),char(0), +char(0),char(1),char(0),char(90),char(255),char(236),char(3),char(135),char(4),char(92), +char(0),char(37),char(0),char(77),char(64),char(43),char(4),char(16),char(35),char(23), +char(29),char(11),char(1),char(19),char(23),char(16),char(6),char(38),char(39),char(20), +char(37),char(2),char(37),char(2),char(70),char(89),char(15),char(37),char(31),char(37), +char(2),char(11),char(3),char(37),char(37),char(13),char(26),char(26),char(33),char(70), +char(89),char(26),char(16),char(13),char(7),char(70),char(89),char(13),char(22),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57), +char(24),char(47),char(95),char(94),char(93),char(43),char(17),char(18),char(0),char(57), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(21),char(35),char(32),char(21),char(20),char(22),char(51),char(50), +char(54),char(55),char(21),char(6),char(35),char(34),char(38),char(53),char(52),char(54), +char(55),char(53),char(38),char(38),char(53),char(52),char(54),char(51),char(50),char(22), +char(23),char(7),char(38),char(38),char(35),char(34),char(21),char(20),char(33),char(2), +char(203),char(148),char(254),char(201),char(147),char(146),char(84),char(166),char(100),char(137), +char(221),char(210),char(241),char(110),char(130),char(98),char(107),char(224),char(192),char(97), +char(165),char(100),char(63),char(94),char(130),char(79),char(250),char(1),char(61),char(2), +char(129),char(141),char(195),char(90),char(98),char(39),char(47),char(148),char(75),char(169), +char(148),char(98),char(131),char(41),char(11),char(28),char(127),char(92),char(133),char(158), +char(33),char(45),char(133),char(42),char(28),char(162),char(172),char(0),char(0),char(1), +char(0),char(115),char(254),char(111),char(3),char(160),char(6),char(20),char(0),char(32), +char(0),char(48),char(64),char(24),char(7),char(25),char(30),char(19),char(19),char(14), +char(14),char(3),char(0),char(25),char(4),char(33),char(34),char(17),char(35),char(30), +char(3),char(0),char(1),char(0),char(70),char(89),char(1),char(0),char(0),char(63), +char(43),char(17),char(0),char(51),char(51),char(24),char(63),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48), +char(19),char(53),char(33),char(21),char(6),char(0),char(2),char(21),char(20),char(22), +char(22),char(23),char(22),char(22),char(21),char(20),char(7),char(35),char(54),char(53), +char(52),char(38),char(39),char(38),char(38),char(53),char(52),char(62),char(2),char(55), +char(6),char(33),char(176),char(2),char(240),char(215),char(254),char(224),char(138),char(59), +char(125),char(172),char(149),char(136),char(127),char(166),char(125),char(111),char(143),char(203), +char(188),char(59),char(112),char(201),char(242),char(40),char(254),char(241),char(5),char(135), +char(141),char(129),char(180),char(254),char(189),char(254),char(223),char(166),char(98),char(118), +char(73),char(37),char(31),char(109),char(91),char(149),char(164),char(161),char(107),char(56), +char(61),char(26),char(36),char(219),char(194),char(114),char(208),char(195),char(229),char(218), +char(8),char(0),char(0),char(1),char(0),char(176),char(254),char(20),char(4),char(68), +char(4),char(92),char(0),char(20),char(0),char(47),char(64),char(24),char(0),char(20), +char(12),char(8),char(8),char(9),char(20),char(9),char(22),char(21),char(16),char(4), +char(70),char(89),char(16),char(16),char(12),char(9),char(10),char(15),char(9),char(21), +char(0),char(27),char(0),char(63),char(63),char(63),char(18),char(57),char(63),char(43), +char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(17),char(52),char(38),char(35),char(34),char(6), +char(21),char(17),char(35),char(17),char(51),char(23),char(51),char(54),char(54),char(51), +char(50),char(22),char(21),char(17),char(3),char(158),char(122),char(130),char(172),char(160), +char(166),char(135),char(27),char(8),char(51),char(184),char(113),char(198),char(200),char(254), +char(20),char(4),char(177),char(134),char(132),char(186),char(214),char(253),char(193),char(4), +char(72),char(150),char(81),char(89),char(191),char(210),char(251),char(73),char(0),char(3), +char(0),char(115),char(255),char(236),char(4),char(74),char(6),char(43),char(0),char(11), +char(0),char(18),char(0),char(25),char(0),char(73),char(64),char(39),char(22),char(16), +char(16),char(6),char(23),char(15),char(15),char(0),char(6),char(0),char(26),char(27), +char(22),char(16),char(70),char(89),char(15),char(22),char(191),char(22),char(2),char(11), +char(3),char(22),char(22),char(3),char(9),char(9),char(19),char(70),char(89),char(9), +char(1),char(3),char(12),char(70),char(89),char(3),char(22),char(0),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(95),char(94),char(93),char(43),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(16),char(2),char(35),char(34),char(2),char(17),char(16),char(18),char(51),char(50), +char(18),char(1),char(50),char(18),char(19),char(33),char(18),char(18),char(19),char(34), +char(2),char(3),char(33),char(2),char(2),char(4),char(74),char(244),char(250),char(240), +char(249),char(245),char(244),char(244),char(250),char(254),char(18),char(164),char(156),char(6), +char(253),char(121),char(4),char(150),char(167),char(161),char(150),char(10),char(2),char(133), +char(11),char(152),char(3),char(12),char(254),char(106),char(254),char(118),char(1),char(147), +char(1),char(141),char(1),char(151),char(1),char(136),char(254),char(107),char(251),char(225), +char(1),char(49),char(1),char(51),char(254),char(208),char(254),char(204),char(5),char(41), +char(254),char(225),char(254),char(231),char(1),char(25),char(1),char(31),char(0),char(1), +char(0),char(168),char(255),char(236),char(2),char(147),char(4),char(72),char(0),char(15), +char(0),char(31),char(64),char(14),char(1),char(14),char(7),char(14),char(17),char(16), +char(15),char(15),char(11),char(4),char(70),char(89),char(11),char(22),char(0),char(63), +char(43),char(0),char(24),char(63),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(49),char(48),char(1),char(17),char(20),char(22),char(51),char(50),char(54), +char(55),char(21),char(6),char(6),char(35),char(34),char(38),char(53),char(17),char(1), +char(78),char(73),char(87),char(37),char(101),char(27),char(31),char(105),char(50),char(160), +char(145),char(4),char(72),char(252),char(250),char(104),char(101),char(13),char(7),char(127), +char(13),char(17),char(168),char(169),char(3),char(11),char(255),char(255),char(0),char(176), +char(0),char(0),char(4),char(27),char(4),char(70),char(2),char(6),char(0),char(250), +char(0),char(0),char(0),char(1),char(255),char(242),char(255),char(236),char(4),char(70), +char(6),char(33),char(0),char(34),char(0),char(51),char(64),char(27),char(8),char(1), +char(21),char(3),char(36),char(0),char(0),char(35),char(24),char(19),char(70),char(89), +char(24),char(22),char(30),char(31),char(31),char(0),char(11),char(11),char(6),char(70), +char(89),char(11),char(1),char(0),char(21),char(0),char(63),char(63),char(43),char(17), +char(18),char(0),char(57),char(17),char(51),char(24),char(63),char(43),char(17),char(1), +char(51),char(17),char(18),char(23),char(57),char(49),char(48),char(35),char(1),char(39), +char(46),char(2),char(35),char(34),char(7),char(53),char(54),char(51),char(50),char(22), +char(22),char(23),char(1),char(22),char(22),char(51),char(50),char(55),char(21),char(6), +char(35),char(34),char(38),char(39),char(3),char(38),char(39),char(35),char(6),char(7), +char(3),char(14),char(1),char(217),char(58),char(30),char(50),char(67),char(49),char(58), +char(57),char(68),char(63),char(91),char(121),char(88),char(54),char(1),char(107),char(19), +char(42),char(35),char(27),char(33),char(48),char(61),char(74),char(83),char(29),char(156), +char(84),char(22),char(9),char(28),char(88),char(254),char(4),char(55),char(162),char(85), +char(70),char(36),char(13),char(133),char(17),char(60),char(130),char(152),char(252),char(12), +char(49),char(51),char(10),char(121),char(24),char(76),char(83),char(1),char(180),char(240), +char(96),char(116),char(209),char(253),char(182),char(0),char(255),char(255),char(0),char(176), +char(254),char(20),char(4),char(68),char(4),char(72),char(2),char(6),char(0),char(119), +char(0),char(0),char(0),char(1),char(0),char(0),char(0),char(0),char(4),char(2), +char(4),char(72),char(0),char(14),char(0),char(28),char(64),char(12),char(9),char(10), +char(10),char(0),char(16),char(15),char(5),char(14),char(21),char(9),char(0),char(15), +char(0),char(63),char(50),char(63),char(57),char(17),char(18),char(1),char(57),char(57), +char(17),char(51),char(49),char(48),char(17),char(51),char(19),char(22),char(22),char(23), +char(51),char(54),char(18),char(17),char(51),char(16),char(2),char(7),char(35),char(172), +char(219),char(26),char(83),char(16),char(8),char(177),char(159),char(166),char(207),char(225), +char(186),char(4),char(72),char(253),char(178),char(67),char(238),char(62),char(175),char(1), +char(189),char(1),char(81),char(254),char(149),char(254),char(4),char(225),char(0),char(1), +char(0),char(113),char(254),char(111),char(3),char(160),char(6),char(20),char(0),char(49), +char(0),char(73),char(64),char(39),char(4),char(25),char(45),char(31),char(29),char(28), +char(19),char(12),char(12),char(40),char(0),char(28),char(31),char(37),char(25),char(7), +char(50),char(51),char(28),char(48),char(1),char(48),char(1),char(71),char(89),char(48), +char(48),char(16),char(38),char(41),char(37),char(38),char(37),char(70),char(89),char(38), +char(0),char(16),char(35),char(0),char(63),char(63),char(43),char(17),char(0),char(51), +char(17),char(18),char(57),char(24),char(47),char(43),char(17),char(18),char(0),char(57), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(35),char(34),char(6),char(21), +char(20),char(30),char(2),char(23),char(22),char(22),char(21),char(20),char(6),char(7), +char(35),char(54),char(54),char(53),char(52),char(38),char(39),char(38),char(38),char(53), +char(52),char(54),char(55),char(53),char(38),char(53),char(52),char(54),char(55),char(6), +char(35),char(35),char(53),char(33),char(21),char(35),char(34),char(6),char(6),char(21), +char(20),char(22),char(51),char(51),char(3),char(86),char(178),char(176),char(213),char(50), +char(95),char(135),char(84),char(142),char(135),char(54),char(67),char(156),char(53),char(66), +char(115),char(143),char(200),char(199),char(158),char(128),char(217),char(139),char(166),char(128), +char(115),char(68),char(2),char(186),char(51),char(130),char(224),char(127),char(167),char(175), +char(170),char(2),char(242),char(178),char(142),char(80),char(98),char(61),char(36),char(18), +char(29),char(110),char(90),char(65),char(149),char(99),char(71),char(147),char(52),char(55), +char(61),char(25),char(34),char(200),char(176),char(140),char(210),char(39),char(12),char(64), +char(217),char(117),char(158),char(50),char(12),char(141),char(131),char(80),char(144),char(95), +char(115),char(108),char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98), +char(4),char(92),char(2),char(6),char(0),char(82),char(0),char(0),char(0),char(1), +char(0),char(25),char(255),char(236),char(4),char(244),char(4),char(72),char(0),char(21), +char(0),char(54),char(64),char(29),char(10),char(11),char(7),char(19),char(16),char(3), +char(19),char(11),char(13),char(5),char(22),char(23),char(18),char(9),char(13),char(15), +char(13),char(70),char(89),char(15),char(15),char(11),char(21),char(5),char(0),char(70), +char(89),char(5),char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(63), +char(43),char(17),char(0),char(51),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(50),char(55),char(21), +char(6),char(35),char(34),char(53),char(17),char(33),char(17),char(35),char(17),char(35), +char(53),char(55),char(33),char(21),char(35),char(17),char(20),char(22),char(4),char(125), +char(38),char(48),char(43),char(84),char(219),char(254),char(35),char(166),char(221),char(143), +char(4),char(76),char(213),char(51),char(117),char(18),char(131),char(24),char(253),char(2), +char(209),char(252),char(70),char(3),char(186),char(74),char(68),char(142),char(253),char(60), +char(74),char(55),char(0),char(2),char(0),char(166),char(254),char(20),char(4),char(98), +char(4),char(92),char(0),char(16),char(0),char(28),char(0),char(54),char(64),char(27), +char(21),char(9),char(9),char(10),char(26),char(0),char(10),char(0),char(29),char(30), +char(6),char(3),char(14),char(14),char(17),char(70),char(89),char(14),char(16),char(10), +char(27),char(3),char(23),char(70),char(89),char(3),char(22),char(0),char(63),char(43), +char(0),char(24),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(17), +char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(16),char(0),char(35),char(34),char(39),char(35),char(22), +char(21),char(17),char(35),char(17),char(16),char(18),char(51),char(50),char(18),char(37), +char(34),char(6),char(21),char(17),char(22),char(51),char(50),char(54),char(53),char(52), +char(38),char(4),char(98),char(255),char(0),char(233),char(179),char(120),char(8),char(8), +char(168),char(251),char(234),char(219),char(252),char(254),char(33),char(158),char(151),char(122), +char(183),char(159),char(152),char(144),char(2),char(37),char(254),char(241),char(254),char(214), +char(94),char(61),char(212),char(254),char(219),char(4),char(31),char(1),char(10),char(1), +char(31),char(254),char(209),char(162),char(207),char(209),char(254),char(174),char(102),char(208), +char(222),char(214),char(212),char(0),char(0),char(1),char(0),char(115),char(254),char(111), +char(3),char(162),char(4),char(92),char(0),char(32),char(0),char(46),char(64),char(23), +char(14),char(7),char(0),char(21),char(21),char(7),char(27),char(3),char(34),char(33), +char(4),char(18),char(18),char(24),char(11),char(24),char(30),char(70),char(89),char(24), +char(16),char(11),char(35),char(0),char(63),char(63),char(43),char(17),char(18),char(0), +char(57),char(17),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(20),char(22),char(22),char(23),char(22), +char(22),char(21),char(20),char(6),char(7),char(35),char(54),char(54),char(53),char(52), +char(38),char(38),char(39),char(38),char(38),char(53),char(16),char(0),char(51),char(50), +char(22),char(23),char(7),char(38),char(35),char(34),char(6),char(1),char(31),char(59), +char(143),char(160),char(148),char(131),char(54),char(67),char(156),char(54),char(67),char(51), +char(110),char(97),char(204),char(195),char(1),char(20),char(248),char(79),char(158),char(54), +char(53),char(130),char(114),char(176),char(170),char(2),char(10),char(135),char(132),char(80), +char(34),char(32),char(107),char(90),char(66),char(152),char(95),char(70),char(148),char(50), +char(40),char(47),char(38),char(18),char(37),char(254),char(219),char(1),char(30),char(1), +char(54),char(33),char(24),char(141),char(51),char(218),char(0),char(2),char(0),char(115), +char(255),char(236),char(4),char(182),char(4),char(72),char(0),char(13),char(0),char(25), +char(0),char(48),char(64),char(25),char(20),char(0),char(14),char(7),char(7),char(12), +char(0),char(11),char(4),char(27),char(26),char(12),char(23),char(9),char(23),char(70), +char(89),char(9),char(15),char(4),char(17),char(70),char(89),char(4),char(22),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(0),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(20),char(6),char(6),char(35),char(34),char(0),char(53),char(16),char(33), +char(33),char(21),char(33),char(22),char(1),char(20),char(22),char(51),char(50),char(54), +char(53),char(16),char(39),char(35),char(34),char(6),char(4),char(96),char(123),char(229), +char(154),char(235),char(254),char(248),char(2),char(80),char(1),char(243),char(254),char(248), +char(178),char(252),char(191),char(170),char(161),char(159),char(171),char(174),char(65),char(222), +char(200),char(1),char(252),char(157),char(241),char(130),char(1),char(32),char(254),char(2), +char(62),char(142),char(167),char(254),char(247),char(194),char(209),char(197),char(182),char(1), +char(14),char(186),char(208),char(0),char(0),char(1),char(0),char(18),char(255),char(231), +char(3),char(147),char(4),char(72),char(0),char(19),char(0),char(44),char(64),char(23), +char(3),char(15),char(0),char(9),char(15),char(17),char(4),char(20),char(21),char(2), +char(17),char(19),char(17),char(70),char(89),char(19),char(15),char(12),char(5),char(70), +char(89),char(12),char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(43), +char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(49),char(48),char(1),char(21),char(33),char(17),char(20),char(51),char(50),char(54), +char(55),char(21),char(6),char(6),char(35),char(34),char(38),char(53),char(17),char(33), +char(53),char(55),char(3),char(147),char(254),char(80),char(205),char(47),char(98),char(27), +char(35),char(111),char(48),char(181),char(170),char(254),char(215),char(148),char(4),char(72), +char(142),char(253),char(150),char(223),char(13),char(7),char(125),char(15),char(18),char(170), +char(170),char(2),char(127),char(74),char(68),char(0),char(0),char(1),char(0),char(164), +char(255),char(236),char(4),char(113),char(4),char(72),char(0),char(21),char(0),char(37), +char(64),char(17),char(12),char(19),char(6),char(3),char(19),char(3),char(23),char(22), +char(15),char(4),char(15),char(0),char(9),char(70),char(89),char(0),char(22),char(0), +char(63),char(43),char(0),char(24),char(63),char(51),char(17),char(18),char(1),char(57), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(5),char(34),char(38), +char(17),char(17),char(51),char(17),char(20),char(22),char(51),char(50),char(54),char(53), +char(52),char(38),char(39),char(51),char(22),char(22),char(21),char(16),char(0),char(2), +char(115),char(231),char(232),char(166),char(158),char(153),char(167),char(161),char(28),char(34), +char(166),char(36),char(28),char(254),char(254),char(20),char(250),char(1),char(10),char(2), +char(88),char(253),char(176),char(192),char(195),char(238),char(251),char(130),char(224),char(136), +char(144),char(214),char(140),char(254),char(194),char(254),char(212),char(0),char(0),char(2), +char(0),char(115),char(254),char(20),char(5),char(76),char(4),char(92),char(0),char(24), +char(0),char(34),char(0),char(65),char(64),char(35),char(10),char(4),char(32),char(24), +char(24),char(12),char(0),char(25),char(19),char(19),char(0),char(7),char(4),char(4), +char(35),char(36),char(16),char(28),char(70),char(89),char(16),char(16),char(6),char(15), +char(32),char(12),char(1),char(12),char(70),char(89),char(23),char(1),char(22),char(0), +char(27),char(0),char(63),char(63),char(51),char(43),char(17),char(0),char(51),char(24), +char(63),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(17),char(36),char(0),char(17),char(16),char(55),char(23),char(6),char(6),char(21), +char(16),char(5),char(17),char(52),char(54),char(51),char(50),char(18),char(21),char(20), +char(2),char(6),char(7),char(17),char(1),char(52),char(38),char(35),char(34),char(6), +char(21),char(17),char(54),char(54),char(2),char(131),char(254),char(252),char(254),char(244), +char(207),char(131),char(89),char(81),char(1),char(104),char(166),char(149),char(180),char(218), +char(136),char(248),char(165),char(1),char(121),char(124),char(102),char(73),char(78),char(179), +char(198),char(254),char(20),char(1),char(218),char(11),char(1),char(35),char(1),char(15), +char(1),char(40),char(253),char(90),char(117),char(224),char(124),char(254),char(117),char(35), +char(2),char(108),char(187),char(190),char(254),char(219),char(250),char(178),char(254),char(251), +char(144),char(8),char(254),char(38),char(4),char(39),char(185),char(219),char(120),char(114), +char(253),char(146),char(16),char(236),char(0),char(1),char(255),char(236),char(254),char(20), +char(4),char(80),char(4),char(78),char(0),char(32),char(0),char(57),char(64),char(33), +char(14),char(7),char(8),char(5),char(21),char(24),char(30),char(7),char(34),char(23), +char(33),char(5),char(24),char(8),char(21),char(4),char(6),char(23),char(27),char(17), +char(12),char(70),char(89),char(17),char(27),char(6),char(15),char(0),char(28),char(70), +char(89),char(0),char(15),char(0),char(63),char(43),char(0),char(24),char(63),char(63), +char(43),char(0),char(24),char(63),char(18),char(23),char(57),char(17),char(1),char(51), +char(18),char(23),char(57),char(49),char(48),char(19),char(50),char(22),char(22),char(23), +char(19),char(1),char(51),char(1),char(19),char(22),char(22),char(51),char(50),char(55), +char(21),char(6),char(35),char(34),char(38),char(39),char(3),char(1),char(35),char(1), +char(3),char(38),char(38),char(35),char(34),char(7),char(53),char(54),char(178),char(54), +char(78),char(62),char(44),char(145),char(1),char(62),char(180),char(254),char(84),char(190), +char(48),char(82),char(63),char(45),char(45),char(60),char(59),char(115),char(141),char(59), +char(150),char(254),char(150),char(178),char(1),char(208),char(172),char(38),char(70),char(43), +char(37),char(27),char(49),char(4),char(78),char(43),char(91),char(112),char(254),char(143), +char(2),char(97),char(252),char(252),char(254),char(28),char(122),char(74),char(8),char(129), +char(15),char(118),char(159),char(1),char(131),char(253),char(104),char(3),char(68),char(1), +char(188),char(99),char(80),char(11),char(129),char(17),char(0),char(1),char(0),char(164), +char(254),char(20),char(5),char(135),char(6),char(18),char(0),char(26),char(0),char(61), +char(64),char(31),char(22),char(19),char(1),char(14),char(14),char(25),char(15),char(4), +char(10),char(10),char(15),char(19),char(3),char(27),char(28),char(26),char(0),char(7), +char(20),char(15),char(1),char(25),char(16),char(25),char(70),char(89),char(13),char(16), +char(22),char(15),char(27),char(0),char(63),char(63),char(51),char(43),char(17),char(0), +char(51),char(24),char(63),char(51),char(63),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(17),char(54),char(54),char(53),char(52),char(38),char(39),char(51), +char(18),char(21),char(16),char(0),char(5),char(17),char(35),char(17),char(36),char(0), +char(17),char(17),char(51),char(17),char(20),char(22),char(23),char(17),char(3),char(90), +char(188),char(203),char(26),char(37),char(166),char(63),char(254),char(227),char(254),char(240), +char(164),char(254),char(248),char(254),char(246),char(166),char(180),char(184),char(6),char(18), +char(250),char(105),char(15),char(231),char(204),char(120),char(235),char(168),char(254),char(240), +char(244),char(254),char(236),char(254),char(206),char(16),char(254),char(38),char(1),char(218), +char(9),char(1),char(34),char(1),char(16),char(2),char(31),char(253),char(219),char(195), +char(218),char(13),char(5),char(153),char(0),char(1),char(0),char(115),char(255),char(236), +char(5),char(188),char(4),char(72),char(0),char(39),char(0),char(61),char(64),char(30), +char(10),char(3),char(38),char(19),char(19),char(16),char(25),char(32),char(32),char(16), +char(3),char(3),char(40),char(41),char(38),char(17),char(17),char(0),char(28),char(6), +char(15),char(22),char(13),char(0),char(13),char(70),char(89),char(35),char(0),char(22), +char(0),char(63),char(50),char(43),char(17),char(0),char(51),char(24),char(63),char(51), +char(18),char(57),char(47),char(57),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(18),char(57),char(17),char(51),char(49),char(48),char(5), +char(34),char(2),char(53),char(52),char(18),char(55),char(51),char(6),char(6),char(21), +char(20),char(22),char(51),char(50),char(54),char(53),char(17),char(51),char(17),char(20), +char(22),char(51),char(50),char(54),char(53),char(52),char(2),char(39),char(51),char(22), +char(18),char(21),char(20),char(2),char(35),char(34),char(39),char(35),char(6),char(1), +char(244),char(182),char(203),char(55),char(68),char(172),char(68),char(57),char(120),char(107), +char(94),char(105),char(161),char(106),char(93),char(107),char(120),char(55),char(69),char(172), +char(65),char(57),char(203),char(182),char(220),char(68),char(9),char(65),char(20),char(1), +char(40),char(254),char(156),char(1),char(1),char(153),char(156),char(255),char(157),char(193), +char(216),char(143),char(125),char(1),char(55),char(254),char(201),char(128),char(140),char(216), +char(193),char(151),char(1),char(4),char(157),char(146),char(254),char(249),char(157),char(252), +char(254),char(214),char(182),char(182),char(255),char(255),char(0),char(9),char(255),char(236), +char(2),char(147),char(5),char(211),char(2),char(38),char(1),char(134),char(0),char(0), +char(1),char(7),char(0),char(106),char(254),char(212),char(0),char(0),char(0),char(10), +char(180),char(2),char(1),char(37),char(17),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(164),char(255),char(236),char(4),char(113),char(5),char(211), +char(2),char(38),char(1),char(146),char(0),char(0),char(1),char(6),char(0),char(106), +char(57),char(0),char(0),char(10),char(180),char(2),char(1),char(43),char(17),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(98),char(6),char(115),char(2),char(38),char(0),char(82),char(0),char(0), +char(1),char(6),char(1),char(84),char(33),char(0),char(0),char(8),char(179),char(2), +char(34),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(164), +char(255),char(236),char(4),char(113),char(6),char(115),char(2),char(38),char(1),char(146), +char(0),char(0),char(1),char(6),char(1),char(84),char(39),char(0),char(0),char(8), +char(179),char(1),char(31),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(5),char(188),char(6),char(115),char(2),char(38), +char(1),char(150),char(0),char(0),char(1),char(7),char(1),char(84),char(0),char(201), +char(0),char(0),char(0),char(8),char(179),char(1),char(49),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248), +char(7),char(37),char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7), +char(0),char(106),char(0),char(39),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(33),char(5),char(38),char(0),char(43),char(53),char(53),char(0),char(1), +char(0),char(18),char(255),char(236),char(5),char(66),char(5),char(182),char(0),char(29), +char(0),char(70),char(64),char(38),char(22),char(14),char(14),char(15),char(8),char(27), +char(27),char(20),char(2),char(15),char(17),char(5),char(30),char(31),char(22),char(13), +char(73),char(89),char(22),char(22),char(15),char(18),char(21),char(17),char(18),char(17), +char(73),char(89),char(18),char(3),char(15),char(18),char(0),char(5),char(73),char(89), +char(0),char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(43), +char(17),char(0),char(51),char(17),char(18),char(57),char(24),char(47),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(5),char(34),char(39),char(53),char(22),char(51),char(50),char(54), +char(53),char(53),char(52),char(38),char(35),char(33),char(17),char(35),char(17),char(33), +char(53),char(33),char(21),char(33),char(17),char(33),char(50),char(22),char(21),char(21), +char(20),char(6),char(3),char(207),char(96),char(54),char(55),char(91),char(101),char(104), +char(131),char(140),char(254),char(131),char(170),char(254),char(176),char(3),char(183),char(254), +char(67),char(1),char(140),char(205),char(221),char(196),char(20),char(22),char(150),char(19), +char(124),char(112),char(131),char(128),char(113),char(253),char(27),char(5),char(31),char(151), +char(151),char(254),char(94),char(191),char(178),char(143),char(190),char(211),char(255),char(255), +char(0),char(201),char(0),char(0),char(3),char(248),char(7),char(115),char(2),char(38), +char(1),char(97),char(0),char(0),char(1),char(7),char(0),char(118),char(0),char(90), +char(1),char(82),char(0),char(8),char(179),char(1),char(15),char(5),char(38),char(0), +char(43),char(53),char(0),char(1),char(0),char(125),char(255),char(236),char(4),char(227), +char(5),char(205),char(0),char(24),char(0),char(56),char(64),char(30),char(6),char(3), +char(17),char(22),char(12),char(5),char(17),char(4),char(25),char(26),char(3),char(6), +char(73),char(89),char(3),char(3),char(14),char(20),char(20),char(0),char(73),char(89), +char(20),char(4),char(14),char(9),char(73),char(89),char(14),char(19),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51), +char(49),char(48),char(1),char(34),char(4),char(7),char(33),char(21),char(33),char(18), +char(0),char(51),char(50),char(55),char(21),char(6),char(35),char(32),char(0),char(17), +char(16),char(0),char(33),char(50),char(23),char(7),char(38),char(3),char(66),char(226), +char(254),char(243),char(30),char(2),char(211),char(253),char(41),char(10),char(1),char(11), +char(249),char(162),char(201),char(161),char(226),char(254),char(180),char(254),char(162),char(1), +char(121),char(1),char(78),char(237),char(178),char(71),char(169),char(5),char(51),char(250), +char(241),char(150),char(254),char(238),char(254),char(227),char(55),char(149),char(57),char(1), +char(132),char(1),char(109),char(1),char(95),char(1),char(145),char(88),char(148),char(82), +char(255),char(255),char(0),char(106),char(255),char(236),char(4),char(2),char(5),char(203), +char(2),char(6),char(0),char(54),char(0),char(0),char(255),char(255),char(0),char(84), +char(0),char(0),char(2),char(86),char(5),char(182),char(2),char(6),char(0),char(44), +char(0),char(0),char(255),char(255),char(0),char(60),char(0),char(0),char(2),char(111), +char(7),char(37),char(2),char(38),char(0),char(44),char(0),char(0),char(1),char(7), +char(0),char(106),char(255),char(7),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(33),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(255),char(96),char(254),char(127),char(1),char(104),char(5),char(182),char(2),char(6), +char(0),char(45),char(0),char(0),char(0),char(2),char(0),char(0),char(255),char(233), +char(7),char(35),char(5),char(182),char(0),char(26),char(0),char(35),char(0),char(71), +char(64),char(38),char(24),char(27),char(27),char(4),char(31),char(0),char(0),char(4), +char(13),char(3),char(36),char(37),char(24),char(35),char(73),char(89),char(24),char(24), +char(11),char(22),char(22),char(6),char(73),char(89),char(22),char(3),char(11),char(16), +char(74),char(89),char(11),char(18),char(4),char(27),char(74),char(89),char(4),char(18), +char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(20),char(4),char(33),char(33),char(17),char(33),char(2),char(2), +char(6),char(6),char(35),char(34),char(39),char(53),char(22),char(51),char(50),char(62), +char(2),char(18),char(19),char(33),char(17),char(51),char(32),char(1),char(51),char(50), +char(54),char(53),char(52),char(38),char(35),char(35),char(7),char(35),char(254),char(237), +char(254),char(252),char(254),char(185),char(254),char(147),char(57),char(84),char(80),char(139), +char(107),char(69),char(64),char(50),char(63),char(48),char(65),char(43),char(55),char(68), +char(65),char(2),char(166),char(122),char(2),char(58),char(253),char(76),char(133),char(198), +char(183),char(192),char(220),char(102),char(1),char(170),char(206),char(220),char(5),char(31), +char(254),char(72),char(253),char(246),char(251),char(121),char(25),char(143),char(26),char(62), +char(103),char(250),char(1),char(190),char(1),char(226),char(253),char(144),char(253),char(77), +char(139),char(140),char(138),char(124),char(0),char(2),char(0),char(201),char(0),char(0), +char(7),char(84),char(5),char(182),char(0),char(17),char(0),char(26),char(0),char(74), +char(64),char(38),char(11),char(7),char(7),char(8),char(15),char(18),char(18),char(12), +char(4),char(22),char(0),char(0),char(4),char(8),char(3),char(27),char(28),char(26), +char(6),char(11),char(6),char(73),char(89),char(15),char(11),char(11),char(4),char(13), +char(9),char(3),char(8),char(18),char(4),char(18),char(74),char(89),char(4),char(18), +char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(18),char(57), +char(47),char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(20),char(4),char(33),char(33),char(17), +char(33),char(17),char(35),char(17),char(51),char(17),char(33),char(17),char(51),char(17), +char(51),char(32),char(1),char(51),char(50),char(54),char(53),char(52),char(38),char(35), +char(35),char(7),char(84),char(254),char(240),char(254),char(251),char(254),char(183),char(253), +char(125),char(170),char(170),char(2),char(131),char(172),char(121),char(2),char(57),char(253), +char(78),char(133),char(196),char(185),char(193),char(219),char(102),char(1),char(170),char(206), +char(220),char(2),char(176),char(253),char(80),char(5),char(182),char(253),char(146),char(2), +char(110),char(253),char(144),char(253),char(77),char(139),char(140),char(137),char(125),char(0), +char(0),char(1),char(0),char(18),char(0),char(0),char(5),char(66),char(5),char(182), +char(0),char(19),char(0),char(58),char(64),char(31),char(0),char(12),char(12),char(13), +char(6),char(5),char(5),char(18),char(13),char(15),char(4),char(20),char(21),char(19), +char(15),char(16),char(15),char(73),char(89),char(0),char(11),char(73),char(89),char(0), +char(0),char(13),char(16),char(3),char(6),char(13),char(18),char(0),char(63),char(51), +char(63),char(18),char(57),char(47),char(43),char(43),char(17),char(0),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(33),char(50),char(22),char(21),char(17),char(35),char(17), +char(52),char(38),char(35),char(33),char(17),char(35),char(17),char(33),char(53),char(33), +char(21),char(33),char(2),char(12),char(1),char(144),char(205),char(217),char(170),char(125), +char(140),char(254),char(125),char(170),char(254),char(176),char(3),char(246),char(254),char(4), +char(3),char(125),char(188),char(181),char(253),char(244),char(1),char(246),char(126),char(113), +char(253),char(27),char(5),char(31),char(151),char(151),char(255),char(255),char(0),char(201), +char(0),char(0),char(4),char(229),char(7),char(115),char(2),char(38),char(1),char(180), +char(0),char(0),char(1),char(7),char(0),char(118),char(0),char(162),char(1),char(82), +char(0),char(8),char(179),char(1),char(20),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(27),char(255),char(236),char(4),char(248),char(7),char(94), +char(2),char(38),char(1),char(189),char(0),char(0),char(1),char(7),char(2),char(54), +char(0),char(68),char(1),char(82),char(0),char(8),char(179),char(1),char(23),char(5), +char(38),char(0),char(43),char(53),char(0),char(1),char(0),char(201),char(254),char(131), +char(5),char(12),char(5),char(182),char(0),char(11),char(0),char(48),char(64),char(24), +char(8),char(5),char(2),char(3),char(9),char(0),char(0),char(3),char(5),char(3), +char(12),char(13),char(10),char(6),char(3),char(5),char(8),char(73),char(89),char(1), +char(5),char(18),char(3),char(34),char(0),char(63),char(63),char(51),char(43),char(0), +char(24),char(63),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(33),char(17),char(35), +char(17),char(33),char(17),char(51),char(17),char(33),char(17),char(51),char(5),char(12), +char(254),char(47),char(176),char(254),char(62),char(170),char(2),char(239),char(170),char(254), +char(131),char(1),char(125),char(5),char(182),char(250),char(228),char(5),char(28),char(0), +char(255),char(255),char(0),char(0),char(0),char(0),char(5),char(16),char(5),char(188), +char(2),char(6),char(0),char(36),char(0),char(0),char(0),char(2),char(0),char(201), +char(0),char(0),char(4),char(125),char(5),char(182),char(0),char(13),char(0),char(22), +char(0),char(61),char(64),char(32),char(18),char(0),char(9),char(14),char(14),char(4), +char(4),char(7),char(0),char(3),char(24),char(23),char(9),char(22),char(73),char(89), +char(9),char(9),char(4),char(5),char(5),char(8),char(73),char(89),char(5),char(3), +char(4),char(14),char(74),char(89),char(4),char(18),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(20),char(4),char(33),char(33),char(17),char(33), +char(21),char(33),char(17),char(51),char(50),char(22),char(22),char(1),char(51),char(50), +char(54),char(53),char(52),char(38),char(35),char(35),char(4),char(125),char(254),char(253), +char(254),char(251),char(254),char(84),char(3),char(94),char(253),char(76),char(227),char(193), +char(242),char(116),char(252),char(246),char(239),char(190),char(173),char(176),char(219),char(207), +char(1),char(170),char(218),char(208),char(5),char(182),char(151),char(254),char(39),char(89), +char(174),char(254),char(84),char(130),char(149),char(142),char(120),char(0),char(255),char(255), +char(0),char(201),char(0),char(0),char(4),char(190),char(5),char(182),char(2),char(6), +char(0),char(37),char(0),char(0),char(255),char(255),char(0),char(201),char(0),char(0), +char(3),char(248),char(5),char(182),char(2),char(6),char(1),char(97),char(0),char(0), +char(0),char(2),char(0),char(14),char(254),char(131),char(5),char(74),char(5),char(182), +char(0),char(13),char(0),char(19),char(0),char(67),char(64),char(36),char(4),char(5), +char(19),char(7),char(16),char(10),char(14),char(12),char(1),char(0),char(0),char(12), +char(10),char(7),char(5),char(5),char(20),char(21),char(10),char(16),char(73),char(89), +char(10),char(3),char(1),char(5),char(34),char(19),char(12),char(6),char(3),char(6), +char(73),char(89),char(3),char(18),char(0),char(63),char(43),char(17),char(0),char(51), +char(51),char(24),char(63),char(51),char(63),char(43),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(35),char(17),char(33),char(17),char(35),char(17), +char(51),char(18),char(18),char(19),char(33),char(17),char(51),char(33),char(17),char(33), +char(6),char(2),char(7),char(5),char(74),char(162),char(252),char(8),char(162),char(113), +char(154),char(219),char(12),char(2),char(145),char(185),char(254),char(157),char(254),char(179), +char(18),char(206),char(137),char(254),char(131),char(1),char(125),char(254),char(131),char(2), +char(23),char(1),char(3),char(2),char(230),char(1),char(51),char(250),char(228),char(4), +char(131),char(242),char(253),char(89),char(234),char(0),char(255),char(255),char(0),char(201), +char(0),char(0),char(3),char(248),char(5),char(182),char(2),char(6),char(0),char(40), +char(0),char(0),char(0),char(1),char(0),char(2),char(0),char(0),char(6),char(188), +char(5),char(182),char(0),char(17),char(0),char(60),char(64),char(31),char(6),char(13), +char(13),char(3),char(14),char(10),char(9),char(8),char(1),char(14),char(0),char(17), +char(7),char(18),char(19),char(15),char(12),char(9),char(6),char(3),char(0),char(0), +char(1),char(14),char(11),char(17),char(18),char(7),char(4),char(1),char(3),char(0), +char(63),char(51),char(51),char(63),char(51),char(51),char(18),char(57),char(17),char(51), +char(51),char(51),char(51),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(51),char(17),char(51),char(49),char(48),char(1),char(1),char(51),char(1), +char(17),char(51),char(17),char(1),char(51),char(1),char(1),char(35),char(1),char(17), +char(35),char(17),char(1),char(35),char(2),char(86),char(253),char(193),char(190),char(2), +char(57),char(164),char(2),char(58),char(190),char(253),char(192),char(2),char(82),char(196), +char(253),char(186),char(164),char(253),char(187),char(199),char(2),char(240),char(2),char(198), +char(253),char(60),char(2),char(196),char(253),char(60),char(2),char(196),char(253),char(60), +char(253),char(14),char(2),char(229),char(253),char(27),char(2),char(229),char(253),char(27), +char(0),char(1),char(0),char(74),char(255),char(236),char(4),char(53),char(5),char(203), +char(0),char(40),char(0),char(67),char(64),char(36),char(28),char(0),char(19),char(7), +char(7),char(0),char(3),char(23),char(35),char(12),char(6),char(41),char(42),char(3), +char(24),char(23),char(24),char(23),char(74),char(89),char(24),char(24),char(10),char(38), +char(38),char(31),char(74),char(89),char(38),char(4),char(10),char(16),char(74),char(89), +char(10),char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18),char(0),char(57), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(20),char(6),char(7),char(21),char(22),char(22),char(21),char(20), +char(4),char(33),char(34),char(39),char(53),char(22),char(22),char(51),char(50),char(54), +char(53),char(52),char(38),char(35),char(35),char(53),char(51),char(50),char(54),char(53), +char(52),char(38),char(35),char(34),char(6),char(7),char(39),char(54),char(54),char(51), +char(50),char(22),char(4),char(25),char(183),char(161),char(183),char(189),char(254),char(206), +char(254),char(233),char(255),char(163),char(96),char(223),char(103),char(198),char(203),char(225), +char(223),char(218),char(209),char(205),char(225),char(162),char(137),char(110),char(178),char(117), +char(84),char(101),char(251),char(135),char(225),char(255),char(4),char(96),char(144),char(180), +char(24),char(8),char(25),char(180),char(145),char(205),char(229),char(79),char(158),char(46), +char(50),char(150),char(141),char(134),char(138),char(143),char(147),char(132),char(107),char(128), +char(50),char(74),char(114),char(75),char(77),char(197),char(0),char(1),char(0),char(203), +char(0),char(0),char(5),char(82),char(5),char(182),char(0),char(15),char(0),char(52), +char(64),char(24),char(14),char(2),char(2),char(15),char(6),char(9),char(9),char(8), +char(15),char(8),char(16),char(17),char(5),char(4),char(12),char(13),char(4),char(13), +char(9),char(15),char(18),char(6),char(0),char(3),char(0),char(63),char(50),char(63), +char(51),char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(18),char(1), +char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(19),char(51),char(17),char(20),char(7),char(51),char(1),char(51), +char(17),char(35),char(17),char(52),char(55),char(35),char(1),char(35),char(203),char(159), +char(14),char(8),char(3),char(52),char(186),char(160),char(17),char(9),char(252),char(203), +char(186),char(5),char(182),char(252),char(211),char(225),char(182),char(4),char(196),char(250), +char(74),char(3),char(37),char(201),char(221),char(251),char(53),char(0),char(255),char(255), +char(0),char(203),char(0),char(0),char(5),char(82),char(7),char(94),char(2),char(38), +char(1),char(178),char(0),char(0),char(1),char(7),char(2),char(54),char(0),char(225), +char(1),char(82),char(0),char(8),char(179),char(1),char(16),char(5),char(38),char(0), +char(43),char(53),char(0),char(1),char(0),char(201),char(0),char(0),char(4),char(229), +char(5),char(182),char(0),char(10),char(0),char(45),char(64),char(22),char(7),char(3), +char(3),char(4),char(0),char(9),char(10),char(4),char(4),char(11),char(12),char(10), +char(7),char(2),char(7),char(4),char(8),char(5),char(3),char(1),char(4),char(18), +char(0),char(63),char(51),char(63),char(51),char(18),char(57),char(57),char(17),char(51), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49), +char(48),char(33),char(35),char(1),char(17),char(35),char(17),char(51),char(17),char(1), +char(51),char(1),char(4),char(229),char(206),char(253),char(92),char(170),char(170),char(2), +char(147),char(195),char(253),char(121),char(2),char(229),char(253),char(27),char(5),char(182), +char(253),char(60),char(2),char(196),char(253),char(58),char(0),char(1),char(0),char(0), +char(255),char(231),char(4),char(217),char(5),char(182),char(0),char(19),char(0),char(45), +char(64),char(24),char(3),char(18),char(1),char(0),char(0),char(18),char(10),char(3), +char(20),char(21),char(18),char(3),char(73),char(89),char(18),char(3),char(8),char(13), +char(74),char(89),char(8),char(19),char(1),char(18),char(0),char(63),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(49),char(48),char(33),char(35),char(17),char(33),char(7), +char(2),char(2),char(6),char(39),char(34),char(39),char(53),char(22),char(51),char(50), +char(54),char(54),char(18),char(19),char(33),char(4),char(217),char(170),char(254),char(37), +char(31),char(61),char(93),char(152),char(126),char(74),char(59),char(54),char(59),char(53), +char(79),char(61),char(93),char(56),char(3),char(18),char(5),char(31),char(240),char(254), +char(33),char(254),char(69),char(174),char(2),char(25),char(143),char(26),char(87),char(215), +char(2),char(89),char(1),char(184),char(255),char(255),char(0),char(201),char(0),char(0), +char(6),char(113),char(5),char(182),char(2),char(6),char(0),char(48),char(0),char(0), +char(255),char(255),char(0),char(201),char(0),char(0),char(5),char(31),char(5),char(182), +char(2),char(6),char(0),char(43),char(0),char(0),char(255),char(255),char(0),char(125), +char(255),char(236),char(5),char(190),char(5),char(205),char(2),char(6),char(0),char(50), +char(0),char(0),char(255),char(255),char(0),char(201),char(0),char(0),char(5),char(12), +char(5),char(182),char(2),char(6),char(1),char(110),char(0),char(0),char(255),char(255), +char(0),char(201),char(0),char(0),char(4),char(104),char(5),char(182),char(2),char(6), +char(0),char(51),char(0),char(0),char(255),char(255),char(0),char(125),char(255),char(236), +char(4),char(207),char(5),char(203),char(2),char(6),char(0),char(38),char(0),char(0), +char(255),char(255),char(0),char(18),char(0),char(0),char(4),char(90),char(5),char(182), +char(2),char(6),char(0),char(55),char(0),char(0),char(0),char(1),char(0),char(27), +char(255),char(236),char(4),char(248),char(5),char(182),char(0),char(22),char(0),char(42), +char(64),char(21),char(18),char(8),char(2),char(9),char(4),char(23),char(24),char(14), +char(13),char(8),char(13),char(0),char(17),char(9),char(3),char(0),char(5),char(73), +char(89),char(0),char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(51), +char(18),char(57),char(57),char(17),char(51),char(17),char(18),char(1),char(23),char(57), +char(49),char(48),char(5),char(34),char(39),char(53),char(22),char(51),char(50),char(54), +char(55),char(1),char(51),char(1),char(22),char(23),char(51),char(54),char(55),char(1), +char(51),char(1),char(14),char(2),char(1),char(37),char(111),char(84),char(93),char(96), +char(110),char(133),char(66),char(253),char(199),char(188),char(1),char(176),char(25),char(14), +char(8),char(28),char(11),char(1),char(103),char(180),char(254),char(45),char(84),char(135), +char(169),char(20),char(30),char(166),char(43),char(101),char(139),char(4),char(65),char(252), +char(193),char(49),char(47),char(84),char(22),char(3),char(53),char(251),char(234),char(187), +char(170),char(79),char(255),char(255),char(0),char(106),char(255),char(236),char(5),char(248), +char(5),char(203),char(2),char(6),char(1),char(115),char(0),char(0),char(255),char(255), +char(0),char(8),char(0),char(0),char(4),char(150),char(5),char(182),char(2),char(6), +char(0),char(59),char(0),char(0),char(0),char(1),char(0),char(201),char(254),char(131), +char(5),char(184),char(5),char(182),char(0),char(11),char(0),char(50),char(64),char(25), +char(8),char(5),char(9),char(0),char(3),char(2),char(2),char(0),char(5),char(3), +char(12),char(13),char(10),char(6),char(3),char(0),char(8),char(5),char(8),char(73), +char(89),char(5),char(18),char(3),char(34),char(0),char(63),char(63),char(43),char(17), +char(0),char(51),char(24),char(63),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(51), +char(17),char(35),char(17),char(33),char(17),char(51),char(17),char(33),char(17),char(51), +char(5),char(12),char(172),char(161),char(251),char(178),char(170),char(2),char(239),char(170), +char(154),char(253),char(233),char(1),char(125),char(5),char(182),char(250),char(228),char(5), +char(28),char(0),char(0),char(1),char(0),char(170),char(0),char(0),char(4),char(199), +char(5),char(182),char(0),char(19),char(0),char(45),char(64),char(22),char(11),char(8), +char(17),char(1),char(1),char(0),char(8),char(0),char(20),char(21),char(5),char(14), +char(73),char(89),char(5),char(5),char(1),char(18),char(9),char(3),char(1),char(18), +char(0),char(63),char(63),char(51),char(18),char(57),char(47),char(43),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(33),char(35),char(17),char(6),char(6),char(35),char(34),char(38),char(53), +char(17),char(51),char(17),char(20),char(22),char(51),char(50),char(54),char(55),char(17), +char(51),char(4),char(199),char(170),char(149),char(198),char(106),char(207),char(223),char(170), +char(127),char(143),char(97),char(177),char(169),char(170),char(2),char(92),char(53),char(39), +char(190),char(179),char(2),char(69),char(253),char(207),char(121),char(116),char(29),char(55), +char(2),char(202),char(0),char(1),char(0),char(201),char(0),char(0),char(7),char(121), +char(5),char(182),char(0),char(11),char(0),char(49),char(64),char(24),char(4),char(1), +char(8),char(5),char(9),char(0),char(0),char(5),char(1),char(3),char(12),char(13), +char(10),char(6),char(2),char(3),char(8),char(4),char(1),char(4),char(73),char(89), +char(1),char(18),char(0),char(63),char(43),char(17),char(0),char(51),char(24),char(63), +char(51),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(33),char(33),char(17),char(51),char(17), +char(33),char(17),char(51),char(17),char(33),char(17),char(51),char(7),char(121),char(249), +char(80),char(170),char(2),char(88),char(170),char(2),char(88),char(172),char(5),char(182), +char(250),char(228),char(5),char(28),char(250),char(228),char(5),char(28),char(0),char(1), +char(0),char(201),char(254),char(131),char(8),char(4),char(5),char(182),char(0),char(15), +char(0),char(59),char(64),char(30),char(3),char(0),char(7),char(4),char(8),char(11), +char(14),char(13),char(13),char(11),char(4),char(0),char(4),char(16),char(17),char(14), +char(34),char(9),char(5),char(1),char(3),char(11),char(7),char(3),char(0),char(3), +char(73),char(89),char(0),char(18),char(0),char(63),char(43),char(17),char(0),char(51), +char(51),char(24),char(63),char(51),char(51),char(63),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(51),char(17),char(51),char(17),char(33),char(17),char(51),char(17),char(33), +char(17),char(51),char(17),char(51),char(17),char(35),char(17),char(201),char(170),char(2), +char(71),char(172),char(2),char(72),char(170),char(172),char(162),char(5),char(182),char(250), +char(228),char(5),char(28),char(250),char(228),char(5),char(28),char(250),char(228),char(253), +char(233),char(1),char(125),char(0),char(0),char(2),char(0),char(18),char(0),char(0), +char(5),char(23),char(5),char(182),char(0),char(12),char(0),char(21),char(0),char(61), +char(64),char(32),char(9),char(13),char(13),char(4),char(17),char(0),char(0),char(4), +char(6),char(3),char(22),char(23),char(9),char(21),char(73),char(89),char(9),char(9), +char(4),char(7),char(7),char(6),char(73),char(89),char(7),char(3),char(4),char(13), +char(74),char(89),char(4),char(18),char(0),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(20),char(4),char(35),char(33),char(17),char(33),char(53),char(33), +char(17),char(51),char(32),char(4),char(1),char(51),char(50),char(54),char(53),char(52), +char(38),char(35),char(35),char(5),char(23),char(254),char(253),char(249),char(254),char(71), +char(254),char(176),char(1),char(250),char(244),char(1),char(5),char(1),char(18),char(252), +char(245),char(252),char(181),char(169),char(175),char(203),char(224),char(1),char(170),char(206), +char(220),char(5),char(31),char(151),char(253),char(144),char(205),char(254),char(26),char(139), +char(140),char(136),char(126),char(0),char(0),char(3),char(0),char(201),char(0),char(0), +char(6),char(10),char(5),char(182),char(0),char(10),char(0),char(19),char(0),char(23), +char(0),char(63),char(64),char(32),char(3),char(11),char(11),char(0),char(15),char(7), +char(21),char(20),char(20),char(7),char(0),char(3),char(24),char(25),char(21),char(18), +char(3),char(19),char(73),char(89),char(3),char(3),char(0),char(22),char(1),char(3), +char(0),char(11),char(74),char(89),char(0),char(18),char(0),char(63),char(43),char(0), +char(24),char(63),char(51),char(18),char(57),char(47),char(43),char(0),char(24),char(63), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(51),char(17),char(51),char(17),char(51), +char(32),char(4),char(21),char(20),char(4),char(35),char(37),char(51),char(50),char(54), +char(53),char(52),char(38),char(35),char(35),char(1),char(35),char(17),char(51),char(201), +char(170),char(239),char(1),char(5),char(1),char(18),char(254),char(253),char(249),char(254), +char(246),char(247),char(181),char(170),char(179),char(200),char(219),char(4),char(151),char(170), +char(170),char(5),char(182),char(253),char(144),char(205),char(207),char(206),char(220),char(145), +char(141),char(140),char(137),char(123),char(253),char(82),char(5),char(182),char(0),char(2), +char(0),char(201),char(0),char(0),char(4),char(186),char(5),char(182),char(0),char(10), +char(0),char(18),char(0),char(50),char(64),char(25),char(7),char(11),char(11),char(4), +char(14),char(0),char(4),char(0),char(19),char(20),char(7),char(18),char(73),char(89), +char(7),char(7),char(4),char(5),char(3),char(4),char(11),char(74),char(89),char(4), +char(18),char(0),char(63),char(43),char(0),char(24),char(63),char(18),char(57),char(47), +char(43),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(20),char(4),char(35),char(33),char(17), +char(51),char(17),char(33),char(32),char(4),char(1),char(33),char(32),char(17),char(52), +char(38),char(35),char(33),char(4),char(186),char(254),char(241),char(251),char(254),char(25), +char(170),char(1),char(35),char(1),char(11),char(1),char(25),char(252),char(185),char(1), +char(43),char(1),char(108),char(187),char(206),char(254),char(242),char(1),char(170),char(203), +char(223),char(5),char(182),char(253),char(144),char(211),char(254),char(32),char(1),char(23), +char(135),char(127),char(0),char(1),char(0),char(61),char(255),char(236),char(4),char(137), +char(5),char(203),char(0),char(26),char(0),char(58),char(64),char(31),char(24),char(21), +char(21),char(9),char(9),char(22),char(15),char(3),char(4),char(27),char(28),char(23), +char(22),char(73),char(89),char(23),char(23),char(12),char(5),char(12),char(18),char(73), +char(89),char(12),char(19),char(5),char(0),char(73),char(89),char(5),char(4),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57), +char(24),char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(34),char(7),char(39),char(54),char(51), +char(50),char(4),char(18),char(21),char(16),char(0),char(33),char(34),char(39),char(53), +char(22),char(22),char(51),char(32),char(0),char(19),char(33),char(53),char(33),char(38), +char(0),char(1),char(211),char(172),char(162),char(72),char(172),char(236),char(217),char(1), +char(57),char(162),char(254),char(148),char(254),char(170),char(227),char(156),char(83),char(172), +char(99),char(1),char(15),char(1),char(20),char(8),char(253),char(49),char(2),char(205), +char(22),char(254),char(241),char(5),char(51),char(76),char(144),char(84),char(176),char(254), +char(186),char(221),char(254),char(136),char(254),char(108),char(57),char(149),char(21),char(34), +char(1),char(33),char(1),char(16),char(152),char(229),char(1),char(2),char(0),char(2), +char(0),char(201),char(255),char(236),char(7),char(231),char(5),char(205),char(0),char(18), +char(0),char(30),char(0),char(71),char(64),char(38),char(12),char(8),char(8),char(9), +char(19),char(13),char(6),char(25),char(0),char(0),char(6),char(9),char(3),char(31), +char(32),char(16),char(28),char(73),char(89),char(16),char(4),char(12),char(7),char(73), +char(89),char(12),char(12),char(9),char(10),char(3),char(9),char(18),char(3),char(22), +char(73),char(89),char(3),char(19),char(0),char(63),char(43),char(0),char(24),char(63), +char(63),char(18),char(57),char(47),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(0),char(33),char(32), +char(0),char(3),char(33),char(17),char(35),char(17),char(51),char(17),char(33),char(18), +char(0),char(33),char(32),char(0),char(1),char(16),char(18),char(51),char(50),char(18), +char(17),char(16),char(2),char(35),char(34),char(2),char(7),char(231),char(254),char(171), +char(254),char(208),char(254),char(211),char(254),char(171),char(11),char(254),char(158),char(170), +char(170),char(1),char(100),char(23),char(1),char(81),char(1),char(31),char(1),char(51), +char(1),char(86),char(251),char(160),char(238),char(231),char(234),char(237),char(235),char(232), +char(233),char(240),char(2),char(221),char(254),char(158),char(254),char(113),char(1),char(111), +char(1),char(85),char(253),char(80),char(5),char(182),char(253),char(146),char(1),char(55), +char(1),char(78),char(254),char(111),char(254),char(161),char(254),char(216),char(254),char(204), +char(1),char(50),char(1),char(42),char(1),char(42),char(1),char(46),char(254),char(207), +char(0),char(2),char(0),char(51),char(0),char(0),char(4),char(78),char(5),char(182), +char(0),char(13),char(0),char(21),char(0),char(61),char(64),char(32),char(21),char(12), +char(12),char(11),char(18),char(6),char(2),char(6),char(3),char(11),char(4),char(23), +char(22),char(0),char(20),char(74),char(89),char(3),char(9),char(0),char(0),char(2), +char(9),char(9),char(15),char(74),char(89),char(9),char(3),char(12),char(2),char(18), +char(0),char(63),char(51),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(18),char(57),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(1),char(35), +char(1),char(38),char(38),char(53),char(52),char(36),char(33),char(33),char(17),char(35), +char(17),char(17),char(35),char(34),char(6),char(21),char(16),char(33),char(51),char(2), +char(123),char(254),char(129),char(201),char(1),char(154),char(161),char(146),char(1),char(15), +char(1),char(19),char(1),char(146),char(170),char(227),char(183),char(190),char(1),char(123), +char(221),char(2),char(98),char(253),char(158),char(2),char(127),char(51),char(207),char(158), +char(196),char(211),char(250),char(74),char(2),char(98),char(2),char(193),char(126),char(142), +char(254),char(221),char(255),char(255),char(0),char(94),char(255),char(236),char(3),char(205), +char(4),char(90),char(2),char(6),char(0),char(68),char(0),char(0),char(0),char(2), +char(0),char(119),char(255),char(236),char(4),char(84),char(6),char(33),char(0),char(23), +char(0),char(34),char(0),char(59),char(64),char(30),char(26),char(18),char(32),char(11), +char(0),char(0),char(6),char(18),char(3),char(36),char(35),char(12),char(11),char(15), +char(28),char(70),char(89),char(11),char(15),char(15),char(21),char(5),char(21),char(24), +char(70),char(89),char(21),char(22),char(5),char(1),char(0),char(63),char(63),char(43), +char(17),char(18),char(0),char(57),char(24),char(47),char(57),char(43),char(17),char(0), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(17), +char(51),char(49),char(48),char(19),char(16),char(18),char(55),char(36),char(55),char(23), +char(4),char(7),char(6),char(6),char(7),char(51),char(54),char(54),char(51),char(50), +char(18),char(21),char(16),char(0),char(35),char(34),char(0),char(5),char(32),char(17), +char(16),char(33),char(34),char(6),char(6),char(7),char(16),char(18),char(119),char(212), +char(230),char(1),char(30),char(218),char(31),char(254),char(165),char(149),char(145),char(145), +char(7),char(12),char(62),char(196),char(107),char(202),char(226),char(254),char(250),char(234), +char(231),char(254),char(250),char(1),char(252),char(1),char(49),char(254),char(235),char(76), +char(141),char(117),char(32),char(166),char(2),char(145),char(1),char(104),char(1),char(147), +char(50),char(61),char(38),char(146),char(58),char(34),char(33),char(246),char(212),char(84), +char(96),char(254),char(250),char(232),char(254),char(255),char(254),char(223),char(1),char(98), +char(215),char(1),char(133),char(1),char(115),char(63),char(104),char(55),char(254),char(249), +char(254),char(237),char(0),char(3),char(0),char(176),char(0),char(0),char(4),char(76), +char(4),char(72),char(0),char(14),char(0),char(22),char(0),char(31),char(0),char(73), +char(64),char(38),char(28),char(20),char(20),char(11),char(23),char(0),char(15),char(7), +char(7),char(0),char(3),char(11),char(4),char(32),char(33),char(4),char(28),char(19), +char(28),char(19),char(70),char(89),char(28),char(28),char(11),char(12),char(12),char(27), +char(70),char(89),char(12),char(15),char(11),char(20),char(70),char(89),char(11),char(21), +char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0), +char(57),char(24),char(47),char(43),char(17),char(18),char(0),char(57),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(20),char(6),char(7),char(21),char(22),char(22), +char(21),char(20),char(6),char(35),char(33),char(17),char(33),char(32),char(3),char(52), +char(38),char(35),char(33),char(17),char(33),char(32),char(3),char(52),char(38),char(35), +char(33),char(17),char(33),char(50),char(54),char(4),char(41),char(123),char(111),char(140), +char(129),char(225),char(216),char(254),char(29),char(1),char(225),char(1),char(152),char(131), +char(135),char(156),char(254),char(211),char(1),char(49),char(1),char(31),char(31),char(123), +char(125),char(254),char(199),char(1),char(25),char(154),char(126),char(3),char(53),char(107), +char(111),char(19),char(9),char(19),char(126),char(111),char(153),char(166),char(4),char(72), +char(253),char(2),char(89),char(81),char(254),char(151),char(2),char(154),char(80),char(67), +char(254),char(203),char(76),char(0),char(0),char(1),char(0),char(176),char(0),char(0), +char(3),char(68),char(4),char(72),char(0),char(5),char(0),char(29),char(64),char(14), +char(2),char(3),char(0),char(3),char(7),char(6),char(4),char(1),char(70),char(89), +char(4),char(15),char(3),char(21),char(0),char(63),char(63),char(43),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(49),char(48),char(1),char(33),char(17), +char(35),char(17),char(33),char(3),char(68),char(254),char(18),char(166),char(2),char(148), +char(3),char(186),char(252),char(70),char(4),char(72),char(0),char(2),char(0),char(41), +char(254),char(133),char(4),char(104),char(4),char(72),char(0),char(13),char(0),char(19), +char(0),char(67),char(64),char(36),char(4),char(5),char(19),char(7),char(16),char(10), +char(14),char(12),char(1),char(0),char(0),char(12),char(10),char(7),char(5),char(5), +char(20),char(21),char(10),char(16),char(71),char(89),char(10),char(15),char(1),char(5), +char(34),char(19),char(12),char(6),char(3),char(6),char(70),char(89),char(3),char(21), +char(0),char(63),char(43),char(17),char(0),char(51),char(51),char(24),char(63),char(51), +char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(35),char(17),char(33),char(17),char(35),char(17),char(51),char(54),char(18),char(19), +char(33),char(17),char(51),char(33),char(17),char(35),char(6),char(2),char(7),char(4), +char(104),char(161),char(253),char(2),char(160),char(86),char(134),char(152),char(3),char(2), +char(43),char(157),char(254),char(195),char(246),char(13),char(145),char(108),char(254),char(133), +char(1),char(123),char(254),char(133),char(2),char(10),char(182),char(1),char(234),char(1), +char(25),char(252),char(71),char(3),char(54),char(222),char(254),char(57),char(145),char(0), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(18),char(4),char(92), +char(2),char(6),char(0),char(72),char(0),char(0),char(0),char(1),char(0),char(4), +char(0),char(0),char(5),char(223),char(4),char(70),char(0),char(17),char(0),char(60), +char(64),char(31),char(2),char(9),char(9),char(17),char(10),char(6),char(4),char(5), +char(10),char(14),char(15),char(13),char(7),char(19),char(18),char(17),char(11),char(8), +char(5),char(2),char(14),char(14),char(13),char(3),char(0),char(15),char(15),char(10), +char(7),char(13),char(21),char(0),char(63),char(51),char(51),char(63),char(51),char(51), +char(18),char(57),char(17),char(51),char(51),char(51),char(51),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(51),char(17),char(51),char(49),char(48), +char(1),char(51),char(17),char(1),char(51),char(1),char(1),char(35),char(1),char(17), +char(35),char(17),char(1),char(35),char(1),char(1),char(51),char(1),char(2),char(164), +char(153),char(1),char(197),char(182),char(254),char(54),char(1),char(241),char(192),char(254), +char(30),char(153),char(254),char(31),char(191),char(1),char(240),char(254),char(55),char(182), +char(1),char(195),char(4),char(70),char(253),char(237),char(2),char(19),char(253),char(237), +char(253),char(205),char(2),char(43),char(253),char(213),char(2),char(43),char(253),char(213), +char(2),char(51),char(2),char(19),char(253),char(237),char(0),char(1),char(0),char(68), +char(255),char(236),char(3),char(127),char(4),char(92),char(0),char(34),char(0),char(77), +char(64),char(43),char(2),char(13),char(30),char(19),char(19),char(13),char(15),char(33), +char(8),char(24),char(6),char(35),char(36),char(16),char(34),char(33),char(34),char(33), +char(70),char(89),char(15),char(34),char(31),char(34),char(2),char(11),char(3),char(34), +char(34),char(22),char(10),char(22),char(27),char(70),char(89),char(22),char(22),char(10), +char(4),char(70),char(89),char(10),char(16),char(0),char(63),char(43),char(0),char(24), +char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(95),char(94), +char(93),char(43),char(17),char(18),char(0),char(57),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(32),char(53), +char(52),char(35),char(34),char(6),char(7),char(39),char(54),char(51),char(50),char(22), +char(21),char(20),char(7),char(21),char(22),char(22),char(21),char(20),char(6),char(35), +char(34),char(39),char(53),char(22),char(51),char(50),char(54),char(53),char(52),char(33), +char(35),char(53),char(1),char(129),char(1),char(55),char(252),char(77),char(126),char(102), +char(59),char(170),char(201),char(189),char(218),char(205),char(126),char(116),char(245),char(216), +char(237),char(129),char(183),char(187),char(144),char(147),char(254),char(201),char(152),char(2), +char(129),char(172),char(162),char(28),char(42),char(135),char(76),char(155),char(134),char(184), +char(57),char(8),char(37),char(137),char(103),char(152),char(169),char(71),char(152),char(86), +char(99),char(93),char(191),char(141),char(0),char(1),char(0),char(176),char(0),char(0), +char(4),char(98),char(4),char(72),char(0),char(13),char(0),char(52),char(64),char(25), +char(8),char(4),char(7),char(7),char(6),char(11),char(3),char(3),char(12),char(6), +char(12),char(15),char(14),char(3),char(10),char(12),char(4),char(13),char(15),char(12), +char(21),char(7),char(21),char(4),char(15),char(0),char(63),char(63),char(63),char(63), +char(17),char(18),char(57),char(57),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(51),char(49),char(48), +char(1),char(17),char(7),char(7),char(1),char(51),char(17),char(35),char(17),char(55), +char(55),char(1),char(35),char(17),char(1),char(76),char(7),char(3),char(2),char(81), +char(207),char(155),char(3),char(5),char(253),char(176),char(207),char(4),char(72),char(253), +char(73),char(182),char(57),char(3),char(166),char(251),char(184),char(2),char(158),char(132), +char(130),char(252),char(92),char(4),char(72),char(0),char(255),char(255),char(0),char(176), +char(0),char(0),char(4),char(98),char(6),char(12),char(2),char(38),char(1),char(210), +char(0),char(0),char(1),char(6),char(2),char(54),char(61),char(0),char(0),char(8), +char(179),char(1),char(14),char(17),char(38),char(0),char(43),char(53),char(0),char(1), +char(0),char(176),char(0),char(0),char(4),char(12),char(4),char(72),char(0),char(10), +char(0),char(45),char(64),char(22),char(10),char(6),char(6),char(7),char(3),char(1), +char(2),char(7),char(4),char(12),char(11),char(2),char(10),char(5),char(10),char(7), +char(0),char(8),char(15),char(4),char(7),char(21),char(0),char(63),char(51),char(63), +char(51),char(18),char(57),char(57),char(17),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(51),char(1), +char(1),char(35),char(1),char(17),char(35),char(17),char(51),char(17),char(3),char(47), +char(182),char(254),char(39),char(2),char(0),char(194),char(254),char(12),char(166),char(166), +char(4),char(72),char(253),char(239),char(253),char(201),char(2),char(43),char(253),char(213), +char(4),char(72),char(253),char(235),char(0),char(1),char(0),char(16),char(255),char(242), +char(3),char(225),char(4),char(72),char(0),char(16),char(0),char(45),char(64),char(24), +char(1),char(0),char(3),char(15),char(10),char(15),char(0),char(3),char(18),char(17), +char(15),char(3),char(70),char(89),char(15),char(15),char(7),char(12),char(71),char(89), +char(7),char(22),char(1),char(21),char(0),char(63),char(63),char(43),char(0),char(24), +char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(49),char(48),char(33),char(35),char(17),char(33),char(2),char(2),char(6), +char(35),char(34),char(39),char(53),char(22),char(51),char(50),char(18),char(19),char(33), +char(3),char(225),char(168),char(254),char(183),char(27),char(96),char(153),char(118),char(54), +char(32),char(22),char(28),char(115),char(136),char(35),char(2),char(129),char(3),char(186), +char(254),char(156),char(254),char(94),char(194),char(12),char(123),char(6),char(1),char(230), +char(1),char(239),char(0),char(1),char(0),char(176),char(0),char(0),char(5),char(47), +char(4),char(70),char(0),char(20),char(0),char(53),char(64),char(25),char(3),char(6), +char(6),char(5),char(18),char(15),char(15),char(16),char(5),char(16),char(22),char(21), +char(7),char(14),char(0),char(14),char(11),char(3),char(17),char(15),char(6),char(16), +char(21),char(11),char(21),char(0),char(63),char(63),char(51),char(63),char(51),char(18), +char(57),char(57),char(17),char(51),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(37), +char(55),char(55),char(1),char(51),char(17),char(35),char(17),char(7),char(7),char(1), +char(35),char(1),char(38),char(39),char(17),char(35),char(17),char(51),char(1),char(22), +char(2),char(233),char(31),char(43),char(1),char(41),char(211),char(147),char(20),char(58), +char(254),char(229),char(139),char(254),char(229),char(53),char(20),char(148),char(203),char(1), +char(31),char(43),char(160),char(93),char(118),char(2),char(211),char(251),char(186),char(3), +char(137),char(58),char(153),char(253),char(74),char(2),char(184),char(134),char(75),char(252), +char(119),char(4),char(70),char(253),char(73),char(110),char(0),char(1),char(0),char(176), +char(0),char(0),char(4),char(98),char(4),char(72),char(0),char(11),char(0),char(57), +char(64),char(30),char(2),char(6),char(6),char(5),char(1),char(9),char(9),char(10), +char(5),char(10),char(13),char(12),char(1),char(8),char(70),char(89),char(47),char(1), +char(63),char(1),char(2),char(1),char(1),char(10),char(3),char(11),char(15),char(6), +char(10),char(21),char(0),char(63),char(51),char(63),char(51),char(18),char(57),char(47), +char(93),char(43),char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(33), +char(17),char(51),char(17),char(35),char(17),char(33),char(17),char(35),char(17),char(1), +char(86),char(2),char(102),char(166),char(166),char(253),char(154),char(166),char(4),char(72), +char(254),char(53),char(1),char(203),char(251),char(184),char(1),char(238),char(254),char(18), +char(4),char(72),char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98), +char(4),char(92),char(2),char(6),char(0),char(82),char(0),char(0),char(0),char(1), +char(0),char(176),char(0),char(0),char(4),char(72),char(4),char(72),char(0),char(7), +char(0),char(35),char(64),char(17),char(0),char(1),char(5),char(4),char(1),char(4), +char(8),char(9),char(2),char(7),char(70),char(89),char(2),char(15),char(5),char(1), +char(21),char(0),char(63),char(51),char(63),char(43),char(17),char(18),char(1),char(57), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(35),char(17), +char(33),char(17),char(35),char(17),char(33),char(1),char(86),char(166),char(3),char(152), +char(168),char(253),char(182),char(4),char(72),char(251),char(184),char(3),char(184),char(0), +char(255),char(255),char(0),char(176),char(254),char(20),char(4),char(117),char(4),char(92), +char(2),char(6),char(0),char(83),char(0),char(0),char(255),char(255),char(0),char(115), +char(255),char(236),char(3),char(139),char(4),char(92),char(2),char(6),char(0),char(70), +char(0),char(0),char(0),char(1),char(0),char(41),char(0),char(0),char(3),char(147), +char(4),char(72),char(0),char(7),char(0),char(36),char(64),char(18),char(2),char(3), +char(0),char(3),char(5),char(3),char(8),char(9),char(1),char(5),char(6),char(5), +char(70),char(89),char(6),char(15),char(3),char(21),char(0),char(63),char(63),char(43), +char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(49),char(48),char(1),char(33),char(17),char(35),char(17),char(33),char(53),char(33), +char(3),char(147),char(254),char(156),char(166),char(254),char(160),char(3),char(106),char(3), +char(186),char(252),char(70),char(3),char(186),char(142),char(255),char(255),char(0),char(2), +char(254),char(20),char(4),char(6),char(4),char(72),char(2),char(6),char(0),char(92), +char(0),char(0),char(0),char(3),char(0),char(113),char(254),char(20),char(5),char(70), +char(6),char(20),char(0),char(17),char(0),char(24),char(0),char(30),char(0),char(76), +char(64),char(39),char(18),char(9),char(28),char(15),char(4),char(4),char(21),char(12), +char(5),char(25),char(0),char(0),char(5),char(9),char(3),char(31),char(32),char(13), +char(0),char(27),char(22),char(12),char(22),char(70),char(89),char(15),char(12),char(16), +char(28),char(21),char(6),char(21),char(70),char(89),char(3),char(6),char(22),char(5), +char(27),char(0),char(63),char(63),char(51),char(43),char(17),char(0),char(51),char(24), +char(63),char(51),char(43),char(17),char(0),char(51),char(24),char(63),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(51),char(17), +char(51),char(51),char(17),char(51),char(49),char(48),char(1),char(20),char(0),char(7), +char(17),char(35),char(17),char(38),char(0),char(53),char(52),char(0),char(55),char(17), +char(51),char(17),char(22),char(0),char(5),char(20),char(22),char(23),char(17),char(6), +char(6),char(5),char(16),char(37),char(17),char(54),char(54),char(5),char(70),char(254), +char(229),char(254),char(164),char(248),char(254),char(224),char(1),char(31),char(255),char(158), +char(251),char(1),char(30),char(251),char(217),char(176),char(192),char(185),char(183),char(3), +char(123),char(254),char(147),char(190),char(175),char(2),char(37),char(249),char(254),char(217), +char(21),char(254),char(36),char(1),char(220),char(19),char(1),char(46),char(244),char(249), +char(1),char(38),char(20),char(1),char(188),char(254),char(68),char(23),char(254),char(212), +char(240),char(192),char(218),char(18),char(3),char(84),char(17),char(207),char(200),char(1), +char(127),char(39),char(252),char(174),char(19),char(218),char(255),char(255),char(0),char(39), +char(0),char(0),char(4),char(8),char(4),char(72),char(2),char(6),char(0),char(91), +char(0),char(0),char(0),char(1),char(0),char(176),char(254),char(133),char(4),char(221), +char(4),char(72),char(0),char(11),char(0),char(50),char(64),char(25),char(6),char(3), +char(7),char(10),char(1),char(0),char(0),char(10),char(3),char(3),char(12),char(13), +char(8),char(4),char(15),char(10),char(6),char(3),char(6),char(70),char(89),char(3), +char(21),char(1),char(34),char(0),char(63),char(63),char(43),char(17),char(0),char(51), +char(24),char(63),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(35),char(17),char(33), +char(17),char(51),char(17),char(33),char(17),char(51),char(17),char(51),char(4),char(221), +char(166),char(252),char(121),char(166),char(2),char(70),char(166),char(155),char(254),char(133), +char(1),char(123),char(4),char(72),char(252),char(71),char(3),char(185),char(252),char(71), +char(0),char(1),char(0),char(156),char(0),char(0),char(4),char(45),char(4),char(72), +char(0),char(18),char(0),char(45),char(64),char(22),char(6),char(10),char(10),char(9), +char(1),char(17),char(9),char(17),char(20),char(19),char(3),char(14),char(70),char(89), +char(3),char(3),char(10),char(7),char(18),char(15),char(10),char(21),char(0),char(63), +char(63),char(51),char(18),char(57),char(47),char(43),char(17),char(18),char(1),char(57), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(17),char(20),char(51),char(50),char(54),char(55),char(17),char(51),char(17),char(35), +char(17),char(6),char(6),char(35),char(34),char(38),char(53),char(17),char(1),char(66), +char(219),char(91),char(166),char(105),char(166),char(166),char(105),char(179),char(113),char(164), +char(186),char(4),char(72),char(254),char(112),char(192),char(56),char(67),char(1),char(213), +char(251),char(184),char(1),char(240),char(72),char(59),char(172),char(147),char(1),char(156), +char(0),char(1),char(0),char(176),char(0),char(0),char(6),char(111),char(4),char(72), +char(0),char(11),char(0),char(49),char(64),char(24),char(8),char(5),char(0),char(9), +char(1),char(4),char(4),char(9),char(5),char(3),char(12),char(13),char(10),char(2), +char(6),char(15),char(0),char(8),char(5),char(8),char(70),char(89),char(5),char(21), +char(0),char(63),char(43),char(17),char(0),char(51),char(24),char(63),char(51),char(51), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(37),char(33),char(17),char(51),char(17),char(33),char(17), +char(51),char(17),char(33),char(17),char(51),char(3),char(225),char(1),char(230),char(168), +char(250),char(65),char(166),char(1),char(229),char(166),char(143),char(3),char(185),char(251), +char(184),char(4),char(72),char(252),char(71),char(3),char(185),char(0),char(0),char(1), +char(0),char(176),char(254),char(135),char(7),char(10),char(4),char(70),char(0),char(15), +char(0),char(59),char(64),char(30),char(12),char(9),char(0),char(13),char(1),char(4), +char(7),char(6),char(6),char(4),char(13),char(9),char(4),char(16),char(17),char(14), +char(2),char(10),char(15),char(4),char(0),char(12),char(9),char(12),char(70),char(89), +char(9),char(21),char(7),char(34),char(0),char(63),char(63),char(43),char(17),char(0), +char(51),char(51),char(24),char(63),char(51),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(37),char(33),char(17),char(51),char(17),char(51),char(17),char(35),char(17), +char(33),char(17),char(51),char(17),char(33),char(17),char(51),char(3),char(225),char(1), +char(230),char(166),char(157),char(168),char(250),char(78),char(166),char(1),char(229),char(166), +char(143),char(3),char(183),char(252),char(73),char(253),char(248),char(1),char(121),char(4), +char(70),char(252),char(73),char(3),char(183),char(0),char(0),char(2),char(0),char(41), +char(0),char(0),char(5),char(29),char(4),char(72),char(0),char(12),char(0),char(20), +char(0),char(61),char(64),char(32),char(0),char(18),char(18),char(8),char(13),char(4), +char(4),char(8),char(10),char(3),char(21),char(22),char(0),char(17),char(70),char(89), +char(0),char(0),char(8),char(11),char(11),char(10),char(70),char(89),char(11),char(15), +char(8),char(18),char(70),char(89),char(8),char(21),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(33),char(50),char(22),char(21),char(20),char(6), +char(35),char(33),char(17),char(33),char(53),char(33),char(1),char(52),char(38),char(35), +char(33),char(17),char(33),char(32),char(2),char(45),char(1),char(57),char(224),char(215), +char(223),char(220),char(254),char(37),char(254),char(162),char(2),char(4),char(2),char(76), +char(124),char(157),char(254),char(205),char(1),char(57),char(1),char(19),char(2),char(131), +char(154),char(155),char(166),char(168),char(3),char(186),char(142),char(252),char(252),char(93), +char(83),char(254),char(151),char(0),char(0),char(3),char(0),char(176),char(0),char(0), +char(5),char(121),char(4),char(72),char(0),char(10),char(0),char(14),char(0),char(22), +char(0),char(63),char(64),char(32),char(0),char(16),char(16),char(8),char(4),char(19), +char(12),char(11),char(11),char(19),char(8),char(3),char(23),char(24),char(12),char(21), +char(0),char(15),char(70),char(89),char(0),char(0),char(8),char(13),char(9),char(15), +char(8),char(16),char(70),char(89),char(8),char(21),char(0),char(63),char(43),char(0), +char(24),char(63),char(51),char(18),char(57),char(47),char(43),char(0),char(24),char(63), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(33),char(50),char(22),char(21), +char(20),char(6),char(35),char(33),char(17),char(51),char(1),char(35),char(17),char(51), +char(1),char(17),char(33),char(32),char(53),char(52),char(38),char(35),char(1),char(86), +char(1),char(43),char(209),char(201),char(213),char(207),char(254),char(57),char(166),char(4), +char(35),char(166),char(166),char(251),char(221),char(1),char(25),char(1),char(8),char(122), +char(147),char(2),char(131),char(155),char(154),char(165),char(169),char(4),char(72),char(251), +char(184),char(4),char(72),char(253),char(172),char(254),char(151),char(185),char(92),char(84), +char(0),char(2),char(0),char(176),char(0),char(0),char(4),char(76),char(4),char(72), +char(0),char(9),char(0),char(18),char(0),char(50),char(64),char(25),char(15),char(3), +char(0),char(11),char(11),char(7),char(3),char(7),char(20),char(19),char(0),char(10), +char(70),char(89),char(0),char(0),char(7),char(8),char(15),char(7),char(11),char(70), +char(89),char(7),char(21),char(0),char(63),char(43),char(0),char(24),char(63),char(18), +char(57),char(47),char(43),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(33),char(32),char(17), +char(20),char(6),char(35),char(33),char(17),char(51),char(17),char(17),char(33),char(50), +char(54),char(53),char(52),char(38),char(35),char(1),char(86),char(1),char(82),char(1), +char(164),char(219),char(211),char(254),char(18),char(166),char(1),char(64),char(132),char(140), +char(129),char(148),char(2),char(131),char(254),char(203),char(162),char(172),char(4),char(72), +char(253),char(172),char(254),char(151),char(92),char(93),char(91),char(85),char(0),char(1), +char(0),char(57),char(255),char(236),char(3),char(125),char(4),char(92),char(0),char(26), +char(0),char(68),char(64),char(38),char(12),char(9),char(9),char(24),char(24),char(10), +char(18),char(2),char(4),char(27),char(28),char(11),char(10),char(70),char(89),char(15), +char(11),char(31),char(11),char(2),char(11),char(3),char(11),char(11),char(0),char(21), +char(21),char(15),char(70),char(89),char(21),char(16),char(0),char(6),char(70),char(89), +char(0),char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(0),char(57),char(24),char(47),char(95),char(94),char(93),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(5),char(34),char(39),char(53),char(22),char(22),char(51),char(50),char(54),char(55), +char(33),char(53),char(33),char(38),char(38),char(35),char(34),char(7),char(39),char(54), +char(54),char(51),char(32),char(0),char(17),char(16),char(0),char(1),char(86),char(167), +char(118),char(60),char(140),char(91),char(174),char(189),char(10),char(253),char(213),char(2), +char(41),char(16),char(169),char(161),char(103),char(151),char(47),char(55),char(164),char(80), +char(1),char(0),char(1),char(10),char(254),char(223),char(20),char(57),char(147),char(23), +char(36),char(186),char(185),char(141),char(172),char(160),char(54),char(140),char(26),char(35), +char(254),char(219),char(254),char(236),char(254),char(243),char(254),char(214),char(0),char(2), +char(0),char(176),char(255),char(236),char(6),char(51),char(4),char(92),char(0),char(18), +char(0),char(30),char(0),char(81),char(64),char(45),char(12),char(8),char(8),char(9), +char(19),char(13),char(6),char(25),char(0),char(0),char(6),char(9),char(3),char(31), +char(32),char(16),char(28),char(70),char(89),char(16),char(16),char(12),char(7),char(70), +char(89),char(15),char(12),char(31),char(12),char(2),char(11),char(3),char(12),char(12), +char(9),char(10),char(15),char(9),char(21),char(3),char(22),char(70),char(89),char(3), +char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(18),char(57), +char(47),char(95),char(94),char(93),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(0),char(35),char(34), +char(2),char(39),char(33),char(17),char(35),char(17),char(51),char(17),char(33),char(54), +char(54),char(51),char(50),char(0),char(1),char(20),char(22),char(51),char(50),char(54), +char(53),char(52),char(38),char(35),char(34),char(6),char(6),char(51),char(254),char(255), +char(224),char(213),char(250),char(14),char(254),char(225),char(166),char(166),char(1),char(33), +char(20),char(252),char(207),char(220),char(1),char(1),char(252),char(238),char(146),char(161), +char(158),char(149),char(146),char(161),char(161),char(146),char(2),char(37),char(254),char(243), +char(254),char(212),char(1),char(11),char(247),char(254),char(18),char(4),char(72),char(254), +char(53),char(228),char(251),char(254),char(207),char(254),char(250),char(211),char(219),char(213), +char(217),char(210),char(216),char(216),char(0),char(2),char(0),char(37),char(0),char(0), +char(3),char(193),char(4),char(72),char(0),char(13),char(0),char(20),char(0),char(61), +char(64),char(32),char(17),char(11),char(11),char(10),char(14),char(5),char(1),char(5), +char(2),char(10),char(4),char(22),char(21),char(13),char(16),char(70),char(89),char(2), +char(8),char(13),char(13),char(1),char(8),char(8),char(19),char(70),char(89),char(8), +char(15),char(11),char(1),char(21),char(0),char(63),char(51),char(63),char(43),char(17), +char(18),char(0),char(57),char(24),char(47),char(18),char(57),char(43),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(51),char(35),char(1),char(38),char(38),char(53),char(52),char(54),char(51), +char(33),char(17),char(35),char(17),char(33),char(1),char(20),char(33),char(33),char(17), +char(33),char(34),char(231),char(194),char(1),char(59),char(127),char(135),char(202),char(181), +char(1),char(232),char(166),char(254),char(235),char(254),char(246),char(1),char(20),char(1), +char(11),char(254),char(211),char(242),char(1),char(207),char(28),char(161),char(122),char(150), +char(172),char(251),char(184),char(1),char(182),char(1),char(78),char(190),char(1),char(114), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(18),char(5),char(211), +char(2),char(38),char(0),char(72),char(0),char(0),char(1),char(6),char(0),char(106), +char(8),char(0),char(0),char(10),char(180),char(3),char(2),char(48),char(17),char(38), +char(0),char(43),char(53),char(53),char(0),char(1),char(0),char(20),char(254),char(20), +char(4),char(68),char(6),char(20),char(0),char(39),char(0),char(102),char(64),char(58), +char(29),char(27),char(23),char(15),char(15),char(20),char(16),char(7),char(37),char(37), +char(25),char(2),char(16),char(18),char(5),char(40),char(41),char(30),char(29),char(33), +char(11),char(70),char(89),char(26),char(18),char(19),char(18),char(71),char(89),char(23), +char(19),char(15),char(19),char(31),char(19),char(47),char(19),char(3),char(9),char(3), +char(29),char(33),char(19),char(19),char(33),char(29),char(3),char(16),char(21),char(0), +char(16),char(21),char(0),char(5),char(70),char(89),char(0),char(27),char(0),char(63), +char(43),char(0),char(24),char(63),char(63),char(18),char(23),char(57),char(47),char(47), +char(47),char(95),char(94),char(93),char(17),char(51),char(43),char(17),char(0),char(51), +char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(51),char(17),char(51),char(51),char(51),char(49),char(48), +char(1),char(34),char(39),char(53),char(22),char(51),char(50),char(53),char(17),char(52), +char(38),char(35),char(34),char(6),char(21),char(17),char(35),char(17),char(35),char(53), +char(51),char(53),char(51),char(21),char(33),char(21),char(33),char(21),char(20),char(7), +char(51),char(54),char(54),char(51),char(50),char(22),char(21),char(17),char(20),char(6), +char(3),char(47),char(79),char(52),char(58),char(55),char(129),char(122),char(130),char(173), +char(157),char(168),char(156),char(156),char(166),char(1),char(145),char(254),char(111),char(8), +char(10),char(49),char(181),char(116),char(201),char(201),char(137),char(254),char(20),char(25), +char(137),char(20),char(170),char(3),char(82),char(134),char(132),char(188),char(211),char(253), +char(231),char(4),char(219),char(127),char(186),char(186),char(127),char(196),char(84),char(56), +char(79),char(91),char(191),char(210),char(252),char(182),char(156),char(170),char(255),char(255), +char(0),char(176),char(0),char(0),char(3),char(68),char(6),char(33),char(2),char(38), +char(1),char(205),char(0),char(0),char(1),char(6),char(0),char(118),char(241),char(0), +char(0),char(8),char(179),char(1),char(15),char(17),char(38),char(0),char(43),char(53), +char(0),char(1),char(0),char(115),char(255),char(236),char(3),char(170),char(4),char(92), +char(0),char(25),char(0),char(68),char(64),char(38),char(15),char(18),char(18),char(3), +char(9),char(24),char(17),char(3),char(4),char(26),char(27),char(15),char(18),char(70), +char(89),char(15),char(15),char(31),char(15),char(2),char(11),char(3),char(15),char(15), +char(0),char(6),char(6),char(12),char(70),char(89),char(6),char(16),char(0),char(21), +char(70),char(89),char(0),char(22),char(0),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(95),char(94),char(93), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(5),char(34),char(0),char(17),char(16),char(0),char(51),char(50), +char(22),char(23),char(7),char(38),char(35),char(34),char(6),char(7),char(33),char(21), +char(33),char(22),char(22),char(51),char(50),char(55),char(21),char(6),char(2),char(121), +char(248),char(254),char(242),char(1),char(19),char(251),char(82),char(158),char(57),char(49), +char(143),char(109),char(164),char(170),char(16),char(2),char(41),char(253),char(213),char(9), +char(170),char(167),char(140),char(151),char(116),char(20),char(1),char(35),char(1),char(16), +char(1),char(19),char(1),char(42),char(32),char(25),char(141),char(51),char(163),char(169), +char(141),char(190),char(181),char(59),char(147),char(57),char(255),char(255),char(0),char(106), +char(255),char(236),char(3),char(115),char(4),char(92),char(2),char(6),char(0),char(86), +char(0),char(0),char(255),char(255),char(0),char(162),char(0),char(0),char(1),char(102), +char(5),char(223),char(2),char(6),char(0),char(76),char(0),char(0),char(255),char(255), +char(255),char(236),char(0),char(0),char(2),char(31),char(5),char(211),char(2),char(38), +char(0),char(243),char(0),char(0),char(1),char(7),char(0),char(106),char(254),char(183), +char(0),char(0),char(0),char(10),char(180),char(2),char(1),char(25),char(17),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(255),char(145),char(254),char(20), +char(1),char(102),char(5),char(223),char(2),char(6),char(0),char(77),char(0),char(0), +char(0),char(2),char(0),char(16),char(255),char(242),char(6),char(66),char(4),char(72), +char(0),char(21),char(0),char(29),char(0),char(76),char(64),char(41),char(9),char(20), +char(0),char(27),char(27),char(7),char(22),char(4),char(4),char(7),char(20),char(14), +char(4),char(30),char(31),char(0),char(26),char(70),char(89),char(0),char(0),char(12), +char(20),char(20),char(9),char(70),char(89),char(20),char(15),char(12),char(17),char(71), +char(89),char(12),char(21),char(7),char(27),char(70),char(89),char(7),char(21),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(0),char(24),char(63),char(43), +char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(51),char(50),char(22),char(21),char(16),char(33),char(33), +char(17),char(33),char(2),char(2),char(35),char(34),char(39),char(53),char(22),char(51), +char(50),char(18),char(19),char(33),char(1),char(52),char(38),char(35),char(35),char(17), +char(51),char(32),char(3),char(176),char(244),char(211),char(203),char(254),char(75),char(254), +char(101),char(254),char(254),char(40),char(181),char(171),char(56),char(32),char(22),char(28), +char(115),char(136),char(35),char(2),char(80),char(1),char(236),char(125),char(158),char(231), +char(237),char(1),char(21),char(2),char(131),char(155),char(154),char(254),char(178),char(3), +char(186),char(253),char(250),char(254),char(62),char(12),char(123),char(6),char(1),char(230), +char(1),char(239),char(252),char(252),char(91),char(85),char(254),char(151),char(0),char(2), +char(0),char(176),char(0),char(0),char(6),char(164),char(4),char(70),char(0),char(17), +char(0),char(25),char(0),char(74),char(64),char(38),char(15),char(11),char(11),char(12), +char(1),char(19),char(19),char(16),char(8),char(22),char(5),char(5),char(8),char(12), +char(3),char(26),char(27),char(18),char(10),char(15),char(10),char(70),char(89),char(1), +char(15),char(15),char(8),char(17),char(13),char(15),char(12),char(21),char(8),char(19), +char(70),char(89),char(8),char(21),char(0),char(63),char(43),char(0),char(24),char(63), +char(63),char(51),char(18),char(57),char(47),char(51),char(43),char(17),char(0),char(51), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17), +char(33),char(50),char(22),char(21),char(16),char(33),char(33),char(17),char(33),char(17), +char(35),char(17),char(51),char(17),char(33),char(17),char(19),char(17),char(51),char(32), +char(53),char(52),char(38),char(35),char(4),char(0),char(1),char(0),char(217),char(203), +char(254),char(78),char(254),char(96),char(254),char(10),char(172),char(172),char(1),char(250), +char(166),char(240),char(1),char(20),char(128),char(153),char(4),char(70),char(254),char(59), +char(153),char(154),char(254),char(178),char(1),char(238),char(254),char(18),char(4),char(70), +char(254),char(55),char(1),char(201),char(253),char(174),char(254),char(151),char(185),char(92), +char(84),char(0),char(255),char(255),char(0),char(20),char(0),char(0),char(4),char(68), +char(6),char(20),char(2),char(6),char(0),char(233),char(0),char(0),char(255),char(255), +char(0),char(176),char(0),char(0),char(4),char(12),char(6),char(33),char(2),char(38), +char(1),char(212),char(0),char(0),char(1),char(6),char(0),char(118),char(51),char(0), +char(0),char(8),char(179),char(1),char(20),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(2),char(254),char(20),char(4),char(6),char(6),char(12), +char(2),char(38),char(0),char(92),char(0),char(0),char(1),char(6),char(2),char(54), +char(183),char(0),char(0),char(8),char(179),char(1),char(22),char(17),char(38),char(0), +char(43),char(53),char(0),char(1),char(0),char(176),char(254),char(135),char(4),char(70), +char(4),char(70),char(0),char(11),char(0),char(50),char(64),char(25),char(4),char(1), +char(10),char(11),char(5),char(8),char(8),char(11),char(1),char(3),char(12),char(13), +char(11),char(34),char(6),char(2),char(15),char(9),char(1),char(1),char(4),char(70), +char(89),char(1),char(21),char(0),char(63),char(43),char(17),char(0),char(51),char(24), +char(63),char(51),char(63),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(33),char(17),char(51), +char(17),char(33),char(17),char(51),char(17),char(33),char(17),char(35),char(2),char(47), +char(254),char(129),char(166),char(2),char(74),char(166),char(254),char(143),char(166),char(4), +char(70),char(252),char(73),char(3),char(183),char(251),char(186),char(254),char(135),char(0), +char(0),char(1),char(0),char(201),char(0),char(0),char(4),char(8),char(6),char(227), +char(0),char(7),char(0),char(35),char(64),char(17),char(0),char(3),char(5),char(6), +char(3),char(6),char(9),char(8),char(7),char(4),char(73),char(89),char(1),char(7), +char(3),char(6),char(18),char(0),char(63),char(63),char(198),char(43),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(17),char(51),char(17),char(33),char(17),char(35),char(17),char(3),char(102),char(162), +char(253),char(107),char(170),char(5),char(182),char(1),char(45),char(254),char(58),char(250), +char(227),char(5),char(182),char(0),char(0),char(1),char(0),char(176),char(0),char(0), +char(3),char(68),char(5),char(137),char(0),char(7),char(0),char(39),char(64),char(18), +char(5),char(0),char(2),char(3),char(0),char(3),char(9),char(8),char(6),char(4), +char(4),char(1),char(71),char(89),char(4),char(15),char(3),char(21),char(0),char(63), +char(63),char(43),char(0),char(24),char(16),char(198),char(17),char(18),char(1),char(57), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(33),char(17), +char(35),char(17),char(33),char(17),char(51),char(3),char(68),char(254),char(18),char(166), +char(1),char(238),char(166),char(3),char(199),char(252),char(57),char(4),char(72),char(1), +char(65),char(0),char(255),char(255),char(0),char(27),char(0),char(0),char(7),char(76), +char(7),char(115),char(2),char(38),char(0),char(58),char(0),char(0),char(1),char(7), +char(0),char(67),char(1),char(23),char(1),char(82),char(0),char(8),char(179),char(1), +char(27),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(23), +char(0),char(0),char(6),char(35),char(6),char(33),char(2),char(38),char(0),char(90), +char(0),char(0),char(1),char(6),char(0),char(67),char(115),char(0),char(0),char(8), +char(179),char(1),char(30),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(27),char(0),char(0),char(7),char(76),char(7),char(115),char(2),char(38), +char(0),char(58),char(0),char(0),char(1),char(7),char(0),char(118),char(1),char(176), +char(1),char(82),char(0),char(8),char(179),char(1),char(35),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(23),char(0),char(0),char(6),char(35), +char(6),char(33),char(2),char(38),char(0),char(90),char(0),char(0),char(1),char(7), +char(0),char(118),char(1),char(27),char(0),char(0),char(0),char(8),char(179),char(1), +char(38),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(27), +char(0),char(0),char(7),char(76),char(7),char(37),char(2),char(38),char(0),char(58), +char(0),char(0),char(1),char(7),char(0),char(106),char(1),char(100),char(1),char(82), +char(0),char(10),char(180),char(2),char(1),char(47),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(23),char(0),char(0),char(6),char(35), +char(5),char(211),char(2),char(38),char(0),char(90),char(0),char(0),char(1),char(7), +char(0),char(106),char(0),char(207),char(0),char(0),char(0),char(10),char(180),char(2), +char(1),char(50),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(4),char(123),char(7),char(115),char(2),char(38), +char(0),char(60),char(0),char(0),char(1),char(7),char(0),char(67),char(255),char(148), +char(1),char(82),char(0),char(8),char(179),char(1),char(10),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(2),char(254),char(20),char(4),char(6), +char(6),char(33),char(2),char(38),char(0),char(92),char(0),char(0),char(1),char(7), +char(0),char(67),char(255),char(97),char(0),char(0),char(0),char(8),char(179),char(1), +char(23),char(17),char(38),char(0),char(43),char(53),char(0),char(1),char(0),char(82), +char(1),char(217),char(3),char(174),char(2),char(113),char(0),char(3),char(0),char(17), +char(181),char(0),char(2),char(4),char(5),char(0),char(1),char(0),char(47),char(51), +char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(19),char(53),char(33), +char(21),char(82),char(3),char(92),char(1),char(217),char(152),char(152),char(0),char(1), +char(0),char(82),char(1),char(217),char(7),char(174),char(2),char(113),char(0),char(3), +char(0),char(17),char(181),char(0),char(2),char(4),char(5),char(0),char(1),char(0), +char(47),char(51),char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(19), +char(53),char(33),char(21),char(82),char(7),char(92),char(1),char(217),char(152),char(152), +char(255),char(255),char(0),char(82),char(1),char(217),char(7),char(174),char(2),char(113), +char(2),char(6),char(2),char(3),char(0),char(0),char(0),char(2),char(255),char(252), +char(254),char(49),char(3),char(78),char(255),char(211),char(0),char(3),char(0),char(7), +char(0),char(28),char(64),char(11),char(4),char(0),char(9),char(5),char(1),char(1), +char(8),char(5),char(6),char(2),char(1),char(0),char(47),char(51),char(47),char(51), +char(17),char(1),char(51),char(17),char(51),char(17),char(51),char(50),char(49),char(48), +char(1),char(33),char(53),char(33),char(53),char(33),char(53),char(33),char(3),char(78), +char(252),char(174),char(3),char(82),char(252),char(174),char(3),char(82),char(254),char(49), +char(139),char(140),char(139),char(0),char(0),char(1),char(0),char(25),char(3),char(193), +char(1),char(68),char(5),char(182),char(0),char(7),char(0),char(18),char(182),char(1), +char(5),char(8),char(9),char(0),char(4),char(3),char(0),char(63),char(205),char(17), +char(18),char(1),char(57),char(57),char(49),char(48),char(19),char(39),char(54),char(18), +char(55),char(51),char(6),char(7),char(37),char(12),char(22),char(98),char(56),char(123), +char(66),char(37),char(3),char(193),char(22),char(90),char(1),char(12),char(121),char(254), +char(247),char(0),char(0),char(1),char(0),char(25),char(3),char(193),char(1),char(68), +char(5),char(182),char(0),char(7),char(0),char(18),char(182),char(5),char(1),char(8), +char(9),char(5),char(7),char(3),char(0),char(63),char(198),char(17),char(18),char(1), +char(57),char(57),char(49),char(48),char(1),char(23),char(6),char(2),char(7),char(35), +char(18),char(55),char(1),char(53),char(15),char(26),char(98),char(53),char(122),char(70), +char(32),char(5),char(182),char(22),char(100),char(254),char(247),char(114),char(1),char(29), +char(216),char(0),char(255),char(255),char(0),char(63),char(254),char(248),char(1),char(109), +char(0),char(238),char(2),char(6),char(0),char(15),char(0),char(0),char(0),char(1), +char(0),char(25),char(3),char(193),char(1),char(70),char(5),char(182),char(0),char(7), +char(0),char(18),char(182),char(2),char(6),char(9),char(8),char(3),char(7),char(3), +char(0),char(63),char(205),char(17),char(18),char(1),char(57),char(57),char(49),char(48), +char(19),char(22),char(23),char(35),char(38),char(2),char(39),char(55),char(223),char(37), +char(66),char(123),char(45),char(109),char(24),char(14),char(5),char(182),char(251),char(250), +char(94),char(1),char(28),char(101),char(22),char(0),char(0),char(2),char(0),char(25), +char(3),char(193),char(2),char(180),char(5),char(182),char(0),char(7),char(0),char(15), +char(0),char(26),char(64),char(12),char(4),char(1),char(13),char(9),char(4),char(16), +char(17),char(0),char(8),char(3),char(12),char(3),char(0),char(63),char(51),char(205), +char(50),char(17),char(18),char(1),char(23),char(57),char(49),char(48),char(1),char(39), +char(54),char(19),char(51),char(6),char(2),char(7),char(33),char(39),char(54),char(18), +char(55),char(51),char(6),char(7),char(1),char(150),char(15),char(56),char(122),char(123), +char(30),char(59),char(13),char(253),char(215),char(12),char(22),char(98),char(56),char(123), +char(66),char(37),char(3),char(193),char(22),char(215),char(1),char(8),char(115),char(254), +char(223),char(97),char(22),char(90),char(1),char(12),char(121),char(254),char(247),char(0), +char(0),char(2),char(0),char(25),char(3),char(193),char(2),char(180),char(5),char(182), +char(0),char(7),char(0),char(16),char(0),char(26),char(64),char(12),char(9),char(13), +char(1),char(5),char(4),char(17),char(18),char(13),char(5),char(16),char(7),char(3), +char(0),char(63),char(51),char(198),char(50),char(17),char(18),char(1),char(23),char(57), +char(49),char(48),char(1),char(23),char(6),char(2),char(7),char(35),char(18),char(55), +char(33),char(23),char(6),char(2),char(7),char(35),char(54),char(18),char(55),char(1), +char(53),char(15),char(26),char(98),char(53),char(122),char(70),char(32),char(2),char(39), +char(14),char(24),char(96),char(56),char(125),char(26),char(66),char(13),char(5),char(182), +char(22),char(100),char(254),char(247),char(114),char(1),char(29),char(216),char(22),char(91), +char(254),char(246),char(122),char(100),char(1),char(52),char(93),char(0),char(255),char(255), +char(0),char(25),char(254),char(249),char(2),char(180),char(0),char(238),char(1),char(7), +char(2),char(11),char(0),char(0),char(251),char(56),char(0),char(32),char(183),char(1), +char(0),char(7),char(64),char(13),char(13),char(72),char(7),char(184),char(255),char(192), +char(179),char(12),char(12),char(72),char(7),char(184),char(255),char(192),char(179),char(9), +char(9),char(72),char(7),char(0),char(17),char(43),char(43),char(43),char(53),char(53), +char(0),char(1),char(0),char(123),char(0),char(0),char(3),char(137),char(6),char(20), +char(0),char(11),char(0),char(67),char(64),char(33),char(9),char(2),char(2),char(8), +char(3),char(10),char(1),char(1),char(7),char(4),char(0),char(4),char(3),char(5), +char(4),char(12),char(13),char(0),char(5),char(5),char(11),char(6),char(6),char(7), +char(8),char(0),char(1),char(4),char(4),char(10),char(7),char(3),char(18),char(0), +char(63),char(46),char(51),char(51),char(17),char(51),char(63),char(18),char(57),char(47), +char(51),char(51),char(17),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(51),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(49), +char(48),char(1),char(37),char(19),char(35),char(19),char(5),char(53),char(5),char(3), +char(51),char(3),char(37),char(3),char(137),char(254),char(160),char(49),char(196),char(49), +char(254),char(180),char(1),char(76),char(49),char(196),char(49),char(1),char(96),char(3), +char(231),char(31),char(251),char(250),char(4),char(6),char(31),char(170),char(30),char(1), +char(161),char(254),char(95),char(30),char(0),char(1),char(0),char(123),char(0),char(0), +char(3),char(154),char(6),char(20),char(0),char(21),char(0),char(117),char(64),char(58), +char(12),char(7),char(21),char(16),char(4),char(4),char(15),char(10),char(5),char(20), +char(17),char(0),char(3),char(3),char(14),char(11),char(9),char(6),char(19),char(1), +char(1),char(6),char(5),char(7),char(4),char(22),char(23),char(1),char(8),char(8), +char(2),char(7),char(3),char(6),char(6),char(0),char(9),char(20),char(11),char(11), +char(17),char(14),char(19),char(12),char(12),char(18),char(9),char(14),char(13),char(7), +char(13),char(7),char(13),char(5),char(15),char(0),char(5),char(18),char(0),char(63), +char(63),char(18),char(57),char(57),char(47),char(47),char(18),char(57),char(57),char(50), +char(50),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(17),char(51), +char(51),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(51),char(51), +char(17),char(51),char(51),char(51),char(17),char(51),char(51),char(51),char(17),char(51), +char(51),char(17),char(51),char(49),char(48),char(1),char(37),char(21),char(37),char(19), +char(35),char(19),char(5),char(53),char(5),char(3),char(19),char(5),char(53),char(5), +char(3),char(51),char(3),char(37),char(21),char(37),char(19),char(2),char(57),char(1), +char(97),char(254),char(159),char(49),char(198),char(49),char(254),char(166),char(1),char(90), +char(43),char(43),char(254),char(166),char(1),char(90),char(49),char(198),char(49),char(1), +char(97),char(254),char(159),char(43),char(1),char(231),char(31),char(168),char(29),char(254), +char(133),char(1),char(123),char(29),char(168),char(31),char(1),char(43),char(1),char(27), +char(31),char(168),char(30),char(1),char(124),char(254),char(132),char(30),char(168),char(31), +char(254),char(229),char(0),char(1),char(0),char(164),char(1),char(244),char(2),char(94), +char(3),char(227),char(0),char(11),char(0),char(19),char(182),char(6),char(0),char(0), +char(12),char(13),char(9),char(3),char(0),char(47),char(205),char(17),char(18),char(1), +char(57),char(17),char(51),char(49),char(48),char(19),char(52),char(54),char(51),char(50), +char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(164),char(113),char(108), +char(105),char(116),char(115),char(106),char(107),char(114),char(2),char(236),char(121),char(126), +char(124),char(123),char(119),char(129),char(131),char(0),char(255),char(255),char(0),char(152), +char(255),char(227),char(5),char(174),char(0),char(242),char(0),char(38),char(0),char(17), +char(0),char(0),char(0),char(39),char(0),char(17),char(2),char(18),char(0),char(0), +char(0),char(7),char(0),char(17),char(4),char(37),char(0),char(0),char(0),char(7), +char(0),char(100),char(255),char(236),char(9),char(59),char(5),char(203),char(0),char(9), +char(0),char(20),char(0),char(24),char(0),char(36),char(0),char(47),char(0),char(59), +char(0),char(70),char(0),char(91),char(64),char(48),char(0),char(16),char(5),char(10), +char(48),char(66),char(54),char(60),char(25),char(43),char(31),char(37),char(37),char(43), +char(60),char(21),char(66),char(10),char(23),char(16),char(8),char(71),char(72),char(28), +char(51),char(51),char(40),char(63),char(25),char(3),char(13),char(34),char(57),char(57), +char(45),char(68),char(13),char(68),char(13),char(68),char(23),char(24),char(6),char(23), +char(24),char(7),char(18),char(7),char(0),char(63),char(51),char(63),char(63),char(18), +char(57),char(57),char(47),char(47),char(17),char(51),char(51),char(17),char(51),char(17), +char(51),char(63),char(51),char(51),char(17),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(19),char(20),char(22),char(51),char(50), +char(17),char(16),char(35),char(34),char(6),char(5),char(20),char(6),char(35),char(34), +char(38),char(53),char(16),char(33),char(50),char(22),char(37),char(1),char(35),char(1), +char(1),char(20),char(22),char(51),char(50),char(54),char(53),char(52),char(38),char(35), +char(34),char(6),char(5),char(20),char(6),char(35),char(34),char(38),char(53),char(16), +char(33),char(50),char(22),char(5),char(20),char(22),char(51),char(50),char(54),char(53), +char(52),char(38),char(35),char(34),char(6),char(5),char(20),char(6),char(35),char(34), +char(38),char(53),char(16),char(33),char(50),char(22),char(236),char(83),char(93),char(180), +char(180),char(93),char(83),char(1),char(237),char(161),char(156),char(149),char(163),char(1), +char(56),char(152),char(165),char(2),char(105),char(252),char(213),char(148),char(3),char(43), +char(2),char(160),char(83),char(93),char(91),char(89),char(89),char(91),char(93),char(83), +char(1),char(237),char(162),char(155),char(148),char(163),char(1),char(55),char(150),char(167), +char(251),char(56),char(81),char(93),char(91),char(89),char(89),char(91),char(93),char(81), +char(1),char(235),char(162),char(155),char(149),char(163),char(1),char(56),char(150),char(167), +char(4),char(2),char(170),char(170),char(1),char(84),char(1),char(82),char(168),char(170), +char(230),char(231),char(238),char(223),char(1),char(201),char(240),char(219),char(250),char(74), +char(5),char(182),char(252),char(2),char(171),char(169),char(167),char(173),char(171),char(165), +char(165),char(171),char(230),char(230),char(239),char(221),char(1),char(201),char(236),char(221), +char(171),char(169),char(167),char(173),char(171),char(165),char(165),char(171),char(230),char(230), +char(238),char(222),char(1),char(201),char(236),char(0),char(255),char(255),char(0),char(133), +char(3),char(166),char(1),char(63),char(5),char(182),char(2),char(6),char(0),char(10), +char(0),char(0),char(255),char(255),char(0),char(133),char(3),char(166),char(2),char(176), +char(5),char(182),char(0),char(6),char(0),char(5),char(0),char(0),char(0),char(1), +char(0),char(82),char(0),char(117),char(2),char(31),char(3),char(190),char(0),char(6), +char(0),char(26),char(64),char(10),char(4),char(2),char(3),char(6),char(2),char(6), +char(8),char(7),char(5),char(1),char(0),char(47),char(47),char(17),char(18),char(1), +char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(19),char(1), +char(23),char(1),char(1),char(7),char(1),char(82),char(1),char(86),char(119),char(254), +char(223),char(1),char(33),char(119),char(254),char(170),char(2),char(39),char(1),char(151), +char(69),char(254),char(162),char(254),char(161),char(71),char(1),char(151),char(0),char(1), +char(0),char(80),char(0),char(117),char(2),char(29),char(3),char(190),char(0),char(6), +char(0),char(26),char(64),char(10),char(3),char(0),char(4),char(2),char(0),char(2), +char(8),char(7),char(5),char(1),char(0),char(47),char(47),char(17),char(18),char(1), +char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(1), +char(39),char(1),char(1),char(55),char(1),char(2),char(29),char(254),char(168),char(117), +char(1),char(31),char(254),char(225),char(117),char(1),char(88),char(2),char(12),char(254), +char(105),char(71),char(1),char(95),char(1),char(94),char(69),char(254),char(105),char(0), +char(255),char(255),char(0),char(152),char(255),char(227),char(3),char(74),char(5),char(182), +char(0),char(38),char(0),char(4),char(0),char(0),char(0),char(7),char(0),char(4), +char(1),char(193),char(0),char(0),char(0),char(1),char(254),char(121),char(0),char(0), +char(2),char(143),char(5),char(182),char(0),char(3),char(0),char(19),char(183),char(0), +char(5),char(2),char(4),char(3),char(3),char(2),char(18),char(0),char(63),char(63), +char(17),char(1),char(51),char(17),char(51),char(49),char(48),char(1),char(1),char(35), +char(1),char(2),char(143),char(252),char(121),char(143),char(3),char(135),char(5),char(182), +char(250),char(74),char(5),char(182),char(0),char(1),char(0),char(109),char(3),char(33), +char(2),char(195),char(5),char(199),char(0),char(18),char(0),char(38),char(64),char(17), +char(0),char(18),char(12),char(8),char(8),char(9),char(18),char(9),char(20),char(19), +char(4),char(15),char(31),char(0),char(9),char(10),char(31),char(0),char(63),char(205), +char(50),char(63),char(51),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(52),char(38), +char(35),char(34),char(6),char(21),char(17),char(35),char(17),char(51),char(23),char(51), +char(54),char(51),char(32),char(21),char(17),char(2),char(76),char(78),char(80),char(114), +char(91),char(116),char(96),char(14),char(10),char(75),char(145),char(1),char(2),char(3), +char(33),char(1),char(164),char(84),char(71),char(105),char(122),char(254),char(164),char(2), +char(153),char(88),char(101),char(250),char(254),char(84),char(0),char(1),char(0),char(98), +char(0),char(0),char(4),char(35),char(5),char(182),char(0),char(17),char(0),char(75), +char(64),char(40),char(14),char(0),char(4),char(4),char(9),char(5),char(11),char(16), +char(2),char(5),char(7),char(5),char(18),char(19),char(3),char(7),char(8),char(7), +char(78),char(89),char(0),char(8),char(14),char(17),char(76),char(89),char(8),char(14), +char(8),char(14),char(5),char(10),char(10),char(13),char(76),char(89),char(10),char(6), +char(5),char(24),char(0),char(63),char(63),char(43),char(17),char(18),char(0),char(57), +char(57),char(24),char(47),char(47),char(43),char(17),char(0),char(51),char(43),char(17), +char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51), +char(17),char(51),char(51),char(49),char(48),char(1),char(33),char(21),char(33),char(17), +char(35),char(17),char(35),char(53),char(51),char(17),char(33),char(21),char(33),char(17), +char(33),char(21),char(33),char(1),char(184),char(1),char(52),char(254),char(204),char(166), +char(176),char(176),char(3),char(17),char(253),char(149),char(2),char(68),char(253),char(188), +char(1),char(139),char(129),char(254),char(246),char(1),char(10),char(129),char(4),char(43), +char(151),char(253),char(233),char(151),char(0),char(1),char(0),char(68),char(0),char(0), +char(4),char(72),char(5),char(201),char(0),char(37),char(0),char(112),char(64),char(64), +char(13),char(9),char(17),char(17),char(34),char(30),char(26),char(11),char(15),char(21), +char(2),char(15),char(26),char(28),char(32),char(23),char(7),char(38),char(39),char(16), +char(28),char(29),char(28),char(78),char(89),char(13),char(29),char(12),char(32),char(33), +char(32),char(78),char(89),char(9),char(33),char(15),char(33),char(31),char(33),char(63), +char(33),char(79),char(33),char(4),char(9),char(3),char(29),char(33),char(29),char(33), +char(23),char(0),char(23),char(20),char(76),char(89),char(23),char(24),char(0),char(5), +char(75),char(89),char(0),char(7),char(0),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(57),char(24),char(47),char(47),char(95), +char(94),char(93),char(17),char(51),char(43),char(17),char(0),char(51),char(17),char(51), +char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(51),char(51),char(17),char(51),char(51),char(49),char(48), +char(1),char(50),char(23),char(7),char(38),char(35),char(34),char(6),char(21),char(21), +char(33),char(21),char(33),char(21),char(33),char(21),char(33),char(21),char(20),char(6), +char(7),char(33),char(21),char(33),char(53),char(54),char(53),char(53),char(35),char(53), +char(51),char(53),char(35),char(53),char(51),char(53),char(52),char(54),char(2),char(176), +char(201),char(158),char(60),char(152),char(147),char(122),char(126),char(1),char(164),char(254), +char(92),char(1),char(164),char(254),char(92),char(65),char(74),char(3),char(27),char(251), +char(252),char(206),char(200),char(200),char(200),char(200),char(224),char(5),char(201),char(80), +char(131),char(71),char(135),char(129),char(186),char(129),char(166),char(129),char(33),char(100), +char(136),char(44),char(154),char(141),char(48),char(243),char(35),char(129),char(166),char(129), +char(207),char(178),char(205),char(0),char(0),char(3),char(0),char(154),char(255),char(236), +char(5),char(209),char(5),char(182),char(0),char(22),char(0),char(33),char(0),char(42), +char(0),char(96),char(64),char(55),char(34),char(28),char(28),char(29),char(38),char(23), +char(16),char(20),char(20),char(13),char(9),char(2),char(18),char(9),char(23),char(11), +char(29),char(6),char(43),char(44),char(27),char(34),char(75),char(89),char(16),char(19), +char(78),char(89),char(3),char(27),char(11),char(16),char(14),char(14),char(16),char(11), +char(27),char(3),char(5),char(29),char(30),char(30),char(42),char(75),char(89),char(30), +char(6),char(29),char(24),char(6),char(0),char(77),char(89),char(6),char(25),char(0), +char(63),char(43),char(0),char(24),char(63),char(63),char(43),char(17),char(18),char(0), +char(23),char(57),char(24),char(47),char(47),char(47),char(47),char(47),char(43),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(50), +char(54),char(55),char(21),char(6),char(35),char(34),char(38),char(53),char(17),char(35), +char(53),char(55),char(55),char(51),char(21),char(51),char(21),char(35),char(17),char(20), +char(22),char(1),char(20),char(4),char(33),char(35),char(17),char(35),char(17),char(33), +char(32),char(22),char(1),char(51),char(50),char(54),char(53),char(52),char(38),char(35), +char(35),char(5),char(78),char(34),char(86),char(11),char(60),char(110),char(109),char(129), +char(157),char(157),char(62),char(98),char(221),char(221),char(52),char(254),char(145),char(254), +char(235),char(254),char(246),char(64),char(165),char(1),char(6),char(1),char(0),char(254), +char(253),char(161),char(52),char(200),char(185),char(172),char(183),char(82),char(117),char(14), +char(4),char(125),char(30),char(136),char(138),char(1),char(207),char(80),char(69),char(191), +char(211),char(129),char(254),char(71),char(77),char(82),char(3),char(151),char(227),char(234), +char(253),char(193),char(5),char(182),char(211),char(253),char(238),char(145),char(162),char(145), +char(142),char(0),char(0),char(1),char(0),char(63),char(255),char(236),char(4),char(137), +char(5),char(203),char(0),char(38),char(0),char(113),char(64),char(63),char(29),char(23), +char(31),char(22),char(22),char(26),char(11),char(2),char(7),char(7),char(26),char(36), +char(17),char(4),char(10),char(26),char(23),char(6),char(39),char(40),char(11),char(23), +char(24),char(23),char(78),char(89),char(8),char(24),char(5),char(29),char(30),char(29), +char(78),char(89),char(2),char(30),char(15),char(30),char(31),char(30),char(47),char(30), +char(3),char(9),char(3),char(24),char(30),char(24),char(30),char(19),char(34),char(34), +char(0),char(76),char(89),char(34),char(7),char(19),char(14),char(76),char(89),char(19), +char(25),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18), +char(0),char(57),char(57),char(24),char(47),char(47),char(95),char(94),char(93),char(17), +char(51),char(43),char(17),char(0),char(51),char(17),char(51),char(43),char(17),char(0), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(32),char(3),char(33),char(21),char(33),char(7),char(21),char(23),char(33),char(21), +char(33),char(22),char(22),char(51),char(50),char(55),char(21),char(6),char(35),char(34), +char(0),char(3),char(35),char(53),char(51),char(39),char(53),char(55),char(35),char(53), +char(51),char(18),char(0),char(51),char(50),char(23),char(7),char(38),char(3),char(27), +char(254),char(193),char(79),char(1),char(254),char(253),char(244),char(2),char(2),char(1), +char(207),char(254),char(65),char(37),char(203),char(170),char(156),char(153),char(146),char(171), +char(237),char(254),char(223),char(46),char(166),char(152),char(2),char(2),char(152),char(164), +char(39),char(1),char(36),char(237),char(201),char(165),char(71),char(166),char(5),char(53), +char(254),char(109),char(129),char(57),char(64),char(45),char(129),char(180),char(197),char(66), +char(150),char(65),char(1),char(13),char(1),char(1),char(129),char(42),char(44),char(80), +char(129),char(1),char(5),char(1),char(36),char(97),char(139),char(86),char(0),char(4), +char(0),char(141),char(255),char(248),char(6),char(10),char(5),char(193),char(0),char(3), +char(0),char(15),char(0),char(23),char(0),char(43),char(0),char(69),char(64),char(36), +char(37),char(27),char(32),char(42),char(16),char(10),char(20),char(4),char(4),char(0), +char(10),char(42),char(2),char(27),char(6),char(44),char(45),char(35),char(30),char(6), +char(18),char(7),char(24),char(22),char(13),char(39),char(24),char(13),char(24),char(13), +char(24),char(2),char(3),char(6),char(2),char(24),char(0),char(63),char(63),char(18), +char(57),char(57),char(47),char(47),char(17),char(51),char(17),char(51),char(63),char(51), +char(63),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(1),char(35), +char(1),char(1),char(20),char(6),char(35),char(34),char(38),char(53),char(52),char(54), +char(51),char(50),char(22),char(5),char(20),char(51),char(50),char(53),char(52),char(35), +char(34),char(37),char(34),char(38),char(53),char(52),char(54),char(51),char(50),char(23), +char(7),char(38),char(35),char(34),char(21),char(20),char(51),char(50),char(55),char(21), +char(6),char(5),char(31),char(252),char(213),char(148),char(3),char(43),char(1),char(127), +char(169),char(148),char(139),char(170),char(167),char(148),char(141),char(170),char(254),char(21), +char(178),char(176),char(176),char(178),char(253),char(202),char(166),char(182),char(188),char(171), +char(104),char(88),char(33),char(81),char(80),char(224),char(220),char(98),char(90),char(78), +char(5),char(182),char(250),char(74),char(5),char(182),char(251),char(152),char(159),char(183), +char(185),char(157),char(158),char(184),char(186),char(156),char(238),char(238),char(235),char(219), +char(177),char(161),char(168),char(179),char(35),char(103),char(31),char(238),char(235),char(33), +char(101),char(37),char(0),char(2),char(0),char(119),char(255),char(236),char(3),char(156), +char(5),char(203),char(0),char(28),char(0),char(36),char(0),char(61),char(64),char(31), +char(35),char(26),char(26),char(15),char(9),char(29),char(22),char(3),char(22),char(9), +char(12),char(4),char(37),char(38),char(35),char(15),char(13),char(25),char(10),char(5), +char(12),char(19),char(2),char(12),char(2),char(12),char(6),char(31),char(19),char(0), +char(6),char(0),char(47),char(51),char(47),char(51),char(18),char(57),char(57),char(47), +char(47),char(17),char(18),char(23),char(57),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(37), +char(50),char(55),char(51),char(6),char(6),char(35),char(34),char(38),char(53),char(53), +char(6),char(7),char(53),char(54),char(55),char(17),char(52),char(54),char(51),char(50), +char(22),char(21),char(20),char(2),char(7),char(17),char(20),char(22),char(19),char(52), +char(35),char(34),char(6),char(21),char(17),char(36),char(2),char(125),char(174),char(18), +char(95),char(8),char(153),char(142),char(150),char(160),char(96),char(96),char(78),char(114), +char(150),char(135),char(117),char(135),char(206),char(175),char(82),char(174),char(127),char(67), +char(62),char(1),char(0),char(111),char(213),char(166),char(178),char(181),char(169),char(243), +char(35),char(22),char(113),char(21),char(38),char(1),char(242),char(138),char(159),char(161), +char(138),char(185),char(254),char(208),char(74),char(254),char(229),char(104),char(123),char(4), +char(43),char(194),char(86),char(108),char(254),char(75),char(137),char(0),char(0),char(4), +char(0),char(201),char(0),char(0),char(7),char(195),char(5),char(182),char(0),char(15), +char(0),char(27),char(0),char(39),char(0),char(43),char(0),char(95),char(64),char(49), +char(9),char(6),char(6),char(7),char(1),char(13),char(13),char(0),char(28),char(22), +char(34),char(16),char(16),char(43),char(40),char(22),char(0),char(7),char(6),char(44), +char(45),char(31),char(19),char(37),char(25),char(11),char(40),char(19),char(3),char(25), +char(8),char(19),char(25),char(19),char(25),char(40),char(8),char(40),char(41),char(74), +char(89),char(40),char(18),char(14),char(8),char(3),char(1),char(7),char(18),char(0), +char(63),char(51),char(63),char(51),char(63),char(43),char(17),char(18),char(0),char(57), +char(57),char(24),char(47),char(47),char(17),char(18),char(57),char(17),char(18),char(57), +char(17),char(51),char(17),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(33),char(35),char(1),char(35),char(18),char(21),char(17), +char(35),char(17),char(51),char(1),char(51),char(38),char(53),char(17),char(51),char(1), +char(20),char(6),char(35),char(34),char(38),char(53),char(52),char(54),char(51),char(50), +char(22),char(5),char(20),char(22),char(51),char(50),char(54),char(53),char(52),char(38), +char(35),char(34),char(6),char(3),char(53),char(33),char(21),char(4),char(199),char(187), +char(253),char(76),char(8),char(16),char(151),char(194),char(2),char(170),char(8),char(14), +char(152),char(2),char(252),char(161),char(147),char(139),char(162),char(161),char(147),char(139), +char(162),char(254),char(34),char(81),char(93),char(91),char(79),char(79),char(91),char(92), +char(82),char(86),char(2),char(0),char(4),char(203),char(254),char(224),char(108),char(252), +char(193),char(5),char(182),char(251),char(58),char(245),char(138),char(3),char(71),char(252), +char(183),char(163),char(184),char(187),char(160),char(163),char(181),char(187),char(157),char(114), +char(118),char(117),char(115),char(115),char(112),char(112),char(253),char(32),char(135),char(135), +char(0),char(2),char(0),char(37),char(2),char(229),char(5),char(133),char(5),char(182), +char(0),char(7),char(0),char(24),char(0),char(79),char(64),char(39),char(0),char(1), +char(15),char(12),char(12),char(13),char(17),char(20),char(20),char(19),char(19),char(13), +char(6),char(1),char(3),char(5),char(25),char(26),char(23),char(22),char(9),char(10), +char(10),char(17),char(14),char(14),char(4),char(7),char(3),char(3),char(4),char(16), +char(8),char(8),char(20),char(13),char(1),char(4),char(3),char(0),char(63),char(196), +char(50),char(50),char(57),char(47),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(51),char(17),char(51),char(51),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(35),char(17),char(35),char(53), +char(33),char(21),char(35),char(1),char(3),char(35),char(23),char(17),char(35),char(17), +char(51),char(19),char(19),char(51),char(17),char(35),char(17),char(55),char(35),char(3), +char(1),char(113),char(123),char(209),char(2),char(31),char(211),char(2),char(88),char(201), +char(8),char(6),char(119),char(187),char(196),char(203),char(180),char(127),char(6),char(8), +char(211),char(2),char(229),char(2),char(103),char(106),char(106),char(253),char(153),char(2), +char(47),char(129),char(254),char(82),char(2),char(209),char(253),char(209),char(2),char(47), +char(253),char(47),char(1),char(164),char(137),char(253),char(211),char(0),char(255),char(255), +char(0),char(80),char(0),char(0),char(5),char(244),char(5),char(205),char(2),char(6), +char(1),char(118),char(0),char(0),char(0),char(2),char(0),char(102),char(255),char(221), +char(4),char(139),char(4),char(72),char(0),char(23),char(0),char(31),char(0),char(52), +char(64),char(26),char(31),char(14),char(14),char(4),char(24),char(12),char(12),char(21), +char(4),char(3),char(32),char(33),char(13),char(20),char(47),char(31),char(63),char(31), +char(2),char(31),char(31),char(17),char(28),char(8),char(17),char(0),char(0),char(47), +char(50),char(47),char(51),char(18),char(57),char(47),char(93),char(57),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(5),char(34),char(38),char(2),char(53),char(52),char(54),char(54), +char(51),char(50),char(22),char(18),char(21),char(33),char(17),char(22),char(22),char(51), +char(50),char(54),char(55),char(23),char(6),char(6),char(19),char(17),char(38),char(38), +char(35),char(34),char(7),char(17),char(2),char(121),char(157),char(241),char(133),char(138), +char(244),char(149),char(152),char(243),char(135),char(252),char(197),char(49),char(166),char(82), +char(131),char(183),char(81),char(72),char(98),char(217),char(147),char(50),char(163),char(88), +char(173),char(122),char(35),char(147),char(1),char(5),char(157),char(171),char(255),char(140), +char(142),char(254),char(253),char(165),char(254),char(156),char(53),char(70),char(105),char(129), +char(41),char(155),char(124),char(2),char(139),char(1),char(21),char(53),char(66),char(117), +char(254),char(233),char(255),char(255),char(0),char(71),char(255),char(236),char(5),char(243), +char(5),char(182),char(0),char(39),char(2),char(23),char(2),char(92),char(0),char(0), +char(0),char(38),char(0),char(123),char(251),char(0),char(1),char(7),char(2),char(64), +char(3),char(96),char(253),char(179),char(0),char(11),char(180),char(4),char(3),char(2), +char(25),char(25),char(0),char(63),char(53),char(53),char(53),char(0),char(255),char(255), +char(0),char(32),char(255),char(236),char(6),char(8),char(5),char(201),char(0),char(39), +char(2),char(23),char(2),char(162),char(0),char(0),char(0),char(39),char(2),char(64), +char(3),char(117),char(253),char(179),char(1),char(6),char(0),char(117),char(255),char(0), +char(0),char(11),char(180),char(1),char(3),char(2),char(14),char(25),char(0),char(63), +char(53),char(53),char(53),char(0),char(255),char(255),char(0),char(71),char(255),char(236), +char(6),char(4),char(5),char(182),char(0),char(39),char(2),char(23),char(2),char(156), +char(0),char(0),char(0),char(38),char(2),char(61),char(12),char(0),char(1),char(7), +char(2),char(64),char(3),char(113),char(253),char(179),char(0),char(11),char(180),char(4), +char(3),char(2),char(44),char(25),char(0),char(63),char(53),char(53),char(53),char(0), +char(255),char(255),char(0),char(106),char(255),char(236),char(6),char(0),char(5),char(182), +char(0),char(39),char(2),char(23),char(2),char(70),char(0),char(0),char(0),char(39), +char(2),char(64),char(3),char(109),char(253),char(179),char(1),char(6),char(2),char(63), +char(49),char(0),char(0),char(11),char(180),char(1),char(3),char(2),char(14),char(25), +char(0),char(63),char(53),char(53),char(53),char(0),char(0),char(2),char(0),char(102), +char(255),char(236),char(4),char(53),char(5),char(199),char(0),char(26),char(0),char(40), +char(0),char(65),char(64),char(34),char(38),char(7),char(31),char(15),char(15),char(0), +char(0),char(20),char(7),char(3),char(41),char(42),char(11),char(34),char(71),char(89), +char(14),char(4),char(11),char(11),char(24),char(4),char(24),char(17),char(70),char(89), +char(24),char(3),char(4),char(27),char(70),char(89),char(4),char(22),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(18),char(57),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(2), +char(4),char(35),char(34),char(38),char(53),char(52),char(18),char(54),char(51),char(50), +char(22),char(23),char(55),char(16),char(33),char(34),char(6),char(7),char(53),char(54), +char(54),char(51),char(50),char(18),char(1),char(50),char(54),char(18),char(55),char(38), +char(38),char(35),char(34),char(6),char(6),char(21),char(20),char(22),char(4),char(53), +char(167),char(254),char(236),char(173),char(172),char(187),char(136),char(232),char(151),char(97), +char(146),char(43),char(4),char(254),char(230),char(62),char(144),char(48),char(47),char(155), +char(74),char(210),char(216),char(253),char(162),char(95),char(166),char(120),char(22),char(25), +char(128),char(80),char(101),char(165),char(101),char(101),char(3),char(166),char(254),char(250), +char(254),char(53),char(233),char(201),char(192),char(169),char(1),char(51),char(161),char(93), +char(75),char(90),char(1),char(149),char(44),char(33),char(159),char(23),char(37),char(254), +char(236),char(251),char(198),char(144),char(1),char(3),char(150),char(97),char(108),char(132), +char(250),char(128),char(118),char(130),char(0),char(2),char(0),char(39),char(0),char(0), +char(4),char(109),char(5),char(182),char(0),char(5),char(0),char(12),char(0),char(40), +char(64),char(19),char(9),char(5),char(10),char(4),char(5),char(4),char(14),char(13), +char(6),char(5),char(1),char(5),char(9),char(73),char(89),char(5),char(18),char(1), +char(3),char(0),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(17), +char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(55),char(1),char(51),char(1),char(21),char(33),char(1),char(6),char(7),char(1), +char(33),char(1),char(38),char(39),char(1),char(207),char(166),char(1),char(209),char(251), +char(186),char(2),char(33),char(61),char(40),char(254),char(252),char(2),char(209),char(254), +char(254),char(68),char(104),char(5),char(78),char(250),char(176),char(102),char(4),char(244), +char(225),char(121),char(252),char(254),char(2),char(249),char(202),char(0),char(0),char(1), +char(0),char(201),char(254),char(16),char(5),char(33),char(5),char(182),char(0),char(7), +char(0),char(35),char(64),char(17),char(0),char(7),char(3),char(4),char(7),char(4), +char(9),char(8),char(5),char(2),char(73),char(89),char(5),char(3),char(0),char(4), +char(27),char(0),char(63),char(51),char(63),char(43),char(17),char(18),char(1),char(57), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(33), +char(17),char(35),char(17),char(33),char(17),char(4),char(119),char(252),char(252),char(170), +char(4),char(88),char(254),char(16),char(7),char(13),char(248),char(243),char(7),char(166), +char(248),char(90),char(0),char(1),char(0),char(76),char(254),char(16),char(4),char(221), +char(5),char(182),char(0),char(11),char(0),char(49),char(64),char(26),char(7),char(9), +char(9),char(3),char(0),char(8),char(2),char(10),char(6),char(2),char(0),char(4), +char(12),char(13),char(4),char(7),char(73),char(89),char(4),char(3),char(0),char(9), +char(73),char(89),char(0),char(27),char(0),char(63),char(43),char(0),char(24),char(63), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(51),char(17),char(51),char(49),char(48),char(19),char(53),char(1),char(1),char(53), +char(33),char(21),char(33),char(1),char(1),char(33),char(21),char(76),char(2),char(119), +char(253),char(153),char(4),char(64),char(252),char(176),char(2),char(67),char(253),char(164), +char(3),char(170),char(254),char(16),char(107),char(3),char(156),char(3),char(51),char(108), +char(151),char(252),char(252),char(252),char(141),char(152),char(0),char(1),char(0),char(104), +char(2),char(141),char(4),char(41),char(3),char(23),char(0),char(3),char(0),char(21), +char(64),char(9),char(2),char(0),char(5),char(4),char(1),char(0),char(80),char(89), +char(1),char(0),char(47),char(43),char(17),char(18),char(1),char(57),char(57),char(49), +char(48),char(19),char(53),char(33),char(21),char(104),char(3),char(193),char(2),char(141), +char(138),char(138),char(0),char(1),char(0),char(37),char(255),char(242),char(4),char(188), +char(6),char(152),char(0),char(8),char(0),char(28),char(64),char(11),char(8),char(10), +char(3),char(9),char(3),char(6),char(4),char(4),char(1),char(8),char(1),char(0), +char(47),char(47),char(18),char(57),char(47),char(57),char(51),char(17),char(1),char(51), +char(17),char(51),char(49),char(48),char(5),char(35),char(1),char(35),char(53),char(33), +char(19),char(1),char(51),char(2),char(111),char(127),char(254),char(233),char(180),char(1), +char(33),char(235),char(2),char(2),char(137),char(14),char(3),char(14),char(135),char(253), +char(84),char(5),char(189),char(0),char(0),char(3),char(0),char(119),char(1),char(147), +char(5),char(45),char(4),char(12),char(0),char(21),char(0),char(33),char(0),char(45), +char(0),char(51),char(64),char(24),char(31),char(12),char(43),char(0),char(0),char(37), +char(25),char(12),char(4),char(46),char(47),char(34),char(28),char(28),char(17),char(6), +char(9),char(19),char(15),char(40),char(22),char(22),char(3),char(9),char(0),char(47), +char(51),char(51),char(17),char(51),char(47),char(51),char(18),char(57),char(57),char(51), +char(17),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(20),char(6),char(35),char(34),char(38),char(39), +char(6),char(6),char(35),char(34),char(38),char(53),char(52),char(54),char(51),char(50), +char(23),char(54),char(51),char(50),char(22),char(1),char(50),char(54),char(55),char(38), +char(38),char(35),char(34),char(6),char(21),char(20),char(22),char(1),char(34),char(6), +char(7),char(22),char(22),char(51),char(50),char(54),char(53),char(52),char(38),char(5), +char(45),char(167),char(128),char(93),char(153),char(65),char(60),char(153),char(88),char(131), +char(168),char(168),char(131),char(181),char(122),char(124),char(185),char(133),char(162),char(252), +char(125),char(66),char(109),char(54),char(50),char(109),char(72),char(76),char(100),char(97), +char(2),char(161),char(66),char(109),char(55),char(51),char(110),char(71),char(76),char(100), +char(101),char(2),char(207),char(131),char(185),char(106),char(116),char(104),char(113),char(173), +char(142),char(134),char(179),char(219),char(215),char(175),char(254),char(187),char(91),char(100), +char(97),char(93),char(105),char(87),char(83),char(106),char(1),char(121),char(92),char(98), +char(97),char(94),char(107),char(84),char(85),char(105),char(0),char(1),char(0),char(12), +char(254),char(20),char(2),char(248),char(6),char(20),char(0),char(20),char(0),char(28), +char(64),char(12),char(8),char(18),char(2),char(18),char(13),char(3),char(21),char(22), +char(16),char(11),char(5),char(0),char(0),char(47),char(50),char(47),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(50), +char(23),char(21),char(38),char(35),char(34),char(21),char(17),char(20),char(6),char(35), +char(34),char(39),char(53),char(22),char(51),char(50),char(53),char(17),char(16),char(2), +char(125),char(79),char(44),char(49),char(62),char(176),char(165),char(163),char(74),char(59), +char(61),char(58),char(182),char(6),char(20),char(16),char(137),char(22),char(243),char(250), +char(225),char(176),char(187),char(19),char(135),char(22),char(243),char(5),char(31),char(1), +char(106),char(0),char(0),char(2),char(0),char(98),char(1),char(135),char(4),char(45), +char(4),char(31),char(0),char(23),char(0),char(47),char(0),char(112),char(64),char(64), +char(40),char(15),char(27),char(3),char(15),char(3),char(49),char(48),char(39),char(30), +char(30),char(24),char(80),char(89),char(15),char(30),char(31),char(30),char(47),char(30), +char(3),char(9),char(3),char(30),char(42),char(64),char(42),char(36),char(80),char(89), +char(27),char(42),char(64),char(15),char(6),char(6),char(0),char(80),char(89),char(15), +char(6),char(31),char(6),char(47),char(6),char(3),char(9),char(3),char(6),char(18), +char(64),char(18),char(12),char(80),char(89),char(3),char(0),char(18),char(16),char(18), +char(32),char(18),char(3),char(18),char(0),char(47),char(93),char(196),char(43),char(0), +char(26),char(24),char(16),char(205),char(95),char(94),char(93),char(43),char(0),char(16), +char(24),char(196),char(26),char(222),char(196),char(43),char(0),char(26),char(24),char(16), +char(205),char(95),char(94),char(93),char(43),char(0),char(16),char(24),char(196),char(17), +char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(34),char(6),char(7),char(53),char(54),char(51),char(50),char(22),char(23), +char(22),char(22),char(51),char(50),char(54),char(55),char(21),char(6),char(35),char(34), +char(38),char(39),char(38),char(38),char(3),char(34),char(6),char(7),char(53),char(54), +char(51),char(50),char(22),char(23),char(22),char(22),char(51),char(50),char(54),char(55), +char(21),char(6),char(35),char(34),char(38),char(39),char(38),char(38),char(1),char(80), +char(54),char(127),char(57),char(108),char(148),char(67),char(112),char(88),char(77),char(91), +char(45),char(53),char(128),char(54),char(101),char(153),char(67),char(111),char(88),char(73), +char(91),char(49),char(57),char(128),char(53),char(106),char(150),char(69),char(116),char(82), +char(69),char(95),char(49),char(55),char(129),char(51),char(100),char(154),char(69),char(118), +char(79),char(84),char(85),char(2),char(0),char(64),char(57),char(150),char(110),char(28), +char(37),char(33),char(25),char(66),char(57),char(151),char(109),char(29),char(37),char(30), +char(25),char(1),char(150),char(68),char(53),char(149),char(109),char(32),char(34),char(29), +char(26),char(66),char(55),char(150),char(110),char(32),char(33),char(34),char(24),char(0), +char(0),char(1),char(0),char(104),char(0),char(166),char(4),char(41),char(5),char(2), +char(0),char(19),char(0),char(70),char(64),char(38),char(5),char(1),char(16),char(11), +char(11),char(9),char(10),char(14),char(4),char(0),char(19),char(1),char(8),char(20), +char(21),char(13),char(5),char(6),char(5),char(80),char(89),char(10),char(8),char(15), +char(6),char(1),char(9),char(3),char(6),char(14),char(2),char(1),char(2),char(80), +char(89),char(18),char(17),char(1),char(0),char(47),char(51),char(196),char(43),char(17), +char(0),char(51),char(24),char(47),char(95),char(94),char(93),char(198),char(51),char(43), +char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(33),char(53),char(33),char(19),char(33), +char(53),char(33),char(19),char(23),char(7),char(33),char(21),char(33),char(3),char(33), +char(21),char(33),char(3),char(39),char(1),char(125),char(254),char(235),char(1),char(84), +char(127),char(254),char(45),char(2),char(19),char(135),char(125),char(109),char(1),char(23), +char(254),char(170),char(129),char(1),char(215),char(253),char(233),char(131),char(125),char(1), +char(193),char(137),char(1),char(16),char(137),char(1),char(31),char(57),char(230),char(137), +char(254),char(240),char(137),char(254),char(229),char(55),char(255),char(255),char(0),char(104), +char(0),char(1),char(4),char(41),char(4),char(217),char(2),char(38),char(0),char(31), +char(0),char(0),char(1),char(7),char(2),char(43),char(0),char(0),char(253),char(116), +char(0),char(9),char(179),char(1),char(0),char(7),char(18),char(0),char(63),char(53), +char(53),char(0),char(255),char(255),char(0),char(104),char(0),char(1),char(4),char(41), +char(4),char(217),char(2),char(38),char(0),char(33),char(0),char(0),char(1),char(7), +char(2),char(43),char(0),char(0),char(253),char(116),char(0),char(9),char(179),char(1), +char(0),char(7),char(18),char(0),char(63),char(53),char(53),char(0),char(0),char(2), +char(0),char(111),char(0),char(0),char(4),char(61),char(5),char(195),char(0),char(5), +char(0),char(9),char(0),char(32),char(64),char(13),char(8),char(0),char(6),char(3), +char(0),char(3),char(10),char(11),char(9),char(7),char(2),char(5),char(2),char(0), +char(47),char(47),char(18),char(57),char(57),char(17),char(18),char(1),char(57),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(19),char(1),char(51),char(1), +char(1),char(35),char(9),char(3),char(111),char(1),char(194),char(72),char(1),char(196), +char(254),char(60),char(72),char(1),char(98),char(254),char(195),char(254),char(195),char(1), +char(61),char(2),char(223),char(2),char(228),char(253),char(28),char(253),char(33),char(2), +char(225),char(2),char(19),char(253),char(237),char(253),char(236),char(0),char(255),char(255), +char(0),char(29),char(0),char(0),char(4),char(28),char(6),char(31),char(0),char(38), +char(0),char(73),char(0),char(0),char(0),char(7),char(0),char(76),char(2),char(182), +char(0),char(0),char(255),char(255),char(0),char(29),char(0),char(0),char(4),char(12), +char(6),char(31),char(0),char(38),char(0),char(73),char(0),char(0),char(0),char(7), +char(0),char(79),char(2),char(182),char(0),char(0),char(0),char(1),char(0),char(219), +char(4),char(217),char(3),char(190),char(6),char(12),char(0),char(13),char(0),char(24), +char(64),char(9),char(11),char(3),char(15),char(14),char(10),char(4),char(128),char(7), +char(0),char(0),char(47),char(50),char(26),char(204),char(50),char(17),char(18),char(1), +char(57),char(57),char(49),char(48),char(1),char(34),char(38),char(39),char(51),char(22), +char(22),char(51),char(50),char(54),char(55),char(51),char(6),char(6),char(2),char(72), +char(185),char(170),char(10),char(156),char(9),char(91),char(113),char(103),char(99),char(11), +char(157),char(12),char(178),char(4),char(217),char(143),char(164),char(104),char(82),char(88), +char(98),char(158),char(149),char(0),char(0),char(1),char(255),char(145),char(254),char(20), +char(1),char(86),char(4),char(72),char(0),char(12),char(0),char(29),char(64),char(13), +char(11),char(8),char(8),char(14),char(13),char(9),char(15),char(0),char(5),char(70), +char(89),char(0),char(27),char(0),char(63),char(43),char(0),char(24),char(63),char(17), +char(18),char(1),char(57),char(17),char(51),char(49),char(48),char(19),char(34),char(39), +char(53),char(22),char(51),char(50),char(54),char(53),char(17),char(51),char(17),char(16), +char(43),char(95),char(59),char(69),char(67),char(78),char(73),char(166),char(254),char(20), +char(25),char(135),char(20),char(85),char(87),char(4),char(252),char(251),char(16),char(254), +char(188),char(0),char(0),char(1),char(1),char(137),char(4),char(205),char(2),char(117), +char(6),char(20),char(0),char(9),char(0),char(19),char(182),char(9),char(4),char(10), +char(11),char(4),char(128),char(9),char(0),char(47),char(26),char(205),char(17),char(18), +char(1),char(57),char(57),char(49),char(48),char(1),char(54),char(54),char(55),char(51), +char(21),char(6),char(6),char(7),char(35),char(1),char(137),char(19),char(39),char(10), +char(168),char(11),char(88),char(47),char(90),char(4),char(229),char(55),char(167),char(81), +char(18),char(51),char(188),char(70),char(0),char(1),char(1),char(113),char(254),char(59), +char(2),char(111),char(255),char(131),char(0),char(9),char(0),char(19),char(182),char(9), +char(4),char(10),char(11),char(9),char(128),char(4),char(0),char(47),char(26),char(205), +char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(1),char(54),char(54), +char(55),char(51),char(21),char(6),char(6),char(7),char(35),char(1),char(113),char(28), +char(51),char(7),char(168),char(11),char(98),char(55),char(90),char(254),char(84),char(64), +char(186),char(53),char(18),char(51),char(193),char(66),char(0),char(1),char(1),char(129), +char(4),char(217),char(2),char(127),char(6),char(33),char(0),char(9),char(0),char(19), +char(182),char(9),char(4),char(10),char(11),char(9),char(128),char(4),char(0),char(47), +char(26),char(205),char(17),char(18),char(1),char(57),char(57),char(49),char(48),char(1), +char(6),char(6),char(7),char(35),char(53),char(54),char(54),char(55),char(51),char(2), +char(127),char(29),char(53),char(6),char(166),char(14),char(99),char(49),char(92),char(6), +char(8),char(61),char(193),char(49),char(19),char(61),char(191),char(57),char(0),char(2), +char(0),char(39),char(2),char(57),char(2),char(158),char(5),char(199),char(0),char(11), +char(0),char(21),char(0),char(32),char(64),char(14),char(6),char(12),char(0),char(17), +char(12),char(17),char(23),char(22),char(9),char(19),char(31),char(3),char(14),char(33), +char(0),char(63),char(51),char(63),char(51),char(17),char(18),char(1),char(57),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(19),char(20),char(22),char(51), +char(50),char(54),char(53),char(52),char(38),char(35),char(34),char(6),char(5),char(16), +char(33),char(34),char(38),char(53),char(16),char(33),char(50),char(22),char(176),char(82), +char(94),char(94),char(86),char(86),char(94),char(94),char(82),char(1),char(238),char(254), +char(196),char(158),char(157),char(1),char(59),char(158),char(158),char(4),char(0),char(168), +char(166),char(165),char(171),char(170),char(164),char(165),char(169),char(254),char(55),char(236), +char(221),char(1),char(197),char(232),char(0),char(2),char(0),char(20),char(2),char(74), +char(2),char(180),char(5),char(188),char(0),char(10),char(0),char(20),char(0),char(60), +char(64),char(31),char(20),char(5),char(11),char(7),char(3),char(3),char(9),char(2), +char(0),char(2),char(5),char(3),char(21),char(22),char(1),char(5),char(5),char(9), +char(15),char(20),char(31),char(20),char(2),char(20),char(20),char(3),char(14),char(7), +char(31),char(3),char(32),char(0),char(63),char(63),char(51),char(18),char(57),char(47), +char(93),char(51),char(51),char(17),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(51),char(17),char(51),char(51),char(17),char(51),char(49),char(48), +char(1),char(35),char(21),char(35),char(53),char(33),char(53),char(1),char(51),char(17), +char(51),char(33),char(53),char(52),char(55),char(14),char(3),char(7),char(7),char(2), +char(180),char(125),char(145),char(254),char(110),char(1),char(152),char(139),char(125),char(254), +char(242),char(6),char(5),char(24),char(30),char(30),char(11),char(168),char(3),char(20), +char(202),char(202),char(101),char(2),char(67),char(253),char(205),char(195),char(134),char(75), +char(12),char(39),char(45),char(45),char(17),char(246),char(0),char(1),char(0),char(59), +char(2),char(55),char(2),char(137),char(5),char(170),char(0),char(29),char(0),char(43), +char(64),char(21),char(16),char(3),char(28),char(23),char(9),char(23),char(26),char(3), +char(4),char(31),char(30),char(19),char(0),char(0),char(6),char(27),char(24),char(30), +char(13),char(6),char(33),char(0),char(63),char(51),char(63),char(51),char(18),char(57), +char(47),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(50),char(22),char(21),char(20),char(6),char(35), +char(34),char(38),char(39),char(53),char(22),char(22),char(51),char(50),char(54),char(53), +char(52),char(38),char(35),char(34),char(6),char(7),char(39),char(19),char(33),char(21), +char(33),char(7),char(54),char(1),char(72),char(145),char(176),char(170),char(166),char(74), +char(139),char(41),char(56),char(140),char(54),char(95),char(110),char(109),char(102),char(57), +char(76),char(31),char(59),char(33),char(1),char(239),char(254),char(131),char(20),char(62), +char(4),char(104),char(143),char(123),char(140),char(155),char(31),char(23),char(131),char(34), +char(38),char(83),char(89),char(78),char(88),char(17),char(8),char(41),char(1),char(160), +char(104),char(230),char(12),char(0),char(0),char(2),char(0),char(41),char(2),char(57), +char(2),char(162),char(5),char(199),char(0),char(23),char(0),char(35),char(0),char(54), +char(64),char(28),char(27),char(18),char(33),char(11),char(0),char(0),char(6),char(18), +char(3),char(37),char(36),char(30),char(11),char(21),char(0),char(15),char(16),char(15), +char(2),char(15),char(15),char(3),char(24),char(21),char(33),char(8),char(3),char(31), +char(0),char(63),char(51),char(63),char(51),char(18),char(57),char(47),char(93),char(18), +char(57),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51), +char(17),char(51),char(49),char(48),char(19),char(16),char(54),char(51),char(50),char(23), +char(21),char(38),char(35),char(34),char(6),char(7),char(51),char(54),char(54),char(51), +char(50),char(22),char(21),char(20),char(6),char(35),char(34),char(38),char(5),char(50), +char(54),char(53),char(52),char(38),char(35),char(34),char(6),char(21),char(20),char(22), +char(41),char(219),char(219),char(74),char(49),char(52),char(83),char(141),char(150),char(10), +char(8),char(29),char(113),char(85),char(125),char(148),char(166),char(141),char(153),char(173), +char(1),char(68),char(81),char(99),char(88),char(86),char(85),char(112),char(106),char(3), +char(195),char(1),char(5),char(255),char(15),char(114),char(18),char(153),char(166),char(43), +char(59),char(148),char(126),char(144),char(164),char(210),char(99),char(93),char(99),char(79), +char(91),char(90),char(59),char(89),char(124),char(0),char(0),char(1),char(0),char(57), +char(2),char(74),char(2),char(143),char(5),char(182),char(0),char(6),char(0),char(28), +char(64),char(13),char(1),char(5),char(5),char(0),char(2),char(3),char(7),char(8), +char(2),char(3),char(30),char(0),char(32),char(0),char(63),char(63),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(49),char(48),char(19),char(1), +char(33),char(53),char(33),char(21),char(1),char(162),char(1),char(94),char(254),char(57), +char(2),char(86),char(254),char(160),char(2),char(74),char(2),char(248),char(116),char(94), +char(252),char(242),char(0),char(3),char(0),char(51),char(2),char(57),char(2),char(147), +char(5),char(199),char(0),char(21),char(0),char(34),char(0),char(45),char(0),char(63), +char(64),char(34),char(22),char(13),char(38),char(19),char(43),char(3),char(28),char(7), +char(7),char(3),char(5),char(16),char(19),char(13),char(6),char(46),char(47),char(5), +char(16),char(32),char(32),char(11),char(41),char(27),char(41),char(2),char(41),char(41), +char(25),char(10),char(33),char(35),char(0),char(31),char(0),char(63),char(50),char(63), +char(51),char(57),char(47),char(93),char(51),char(18),char(57),char(57),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(50),char(22),char(21),char(20),char(7),char(22), +char(21),char(20),char(6),char(35),char(34),char(38),char(53),char(52),char(54),char(55), +char(38),char(38),char(53),char(52),char(54),char(3),char(20),char(22),char(51),char(50), +char(54),char(53),char(52),char(38),char(39),char(39),char(6),char(6),char(19),char(34), +char(6),char(21),char(20),char(22),char(23),char(54),char(53),char(52),char(38),char(1), +char(100),char(124),char(151),char(148),char(176),char(165),char(138),char(146),char(159),char(73), +char(85),char(74),char(57),char(157),char(53),char(84),char(86),char(90),char(84),char(93), +char(81),char(28),char(72),char(70),char(172),char(68),char(75),char(68),char(81),char(140), +char(78),char(5),char(199),char(118),char(104),char(130),char(76),char(74),char(158),char(113), +char(137),char(128),char(116),char(69),char(116),char(46),char(46),char(93),char(68),char(102), +char(126),char(253),char(102),char(60),char(73),char(73),char(60),char(63),char(79),char(28), +char(10),char(34),char(84),char(1),char(239),char(60),char(57),char(47),char(71),char(33), +char(54),char(97),char(57),char(60),char(0),char(2),char(0),char(35),char(2),char(57), +char(2),char(156),char(5),char(201),char(0),char(22),char(0),char(34),char(0),char(60), +char(64),char(31),char(26),char(17),char(32),char(10),char(0),char(0),char(5),char(17), +char(3),char(35),char(36),char(29),char(14),char(10),char(11),char(11),char(20),char(15), +char(14),char(31),char(14),char(2),char(14),char(14),char(3),char(23),char(20),char(31), +char(8),char(3),char(33),char(0),char(63),char(51),char(63),char(51),char(18),char(57), +char(47),char(93),char(18),char(57),char(17),char(51),char(17),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(51),char(17),char(51),char(49),char(48), +char(1),char(16),char(6),char(35),char(34),char(39),char(53),char(22),char(51),char(32), +char(19),char(35),char(6),char(6),char(35),char(34),char(38),char(53),char(52),char(54), +char(51),char(50),char(22),char(37),char(34),char(6),char(21),char(20),char(22),char(51), +char(50),char(54),char(53),char(52),char(38),char(2),char(156),char(218),char(212),char(83), +char(49),char(49),char(93),char(1),char(20),char(21),char(10),char(35),char(116),char(65), +char(131),char(153),char(169),char(136),char(152),char(176),char(254),char(184),char(81),char(95), +char(85),char(87),char(84),char(115),char(103),char(4),char(70),char(254),char(242),char(255), +char(15),char(116),char(20),char(1),char(70),char(51),char(52),char(146),char(131),char(136), +char(165),char(202),char(91),char(95),char(87),char(81),char(95),char(85),char(62),char(97), +char(114),char(0),char(0),char(22),char(0),char(84),char(254),char(129),char(7),char(193), +char(5),char(238),char(0),char(5),char(0),char(11),char(0),char(17),char(0),char(23), +char(0),char(27),char(0),char(31),char(0),char(35),char(0),char(39),char(0),char(43), +char(0),char(47),char(0),char(51),char(0),char(55),char(0),char(59),char(0),char(63), +char(0),char(67),char(0),char(71),char(0),char(83),char(0),char(91),char(0),char(107), +char(0),char(116),char(0),char(124),char(0),char(137),char(0),char(248),char(64),char(135), +char(65),char(64),char(61),char(60),char(49),char(48),char(15),char(5),char(0),char(12), +char(84),char(78),char(88),char(72),char(118),char(107),char(112),char(96),char(122),char(103), +char(133),char(134),char(69),char(68),char(41),char(40),char(37),char(36),char(20),char(10), +char(9),char(23),char(23),char(134),char(6),char(18),char(59),char(27),char(127),char(103), +char(96),char(56),char(24),char(55),char(47),char(107),char(52),char(44),char(72),char(35), +char(31),char(32),char(28),char(3),char(17),char(78),char(12),char(25),char(138),char(139), +char(10),char(0),char(42),char(66),char(90),char(81),char(134),char(92),char(116),char(92), +char(41),char(65),char(70),char(62),char(100),char(117),char(117),char(108),char(69),char(61), +char(130),char(125),char(86),char(75),char(107),char(118),char(107),char(38),char(50),char(37), +char(49),char(21),char(13),char(0),char(66),char(1),char(65),char(62),char(92),char(61), +char(108),char(13),char(49),char(50),char(3),char(107),char(12),char(92),char(108),char(107), +char(107),char(108),char(92),char(3),char(1),char(45),char(44),char(29),char(28),char(25), +char(24),char(19),char(18),char(15),char(12),char(57),char(56),char(53),char(52),char(33), +char(32),char(7),char(6),char(4),char(1),char(0),char(47),char(51),char(51),char(51), +char(51),char(51),char(51),char(51),char(51),char(51),char(47),char(51),char(51),char(51), +char(51),char(51),char(51),char(51),char(51),char(51),char(18),char(23),char(57),char(47), +char(47),char(47),char(17),char(18),char(23),char(57),char(17),char(57),char(18),char(57), +char(57),char(17),char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(17),char(51),char(16),char(196),char(50),char(196),char(50),char(17),char(51),char(17), +char(51),char(18),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(16), +char(196),char(196),char(50),char(17),char(51),char(17),char(51),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(51),char(51),char(51),char(51),char(51),char(51), +char(51),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(51),char(51),char(51),char(51), +char(51),char(51),char(51),char(51),char(49),char(48),char(19),char(17),char(33),char(21), +char(35),char(21),char(37),char(53),char(33),char(17),char(35),char(53),char(1),char(17), +char(51),char(21),char(51),char(21),char(33),char(53),char(51),char(53),char(51),char(17), +char(33),char(53),char(33),char(21),char(33),char(53),char(33),char(21),char(1),char(53), +char(33),char(21),char(1),char(35),char(17),char(51),char(17),char(35),char(17),char(51), +char(1),char(53),char(33),char(21),char(1),char(35),char(17),char(51),char(1),char(53), +char(33),char(21),char(51),char(53),char(33),char(21),char(1),char(35),char(17),char(51), +char(53),char(35),char(17),char(51),char(1),char(35),char(17),char(51),char(5),char(20), +char(6),char(35),char(34),char(38),char(53),char(52),char(54),char(51),char(50),char(22), +char(5),char(20),char(51),char(50),char(53),char(52),char(35),char(34),char(37),char(51), +char(50),char(22),char(21),char(20),char(6),char(7),char(21),char(22),char(22),char(21), +char(20),char(6),char(35),char(35),char(19),char(51),char(50),char(54),char(53),char(52), +char(38),char(35),char(35),char(21),char(21),char(51),char(50),char(54),char(53),char(52), +char(35),char(1),char(34),char(39),char(53),char(22),char(51),char(50),char(53),char(17), +char(51),char(17),char(20),char(6),char(84),char(1),char(47),char(192),char(5),char(206), +char(1),char(48),char(109),char(249),char(0),char(111),char(192),char(5),char(14),char(195), +char(109),char(253),char(73),char(1),char(17),char(251),char(225),char(1),char(14),char(254), +char(242),char(1),char(14),char(4),char(183),char(109),char(109),char(109),char(109),char(251), +char(194),char(1),char(16),char(252),char(48),char(111),char(111),char(2),char(192),char(1), +char(16),char(119),char(1),char(17),char(250),char(168),char(111),char(111),char(111),char(111), +char(6),char(254),char(109),char(109),char(251),char(159),char(135),char(127),char(127),char(135), +char(135),char(127),char(126),char(136),char(254),char(115),char(135),char(135),char(135),char(135), +char(1),char(225),char(172),char(109),char(112),char(46),char(44),char(61),char(46),char(109), +char(94),char(207),char(123),char(66),char(46),char(36),char(42),char(47),char(59),char(74), +char(49),char(37),char(90),char(1),char(94),char(52),char(28),char(43),char(25),char(86), +char(125),char(105),char(4),char(190),char(1),char(48),char(111),char(193),char(193),char(111), +char(254),char(208),char(193),char(249),char(2),char(1),char(47),char(194),char(109),char(109), +char(194),char(254),char(209),char(109),char(109),char(109),char(109),char(6),char(254),char(111), +char(111),char(250),char(168),char(1),char(14),char(2),char(2),char(1),char(15),char(250), +char(59),char(109),char(109),char(1),char(166),char(1),char(14),char(4),char(74),char(111), +char(111),char(111),char(111),char(252),char(47),char(1),char(16),char(121),char(1),char(15), +char(253),char(104),char(1),char(16),char(73),char(145),char(156),char(156),char(145),char(146), +char(155),char(154),char(147),char(197),char(197),char(196),char(97),char(67),char(83),char(49), +char(66),char(8),char(8),char(14),char(68),char(53),char(81),char(89),char(1),char(98), +char(34),char(32),char(34),char(29),char(227),char(154),char(43),char(37),char(74),char(254), +char(250),char(10),char(102),char(8),char(86),char(1),char(146),char(254),char(114),char(95), +char(99),char(0),char(0),char(3),char(0),char(84),char(254),char(193),char(7),char(170), +char(6),char(20),char(0),char(3),char(0),char(30),char(0),char(42),char(0),char(46), +char(64),char(25),char(1),char(11),char(23),char(37),char(4),char(30),char(31),char(17), +char(3),char(9),char(43),char(44),char(40),char(30),char(20),char(14),char(34),char(30), +char(14),char(14),char(30),char(34),char(3),char(2),char(0),char(0),char(47),char(47), +char(23),char(57),char(47),char(47),char(47),char(17),char(51),char(17),char(51),char(17), +char(18),char(1),char(23),char(57),char(49),char(48),char(9),char(3),char(5),char(53), +char(52),char(54),char(55),char(54),char(54),char(53),char(52),char(38),char(35),char(34), +char(6),char(7),char(23),char(54),char(51),char(50),char(22),char(21),char(20),char(6), +char(7),char(6),char(6),char(21),char(21),char(3),char(20),char(22),char(51),char(50), +char(54),char(53),char(52),char(38),char(35),char(34),char(6),char(3),char(254),char(3), +char(172),char(252),char(84),char(252),char(86),char(3),char(235),char(44),char(65),char(103), +char(73),char(187),char(165),char(79),char(186),char(71),char(82),char(160),char(90),char(63), +char(62),char(49),char(72),char(84),char(59),char(27),char(71),char(70),char(66),char(73), +char(72),char(67),char(72),char(69),char(6),char(20),char(252),char(86),char(252),char(87), +char(3),char(169),char(251),char(47),char(50),char(65),char(49),char(82),char(126),char(88), +char(135),char(154),char(56),char(42),char(178),char(80),char(58),char(47),char(53),char(75), +char(54),char(68),char(112),char(74),char(59),char(254),char(237),char(63),char(72),char(73), +char(62),char(64),char(73),char(72),char(255),char(255),char(255),char(145),char(254),char(20), +char(2),char(87),char(6),char(33),char(2),char(38),char(2),char(55),char(0),char(0), +char(1),char(7),char(1),char(76),char(254),char(169),char(0),char(0),char(0),char(8), +char(179),char(1),char(24),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(25),char(3),char(193),char(1),char(68),char(5),char(182),char(2),char(6), +char(2),char(7),char(0),char(0),char(0),char(2),char(0),char(10),char(255),char(236), +char(4),char(223),char(6),char(43),char(0),char(45),char(0),char(54),char(0),char(102), +char(64),char(57),char(27),char(7),char(23),char(11),char(52),char(37),char(46),char(31), +char(31),char(43),char(2),char(45),char(2),char(37),char(11),char(7),char(18),char(6), +char(55),char(56),char(20),char(14),char(71),char(89),char(0),char(33),char(46),char(33), +char(71),char(89),char(43),char(46),char(15),char(46),char(31),char(46),char(2),char(9), +char(3),char(20),char(46),char(20),char(46),char(5),char(40),char(40),char(49),char(70), +char(89),char(40),char(1),char(5),char(29),char(70),char(89),char(5),char(22),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57), +char(57),char(24),char(47),char(47),char(95),char(94),char(93),char(17),char(51),char(43), +char(17),char(0),char(51),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(22),char(21),char(16),char(0),char(33),char(32),char(17), +char(52),char(55),char(54),char(53),char(52),char(38),char(35),char(34),char(6),char(7), +char(39),char(54),char(51),char(50),char(22),char(21),char(20),char(7),char(6),char(21), +char(20),char(51),char(32),char(17),char(52),char(39),char(38),char(36),char(38),char(53), +char(52),char(54),char(51),char(50),char(0),char(19),char(51),char(21),char(37),char(38), +char(2),char(35),char(34),char(6),char(21),char(20),char(4),char(4),char(86),char(4), +char(254),char(224),char(254),char(253),char(254),char(119),char(16),char(15),char(36),char(32), +char(25),char(54),char(15),char(33),char(83),char(95),char(88),char(93),char(15),char(16), +char(233),char(1),char(119),char(4),char(223),char(254),char(201),char(160),char(182),char(168), +char(208),char(1),char(0),char(42),char(143),char(254),char(199),char(28),char(183),char(123), +char(93),char(97),char(1),char(19),char(3),char(78),char(46),char(65),char(254),char(159), +char(254),char(110),char(1),char(88),char(57),char(123),char(122),char(23),char(47),char(35), +char(15),char(9),char(118),char(39),char(93),char(93),char(35),char(131),char(132),char(58), +char(207),char(2),char(112),char(63),char(44),char(2),char(105),char(188),char(131),char(144), +char(163),char(254),char(205),char(254),char(215),char(129),char(129),char(211),char(1),char(0), +char(95),char(75),char(141),char(154),char(0),char(1),char(0),char(0),char(0),char(0), +char(4),char(123),char(5),char(195),char(0),char(21),char(0),char(40),char(64),char(20), +char(17),char(18),char(7),char(18),char(20),char(3),char(22),char(23),char(0),char(18), +char(20),char(3),char(18),char(18),char(5),char(10),char(74),char(89),char(5),char(4), +char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(18),char(57),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(18), +char(18),char(54),char(54),char(51),char(50),char(23),char(21),char(38),char(35),char(34), +char(14),char(3),char(7),char(17),char(35),char(17),char(1),char(51),char(2),char(57), +char(122),char(141),char(77),char(92),char(58),char(48),char(40),char(26),char(31),char(40), +char(59),char(86),char(124),char(101),char(31),char(172),char(254),char(35),char(186),char(2), +char(205),char(1),char(35),char(1),char(55),char(108),char(48),char(15),char(135),char(6), +char(56),char(161),char(252),char(236),char(85),char(253),char(227),char(2),char(47),char(3), +char(135),char(0),char(0),char(2),char(0),char(18),char(255),char(236),char(6),char(119), +char(4),char(72),char(0),char(20),char(0),char(41),char(0),char(76),char(64),char(39), +char(24),char(3),char(18),char(33),char(33),char(30),char(39),char(13),char(10),char(13), +char(30),char(3),char(6),char(5),char(42),char(43),char(19),char(31),char(31),char(0), +char(8),char(21),char(11),char(6),char(8),char(6),char(70),char(89),char(8),char(15), +char(36),char(27),char(0),char(27),char(70),char(89),char(16),char(0),char(22),char(0), +char(63),char(50),char(43),char(17),char(0),char(51),char(24),char(63),char(43),char(17), +char(0),char(51),char(51),char(17),char(18),char(57),char(24),char(47),char(57),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(18),char(57), +char(17),char(51),char(49),char(48),char(5),char(34),char(38),char(53),char(52),char(19), +char(33),char(53),char(55),char(33),char(21),char(35),char(22),char(21),char(20),char(6), +char(35),char(34),char(39),char(35),char(6),char(1),char(6),char(2),char(21),char(20), +char(22),char(51),char(50),char(54),char(53),char(53),char(51),char(21),char(20),char(22), +char(51),char(50),char(54),char(53),char(52),char(39),char(2),char(41),char(186),char(199), +char(135),char(254),char(227),char(142),char(5),char(215),char(250),char(117),char(200),char(185), +char(221),char(68),char(8),char(68),char(254),char(207),char(63),char(66),char(108),char(117), +char(93),char(108),char(162),char(107),char(93),char(117),char(109),char(111),char(20),char(231), +char(240),char(240),char(1),char(7),char(74),char(68),char(142),char(252),char(251),char(240), +char(231),char(182),char(182),char(3),char(206),char(132),char(254),char(254),char(103),char(174), +char(168),char(143),char(125),char(188),char(188),char(122),char(146),char(169),char(173),char(254), +char(239),char(0),char(255),char(255),char(0),char(201),char(0),char(0),char(6),char(113), +char(7),char(117),char(2),char(38),char(0),char(48),char(0),char(0),char(1),char(7), +char(0),char(118),char(1),char(156),char(1),char(84),char(0),char(8),char(179),char(1), +char(29),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(176), +char(0),char(0),char(6),char(203),char(6),char(33),char(2),char(38),char(0),char(80), +char(0),char(0),char(1),char(7),char(0),char(118),char(1),char(205),char(0),char(0), +char(0),char(8),char(179),char(1),char(45),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(0),char(253),char(213),char(5),char(16),char(5),char(188), +char(2),char(38),char(0),char(36),char(0),char(0),char(0),char(7),char(2),char(91), +char(1),char(53),char(0),char(0),char(255),char(255),char(0),char(94),char(253),char(213), +char(3),char(205),char(4),char(90),char(2),char(38),char(0),char(68),char(0),char(0), +char(0),char(7),char(2),char(91),char(0),char(199),char(0),char(0),char(255),char(255), +char(254),char(223),char(255),char(236),char(5),char(210),char(5),char(205),char(0),char(38), +char(0),char(50),char(20),char(0),char(1),char(7),char(2),char(92),char(254),char(71), +char(0),char(0),char(0),char(9),char(179),char(3),char(2),char(26),char(3),char(0), +char(63),char(53),char(53),char(0),char(0),char(2),char(0),char(117),char(253),char(213), +char(2),char(53),char(255),char(131),char(0),char(11),char(0),char(23),char(0),char(30), +char(64),char(12),char(18),char(6),char(12),char(0),char(6),char(0),char(24),char(25), +char(21),char(3),char(15),char(9),char(0),char(47),char(51),char(204),char(50),char(17), +char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(20),char(6),char(35),char(34),char(38),char(53),char(52),char(54),char(51), +char(50),char(22),char(7),char(52),char(38),char(35),char(34),char(6),char(21),char(20), +char(22),char(51),char(50),char(54),char(2),char(53),char(125),char(102),char(101),char(120), +char(120),char(101),char(101),char(126),char(110),char(66),char(51),char(51),char(66),char(60), +char(57),char(53),char(64),char(254),char(174),char(97),char(120),char(117),char(98),char(98), +char(117),char(118),char(97),char(57),char(60),char(60),char(57),char(56),char(61),char(61), +char(0),char(2),char(0),char(152),char(4),char(104),char(2),char(207),char(5),char(197), +char(0),char(8),char(0),char(23),char(0),char(30),char(64),char(14),char(14),char(9), +char(3),char(8),char(12),char(19),char(9),char(5),char(24),char(25),char(2),char(11), +char(8),char(21),char(0),char(47),char(196),char(220),char(198),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(54),char(55),char(51), +char(21),char(6),char(6),char(7),char(35),char(37),char(52),char(55),char(21),char(6), +char(21),char(20),char(30),char(2),char(21),char(20),char(35),char(34),char(38),char(1), +char(176),char(70),char(28),char(189),char(41),char(119),char(49),char(78),char(254),char(232), +char(237),char(121),char(31),char(37),char(31),char(93),char(55),char(67),char(4),char(135), +char(181),char(122),char(20),char(78),char(172),char(57),char(118),char(163),char(61),char(72), +char(41),char(53),char(20),char(19),char(16),char(26),char(28),char(74),char(68),char(0), +char(255),char(255),char(0),char(29),char(0),char(0),char(6),char(211),char(6),char(31), +char(0),char(39),char(0),char(73),char(2),char(176),char(0),char(0),char(0),char(38), +char(0),char(73),char(0),char(0),char(0),char(7),char(0),char(76),char(5),char(109), +char(0),char(0),char(255),char(255),char(0),char(29),char(0),char(0),char(6),char(195), +char(6),char(31),char(0),char(39),char(0),char(73),char(2),char(176),char(0),char(0), +char(0),char(38),char(0),char(73),char(0),char(0),char(0),char(7),char(0),char(79), +char(5),char(109),char(0),char(0),char(0),char(2),char(0),char(125),char(255),char(236), +char(6),char(100),char(6),char(20),char(0),char(21),char(0),char(33),char(0),char(60), +char(64),char(31),char(22),char(6),char(15),char(17),char(17),char(28),char(0),char(0), +char(20),char(11),char(6),char(4),char(34),char(35),char(20),char(11),char(3),char(9), +char(9),char(31),char(73),char(89),char(15),char(9),char(4),char(3),char(25),char(73), +char(89),char(3),char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(198), +char(43),char(17),char(18),char(0),char(57),char(57),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(51),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(16),char(0),char(33),char(32),char(0),char(17),char(16),char(0),char(33), +char(32),char(23),char(62),char(2),char(53),char(51),char(23),char(6),char(6),char(7), +char(22),char(1),char(16),char(18),char(51),char(50),char(18),char(17),char(16),char(2), +char(35),char(34),char(2),char(5),char(188),char(254),char(157),char(254),char(198),char(254), +char(189),char(254),char(161),char(1),char(97),char(1),char(67),char(1),char(69),char(179), +char(50),char(58),char(27),char(182),char(14),char(29),char(131),char(104),char(96),char(251), +char(117),char(250),char(244),char(243),char(246),char(245),char(242),char(243),char(253),char(2), +char(221),char(254),char(158),char(254),char(113),char(1),char(137),char(1),char(106),char(1), +char(104),char(1),char(134),char(215),char(12),char(67),char(102),char(105),char(22),char(155), +char(173),char(39),char(176),char(254),char(254),char(254),char(214),char(254),char(206),char(1), +char(49),char(1),char(43),char(1),char(39),char(1),char(49),char(254),char(209),char(0), +char(0),char(2),char(0),char(115),char(255),char(236),char(5),char(25),char(4),char(240), +char(0),char(22),char(0),char(34),char(0),char(60),char(64),char(31),char(23),char(7), +char(16),char(18),char(18),char(29),char(0),char(0),char(21),char(12),char(7),char(4), +char(35),char(36),char(21),char(12),char(3),char(10),char(10),char(32),char(70),char(89), +char(16),char(10),char(16),char(3),char(26),char(70),char(89),char(3),char(22),char(0), +char(63),char(43),char(0),char(24),char(63),char(198),char(43),char(17),char(18),char(0), +char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(0),char(35), +char(34),char(38),char(2),char(53),char(16),char(0),char(51),char(50),char(23),char(62), +char(2),char(53),char(51),char(23),char(6),char(6),char(7),char(22),char(5),char(20), +char(22),char(51),char(50),char(54),char(53),char(52),char(38),char(35),char(34),char(6), +char(4),char(98),char(254),char(242),char(238),char(147),char(228),char(124),char(1),char(12), +char(238),char(217),char(137),char(51),char(58),char(26),char(180),char(15),char(31),char(121), +char(102),char(71),char(252),char(189),char(158),char(173),char(175),char(157),char(159),char(175), +char(173),char(156),char(2),char(37),char(254),char(244),char(254),char(211),char(138),char(1), +char(2),char(173),char(1),char(12),char(1),char(43),char(141),char(15),char(65),char(99), +char(110),char(23),char(156),char(175),char(38),char(138),char(185),char(211),char(219),char(219), +char(211),char(210),char(216),char(216),char(0),char(1),char(0),char(186),char(255),char(236), +char(6),char(123),char(6),char(20),char(0),char(27),char(0),char(51),char(64),char(24), +char(5),char(7),char(7),char(1),char(11),char(20),char(17),char(11),char(17),char(29), +char(28),char(10),char(1),char(14),char(27),char(5),char(18),char(3),char(14),char(23), +char(73),char(89),char(14),char(19),char(0),char(63),char(43),char(0),char(24),char(63), +char(198),char(51),char(18),char(57),char(57),char(17),char(18),char(1),char(57),char(57), +char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(1), +char(21),char(62),char(2),char(53),char(51),char(23),char(6),char(6),char(7),char(17), +char(16),char(0),char(33),char(32),char(0),char(53),char(17),char(51),char(17),char(20), +char(22),char(51),char(50),char(54),char(53),char(17),char(5),char(25),char(58),char(70), +char(31),char(181),char(14),char(33),char(172),char(149),char(254),char(225),char(254),char(248), +char(254),char(244),char(254),char(212),char(170),char(204),char(198),char(184),char(193),char(5), +char(182),char(198),char(8),char(62),char(112),char(110),char(22),char(182),char(184),char(25), +char(253),char(141),char(254),char(254),char(254),char(234),char(1),char(31),char(253),char(3), +char(174),char(252),char(70),char(183),char(196),char(193),char(188),char(3),char(184),char(0), +char(0),char(1),char(0),char(164),char(255),char(236),char(5),char(150),char(4),char(242), +char(0),char(29),char(0),char(68),char(64),char(34),char(1),char(28),char(13),char(15), +char(15),char(19),char(20),char(7),char(7),char(10),char(19),char(28),char(19),char(30), +char(31),char(21),char(22),char(10),char(18),char(22),char(3),char(20),char(13),char(8), +char(29),char(15),char(25),char(4),char(70),char(89),char(25),char(22),char(20),char(21), +char(0),char(63),char(63),char(43),char(0),char(24),char(63),char(51),char(198),char(18), +char(23),char(57),char(17),char(51),char(17),char(18),char(1),char(57),char(57),char(17), +char(51),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(17),char(20),char(22),char(51),char(50),char(54),char(53), +char(17),char(51),char(21),char(54),char(54),char(53),char(51),char(23),char(6),char(6), +char(7),char(17),char(35),char(39),char(35),char(6),char(6),char(35),char(34),char(38), +char(53),char(17),char(1),char(76),char(122),char(130),char(172),char(159),char(166),char(82), +char(74),char(178),char(15),char(32),char(176),char(141),char(137),char(24),char(9),char(52), +char(181),char(111),char(203),char(200),char(4),char(70),char(253),char(59),char(134),char(132), +char(188),char(213),char(2),char(62),char(121),char(11),char(128),char(154),char(23),char(186), +char(191),char(14),char(252),char(172),char(147),char(82),char(85),char(190),char(209),char(2), +char(203),char(0),char(255),char(255),char(252),char(83),char(4),char(217),char(253),char(220), +char(6),char(33),char(0),char(7),char(0),char(67),char(250),char(202),char(0),char(0), +char(255),char(255),char(253),char(13),char(4),char(217),char(254),char(150),char(6),char(33), +char(0),char(7),char(0),char(118),char(251),char(132),char(0),char(0),char(255),char(255), +char(252),char(25),char(4),char(217),char(255),char(1),char(5),char(221),char(0),char(7), +char(1),char(82),char(251),char(17),char(0),char(0),char(0),char(1),char(253),char(8), +char(4),char(184),char(254),char(115),char(6),char(143),char(0),char(17),char(0),char(30), +char(64),char(12),char(2),char(5),char(5),char(13),char(13),char(8),char(0),char(0), +char(19),char(11),char(16),char(4),char(0),char(47),char(204),char(50),char(17),char(1), +char(51),char(17),char(51),char(51),char(18),char(57),char(17),char(51),char(49),char(48), +char(1),char(20),char(7),char(7),char(35),char(39),char(54),char(54),char(53),char(52), +char(38),char(35),char(34),char(7),char(53),char(54),char(51),char(32),char(254),char(115), +char(166),char(10),char(105),char(12),char(86),char(78),char(67),char(73),char(62),char(32), +char(38),char(69),char(1),char(0),char(5),char(215),char(140),char(34),char(113),char(176), +char(14),char(50),char(43),char(43),char(41),char(6),char(100),char(10),char(0),char(1), +char(253),char(59),char(254),char(160),char(254),char(2),char(255),char(125),char(0),char(11), +char(0),char(17),char(181),char(6),char(0),char(0),char(13),char(9),char(3),char(0), +char(47),char(205),char(17),char(1),char(51),char(17),char(51),char(49),char(48),char(5), +char(52),char(54),char(51),char(50),char(22),char(21),char(20),char(6),char(35),char(34), +char(38),char(253),char(59),char(59),char(42),char(40),char(58),char(58),char(40),char(42), +char(59),char(242),char(57),char(54),char(54),char(57),char(55),char(55),char(55),char(0), +char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248),char(7),char(115), +char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7),char(0),char(67), +char(255),char(216),char(1),char(82),char(0),char(8),char(179),char(1),char(13),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(203),char(0),char(0), +char(5),char(82),char(7),char(115),char(2),char(38),char(1),char(178),char(0),char(0), +char(1),char(7),char(0),char(67),char(0),char(104),char(1),char(82),char(0),char(8), +char(179),char(1),char(17),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(4),char(18),char(6),char(33),char(2),char(38), +char(0),char(72),char(0),char(0),char(1),char(6),char(0),char(67),char(183),char(0), +char(0),char(8),char(179),char(2),char(28),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(176),char(0),char(0),char(4),char(98),char(6),char(33), +char(2),char(38),char(1),char(210),char(0),char(0),char(1),char(6),char(0),char(67), +char(220),char(0),char(0),char(8),char(179),char(1),char(15),char(17),char(38),char(0), +char(43),char(53),char(0),char(1),char(0),char(133),char(255),char(236),char(7),char(145), +char(5),char(201),char(0),char(49),char(0),char(69),char(64),char(36),char(34),char(22), +char(42),char(39),char(47),char(9),char(9),char(4),char(39),char(27),char(22),char(5), +char(50),char(51),char(0),char(31),char(25),char(31),char(73),char(89),char(16),char(40), +char(40),char(19),char(6),char(25),char(4),char(44),char(37),char(19),char(37),char(73), +char(89),char(12),char(19),char(19),char(0),char(63),char(51),char(43),char(17),char(0), +char(51),char(24),char(63),char(51),char(18),char(57),char(47),char(57),char(43),char(17), +char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(34),char(6),char(7),char(39), +char(54),char(51),char(50),char(0),char(17),char(16),char(0),char(35),char(34),char(38), +char(39),char(35),char(6),char(6),char(35),char(32),char(0),char(17),char(16),char(18), +char(51),char(50),char(23),char(7),char(38),char(38),char(35),char(34),char(2),char(17), +char(16),char(18),char(51),char(50),char(55),char(17),char(51),char(17),char(22),char(51), +char(50),char(18),char(17),char(16),char(2),char(5),char(164),char(60),char(94),char(45), +char(69),char(126),char(150),char(228),char(1),char(1),char(254),char(229),char(255),char(108), +char(172),char(83),char(8),char(80),char(169),char(107),char(255),char(0),char(254),char(229), +char(255),char(228),char(153),char(124),char(70),char(45),char(93),char(60),char(147),char(165), +char(207),char(187),char(139),char(102),char(170),char(102),char(142),char(187),char(206),char(165), +char(5),char(47),char(41),char(31),char(146),char(80),char(254),char(136),char(254),char(173), +char(254),char(141),char(254),char(97),char(45),char(51),char(50),char(46),char(1),char(155), +char(1),char(119),char(1),char(83),char(1),char(120),char(80),char(146),char(31),char(41), +char(254),char(215),char(254),char(246),char(254),char(211),char(254),char(178),char(76),char(1), +char(201),char(254),char(55),char(76),char(1),char(75),char(1),char(48),char(1),char(11), +char(1),char(40),char(0),char(1),char(0),char(0),char(0),char(0),char(6),char(29), +char(4),char(72),char(0),char(29),char(0),char(40),char(64),char(22),char(23),char(0), +char(13),char(14),char(5),char(5),char(30),char(31),char(27),char(21),char(13),char(0), +char(18),char(10),char(4),char(4),char(22),char(14),char(5),char(15),char(4),char(21), +char(0),char(63),char(63),char(51),char(51),char(18),char(23),char(57),char(63),char(17), +char(18),char(1),char(23),char(57),char(49),char(48),char(1),char(6),char(6),char(3), +char(35),char(1),char(51),char(19),char(22),char(23),char(51),char(54),char(54),char(19), +char(3),char(51),char(0),char(22),char(23),char(51),char(54),char(18),char(17),char(51), +char(16),char(2),char(7),char(35),char(3),char(38),char(3),char(39),char(10),char(20), +char(179),char(213),char(254),char(127),char(172),char(246),char(32),char(46),char(8),char(19), +char(74),char(142),char(172),char(178),char(1),char(9),char(45),char(10),char(8),char(173), +char(153),char(166),char(195),char(219),char(182),char(125),char(33),char(1),char(201),char(26), +char(51),char(254),char(132),char(4),char(72),char(253),char(73),char(93),char(189),char(53), +char(163),char(1),char(36),char(1),char(213),char(252),char(255),char(144),char(44),char(184), +char(1),char(179),char(1),char(82),char(254),char(150),char(254),char(7),char(229),char(1), +char(90),char(92),char(0),char(2),char(0),char(23),char(0),char(0),char(4),char(252), +char(6),char(20),char(0),char(17),char(0),char(26),char(0),char(76),char(64),char(40), +char(8),char(4),char(18),char(18),char(1),char(15),char(22),char(11),char(11),char(6), +char(15),char(0),char(4),char(27),char(28),char(7),char(17),char(0),char(17),char(73), +char(89),char(4),char(0),char(8),char(26),char(73),char(89),char(0),char(8),char(0), +char(8),char(15),char(2),char(0),char(15),char(18),char(74),char(89),char(15),char(18), +char(0),char(63),char(43),char(0),char(24),char(63),char(18),char(57),char(57),char(47), +char(47),char(43),char(17),char(0),char(51),char(43),char(17),char(0),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17), +char(51),char(51),char(49),char(48),char(19),char(33),char(17),char(51),char(17),char(33), +char(21),char(33),char(17),char(51),char(32),char(17),char(20),char(4),char(33),char(33), +char(17),char(33),char(1),char(51),char(50),char(54),char(53),char(52),char(38),char(35), +char(35),char(23),char(1),char(63),char(172),char(1),char(162),char(254),char(94),char(201), +char(2),char(49),char(254),char(247),char(254),char(251),char(254),char(104),char(254),char(193), +char(1),char(235),char(213),char(192),char(181),char(186),char(218),char(182),char(4),char(250), +char(1),char(26),char(254),char(230),char(148),char(254),char(224),char(254),char(100),char(208), +char(218),char(4),char(102),char(252),char(43),char(137),char(144),char(138),char(122),char(0), +char(0),char(2),char(0),char(23),char(0),char(0),char(4),char(156),char(5),char(39), +char(0),char(17),char(0),char(25),char(0),char(71),char(64),char(38),char(4),char(0), +char(19),char(19),char(15),char(11),char(22),char(7),char(7),char(2),char(11),char(13), +char(4),char(26),char(27),char(3),char(13),char(14),char(13),char(70),char(89),char(4), +char(18),char(70),char(89),char(4),char(4),char(11),char(16),char(0),char(14),char(15), +char(11),char(19),char(70),char(89),char(11),char(21),char(0),char(63),char(43),char(0), +char(24),char(63),char(51),char(198),char(18),char(57),char(47),char(43),char(43),char(17), +char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(51),char(17),char(51),char(51),char(49),char(48),char(1),char(33),char(21), +char(33),char(17),char(33),char(32),char(17),char(20),char(6),char(35),char(33),char(17), +char(35),char(53),char(51),char(53),char(51),char(17),char(17),char(33),char(32),char(53), +char(52),char(38),char(35),char(1),char(168),char(1),char(88),char(254),char(168),char(1), +char(63),char(1),char(181),char(223),char(220),char(254),char(33),char(235),char(235),char(166), +char(1),char(49),char(1),char(31),char(135),char(156),char(4),char(72),char(140),char(254), +char(197),char(254),char(205),char(166),char(168),char(3),char(188),char(140),char(223),char(252), +char(205),char(254),char(151),char(185),char(92),char(84),char(0),char(1),char(0),char(201), +char(255),char(236),char(7),char(33),char(5),char(203),char(0),char(32),char(0),char(74), +char(64),char(41),char(23),char(19),char(19),char(20),char(6),char(24),char(29),char(12), +char(5),char(24),char(17),char(20),char(6),char(33),char(34),char(27),char(0),char(73), +char(89),char(27),char(4),char(6),char(18),char(23),char(18),char(73),char(89),char(3), +char(23),char(23),char(20),char(21),char(3),char(20),char(18),char(14),char(9),char(73), +char(89),char(14),char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(63), +char(18),char(57),char(47),char(51),char(43),char(17),char(0),char(51),char(24),char(63), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(34),char(4),char(7),char(33),char(21), +char(33),char(18),char(0),char(51),char(50),char(55),char(21),char(6),char(35),char(32), +char(0),char(3),char(33),char(17),char(35),char(17),char(51),char(17),char(33),char(18), +char(0),char(37),char(50),char(23),char(7),char(38),char(38),char(5),char(143),char(227), +char(254),char(252),char(31),char(2),char(191),char(253),char(61),char(8),char(1),char(9), +char(247),char(154),char(194),char(152),char(222),char(254),char(193),char(254),char(165),char(8), +char(254),char(162),char(170),char(170),char(1),char(100),char(30),char(1),char(113),char(1), +char(48),char(213),char(182),char(72),char(100),char(157),char(5),char(51),char(250),char(241), +char(150),char(254),char(239),char(254),char(226),char(55),char(149),char(57),char(1),char(112), +char(1),char(84),char(253),char(80),char(5),char(182),char(253),char(146),char(1),char(51), +char(1),char(78),char(2),char(92),char(146),char(48),char(38),char(0),char(0),char(1), +char(0),char(176),char(255),char(236),char(5),char(156),char(4),char(92),char(0),char(33), +char(0),char(89),char(64),char(50),char(22),char(25),char(25),char(10),char(3),char(9), +char(5),char(5),char(6),char(16),char(32),char(24),char(3),char(6),char(5),char(34), +char(35),char(13),char(19),char(70),char(89),char(13),char(16),char(25),char(4),char(9), +char(4),char(70),char(89),char(22),char(15),char(9),char(31),char(9),char(2),char(11), +char(3),char(9),char(9),char(6),char(7),char(15),char(6),char(21),char(0),char(28), +char(70),char(89),char(0),char(22),char(0),char(63),char(43),char(0),char(24),char(63), +char(63),char(18),char(57),char(47),char(95),char(94),char(93),char(51),char(43),char(17), +char(0),char(51),char(24),char(63),char(43),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(49), +char(48),char(5),char(34),char(0),char(39),char(33),char(17),char(35),char(17),char(51), +char(17),char(33),char(54),char(36),char(51),char(50),char(22),char(23),char(7),char(38), +char(35),char(34),char(6),char(7),char(33),char(21),char(33),char(22),char(22),char(51), +char(50),char(54),char(55),char(21),char(6),char(4),char(119),char(235),char(254),char(244), +char(11),char(254),char(225),char(166),char(166),char(1),char(33),char(24),char(1),char(13), +char(223),char(81),char(154),char(54),char(50),char(138),char(101),char(163),char(167),char(16), +char(2),char(24),char(253),char(230),char(9),char(169),char(164),char(61),char(119),char(98), +char(110),char(20),char(1),char(10),char(248),char(254),char(18),char(4),char(72),char(254), +char(51),char(235),char(246),char(32),char(25),char(141),char(51),char(164),char(170),char(141), +char(188),char(181),char(22),char(37),char(147),char(57),char(0),char(2),char(0),char(0), +char(0),char(0),char(5),char(109),char(5),char(182),char(0),char(11),char(0),char(18), +char(0),char(52),char(64),char(27),char(2),char(3),char(7),char(12),char(3),char(13), +char(10),char(5),char(20),char(19),char(1),char(5),char(12),char(5),char(73),char(89), +char(16),char(8),char(12),char(12),char(7),char(8),char(3),char(11),char(3),char(7), +char(18),char(0),char(63),char(51),char(51),char(63),char(18),char(57),char(47),char(18), +char(57),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(49),char(48),char(1),char(35),char(17),char(35),char(17),char(35), +char(1),char(35),char(1),char(51),char(1),char(35),char(1),char(33),char(39),char(38), +char(39),char(6),char(7),char(3),char(152),char(148),char(156),char(149),char(254),char(223), +char(178),char(2),char(104),char(158),char(2),char(103),char(183),char(253),char(92),char(1), +char(76),char(82),char(56),char(30),char(24),char(64),char(2),char(170),char(253),char(86), +char(2),char(170),char(253),char(86),char(5),char(182),char(250),char(74),char(3),char(63), +char(207),char(144),char(100),char(98),char(164),char(0),char(0),char(2),char(0),char(10), +char(0),char(0),char(4),char(121),char(4),char(72),char(0),char(11),char(0),char(18), +char(0),char(53),char(64),char(28),char(5),char(6),char(10),char(12),char(6),char(13), +char(3),char(1),char(6),char(20),char(19),char(4),char(8),char(12),char(8),char(70), +char(89),char(17),char(11),char(12),char(12),char(10),char(11),char(15),char(6),char(2), +char(10),char(21),char(0),char(63),char(51),char(51),char(63),char(18),char(57),char(47), +char(18),char(57),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(49),char(48),char(1),char(1),char(35),char(3),char(35), +char(17),char(35),char(17),char(35),char(3),char(35),char(1),char(3),char(33),char(38), +char(38),char(39),char(35),char(6),char(2),char(168),char(1),char(209),char(172),char(207), +char(113),char(151),char(115),char(205),char(172),char(1),char(209),char(33),char(1),char(15), +char(43),char(56),char(34),char(9),char(28),char(4),char(72),char(251),char(184),char(1), +char(233),char(254),char(23),char(1),char(233),char(254),char(23),char(4),char(72),char(254), +char(45),char(108),char(138),char(106),char(92),char(0),char(0),char(2),char(0),char(201), +char(0),char(0),char(7),char(94),char(5),char(182),char(0),char(19),char(0),char(26), +char(0),char(70),char(64),char(37),char(14),char(10),char(10),char(11),char(2),char(3), +char(18),char(21),char(3),char(20),char(8),char(7),char(11),char(7),char(27),char(28), +char(5),char(1),char(9),char(14),char(9),char(73),char(89),char(20),char(24),char(12), +char(14),char(14),char(11),char(16),char(12),char(3),char(19),char(7),char(3),char(11), +char(18),char(0),char(63),char(51),char(51),char(51),char(63),char(51),char(18),char(57), +char(47),char(18),char(57),char(51),char(43),char(17),char(0),char(51),char(51),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(35),char(17),char(35),char(17),char(35),char(1),char(35), +char(1),char(33),char(17),char(35),char(17),char(51),char(17),char(33),char(1),char(51), +char(1),char(35),char(1),char(33),char(2),char(38),char(39),char(6),char(6),char(5), +char(133),char(143),char(154),char(147),char(254),char(227),char(186),char(1),char(34),char(254), +char(95),char(170),char(170),char(1),char(225),char(1),char(6),char(158),char(2),char(102), +char(188),char(253),char(102),char(1),char(62),char(118),char(28),char(12),char(19),char(35), +char(2),char(176),char(253),char(80),char(2),char(176),char(253),char(80),char(2),char(176), +char(253),char(80),char(5),char(182),char(253),char(146),char(2),char(110),char(250),char(74), +char(3),char(72),char(1),char(53),char(86),char(47),char(67),char(104),char(0),char(2), +char(0),char(176),char(0),char(0),char(6),char(20),char(4),char(72),char(0),char(19), +char(0),char(25),char(0),char(77),char(64),char(43),char(17),char(13),char(13),char(14), +char(5),char(6),char(1),char(25),char(6),char(24),char(11),char(10),char(14),char(7), +char(26),char(27),char(8),char(4),char(12),char(17),char(12),char(70),char(89),char(24), +char(21),char(19),char(47),char(17),char(63),char(17),char(2),char(17),char(17),char(14), +char(19),char(15),char(15),char(15),char(10),char(6),char(2),char(14),char(21),char(0), +char(63),char(51),char(51),char(51),char(63),char(63),char(18),char(57),char(47),char(93), +char(18),char(57),char(51),char(43),char(17),char(0),char(51),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(1),char(35),char(3),char(35),char(17),char(35),char(17),char(35), +char(3),char(35),char(19),char(33),char(17),char(35),char(17),char(51),char(17),char(33), +char(19),char(23),char(35),char(6),char(6),char(7),char(33),char(4),char(70),char(1), +char(206),char(170),char(208),char(113),char(152),char(110),char(209),char(172),char(209),char(254), +char(223),char(166),char(166),char(1),char(94),char(197),char(104),char(8),char(10),char(32), +char(89),char(1),char(12),char(4),char(72),char(251),char(184),char(1),char(238),char(254), +char(18),char(1),char(238),char(254),char(18),char(1),char(238),char(254),char(18),char(4), +char(72),char(254),char(51),char(1),char(205),char(115),char(34),char(95),char(217),char(0), +char(0),char(2),char(0),char(20),char(0),char(0),char(5),char(174),char(5),char(182), +char(0),char(31),char(0),char(34),char(0),char(75),char(64),char(40),char(32),char(1), +char(15),char(16),char(33),char(30),char(30),char(29),char(16),char(2),char(1),char(7), +char(6),char(36),char(35),char(30),char(1),char(33),char(31),char(31),char(33),char(73), +char(89),char(14),char(18),char(29),char(18),char(74),char(89),char(34),char(2),char(29), +char(29),char(24),char(31),char(3),char(16),char(8),char(24),char(18),char(0),char(63), +char(51),char(51),char(63),char(18),char(57),char(47),char(51),char(51),char(43),char(17), +char(0),char(51),char(43),char(17),char(18),char(0),char(57),char(57),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(21),char(1),char(30),char(2),char(23),char(19),char(35),char(3), +char(46),char(2),char(35),char(35),char(17),char(35),char(17),char(35),char(34),char(6), +char(6),char(7),char(3),char(35),char(19),char(62),char(2),char(55),char(1),char(53), +char(5),char(33),char(1),char(5),char(41),char(254),char(90),char(118),char(154),char(100), +char(50),char(133),char(174),char(137),char(35),char(68),char(101),char(89),char(27),char(170), +char(26),char(91),char(99),char(65),char(32),char(135),char(185),char(136),char(47),char(99), +char(149),char(118),char(254),char(101),char(3),char(190),char(253),char(10),char(1),char(123), +char(5),char(182),char(133),char(254),char(17),char(6),char(72),char(139),char(164),char(254), +char(59),char(1),char(201),char(111),char(96),char(38),char(253),char(66),char(2),char(190), +char(39),char(95),char(111),char(254),char(55),char(1),char(197),char(159),char(142),char(73), +char(7),char(1),char(239),char(133),char(153),char(254),char(57),char(0),char(0),char(2), +char(0),char(12),char(0),char(0),char(5),char(20),char(4),char(72),char(0),char(32), +char(0),char(35),char(0),char(78),char(64),char(42),char(33),char(1),char(15),char(16), +char(34),char(31),char(24),char(31),char(30),char(16),char(2),char(1),char(7),char(7), +char(37),char(36),char(31),char(1),char(34),char(32),char(32),char(34),char(70),char(89), +char(17),char(14),char(18),char(30),char(18),char(71),char(89),char(35),char(2),char(30), +char(30),char(24),char(32),char(15),char(16),char(8),char(24),char(21),char(0),char(63), +char(51),char(51),char(63),char(18),char(57),char(47),char(51),char(51),char(43),char(17), +char(0),char(51),char(51),char(43),char(17),char(18),char(0),char(57),char(57),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(21),char(1),char(30),char(3),char(19),char(35),char(3), +char(46),char(2),char(35),char(35),char(17),char(35),char(17),char(35),char(34),char(6), +char(6),char(7),char(3),char(35),char(19),char(62),char(3),char(55),char(1),char(53), +char(5),char(33),char(1),char(4),char(139),char(254),char(174),char(87),char(111),char(73), +char(49),char(155),char(172),char(133),char(34),char(58),char(84),char(76),char(10),char(153), +char(11),char(75),char(82),char(56),char(39),char(135),char(170),char(131),char(24),char(48), +char(73),char(110),char(87),char(254),char(177),char(3),char(32),char(253),char(180),char(1), +char(37),char(4),char(72),char(105),char(254),char(160),char(7),char(48),char(80),char(105), +char(254),char(113),char(1),char(80),char(87),char(71),char(28),char(253),char(246),char(2), +char(10),char(26),char(64),char(94),char(254),char(174),char(1),char(80),char(61),char(105), +char(79),char(50),char(8),char(1),char(96),char(105),char(140),char(254),char(193),char(0), +char(0),char(2),char(0),char(201),char(0),char(0),char(7),char(197),char(5),char(182), +char(0),char(36),char(0),char(39),char(0),char(97),char(64),char(53),char(33),char(29), +char(29),char(30),char(38),char(35),char(15),char(16),char(2),char(39),char(37),char(1), +char(7),char(1),char(39),char(16),char(34),char(27),char(35),char(24),char(30),char(9), +char(41),char(40),char(35),char(1),char(36),char(38),char(36),char(38),char(73),char(89), +char(18),char(14),char(28),char(33),char(28),char(73),char(89),char(39),char(2),char(33), +char(33),char(30),char(36),char(3),char(31),char(3),char(24),char(16),char(8),char(30), +char(18),char(0),char(63),char(51),char(51),char(51),char(63),char(63),char(18),char(57), +char(47),char(51),char(51),char(43),char(17),char(0),char(51),char(51),char(43),char(17), +char(18),char(0),char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(21),char(1),char(30),char(2),char(23),char(19), +char(35),char(3),char(46),char(2),char(35),char(35),char(17),char(35),char(17),char(35), +char(34),char(6),char(6),char(7),char(3),char(35),char(19),char(54),char(55),char(33), +char(17),char(35),char(17),char(51),char(17),char(33),char(1),char(53),char(5),char(33), +char(1),char(7),char(61),char(254),char(93),char(120),char(153),char(101),char(45),char(136), +char(168),char(138),char(31),char(70),char(105),char(95),char(24),char(172),char(25),char(94), +char(100),char(66),char(33),char(135),char(178),char(135),char(55),char(56),char(254),char(82), +char(170),char(170),char(2),char(215),char(254),char(104),char(3),char(193),char(253),char(10), +char(1),char(123),char(5),char(182),char(133),char(254),char(14),char(6),char(72),char(144), +char(156),char(254),char(59),char(1),char(201),char(104),char(99),char(40),char(253),char(68), +char(2),char(188),char(40),char(95),char(108),char(254),char(55),char(1),char(190),char(184), +char(58),char(253),char(80),char(5),char(182),char(253),char(146),char(1),char(233),char(133), +char(153),char(254),char(55),char(0),char(0),char(2),char(0),char(176),char(0),char(0), +char(6),char(186),char(4),char(72),char(0),char(36),char(0),char(39),char(0),char(103), +char(64),char(58),char(33),char(29),char(29),char(30),char(38),char(35),char(15),char(16), +char(2),char(39),char(37),char(1),char(7),char(1),char(39),char(16),char(34),char(27), +char(35),char(24),char(30),char(9),char(41),char(40),char(35),char(1),char(36),char(38), +char(36),char(38),char(70),char(89),char(18),char(14),char(28),char(33),char(28),char(70), +char(89),char(39),char(2),char(47),char(33),char(63),char(33),char(2),char(33),char(33), +char(30),char(36),char(15),char(31),char(15),char(24),char(16),char(8),char(30),char(21), +char(0),char(63),char(51),char(51),char(51),char(63),char(63),char(18),char(57),char(47), +char(93),char(51),char(51),char(43),char(17),char(0),char(51),char(51),char(43),char(17), +char(18),char(0),char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(21),char(1),char(30),char(3),char(19),char(35), +char(3),char(46),char(2),char(35),char(35),char(17),char(35),char(17),char(35),char(34), +char(6),char(6),char(7),char(3),char(35),char(19),char(54),char(55),char(33),char(17), +char(35),char(17),char(51),char(17),char(33),char(1),char(53),char(5),char(33),char(1), +char(6),char(49),char(254),char(174),char(88),char(111),char(73),char(48),char(155),char(172), +char(133),char(34),char(58),char(86),char(74),char(10),char(154),char(10),char(75),char(84), +char(55),char(38),char(135),char(170),char(131),char(47),char(37),char(254),char(205),char(166), +char(166),char(2),char(53),char(254),char(176),char(3),char(33),char(253),char(180),char(1), +char(37),char(4),char(72),char(105),char(254),char(158),char(7),char(49),char(78),char(105), +char(254),char(114),char(1),char(80),char(86),char(70),char(28),char(253),char(248),char(2), +char(8),char(27),char(63),char(92),char(254),char(174),char(1),char(80),char(120),char(40), +char(254),char(16),char(4),char(72),char(254),char(53),char(1),char(98),char(105),char(140), +char(254),char(199),char(0),char(1),char(0),char(63),char(254),char(78),char(4),char(53), +char(6),char(209),char(0),char(75),char(0),char(132),char(64),char(77),char(0),char(19), +char(33),char(63),char(25),char(70),char(70),char(10),char(63),char(55),char(67),char(60), +char(42),char(28),char(45),char(40),char(19),char(11),char(76),char(77),char(73),char(22), +char(74),char(89),char(73),char(19),char(57),char(52),char(49),char(15),char(46),char(31), +char(46),char(47),char(46),char(3),char(9),char(3),char(46),char(42),char(64),char(67), +char(29),char(28),char(29),char(28),char(74),char(89),char(29),char(29),char(16),char(60), +char(42),char(42),char(36),char(74),char(89),char(42),char(4),char(10),char(9),char(73), +char(89),char(10),char(16),char(16),char(3),char(73),char(89),char(16),char(35),char(12), +char(7),char(73),char(89),char(12),char(34),char(0),char(63),char(43),char(0),char(24), +char(63),char(43),char(0),char(24),char(16),char(198),char(43),char(0),char(24),char(63), +char(43),char(17),char(0),char(51),char(18),char(57),char(24),char(47),char(43),char(17), +char(18),char(0),char(57),char(26),char(24),char(16),char(221),char(95),char(94),char(93), +char(57),char(196),char(50),char(63),char(43),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(23),char(20), +char(22),char(51),char(50),char(55),char(54),char(51),char(50),char(23),char(21),char(38), +char(35),char(34),char(7),char(6),char(35),char(34),char(38),char(53),char(52),char(54), +char(55),char(54),char(54),char(53),char(16),char(33),char(35),char(53),char(51),char(50), +char(54),char(53),char(52),char(38),char(35),char(34),char(6),char(7),char(39),char(54), +char(55),char(38),char(39),char(39),char(53),char(51),char(22),char(23),char(54),char(54), +char(51),char(50),char(23),char(21),char(38),char(35),char(34),char(6),char(7),char(22), +char(22),char(21),char(20),char(6),char(7),char(21),char(22),char(22),char(21),char(20), +char(4),char(5),char(6),char(6),char(240),char(87),char(89),char(97),char(120),char(120), +char(70),char(155),char(71),char(80),char(160),char(68),char(105),char(105),char(105),char(179), +char(184),char(217),char(232),char(204),char(181),char(254),char(64),char(218),char(209),char(205), +char(225),char(162),char(137),char(106),char(187),char(110),char(86),char(168),char(190),char(57), +char(117),char(49),char(123),char(92),char(131),char(92),char(131),char(64),char(50),char(48), +char(24),char(43),char(44),char(111),char(48),char(178),char(193),char(191),char(170),char(186), +char(203),char(254),char(229),char(254),char(230),char(138),char(134),char(137),char(55),char(50), +char(7),char(6),char(39),char(166),char(51),char(5),char(5),char(125),char(133),char(126), +char(129),char(9),char(8),char(138),char(141),char(1),char(12),char(143),char(147),char(132), +char(107),char(128),char(55),char(69),char(114),char(114),char(28),char(66),char(121),char(52), +char(27),char(59),char(136),char(115),char(86),char(14),char(113),char(10),char(82),char(71), +char(23),char(189),char(143),char(140),char(184),char(26),char(8),char(24),char(178),char(144), +char(208),char(213),char(9),char(5),char(55),char(0),char(0),char(1),char(0),char(25), +char(254),char(123),char(3),char(127),char(5),char(78),char(0),char(70),char(0),char(131), +char(64),char(78),char(23),char(41),char(54),char(11),char(46),char(16),char(16),char(32), +char(11),char(3),char(14),char(8),char(62),char(50),char(64),char(60),char(41),char(11), +char(71),char(72),char(68),char(62),char(65),char(0),char(5),char(71),char(89),char(0), +char(15),char(65),char(31),char(65),char(47),char(65),char(3),char(9),char(3),char(65), +char(62),char(38),char(26),char(70),char(89),char(35),char(29),char(70),char(89),char(14), +char(51),char(50),char(51),char(50),char(70),char(89),char(38),char(35),char(51),char(51), +char(35),char(38),char(3),char(32),char(62),char(62),char(56),char(70),char(89),char(8), +char(62),char(16),char(32),char(34),char(19),char(44),char(71),char(89),char(19),char(22), +char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(43),char(17), +char(18),char(0),char(23),char(57),char(24),char(47),char(47),char(47),char(43),char(17), +char(18),char(0),char(57),char(43),char(43),char(0),char(24),char(16),char(212),char(95), +char(94),char(93),char(196),char(43),char(17),char(18),char(0),char(57),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(50),char(23),char(21),char(38),char(35),char(34),char(6),char(7), +char(22),char(22),char(21),char(20),char(7),char(21),char(22),char(21),char(20),char(6), +char(7),char(14),char(2),char(21),char(20),char(22),char(51),char(50),char(55),char(55), +char(50),char(23),char(21),char(38),char(38),char(35),char(7),char(6),char(35),char(34), +char(38),char(53),char(52),char(54),char(55),char(36),char(53),char(52),char(38),char(35), +char(35),char(53),char(51),char(32),char(53),char(52),char(35),char(34),char(6),char(7), +char(39),char(54),char(55),char(38),char(39),char(53),char(51),char(22),char(23),char(54), +char(54),char(2),char(248),char(51),char(45),char(24),char(41),char(47),char(103),char(45), +char(122),char(140),char(211),char(248),char(242),char(225),char(93),char(109),char(48),char(75), +char(89),char(86),char(122),char(175),char(125),char(39),char(21),char(84),char(55),char(179), +char(130),char(92),char(144),char(159),char(190),char(180),char(1),char(78),char(156),char(159), +char(148),char(119),char(1),char(55),char(252),char(74),char(143),char(88),char(59),char(124), +char(126),char(92),char(103),char(123),char(75),char(140),char(88),char(134),char(5),char(78), +char(15),char(112),char(10),char(79),char(62),char(28),char(138),char(107),char(184),char(57), +char(8),char(71),char(202),char(148),char(168),char(3),char(2),char(23),char(42),char(44), +char(49),char(43),char(5),char(5),char(39),char(143),char(19),char(24),char(5),char(5), +char(119),char(112),char(116),char(125),char(3),char(4),char(190),char(97),char(90),char(141), +char(172),char(162),char(34),char(36),char(135),char(55),char(15),char(117),char(98),char(27), +char(52),char(137),char(110),char(85),char(255),char(255),char(0),char(109),char(0),char(0), +char(5),char(242),char(5),char(182),char(2),char(6),char(1),char(117),char(0),char(0), +char(255),char(255),char(0),char(164),char(254),char(20),char(5),char(135),char(6),char(18), +char(2),char(6),char(1),char(149),char(0),char(0),char(0),char(3),char(0),char(125), +char(255),char(236),char(5),char(190),char(5),char(205),char(0),char(11),char(0),char(18), +char(0),char(25),char(0),char(71),char(64),char(37),char(22),char(16),char(16),char(6), +char(23),char(15),char(15),char(0),char(6),char(0),char(26),char(27),char(22),char(16), +char(73),char(89),char(15),char(22),char(1),char(11),char(3),char(22),char(22),char(3), +char(9),char(9),char(19),char(73),char(89),char(9),char(4),char(3),char(12),char(73), +char(89),char(3),char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(43), +char(17),char(18),char(0),char(57),char(24),char(47),char(95),char(94),char(93),char(43), +char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(0),char(33),char(32), +char(0),char(17),char(16),char(0),char(33),char(32),char(0),char(1),char(50),char(18), +char(19),char(33),char(18),char(18),char(19),char(34),char(2),char(3),char(33),char(38), +char(2),char(5),char(190),char(254),char(157),char(254),char(196),char(254),char(189),char(254), +char(161),char(1),char(96),char(1),char(68),char(1),char(59),char(1),char(98),char(253), +char(97),char(229),char(247),char(13),char(252),char(43),char(13),char(249),char(232),char(224), +char(251),char(19),char(3),char(211),char(17),char(244),char(2),char(221),char(254),char(161), +char(254),char(110),char(1),char(139),char(1),char(104),char(1),char(101),char(1),char(137), +char(254),char(112),char(252),char(68),char(1),char(17),char(1),char(12),char(254),char(245), +char(254),char(238),char(4),char(180),char(254),char(254),char(255),char(0),char(254),char(1), +char(4),char(0),char(0),char(3),char(0),char(115),char(255),char(236),char(4),char(98), +char(4),char(92),char(0),char(12),char(0),char(19),char(0),char(26),char(0),char(73), +char(64),char(39),char(23),char(17),char(17),char(7),char(24),char(16),char(16),char(0), +char(7),char(0),char(27),char(28),char(23),char(17),char(70),char(89),char(15),char(23), +char(31),char(23),char(2),char(11),char(3),char(23),char(23),char(3),char(10),char(10), +char(20),char(70),char(89),char(10),char(16),char(3),char(13),char(70),char(89),char(3), +char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18), +char(0),char(57),char(24),char(47),char(95),char(94),char(93),char(43),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(16),char(0),char(35),char(34),char(38),char(2), +char(53),char(16),char(0),char(51),char(50),char(0),char(1),char(50),char(54),char(55), +char(33),char(22),char(22),char(19),char(34),char(6),char(7),char(33),char(38),char(38), +char(4),char(98),char(254),char(242),char(238),char(147),char(228),char(124),char(1),char(12), +char(238),char(230),char(1),char(15),char(254),char(8),char(158),char(164),char(10),char(253), +char(105),char(9),char(160),char(160),char(156),char(158),char(13),char(2),char(147),char(15), +char(161),char(2),char(37),char(254),char(244),char(254),char(211),char(138),char(1),char(2), +char(173),char(1),char(12),char(1),char(43),char(254),char(206),char(253),char(77),char(184), +char(191),char(186),char(189),char(3),char(88),char(173),char(167),char(168),char(172),char(0), +char(0),char(1),char(0),char(0),char(0),char(0),char(5),char(72),char(5),char(195), +char(0),char(21),char(0),char(32),char(64),char(16),char(6),char(22),char(19),char(23), +char(17),char(0),char(74),char(89),char(17),char(4),char(10),char(5),char(6),char(3), +char(5),char(18),char(0),char(63),char(63),char(18),char(57),char(63),char(43),char(17), +char(1),char(51),char(18),char(57),char(49),char(48),char(1),char(34),char(6),char(7), +char(1),char(35),char(1),char(51),char(1),char(22),char(23),char(54),char(55),char(19), +char(62),char(2),char(51),char(50),char(23),char(21),char(38),char(4),char(225),char(59), +char(78),char(57),char(254),char(184),char(197),char(253),char(238),char(180),char(1),char(82), +char(72),char(35),char(32),char(70),char(162),char(59),char(84),char(110),char(89),char(42), +char(79),char(56),char(5),char(55),char(103),char(181),char(251),char(229),char(5),char(182), +char(252),char(86),char(199),char(143),char(144),char(223),char(2),char(6),char(191),char(152), +char(65),char(19),char(141),char(20),char(0),char(1),char(0),char(0),char(0),char(0), +char(4),char(61),char(4),char(82),char(0),char(22),char(0),char(30),char(64),char(15), +char(1),char(23),char(15),char(24),char(13),char(18),char(71),char(89),char(13),char(16), +char(5),char(1),char(15),char(0),char(21),char(0),char(63),char(63),char(57),char(63), +char(43),char(17),char(1),char(51),char(18),char(57),char(49),char(48),char(33),char(1), +char(51),char(19),char(18),char(23),char(51),char(54),char(19),char(19),char(62),char(2), +char(51),char(50),char(23),char(21),char(38),char(35),char(34),char(6),char(7),char(3), +char(1),char(150),char(254),char(106),char(174),char(225),char(100),char(19),char(8),char(23), +char(82),char(96),char(37),char(71),char(91),char(84),char(45),char(30),char(29),char(38), +char(47),char(58),char(28),char(248),char(4),char(72),char(253),char(155),char(254),char(244), +char(100),char(118),char(1),char(11),char(1),char(53),char(122),char(123),char(52),char(10), +char(127),char(8),char(84),char(92),char(252),char(223),char(255),char(255),char(0),char(0), +char(0),char(0),char(5),char(72),char(7),char(115),char(2),char(38),char(2),char(128), +char(0),char(0),char(1),char(7),char(3),char(118),char(4),char(215),char(1),char(82), +char(0),char(10),char(180),char(2),char(1),char(33),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(0),char(0),char(0),char(4),char(61), +char(6),char(33),char(2),char(38),char(2),char(129),char(0),char(0),char(1),char(7), +char(3),char(118),char(4),char(100),char(0),char(0),char(0),char(10),char(180),char(2), +char(1),char(34),char(17),char(38),char(0),char(43),char(53),char(53),char(0),char(3), +char(0),char(125),char(254),char(20),char(9),char(162),char(5),char(205),char(0),char(11), +char(0),char(23),char(0),char(46),char(0),char(68),char(64),char(38),char(12),char(6), +char(18),char(0),char(33),char(46),char(39),char(24),char(0),char(6),char(6),char(47), +char(48),char(37),char(42),char(74),char(89),char(37),char(27),char(29),char(28),char(28), +char(3),char(32),char(24),char(15),char(9),char(21),char(73),char(89),char(9),char(4), +char(3),char(15),char(73),char(89),char(3),char(19),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(0),char(24),char(63),char(51),char(18),char(57),char(17), +char(51),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(16),char(0),char(33),char(32),char(0), +char(17),char(16),char(0),char(33),char(32),char(0),char(1),char(16),char(18),char(51), +char(50),char(18),char(17),char(16),char(2),char(35),char(34),char(2),char(37),char(51), +char(19),char(22),char(23),char(51),char(54),char(54),char(19),char(51),char(1),char(6), +char(6),char(35),char(34),char(39),char(53),char(22),char(51),char(50),char(54),char(55), +char(55),char(5),char(84),char(254),char(185),char(254),char(220),char(254),char(215),char(254), +char(189),char(1),char(67),char(1),char(44),char(1),char(35),char(1),char(69),char(251), +char(221),char(223),char(217),char(218),char(221),char(220),char(216),char(218),char(225),char(4), +char(111),char(176),char(246),char(78),char(20),char(8),char(11),char(83),char(228),char(176), +char(254),char(43),char(69),char(188),char(136),char(76),char(74),char(55),char(66),char(94), +char(117),char(35),char(61),char(2),char(221),char(254),char(160),char(254),char(111),char(1), +char(139),char(1),char(104),char(1),char(102),char(1),char(136),char(254),char(112),char(254), +char(160),char(254),char(215),char(254),char(205),char(1),char(49),char(1),char(43),char(1), +char(41),char(1),char(47),char(254),char(210),char(65),char(253),char(139),char(207),char(102), +char(44),char(251),char(2),char(131),char(251),char(32),char(182),char(158),char(17),char(133), +char(12),char(103),char(89),char(156),char(255),char(255),char(0),char(115),char(254),char(20), +char(8),char(123),char(4),char(92),char(0),char(38),char(0),char(82),char(0),char(0), +char(0),char(7),char(0),char(92),char(4),char(117),char(0),char(0),char(0),char(2), +char(0),char(125),char(255),char(135),char(6),char(16),char(6),char(45),char(0),char(19), +char(0),char(40),char(0),char(81),char(64),char(42),char(20),char(10),char(38),char(13), +char(7),char(17),char(34),char(34),char(3),char(28),char(31),char(0),char(0),char(28), +char(7),char(23),char(10),char(5),char(41),char(42),char(36),char(34),char(38),char(13), +char(38),char(73),char(89),char(17),char(15),char(13),char(3),char(28),char(26),char(23), +char(7),char(23),char(73),char(89),char(5),char(3),char(7),char(18),char(0),char(63), +char(51),char(51),char(43),char(17),char(0),char(51),char(51),char(24),char(63),char(51), +char(51),char(43),char(17),char(0),char(51),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(17),char(51), +char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(0),char(5),char(6), +char(35),char(34),char(39),char(36),char(0),char(17),char(16),char(0),char(37),char(54), +char(51),char(50),char(23),char(4),char(0),char(1),char(20),char(18),char(23),char(54), +char(54),char(51),char(50),char(23),char(54),char(18),char(53),char(52),char(2),char(39), +char(6),char(35),char(34),char(39),char(6),char(2),char(6),char(16),char(254),char(209), +char(254),char(248),char(26),char(119),char(124),char(20),char(254),char(244),char(254),char(209), +char(1),char(43),char(1),char(16),char(20),char(124),char(121),char(22),char(1),char(12), +char(1),char(45),char(251),char(33),char(202),char(189),char(17),char(73),char(54),char(110), +char(31),char(189),char(202),char(202),char(189),char(31),char(110),char(113),char(31),char(189), +char(202),char(2),char(221),char(254),char(210),char(254),char(115),char(44),char(111),char(111), +char(41),char(1),char(138),char(1),char(54),char(1),char(49),char(1),char(133),char(44), +char(108),char(108),char(44),char(254),char(115),char(254),char(213),char(244),char(254),char(207), +char(41),char(48),char(38),char(86),char(41),char(1),char(49),char(244),char(244),char(1), +char(47),char(39),char(88),char(86),char(39),char(254),char(211),char(0),char(0),char(2), +char(0),char(115),char(255),char(147),char(4),char(207),char(4),char(180),char(0),char(23), +char(0),char(45),char(0),char(80),char(64),char(42),char(24),char(12),char(15),char(9), +char(43),char(27),char(37),char(21),char(3),char(35),char(0),char(0),char(3),char(32), +char(27),char(9),char(12),char(6),char(46),char(47),char(40),char(37),char(43),char(15), +char(43),char(70),char(89),char(21),char(18),char(15),char(16),char(32),char(30),char(27), +char(9),char(27),char(70),char(89),char(6),char(3),char(9),char(21),char(0),char(63), +char(51),char(51),char(43),char(17),char(0),char(51),char(51),char(24),char(63),char(51), +char(51),char(43),char(17),char(0),char(51),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(20),char(2),char(7),char(6),char(6), +char(35),char(34),char(38),char(39),char(38),char(2),char(53),char(52),char(18),char(55), +char(54),char(54),char(51),char(50),char(22),char(23),char(22),char(18),char(5),char(20), +char(22),char(23),char(54),char(54),char(51),char(50),char(23),char(54),char(54),char(53), +char(16),char(37),char(6),char(6),char(35),char(34),char(38),char(39),char(6),char(6), +char(4),char(207),char(224),char(204),char(9),char(64),char(56),char(57),char(61),char(9), +char(203),char(229),char(224),char(208),char(8),char(62),char(57),char(56),char(64),char(9), +char(202),char(226),char(252),char(80),char(125),char(137),char(12),char(60),char(53),char(103), +char(24),char(134),char(124),char(254),char(252),char(13),char(61),char(51),char(53),char(60), +char(12),char(137),char(125),char(2),char(37),char(233),char(254),char(223),char(37),char(54), +char(45),char(43),char(56),char(36),char(1),char(38),char(229),char(233),char(1),char(32), +char(36),char(56),char(42),char(43),char(57),char(38),char(254),char(220),char(225),char(177), +char(210),char(31),char(42),char(34),char(74),char(31),char(210),char(175),char(1),char(96), +char(62),char(42),char(32),char(32),char(44),char(31),char(209),char(0),char(0),char(3), +char(0),char(125),char(255),char(236),char(7),char(127),char(8),char(59),char(0),char(21), +char(0),char(69),char(0),char(84),char(0),char(85),char(64),char(46),char(67),char(55), +char(31),char(43),char(43),char(1),char(38),char(70),char(75),char(80),char(72),char(60), +char(12),char(55),char(10),char(85),char(86),char(21),char(2),char(2),char(7),char(7), +char(16),char(12),char(82),char(64),char(72),char(58),char(34),char(64),char(58),char(64), +char(73),char(89),char(40),char(58),char(4),char(28),char(22),char(52),char(22),char(73), +char(89),char(46),char(52),char(19),char(0),char(63),char(51),char(43),char(17),char(0), +char(51),char(24),char(63),char(51),char(43),char(17),char(0),char(51),char(24),char(16), +char(214),char(26),char(220),char(212),char(205),char(50),char(18),char(57),char(47),char(51), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(21),char(35),char(34),char(46),char(2),char(35),char(34),char(6), +char(21),char(21),char(35),char(53),char(52),char(54),char(51),char(50),char(30),char(2), +char(51),char(1),char(50),char(54),char(55),char(22),char(22),char(51),char(50),char(18), +char(17),char(16),char(2),char(35),char(34),char(6),char(7),char(39),char(54),char(51), +char(50),char(0),char(17),char(16),char(0),char(33),char(34),char(38),char(39),char(6), +char(6),char(35),char(32),char(0),char(17),char(16),char(0),char(51),char(50),char(23), +char(7),char(38),char(38),char(35),char(34),char(2),char(17),char(16),char(18),char(1), +char(20),char(7),char(53),char(54),char(53),char(52),char(46),char(2),char(53),char(52), +char(51),char(50),char(22),char(5),char(162),char(17),char(84),char(142),char(120),char(102), +char(43),char(47),char(60),char(125),char(116),char(112),char(58),char(112),char(119),char(133), +char(78),char(253),char(40),char(88),char(171),char(61),char(55),char(171),char(93),char(188), +char(210),char(165),char(147),char(60),char(95),char(43),char(70),char(121),char(154),char(228), +char(1),char(1),char(254),char(224),char(254),char(253),char(104),char(170),char(76),char(75), +char(167),char(110),char(254),char(252),char(254),char(227),char(1),char(1),char(228),char(154), +char(121),char(70),char(43),char(94),char(60),char(148),char(165),char(210),char(2),char(128), +char(237),char(120),char(31),char(36),char(31),char(92),char(56),char(67),char(7),char(199), +char(121),char(36),char(43),char(36),char(52),char(51),char(16),char(28),char(103),char(110), +char(36),char(44),char(36),char(248),char(186),char(66),char(63),char(57),char(72),char(1), +char(78),char(1),char(45),char(1),char(11),char(1),char(40),char(43),char(31),char(146), +char(82),char(254),char(136),char(254),char(173),char(254),char(140),char(254),char(98),char(40), +char(48),char(45),char(43),char(1),char(157),char(1),char(117),char(1),char(85),char(1), +char(118),char(82),char(146),char(31),char(43),char(254),char(217),char(254),char(244),char(254), +char(209),char(254),char(180),char(6),char(104),char(162),char(61),char(72),char(41),char(53), +char(20),char(18),char(17),char(26),char(28),char(73),char(68),char(0),char(0),char(3), +char(0),char(115),char(255),char(236),char(6),char(4),char(7),char(6),char(0),char(42), +char(0),char(63),char(0),char(78),char(0),char(92),char(64),char(51),char(19),char(7), +char(28),char(40),char(40),char(44),char(34),char(64),char(69),char(13),char(74),char(66), +char(54),char(7),char(10),char(79),char(80),char(50),char(58),char(63),char(45),char(45), +char(54),char(76),char(66),char(10),char(64),char(31),char(16),char(10),char(16),char(70), +char(89),char(2),char(23),char(70),char(89),char(2),char(4),char(37),char(10),char(16), +char(26),char(21),char(4),char(21),char(70),char(89),char(0),char(4),char(22),char(0), +char(63),char(51),char(43),char(17),char(0),char(51),char(24),char(63),char(51),char(18), +char(57),char(43),char(43),char(17),char(0),char(51),char(26),char(24),char(16),char(222), +char(220),char(212),char(50),char(17),char(51),char(205),char(50),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(5),char(34), +char(39),char(6),char(35),char(34),char(2),char(17),char(16),char(18),char(51),char(50), +char(22),char(23),char(7),char(38),char(35),char(34),char(6),char(21),char(16),char(33), +char(50),char(55),char(22),char(22),char(51),char(32),char(17),char(52),char(38),char(35), +char(34),char(7),char(39),char(54),char(54),char(51),char(50),char(18),char(17),char(16), +char(2),char(3),char(21),char(35),char(34),char(46),char(2),char(35),char(34),char(21), +char(21),char(35),char(53),char(52),char(54),char(51),char(50),char(30),char(2),char(51), +char(5),char(20),char(7),char(53),char(54),char(53),char(52),char(46),char(2),char(53), +char(52),char(51),char(50),char(22),char(4),char(43),char(148),char(94),char(92),char(143), +char(225),char(250),char(207),char(186),char(62),char(119),char(40),char(57),char(89),char(71), +char(116),char(109),char(1),char(49),char(123),char(112),char(62),char(111),char(67),char(1), +char(45),char(110),char(115),char(71),char(89),char(57),char(40),char(119),char(62),char(187), +char(206),char(247),char(81),char(16),char(84),char(143),char(120),char(101),char(43),char(107), +char(125),char(115),char(112),char(58),char(113),char(118),char(131),char(78),char(254),char(240), +char(238),char(119),char(30),char(36),char(30),char(92),char(56),char(67),char(20),char(65), +char(65),char(1),char(35),char(1),char(14),char(1),char(23),char(1),char(40),char(32), +char(25),char(139),char(51),char(214),char(214),char(254),char(94),char(80),char(42),char(38), +char(1),char(162),char(214),char(214),char(51),char(139),char(25),char(32),char(254),char(215), +char(254),char(234),char(254),char(245),char(254),char(218),char(6),char(165),char(120),char(36), +char(42),char(36),char(102),char(17),char(31),char(100),char(111),char(37),char(43),char(37), +char(221),char(161),char(62),char(72),char(40),char(56),char(20),char(17),char(17),char(25), +char(27),char(74),char(68),char(0),char(0),char(2),char(0),char(94),char(255),char(236), +char(7),char(127),char(7),char(4),char(0),char(13),char(0),char(64),char(0),char(95), +char(64),char(52),char(48),char(36),char(57),char(54),char(62),char(23),char(23),char(1), +char(18),char(54),char(41),char(12),char(36),char(7),char(65),char(66),char(14),char(45), +char(39),char(45),char(73),char(89),char(30),char(55),char(55),char(33),char(39),char(5), +char(9),char(9),char(13),char(64),char(9),char(15),char(72),char(13),char(7),char(3), +char(11),char(64),char(20),char(39),char(4),char(59),char(51),char(33),char(51),char(73), +char(89),char(26),char(33),char(19),char(0),char(63),char(51),char(43),char(17),char(0), +char(51),char(24),char(63),char(51),char(26),char(222),char(50),char(50),char(205),char(43), +char(50),char(17),char(51),char(17),char(18),char(57),char(47),char(57),char(43),char(17), +char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(21),char(7),char(35),char(39), +char(35),char(7),char(35),char(39),char(35),char(7),char(35),char(39),char(53),char(1), +char(34),char(6),char(7),char(39),char(54),char(51),char(50),char(18),char(17),char(16), +char(0),char(33),char(34),char(38),char(39),char(35),char(6),char(6),char(35),char(32), +char(0),char(17),char(16),char(0),char(51),char(50),char(23),char(7),char(38),char(38), +char(35),char(34),char(2),char(17),char(16),char(18),char(51),char(50),char(54),char(55), +char(17),char(51),char(17),char(22),char(51),char(50),char(18),char(17),char(16),char(2), +char(5),char(139),char(80),char(32),char(50),char(186),char(49),char(33),char(49),char(188), +char(47),char(33),char(80),char(3),char(67),char(60),char(93),char(45),char(70),char(124), +char(153),char(228),char(255),char(254),char(226),char(254),char(253),char(116),char(172),char(76), +char(9),char(78),char(172),char(112),char(254),char(252),char(254),char(227),char(1),char(1), +char(229),char(150),char(126),char(70),char(45),char(93),char(60),char(147),char(165),char(210), +char(190),char(65),char(130),char(51),char(170),char(102),char(145),char(188),char(212),char(165), +char(7),char(4),char(27),char(172),char(103),char(103),char(103),char(103),char(172),char(27), +char(254),char(43),char(41),char(31),char(146),char(80),char(254),char(136),char(254),char(173), +char(254),char(139),char(254),char(99),char(48),char(48),char(49),char(47),char(1),char(160), +char(1),char(114),char(1),char(85),char(1),char(118),char(80),char(146),char(31),char(41), +char(254),char(215),char(254),char(246),char(254),char(209),char(254),char(180),char(38),char(38), +char(1),char(201),char(254),char(55),char(76),char(1),char(74),char(1),char(49),char(1), +char(11),char(1),char(40),char(0),char(0),char(2),char(0),char(0),char(0),char(0), +char(6),char(29),char(5),char(164),char(0),char(13),char(0),char(42),char(0),char(63), +char(64),char(36),char(36),char(1),char(14),char(26),char(27),char(12),char(18),char(7), +char(43),char(44),char(40),char(21),char(14),char(31),char(22),char(3),char(17),char(18), +char(5),char(9),char(9),char(13),char(64),char(9),char(15),char(72),char(13),char(7), +char(3),char(11),char(35),char(27),char(18),char(15),char(17),char(21),char(0),char(63), +char(63),char(51),char(51),char(222),char(50),char(50),char(205),char(43),char(50),char(17), +char(51),char(17),char(18),char(23),char(57),char(63),char(17),char(18),char(1),char(23), +char(57),char(49),char(48),char(1),char(21),char(7),char(35),char(39),char(35),char(7), +char(35),char(39),char(35),char(7),char(35),char(39),char(53),char(1),char(7),char(3), +char(35),char(1),char(51),char(19),char(22),char(23),char(51),char(54),char(54),char(19), +char(3),char(51),char(0),char(22),char(23),char(51),char(54),char(18),char(17),char(51), +char(16),char(2),char(7),char(35),char(3),char(38),char(4),char(182),char(82),char(30), +char(50),char(188),char(49),char(31),char(49),char(188),char(50),char(30),char(80),char(1), +char(172),char(39),char(170),char(213),char(254),char(127),char(172),char(246),char(39),char(41), +char(8),char(12),char(35),char(186),char(172),char(178),char(1),char(9),char(45),char(10), +char(8),char(173),char(153),char(166),char(195),char(219),char(182),char(125),char(33),char(5), +char(164),char(27),char(172),char(103),char(103),char(103),char(103),char(172),char(27),char(252), +char(37),char(95),char(254),char(150),char(4),char(72),char(253),char(73),char(111),char(171), +char(35),char(81),char(1),char(136),char(1),char(213),char(252),char(255),char(144),char(44), +char(184),char(1),char(179),char(1),char(82),char(254),char(150),char(254),char(7),char(229), +char(1),char(90),char(92),char(0),char(0),char(1),char(0),char(125),char(254),char(20), +char(4),char(227),char(5),char(203),char(0),char(23),char(0),char(45),char(64),char(24), +char(3),char(15),char(9),char(10),char(21),char(10),char(15),char(3),char(24),char(25), +char(19),char(0),char(73),char(89),char(19),char(4),char(12),char(6),char(73),char(89), +char(12),char(19),char(10),char(27),char(0),char(63),char(63),char(43),char(0),char(24), +char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(34),char(0),char(17),char(16),char(0),char(33), +char(50),char(55),char(17),char(35),char(17),char(35),char(32),char(0),char(17),char(52), +char(18),char(36),char(51),char(50),char(23),char(7),char(38),char(3),char(72),char(245), +char(254),char(224),char(1),char(10),char(1),char(2),char(111),char(57),char(170),char(20), +char(254),char(181),char(254),char(159),char(175),char(1),char(72),char(216),char(237),char(170), +char(71),char(171),char(5),char(51),char(254),char(192),char(254),char(232),char(254),char(218), +char(254),char(212),char(23),char(253),char(116),char(1),char(216),char(1),char(132),char(1), +char(109),char(224),char(1),char(86),char(184),char(84),char(146),char(78),char(0),char(1), +char(0),char(115),char(254),char(20),char(3),char(162),char(4),char(92),char(0),char(24), +char(0),char(47),char(64),char(24),char(15),char(3),char(23),char(22),char(9),char(22), +char(3),char(3),char(25),char(26),char(23),char(27),char(6),char(12),char(70),char(89), +char(6),char(16),char(0),char(18),char(70),char(89),char(0),char(22),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(0),char(24),char(63),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(5), +char(34),char(0),char(17),char(16),char(0),char(51),char(50),char(22),char(23),char(7), +char(38),char(35),char(34),char(6),char(21),char(20),char(22),char(51),char(50),char(54), +char(55),char(17),char(35),char(17),char(2),char(117),char(254),char(254),char(252),char(1), +char(17),char(251),char(79),char(164),char(48),char(49),char(142),char(104),char(177),char(171), +char(171),char(171),char(53),char(80),char(57),char(166),char(20),char(1),char(31),char(1), +char(18),char(1),char(20),char(1),char(43),char(34),char(23),char(141),char(51),char(205), +char(221),char(220),char(200),char(17),char(26),char(253),char(110),char(1),char(216),char(0), +char(0),char(1),char(0),char(106),char(255),char(252),char(4),char(117),char(5),char(6), +char(0),char(19),char(0),char(47),char(64),char(33),char(4),char(2),char(8),char(3), +char(6),char(0),char(17),char(7),char(10),char(16),char(13),char(18),char(12),char(14), +char(14),char(21),char(20),char(19),char(0),char(3),char(17),char(6),char(15),char(5), +char(16),char(7),char(13),char(10),char(9),char(12),char(11),char(1),char(18),char(0), +char(63),char(205),char(23),char(57),char(17),char(18),char(1),char(23),char(57),char(49), +char(48),char(1),char(3),char(39),char(19),char(37),char(55),char(5),char(19),char(37), +char(55),char(5),char(19),char(23),char(3),char(5),char(7),char(37),char(3),char(5), +char(7),char(2),char(2),char(182),char(121),char(182),char(254),char(225),char(66),char(1), +char(33),char(205),char(254),char(223),char(67),char(1),char(33),char(185),char(118),char(184), +char(1),char(33),char(68),char(254),char(225),char(204),char(1),char(30),char(65),char(1), +char(57),char(254),char(195),char(67),char(1),char(66),char(166),char(115),char(168),char(1), +char(100),char(166),char(117),char(168),char(1),char(61),char(67),char(254),char(192),char(166), +char(115),char(166),char(254),char(158),char(168),char(115),char(0),char(1),char(0),char(203), +char(4),char(145),char(3),char(172),char(5),char(180),char(0),char(19),char(0),char(30), +char(64),char(12),char(0),char(6),char(10),char(16),char(6),char(16),char(20),char(21), +char(3),char(0),char(13),char(9),char(0),char(47),char(51),char(51),char(50),char(17), +char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(6),char(6),char(35),char(34),char(38),char(53),char(52),char(54),char(51), +char(33),char(54),char(54),char(51),char(50),char(22),char(21),char(20),char(6),char(35), +char(1),char(135),char(6),char(42),char(48),char(51),char(41),char(42),char(54),char(1), +char(193),char(6),char(43),char(47),char(51),char(45),char(44),char(54),char(4),char(240), +char(45),char(50),char(50),char(53),char(53),char(41),char(46),char(48),char(49),char(51), +char(56),char(40),char(0),char(1),char(0),char(248),char(4),char(229),char(3),char(219), +char(5),char(215),char(0),char(19),char(0),char(28),char(64),char(11),char(7),char(18), +char(21),char(20),char(0),char(18),char(18),char(12),char(4),char(128),char(9),char(0), +char(47),char(26),char(204),char(50),char(51),char(17),char(51),char(17),char(18),char(1), +char(57),char(57),char(49),char(48),char(1),char(50),char(55),char(54),char(51),char(50), +char(22),char(21),char(21),char(35),char(53),char(52),char(35),char(34),char(14),char(2), +char(35),char(35),char(53),char(1),char(4),char(120),char(150),char(149),char(81),char(111), +char(116),char(125),char(106),char(43),char(102),char(121),char(142),char(84),char(16),char(5), +char(98),char(59),char(58),char(111),char(100),char(31),char(17),char(102),char(36),char(43), +char(36),char(121),char(0),char(1),char(1),char(223),char(4),char(215),char(2),char(205), +char(6),char(53),char(0),char(14),char(0),char(24),char(64),char(10),char(10),char(0), +char(12),char(5),char(0),char(3),char(15),char(16),char(3),char(13),char(0),char(47), +char(204),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(49),char(48), +char(1),char(52),char(54),char(51),char(50),char(21),char(20),char(14),char(2),char(21), +char(20),char(23),char(21),char(38),char(1),char(223),char(67),char(56),char(92),char(30), +char(36),char(30),char(119),char(238),char(5),char(184),char(56),char(69),char(76),char(27), +char(25),char(16),char(18),char(20),char(54),char(40),char(74),char(64),char(0),char(1), +char(1),char(225),char(4),char(215),char(2),char(207),char(6),char(53),char(0),char(14), +char(0),char(24),char(64),char(10),char(5),char(0),char(0),char(10),char(2),char(3), +char(15),char(16),char(12),char(2),char(0),char(47),char(204),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(20),char(7),char(53), +char(54),char(53),char(52),char(46),char(2),char(53),char(52),char(51),char(50),char(22), +char(2),char(207),char(238),char(119),char(30),char(36),char(30),char(92),char(56),char(67), +char(5),char(184),char(161),char(64),char(74),char(40),char(54),char(20),char(18),char(16), +char(25),char(27),char(76),char(69),char(0),char(8),char(0),char(41),char(254),char(193), +char(7),char(193),char(5),char(145),char(0),char(12),char(0),char(26),char(0),char(40), +char(0),char(54),char(0),char(68),char(0),char(82),char(0),char(95),char(0),char(109), +char(0),char(128),char(64),char(73),char(95),char(40),char(68),char(90),char(34),char(62), +char(12),char(26),char(7),char(20),char(82),char(54),char(109),char(76),char(48),char(103), +char(16),char(110),char(111),char(0),char(7),char(58),char(72),char(72),char(65),char(79), +char(69),char(68),char(62),char(76),char(86),char(99),char(99),char(92),char(106),char(102), +char(95),char(90),char(109),char(30),char(44),char(44),char(37),char(51),char(47),char(34), +char(40),char(3),char(54),char(16),char(23),char(7),char(79),char(76),char(106),char(109), +char(51),char(54),char(23),char(23),char(54),char(51),char(109),char(106),char(76),char(79), +char(7),char(8),char(9),char(13),char(20),char(3),char(9),char(0),char(47),char(51), +char(47),char(51),char(18),char(23),char(57),char(47),char(47),char(47),char(47),char(47), +char(47),char(47),char(47),char(17),char(51),char(17),char(23),char(51),char(17),char(51), +char(51),char(17),char(51),char(17),char(51),char(51),char(51),char(17),char(51),char(51), +char(17),char(51),char(17),char(51),char(51),char(51),char(17),char(51),char(51),char(17), +char(51),char(17),char(51),char(17),char(18),char(1),char(23),char(57),char(49),char(48), +char(1),char(38),char(38),char(35),char(34),char(6),char(7),char(35),char(54),char(51), +char(50),char(22),char(23),char(3),char(38),char(38),char(35),char(34),char(6),char(7), +char(35),char(54),char(54),char(51),char(50),char(22),char(23),char(1),char(38),char(38), +char(35),char(34),char(6),char(7),char(35),char(54),char(54),char(51),char(50),char(22), +char(23),char(33),char(38),char(38),char(35),char(34),char(6),char(7),char(35),char(54), +char(54),char(51),char(50),char(22),char(23),char(1),char(38),char(38),char(35),char(34), +char(6),char(7),char(35),char(54),char(54),char(51),char(50),char(22),char(23),char(33), +char(38),char(38),char(35),char(34),char(6),char(7),char(35),char(54),char(54),char(51), +char(50),char(22),char(23),char(1),char(38),char(38),char(35),char(34),char(6),char(7), +char(35),char(54),char(51),char(50),char(22),char(23),char(33),char(38),char(38),char(35), +char(34),char(6),char(7),char(35),char(54),char(54),char(51),char(50),char(22),char(23), +char(4),char(111),char(5),char(60),char(69),char(78),char(50),char(5),char(75),char(11), +char(197),char(93),char(113),char(7),char(79),char(5),char(60),char(69),char(78),char(50), +char(5),char(75),char(5),char(100),char(103),char(92),char(115),char(6),char(1),char(244), +char(5),char(60),char(68),char(78),char(50),char(5),char(76),char(5),char(101),char(103), +char(92),char(115),char(6),char(251),char(47),char(5),char(60),char(68),char(78),char(50), +char(5),char(76),char(5),char(101),char(103),char(92),char(115),char(6),char(4),char(49), +char(5),char(60),char(68),char(78),char(50),char(5),char(76),char(5),char(101),char(103), +char(92),char(115),char(6),char(251),char(47),char(5),char(60),char(68),char(78),char(50), +char(5),char(76),char(5),char(101),char(103),char(92),char(115),char(6),char(4),char(240), +char(5),char(60),char(68),char(78),char(51),char(5),char(75),char(11),char(198),char(92), +char(115),char(6),char(249),char(190),char(5),char(60),char(68),char(78),char(50),char(5), +char(76),char(5),char(101),char(103),char(92),char(115),char(6),char(4),char(207),char(44), +char(44),char(41),char(47),char(194),char(101),char(93),char(249),char(242),char(44),char(44), +char(41),char(47),char(89),char(105),char(102),char(92),char(1),char(22),char(45),char(43), +char(39),char(49),char(90),char(105),char(102),char(93),char(45),char(43),char(39),char(49), +char(90),char(105),char(102),char(93),char(3),char(219),char(45),char(43),char(39),char(49), +char(90),char(105),char(102),char(93),char(45),char(43),char(39),char(49),char(90),char(105), +char(102),char(93),char(254),char(25),char(44),char(44),char(40),char(48),char(194),char(104), +char(90),char(45),char(43),char(39),char(49),char(90),char(104),char(102),char(92),char(0), +char(0),char(8),char(0),char(41),char(254),char(127),char(7),char(125),char(5),char(211), +char(0),char(7),char(0),char(15),char(0),char(23),char(0),char(31),char(0),char(39), +char(0),char(46),char(0),char(53),char(0),char(62),char(0),char(52),char(64),char(37), +char(21),char(23),char(37),char(32),char(62),char(58),char(5),char(1),char(41),char(44), +char(31),char(28),char(50),char(53),char(9),char(13),char(16),char(63),char(64),char(59), +char(43),char(7),char(46),char(54),char(25),char(21),char(29),char(17),char(47),char(39), +char(15),char(36),char(51),char(14),char(5),char(12),char(5),char(0),char(47),char(47), +char(18),char(23),char(57),char(17),char(18),char(1),char(23),char(57),char(49),char(48), +char(5),char(23),char(6),char(6),char(7),char(35),char(54),char(55),char(3),char(39), +char(54),char(54),char(55),char(51),char(6),char(7),char(1),char(55),char(22),char(22), +char(23),char(21),char(38),char(39),char(5),char(7),char(38),char(38),char(39),char(53), +char(22),char(23),char(1),char(55),char(54),char(54),char(55),char(23),char(6),char(7), +char(1),char(7),char(6),char(7),char(39),char(54),char(55),char(3),char(39),char(38), +char(39),char(55),char(22),char(23),char(1),char(23),char(22),char(22),char(23),char(7), +char(38),char(38),char(39),char(4),char(55),char(11),char(17),char(70),char(36),char(97), +char(53),char(17),char(59),char(11),char(19),char(73),char(31),char(97),char(52),char(18), +char(2),char(35),char(14),char(71),char(200),char(65),char(221),char(129),char(251),char(104), +char(14),char(66),char(191),char(79),char(221),char(129),char(3),char(166),char(2),char(67), +char(190),char(67),char(69),char(177),char(120),char(252),char(234),char(2),char(155),char(169), +char(69),char(177),char(120),char(43),char(17),char(82),char(69),char(67),char(123),char(76), +char(3),char(106),char(17),char(39),char(90),char(22),char(67),char(31),char(130),char(38), +char(35),char(14),char(66),char(191),char(79),char(221),char(129),char(4),char(152),char(14), +char(71),char(200),char(65),char(220),char(130),char(254),char(22),char(11),char(19),char(73), +char(31),char(97),char(53),char(17),char(59),char(11),char(17),char(70),char(36),char(97), +char(53),char(17),char(1),char(170),char(16),char(39),char(88),char(25),char(68),char(110), +char(88),char(252),char(149),char(16),char(89),char(63),char(68),char(110),char(88),char(2), +char(222),char(2),char(140),char(183),char(70),char(198),char(99),char(252),char(233),char(2), +char(69),char(194),char(60),char(70),char(50),char(195),char(52),char(0),char(0),char(2), +char(0),char(201),char(254),char(131),char(6),char(8),char(7),char(94),char(0),char(20), +char(0),char(34),char(0),char(89),char(64),char(47),char(13),char(10),char(12),char(7), +char(14),char(14),char(9),char(19),char(2),char(2),char(20),char(20),char(24),char(32), +char(9),char(10),char(5),char(36),char(35),char(20),char(18),char(6),char(5),char(17), +char(18),char(5),char(18),char(14),char(0),char(14),char(9),char(73),char(89),char(14), +char(18),char(12),char(34),char(31),char(15),char(24),char(1),char(24),char(28),char(21), +char(7),char(0),char(3),char(0),char(63),char(50),char(222),char(50),char(205),char(93), +char(50),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(57),char(17), +char(51),char(17),char(51),char(24),char(63),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(51),char(17), +char(51),char(49),char(48),char(19),char(51),char(17),char(20),char(7),char(7),char(51), +char(1),char(51),char(17),char(51),char(3),char(35),char(19),char(35),char(17),char(52), +char(55),char(35),char(1),char(35),char(1),char(34),char(38),char(39),char(51),char(22), +char(22),char(51),char(50),char(54),char(55),char(51),char(6),char(6),char(201),char(161), +char(10),char(4),char(8),char(3),char(52),char(184),char(184),char(143),char(197),char(156), +char(160),char(19),char(9),char(252),char(201),char(186),char(2),char(67),char(186),char(168), +char(10),char(155),char(10),char(93),char(110),char(105),char(99),char(9),char(158),char(12), +char(181),char(5),char(182),char(252),char(209),char(118),char(206),char(83),char(4),char(198), +char(250),char(226),char(253),char(235),char(1),char(125),char(3),char(37),char(175),char(247), +char(251),char(53),char(6),char(43),char(143),char(164),char(108),char(78),char(93),char(93), +char(159),char(148),char(0),char(2),char(0),char(176),char(254),char(135),char(5),char(18), +char(6),char(12),char(0),char(17),char(0),char(31),char(0),char(79),char(64),char(42), +char(10),char(7),char(9),char(4),char(11),char(11),char(6),char(15),char(1),char(1), +char(16),char(16),char(21),char(29),char(6),char(7),char(5),char(33),char(32),char(3), +char(14),char(16),char(17),char(15),char(11),char(6),char(70),char(89),char(11),char(16), +char(21),char(9),char(34),char(28),char(15),char(21),char(1),char(21),char(25),char(18), +char(4),char(15),char(0),char(63),char(222),char(50),char(205),char(93),char(50),char(63), +char(63),char(51),char(43),char(0),char(24),char(63),char(18),char(57),char(57),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51), +char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(20), +char(7),char(1),char(51),char(17),char(51),char(3),char(35),char(19),char(35),char(17), +char(52),char(55),char(1),char(35),char(17),char(37),char(34),char(38),char(39),char(51), +char(22),char(22),char(51),char(50),char(54),char(55),char(51),char(6),char(6),char(1), +char(76),char(10),char(2),char(81),char(207),char(176),char(129),char(172),char(125),char(155), +char(8),char(253),char(174),char(205),char(1),char(236),char(185),char(170),char(10),char(156), +char(7),char(90),char(116),char(103),char(100),char(10),char(157),char(12),char(178),char(4), +char(72),char(253),char(106),char(136),char(136),char(3),char(166),char(252),char(71),char(253), +char(248),char(1),char(121),char(2),char(160),char(158),char(104),char(252),char(90),char(4), +char(72),char(145),char(143),char(164),char(102),char(84),char(90),char(96),char(158),char(149), +char(0),char(2),char(0),char(47),char(0),char(0),char(4),char(125),char(5),char(182), +char(0),char(17),char(0),char(25),char(0),char(77),char(64),char(41),char(8),char(4), +char(18),char(18),char(1),char(15),char(21),char(11),char(11),char(6),char(15),char(17), +char(4),char(26),char(27),char(8),char(25),char(73),char(89),char(7),char(17),char(0), +char(17),char(73),char(89),char(4),char(0),char(8),char(0),char(8),char(0),char(15), +char(2),char(15),char(18),char(74),char(89),char(15),char(18),char(2),char(3),char(0), +char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(57),char(24),char(47), +char(47),char(17),char(51),char(43),char(17),char(0),char(51),char(43),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51), +char(51),char(49),char(48),char(19),char(51),char(53),char(51),char(21),char(33),char(21), +char(33),char(17),char(51),char(32),char(17),char(20),char(4),char(33),char(33),char(17), +char(35),char(1),char(51),char(32),char(17),char(52),char(38),char(35),char(35),char(47), +char(154),char(170),char(1),char(86),char(254),char(170),char(192),char(2),char(74),char(254), +char(236),char(254),char(241),char(254),char(111),char(154),char(1),char(68),char(221),char(1), +char(123),char(184),char(201),char(215),char(4),char(252),char(186),char(186),char(150),char(254), +char(224),char(254),char(100),char(210),char(216),char(4),char(102),char(252),char(43),char(1), +char(25),char(132),char(128),char(0),char(0),char(2),char(0),char(20),char(0),char(0), +char(4),char(76),char(6),char(20),char(0),char(18),char(0),char(26),char(0),char(75), +char(64),char(40),char(4),char(0),char(20),char(20),char(16),char(12),char(23),char(8), +char(8),char(2),char(12),char(14),char(4),char(27),char(28),char(4),char(19),char(70), +char(89),char(3),char(14),char(15),char(14),char(71),char(89),char(0),char(15),char(4), +char(15),char(4),char(15),char(12),char(17),char(0),char(12),char(20),char(70),char(89), +char(12),char(21),char(0),char(63),char(43),char(0),char(24),char(63),char(18),char(57), +char(57),char(47),char(47),char(17),char(51),char(43),char(17),char(0),char(51),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51), +char(17),char(51),char(51),char(49),char(48),char(1),char(33),char(21),char(33),char(17), +char(33),char(50),char(22),char(21),char(20),char(6),char(35),char(33),char(17),char(35), +char(53),char(51),char(53),char(51),char(17),char(17),char(33),char(32),char(53),char(52), +char(38),char(35),char(1),char(86),char(1),char(39),char(254),char(217),char(1),char(64), +char(223),char(215),char(224),char(221),char(254),char(33),char(156),char(156),char(166),char(1), +char(49),char(1),char(31),char(132),char(159),char(5),char(31),char(129),char(253),char(229), +char(154),char(155),char(164),char(170),char(4),char(158),char(129),char(245),char(251),char(224), +char(254),char(151),char(185),char(92),char(84),char(0),char(0),char(2),char(0),char(201), +char(0),char(0),char(4),char(121),char(5),char(182),char(0),char(15),char(0),char(28), +char(0),char(72),char(64),char(41),char(16),char(10),char(10),char(11),char(24),char(0), +char(0),char(4),char(5),char(3),char(22),char(6),char(21),char(19),char(20),char(11), +char(10),char(29),char(30),char(22),char(19),char(28),char(16),char(12),char(28),char(74), +char(89),char(9),char(16),char(74),char(89),char(6),char(3),char(12),char(9),char(9), +char(11),char(12),char(3),char(11),char(18),char(0),char(63),char(63),char(18),char(57), +char(47),char(18),char(57),char(57),char(43),char(43),char(17),char(18),char(0),char(57), +char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(20),char(6),char(7),char(23),char(7), +char(39),char(6),char(35),char(35),char(17),char(35),char(17),char(33),char(32),char(4), +char(1),char(51),char(50),char(55),char(39),char(55),char(23),char(54),char(53),char(52), +char(38),char(35),char(35),char(4),char(121),char(115),char(108),char(120),char(100),char(149), +char(102),char(136),char(184),char(170),char(1),char(137),char(1),char(18),char(1),char(21), +char(252),char(250),char(166),char(87),char(76),char(108),char(108),char(140),char(127),char(194), +char(202),char(200),char(4),char(12),char(127),char(201),char(57),char(157),char(84),char(192), +char(27),char(253),char(193),char(5),char(182),char(215),char(253),char(242),char(10),char(141), +char(82),char(176),char(72),char(178),char(145),char(142),char(0),char(2),char(0),char(176), +char(254),char(20),char(4),char(117),char(4),char(92),char(0),char(24),char(0),char(41), +char(0),char(85),char(64),char(49),char(29),char(11),char(4),char(7),char(7),char(8), +char(39),char(18),char(18),char(21),char(22),char(20),char(37),char(23),char(34),char(36), +char(35),char(8),char(10),char(42),char(43),char(37),char(34),char(25),char(32),char(15), +char(25),char(70),char(89),char(12),char(11),char(11),char(4),char(20),char(23),char(4), +char(0),char(15),char(16),char(9),char(15),char(8),char(27),char(0),char(32),char(70), +char(89),char(0),char(22),char(0),char(63),char(43),char(0),char(24),char(63),char(63), +char(63),char(18),char(23),char(57),char(17),char(51),char(43),char(17),char(18),char(0), +char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(51),char(51),char(49),char(48),char(5),char(34),char(38), +char(39),char(35),char(22),char(21),char(17),char(35),char(17),char(51),char(23),char(51), +char(54),char(54),char(51),char(50),char(18),char(17),char(16),char(7),char(23),char(7), +char(39),char(6),char(3),char(34),char(6),char(7),char(21),char(20),char(22),char(51), +char(50),char(55),char(39),char(55),char(23),char(54),char(53),char(52),char(38),char(2), +char(174),char(107),char(177),char(60),char(12),char(12),char(166),char(135),char(25),char(8), +char(64),char(169),char(109),char(218),char(237),char(183),char(115),char(100),char(131),char(71), +char(109),char(168),char(150),char(2),char(154),char(170),char(47),char(41),char(121),char(106), +char(129),char(101),char(150),char(20),char(79),char(82),char(148),char(34),char(254),char(61), +char(6),char(52),char(150),char(90),char(80),char(254),char(214),char(254),char(243),char(254), +char(174),char(145),char(156),char(80),char(174),char(24),char(3),char(227),char(186),char(203), +char(37),char(231),char(199),char(12),char(158),char(80),char(170),char(103),char(249),char(215), +char(209),char(0),char(0),char(1),char(0),char(47),char(0),char(0),char(4),char(8), +char(5),char(182),char(0),char(13),char(0),char(60),char(64),char(31),char(3),char(7), +char(7),char(12),char(8),char(0),char(5),char(8),char(10),char(4),char(14),char(15), +char(6),char(10),char(11),char(10),char(73),char(89),char(3),char(11),char(11),char(8), +char(13),char(13),char(2),char(73),char(89),char(13),char(3),char(8),char(18),char(0), +char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(51), +char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(51),char(17),char(51),char(49),char(48),char(1),char(21),char(33),char(17), +char(33),char(21),char(33),char(17),char(35),char(17),char(35),char(53),char(51),char(17), +char(4),char(8),char(253),char(107),char(1),char(168),char(254),char(88),char(170),char(154), +char(154),char(5),char(182),char(153),char(254),char(2),char(150),char(253),char(119),char(2), +char(137),char(150),char(2),char(151),char(0),char(1),char(0),char(18),char(0),char(0), +char(3),char(66),char(4),char(72),char(0),char(13),char(0),char(60),char(64),char(31), +char(2),char(6),char(6),char(11),char(7),char(0),char(4),char(7),char(9),char(4), +char(14),char(15),char(5),char(9),char(10),char(9),char(71),char(89),char(2),char(10), +char(10),char(7),char(12),char(12),char(1),char(70),char(89),char(12),char(15),char(7), +char(21),char(0),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(1),char(33), +char(17),char(33),char(21),char(33),char(17),char(35),char(17),char(35),char(53),char(51), +char(17),char(33),char(3),char(66),char(254),char(20),char(1),char(90),char(254),char(166), +char(166),char(158),char(158),char(2),char(146),char(3),char(188),char(254),char(168),char(127), +char(254),char(27),char(1),char(229),char(127),char(1),char(228),char(0),char(0),char(1), +char(0),char(201),char(254),char(0),char(4),char(219),char(5),char(182),char(0),char(27), +char(0),char(65),char(64),char(35),char(9),char(3),char(3),char(4),char(25),char(14), +char(14),char(7),char(20),char(4),char(4),char(28),char(29),char(17),char(23),char(73), +char(89),char(17),char(28),char(11),char(0),char(73),char(89),char(11),char(11),char(4), +char(5),char(5),char(8),char(73),char(89),char(5),char(3),char(4),char(18),char(0), +char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(34),char(7), +char(17),char(35),char(17),char(33),char(21),char(33),char(17),char(54),char(51),char(32), +char(0),char(17),char(16),char(0),char(33),char(34),char(38),char(39),char(53),char(22), +char(51),char(32),char(17),char(52),char(0),char(2),char(49),char(100),char(90),char(170), +char(3),char(73),char(253),char(97),char(90),char(121),char(1),char(64),char(1),char(85), +char(254),char(226),char(254),char(253),char(83),char(125),char(70),char(123),char(137),char(1), +char(127),char(255),char(0),char(2),char(143),char(12),char(253),char(125),char(5),char(182), +char(153),char(253),char(252),char(10),char(254),char(173),char(254),char(198),char(254),char(197), +char(254),char(165),char(21),char(28),char(152),char(49),char(1),char(254),char(245),char(1), +char(4),char(0),char(0),char(1),char(0),char(176),char(254),char(10),char(3),char(250), +char(4),char(72),char(0),char(27),char(0),char(65),char(64),char(35),char(8),char(25), +char(20),char(14),char(14),char(15),char(15),char(2),char(18),char(25),char(4),char(29), +char(28),char(22),char(11),char(70),char(89),char(22),char(22),char(15),char(16),char(16), +char(19),char(70),char(89),char(16),char(15),char(15),char(21),char(0),char(5),char(70), +char(89),char(0),char(27),char(0),char(63),char(43),char(0),char(24),char(63),char(63), +char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(1),char(34),char(39),char(53),char(22),char(51),char(50),char(54),char(53), +char(52),char(38),char(35),char(34),char(7),char(17),char(35),char(17),char(33),char(21), +char(33),char(17),char(54),char(51),char(32),char(0),char(17),char(16),char(2),char(2), +char(70),char(145),char(101),char(116),char(123),char(133),char(136),char(178),char(181),char(69), +char(74),char(166),char(2),char(154),char(254),char(12),char(82),char(59),char(1),char(16), +char(1),char(7),char(228),char(254),char(10),char(60),char(149),char(63),char(202),char(215), +char(223),char(208),char(17),char(254),char(37),char(4),char(72),char(142),char(254),char(183), +char(12),char(254),char(229),char(254),char(217),char(254),char(245),char(254),char(218),char(0), +char(0),char(1),char(0),char(2),char(254),char(131),char(6),char(248),char(5),char(182), +char(0),char(21),char(0),char(77),char(64),char(41),char(6),char(17),char(17),char(3), +char(18),char(13),char(12),char(12),char(8),char(9),char(18),char(0),char(1),char(21), +char(7),char(22),char(23),char(18),char(21),char(18),char(19),char(16),char(9),char(6), +char(3),char(0),char(0),char(15),char(1),char(15),char(10),char(73),char(89),char(15), +char(18),char(13),char(34),char(7),char(4),char(1),char(3),char(0),char(63),char(51), +char(51),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(17),char(51), +char(51),char(51),char(51),char(51),char(24),char(63),char(51),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(49), +char(48),char(1),char(1),char(51),char(1),char(17),char(51),char(17),char(1),char(51), +char(1),char(1),char(51),char(17),char(35),char(17),char(35),char(1),char(17),char(35), +char(17),char(1),char(35),char(2),char(86),char(253),char(193),char(190),char(2),char(57), +char(164),char(2),char(58),char(190),char(253),char(192),char(1),char(218),char(180),char(162), +char(94),char(253),char(186),char(164),char(253),char(187),char(199),char(2),char(240),char(2), +char(198),char(253),char(60),char(2),char(196),char(253),char(60),char(2),char(196),char(253), +char(60),char(253),char(168),char(253),char(233),char(1),char(125),char(2),char(229),char(253), +char(27),char(2),char(229),char(253),char(27),char(0),char(0),char(1),char(0),char(4), +char(254),char(135),char(6),char(31),char(4),char(72),char(0),char(21),char(0),char(75), +char(64),char(40),char(2),char(13),char(13),char(21),char(14),char(9),char(8),char(8), +char(4),char(5),char(14),char(18),char(19),char(17),char(7),char(22),char(23),char(21), +char(15),char(12),char(5),char(2),char(18),char(18),char(11),char(3),char(0),char(19), +char(15),char(14),char(17),char(21),char(11),char(6),char(70),char(89),char(11),char(21), +char(9),char(34),char(0),char(63),char(63),char(43),char(0),char(24),char(63),char(51), +char(63),char(51),char(51),char(18),char(57),char(17),char(51),char(51),char(51),char(51), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(51),char(17),char(51),char(49),char(48),char(1),char(51),char(17),char(1),char(51), +char(1),char(1),char(51),char(17),char(35),char(17),char(35),char(1),char(17),char(35), +char(17),char(1),char(35),char(1),char(1),char(51),char(1),char(2),char(164),char(153), +char(1),char(197),char(182),char(254),char(54),char(1),char(112),char(193),char(162),char(94), +char(254),char(30),char(153),char(254),char(31),char(191),char(1),char(240),char(254),char(55), +char(182),char(1),char(195),char(4),char(72),char(253),char(237),char(2),char(19),char(253), +char(237),char(254),char(90),char(253),char(248),char(1),char(121),char(2),char(45),char(253), +char(211),char(2),char(45),char(253),char(211),char(2),char(53),char(2),char(19),char(253), +char(237),char(0),char(255),char(255),char(0),char(74),char(254),char(66),char(4),char(53), +char(5),char(203),char(2),char(38),char(1),char(177),char(0),char(0),char(0),char(7), +char(3),char(127),char(1),char(88),char(0),char(0),char(255),char(255),char(0),char(68), +char(254),char(66),char(3),char(127),char(4),char(92),char(2),char(38),char(1),char(209), +char(0),char(0),char(0),char(7),char(3),char(127),char(1),char(8),char(0),char(0), +char(0),char(1),char(0),char(201),char(254),char(131),char(5),char(43),char(5),char(182), +char(0),char(15),char(0),char(59),char(64),char(32),char(12),char(8),char(8),char(9), +char(3),char(2),char(2),char(14),char(15),char(6),char(9),char(5),char(16),char(17), +char(15),char(12),char(6),char(3),char(5),char(13),char(10),char(3),char(9),char(18), +char(5),char(0),char(73),char(89),char(5),char(18),char(3),char(34),char(0),char(63), +char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(18),char(23),char(57), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(37),char(51),char(17),char(35),char(17),char(35),char(1), +char(7),char(17),char(35),char(17),char(51),char(17),char(1),char(51),char(1),char(4), +char(127),char(172),char(162),char(102),char(253),char(233),char(153),char(170),char(170),char(2), +char(151),char(201),char(253),char(180),char(154),char(253),char(233),char(1),char(125),char(2), +char(197),char(136),char(253),char(195),char(5),char(182),char(253),char(43),char(2),char(213), +char(253),char(133),char(0),char(1),char(0),char(176),char(254),char(133),char(4),char(61), +char(4),char(72),char(0),char(14),char(0),char(58),char(64),char(31),char(14),char(10), +char(10),char(11),char(6),char(5),char(5),char(1),char(2),char(11),char(4),char(15), +char(16),char(2),char(14),char(9),char(3),char(8),char(0),char(12),char(15),char(11), +char(21),char(8),char(3),char(70),char(89),char(8),char(21),char(6),char(34),char(0), +char(63),char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(18),char(23), +char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(51),char(1),char(1),char(51),char(17), +char(35),char(17),char(35),char(1),char(17),char(35),char(17),char(51),char(17),char(3), +char(47),char(182),char(254),char(39),char(1),char(127),char(178),char(159),char(84),char(254), +char(12),char(166),char(166),char(4),char(72),char(253),char(239),char(254),char(88),char(253), +char(246),char(1),char(123),char(2),char(43),char(253),char(213),char(4),char(72),char(253), +char(235),char(0),char(0),char(1),char(0),char(201),char(0),char(0),char(4),char(233), +char(5),char(182),char(0),char(18),char(0),char(56),char(64),char(30),char(6),char(2), +char(2),char(3),char(10),char(17),char(17),char(7),char(18),char(14),char(12),char(18), +char(3),char(4),char(19),char(20),char(8),char(10),char(6),char(0),char(16),char(18), +char(6),char(3),char(11),char(4),char(3),char(15),char(3),char(18),char(0),char(63), +char(51),char(63),char(51),char(18),char(23),char(57),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(7),char(17),char(35),char(17),char(51),char(17),char(55), +char(17),char(51),char(21),char(1),char(51),char(1),char(1),char(35),char(1),char(17), +char(35),char(1),char(240),char(125),char(170),char(170),char(125),char(125),char(1),char(155), +char(203),char(253),char(180),char(2),char(98),char(200),char(254),char(76),char(125),char(2), +char(168),char(107),char(253),char(195),char(5),char(182),char(253),char(37),char(139),char(1), +char(93),char(211),char(1),char(198),char(253),char(133),char(252),char(197),char(2),char(92), +char(254),char(207),char(0),char(1),char(0),char(176),char(0),char(0),char(4),char(59), +char(4),char(72),char(0),char(19),char(0),char(58),char(64),char(31),char(6),char(2), +char(2),char(3),char(14),char(10),char(18),char(18),char(7),char(19),char(15),char(12), +char(19),char(3),char(4),char(20),char(21),char(8),char(10),char(6),char(1),char(17), +char(19),char(6),char(3),char(11),char(4),char(15),char(16),char(3),char(21),char(0), +char(63),char(51),char(63),char(51),char(18),char(23),char(57),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(51),char(17),char(51),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(39),char(17),char(35),char(17),char(51), +char(17),char(55),char(17),char(51),char(21),char(1),char(51),char(1),char(21),char(1), +char(35),char(1),char(21),char(35),char(1),char(205),char(119),char(166),char(166),char(119), +char(131),char(1),char(14),char(182),char(254),char(60),char(1),char(235),char(194),char(254), +char(213),char(129),char(1),char(178),char(121),char(253),char(213),char(4),char(72),char(253), +char(235),char(121),char(1),char(74),char(205),char(1),char(31),char(254),char(37),char(107), +char(253),char(254),char(1),char(59),char(221),char(0),char(0),char(1),char(0),char(47), +char(0),char(0),char(4),char(233),char(5),char(182),char(0),char(19),char(0),char(71), +char(64),char(38),char(8),char(4),char(16),char(16),char(1),char(17),char(11),char(14), +char(12),char(10),char(6),char(14),char(17),char(19),char(6),char(20),char(21),char(7), +char(19),char(0),char(19),char(73),char(89),char(4),char(11),char(8),char(14),char(3), +char(17),char(0),char(0),char(2),char(13),char(17),char(18),char(9),char(2),char(3), +char(0),char(63),char(51),char(63),char(51),char(18),char(57),char(47),char(18),char(23), +char(57),char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(51),char(17),char(51),char(51),char(49), +char(48),char(19),char(51),char(53),char(51),char(21),char(51),char(21),char(35),char(17), +char(1),char(51),char(1),char(1),char(35),char(1),char(7),char(17),char(35),char(17), +char(35),char(47),char(154),char(170),char(221),char(221),char(2),char(149),char(203),char(253), +char(180),char(2),char(98),char(206),char(253),char(241),char(153),char(170),char(154),char(5), +char(4),char(178),char(178),char(151),char(254),char(110),char(2),char(219),char(253),char(133), +char(252),char(197),char(2),char(197),char(134),char(253),char(193),char(4),char(109),char(0), +char(0),char(1),char(0),char(20),char(0),char(0),char(4),char(27),char(6),char(20), +char(0),char(25),char(0),char(77),char(64),char(43),char(10),char(8),char(4),char(22), +char(22),char(1),char(23),char(18),char(16),char(6),char(17),char(23),char(25),char(6), +char(26),char(27),char(20),char(10),char(15),char(19),char(23),char(21),char(7),char(25), +char(0),char(25),char(71),char(89),char(4),char(15),char(0),char(31),char(0),char(47), +char(0),char(3),char(0),char(0),char(2),char(15),char(15),char(2),char(0),char(0), +char(63),char(63),char(18),char(57),char(47),char(93),char(51),char(43),char(17),char(0), +char(51),char(24),char(63),char(51),char(18),char(57),char(57),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(51),char(17),char(51),char(51),char(51),char(49), +char(48),char(19),char(51),char(53),char(51),char(21),char(33),char(21),char(33),char(17), +char(7),char(7),char(51),char(55),char(54),char(54),char(1),char(51),char(1),char(1), +char(35),char(1),char(7),char(17),char(35),char(17),char(35),char(20),char(156),char(164), +char(1),char(125),char(254),char(131),char(3),char(3),char(8),char(18),char(55),char(40), +char(1),char(112),char(199),char(254),char(68),char(1),char(217),char(199),char(254),char(125), +char(125),char(164),char(156),char(5),char(90),char(186),char(186),char(127),char(253),char(232), +char(91),char(55),char(24),char(74),char(48),char(1),char(133),char(254),char(45),char(253), +char(139),char(2),char(4),char(106),char(254),char(102),char(4),char(219),char(0),char(1), +char(0),char(16),char(0),char(0),char(5),char(131),char(5),char(182),char(0),char(13), +char(0),char(53),char(64),char(27),char(2),char(10),char(10),char(11),char(5),char(8), +char(6),char(4),char(8),char(11),char(4),char(14),char(15),char(8),char(2),char(0), +char(7),char(11),char(18),char(3),char(3),char(0),char(13),char(73),char(89),char(0), +char(3),char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(18), +char(57),char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(19),char(33),char(17),char(1),char(51), +char(1),char(1),char(35),char(1),char(7),char(17),char(35),char(17),char(33),char(16), +char(1),char(252),char(2),char(150),char(203),char(253),char(180),char(2),char(98),char(201), +char(253),char(236),char(154),char(170),char(254),char(174),char(5),char(182),char(253),char(37), +char(2),char(219),char(253),char(133),char(252),char(197),char(2),char(197),char(136),char(253), +char(195),char(5),char(29),char(0),char(0),char(1),char(0),char(41),char(0),char(0), +char(4),char(227),char(4),char(72),char(0),char(12),char(0),char(53),char(64),char(27), +char(5),char(1),char(1),char(9),char(9),char(10),char(12),char(10),char(4),char(6), +char(4),char(14),char(13),char(8),char(2),char(0),char(7),char(10),char(21),char(3), +char(15),char(0),char(12),char(70),char(89),char(0),char(15),char(0),char(63),char(43), +char(0),char(24),char(63),char(63),char(51),char(18),char(57),char(57),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(19),char(33),char(17),char(1),char(51),char(1),char(1),char(35),char(1), +char(17),char(35),char(17),char(33),char(41),char(2),char(2),char(1),char(219),char(182), +char(254),char(39),char(2),char(0),char(194),char(254),char(10),char(164),char(254),char(162), +char(4),char(72),char(253),char(235),char(2),char(21),char(253),char(237),char(253),char(203), +char(2),char(43),char(253),char(213),char(3),char(188),char(0),char(1),char(0),char(201), +char(254),char(131),char(5),char(193),char(5),char(182),char(0),char(15),char(0),char(68), +char(64),char(36),char(12),char(8),char(8),char(9),char(13),char(5),char(5),char(0), +char(3),char(2),char(2),char(0),char(9),char(3),char(16),char(17),char(12),char(7), +char(73),char(89),char(12),char(12),char(5),char(14),char(10),char(3),char(9),char(18), +char(5),char(0),char(73),char(89),char(5),char(18),char(3),char(34),char(0),char(63), +char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(18),char(57),char(47), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(51), +char(17),char(35),char(17),char(35),char(17),char(33),char(17),char(35),char(17),char(51), +char(17),char(33),char(17),char(51),char(5),char(31),char(162),char(162),char(170),char(252), +char(254),char(170),char(170),char(3),char(2),char(170),char(154),char(253),char(233),char(1), +char(125),char(2),char(176),char(253),char(80),char(5),char(182),char(253),char(146),char(2), +char(110),char(0),char(0),char(1),char(0),char(176),char(254),char(135),char(4),char(248), +char(4),char(72),char(0),char(15),char(0),char(78),char(64),char(43),char(1),char(13), +char(13),char(14),char(2),char(10),char(10),char(5),char(8),char(7),char(7),char(5), +char(14),char(3),char(16),char(17),char(1),char(12),char(70),char(89),char(15),char(1), +char(31),char(1),char(2),char(11),char(3),char(1),char(1),char(10),char(3),char(15), +char(15),char(14),char(21),char(10),char(5),char(70),char(89),char(10),char(21),char(8), +char(34),char(0),char(63),char(63),char(43),char(0),char(24),char(63),char(63),char(51), +char(18),char(57),char(47),char(95),char(94),char(93),char(43),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(17),char(33),char(17),char(51),char(17), +char(51),char(17),char(35),char(17),char(35),char(17),char(33),char(17),char(35),char(17), +char(1),char(86),char(2),char(102),char(166),char(150),char(166),char(150),char(253),char(154), +char(166),char(4),char(72),char(254),char(53),char(1),char(203),char(252),char(71),char(253), +char(248),char(1),char(121),char(1),char(238),char(254),char(18),char(4),char(72),char(0), +char(0),char(1),char(0),char(201),char(0),char(0),char(6),char(111),char(5),char(182), +char(0),char(13),char(0),char(63),char(64),char(33),char(10),char(6),char(6),char(7), +char(11),char(3),char(3),char(2),char(0),char(2),char(7),char(3),char(14),char(15), +char(10),char(5),char(73),char(89),char(10),char(10),char(7),char(12),char(12),char(1), +char(73),char(89),char(12),char(3),char(8),char(3),char(3),char(7),char(18),char(0), +char(63),char(51),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(33),char(17), +char(35),char(17),char(33),char(17),char(35),char(17),char(51),char(17),char(33),char(17), +char(33),char(6),char(111),char(254),char(176),char(172),char(253),char(0),char(170),char(170), +char(3),char(0),char(1),char(252),char(5),char(29),char(250),char(227),char(2),char(176), +char(253),char(80),char(5),char(182),char(253),char(146),char(2),char(110),char(0),char(1), +char(0),char(176),char(0),char(0),char(5),char(193),char(4),char(72),char(0),char(13), +char(0),char(73),char(64),char(39),char(1),char(11),char(11),char(12),char(2),char(8), +char(8),char(7),char(4),char(7),char(12),char(3),char(14),char(15),char(13),char(15), +char(1),char(10),char(70),char(89),char(15),char(1),char(31),char(1),char(2),char(11), +char(3),char(1),char(1),char(3),char(8),char(12),char(21),char(3),char(6),char(70), +char(89),char(3),char(15),char(0),char(63),char(43),char(0),char(24),char(63),char(51), +char(18),char(57),char(47),char(95),char(94),char(93),char(43),char(0),char(24),char(63), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(33),char(17),char(33), +char(21),char(33),char(17),char(35),char(17),char(33),char(17),char(35),char(17),char(1), +char(86),char(2),char(102),char(2),char(5),char(254),char(161),char(166),char(253),char(154), +char(166),char(4),char(72),char(254),char(53),char(1),char(203),char(140),char(252),char(68), +char(1),char(238),char(254),char(18),char(4),char(72),char(0),char(1),char(0),char(201), +char(254),char(0),char(8),char(29),char(5),char(182),char(0),char(29),char(0),char(71), +char(64),char(38),char(4),char(5),char(8),char(0),char(0),char(1),char(23),char(13), +char(13),char(18),char(1),char(5),char(4),char(30),char(31),char(16),char(21),char(73), +char(89),char(16),char(28),char(10),char(26),char(73),char(89),char(10),char(10),char(5), +char(6),char(6),char(3),char(73),char(89),char(6),char(3),char(1),char(5),char(18), +char(0),char(63),char(51),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(33),char(35),char(17),char(33),char(17),char(35),char(17),char(33),char(17), +char(54),char(51),char(32),char(0),char(17),char(16),char(0),char(33),char(34),char(39), +char(53),char(22),char(51),char(32),char(17),char(52),char(2),char(35),char(34),char(6), +char(7),char(4),char(217),char(170),char(253),char(68),char(170),char(4),char(16),char(68), +char(125),char(1),char(50),char(1),char(81),char(254),char(229),char(254),char(254),char(156), +char(123),char(134),char(127),char(1),char(122),char(230),char(232),char(42),char(127),char(24), +char(5),char(29),char(250),char(227),char(5),char(182),char(253),char(97),char(12),char(254), +char(168),char(254),char(200),char(254),char(199),char(254),char(166),char(49),char(152),char(49), +char(1),char(254),char(242),char(1),char(5),char(7),char(5),char(0),char(0),char(1), +char(0),char(176),char(254),char(10),char(6),char(168),char(4),char(72),char(0),char(28), +char(0),char(71),char(64),char(38),char(17),char(18),char(21),char(13),char(13),char(14), +char(7),char(26),char(26),char(2),char(14),char(18),char(4),char(29),char(30),char(23), +char(10),char(70),char(89),char(23),char(23),char(18),char(19),char(19),char(16),char(70), +char(89),char(19),char(15),char(14),char(18),char(21),char(0),char(5),char(70),char(89), +char(0),char(27),char(0),char(63),char(43),char(0),char(24),char(63),char(51),char(63), +char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(34),char(39),char(53),char(22),char(51),char(50), +char(17),char(52),char(38),char(35),char(34),char(7),char(17),char(35),char(17),char(33), +char(17),char(35),char(17),char(33),char(17),char(54),char(51),char(50),char(0),char(17), +char(16),char(2),char(5),char(23),char(131),char(97),char(109),char(108),char(240),char(166), +char(172),char(67),char(72),char(168),char(253),char(223),char(166),char(3),char(111),char(75), +char(66),char(246),char(1),char(6),char(209),char(254),char(10),char(60),char(149),char(63), +char(1),char(161),char(223),char(208),char(21),char(254),char(41),char(3),char(184),char(252), +char(72),char(4),char(72),char(254),char(39),char(14),char(254),char(215),char(254),char(231), +char(254),char(244),char(254),char(219),char(0),char(2),char(0),char(125),char(255),char(172), +char(5),char(225),char(5),char(205),char(0),char(40),char(0),char(52),char(0),char(80), +char(64),char(44),char(27),char(17),char(47),char(35),char(41),char(0),char(8),char(0), +char(3),char(22),char(32),char(35),char(17),char(7),char(53),char(54),char(38),char(44), +char(74),char(89),char(12),char(50),char(38),char(38),char(14),char(20),char(20),char(25), +char(73),char(89),char(20),char(4),char(10),char(5),char(73),char(89),char(10),char(14), +char(14),char(30),char(73),char(89),char(14),char(19),char(0),char(63),char(43),char(0), +char(24),char(16),char(196),char(43),char(0),char(24),char(63),char(43),char(17),char(18), +char(0),char(57),char(24),char(47),char(57),char(57),char(43),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(20),char(2),char(7),char(22),char(51),char(50),char(55),char(21),char(6), +char(35),char(34),char(39),char(6),char(35),char(32),char(0),char(17),char(16),char(0), +char(33),char(50),char(23),char(7),char(38),char(35),char(32),char(17),char(16),char(18), +char(51),char(50),char(55),char(38),char(2),char(53),char(52),char(18),char(51),char(50), +char(18),char(3),char(52),char(38),char(35),char(34),char(6),char(21),char(20),char(22), +char(23),char(54),char(54),char(5),char(184),char(138),char(116),char(66),char(90),char(78), +char(61),char(56),char(91),char(178),char(148),char(102),char(144),char(254),char(202),char(254), +char(161),char(1),char(73),char(1),char(58),char(127),char(92),char(47),char(84),char(90), +char(254),char(51),char(255),char(235),char(54),char(46),char(86),char(92),char(198),char(175), +char(181),char(193),char(176),char(103),char(93),char(94),char(103),char(93),char(83),char(102), +char(115),char(2),char(166),char(181),char(254),char(203),char(86),char(30),char(22),char(153), +char(25),char(100),char(36),char(1),char(137),char(1),char(86),char(1),char(120),char(1), +char(138),char(35),char(145),char(28),char(253),char(158),char(254),char(224),char(254),char(206), +char(10),char(103),char(1),char(28),char(160),char(244),char(1),char(10),char(254),char(246), +char(254),char(254),char(177),char(204),char(201),char(176),char(140),char(254),char(85),char(67), +char(255),char(0),char(0),char(2),char(0),char(115),char(255),char(199),char(4),char(211), +char(4),char(92),char(0),char(10),char(0),char(53),char(0),char(80),char(64),char(44), +char(30),char(19),char(0),char(38),char(6),char(44),char(52),char(44),char(47),char(24), +char(36),char(38),char(19),char(7),char(54),char(55),char(41),char(8),char(71),char(89), +char(13),char(3),char(41),char(41),char(15),char(22),char(22),char(27),char(70),char(89), +char(22),char(16),char(11),char(49),char(70),char(89),char(11),char(15),char(15),char(33), +char(70),char(89),char(15),char(22),char(0),char(63),char(43),char(0),char(24),char(16), +char(196),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57), +char(24),char(47),char(57),char(57),char(43),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(20), +char(22),char(23),char(54),char(54),char(53),char(52),char(35),char(34),char(6),char(1), +char(34),char(39),char(6),char(35),char(34),char(38),char(38),char(53),char(16),char(18), +char(51),char(50),char(23),char(7),char(38),char(35),char(34),char(6),char(21),char(20), +char(22),char(51),char(50),char(54),char(55),char(38),char(53),char(52),char(54),char(51), +char(50),char(22),char(21),char(20),char(6),char(7),char(22),char(51),char(50),char(55), +char(21),char(6),char(2),char(238),char(68),char(63),char(68),char(83),char(135),char(72), +char(75),char(1),char(102),char(147),char(130),char(96),char(123),char(149),char(226),char(122), +char(248),char(227),char(91),char(77),char(37),char(54),char(79),char(156),char(145),char(170), +char(164),char(37),char(53),char(6),char(139),char(168),char(151),char(148),char(157),char(107), +char(94),char(52),char(67),char(66),char(49),char(39),char(1),char(242),char(94),char(161), +char(53),char(44),char(158),char(110),char(235),char(125),char(253),char(99),char(77),char(40), +char(139),char(254),char(164),char(1),char(19),char(1),char(48),char(22),char(138),char(19), +char(209),char(231),char(206),char(210),char(9),char(3),char(148),char(225),char(173),char(193), +char(189),char(177),char(125),char(209),char(64),char(26),char(14),char(137),char(14),char(0), +char(255),char(255),char(0),char(125),char(254),char(66),char(4),char(207),char(5),char(203), +char(2),char(38),char(0),char(38),char(0),char(0),char(0),char(7),char(3),char(127), +char(2),char(37),char(0),char(0),char(255),char(255),char(0),char(115),char(254),char(66), +char(3),char(139),char(4),char(92),char(2),char(38),char(0),char(70),char(0),char(0), +char(0),char(7),char(3),char(127),char(1),char(131),char(0),char(0),char(0),char(1), +char(0),char(16),char(254),char(131),char(4),char(90),char(5),char(182),char(0),char(11), +char(0),char(50),char(64),char(27),char(6),char(11),char(8),char(9),char(3),char(9), +char(11),char(1),char(4),char(12),char(13),char(11),char(6),char(73),char(89),char(11), +char(18),char(9),char(34),char(5),char(1),char(2),char(1),char(73),char(89),char(2), +char(3),char(0),char(63),char(43),char(17),char(0),char(51),char(24),char(63),char(63), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(33),char(53),char(33),char(21),char(33),char(17),char(51), +char(17),char(35),char(17),char(35),char(1),char(223),char(254),char(49),char(4),char(74), +char(254),char(49),char(162),char(162),char(172),char(5),char(29),char(153),char(153),char(251), +char(125),char(253),char(233),char(1),char(125),char(0),char(0),char(1),char(0),char(41), +char(254),char(135),char(3),char(145),char(4),char(72),char(0),char(11),char(0),char(52), +char(64),char(27),char(6),char(11),char(8),char(9),char(3),char(9),char(11),char(1), +char(4),char(12),char(13),char(9),char(34),char(5),char(1),char(2),char(1),char(70), +char(89),char(2),char(15),char(11),char(6),char(70),char(89),char(11),char(21),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(0),char(51),char(24), +char(63),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(33),char(53),char(33),char(21),char(33),char(17),char(51), +char(17),char(35),char(17),char(35),char(1),char(137),char(254),char(160),char(3),char(104), +char(254),char(158),char(150),char(166),char(150),char(3),char(188),char(140),char(140),char(252), +char(211),char(253),char(248),char(1),char(121),char(0),char(255),char(255),char(0),char(0), +char(0),char(0),char(4),char(123),char(5),char(182),char(2),char(6),char(0),char(60), +char(0),char(0),char(0),char(1),char(0),char(0),char(254),char(20),char(4),char(2), +char(4),char(72),char(0),char(13),char(0),char(41),char(64),char(20),char(0),char(1), +char(12),char(1),char(3),char(3),char(14),char(15),char(8),char(7),char(13),char(7), +char(2),char(11),char(3),char(15),char(2),char(21),char(1),char(27),char(0),char(63), +char(63),char(63),char(51),char(18),char(57),char(57),char(17),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(35),char(17), +char(1),char(51),char(19),char(22),char(23),char(51),char(54),char(55),char(19),char(51), +char(1),char(2),char(84),char(166),char(254),char(82),char(172),char(236),char(83),char(19), +char(8),char(33),char(70),char(233),char(172),char(254),char(82),char(254),char(20),char(1), +char(232),char(4),char(76),char(253),char(155),char(222),char(97),char(138),char(181),char(2), +char(101),char(251),char(180),char(0),char(0),char(1),char(0),char(0),char(0),char(0), +char(4),char(123),char(5),char(182),char(0),char(16),char(0),char(58),char(64),char(30), +char(4),char(8),char(8),char(13),char(9),char(2),char(6),char(9),char(11),char(15), +char(5),char(17),char(18),char(7),char(11),char(12),char(11),char(73),char(89),char(4), +char(0),char(15),char(12),char(12),char(9),char(1),char(15),char(3),char(9),char(18), +char(0),char(63),char(63),char(51),char(18),char(57),char(47),char(18),char(57),char(51), +char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(51),char(17),char(51),char(49),char(48),char(1),char(1),char(51),char(1), +char(21),char(33),char(21),char(33),char(17),char(35),char(17),char(33),char(53),char(33), +char(53),char(1),char(51),char(2),char(61),char(1),char(134),char(184),char(254),char(24), +char(1),char(43),char(254),char(213),char(172),char(254),char(211),char(1),char(45),char(254), +char(25),char(186),char(2),char(219),char(2),char(219),char(252),char(129),char(59),char(152), +char(254),char(156),char(1),char(100),char(152),char(51),char(3),char(135),char(0),char(1), +char(0),char(0),char(254),char(20),char(4),char(2),char(4),char(72),char(0),char(19), +char(0),char(60),char(64),char(31),char(17),char(1),char(1),char(6),char(2),char(16), +char(19),char(2),char(4),char(7),char(5),char(20),char(21),char(12),char(11),char(11), +char(5),char(15),char(7),char(15),char(0),char(4),char(5),char(4),char(71),char(89), +char(17),char(5),char(21),char(2),char(27),char(0),char(63),char(63),char(51),char(43), +char(17),char(0),char(51),char(24),char(63),char(51),char(18),char(57),char(17),char(51), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(17),char(51), +char(49),char(48),char(5),char(17),char(35),char(17),char(33),char(53),char(33),char(1), +char(51),char(19),char(22),char(23),char(51),char(54),char(55),char(19),char(51),char(1), +char(33),char(21),char(2),char(84),char(166),char(254),char(234),char(1),char(20),char(254), +char(84),char(172),char(236),char(83),char(19),char(8),char(33),char(70),char(233),char(172), +char(254),char(84),char(1),char(18),char(129),char(254),char(149),char(1),char(107),char(129), +char(4),char(72),char(253),char(155),char(222),char(97),char(138),char(181),char(2),char(101), +char(251),char(184),char(129),char(0),char(0),char(1),char(0),char(8),char(254),char(131), +char(4),char(213),char(5),char(182),char(0),char(15),char(0),char(55),char(64),char(32), +char(3),char(2),char(2),char(14),char(15),char(12),char(6),char(9),char(10),char(8), +char(8),char(16),char(17),char(12),char(15),char(9),char(6),char(4),char(5),char(13), +char(10),char(3),char(8),char(18),char(5),char(0),char(73),char(89),char(5),char(18), +char(3),char(34),char(0),char(63),char(63),char(43),char(0),char(24),char(63),char(63), +char(51),char(18),char(23),char(57),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(49),char(48),char(37),char(51),char(17),char(35),char(17),char(35),char(1), +char(1),char(35),char(1),char(1),char(51),char(1),char(1),char(51),char(1),char(4), +char(51),char(162),char(162),char(94),char(254),char(119),char(254),char(112),char(180),char(1), +char(230),char(254),char(59),char(188),char(1),char(107),char(1),char(110),char(181),char(254), +char(59),char(154),char(253),char(233),char(1),char(125),char(2),char(131),char(253),char(125), +char(2),char(252),char(2),char(186),char(253),char(189),char(2),char(67),char(253),char(76), +char(0),char(1),char(0),char(39),char(254),char(133),char(4),char(55),char(4),char(72), +char(0),char(15),char(0),char(57),char(64),char(33),char(10),char(9),char(9),char(5), +char(6),char(3),char(13),char(0),char(1),char(15),char(8),char(16),char(17),char(15), +char(21),char(3),char(6),char(0),char(13),char(4),char(12),char(1),char(12),char(7), +char(70),char(89),char(12),char(21),char(10),char(34),char(4),char(1),char(15),char(0), +char(63),char(51),char(63),char(63),char(43),char(17),char(18),char(0),char(23),char(57), +char(24),char(63),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(49), +char(48),char(1),char(1),char(51),char(1),char(1),char(51),char(1),char(1),char(51), +char(17),char(35),char(17),char(35),char(1),char(1),char(35),char(1),char(184),char(254), +char(131),char(189),char(1),char(33),char(1),char(32),char(187),char(254),char(131),char(1), +char(43),char(149),char(166),char(69),char(254),char(205),char(254),char(202),char(188),char(2), +char(49),char(2),char(23),char(254),char(92),char(1),char(164),char(253),char(233),char(254), +char(94),char(253),char(246),char(1),char(123),char(1),char(188),char(254),char(68),char(0), +char(0),char(1),char(0),char(16),char(254),char(131),char(6),char(168),char(5),char(182), +char(0),char(15),char(0),char(64),char(64),char(34),char(12),char(5),char(0),char(13), +char(3),char(2),char(2),char(13),char(10),char(5),char(7),char(5),char(16),char(17), +char(14),char(3),char(11),char(7),char(8),char(7),char(73),char(89),char(8),char(3), +char(0),char(12),char(5),char(12),char(73),char(89),char(5),char(18),char(3),char(34), +char(0),char(63),char(63),char(43),char(17),char(0),char(51),char(24),char(63),char(43), +char(17),char(0),char(51),char(24),char(63),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(51), +char(17),char(35),char(17),char(33),char(17),char(33),char(53),char(33),char(21),char(33), +char(17),char(33),char(17),char(51),char(5),char(254),char(170),char(162),char(251),char(180), +char(254),char(86),char(4),char(47),char(254),char(37),char(2),char(240),char(170),char(154), +char(253),char(233),char(1),char(125),char(5),char(29),char(153),char(153),char(251),char(125), +char(5),char(28),char(0),char(1),char(0),char(41),char(254),char(135),char(5),char(152), +char(4),char(70),char(0),char(15),char(0),char(63),char(64),char(34),char(2),char(11), +char(6),char(3),char(9),char(8),char(8),char(3),char(0),char(11),char(13),char(5), +char(16),char(17),char(1),char(13),char(14),char(13),char(70),char(89),char(14),char(15), +char(6),char(2),char(11),char(2),char(70),char(89),char(11),char(21),char(9),char(34), +char(4),char(15),char(0),char(63),char(63),char(63),char(43),char(17),char(0),char(51), +char(24),char(63),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(33),char(17),char(33),char(17),char(51),char(17),char(51),char(17),char(35),char(17), +char(33),char(17),char(33),char(53),char(33),char(3),char(121),char(254),char(151),char(2), +char(70),char(166),char(156),char(166),char(252),char(120),char(254),char(191),char(3),char(80), +char(3),char(186),char(252),char(213),char(3),char(183),char(252),char(73),char(253),char(248), +char(1),char(121),char(3),char(186),char(140),char(0),char(0),char(1),char(0),char(170), +char(254),char(131),char(5),char(104),char(5),char(182),char(0),char(23),char(0),char(59), +char(64),char(31),char(21),char(0),char(5),char(3),char(2),char(15),char(12),char(2), +char(5),char(12),char(3),char(24),char(25),char(18),char(9),char(73),char(89),char(18), +char(18),char(5),char(22),char(13),char(3),char(5),char(0),char(73),char(89),char(5), +char(18),char(3),char(34),char(0),char(63),char(63),char(43),char(0),char(24),char(63), +char(51),char(18),char(57),char(47),char(43),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(51),char(49),char(48),char(37), +char(51),char(17),char(35),char(17),char(35),char(17),char(6),char(6),char(35),char(34), +char(38),char(53),char(17),char(51),char(17),char(20),char(22),char(51),char(50),char(54), +char(55),char(17),char(51),char(4),char(199),char(161),char(161),char(170),char(149),char(198), +char(106),char(207),char(223),char(170),char(127),char(143),char(97),char(177),char(169),char(170), +char(154),char(253),char(233),char(1),char(125),char(2),char(92),char(53),char(39),char(190), +char(179),char(2),char(69),char(253),char(207),char(121),char(116),char(29),char(55),char(2), +char(202),char(0),char(0),char(1),char(0),char(156),char(254),char(133),char(4),char(195), +char(4),char(72),char(0),char(22),char(0),char(59),char(64),char(31),char(1),char(21), +char(9),char(6),char(14),char(12),char(11),char(11),char(14),char(21),char(3),char(23), +char(24),char(3),char(18),char(70),char(89),char(3),char(3),char(14),char(7),char(22), +char(15),char(14),char(9),char(70),char(89),char(14),char(21),char(12),char(34),char(0), +char(63),char(63),char(43),char(0),char(24),char(63),char(51),char(18),char(57),char(47), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(20),char(51),char(50), +char(54),char(55),char(17),char(51),char(17),char(51),char(17),char(35),char(17),char(35), +char(17),char(6),char(6),char(35),char(34),char(38),char(53),char(17),char(1),char(66), +char(219),char(91),char(166),char(105),char(166),char(150),char(166),char(150),char(105),char(179), +char(113),char(164),char(186),char(4),char(72),char(254),char(112),char(192),char(56),char(67), +char(1),char(213),char(252),char(71),char(253),char(246),char(1),char(123),char(1),char(240), +char(72),char(59),char(172),char(147),char(1),char(156),char(0),char(1),char(0),char(170), +char(0),char(0),char(4),char(199),char(5),char(182),char(0),char(22),char(0),char(74), +char(64),char(38),char(5),char(2),char(11),char(21),char(21),char(8),char(22),char(13), +char(17),char(17),char(16),char(16),char(22),char(2),char(3),char(23),char(24),char(20), +char(0),char(8),char(0),char(73),char(89),char(11),char(8),char(22),char(8),char(9), +char(9),char(8),char(22),char(3),char(3),char(17),char(18),char(14),char(3),char(3), +char(0),char(63),char(51),char(63),char(18),char(23),char(57),char(47),char(47),char(47), +char(17),char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(32),char(17),char(17),char(51),char(17), +char(20),char(22),char(51),char(17),char(51),char(17),char(54),char(55),char(17),char(51), +char(17),char(35),char(17),char(6),char(7),char(17),char(35),char(2),char(117),char(254), +char(53),char(170),char(135),char(154),char(125),char(134),char(163),char(172),char(172),char(168), +char(129),char(125),char(2),char(0),char(1),char(113),char(2),char(69),char(253),char(207), +char(119),char(118),char(1),char(92),char(254),char(170),char(13),char(60),char(2),char(207), +char(250),char(74),char(2),char(88),char(65),char(17),char(254),char(207),char(0),char(1), +char(0),char(156),char(0),char(0),char(4),char(29),char(4),char(72),char(0),char(23), +char(0),char(74),char(64),char(38),char(1),char(22),char(6),char(16),char(16),char(3), +char(17),char(8),char(12),char(12),char(11),char(11),char(17),char(22),char(3),char(24), +char(25),char(15),char(19),char(3),char(19),char(70),char(89),char(6),char(3),char(17), +char(3),char(4),char(4),char(3),char(17),char(3),char(12),char(9),char(23),char(15), +char(12),char(21),char(0),char(63),char(63),char(51),char(18),char(23),char(57),char(47), +char(47),char(47),char(17),char(51),char(43),char(17),char(0),char(51),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(20),char(23), +char(17),char(51),char(17),char(54),char(55),char(17),char(51),char(17),char(35),char(17), +char(6),char(7),char(21),char(35),char(53),char(35),char(34),char(38),char(53),char(17), +char(1),char(66),char(200),char(119),char(113),char(133),char(166),char(166),char(128),char(118), +char(119),char(22),char(160),char(184),char(4),char(72),char(254),char(112),char(186),char(6), +char(1),char(45),char(254),char(221),char(24),char(89),char(1),char(213),char(251),char(184), +char(1),char(240),char(91),char(26),char(248),char(234),char(170),char(149),char(1),char(156), +char(0),char(1),char(0),char(201),char(0),char(0),char(4),char(229),char(5),char(182), +char(0),char(18),char(0),char(47),char(64),char(23),char(2),char(17),char(17),char(18), +char(9),char(8),char(8),char(18),char(20),char(19),char(4),char(13),char(73),char(89), +char(2),char(18),char(4),char(4),char(9),char(18),char(18),char(0),char(3),char(0), +char(63),char(63),char(51),char(57),char(47),char(18),char(57),char(43),char(17),char(18), +char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(19),char(51),char(17),char(36),char(51),char(50),char(22),char(21),char(17), +char(35),char(17),char(52),char(38),char(35),char(34),char(6),char(7),char(17),char(35), +char(201),char(170),char(1),char(0),char(196),char(207),char(223),char(170),char(127),char(143), +char(107),char(186),char(149),char(170),char(5),char(182),char(253),char(164),char(92),char(191), +char(177),char(253),char(186),char(2),char(49),char(120),char(118),char(34),char(50),char(253), +char(53),char(0),char(0),char(1),char(0),char(176),char(0),char(0),char(4),char(66), +char(4),char(72),char(0),char(18),char(0),char(47),char(64),char(23),char(0),char(18), +char(11),char(7),char(7),char(8),char(18),char(8),char(20),char(19),char(14),char(3), +char(70),char(89),char(11),char(14),char(14),char(8),char(9),char(15),char(0),char(8), +char(21),char(0),char(63),char(51),char(63),char(18),char(57),char(47),char(57),char(43), +char(17),char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(33),char(17),char(52),char(35),char(34),char(6),char(7), +char(17),char(35),char(17),char(51),char(17),char(54),char(54),char(51),char(50),char(22), +char(21),char(17),char(3),char(154),char(217),char(88),char(156),char(119),char(166),char(166), +char(95),char(186),char(114),char(163),char(190),char(1),char(141),char(193),char(49),char(74), +char(254),char(45),char(4),char(72),char(254),char(14),char(69),char(62),char(168),char(151), +char(254),char(102),char(0),char(2),char(0),char(61),char(255),char(236),char(6),char(63), +char(5),char(205),char(0),char(32),char(0),char(39),char(0),char(81),char(64),char(42), +char(5),char(3),char(0),char(36),char(17),char(17),char(8),char(30),char(37),char(16), +char(16),char(24),char(30),char(0),char(4),char(40),char(41),char(17),char(30),char(7), +char(30),char(73),char(89),char(36),char(7),char(2),char(7),char(2),char(27),char(12), +char(27),char(20),char(73),char(89),char(27),char(19),char(12),char(33),char(73),char(89), +char(12),char(4),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(0),char(57),char(57),char(24),char(47),char(47),char(51),char(43),char(17), +char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(51),char(17),char(51),char(17),char(51),char(51),char(49),char(48),char(19), +char(52),char(55),char(51),char(6),char(21),char(20),char(51),char(51),char(55),char(18), +char(0),char(33),char(32),char(0),char(17),char(21),char(33),char(18),char(0),char(51), +char(50),char(54),char(55),char(21),char(6),char(6),char(35),char(32),char(0),char(3), +char(34),char(38),char(1),char(34),char(2),char(7),char(33),char(16),char(38),char(61), +char(27),char(145),char(20),char(113),char(34),char(5),char(29),char(1),char(77),char(1), +char(23),char(1),char(41),char(1),char(40),char(251),char(220),char(14),char(1),char(5), +char(247),char(101),char(202),char(141),char(114),char(221),char(130),char(254),char(198),char(254), +char(163),char(19),char(142),char(155),char(3),char(175),char(209),char(240),char(16),char(3), +char(110),char(203),char(3),char(135),char(73),char(54),char(50),char(60),char(103),char(43), +char(1),char(42),char(1),char(71),char(254),char(133),char(254),char(143),char(69),char(254), +char(248),char(254),char(239),char(31),char(43),char(156),char(39),char(30),char(1),char(100), +char(1),char(76),char(118),char(2),char(35),char(254),char(245),char(249),char(1),char(9), +char(251),char(0),char(0),char(2),char(0),char(51),char(255),char(236),char(4),char(221), +char(4),char(90),char(0),char(31),char(0),char(38),char(0),char(76),char(64),char(40), +char(10),char(8),char(5),char(22),char(13),char(36),char(21),char(21),char(29),char(13), +char(3),char(5),char(5),char(39),char(40),char(22),char(3),char(12),char(3),char(70), +char(89),char(35),char(12),char(7),char(12),char(7),char(0),char(17),char(17),char(32), +char(70),char(89),char(17),char(16),char(0),char(25),char(70),char(89),char(0),char(22), +char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0), +char(57),char(57),char(24),char(47),char(47),char(51),char(43),char(17),char(0),char(51), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(51),char(49),char(48),char(5),char(34),char(0),char(39),char(36),char(53), +char(52),char(55),char(51),char(6),char(21),char(20),char(51),char(51),char(55),char(54), +char(54),char(51),char(50),char(18),char(21),char(21),char(33),char(22),char(22),char(51), +char(50),char(54),char(55),char(21),char(6),char(6),char(3),char(34),char(6),char(7), +char(33),char(52),char(38),char(3),char(74),char(243),char(254),char(236),char(6),char(254), +char(246),char(25),char(141),char(20),char(106),char(21),char(6),char(34),char(250),char(183), +char(207),char(241),char(253),char(12),char(6),char(172),char(173),char(101),char(159),char(98), +char(88),char(157),char(160),char(134),char(151),char(14),char(2),char(61),char(140),char(20), +char(1),char(30),char(252),char(4),char(221),char(69),char(50),char(47),char(59),char(103), +char(35),char(202),char(224),char(254),char(247),char(226),char(105),char(198),char(195),char(32), +char(42),char(148),char(38),char(33),char(3),char(227),char(164),char(158),char(157),char(165), +char(0),char(2),char(0),char(61),char(254),char(131),char(6),char(63),char(5),char(205), +char(0),char(34),char(0),char(41),char(0),char(93),char(64),char(49),char(11),char(9), +char(6),char(38),char(23),char(23),char(14),char(3),char(33),char(34),char(39),char(22), +char(22),char(30),char(34),char(3),char(6),char(5),char(42),char(43),char(34),char(34), +char(32),char(19),char(23),char(3),char(13),char(3),char(73),char(89),char(38),char(13), +char(8),char(13),char(8),char(0),char(18),char(18),char(35),char(73),char(89),char(18), +char(4),char(0),char(26),char(74),char(89),char(0),char(19),char(0),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(57),char(24), +char(47),char(47),char(51),char(43),char(17),char(0),char(51),char(24),char(63),char(63), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(51),char(17),char(51),char(17),char(51),char(51),char(49),char(48),char(5), +char(36),char(0),char(3),char(34),char(38),char(53),char(52),char(55),char(51),char(6), +char(21),char(20),char(51),char(51),char(55),char(18),char(0),char(33),char(32),char(0), +char(17),char(21),char(33),char(18),char(0),char(51),char(50),char(54),char(55),char(21), +char(6),char(7),char(17),char(35),char(19),char(34),char(2),char(7),char(33),char(16), +char(38),char(3),char(160),char(254),char(254),char(254),char(219),char(19),char(142),char(155), +char(27),char(145),char(20),char(113),char(34),char(5),char(29),char(1),char(77),char(1), +char(23),char(1),char(41),char(1),char(40),char(251),char(220),char(14),char(1),char(5), +char(247),char(101),char(202),char(141),char(176),char(235),char(166),char(76),char(209),char(240), +char(16),char(3),char(110),char(203),char(12),char(29),char(1),char(90),char(1),char(49), +char(118),char(117),char(73),char(54),char(50),char(60),char(103),char(43),char(1),char(42), +char(1),char(71),char(254),char(133),char(254),char(143),char(69),char(254),char(248),char(254), +char(239),char(31),char(43),char(156),char(62),char(5),char(254),char(149),char(6),char(178), +char(254),char(245),char(249),char(1),char(9),char(251),char(0),char(2),char(0),char(51), +char(254),char(135),char(4),char(221),char(4),char(90),char(0),char(33),char(0),char(40), +char(0),char(88),char(64),char(47),char(10),char(8),char(5),char(22),char(13),char(32), +char(33),char(38),char(21),char(21),char(29),char(33),char(13),char(3),char(5),char(6), +char(41),char(42),char(33),char(34),char(31),char(22),char(22),char(3),char(12),char(3), +char(70),char(89),char(37),char(12),char(7),char(12),char(7),char(0),char(17),char(17), +char(34),char(70),char(89),char(17),char(16),char(0),char(25),char(70),char(89),char(0), +char(21),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18), +char(0),char(57),char(57),char(24),char(47),char(47),char(51),char(43),char(17),char(0), +char(51),char(24),char(63),char(63),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(51),char(49),char(48), +char(5),char(38),char(2),char(39),char(36),char(53),char(52),char(55),char(51),char(6), +char(21),char(20),char(51),char(51),char(55),char(54),char(54),char(51),char(50),char(18), +char(21),char(21),char(33),char(22),char(22),char(51),char(50),char(54),char(55),char(21), +char(6),char(7),char(17),char(35),char(19),char(34),char(6),char(7),char(33),char(52), +char(38),char(2),char(213),char(191),char(211),char(6),char(254),char(246),char(25),char(141), +char(20),char(106),char(21),char(6),char(34),char(250),char(183),char(207),char(241),char(253), +char(12),char(6),char(172),char(173),char(101),char(159),char(98),char(142),char(165),char(166), +char(68),char(134),char(151),char(14),char(2),char(61),char(140),char(10),char(31),char(1), +char(17),char(224),char(4),char(221),char(69),char(50),char(47),char(59),char(103),char(35), +char(202),char(224),char(254),char(247),char(226),char(105),char(198),char(195),char(32),char(42), +char(148),char(65),char(4),char(254),char(153),char(5),char(72),char(164),char(158),char(157), +char(165),char(0),char(255),char(255),char(0),char(84),char(0),char(0),char(2),char(86), +char(5),char(182),char(2),char(6),char(0),char(44),char(0),char(0),char(255),char(255), +char(0),char(2),char(0),char(0),char(6),char(188),char(7),char(96),char(2),char(38), +char(1),char(176),char(0),char(0),char(1),char(7),char(2),char(54),char(1),char(16), +char(1),char(84),char(0),char(8),char(179),char(1),char(18),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(4),char(0),char(0),char(5),char(223), +char(6),char(12),char(2),char(38),char(1),char(208),char(0),char(0),char(1),char(7), +char(2),char(54),char(0),char(164),char(0),char(0),char(0),char(8),char(179),char(1), +char(18),char(17),char(38),char(0),char(43),char(53),char(0),char(1),char(0),char(201), +char(254),char(0),char(5),char(25),char(5),char(182),char(0),char(28),char(0),char(66), +char(64),char(37),char(7),char(3),char(3),char(4),char(26),char(14),char(14),char(9), +char(10),char(20),char(4),char(5),char(29),char(30),char(17),char(23),char(73),char(89), +char(17),char(28),char(7),char(2),char(73),char(89),char(11),char(0),char(74),char(89), +char(7),char(11),char(11),char(4),char(8),char(5),char(3),char(4),char(18),char(0), +char(63),char(63),char(51),char(18),char(57),char(47),char(57),char(43),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(34),char(7),char(17), +char(35),char(17),char(51),char(17),char(1),char(51),char(1),char(55),char(32),char(0), +char(17),char(16),char(0),char(33),char(34),char(38),char(39),char(53),char(22),char(51), +char(50),char(18),char(53),char(52),char(36),char(2),char(94),char(140),char(95),char(170), +char(170),char(2),char(137),char(205),char(253),char(133),char(26),char(1),char(79),char(1), +char(98),char(254),char(217),char(254),char(245),char(82),char(124),char(70),char(122),char(152), +char(187),char(200),char(254),char(235),char(2),char(123),char(31),char(253),char(164),char(5), +char(182),char(253),char(60),char(2),char(196),char(253),char(84),char(2),char(254),char(187), +char(254),char(207),char(254),char(198),char(254),char(164),char(20),char(29),char(152),char(49), +char(1),char(13),char(241),char(232),char(253),char(0),char(0),char(1),char(0),char(176), +char(254),char(10),char(4),char(33),char(4),char(72),char(0),char(28),char(0),char(66), +char(64),char(37),char(4),char(0),char(0),char(1),char(23),char(10),char(16),char(10), +char(6),char(7),char(1),char(5),char(29),char(30),char(14),char(20),char(70),char(89), +char(14),char(27),char(4),char(28),char(71),char(89),char(7),char(26),char(70),char(89), +char(4),char(7),char(7),char(1),char(5),char(2),char(15),char(1),char(21),char(0), +char(63),char(63),char(51),char(18),char(57),char(47),char(57),char(43),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(33),char(35),char(17),char(51), +char(17),char(1),char(51),char(1),char(4),char(18),char(17),char(20),char(6),char(6), +char(35),char(34),char(39),char(53),char(22),char(22),char(51),char(50),char(54),char(53), +char(52),char(38),char(35),char(34),char(7),char(1),char(84),char(164),char(164),char(1), +char(227),char(183),char(254),char(55),char(1),char(0),char(252),char(110),char(204),char(133), +char(136),char(95),char(46),char(108),char(71),char(135),char(152),char(187),char(190),char(82), +char(92),char(4),char(72),char(253),char(250),char(2),char(6),char(254),char(30),char(4), +char(254),char(228),char(254),char(245),char(177),char(252),char(132),char(60),char(145),char(25), +char(38),char(217),char(200),char(211),char(207),char(24),char(0),char(1),char(0),char(0), +char(254),char(131),char(5),char(145),char(5),char(182),char(0),char(23),char(0),char(57), +char(64),char(31),char(3),char(0),char(5),char(4),char(1),char(1),char(5),char(14), +char(3),char(24),char(25),char(22),char(7),char(73),char(89),char(22),char(3),char(12), +char(17),char(74),char(89),char(12),char(18),char(5),char(0),char(73),char(89),char(5), +char(18),char(3),char(34),char(0),char(63),char(63),char(43),char(0),char(24),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(51),char(49),char(48),char(37),char(51),char(3), +char(35),char(19),char(35),char(17),char(33),char(7),char(2),char(2),char(6),char(39), +char(34),char(39),char(53),char(22),char(51),char(50),char(54),char(54),char(18),char(19), +char(33),char(4),char(217),char(184),char(143),char(197),char(156),char(170),char(254),char(37), +char(31),char(61),char(93),char(152),char(126),char(74),char(59),char(54),char(59),char(53), +char(79),char(61),char(93),char(56),char(3),char(18),char(154),char(253),char(233),char(1), +char(125),char(5),char(31),char(240),char(254),char(33),char(254),char(69),char(174),char(2), +char(25),char(143),char(26),char(87),char(215),char(2),char(89),char(1),char(184),char(0), +char(0),char(1),char(0),char(16),char(254),char(135),char(4),char(143),char(4),char(70), +char(0),char(20),char(0),char(57),char(64),char(31),char(3),char(0),char(5),char(4), +char(1),char(1),char(5),char(13),char(3),char(21),char(22),char(19),char(7),char(70), +char(89),char(19),char(15),char(11),char(16),char(71),char(89),char(11),char(21),char(5), +char(0),char(70),char(89),char(5),char(21),char(3),char(34),char(0),char(63),char(63), +char(43),char(0),char(24),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(49), +char(48),char(37),char(51),char(3),char(35),char(19),char(35),char(17),char(33),char(2), +char(2),char(6),char(35),char(34),char(39),char(53),char(22),char(51),char(50),char(18), +char(19),char(33),char(3),char(223),char(176),char(129),char(172),char(125),char(166),char(254), +char(181),char(28),char(94),char(152),char(118),char(58),char(28),char(22),char(28),char(113), +char(137),char(34),char(2),char(129),char(143),char(253),char(248),char(1),char(121),char(3), +char(184),char(254),char(152),char(254),char(100),char(192),char(10),char(127),char(6),char(1), +char(217),char(1),char(246),char(0),char(0),char(1),char(0),char(201),char(254),char(0), +char(5),char(31),char(5),char(182),char(0),char(21),char(0),char(61),char(64),char(32), +char(18),char(14),char(14),char(15),char(19),char(11),char(11),char(0),char(0),char(6), +char(15),char(3),char(22),char(23),char(18),char(13),char(73),char(89),char(18),char(18), +char(15),char(20),char(16),char(3),char(15),char(18),char(3),char(9),char(73),char(89), +char(3),char(28),char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(51), +char(18),char(57),char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(37), +char(16),char(0),char(33),char(34),char(38),char(39),char(53),char(22),char(51),char(32), +char(17),char(17),char(33),char(17),char(35),char(17),char(51),char(17),char(33),char(17), +char(51),char(5),char(31),char(254),char(230),char(254),char(251),char(82),char(122),char(77), +char(123),char(135),char(1),char(140),char(252),char(254),char(170),char(170),char(3),char(2), +char(170),char(150),char(254),char(194),char(254),char(168),char(19),char(30),char(150),char(49), +char(1),char(247),char(2),char(35),char(253),char(80),char(5),char(182),char(253),char(146), +char(2),char(110),char(0),char(1),char(0),char(176),char(254),char(10),char(4),char(98), +char(4),char(72),char(0),char(21),char(0),char(71),char(64),char(39),char(15),char(11), +char(11),char(12),char(16),char(8),char(8),char(19),char(19),char(2),char(12),char(3), +char(22),char(23),char(15),char(10),char(70),char(89),char(15),char(15),char(31),char(15), +char(2),char(11),char(3),char(15),char(15),char(12),char(17),char(13),char(15),char(12), +char(21),char(0),char(5),char(70),char(89),char(0),char(27),char(0),char(63),char(43), +char(0),char(24),char(63),char(63),char(51),char(18),char(57),char(47),char(95),char(94), +char(93),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(34),char(39), +char(53),char(22),char(51),char(50),char(54),char(53),char(17),char(33),char(17),char(35), +char(17),char(51),char(17),char(33),char(17),char(51),char(17),char(16),char(2),char(2), +char(211),char(132),char(93),char(111),char(102),char(125),char(118),char(253),char(156),char(166), +char(166),char(2),char(100),char(168),char(207),char(254),char(10),char(58),char(149),char(61), +char(198),char(207),char(1),char(189),char(254),char(18),char(4),char(72),char(254),char(53), +char(1),char(203),char(251),char(235),char(254),char(244),char(254),char(227),char(0),char(1), +char(0),char(201),char(254),char(131),char(5),char(215),char(5),char(182),char(0),char(15), +char(0),char(68),char(64),char(36),char(12),char(8),char(8),char(9),char(13),char(3), +char(0),char(5),char(4),char(1),char(1),char(5),char(9),char(3),char(16),char(17), +char(12),char(7),char(73),char(89),char(12),char(12),char(5),char(14),char(10),char(3), +char(9),char(18),char(5),char(0),char(73),char(89),char(5),char(18),char(3),char(34), +char(0),char(63),char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(18), +char(57),char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(51),char(51),char(17),char(51),char(17),char(51),char(49),char(48), +char(37),char(51),char(3),char(35),char(19),char(35),char(17),char(33),char(17),char(35), +char(17),char(51),char(17),char(33),char(17),char(51),char(5),char(31),char(184),char(145), +char(197),char(158),char(170),char(252),char(254),char(170),char(170),char(3),char(2),char(170), +char(154),char(253),char(233),char(1),char(125),char(2),char(176),char(253),char(80),char(5), +char(182),char(253),char(146),char(2),char(110),char(0),char(0),char(1),char(0),char(176), +char(254),char(135),char(5),char(18),char(4),char(70),char(0),char(15),char(0),char(68), +char(64),char(36),char(1),char(13),char(13),char(14),char(8),char(5),char(2),char(10), +char(9),char(6),char(6),char(10),char(14),char(3),char(16),char(17),char(1),char(12), +char(70),char(89),char(1),char(1),char(10),char(3),char(15),char(15),char(14),char(21), +char(10),char(5),char(70),char(89),char(10),char(21),char(8),char(34),char(0),char(63), +char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(18),char(57),char(47), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(51),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17), +char(33),char(17),char(51),char(17),char(51),char(3),char(35),char(19),char(35),char(17), +char(33),char(17),char(35),char(17),char(1),char(86),char(2),char(102),char(166),char(176), +char(129),char(172),char(125),char(166),char(253),char(154),char(166),char(4),char(70),char(254), +char(55),char(1),char(201),char(252),char(73),char(253),char(248),char(1),char(121),char(1), +char(238),char(254),char(18),char(4),char(70),char(0),char(0),char(1),char(0),char(170), +char(254),char(131),char(4),char(199),char(5),char(182),char(0),char(23),char(0),char(61), +char(64),char(32),char(15),char(12),char(2),char(3),char(21),char(5),char(5),char(0), +char(0),char(3),char(12),char(3),char(24),char(25),char(18),char(9),char(73),char(89), +char(18),char(18),char(1),char(22),char(13),char(3),char(3),char(34),char(1),char(4), +char(73),char(89),char(1),char(18),char(0),char(63),char(43),char(0),char(24),char(63), +char(63),char(51),char(18),char(57),char(47),char(43),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(33),char(35),char(17),char(35),char(17),char(51),char(17),char(6),char(6), +char(35),char(34),char(38),char(53),char(17),char(51),char(17),char(20),char(22),char(51), +char(50),char(54),char(55),char(17),char(51),char(4),char(199),char(170),char(162),char(162), +char(149),char(198),char(106),char(207),char(223),char(170),char(127),char(143),char(97),char(177), +char(169),char(170),char(254),char(131),char(2),char(23),char(1),char(194),char(53),char(39), +char(190),char(179),char(2),char(69),char(253),char(207),char(121),char(116),char(29),char(55), +char(2),char(202),char(0),char(1),char(0),char(156),char(254),char(133),char(4),char(45), +char(4),char(72),char(0),char(22),char(0),char(61),char(64),char(32),char(1),char(21), +char(11),char(12),char(6),char(14),char(14),char(9),char(9),char(12),char(21),char(3), +char(23),char(24),char(3),char(18),char(70),char(89),char(3),char(3),char(10),char(7), +char(22),char(15),char(12),char(34),char(10),char(13),char(70),char(89),char(10),char(21), +char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(51),char(18),char(57), +char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(17),char(20), +char(51),char(50),char(54),char(55),char(17),char(51),char(17),char(35),char(17),char(35), +char(17),char(51),char(17),char(6),char(6),char(35),char(34),char(38),char(53),char(17), +char(1),char(66),char(219),char(91),char(166),char(105),char(166),char(149),char(166),char(149), +char(105),char(179),char(113),char(164),char(186),char(4),char(72),char(254),char(112),char(192), +char(56),char(67),char(1),char(213),char(251),char(184),char(254),char(133),char(2),char(10), +char(1),char(97),char(72),char(59),char(172),char(147),char(1),char(156),char(0),char(1), +char(0),char(201),char(254),char(131),char(7),char(41),char(5),char(182),char(0),char(24), +char(0),char(72),char(64),char(37),char(9),char(6),char(6),char(7),char(17),char(14), +char(12),char(19),char(18),char(15),char(15),char(19),char(7),char(3),char(25),char(26), +char(23),char(22),char(2),char(11),char(2),char(19),char(8),char(19),char(14),char(73), +char(89),char(19),char(18),char(17),char(34),char(12),char(8),char(3),char(0),char(7), +char(18),char(0),char(63),char(51),char(63),char(51),char(63),char(63),char(43),char(17), +char(18),char(0),char(57),char(57),char(17),char(51),char(51),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(51),char(51),char(17),char(51), +char(17),char(51),char(49),char(48),char(33),char(1),char(35),char(23),char(22),char(21), +char(17),char(35),char(17),char(33),char(1),char(51),char(1),char(51),char(17),char(51), +char(3),char(35),char(19),char(35),char(17),char(52),char(55),char(35),char(1),char(3), +char(80),char(254),char(16),char(8),char(7),char(7),char(157),char(1),char(0),char(1), +char(209),char(8),char(1),char(209),char(254),char(184),char(143),char(199),char(158),char(170), +char(14),char(8),char(254),char(12),char(5),char(16),char(127),char(192),char(47),char(252), +char(94),char(5),char(182),char(251),char(74),char(4),char(182),char(250),char(228),char(253), +char(233),char(1),char(125),char(3),char(174),char(132),char(220),char(250),char(242),char(0), +char(0),char(1),char(0),char(176),char(254),char(135),char(5),char(223),char(4),char(70), +char(0),char(24),char(0),char(63),char(64),char(32),char(19),char(20),char(8),char(5), +char(10),char(9),char(6),char(6),char(10),char(20),char(3),char(25),char(26),char(11), +char(18),char(0),char(18),char(15),char(3),char(21),char(15),char(20),char(21),char(10), +char(5),char(70),char(89),char(10),char(15),char(21),char(8),char(34),char(0),char(63), +char(63),char(51),char(43),char(0),char(24),char(63),char(63),char(51),char(18),char(57), +char(57),char(17),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(37),char(55),char(55), +char(1),char(51),char(17),char(51),char(3),char(35),char(19),char(35),char(17),char(7), +char(7),char(1),char(35),char(1),char(38),char(39),char(17),char(35),char(17),char(51), +char(1),char(22),char(2),char(233),char(31),char(43),char(1),char(41),char(211),char(176), +char(129),char(172),char(125),char(147),char(20),char(58),char(254),char(229),char(139),char(254), +char(229),char(53),char(20),char(148),char(203),char(1),char(41),char(45),char(160),char(93), +char(118),char(2),char(211),char(252),char(73),char(253),char(248),char(1),char(121),char(3), +char(137),char(58),char(153),char(253),char(74),char(2),char(184),char(134),char(75),char(252), +char(119),char(4),char(70),char(253),char(45),char(110),char(255),char(255),char(0),char(84), +char(0),char(0),char(2),char(86),char(5),char(182),char(2),char(6),char(0),char(44), +char(0),char(0),char(255),char(255),char(0),char(0),char(0),char(0),char(5),char(16), +char(7),char(94),char(2),char(38),char(0),char(36),char(0),char(0),char(1),char(7), +char(2),char(54),char(0),char(57),char(1),char(82),char(0),char(8),char(179),char(2), +char(15),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(94), +char(255),char(236),char(3),char(205),char(6),char(12),char(2),char(38),char(0),char(68), +char(0),char(0),char(1),char(6),char(2),char(54),char(232),char(0),char(0),char(8), +char(179),char(2),char(37),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(5),char(16),char(7),char(37),char(2),char(38), +char(0),char(36),char(0),char(0),char(1),char(7),char(0),char(106),char(0),char(61), +char(1),char(82),char(0),char(10),char(180),char(3),char(2),char(36),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(94),char(255),char(236), +char(3),char(205),char(5),char(211),char(2),char(38),char(0),char(68),char(0),char(0), +char(1),char(6),char(0),char(106),char(243),char(0),char(0),char(10),char(180),char(3), +char(2),char(58),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(255),char(254),char(0),char(0),char(6),char(129),char(5),char(182),char(2),char(6), +char(0),char(136),char(0),char(0),char(255),char(255),char(0),char(94),char(255),char(236), +char(6),char(115),char(4),char(92),char(2),char(6),char(0),char(168),char(0),char(0), +char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248),char(7),char(94), +char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7),char(2),char(54), +char(0),char(16),char(1),char(82),char(0),char(8),char(179),char(1),char(12),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(18),char(6),char(12),char(2),char(38),char(0),char(72),char(0),char(0), +char(1),char(6),char(2),char(54),char(12),char(0),char(0),char(8),char(179),char(2), +char(27),char(17),char(38),char(0),char(43),char(53),char(0),char(2),char(0),char(117), +char(255),char(236),char(5),char(88),char(5),char(205),char(0),char(18),char(0),char(25), +char(0),char(61),char(64),char(32),char(23),char(14),char(16),char(22),char(22),char(9), +char(9),char(2),char(14),char(3),char(26),char(27),char(15),char(23),char(73),char(89), +char(15),char(15),char(12),char(6),char(12),char(19),char(73),char(89),char(12),char(19), +char(6),char(0),char(73),char(89),char(6),char(4),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(1),char(34),char(7),char(53),char(54),char(54),char(51), +char(32),char(0),char(17),char(16),char(0),char(33),char(32),char(17),char(53),char(33), +char(2),char(0),char(3),char(50),char(18),char(55),char(33),char(16),char(22),char(2), +char(152),char(227),char(226),char(115),char(210),char(134),char(1),char(75),char(1),char(111), +char(254),char(166),char(254),char(203),char(253),char(172),char(4),char(47),char(17),char(254), +char(249),char(195),char(210),char(249),char(16),char(252),char(135),char(204),char(5),char(53), +char(76),char(158),char(38),char(32),char(254),char(113),char(254),char(155),char(254),char(162), +char(254),char(113),char(2),char(235),char(70),char(1),char(10),char(1),char(14),char(251), +char(78),char(1),char(13),char(247),char(254),char(248),char(252),char(0),char(0),char(2), +char(0),char(102),char(255),char(236),char(4),char(6),char(4),char(92),char(0),char(20), +char(0),char(27),char(0),char(59),char(64),char(31),char(25),char(9),char(24),char(11), +char(3),char(3),char(17),char(9),char(3),char(28),char(29),char(10),char(25),char(70), +char(89),char(10),char(10),char(6),char(0),char(6),char(21),char(70),char(89),char(6), +char(22),char(0),char(14),char(70),char(89),char(0),char(16),char(0),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(17), +char(51),char(49),char(48),char(1),char(50),char(0),char(17),char(16),char(0),char(35), +char(34),char(2),char(53),char(53),char(33),char(38),char(38),char(35),char(34),char(6), +char(7),char(53),char(54),char(54),char(19),char(50),char(54),char(55),char(33),char(20), +char(22),char(1),char(250),char(245),char(1),char(23),char(254),char(253),char(218),char(208), +char(243),char(2),char(244),char(5),char(179),char(166),char(98),char(165),char(95),char(89), +char(162),char(154),char(133),char(154),char(12),char(253),char(195),char(141),char(4),char(92), +char(254),char(212),char(254),char(251),char(254),char(248),char(254),char(201),char(1),char(12), +char(225),char(105),char(204),char(187),char(33),char(41),char(147),char(40),char(34),char(252), +char(27),char(165),char(156),char(157),char(164),char(0),char(255),char(255),char(0),char(117), +char(255),char(236),char(5),char(88),char(7),char(37),char(2),char(38),char(2),char(225), +char(0),char(0),char(1),char(7),char(0),char(106),char(0),char(147),char(1),char(82), +char(0),char(10),char(180),char(3),char(2),char(47),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(102),char(255),char(236),char(4),char(6), +char(5),char(211),char(2),char(38),char(2),char(226),char(0),char(0),char(1),char(6), +char(0),char(106),char(234),char(0),char(0),char(10),char(180),char(3),char(2),char(49), +char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(2), +char(0),char(0),char(6),char(188),char(7),char(37),char(2),char(38),char(1),char(176), +char(0),char(0),char(1),char(7),char(0),char(106),char(1),char(16),char(1),char(82), +char(0),char(10),char(180),char(2),char(1),char(39),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(4),char(0),char(0),char(5),char(223), +char(5),char(211),char(2),char(38),char(1),char(208),char(0),char(0),char(1),char(7), +char(0),char(106),char(0),char(162),char(0),char(0),char(0),char(10),char(180),char(2), +char(1),char(39),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(74),char(255),char(236),char(4),char(53),char(7),char(37),char(2),char(38), +char(1),char(177),char(0),char(0),char(1),char(7),char(0),char(106),char(255),char(243), +char(1),char(82),char(0),char(10),char(180),char(2),char(1),char(62),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(68),char(255),char(236), +char(3),char(127),char(5),char(211),char(2),char(38),char(1),char(209),char(0),char(0), +char(1),char(6),char(0),char(106),char(148),char(0),char(0),char(10),char(180),char(2), +char(1),char(56),char(17),char(38),char(0),char(43),char(53),char(53),char(0),char(1), +char(0),char(74),char(255),char(236),char(4),char(55),char(5),char(182),char(0),char(25), +char(0),char(64),char(64),char(35),char(0),char(19),char(21),char(25),char(15),char(3), +char(3),char(25),char(19),char(22),char(8),char(5),char(26),char(27),char(25),char(22), +char(23),char(22),char(73),char(89),char(0),char(18),char(74),char(89),char(0),char(0), +char(6),char(23),char(3),char(6),char(12),char(74),char(89),char(6),char(19),char(0), +char(63),char(43),char(0),char(24),char(63),char(18),char(57),char(47),char(43),char(43), +char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(4),char(4),char(21), +char(20),char(4),char(33),char(32),char(39),char(53),char(22),char(22),char(51),char(50), +char(54),char(53),char(52),char(38),char(35),char(35),char(53),char(1),char(33),char(53), +char(33),char(21),char(1),char(252),char(1),char(23),char(1),char(36),char(254),char(205), +char(254),char(234),char(254),char(255),char(163),char(96),char(222),char(106),char(199),char(202), +char(225),char(223),char(140),char(1),char(238),char(253),char(78),char(3),char(135),char(3), +char(63),char(9),char(211),char(193),char(206),char(232),char(79),char(158),char(46),char(50), +char(153),char(144),char(134),char(138),char(141),char(1),char(222),char(153),char(139),char(0), +char(0),char(1),char(0),char(27),char(254),char(20),char(3),char(166),char(4),char(72), +char(0),char(25),char(0),char(64),char(64),char(35),char(0),char(19),char(21),char(25), +char(15),char(4),char(4),char(25),char(19),char(22),char(9),char(5),char(26),char(27), +char(25),char(22),char(23),char(22),char(70),char(89),char(0),char(18),char(71),char(89), +char(0),char(0),char(7),char(23),char(15),char(7),char(12),char(70),char(89),char(7), +char(27),char(0),char(63),char(43),char(0),char(24),char(63),char(18),char(57),char(47), +char(43),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(30), +char(2),char(21),char(20),char(0),char(35),char(34),char(39),char(53),char(22),char(51), +char(50),char(54),char(53),char(52),char(38),char(35),char(35),char(53),char(1),char(33), +char(53),char(33),char(21),char(1),char(172),char(149),char(230),char(127),char(254),char(216), +char(239),char(234),char(138),char(183),char(200),char(161),char(197),char(214),char(202),char(121), +char(1),char(197),char(253),char(137),char(3),char(56),char(1),char(207),char(7),char(114), +char(202),char(136),char(222),char(254),char(238),char(70),char(154),char(86),char(190),char(160), +char(164),char(170),char(114),char(1),char(254),char(142),char(123),char(0),char(255),char(255), +char(0),char(203),char(0),char(0),char(5),char(82),char(6),char(180),char(2),char(38), +char(1),char(178),char(0),char(0),char(1),char(7),char(1),char(77),char(0),char(180), +char(1),char(82),char(0),char(8),char(179),char(1),char(19),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(176),char(0),char(0),char(4),char(98), +char(5),char(98),char(2),char(38),char(1),char(210),char(0),char(0),char(1),char(6), +char(1),char(77),char(49),char(0),char(0),char(8),char(179),char(1),char(17),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(203),char(0),char(0), +char(5),char(82),char(7),char(37),char(2),char(38),char(1),char(178),char(0),char(0), +char(1),char(7),char(0),char(106),char(0),char(190),char(1),char(82),char(0),char(10), +char(180),char(2),char(1),char(37),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(176),char(0),char(0),char(4),char(98),char(5),char(211), +char(2),char(38),char(1),char(210),char(0),char(0),char(1),char(6),char(0),char(106), +char(61),char(0),char(0),char(10),char(180),char(2),char(1),char(35),char(17),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(125),char(255),char(236), +char(5),char(190),char(7),char(37),char(2),char(38),char(0),char(50),char(0),char(0), +char(1),char(7),char(0),char(106),char(0),char(209),char(1),char(82),char(0),char(10), +char(180),char(3),char(2),char(45),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98),char(5),char(211), +char(2),char(38),char(0),char(82),char(0),char(0),char(1),char(6),char(0),char(106), +char(29),char(0),char(0),char(10),char(180),char(3),char(2),char(46),char(17),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(125),char(255),char(236), +char(5),char(190),char(5),char(205),char(2),char(6),char(2),char(126),char(0),char(0), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98),char(4),char(92), +char(2),char(6),char(2),char(127),char(0),char(0),char(255),char(255),char(0),char(125), +char(255),char(236),char(5),char(190),char(7),char(37),char(2),char(38),char(2),char(126), +char(0),char(0),char(1),char(7),char(0),char(106),char(0),char(209),char(1),char(82), +char(0),char(10),char(180),char(4),char(3),char(47),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98), +char(5),char(211),char(2),char(38),char(2),char(127),char(0),char(0),char(1),char(6), +char(0),char(106),char(27),char(0),char(0),char(10),char(180),char(4),char(3),char(48), +char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(61), +char(255),char(236),char(4),char(137),char(7),char(37),char(2),char(38),char(1),char(199), +char(0),char(0),char(1),char(7),char(0),char(106),char(255),char(237),char(1),char(82), +char(0),char(10),char(180),char(2),char(1),char(48),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(57),char(255),char(236),char(3),char(125), +char(5),char(211),char(2),char(38),char(1),char(231),char(0),char(0),char(1),char(6), +char(0),char(106),char(142),char(0),char(0),char(10),char(180),char(2),char(1),char(48), +char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(27), +char(255),char(236),char(4),char(248),char(6),char(180),char(2),char(38),char(1),char(189), +char(0),char(0),char(1),char(7),char(1),char(77),char(0),char(47),char(1),char(82), +char(0),char(8),char(179),char(1),char(26),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(2),char(254),char(20),char(4),char(6),char(5),char(98), +char(2),char(38),char(0),char(92),char(0),char(0),char(1),char(6),char(1),char(77), +char(173),char(0),char(0),char(8),char(179),char(1),char(25),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(27),char(255),char(236),char(4),char(248), +char(7),char(37),char(2),char(38),char(1),char(189),char(0),char(0),char(1),char(7), +char(0),char(106),char(0),char(59),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(44),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(2),char(254),char(20),char(4),char(6),char(5),char(211),char(2),char(38), +char(0),char(92),char(0),char(0),char(1),char(6),char(0),char(106),char(183),char(0), +char(0),char(10),char(180),char(2),char(1),char(43),char(17),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(27),char(255),char(236),char(4),char(248), +char(7),char(115),char(2),char(38),char(1),char(189),char(0),char(0),char(1),char(7), +char(1),char(83),char(0),char(141),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(42),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(2),char(254),char(20),char(4),char(6),char(6),char(33),char(2),char(38), +char(0),char(92),char(0),char(0),char(1),char(6),char(1),char(83),char(4),char(0), +char(0),char(10),char(180),char(2),char(1),char(41),char(17),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(170),char(0),char(0),char(4),char(199), +char(7),char(37),char(2),char(38),char(1),char(193),char(0),char(0),char(1),char(7), +char(0),char(106),char(0),char(106),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(41),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(156),char(0),char(0),char(4),char(45),char(5),char(211),char(2),char(38), +char(1),char(225),char(0),char(0),char(1),char(6),char(0),char(106),char(23),char(0), +char(0),char(10),char(180),char(2),char(1),char(40),char(17),char(38),char(0),char(43), +char(53),char(53),char(0),char(1),char(0),char(201),char(254),char(131),char(4),char(8), +char(5),char(182),char(0),char(9),char(0),char(45),char(64),char(24),char(4),char(9), +char(6),char(7),char(1),char(7),char(9),char(3),char(10),char(11),char(9),char(4), +char(73),char(89),char(9),char(18),char(7),char(34),char(0),char(3),char(73),char(89), +char(0),char(3),char(0),char(63),char(43),char(0),char(24),char(63),char(63),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49), +char(48),char(19),char(33),char(21),char(33),char(17),char(51),char(17),char(35),char(17), +char(35),char(201),char(3),char(63),char(253),char(107),char(161),char(161),char(170),char(5), +char(182),char(153),char(251),char(125),char(253),char(233),char(1),char(125),char(0),char(1), +char(0),char(176),char(254),char(135),char(3),char(66),char(4),char(70),char(0),char(9), +char(0),char(45),char(64),char(24),char(4),char(9),char(6),char(7),char(1),char(7), +char(9),char(3),char(10),char(11),char(9),char(4),char(70),char(89),char(9),char(21), +char(7),char(34),char(0),char(3),char(70),char(89),char(0),char(15),char(0),char(63), +char(43),char(0),char(24),char(63),char(63),char(43),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(19),char(33),char(21), +char(33),char(17),char(51),char(17),char(35),char(17),char(35),char(176),char(2),char(146), +char(254),char(20),char(150),char(166),char(150),char(4),char(70),char(140),char(252),char(213), +char(253),char(248),char(1),char(121),char(255),char(255),char(0),char(201),char(0),char(0), +char(6),char(10),char(7),char(37),char(2),char(38),char(1),char(197),char(0),char(0), +char(1),char(7),char(0),char(106),char(1),char(27),char(1),char(82),char(0),char(10), +char(180),char(4),char(3),char(45),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(176),char(0),char(0),char(5),char(121),char(5),char(211), +char(2),char(38),char(1),char(229),char(0),char(0),char(1),char(7),char(0),char(106), +char(0),char(197),char(0),char(0),char(0),char(10),char(180),char(4),char(3),char(44), +char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(47), +char(254),char(117),char(4),char(8),char(5),char(182),char(2),char(38),char(2),char(155), +char(0),char(0),char(0),char(7),char(3),char(128),char(0),char(147),char(0),char(0), +char(255),char(255),char(0),char(18),char(254),char(117),char(3),char(66),char(4),char(72), +char(2),char(38),char(2),char(156),char(0),char(0),char(0),char(6),char(3),char(129), +char(117),char(0),char(255),char(255),char(0),char(8),char(254),char(117),char(4),char(201), +char(5),char(182),char(0),char(38),char(0),char(59),char(0),char(0),char(0),char(7), +char(3),char(128),char(3),char(88),char(0),char(0),char(255),char(255),char(0),char(39), +char(254),char(117),char(4),char(52),char(4),char(72),char(0),char(38),char(0),char(91), +char(0),char(0),char(0),char(7),char(3),char(129),char(2),char(195),char(0),char(0), +char(0),char(1),char(0),char(6),char(0),char(0),char(4),char(150),char(5),char(182), +char(0),char(17),char(0),char(59),char(64),char(34),char(15),char(2),char(17),char(1), +char(16),char(13),char(4),char(10),char(7),char(9),char(6),char(11),char(12),char(19), +char(18),char(10),char(17),char(0),char(17),char(73),char(89),char(7),char(13),char(15), +char(4),char(0),char(0),char(2),char(12),char(15),char(18),char(5),char(2),char(3), +char(0),char(63),char(51),char(63),char(51),char(18),char(57),char(47),char(57),char(18), +char(57),char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(49),char(48),char(19),char(33),char(1),char(51),char(1),char(1),char(51), +char(1),char(33),char(21),char(33),char(1),char(35),char(1),char(1),char(35),char(1), +char(33),char(127),char(1),char(51),char(254),char(119),char(188),char(1),char(107),char(1), +char(108),char(183),char(254),char(112),char(1),char(60),char(254),char(186),char(1),char(189), +char(193),char(254),char(119),char(254),char(112),char(182),char(1),char(191),char(254),char(186), +char(3),char(84),char(2),char(98),char(253),char(187),char(2),char(69),char(253),char(158), +char(152),char(253),char(68),char(2),char(131),char(253),char(125),char(2),char(188),char(0), +char(0),char(1),char(0),char(39),char(0),char(0),char(4),char(8),char(4),char(72), +char(0),char(17),char(0),char(59),char(64),char(34),char(15),char(2),char(17),char(1), +char(16),char(13),char(4),char(10),char(7),char(9),char(6),char(11),char(12),char(19), +char(18),char(10),char(17),char(0),char(17),char(71),char(89),char(7),char(13),char(15), +char(4),char(0),char(0),char(2),char(12),char(15),char(21),char(5),char(2),char(15), +char(0),char(63),char(51),char(63),char(51),char(18),char(57),char(47),char(57),char(18), +char(57),char(51),char(43),char(17),char(0),char(51),char(17),char(18),char(1),char(23), +char(57),char(49),char(48),char(19),char(33),char(1),char(51),char(1),char(1),char(51), +char(1),char(33),char(21),char(33),char(1),char(35),char(1),char(1),char(35),char(1), +char(33),char(117),char(1),char(18),char(254),char(180),char(189),char(1),char(33),char(1), +char(32),char(187),char(254),char(178),char(1),char(24),char(254),char(226),char(1),char(104), +char(188),char(254),char(205),char(254),char(202),char(188),char(1),char(102),char(254),char(232), +char(2),char(119),char(1),char(209),char(254),char(92),char(1),char(164),char(254),char(47), +char(129),char(254),char(10),char(1),char(188),char(254),char(68),char(1),char(246),char(0), +char(0),char(2),char(0),char(131),char(0),char(0),char(4),char(55),char(5),char(182), +char(0),char(10),char(0),char(19),char(0),char(52),char(64),char(26),char(4),char(19), +char(19),char(7),char(15),char(0),char(7),char(0),char(21),char(20),char(3),char(12), +char(73),char(89),char(3),char(3),char(8),char(5),char(8),char(18),char(74),char(89), +char(8),char(18),char(5),char(3),char(0),char(63),char(63),char(43),char(17),char(18), +char(0),char(57),char(24),char(47),char(43),char(17),char(18),char(1),char(57),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(19),char(52), +char(36),char(33),char(51),char(17),char(51),char(17),char(33),char(32),char(36),char(1), +char(35),char(34),char(6),char(21),char(20),char(22),char(51),char(51),char(131),char(1), +char(36),char(1),char(32),char(198),char(170),char(254),char(99),char(254),char(245),char(254), +char(244),char(3),char(10),char(186),char(222),char(194),char(182),char(203),char(217),char(1), +char(164),char(212),char(206),char(2),char(112),char(250),char(74),char(213),char(1),char(219), +char(124),char(142),char(143),char(132),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(55),char(6),char(20),char(2),char(6),char(0),char(71),char(0),char(0), +char(0),char(2),char(0),char(131),char(255),char(236),char(6),char(119),char(5),char(182), +char(0),char(25),char(0),char(35),char(0),char(70),char(64),char(36),char(30),char(3), +char(24),char(10),char(10),char(7),char(35),char(15),char(18),char(18),char(35),char(3), +char(3),char(36),char(37),char(6),char(27),char(73),char(89),char(24),char(6),char(16), +char(6),char(16),char(0),char(8),char(3),char(12),char(32),char(0),char(32),char(74), +char(89),char(21),char(0),char(19),char(0),char(63),char(50),char(43),char(17),char(0), +char(51),char(24),char(63),char(18),char(57),char(57),char(47),char(47),char(57),char(43), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51), +char(18),char(57),char(17),char(51),char(49),char(48),char(5),char(34),char(38),char(53), +char(52),char(36),char(33),char(51),char(17),char(51),char(17),char(20),char(51),char(50), +char(54),char(53),char(17),char(51),char(17),char(20),char(6),char(35),char(34),char(38), +char(39),char(6),char(19),char(35),char(34),char(6),char(21),char(16),char(33),char(50), +char(54),char(53),char(2),char(78),char(226),char(233),char(1),char(42),char(1),char(34), +char(145),char(170),char(230),char(100),char(121),char(170),char(207),char(184),char(118),char(159), +char(51),char(113),char(41),char(151),char(212),char(194),char(1),char(33),char(127),char(141), +char(18),char(209),char(208),char(217),char(222),char(2),char(112),char(251),char(183),char(236), +char(123),char(110),char(1),char(230),char(254),char(24),char(174),char(206),char(82),char(90), +char(170),char(2),char(192),char(139),char(150),char(254),char(244),char(119),char(112),char(0), +char(0),char(2),char(0),char(115),char(255),char(236),char(6),char(135),char(6),char(20), +char(0),char(34),char(0),char(46),char(0),char(81),char(64),char(41),char(44),char(19), +char(12),char(32),char(32),char(29),char(26),char(38),char(3),char(6),char(6),char(38), +char(19),char(3),char(47),char(48),char(30),char(0),char(13),char(16),char(26),char(22), +char(4),char(4),char(16),char(22),char(22),char(42),char(70),char(89),char(22),char(16), +char(0),char(35),char(16),char(35),char(70),char(89),char(9),char(16),char(22),char(0), +char(63),char(51),char(43),char(17),char(0),char(51),char(24),char(63),char(43),char(17), +char(18),char(0),char(57),char(24),char(47),char(18),char(57),char(18),char(57),char(63), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(51), +char(51),char(18),char(57),char(17),char(51),char(49),char(48),char(37),char(50),char(54), +char(53),char(17),char(51),char(17),char(20),char(6),char(35),char(34),char(38),char(39), +char(35),char(6),char(6),char(35),char(34),char(2),char(17),char(16),char(18),char(51), +char(50),char(22),char(23),char(51),char(38),char(38),char(53),char(17),char(51),char(17), +char(20),char(22),char(33),char(50),char(54),char(53),char(53),char(52),char(38),char(35), +char(32),char(17),char(20),char(22),char(4),char(254),char(118),char(107),char(168),char(200), +char(189),char(129),char(158),char(43),char(8),char(75),char(185),char(129),char(208),char(232), +char(231),char(207),char(106),char(159),char(63),char(12),char(2),char(8),char(166),char(109), +char(253),char(185),char(162),char(146),char(148),char(162),char(254),char(226),char(139),char(119), +char(132),char(136),char(1),char(57),char(254),char(189),char(200),char(197),char(91),char(113), +char(113),char(91),char(1),char(41),char(1),char(12),char(1),char(12),char(1),char(47), +char(77),char(85),char(17),char(112),char(27),char(1),char(190),char(251),char(140),char(160), +char(137),char(185),char(206),char(35),char(231),char(201),char(254),char(78),char(214),char(210), +char(0),char(1),char(0),char(78),char(255),char(236),char(6),char(129),char(5),char(203), +char(0),char(42),char(0),char(75),char(64),char(40),char(6),char(19),char(40),char(25), +char(31),char(34),char(34),char(22),char(25),char(19),char(1),char(13),char(6),char(43), +char(44),char(23),char(2),char(1),char(2),char(1),char(74),char(89),char(2),char(32), +char(2),char(32),char(37),char(16),char(37),char(28),char(73),char(89),char(37),char(19), +char(16),char(9),char(74),char(89),char(16),char(4),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(57),char(24),char(47), +char(47),char(43),char(17),char(18),char(0),char(57),char(17),char(18),char(1),char(23), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1), +char(35),char(53),char(51),char(50),char(54),char(53),char(52),char(38),char(35),char(34), +char(6),char(7),char(39),char(54),char(54),char(51),char(50),char(22),char(21),char(20), +char(6),char(7),char(21),char(4),char(19),char(22),char(22),char(51),char(50),char(54), +char(53),char(17),char(51),char(17),char(20),char(6),char(35),char(34),char(38),char(39), +char(38),char(38),char(1),char(174),char(201),char(193),char(192),char(213),char(154),char(128), +char(103),char(177),char(103),char(84),char(93),char(246),char(130),char(214),char(245),char(178), +char(156),char(1),char(98),char(6),char(2),char(108),char(124),char(119),char(112),char(168), +char(210),char(189),char(202),char(208),char(2),char(2),char(205),char(2),char(172),char(143), +char(147),char(132),char(108),char(127),char(55),char(69),char(114),char(72),char(80),char(196), +char(167),char(141),char(183),char(26),char(8),char(51),char(254),char(209),char(150),char(127), +char(121),char(135),char(1),char(205),char(254),char(41),char(198),char(199),char(209),char(200), +char(150),char(145),char(0),char(1),char(0),char(80),char(255),char(236),char(5),char(197), +char(4),char(92),char(0),char(37),char(0),char(75),char(64),char(40),char(18),char(30), +char(10),char(36),char(2),char(5),char(5),char(36),char(30),char(32),char(14),char(24), +char(6),char(38),char(39),char(33),char(15),char(14),char(15),char(14),char(70),char(89), +char(15),char(3),char(15),char(3),char(8),char(27),char(27),char(20),char(70),char(89), +char(27),char(16),char(8),char(0),char(70),char(89),char(8),char(22),char(0),char(63), +char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(57), +char(24),char(47),char(47),char(43),char(17),char(18),char(0),char(57),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(49), +char(48),char(37),char(50),char(17),char(17),char(51),char(17),char(20),char(6),char(35), +char(32),char(3),char(38),char(38),char(35),char(35),char(53),char(51),char(32),char(53), +char(52),char(35),char(34),char(6),char(7),char(39),char(54),char(54),char(51),char(50), +char(22),char(21),char(20),char(7),char(21),char(22),char(22),char(23),char(22),char(4), +char(66),char(221),char(166),char(187),char(196),char(254),char(134),char(16),char(5),char(141), +char(148),char(140),char(111),char(1),char(33),char(242),char(75),char(135),char(77),char(57), +char(85),char(163),char(104),char(184),char(211),char(192),char(99),char(123),char(5),char(9), +char(119),char(1),char(12),char(1),char(57),char(254),char(189),char(202),char(195),char(1), +char(77),char(99),char(88),char(141),char(172),char(162),char(36),char(34),char(135),char(40), +char(36),char(155),char(134),char(184),char(57),char(8),char(20),char(122),char(106),char(211), +char(0),char(1),char(0),char(78),char(254),char(131),char(4),char(209),char(5),char(203), +char(0),char(35),char(0),char(74),char(64),char(40),char(25),char(26),char(30),char(35), +char(33),char(32),char(32),char(22),char(26),char(35),char(4),char(16),char(6),char(36), +char(37),char(26),char(5),char(4),char(5),char(4),char(74),char(89),char(5),char(5), +char(35),char(19),char(35),char(30),char(73),char(89),char(35),char(18),char(33),char(34), +char(19),char(12),char(74),char(89),char(19),char(4),char(0),char(63),char(43),char(0), +char(24),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(0),char(57),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(52), +char(38),char(35),char(35),char(53),char(51),char(50),char(54),char(53),char(52),char(38), +char(35),char(34),char(6),char(7),char(39),char(54),char(54),char(51),char(50),char(22), +char(21),char(20),char(6),char(7),char(21),char(22),char(22),char(21),char(17),char(51), +char(17),char(35),char(17),char(35),char(3),char(131),char(229),char(226),char(217),char(209), +char(205),char(225),char(164),char(135),char(105),char(195),char(105),char(84),char(97),char(254), +char(132),char(220),char(253),char(189),char(163),char(184),char(195),char(172),char(162),char(172), +char(1),char(156),char(133),char(139),char(143),char(147),char(132),char(107),char(128),char(58), +char(66),char(114),char(74),char(78),char(196),char(167),char(140),char(183),char(25),char(8), +char(25),char(179),char(148),char(254),char(254),char(253),char(233),char(1),char(125),char(0), +char(0),char(1),char(0),char(80),char(254),char(135),char(4),char(16),char(4),char(90), +char(0),char(30),char(0),char(74),char(64),char(40),char(7),char(18),char(25),char(30), +char(28),char(27),char(27),char(21),char(30),char(18),char(3),char(13),char(6),char(32), +char(31),char(21),char(4),char(3),char(4),char(3),char(70),char(89),char(4),char(4), +char(30),char(15),char(30),char(25),char(70),char(89),char(30),char(21),char(28),char(34), +char(15),char(10),char(70),char(89),char(15),char(16),char(0),char(63),char(43),char(0), +char(24),char(63),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(0),char(57),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(52), +char(33),char(35),char(53),char(51),char(32),char(53),char(52),char(38),char(35),char(34), +char(7),char(39),char(54),char(51),char(50),char(22),char(21),char(20),char(7),char(21), +char(22),char(22),char(21),char(21),char(51),char(17),char(35),char(17),char(35),char(2), +char(213),char(254),char(203),char(150),char(117),char(1),char(57),char(133),char(119),char(153), +char(150),char(61),char(161),char(203),char(191),char(213),char(203),char(126),char(112),char(157), +char(166),char(149),char(1),char(45),char(199),char(141),char(172),char(82),char(80),char(70), +char(135),char(74),char(154),char(135),char(182),char(57),char(11),char(37),char(137),char(102), +char(156),char(253),char(248),char(1),char(121),char(0),char(0),char(1),char(0),char(0), +char(255),char(233),char(7),char(33),char(5),char(182),char(0),char(35),char(0),char(58), +char(64),char(29),char(20),char(35),char(26),char(29),char(29),char(35),char(9),char(3), +char(36),char(37),char(27),char(27),char(7),char(18),char(18),char(1),char(73),char(89), +char(18),char(3),char(23),char(12),char(7),char(12),char(74),char(89),char(32),char(7), +char(19),char(0),char(63),char(51),char(43),char(17),char(0),char(51),char(24),char(63), +char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(17),char(18),char(1), +char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(33), +char(7),char(2),char(2),char(6),char(6),char(35),char(34),char(39),char(53),char(22), +char(51),char(50),char(54),char(54),char(18),char(18),char(19),char(33),char(17),char(20), +char(22),char(51),char(50),char(54),char(53),char(17),char(51),char(17),char(20),char(6), +char(35),char(34),char(38),char(53),char(4),char(12),char(254),char(72),char(31),char(43), +char(76),char(83),char(130),char(100),char(69),char(64),char(50),char(63),char(49),char(64), +char(44),char(56),char(74),char(55),char(2),char(239),char(111),char(115),char(112),char(113), +char(168),char(205),char(188),char(196),char(200),char(5),char(31),char(240),char(254),char(174), +char(254),char(68),char(210),char(102),char(25),char(143),char(26),char(62),char(104),char(1), +char(2),char(1),char(233),char(1),char(174),char(251),char(207),char(137),char(121),char(121), +char(135),char(1),char(205),char(254),char(41),char(193),char(204),char(204),char(197),char(0), +char(0),char(1),char(0),char(16),char(255),char(236),char(6),char(41),char(4),char(70), +char(0),char(29),char(0),char(58),char(64),char(29),char(0),char(14),char(5),char(8), +char(8),char(14),char(22),char(3),char(31),char(30),char(6),char(6),char(20),char(28), +char(28),char(16),char(70),char(89),char(28),char(15),char(3),char(25),char(20),char(25), +char(71),char(89),char(11),char(20),char(22),char(0),char(63),char(51),char(43),char(17), +char(0),char(51),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24), +char(47),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(20),char(22),char(51),char(50),char(17),char(17),char(51), +char(17),char(20),char(6),char(35),char(34),char(38),char(53),char(17),char(33),char(2), +char(2),char(6),char(35),char(34),char(39),char(53),char(22),char(51),char(50),char(18), +char(19),char(33),char(3),char(207),char(104),char(119),char(213),char(166),char(187),char(190), +char(188),char(203),char(254),char(197),char(28),char(94),char(152),char(118),char(58),char(28), +char(22),char(28),char(113),char(137),char(34),char(2),char(113),char(1),char(131),char(137), +char(131),char(1),char(10),char(1),char(59),char(254),char(189),char(202),char(195),char(196), +char(203),char(2),char(61),char(254),char(152),char(254),char(100),char(192),char(10),char(127), +char(6),char(1),char(217),char(1),char(246),char(0),char(0),char(1),char(0),char(201), +char(255),char(236),char(7),char(94),char(5),char(182),char(0),char(25),char(0),char(67), +char(64),char(35),char(23),char(0),char(15),char(6),char(9),char(22),char(18),char(18), +char(19),char(9),char(15),char(19),char(3),char(26),char(27),char(22),char(17),char(73), +char(89),char(22),char(7),char(22),char(7),char(19),char(24),char(20),char(3),char(19), +char(18),char(12),char(3),char(73),char(89),char(12),char(19),char(0),char(63),char(43), +char(0),char(24),char(63),char(63),char(51),char(18),char(57),char(57),char(47),char(47), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(51),char(49),char(48),char(1),char(20),char(22), +char(51),char(50),char(54),char(53),char(17),char(51),char(17),char(20),char(6),char(35), +char(34),char(38),char(53),char(17),char(33),char(17),char(35),char(17),char(51),char(17), +char(33),char(17),char(51),char(4),char(246),char(110),char(115),char(112),char(113),char(166), +char(200),char(191),char(195),char(200),char(253),char(39),char(170),char(170),char(2),char(217), +char(170),char(1),char(133),char(137),char(121),char(121),char(135),char(1),char(205),char(254), +char(41),char(191),char(206),char(203),char(198),char(1),char(51),char(253),char(80),char(5), +char(182),char(253),char(146),char(2),char(110),char(0),char(0),char(1),char(0),char(176), +char(255),char(236),char(6),char(168),char(4),char(72),char(0),char(24),char(0),char(77), +char(64),char(42),char(5),char(2),char(19),char(10),char(13),char(1),char(22),char(22), +char(23),char(13),char(19),char(23),char(3),char(25),char(26),char(1),char(21),char(70), +char(89),char(15),char(1),char(31),char(1),char(2),char(11),char(3),char(1),char(11), +char(1),char(11),char(23),char(3),char(24),char(15),char(23),char(21),char(16),char(8), +char(70),char(89),char(16),char(22),char(0),char(63),char(43),char(0),char(24),char(63), +char(63),char(51),char(18),char(57),char(57),char(47),char(47),char(95),char(94),char(93), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(51),char(49),char(48),char(1),char(17),char(33), +char(17),char(51),char(17),char(20),char(22),char(51),char(50),char(17),char(17),char(51), +char(17),char(20),char(6),char(35),char(34),char(38),char(53),char(53),char(33),char(17), +char(35),char(17),char(1),char(86),char(2),char(80),char(166),char(106),char(119),char(213), +char(166),char(187),char(192),char(186),char(205),char(253),char(176),char(166),char(4),char(72), +char(254),char(53),char(1),char(203),char(253),char(61),char(137),char(133),char(1),char(12), +char(1),char(57),char(254),char(189),char(202),char(195),char(198),char(201),char(115),char(254), +char(18),char(4),char(72),char(0),char(0),char(1),char(0),char(125),char(255),char(236), +char(5),char(154),char(5),char(203),char(0),char(28),char(0),char(58),char(64),char(31), +char(22),char(8),char(27),char(2),char(2),char(15),char(28),char(8),char(4),char(29), +char(30),char(0),char(28),char(73),char(89),char(0),char(0),char(5),char(12),char(12), +char(19),char(73),char(89),char(12),char(4),char(5),char(25),char(73),char(89),char(5), +char(19),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18), +char(0),char(57),char(24),char(47),char(43),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(33),char(21),char(16), +char(0),char(33),char(32),char(0),char(17),char(52),char(18),char(36),char(51),char(50), +char(22),char(23),char(7),char(38),char(38),char(35),char(32),char(0),char(17),char(16), +char(0),char(51),char(32),char(17),char(33),char(3),char(102),char(2),char(52),char(254), +char(204),char(254),char(201),char(254),char(187),char(254),char(147),char(179),char(1),char(85), +char(234),char(120),char(237),char(83),char(66),char(90),char(214),char(87),char(254),char(245), +char(254),char(222),char(1),char(11),char(247),char(1),char(180),char(254),char(127),char(2), +char(240),char(86),char(254),char(161),char(254),char(177),char(1),char(145),char(1),char(96), +char(229),char(1),char(84),char(181),char(49),char(39),char(148),char(38),char(46),char(254), +char(197),char(254),char(227),char(254),char(227),char(254),char(195),char(1),char(215),char(0), +char(0),char(1),char(0),char(115),char(255),char(236),char(4),char(176),char(4),char(92), +char(0),char(25),char(0),char(58),char(64),char(31),char(18),char(7),char(24),char(2), +char(2),char(12),char(25),char(7),char(4),char(26),char(27),char(0),char(25),char(70), +char(89),char(0),char(0),char(4),char(10),char(10),char(15),char(70),char(89),char(10), +char(16),char(4),char(21),char(70),char(89),char(4),char(22),char(0),char(63),char(43), +char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(33),char(21),char(16),char(33),char(32),char(0),char(17), +char(16),char(0),char(33),char(50),char(23),char(7),char(38),char(35),char(34),char(6), +char(21),char(20),char(22),char(51),char(50),char(54),char(53),char(33),char(2),char(178), +char(1),char(254),char(253),char(254),char(254),char(238),char(254),char(215),char(1),char(67), +char(1),char(33),char(212),char(175),char(59),char(168),char(166),char(205),char(229),char(204), +char(197),char(169),char(175),char(254),char(170),char(2),char(63),char(67),char(253),char(240), +char(1),char(39),char(1),char(16),char(1),char(14),char(1),char(43),char(80),char(131), +char(74),char(222),char(210),char(207),char(223),char(160),char(157),char(0),char(0),char(1), +char(0),char(16),char(255),char(236),char(4),char(244),char(5),char(182),char(0),char(20), +char(0),char(57),char(64),char(29),char(5),char(19),char(10),char(13),char(13),char(3), +char(19),char(0),char(4),char(21),char(22),char(11),char(11),char(16),char(1),char(16), +char(8),char(73),char(89),char(16),char(19),char(4),char(0),char(1),char(0),char(73), +char(89),char(1),char(3),char(0),char(63),char(43),char(17),char(0),char(51),char(24), +char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(17),char(18), +char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(19), +char(53),char(33),char(21),char(33),char(17),char(20),char(22),char(51),char(50),char(17), +char(17),char(51),char(17),char(20),char(6),char(35),char(34),char(38),char(53),char(17), +char(16),char(4),char(60),char(254),char(47),char(119),char(114),char(232),char(168),char(211), +char(189),char(198),char(205),char(5),char(29),char(153),char(153),char(252),char(104),char(137), +char(123),char(1),char(0),char(1),char(207),char(254),char(41),char(192),char(205),char(206), +char(195),char(3),char(160),char(0),char(0),char(1),char(0),char(41),char(255),char(236), +char(4),char(135),char(4),char(70),char(0),char(20),char(0),char(54),char(64),char(28), +char(2),char(16),char(7),char(10),char(10),char(0),char(16),char(18),char(4),char(21), +char(22),char(1),char(18),char(19),char(18),char(70),char(89),char(8),char(8),char(13), +char(19),char(15),char(13),char(5),char(70),char(89),char(13),char(22),char(0),char(63), +char(43),char(0),char(24),char(63),char(18),char(57),char(47),char(43),char(17),char(0), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(49),char(48),char(1),char(33),char(17),char(20),char(22),char(51),char(50),char(17), +char(17),char(51),char(17),char(20),char(6),char(35),char(34),char(38),char(53),char(17), +char(33),char(53),char(33),char(3),char(129),char(254),char(166),char(109),char(118),char(215), +char(166),char(189),char(192),char(192),char(201),char(254),char(168),char(3),char(88),char(3), +char(186),char(253),char(201),char(137),char(131),char(1),char(4),char(1),char(65),char(254), +char(189),char(202),char(195),char(203),char(196),char(2),char(63),char(140),char(0),char(1), +char(0),char(111),char(255),char(236),char(4),char(88),char(5),char(203),char(0),char(38), +char(0),char(71),char(64),char(38),char(21),char(32),char(12),char(0),char(36),char(35), +char(5),char(27),char(17),char(35),char(0),char(32),char(6),char(39),char(40),char(35), +char(15),char(18),char(15),char(18),char(74),char(89),char(15),char(15),char(29),char(3), +char(29),char(24),char(74),char(89),char(29),char(19),char(3),char(9),char(74),char(89), +char(3),char(4),char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17), +char(18),char(0),char(57),char(24),char(47),char(43),char(17),char(18),char(0),char(57), +char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51),char(17), +char(51),char(49),char(48),char(19),char(52),char(36),char(51),char(32),char(23),char(7), +char(38),char(38),char(35),char(34),char(6),char(21),char(20),char(22),char(51),char(51), +char(21),char(35),char(34),char(6),char(21),char(20),char(22),char(51),char(50),char(55), +char(21),char(6),char(33),char(32),char(36),char(53),char(52),char(54),char(55),char(53), +char(38),char(38),char(156),char(1),char(8),char(225),char(1),char(2),char(209),char(94), +char(105),char(181),char(101),char(140),char(159),char(209),char(200),char(217),char(213),char(222), +char(232),char(202),char(183),char(233),char(199),char(175),char(254),char(251),char(254),char(244), +char(254),char(219),char(207),char(188),char(170),char(180),char(4),char(92),char(169),char(198), +char(144),char(120),char(68),char(52),char(123),char(114),char(128),char(147),char(141),char(142), +char(138),char(142),char(141),char(92),char(158),char(77),char(220),char(197),char(151),char(192), +char(22),char(8),char(25),char(178),char(255),char(255),char(0),char(90),char(255),char(236), +char(3),char(135),char(4),char(92),char(2),char(6),char(1),char(130),char(0),char(0), +char(255),char(255),char(0),char(0),char(254),char(117),char(5),char(107),char(5),char(182), +char(0),char(38),char(1),char(181),char(0),char(0),char(0),char(7),char(3),char(128), +char(3),char(250),char(0),char(0),char(255),char(255),char(0),char(16),char(254),char(117), +char(4),char(115),char(4),char(72),char(2),char(38),char(1),char(213),char(0),char(0), +char(0),char(7),char(3),char(129),char(3),char(2),char(0),char(0),char(255),char(255), +char(0),char(0),char(254),char(160),char(5),char(16),char(5),char(188),char(2),char(38), +char(0),char(36),char(0),char(0),char(0),char(7),char(2),char(103),char(4),char(233), +char(0),char(0),char(255),char(255),char(0),char(94),char(254),char(160),char(3),char(205), +char(4),char(90),char(2),char(38),char(0),char(68),char(0),char(0),char(0),char(7), +char(2),char(103),char(4),char(121),char(0),char(0),char(255),char(255),char(0),char(0), +char(0),char(0),char(5),char(16),char(7),char(225),char(2),char(38),char(0),char(36), +char(0),char(0),char(1),char(7),char(2),char(102),char(4),char(252),char(1),char(82), +char(0),char(8),char(179),char(2),char(19),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(94),char(255),char(236),char(3),char(205),char(6),char(143), +char(2),char(38),char(0),char(68),char(0),char(0),char(1),char(7),char(2),char(102), +char(4),char(166),char(0),char(0),char(0),char(8),char(179),char(2),char(41),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(0),char(0),char(0), +char(5),char(16),char(7),char(209),char(2),char(38),char(0),char(36),char(0),char(0), +char(1),char(7),char(3),char(119),char(4),char(229),char(1),char(82),char(0),char(10), +char(180),char(3),char(2),char(21),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(94),char(255),char(236),char(4),char(65),char(6),char(127), +char(2),char(38),char(0),char(68),char(0),char(0),char(1),char(7),char(3),char(119), +char(4),char(147),char(0),char(0),char(0),char(10),char(180),char(3),char(2),char(43), +char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(0), +char(0),char(0),char(5),char(16),char(7),char(209),char(2),char(38),char(0),char(36), +char(0),char(0),char(1),char(7),char(3),char(120),char(4),char(221),char(1),char(82), +char(0),char(10),char(180),char(3),char(2),char(21),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(45),char(255),char(236),char(3),char(205), +char(6),char(127),char(2),char(38),char(0),char(68),char(0),char(0),char(1),char(7), +char(3),char(120),char(4),char(147),char(0),char(0),char(0),char(10),char(180),char(3), +char(2),char(43),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(5),char(16),char(8),char(74),char(2),char(38), +char(0),char(36),char(0),char(0),char(1),char(7),char(3),char(121),char(4),char(217), +char(1),char(82),char(0),char(10),char(180),char(3),char(2),char(21),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(94),char(255),char(236), +char(4),char(23),char(6),char(248),char(2),char(38),char(0),char(68),char(0),char(0), +char(1),char(7),char(3),char(121),char(4),char(156),char(0),char(0),char(0),char(10), +char(180),char(3),char(2),char(43),char(17),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(0),char(0),char(0),char(5),char(16),char(8),char(98), +char(2),char(38),char(0),char(36),char(0),char(0),char(1),char(7),char(3),char(122), +char(4),char(229),char(1),char(82),char(0),char(10),char(180),char(3),char(2),char(45), +char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(94), +char(255),char(236),char(3),char(205),char(7),char(16),char(2),char(38),char(0),char(68), +char(0),char(0),char(1),char(7),char(3),char(122),char(4),char(145),char(0),char(0), +char(0),char(10),char(180),char(3),char(2),char(67),char(17),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(0),char(254),char(160),char(5),char(16), +char(7),char(115),char(2),char(38),char(0),char(36),char(0),char(0),char(0),char(39), +char(2),char(103),char(4),char(233),char(0),char(0),char(1),char(7),char(1),char(75), +char(0),char(43),char(1),char(82),char(0),char(8),char(179),char(3),char(41),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(94),char(254),char(160), +char(3),char(205),char(6),char(33),char(2),char(38),char(0),char(68),char(0),char(0), +char(0),char(39),char(2),char(103),char(4),char(121),char(0),char(0),char(1),char(6), +char(1),char(75),char(212),char(0),char(0),char(8),char(179),char(3),char(62),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(0),char(0),char(0), +char(5),char(16),char(8),char(19),char(2),char(38),char(0),char(36),char(0),char(0), +char(1),char(7),char(3),char(123),char(4),char(236),char(1),char(82),char(0),char(10), +char(180),char(3),char(2),char(23),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(94),char(255),char(236),char(3),char(205),char(6),char(193), +char(2),char(38),char(0),char(68),char(0),char(0),char(1),char(7),char(3),char(123), +char(4),char(154),char(0),char(0),char(0),char(10),char(180),char(3),char(2),char(45), +char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(0), +char(0),char(0),char(5),char(16),char(8),char(19),char(2),char(38),char(0),char(36), +char(0),char(0),char(1),char(7),char(3),char(124),char(4),char(233),char(1),char(82), +char(0),char(10),char(180),char(3),char(2),char(23),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(94),char(255),char(236),char(3),char(205), +char(6),char(193),char(2),char(38),char(0),char(68),char(0),char(0),char(1),char(7), +char(3),char(124),char(4),char(152),char(0),char(0),char(0),char(10),char(180),char(3), +char(2),char(45),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(5),char(16),char(8),char(88),char(2),char(38), +char(0),char(36),char(0),char(0),char(1),char(7),char(3),char(125),char(4),char(233), +char(1),char(82),char(0),char(10),char(180),char(3),char(2),char(33),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(94),char(255),char(236), +char(3),char(205),char(7),char(6),char(2),char(38),char(0),char(68),char(0),char(0), +char(1),char(7),char(3),char(125),char(4),char(160),char(0),char(0),char(0),char(10), +char(180),char(3),char(2),char(55),char(17),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(0),char(0),char(0),char(5),char(16),char(8),char(94), +char(2),char(38),char(0),char(36),char(0),char(0),char(1),char(7),char(3),char(126), +char(4),char(227),char(1),char(82),char(0),char(10),char(180),char(3),char(2),char(39), +char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(94), +char(255),char(236),char(3),char(205),char(7),char(12),char(2),char(38),char(0),char(68), +char(0),char(0),char(1),char(7),char(3),char(126),char(4),char(152),char(0),char(0), +char(0),char(10),char(180),char(3),char(2),char(61),char(17),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(0),char(254),char(160),char(5),char(16), +char(7),char(73),char(2),char(38),char(0),char(36),char(0),char(0),char(0),char(39), +char(1),char(78),char(0),char(45),char(1),char(100),char(1),char(7),char(2),char(103), +char(4),char(233),char(0),char(0),char(0),char(8),char(179),char(2),char(15),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(94),char(254),char(160), +char(3),char(205),char(5),char(229),char(2),char(38),char(0),char(68),char(0),char(0), +char(0),char(38),char(1),char(78),char(216),char(0),char(1),char(7),char(2),char(103), +char(4),char(121),char(0),char(0),char(0),char(8),char(179),char(2),char(37),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201),char(254),char(160), +char(3),char(248),char(5),char(182),char(2),char(38),char(0),char(40),char(0),char(0), +char(0),char(7),char(2),char(103),char(4),char(193),char(0),char(0),char(255),char(255), +char(0),char(115),char(254),char(160),char(4),char(18),char(4),char(92),char(2),char(38), +char(0),char(72),char(0),char(0),char(0),char(7),char(2),char(103),char(4),char(184), +char(0),char(0),char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248), +char(7),char(225),char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7), +char(2),char(102),char(4),char(209),char(1),char(82),char(0),char(8),char(179),char(1), +char(16),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115), +char(255),char(236),char(4),char(18),char(6),char(143),char(2),char(38),char(0),char(72), +char(0),char(0),char(1),char(7),char(2),char(102),char(4),char(201),char(0),char(0), +char(0),char(8),char(179),char(2),char(31),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248),char(7),char(47), +char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7),char(1),char(82), +char(255),char(228),char(1),char(82),char(0),char(8),char(179),char(1),char(21),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(18),char(5),char(221),char(2),char(38),char(0),char(72),char(0),char(0), +char(1),char(6),char(1),char(82),char(208),char(0),char(0),char(8),char(179),char(2), +char(36),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201), +char(0),char(0),char(4),char(111),char(7),char(209),char(2),char(38),char(0),char(40), +char(0),char(0),char(1),char(7),char(3),char(119),char(4),char(193),char(1),char(82), +char(0),char(10),char(180),char(2),char(1),char(18),char(5),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(92), +char(6),char(127),char(2),char(38),char(0),char(72),char(0),char(0),char(1),char(7), +char(3),char(119),char(4),char(174),char(0),char(0),char(0),char(10),char(180),char(3), +char(2),char(33),char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(93),char(0),char(0),char(3),char(248),char(7),char(209),char(2),char(38), +char(0),char(40),char(0),char(0),char(1),char(7),char(3),char(120),char(4),char(195), +char(1),char(82),char(0),char(10),char(180),char(2),char(1),char(18),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(74),char(255),char(236), +char(4),char(18),char(6),char(127),char(2),char(38),char(0),char(72),char(0),char(0), +char(1),char(7),char(3),char(120),char(4),char(176),char(0),char(0),char(0),char(10), +char(180),char(3),char(2),char(33),char(17),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(201),char(0),char(0),char(4),char(57),char(8),char(74), +char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7),char(3),char(121), +char(4),char(190),char(1),char(82),char(0),char(10),char(180),char(2),char(1),char(18), +char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(115), +char(255),char(236),char(4),char(29),char(6),char(248),char(2),char(38),char(0),char(72), +char(0),char(0),char(1),char(7),char(3),char(121),char(4),char(162),char(0),char(0), +char(0),char(10),char(180),char(3),char(2),char(33),char(17),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(201),char(0),char(0),char(3),char(248), +char(8),char(98),char(2),char(38),char(0),char(40),char(0),char(0),char(1),char(7), +char(3),char(122),char(4),char(184),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(42),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(4),char(18),char(7),char(16),char(2),char(38), +char(0),char(72),char(0),char(0),char(1),char(7),char(3),char(122),char(4),char(162), +char(0),char(0),char(0),char(10),char(180),char(3),char(2),char(57),char(17),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(201),char(254),char(160), +char(3),char(248),char(7),char(115),char(2),char(38),char(0),char(40),char(0),char(0), +char(0),char(39),char(2),char(103),char(4),char(190),char(0),char(0),char(1),char(7), +char(1),char(75),char(0),char(2),char(1),char(82),char(0),char(8),char(179),char(2), +char(37),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115), +char(254),char(160),char(4),char(18),char(6),char(33),char(2),char(38),char(0),char(72), +char(0),char(0),char(0),char(39),char(2),char(103),char(4),char(176),char(0),char(0), +char(1),char(6),char(1),char(75),char(241),char(0),char(0),char(8),char(179),char(3), +char(52),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(84), +char(0),char(0),char(2),char(86),char(7),char(225),char(2),char(38),char(0),char(44), +char(0),char(0),char(1),char(7),char(2),char(102),char(3),char(201),char(1),char(82), +char(0),char(8),char(179),char(1),char(16),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(123),char(0),char(0),char(1),char(230),char(6),char(143), +char(2),char(38),char(0),char(243),char(0),char(0),char(1),char(7),char(2),char(102), +char(3),char(115),char(0),char(0),char(0),char(8),char(179),char(1),char(8),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(84),char(254),char(160), +char(2),char(86),char(5),char(182),char(2),char(38),char(0),char(44),char(0),char(0), +char(0),char(7),char(2),char(103),char(3),char(180),char(0),char(0),char(255),char(255), +char(0),char(157),char(254),char(160),char(1),char(102),char(5),char(223),char(2),char(38), +char(0),char(76),char(0),char(0),char(0),char(7),char(2),char(103),char(3),char(98), +char(0),char(0),char(255),char(255),char(0),char(125),char(254),char(160),char(5),char(190), +char(5),char(205),char(2),char(38),char(0),char(50),char(0),char(0),char(0),char(7), +char(2),char(103),char(5),char(127),char(0),char(0),char(255),char(255),char(0),char(115), +char(254),char(160),char(4),char(98),char(4),char(92),char(2),char(38),char(0),char(82), +char(0),char(0),char(0),char(7),char(2),char(103),char(4),char(201),char(0),char(0), +char(255),char(255),char(0),char(125),char(255),char(236),char(5),char(190),char(7),char(225), +char(2),char(38),char(0),char(50),char(0),char(0),char(1),char(7),char(2),char(102), +char(5),char(143),char(1),char(82),char(0),char(8),char(179),char(2),char(28),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(98),char(6),char(143),char(2),char(38),char(0),char(82),char(0),char(0), +char(1),char(7),char(2),char(102),char(4),char(217),char(0),char(0),char(0),char(8), +char(179),char(2),char(29),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(125),char(255),char(236),char(5),char(190),char(7),char(209),char(2),char(38), +char(0),char(50),char(0),char(0),char(1),char(7),char(3),char(119),char(5),char(125), +char(1),char(82),char(0),char(10),char(180),char(3),char(2),char(30),char(5),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(4),char(117),char(6),char(127),char(2),char(38),char(0),char(82),char(0),char(0), +char(1),char(7),char(3),char(119),char(4),char(199),char(0),char(0),char(0),char(10), +char(180),char(3),char(2),char(31),char(17),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(125),char(255),char(236),char(5),char(190),char(7),char(209), +char(2),char(38),char(0),char(50),char(0),char(0),char(1),char(7),char(3),char(120), +char(5),char(125),char(1),char(82),char(0),char(10),char(180),char(3),char(2),char(30), +char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(97), +char(255),char(236),char(4),char(98),char(6),char(127),char(2),char(38),char(0),char(82), +char(0),char(0),char(1),char(7),char(3),char(120),char(4),char(199),char(0),char(0), +char(0),char(10),char(180),char(3),char(2),char(31),char(17),char(38),char(0),char(43), +char(53),char(53),char(255),char(255),char(0),char(125),char(255),char(236),char(5),char(190), +char(8),char(74),char(2),char(38),char(0),char(50),char(0),char(0),char(1),char(7), +char(3),char(121),char(5),char(123),char(1),char(82),char(0),char(10),char(180),char(3), +char(2),char(30),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(4),char(98),char(6),char(248),char(2),char(38), +char(0),char(82),char(0),char(0),char(1),char(7),char(3),char(121),char(4),char(199), +char(0),char(0),char(0),char(10),char(180),char(3),char(2),char(31),char(17),char(38), +char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(125),char(255),char(236), +char(5),char(190),char(8),char(98),char(2),char(38),char(0),char(50),char(0),char(0), +char(1),char(7),char(3),char(122),char(5),char(121),char(1),char(82),char(0),char(10), +char(180),char(3),char(2),char(54),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(115),char(255),char(236),char(4),char(98),char(7),char(16), +char(2),char(38),char(0),char(82),char(0),char(0),char(1),char(7),char(3),char(122), +char(4),char(197),char(0),char(0),char(0),char(10),char(180),char(3),char(2),char(55), +char(17),char(38),char(0),char(43),char(53),char(53),char(255),char(255),char(0),char(125), +char(254),char(160),char(5),char(190),char(7),char(115),char(2),char(38),char(0),char(50), +char(0),char(0),char(0),char(39),char(2),char(103),char(5),char(127),char(0),char(0), +char(1),char(7),char(1),char(75),char(0),char(193),char(1),char(82),char(0),char(8), +char(179),char(3),char(49),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(254),char(160),char(4),char(98),char(6),char(33),char(2),char(38), +char(0),char(82),char(0),char(0),char(0),char(39),char(2),char(103),char(4),char(205), +char(0),char(0),char(1),char(6),char(1),char(75),char(14),char(0),char(0),char(8), +char(179),char(3),char(50),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(125),char(255),char(236),char(6),char(100),char(7),char(115),char(2),char(38), +char(2),char(95),char(0),char(0),char(1),char(7),char(0),char(118),char(1),char(43), +char(1),char(82),char(0),char(8),char(179),char(2),char(43),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236),char(5),char(25), +char(6),char(33),char(2),char(38),char(2),char(96),char(0),char(0),char(1),char(6), +char(0),char(118),char(109),char(0),char(0),char(8),char(179),char(2),char(43),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(125),char(255),char(236), +char(6),char(100),char(7),char(115),char(2),char(38),char(2),char(95),char(0),char(0), +char(1),char(7),char(0),char(67),char(0),char(135),char(1),char(82),char(0),char(8), +char(179),char(2),char(35),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(115),char(255),char(236),char(5),char(25),char(6),char(33),char(2),char(38), +char(2),char(96),char(0),char(0),char(1),char(6),char(0),char(67),char(212),char(0), +char(0),char(8),char(179),char(2),char(36),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(125),char(255),char(236),char(6),char(100),char(7),char(225), +char(2),char(38),char(2),char(95),char(0),char(0),char(1),char(7),char(2),char(102), +char(5),char(143),char(1),char(82),char(0),char(8),char(179),char(2),char(38),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236), +char(5),char(25),char(6),char(143),char(2),char(38),char(2),char(96),char(0),char(0), +char(1),char(7),char(2),char(102),char(4),char(217),char(0),char(0),char(0),char(8), +char(179),char(2),char(39),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(125),char(255),char(236),char(6),char(100),char(7),char(47),char(2),char(38), +char(2),char(95),char(0),char(0),char(1),char(7),char(1),char(82),char(0),char(160), +char(1),char(82),char(0),char(8),char(179),char(2),char(43),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(115),char(255),char(236),char(5),char(25), +char(5),char(221),char(2),char(38),char(2),char(96),char(0),char(0),char(1),char(6), +char(1),char(82),char(245),char(0),char(0),char(8),char(179),char(2),char(35),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(125),char(254),char(160), +char(6),char(100),char(6),char(20),char(2),char(38),char(2),char(95),char(0),char(0), +char(0),char(7),char(2),char(103),char(5),char(123),char(0),char(0),char(255),char(255), +char(0),char(115),char(254),char(160),char(5),char(25),char(4),char(240),char(2),char(38), +char(2),char(96),char(0),char(0),char(0),char(7),char(2),char(103),char(4),char(201), +char(0),char(0),char(255),char(255),char(0),char(186),char(254),char(160),char(5),char(25), +char(5),char(182),char(2),char(38),char(0),char(56),char(0),char(0),char(0),char(7), +char(2),char(103),char(5),char(74),char(0),char(0),char(255),char(255),char(0),char(164), +char(254),char(160),char(4),char(57),char(4),char(72),char(2),char(38),char(0),char(88), +char(0),char(0),char(0),char(7),char(2),char(103),char(4),char(184),char(0),char(0), +char(255),char(255),char(0),char(186),char(255),char(236),char(5),char(25),char(7),char(225), +char(2),char(38),char(0),char(56),char(0),char(0),char(1),char(7),char(2),char(102), +char(5),char(84),char(1),char(82),char(0),char(8),char(179),char(1),char(22),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(164),char(255),char(236), +char(4),char(57),char(6),char(143),char(2),char(38),char(0),char(88),char(0),char(0), +char(1),char(7),char(2),char(102),char(4),char(213),char(0),char(0),char(0),char(8), +char(179),char(1),char(25),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(186),char(255),char(236),char(6),char(123),char(7),char(115),char(2),char(38), +char(2),char(97),char(0),char(0),char(1),char(7),char(0),char(118),char(0),char(238), +char(1),char(82),char(0),char(8),char(179),char(1),char(37),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(164),char(255),char(236),char(5),char(150), +char(6),char(33),char(2),char(38),char(2),char(98),char(0),char(0),char(1),char(6), +char(0),char(118),char(121),char(0),char(0),char(8),char(179),char(1),char(38),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(186),char(255),char(236), +char(6),char(123),char(7),char(115),char(2),char(38),char(2),char(97),char(0),char(0), +char(1),char(7),char(0),char(67),char(0),char(90),char(1),char(82),char(0),char(8), +char(179),char(1),char(29),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(164),char(255),char(236),char(5),char(150),char(6),char(33),char(2),char(38), +char(2),char(98),char(0),char(0),char(1),char(6),char(0),char(67),char(187),char(0), +char(0),char(8),char(179),char(1),char(31),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(186),char(255),char(236),char(6),char(123),char(7),char(225), +char(2),char(38),char(2),char(97),char(0),char(0),char(1),char(7),char(2),char(102), +char(5),char(96),char(1),char(82),char(0),char(8),char(179),char(1),char(32),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(164),char(255),char(236), +char(5),char(150),char(6),char(143),char(2),char(38),char(2),char(98),char(0),char(0), +char(1),char(7),char(2),char(102),char(4),char(219),char(0),char(0),char(0),char(8), +char(179),char(1),char(34),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(186),char(255),char(236),char(6),char(123),char(7),char(47),char(2),char(38), +char(2),char(97),char(0),char(0),char(1),char(7),char(1),char(82),char(0),char(127), +char(1),char(82),char(0),char(8),char(179),char(1),char(37),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(164),char(255),char(236),char(5),char(150), +char(5),char(221),char(2),char(38),char(2),char(98),char(0),char(0),char(1),char(6), +char(1),char(82),char(255),char(0),char(0),char(8),char(179),char(1),char(30),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(186),char(254),char(160), +char(6),char(123),char(6),char(20),char(2),char(38),char(2),char(97),char(0),char(0), +char(0),char(7),char(2),char(103),char(5),char(76),char(0),char(0),char(255),char(255), +char(0),char(164),char(254),char(160),char(5),char(150),char(4),char(242),char(2),char(38), +char(2),char(98),char(0),char(0),char(0),char(7),char(2),char(103),char(4),char(178), +char(0),char(0),char(255),char(255),char(0),char(0),char(254),char(160),char(4),char(123), +char(5),char(182),char(2),char(38),char(0),char(60),char(0),char(0),char(0),char(7), +char(2),char(103),char(4),char(156),char(0),char(0),char(255),char(255),char(0),char(2), +char(254),char(20),char(4),char(6),char(4),char(72),char(2),char(38),char(0),char(92), +char(0),char(0),char(0),char(7),char(2),char(103),char(5),char(158),char(255),char(253), +char(255),char(255),char(0),char(0),char(0),char(0),char(4),char(123),char(7),char(225), +char(2),char(38),char(0),char(60),char(0),char(0),char(1),char(7),char(2),char(102), +char(4),char(170),char(1),char(82),char(0),char(8),char(179),char(1),char(13),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(2),char(254),char(20), +char(4),char(6),char(6),char(143),char(2),char(38),char(0),char(92),char(0),char(0), +char(1),char(7),char(2),char(102),char(4),char(106),char(0),char(0),char(0),char(8), +char(179),char(1),char(26),char(17),char(38),char(0),char(43),char(53),char(255),char(255), +char(0),char(0),char(0),char(0),char(4),char(123),char(7),char(47),char(2),char(38), +char(0),char(60),char(0),char(0),char(1),char(7),char(1),char(82),char(255),char(194), +char(1),char(82),char(0),char(8),char(179),char(1),char(18),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(2),char(254),char(20),char(4),char(6), +char(5),char(221),char(2),char(38),char(0),char(92),char(0),char(0),char(1),char(6), +char(1),char(82),char(138),char(0),char(0),char(8),char(179),char(1),char(31),char(17), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(115),char(254),char(197), +char(4),char(211),char(6),char(20),char(2),char(38),char(0),char(211),char(0),char(0), +char(0),char(7),char(0),char(66),char(0),char(180),char(0),char(0),char(0),char(2), +char(251),char(229),char(4),char(217),char(254),char(180),char(6),char(33),char(0),char(9), +char(0),char(19),char(0),char(30),char(64),char(12),char(4),char(10),char(14),char(14), +char(0),char(0),char(21),char(15),char(6),char(128),char(11),char(1),char(0),char(47), +char(51),char(26),char(205),char(50),char(17),char(1),char(51),char(17),char(51),char(18), +char(57),char(57),char(49),char(48),char(1),char(35),char(38),char(38),char(39),char(53), +char(51),char(22),char(22),char(23),char(5),char(35),char(38),char(38),char(39),char(53), +char(51),char(22),char(22),char(23),char(254),char(180),char(96),char(52),char(177),char(37), +char(186),char(28),char(99),char(49),char(254),char(156),char(96),char(56),char(174),char(37), +char(187),char(28),char(99),char(49),char(4),char(217),char(42),char(202),char(63),char(21), +char(61),char(174),char(68),char(25),char(44),char(200),char(63),char(21),char(61),char(174), +char(68),char(0),char(0),char(2),char(252),char(113),char(4),char(217),char(255),char(174), +char(6),char(127),char(0),char(13),char(0),char(21),char(0),char(40),char(64),char(17), +char(21),char(0),char(6),char(17),char(17),char(23),char(3),char(6),char(10),char(21), +char(10),char(21),char(10),char(17),char(192),char(6),char(1),char(0),char(47),char(51), +char(26),char(204),char(57),char(57),char(47),char(47),char(17),char(18),char(57),char(17), +char(1),char(51),char(17),char(51),char(57),char(57),char(49),char(48),char(1),char(35), +char(38),char(39),char(6),char(7),char(35),char(53),char(55),char(54),char(55),char(51), +char(22),char(23),char(39),char(54),char(55),char(51),char(21),char(6),char(7),char(35), +char(254),char(211),char(94),char(112),char(99),char(114),char(97),char(94),char(53),char(112), +char(52),char(176),char(66),char(151),char(80),char(73),char(54),char(172),char(83),char(120), +char(96),char(4),char(217),char(75),char(91),char(101),char(65),char(25),char(60),char(123), +char(77),char(94),char(166),char(194),char(91),char(112),char(21),char(110),char(96),char(0), +char(0),char(2),char(251),char(154),char(4),char(217),char(254),char(215),char(6),char(127), +char(0),char(13),char(0),char(21),char(0),char(42),char(64),char(18),char(6),char(14), +char(17),char(17),char(0),char(0),char(23),char(3),char(6),char(10),char(15),char(10), +char(15),char(10),char(19),char(192),char(6),char(1),char(0),char(47),char(51),char(26), +char(204),char(57),char(57),char(47),char(47),char(17),char(18),char(57),char(17),char(1), +char(51),char(17),char(51),char(18),char(57),char(57),char(49),char(48),char(1),char(35), +char(38),char(39),char(6),char(7),char(35),char(53),char(55),char(54),char(55),char(51), +char(22),char(23),char(37),char(35),char(38),char(39),char(53),char(51),char(22),char(23), +char(254),char(215),char(94),char(97),char(114),char(106),char(105),char(94),char(53),char(112), +char(52),char(176),char(66),char(151),char(253),char(238),char(95),char(120),char(84),char(172), +char(52),char(75),char(4),char(217),char(65),char(101),char(96),char(70),char(23),char(60), +char(123),char(77),char(94),char(166),char(172),char(94),char(112),char(21),char(108),char(97), +char(0),char(2),char(252),char(113),char(4),char(217),char(255),char(123),char(6),char(248), +char(0),char(13),char(0),char(31),char(0),char(52),char(64),char(24),char(16),char(19), +char(0),char(19),char(27),char(3),char(6),char(6),char(22),char(14),char(14),char(33), +char(3),char(10),char(6),char(18),char(10),char(18),char(10),char(25),char(30),char(192), +char(6),char(1),char(0),char(47),char(51),char(26),char(204),char(50),char(57),char(57), +char(47),char(47),char(17),char(18),char(57),char(17),char(1),char(51),char(17),char(51), +char(51),char(18),char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(35), +char(38),char(39),char(6),char(7),char(35),char(53),char(55),char(54),char(55),char(51), +char(22),char(23),char(19),char(20),char(7),char(7),char(35),char(39),char(54),char(54), +char(53),char(52),char(38),char(35),char(34),char(7),char(53),char(54),char(51),char(50), +char(254),char(211),char(94),char(112),char(99),char(114),char(97),char(94),char(53),char(112), +char(52),char(176),char(66),char(151),char(168),char(127),char(6),char(80),char(10),char(57), +char(63),char(57),char(43),char(46),char(26),char(25),char(55),char(195),char(4),char(217), +char(75),char(91),char(101),char(65),char(25),char(60),char(123),char(77),char(94),char(166), +char(1),char(123),char(103),char(29),char(81),char(131),char(9),char(32),char(38),char(37), +char(25),char(6),char(80),char(6),char(0),char(2),char(252),char(104),char(4),char(217), +char(254),char(231),char(7),char(16),char(0),char(23),char(0),char(37),char(0),char(58), +char(64),char(27),char(24),char(30),char(9),char(9),char(21),char(21),char(39),char(27), +char(30),char(34),char(30),char(25),char(17),char(9),char(0),char(5),char(12),char(34), +char(0),char(12),char(12),char(0),char(34),char(3),char(21),char(192),char(25),char(0), +char(47),char(26),char(204),char(23),char(57),char(47),char(47),char(47),char(17),char(51), +char(16),char(196),char(51),char(17),char(51),char(17),char(18),char(57),char(17),char(1), +char(51),char(17),char(51),char(18),char(57),char(57),char(49),char(48),char(1),char(34), +char(46),char(2),char(35),char(34),char(6),char(7),char(35),char(54),char(54),char(51), +char(50),char(30),char(2),char(51),char(50),char(54),char(55),char(51),char(6),char(6), +char(19),char(35),char(38),char(39),char(6),char(7),char(35),char(53),char(55),char(54), +char(55),char(51),char(22),char(23),char(254),char(45),char(37),char(71),char(67),char(63), +char(28),char(40),char(42),char(14),char(91),char(13),char(101),char(75),char(37),char(73), +char(67),char(62),char(27),char(40),char(42),char(12),char(90),char(11),char(99),char(94), +char(94),char(97),char(114),char(106),char(105),char(94),char(53),char(112),char(52),char(176), +char(66),char(151),char(6),char(53),char(30),char(37),char(30),char(49),char(50),char(106), +char(113),char(30),char(36),char(30),char(49),char(49),char(104),char(115),char(254),char(164), +char(65),char(101),char(96),char(70),char(23),char(60),char(123),char(77),char(94),char(166), +char(0),char(2),char(252),char(121),char(4),char(217),char(254),char(199),char(6),char(193), +char(0),char(7),char(0),char(20),char(0),char(36),char(64),char(15),char(7),char(4), +char(10),char(10),char(18),char(18),char(22),char(3),char(64),char(7),char(17),char(10), +char(128),char(14),char(8),char(0),char(47),char(51),char(26),char(221),char(50),char(212), +char(26),char(205),char(17),char(1),char(51),char(17),char(51),char(18),char(57),char(57), +char(49),char(48),char(1),char(54),char(55),char(51),char(21),char(6),char(7),char(35), +char(19),char(32),char(3),char(51),char(22),char(22),char(51),char(50),char(54),char(55), +char(51),char(6),char(6),char(253),char(94),char(80),char(49),char(172),char(86),char(119), +char(96),char(62),char(254),char(236),char(15),char(102),char(9),char(76),char(106),char(98), +char(86),char(8),char(105),char(11),char(149),char(5),char(244),char(104),char(101),char(21), +char(114),char(93),char(254),char(252),char(1),char(4),char(72),char(57),char(65),char(64), +char(120),char(140),char(0),char(2),char(252),char(121),char(4),char(217),char(254),char(199), +char(6),char(193),char(0),char(7),char(0),char(20),char(0),char(36),char(64),char(15), +char(7),char(4),char(10),char(10),char(18),char(18),char(22),char(4),char(64),char(1), +char(17),char(10),char(128),char(14),char(8),char(0),char(47),char(51),char(26),char(221), +char(50),char(212),char(26),char(205),char(17),char(1),char(51),char(17),char(51),char(18), +char(57),char(57),char(49),char(48),char(1),char(35),char(38),char(39),char(53),char(51), +char(22),char(23),char(3),char(32),char(3),char(51),char(22),char(22),char(51),char(50), +char(54),char(55),char(51),char(6),char(6),char(253),char(209),char(94),char(119),char(86), +char(172),char(52),char(75),char(53),char(254),char(236),char(15),char(102),char(9),char(76), +char(106),char(98),char(86),char(8),char(105),char(11),char(149),char(5),char(221),char(93), +char(114),char(21),char(108),char(97),char(254),char(229),char(1),char(4),char(72),char(57), +char(65),char(64),char(120),char(140),char(0),char(2),char(252),char(121),char(4),char(217), +char(254),char(199),char(7),char(6),char(0),char(17),char(0),char(30),char(0),char(46), +char(64),char(21),char(8),char(0),char(0),char(5),char(13),char(3),char(20),char(20), +char(28),char(28),char(32),char(11),char(16),char(4),char(4),char(24),char(24),char(27), +char(20),char(128),char(18),char(0),char(47),char(26),char(205),char(50),char(51),char(17), +char(57),char(47),char(196),char(50),char(17),char(1),char(51),char(17),char(51),char(18), +char(23),char(57),char(17),char(51),char(49),char(48),char(1),char(20),char(7),char(7), +char(35),char(39),char(54),char(54),char(53),char(52),char(38),char(35),char(34),char(7), +char(53),char(54),char(51),char(50),char(3),char(32),char(3),char(51),char(22),char(22), +char(51),char(50),char(54),char(55),char(51),char(6),char(6),char(254),char(49),char(127), +char(6),char(82),char(10),char(57),char(66),char(57),char(44),char(37),char(36),char(22), +char(62),char(192),char(149),char(254),char(236),char(15),char(102),char(9),char(76),char(106), +char(98),char(86),char(8),char(105),char(11),char(149),char(6),char(121),char(100),char(29), +char(41),char(90),char(9),char(32),char(37),char(37),char(26),char(6),char(78),char(8), +char(253),char(211),char(1),char(4),char(72),char(57),char(65),char(64),char(120),char(140), +char(0),char(2),char(252),char(104),char(4),char(217),char(254),char(231),char(7),char(12), +char(0),char(23),char(0),char(36),char(0),char(48),char(64),char(21),char(26),char(34), +char(9),char(9),char(21),char(38),char(5),char(12),char(12),char(30),char(30),char(24), +char(21),char(64),char(17),char(9),char(0),char(33),char(26),char(128),char(24),char(0), +char(47),char(26),char(221),char(50),char(214),char(196),char(51),char(26),char(205),char(17), +char(51),char(17),char(57),char(47),char(51),char(17),char(1),char(51),char(50),char(17), +char(57),char(57),char(49),char(48),char(1),char(34),char(46),char(2),char(35),char(34), +char(6),char(7),char(35),char(54),char(54),char(51),char(50),char(30),char(2),char(51), +char(50),char(54),char(55),char(51),char(6),char(6),char(3),char(32),char(3),char(51), +char(22),char(22),char(51),char(50),char(54),char(55),char(51),char(6),char(6),char(254), +char(45),char(37),char(71),char(67),char(63),char(28),char(40),char(42),char(14),char(91), +char(13),char(100),char(76),char(37),char(73),char(67),char(62),char(27),char(40),char(42), +char(12),char(90),char(11),char(99),char(221),char(254),char(236),char(15),char(102),char(9), +char(76),char(106),char(98),char(86),char(8),char(105),char(11),char(149),char(6),char(51), +char(30),char(36),char(30),char(48),char(50),char(104),char(113),char(30),char(36),char(30), +char(49),char(49),char(103),char(114),char(254),char(166),char(1),char(4),char(72),char(57), +char(65),char(64),char(120),char(140),char(0),char(1),char(0),char(49),char(254),char(66), +char(1),char(109),char(0),char(0),char(0),char(15),char(0),char(26),char(64),char(11), +char(0),char(5),char(5),char(2),char(10),char(3),char(16),char(17),char(13),char(8), +char(3),char(0),char(47),char(204),char(50),char(17),char(18),char(1),char(23),char(57), +char(17),char(51),char(49),char(48),char(23),char(52),char(39),char(51),char(22),char(21), +char(20),char(6),char(35),char(34),char(39),char(53),char(22),char(51),char(50),char(54), +char(223),char(139),char(123),char(158),char(102),char(99),char(65),char(50),char(32),char(54), +char(37),char(51),char(238),char(103),char(135),char(120),char(132),char(91),char(103),char(16), +char(108),char(10),char(48),char(0),char(0),char(1),char(0),char(25),char(254),char(117), +char(1),char(113),char(0),char(154),char(0),char(11),char(0),char(24),char(64),char(9), +char(10),char(0),char(6),char(0),char(12),char(13),char(8),char(3),char(0),char(0), +char(47),char(204),char(50),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(49),char(48),char(37),char(17),char(16),char(35),char(34),char(39),char(53),char(22), +char(51),char(50),char(53),char(17),char(1),char(113),char(228),char(56),char(60),char(41), +char(61),char(94),char(154),char(254),char(223),char(254),char(252),char(24),char(140),char(19), +char(100),char(1),char(48),char(0),char(0),char(1),char(0),char(25),char(254),char(117), +char(1),char(113),char(0),char(143),char(0),char(11),char(0),char(24),char(64),char(9), +char(10),char(0),char(6),char(0),char(12),char(13),char(8),char(3),char(0),char(0), +char(47),char(204),char(50),char(17),char(18),char(1),char(57),char(57),char(17),char(51), +char(49),char(48),char(37),char(17),char(16),char(35),char(34),char(39),char(53),char(22), +char(51),char(50),char(53),char(17),char(1),char(113),char(228),char(56),char(60),char(41), +char(61),char(94),char(143),char(254),char(234),char(254),char(252),char(24),char(140),char(19), +char(100),char(1),char(37),char(0),char(255),char(255),char(0),char(52),char(0),char(0), +char(2),char(67),char(5),char(182),char(0),char(7),char(0),char(20),char(255),char(120), +char(0),char(0),char(0),char(2),char(0),char(115),char(255),char(236),char(4),char(23), +char(4),char(115),char(0),char(11),char(0),char(23),char(0),char(40),char(64),char(20), +char(12),char(6),char(18),char(0),char(6),char(0),char(24),char(25),char(9),char(21), +char(75),char(89),char(9),char(38),char(3),char(15),char(77),char(89),char(3),char(25), +char(0),char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(1), +char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(16), +char(2),char(35),char(34),char(2),char(17),char(16),char(18),char(51),char(50),char(18), +char(1),char(20),char(22),char(51),char(50),char(54),char(53),char(52),char(38),char(35), +char(34),char(6),char(4),char(23),char(247),char(222),char(217),char(246),char(249),char(218), +char(216),char(249),char(253),char(4),char(155),char(142),char(141),char(158),char(158),char(143), +char(141),char(154),char(2),char(47),char(254),char(245),char(254),char(200),char(1),char(53), +char(1),char(14),char(1),char(15),char(1),char(53),char(254),char(203),char(254),char(241), +char(208),char(232),char(234),char(206),char(204),char(236),char(233),char(0),char(0),char(1), +char(0),char(45),char(0),char(0),char(2),char(55),char(4),char(94),char(0),char(10), +char(0),char(38),char(64),char(17),char(9),char(1),char(1),char(0),char(8),char(0), +char(11),char(12),char(7),char(4),char(7),char(4),char(1),char(9),char(16),char(1), +char(24),char(0),char(63),char(63),char(18),char(57),char(57),char(47),char(47),char(17), +char(18),char(1),char(57),char(57),char(17),char(51),char(17),char(51),char(49),char(48), +char(33),char(35),char(17),char(52),char(55),char(6),char(7),char(7),char(39),char(1), +char(51),char(2),char(55),char(161),char(8),char(67),char(62),char(150),char(90),char(1), +char(127),char(139),char(2),char(49),char(239),char(140),char(67),char(48),char(112),char(114), +char(1),char(35),char(0),char(1),char(0),char(41),char(0),char(0),char(3),char(215), +char(4),char(115),char(0),char(25),char(0),char(44),char(64),char(24),char(7),char(19), +char(0),char(19),char(23),char(14),char(1),char(5),char(26),char(27),char(16),char(10), +char(75),char(89),char(16),char(38),char(24),char(23),char(1),char(23),char(76),char(89), +char(1),char(24),char(0),char(63),char(43),char(17),char(0),char(51),char(24),char(63), +char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(49),char(48), +char(33),char(33),char(53),char(1),char(62),char(2),char(53),char(52),char(38),char(35), +char(34),char(6),char(7),char(39),char(54),char(51),char(50),char(22),char(21),char(20), +char(6),char(7),char(5),char(23),char(33),char(3),char(215),char(252),char(82),char(1), +char(145),char(157),char(113),char(44),char(139),char(119),char(88),char(156),char(92),char(90), +char(192),char(242),char(198),char(218),char(130),char(186),char(254),char(185),char(2),char(2), +char(190),char(133),char(1),char(47),char(119),char(104),char(83),char(65),char(87),char(103), +char(61),char(74),char(109),char(168),char(168),char(150),char(115),char(187),char(128),char(231), +char(6),char(0),char(0),char(1),char(0),char(94),char(254),char(149),char(4),char(27), +char(4),char(116),char(0),char(39),char(0),char(71),char(64),char(38),char(3),char(4), +char(27),char(0),char(19),char(7),char(7),char(0),char(4),char(22),char(34),char(13), +char(6),char(40),char(41),char(4),char(23),char(22),char(23),char(22),char(75),char(89), +char(23),char(23),char(10),char(37),char(37),char(30),char(75),char(89),char(37),char(38), +char(10),char(17),char(75),char(89),char(10),char(37),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(43), +char(17),char(18),char(0),char(57),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(17),char(51),char(17),char(51),char(49),char(48),char(1),char(20),char(6), +char(7),char(21),char(22),char(22),char(21),char(20),char(4),char(33),char(34),char(38), +char(39),char(53),char(22),char(22),char(51),char(32),char(17),char(16),char(33),char(35), +char(53),char(51),char(50),char(54),char(53),char(52),char(38),char(35),char(34),char(6), +char(7),char(39),char(54),char(54),char(51),char(50),char(22),char(3),char(238),char(157), +char(144),char(176),char(170),char(254),char(222),char(254),char(245),char(116),char(193),char(91), +char(95),char(215),char(96),char(1),char(123),char(254),char(94),char(144),char(146),char(171), +char(200),char(147),char(126),char(96),char(170),char(109),char(84),char(90),char(235),char(130), +char(213),char(236),char(3),char(7),char(140),char(178),char(30),char(8),char(22),char(180), +char(146),char(209),char(225),char(35),char(44),char(158),char(47),char(49),char(1),char(41), +char(1),char(10),char(143),char(151),char(134),char(107),char(122),char(52),char(70),char(112), +char(71),char(81),char(195),char(0),char(0),char(2),char(0),char(23),char(254),char(168), +char(4),char(102),char(4),char(94),char(0),char(10),char(0),char(18),char(0),char(66), +char(64),char(33),char(18),char(5),char(9),char(2),char(2),char(11),char(7),char(3), +char(0),char(3),char(5),char(3),char(19),char(20),char(1),char(5),char(18),char(5), +char(77),char(89),char(9),char(18),char(14),char(15),char(15),char(7),char(18),char(18), +char(3),char(7),char(16),char(3),char(36),char(0),char(63),char(63),char(18),char(57), +char(47),char(18),char(57),char(17),char(51),char(17),char(51),char(43),char(17),char(0), +char(51),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(51),char(51), +char(17),char(51),char(17),char(51),char(49),char(48),char(37),char(35),char(17),char(35), +char(17),char(33),char(53),char(1),char(51),char(17),char(51),char(33),char(17),char(52), +char(55),char(35),char(6),char(7),char(1),char(4),char(102),char(217),char(168),char(253), +char(50),char(2),char(190),char(184),char(217),char(254),char(134),char(12),char(10),char(41), +char(68),char(254),char(57),char(27),char(254),char(141),char(1),char(115),char(125),char(3), +char(198),char(252),char(68),char(1),char(92),char(218),char(222),char(86),char(92),char(253), +char(158),char(0),char(0),char(1),char(0),char(133),char(254),char(149),char(4),char(29), +char(4),char(95),char(0),char(26),char(0),char(58),char(64),char(31),char(15),char(3), +char(25),char(20),char(8),char(20),char(23),char(3),char(4),char(28),char(27),char(0), +char(17),char(75),char(89),char(0),char(0),char(6),char(21),char(21),char(24),char(76), +char(89),char(21),char(16),char(6),char(12),char(75),char(89),char(6),char(37),char(0), +char(63),char(43),char(0),char(24),char(63),char(43),char(17),char(18),char(0),char(57), +char(24),char(47),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(49),char(48),char(1),char(50),char(4),char(21),char(20),char(0), +char(35),char(34),char(39),char(53),char(22),char(22),char(51),char(50),char(54),char(53), +char(16),char(33),char(34),char(7),char(39),char(19),char(33),char(21),char(33),char(3), +char(54),char(2),char(45),char(231),char(1),char(9),char(254),char(223),char(254),char(247), +char(130),char(70),char(208),char(101),char(176),char(195),char(254),char(137),char(94),char(160), +char(86),char(55),char(2),char(215),char(253),char(183),char(37),char(115),char(2),char(38), +char(229),char(199),char(227),char(254),char(254),char(79),char(160),char(45),char(51),char(166), +char(157),char(1),char(50),char(29),char(55),char(2),char(172),char(153),char(254),char(73), +char(23),char(0),char(255),char(255),char(0),char(117),char(255),char(236),char(4),char(47), +char(5),char(203),char(2),char(6),char(0),char(25),char(0),char(0),char(0),char(1), +char(0),char(94),char(254),char(169),char(4),char(43),char(4),char(95),char(0),char(6), +char(0),char(31),char(64),char(16),char(1),char(5),char(5),char(0),char(2),char(3), +char(7),char(8),char(3),char(2),char(76),char(89),char(3),char(16),char(0),char(36), +char(0),char(63),char(63),char(43),char(17),char(18),char(1),char(23),char(57),char(17), +char(51),char(49),char(48),char(1),char(1),char(33),char(53),char(33),char(21),char(1), +char(1),char(29),char(2),char(94),char(252),char(227),char(3),char(205),char(253),char(170), +char(254),char(169),char(5),char(29),char(153),char(133),char(250),char(207),char(255),char(255), +char(0),char(104),char(255),char(236),char(4),char(41),char(5),char(203),char(2),char(6), +char(0),char(27),char(0),char(0),char(0),char(2),char(0),char(106),char(254),char(149), +char(4),char(37),char(4),char(116),char(0),char(23),char(0),char(37),char(0),char(65), +char(64),char(34),char(27),char(17),char(34),char(10),char(10),char(0),char(0),char(4), +char(17),char(3),char(38),char(39),char(14),char(30),char(77),char(89),char(10),char(20), +char(14),char(14),char(2),char(20),char(20),char(24),char(75),char(89),char(20),char(38), +char(2),char(7),char(77),char(89),char(2),char(37),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(24),char(47),char(18), +char(57),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17), +char(51),char(17),char(51),char(49),char(48),char(1),char(16),char(33),char(34),char(39), +char(53),char(22),char(51),char(50),char(18),char(19),char(35),char(6),char(6),char(35), +char(34),char(38),char(53),char(52),char(18),char(51),char(50),char(22),char(18),char(1), +char(34),char(6),char(21),char(20),char(22),char(51),char(50),char(54),char(54),char(53), +char(52),char(38),char(38),char(4),char(37),char(253),char(104),char(116),char(68),char(80), +char(102),char(240),char(245),char(11),char(12),char(55),char(182),char(114),char(194),char(228), +char(255),char(208),char(149),char(223),char(120),char(254),char(20),char(143),char(156),char(144), +char(147),char(91),char(153),char(88),char(82),char(147),char(1),char(239),char(252),char(166), +char(20),char(143),char(26),char(1),char(41),char(1),char(51),char(83),char(87),char(232), +char(208),char(228),char(1),char(8),char(153),char(254),char(219),char(1),char(48),char(184), +char(164),char(144),char(165),char(74),char(128),char(70),char(105),char(178),char(102),char(0), +char(255),char(255),char(0),char(29),char(0),char(0),char(5),char(196),char(6),char(31), +char(0),char(39),char(0),char(73),char(2),char(182),char(0),char(0),char(0),char(6), +char(0),char(73),char(0),char(0),char(0),char(2),char(0),char(92),char(2),char(221), +char(5),char(170),char(5),char(193),char(0),char(34),char(0),char(51),char(0),char(90), +char(64),char(46),char(44),char(48),char(48),char(46),char(42),char(38),char(38),char(40), +char(10),char(0),char(28),char(17),char(5),char(17),char(22),char(0),char(40),char(46), +char(6),char(53),char(52),char(43),char(49),char(36),char(3),char(45),char(47),char(45), +char(41),char(47),char(35),char(35),char(40),char(28),char(10),char(20),char(8),char(3), +char(3),char(40),char(41),char(25),char(20),char(20),char(41),char(3),char(0),char(63), +char(51),char(47),char(51),char(16),char(205),char(50),char(47),char(51),char(18),char(57), +char(57),char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(18),char(23), +char(57),char(17),char(18),char(1),char(23),char(57),char(17),char(51),char(17),char(51), +char(17),char(51),char(17),char(51),char(17),char(51),char(17),char(51),char(49),char(48), +char(1),char(20),char(6),char(35),char(34),char(39),char(53),char(22),char(51),char(50), +char(53),char(52),char(38),char(38),char(39),char(38),char(38),char(53),char(52),char(54), +char(51),char(50),char(23),char(7),char(38),char(35),char(34),char(6),char(21),char(20), +char(22),char(22),char(23),char(22),char(22),char(1),char(3),char(35),char(23),char(17), +char(35),char(17),char(51),char(19),char(19),char(51),char(17),char(35),char(17),char(55), +char(35),char(3),char(2),char(72),char(149),char(124),char(145),char(74),char(106),char(119), +char(148),char(23),char(54),char(85),char(120),char(81),char(142),char(110),char(125),char(92), +char(34),char(100),char(83),char(60),char(75),char(18),char(43),char(95),char(129),char(80), +char(1),char(166),char(201),char(8),char(6),char(119),char(188),char(195),char(203),char(180), +char(127),char(6),char(8),char(211),char(3),char(172),char(98),char(109),char(33),char(108), +char(40),char(100),char(33),char(40),char(33),char(31),char(44),char(91),char(76),char(86), +char(105),char(39),char(99),char(37),char(46),char(40),char(29),char(36),char(28),char(36), +char(50),char(90),char(254),char(236),char(2),char(47),char(129),char(254),char(82),char(2), +char(209),char(253),char(209),char(2),char(47),char(253),char(47),char(1),char(164),char(137), +char(253),char(211),char(255),char(255),char(0),char(18),char(254),char(20),char(4),char(90), +char(5),char(182),char(2),char(38),char(0),char(55),char(0),char(0),char(0),char(7), +char(0),char(122),char(1),char(63),char(0),char(0),char(255),char(255),char(0),char(31), +char(254),char(20),char(2),char(168),char(5),char(70),char(2),char(38),char(0),char(87), +char(0),char(0),char(0),char(7),char(0),char(122),char(0),char(197),char(0),char(0), +char(0),char(2),char(0),char(113),char(254),char(20),char(4),char(55),char(4),char(92), +char(0),char(12),char(0),char(42),char(0),char(71),char(64),char(38),char(10),char(21), +char(26),char(3),char(42),char(42),char(30),char(30),char(36),char(21),char(3),char(43), +char(44),char(33),char(39),char(70),char(89),char(36),char(33),char(27),char(28),char(15), +char(26),char(15),char(24),char(18),char(24),char(7),char(70),char(89),char(24),char(16), +char(18),char(0),char(70),char(89),char(18),char(22),char(0),char(63),char(43),char(0), +char(24),char(63),char(43),char(17),char(18),char(0),char(57),char(57),char(24),char(63), +char(63),char(51),char(43),char(17),char(18),char(1),char(23),char(57),char(17),char(51), +char(17),char(51),char(51),char(17),char(51),char(49),char(48),char(37),char(50),char(54), +char(55),char(53),char(52),char(38),char(35),char(34),char(6),char(21),char(20),char(22), +char(5),char(52),char(55),char(35),char(6),char(35),char(34),char(2),char(17),char(16), +char(18),char(51),char(50),char(23),char(51),char(55),char(51),char(17),char(20),char(6), +char(35),char(34),char(39),char(53),char(22),char(22),char(51),char(50),char(54),char(53), +char(2),char(76),char(170),char(151),char(4),char(158),char(171),char(144),char(153),char(151), +char(1),char(219),char(9),char(11),char(112),char(230),char(217),char(239),char(243),char(211), +char(223),char(123),char(11),char(24),char(131),char(236),char(249),char(242),char(149),char(75), +char(210),char(118),char(142),char(165),char(119),char(183),char(202),char(43),char(226),char(204), +char(224),char(208),char(209),char(217),char(107),char(36),char(99),char(167),char(1),char(45), +char(1),char(10),char(1),char(8),char(1),char(49),char(166),char(146),char(251),char(164), +char(236),char(236),char(70),char(158),char(42),char(46),char(169),char(146),char(255),char(255), +char(0),char(113),char(254),char(20),char(4),char(55),char(6),char(33),char(2),char(38), +char(3),char(145),char(0),char(0),char(1),char(6),char(1),char(75),char(6),char(0), +char(0),char(8),char(179),char(2),char(57),char(17),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(113),char(254),char(20),char(4),char(55),char(5),char(229), +char(2),char(38),char(3),char(145),char(0),char(0),char(1),char(6),char(1),char(78), +char(12),char(0),char(0),char(8),char(179),char(2),char(43),char(17),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(113),char(254),char(20),char(4),char(55), +char(5),char(223),char(2),char(38),char(3),char(145),char(0),char(0),char(1),char(7), +char(1),char(79),char(1),char(86),char(0),char(0),char(0),char(8),char(179),char(2), +char(52),char(17),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(113), +char(254),char(20),char(4),char(55),char(6),char(33),char(2),char(38),char(3),char(145), +char(0),char(0),char(1),char(6),char(2),char(58),char(119),char(0),char(0),char(8), +char(179),char(2),char(47),char(17),char(38),char(0),char(43),char(53),char(0),char(1), +char(0),char(201),char(0),char(0),char(1),char(115),char(5),char(182),char(0),char(3), +char(0),char(17),char(182),char(0),char(4),char(5),char(1),char(3),char(0),char(18), +char(0),char(63),char(63),char(17),char(18),char(1),char(57),char(49),char(48),char(51), +char(17),char(51),char(17),char(201),char(170),char(5),char(182),char(250),char(74),char(0), +char(255),char(255),char(0),char(5),char(0),char(0),char(1),char(142),char(7),char(115), +char(2),char(38),char(3),char(150),char(0),char(0),char(1),char(7),char(0),char(67), +char(254),char(124),char(1),char(82),char(0),char(8),char(179),char(1),char(5),char(5), +char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(179),char(0),char(0), +char(2),char(60),char(7),char(115),char(2),char(38),char(3),char(150),char(0),char(0), +char(1),char(7),char(0),char(118),char(255),char(42),char(1),char(82),char(0),char(8), +char(179),char(1),char(13),char(5),char(38),char(0),char(43),char(53),char(255),char(255), +char(255),char(199),char(0),char(0),char(2),char(105),char(7),char(115),char(2),char(38), +char(3),char(150),char(0),char(0),char(1),char(7),char(1),char(75),char(254),char(187), +char(1),char(82),char(0),char(8),char(179),char(1),char(18),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(0),char(5),char(0),char(0),char(2),char(56), +char(7),char(37),char(2),char(38),char(3),char(150),char(0),char(0),char(1),char(7), +char(0),char(106),char(254),char(208),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(25),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(255),char(171),char(0),char(0),char(2),char(147),char(7),char(47),char(2),char(38), +char(3),char(150),char(0),char(0),char(1),char(7),char(1),char(82),char(254),char(163), +char(1),char(82),char(0),char(8),char(179),char(1),char(13),char(5),char(38),char(0), +char(43),char(53),char(255),char(255),char(255),char(243),char(0),char(0),char(2),char(75), +char(6),char(180),char(2),char(38),char(3),char(150),char(0),char(0),char(1),char(7), +char(1),char(77),char(254),char(198),char(1),char(82),char(0),char(8),char(179),char(1), +char(7),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(255),char(231), +char(0),char(0),char(2),char(83),char(7),char(55),char(2),char(38),char(3),char(150), +char(0),char(0),char(1),char(7),char(1),char(78),char(254),char(194),char(1),char(82), +char(0),char(8),char(179),char(1),char(4),char(5),char(38),char(0),char(43),char(53), +char(255),char(255),char(0),char(86),char(254),char(66),char(1),char(162),char(5),char(182), +char(2),char(38),char(3),char(150),char(0),char(0),char(0),char(6),char(1),char(81), +char(49),char(0),char(255),char(255),char(0),char(187),char(0),char(0),char(1),char(127), +char(7),char(49),char(2),char(38),char(3),char(150),char(0),char(0),char(1),char(7), +char(1),char(79),char(0),char(25),char(1),char(82),char(0),char(8),char(179),char(1), +char(13),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(201), +char(254),char(127),char(3),char(163),char(5),char(182),char(0),char(38),char(3),char(150), +char(0),char(0),char(0),char(7),char(0),char(45),char(2),char(59),char(0),char(0), +char(255),char(255),char(255),char(228),char(0),char(0),char(2),char(29),char(6),char(10), +char(0),char(39),char(3),char(150),char(0),char(170),char(0),char(0),char(1),char(7), +char(1),char(84),char(253),char(232),char(255),char(151),char(0),char(7),char(178),char(1), +char(8),char(0),char(0),char(63),char(53),char(0),char(255),char(255),char(0),char(201), +char(0),char(0),char(1),char(115),char(5),char(182),char(2),char(6),char(3),char(150), +char(0),char(0),char(255),char(255),char(0),char(5),char(0),char(0),char(2),char(56), +char(7),char(37),char(2),char(38),char(3),char(150),char(0),char(0),char(1),char(7), +char(0),char(106),char(254),char(208),char(1),char(82),char(0),char(10),char(180),char(2), +char(1),char(25),char(5),char(38),char(0),char(43),char(53),char(53),char(255),char(255), +char(0),char(201),char(0),char(0),char(1),char(115),char(5),char(182),char(2),char(6), +char(3),char(150),char(0),char(0),char(255),char(255),char(0),char(5),char(0),char(0), +char(2),char(56),char(7),char(37),char(2),char(38),char(3),char(150),char(0),char(0), +char(1),char(7),char(0),char(106),char(254),char(208),char(1),char(82),char(0),char(10), +char(180),char(2),char(1),char(25),char(5),char(38),char(0),char(43),char(53),char(53), +char(255),char(255),char(0),char(201),char(0),char(0),char(1),char(115),char(5),char(182), +char(2),char(6),char(3),char(150),char(0),char(0),char(255),char(255),char(0),char(201), +char(0),char(0),char(1),char(115),char(5),char(182),char(2),char(6),char(3),char(150), +char(0),char(0),char(255),char(255),char(0),char(153),char(0),char(0),char(2),char(4), +char(7),char(225),char(2),char(38),char(3),char(150),char(0),char(0),char(1),char(7), +char(2),char(102),char(3),char(145),char(1),char(82),char(0),char(8),char(179),char(1), +char(8),char(5),char(38),char(0),char(43),char(53),char(255),char(255),char(0),char(184), +char(254),char(160),char(1),char(127),char(5),char(182),char(2),char(38),char(3),char(150), +char(0),char(0),char(0),char(7),char(2),char(103),char(3),char(125),char(0),char(0), +char(0),char(0),char(0),char(1),char(0),char(0),char(182),char(50),char(0),char(1), +char(73),char(6),char(128),char(0),char(0),char(14),char(54),char(36),char(0),char(5), +char(0),char(36),char(255),char(113),char(0),char(5),char(0),char(55),char(0),char(41), +char(0),char(5),char(0),char(57),char(0),char(41),char(0),char(5),char(0),char(58), +char(0),char(41),char(0),char(5),char(0),char(60),char(0),char(20),char(0),char(5), +char(0),char(68),char(255),char(174),char(0),char(5),char(0),char(70),char(255),char(133), +char(0),char(5),char(0),char(71),char(255),char(133),char(0),char(5),char(0),char(72), +char(255),char(133),char(0),char(5),char(0),char(74),char(255),char(195),char(0),char(5), +char(0),char(80),char(255),char(195),char(0),char(5),char(0),char(81),char(255),char(195), +char(0),char(5),char(0),char(82),char(255),char(133),char(0),char(5),char(0),char(83), +char(255),char(195),char(0),char(5),char(0),char(84),char(255),char(133),char(0),char(5), +char(0),char(85),char(255),char(195),char(0),char(5),char(0),char(86),char(255),char(195), +char(0),char(5),char(0),char(88),char(255),char(195),char(0),char(5),char(0),char(130), +char(255),char(113),char(0),char(5),char(0),char(131),char(255),char(113),char(0),char(5), +char(0),char(132),char(255),char(113),char(0),char(5),char(0),char(133),char(255),char(113), +char(0),char(5),char(0),char(134),char(255),char(113),char(0),char(5),char(0),char(135), +char(255),char(113),char(0),char(5),char(0),char(159),char(0),char(20),char(0),char(5), +char(0),char(162),char(255),char(133),char(0),char(5),char(0),char(163),char(255),char(174), +char(0),char(5),char(0),char(164),char(255),char(174),char(0),char(5),char(0),char(165), +char(255),char(174),char(0),char(5),char(0),char(166),char(255),char(174),char(0),char(5), +char(0),char(167),char(255),char(174),char(0),char(5),char(0),char(168),char(255),char(174), +char(0),char(5),char(0),char(169),char(255),char(133),char(0),char(5),char(0),char(170), +char(255),char(133),char(0),char(5),char(0),char(171),char(255),char(133),char(0),char(5), +char(0),char(172),char(255),char(133),char(0),char(5),char(0),char(173),char(255),char(133), +char(0),char(5),char(0),char(180),char(255),char(133),char(0),char(5),char(0),char(181), +char(255),char(133),char(0),char(5),char(0),char(182),char(255),char(133),char(0),char(5), +char(0),char(183),char(255),char(133),char(0),char(5),char(0),char(184),char(255),char(133), +char(0),char(5),char(0),char(186),char(255),char(133),char(0),char(5),char(0),char(187), +char(255),char(195),char(0),char(5),char(0),char(188),char(255),char(195),char(0),char(5), +char(0),char(189),char(255),char(195),char(0),char(5),char(0),char(190),char(255),char(195), +char(0),char(5),char(0),char(194),char(255),char(113),char(0),char(5),char(0),char(195), +char(255),char(174),char(0),char(5),char(0),char(196),char(255),char(113),char(0),char(5), +char(0),char(197),char(255),char(174),char(0),char(5),char(0),char(198),char(255),char(113), +char(0),char(5),char(0),char(199),char(255),char(174),char(0),char(5),char(0),char(201), +char(255),char(133),char(0),char(5),char(0),char(203),char(255),char(133),char(0),char(5), +char(0),char(205),char(255),char(133),char(0),char(5),char(0),char(207),char(255),char(133), +char(0),char(5),char(0),char(209),char(255),char(133),char(0),char(5),char(0),char(211), +char(255),char(133),char(0),char(5),char(0),char(213),char(255),char(133),char(0),char(5), +char(0),char(215),char(255),char(133),char(0),char(5),char(0),char(217),char(255),char(133), +char(0),char(5),char(0),char(219),char(255),char(133),char(0),char(5),char(0),char(221), +char(255),char(133),char(0),char(5),char(0),char(223),char(255),char(195),char(0),char(5), +char(0),char(225),char(255),char(195),char(0),char(5),char(0),char(227),char(255),char(195), +char(0),char(5),char(0),char(229),char(255),char(195),char(0),char(5),char(0),char(250), +char(255),char(195),char(0),char(5),char(1),char(6),char(255),char(195),char(0),char(5), +char(1),char(8),char(255),char(195),char(0),char(5),char(1),char(13),char(255),char(195), +char(0),char(5),char(1),char(15),char(255),char(133),char(0),char(5),char(1),char(17), +char(255),char(133),char(0),char(5),char(1),char(19),char(255),char(133),char(0),char(5), +char(1),char(21),char(255),char(133),char(0),char(5),char(1),char(23),char(255),char(195), +char(0),char(5),char(1),char(25),char(255),char(195),char(0),char(5),char(1),char(29), +char(255),char(195),char(0),char(5),char(1),char(33),char(255),char(195),char(0),char(5), +char(1),char(36),char(0),char(41),char(0),char(5),char(1),char(38),char(0),char(41), +char(0),char(5),char(1),char(43),char(255),char(195),char(0),char(5),char(1),char(45), +char(255),char(195),char(0),char(5),char(1),char(47),char(255),char(195),char(0),char(5), +char(1),char(49),char(255),char(195),char(0),char(5),char(1),char(51),char(255),char(195), +char(0),char(5),char(1),char(53),char(255),char(195),char(0),char(5),char(1),char(54), +char(0),char(41),char(0),char(5),char(1),char(56),char(0),char(20),char(0),char(5), +char(1),char(58),char(0),char(20),char(0),char(5),char(1),char(67),char(255),char(113), +char(0),char(5),char(1),char(68),char(255),char(174),char(0),char(5),char(1),char(70), +char(255),char(174),char(0),char(5),char(1),char(72),char(255),char(133),char(0),char(5), +char(1),char(74),char(255),char(195),char(0),char(5),char(1),char(86),char(255),char(113), +char(0),char(5),char(1),char(95),char(255),char(113),char(0),char(5),char(1),char(98), +char(255),char(113),char(0),char(5),char(1),char(105),char(255),char(113),char(0),char(5), +char(1),char(121),char(255),char(174),char(0),char(5),char(1),char(122),char(255),char(215), +char(0),char(5),char(1),char(123),char(255),char(215),char(0),char(5),char(1),char(126), +char(255),char(174),char(0),char(5),char(1),char(129),char(255),char(195),char(0),char(5), +char(1),char(130),char(255),char(215),char(0),char(5),char(1),char(131),char(255),char(215), +char(0),char(5),char(1),char(132),char(255),char(215),char(0),char(5),char(1),char(135), +char(255),char(215),char(0),char(5),char(1),char(137),char(255),char(215),char(0),char(5), +char(1),char(140),char(255),char(174),char(0),char(5),char(1),char(142),char(255),char(195), +char(0),char(5),char(1),char(143),char(255),char(174),char(0),char(5),char(1),char(144), +char(255),char(174),char(0),char(5),char(1),char(147),char(255),char(174),char(0),char(5), +char(1),char(153),char(255),char(174),char(0),char(5),char(1),char(164),char(255),char(133), +char(0),char(5),char(1),char(170),char(255),char(113),char(0),char(5),char(1),char(174), +char(255),char(133),char(0),char(5),char(1),char(181),char(255),char(133),char(0),char(5), +char(1),char(202),char(255),char(215),char(0),char(5),char(1),char(206),char(255),char(113), +char(0),char(5),char(1),char(207),char(255),char(133),char(0),char(5),char(1),char(213), +char(255),char(113),char(0),char(5),char(1),char(216),char(255),char(133),char(0),char(5), +char(1),char(219),char(255),char(133),char(0),char(5),char(1),char(222),char(255),char(133), +char(0),char(5),char(1),char(234),char(255),char(133),char(0),char(5),char(1),char(237), +char(255),char(133),char(0),char(5),char(1),char(238),char(255),char(195),char(0),char(5), +char(1),char(242),char(255),char(113),char(0),char(5),char(1),char(250),char(0),char(41), +char(0),char(5),char(1),char(252),char(0),char(41),char(0),char(5),char(1),char(254), +char(0),char(41),char(0),char(5),char(2),char(0),char(0),char(20),char(0),char(5), +char(2),char(87),char(255),char(195),char(0),char(5),char(2),char(88),char(255),char(113), +char(0),char(5),char(2),char(89),char(255),char(174),char(0),char(5),char(2),char(96), +char(255),char(133),char(0),char(5),char(2),char(98),char(255),char(195),char(0),char(5), +char(2),char(106),char(255),char(133),char(0),char(5),char(2),char(114),char(255),char(113), +char(0),char(5),char(2),char(115),char(255),char(113),char(0),char(5),char(2),char(125), +char(255),char(236),char(0),char(5),char(2),char(127),char(255),char(133),char(0),char(5), +char(2),char(133),char(255),char(133),char(0),char(5),char(2),char(135),char(255),char(133), +char(0),char(5),char(2),char(137),char(255),char(133),char(0),char(5),char(2),char(141), +char(255),char(133),char(0),char(5),char(2),char(178),char(255),char(133),char(0),char(5), +char(2),char(180),char(255),char(133),char(0),char(5),char(2),char(206),char(255),char(133), +char(0),char(5),char(2),char(207),char(255),char(113),char(0),char(5),char(2),char(217), +char(255),char(113),char(0),char(5),char(2),char(218),char(255),char(215),char(0),char(5), +char(2),char(219),char(255),char(113),char(0),char(5),char(2),char(220),char(255),char(215), +char(0),char(5),char(2),char(221),char(255),char(113),char(0),char(5),char(2),char(222), +char(255),char(215),char(0),char(5),char(2),char(224),char(255),char(133),char(0),char(5), +char(2),char(226),char(255),char(215),char(0),char(5),char(2),char(228),char(255),char(215), +char(0),char(5),char(2),char(240),char(255),char(133),char(0),char(5),char(2),char(242), +char(255),char(133),char(0),char(5),char(2),char(244),char(255),char(133),char(0),char(5), +char(3),char(9),char(255),char(113),char(0),char(5),char(3),char(10),char(255),char(133), +char(0),char(5),char(3),char(11),char(255),char(113),char(0),char(5),char(3),char(12), +char(255),char(133),char(0),char(5),char(3),char(17),char(255),char(133),char(0),char(5), +char(3),char(18),char(255),char(113),char(0),char(5),char(3),char(22),char(255),char(133), +char(0),char(5),char(3),char(26),char(255),char(133),char(0),char(5),char(3),char(27), +char(255),char(133),char(0),char(5),char(3),char(28),char(255),char(113),char(0),char(5), +char(3),char(29),char(255),char(113),char(0),char(5),char(3),char(30),char(255),char(174), +char(0),char(5),char(3),char(31),char(255),char(113),char(0),char(5),char(3),char(32), +char(255),char(174),char(0),char(5),char(3),char(33),char(255),char(113),char(0),char(5), +char(3),char(34),char(255),char(174),char(0),char(5),char(3),char(35),char(255),char(113), +char(0),char(5),char(3),char(37),char(255),char(113),char(0),char(5),char(3),char(38), +char(255),char(174),char(0),char(5),char(3),char(39),char(255),char(113),char(0),char(5), +char(3),char(40),char(255),char(174),char(0),char(5),char(3),char(41),char(255),char(113), +char(0),char(5),char(3),char(42),char(255),char(174),char(0),char(5),char(3),char(43), +char(255),char(113),char(0),char(5),char(3),char(44),char(255),char(174),char(0),char(5), +char(3),char(45),char(255),char(113),char(0),char(5),char(3),char(46),char(255),char(174), +char(0),char(5),char(3),char(47),char(255),char(113),char(0),char(5),char(3),char(48), +char(255),char(174),char(0),char(5),char(3),char(49),char(255),char(113),char(0),char(5), +char(3),char(50),char(255),char(174),char(0),char(5),char(3),char(51),char(255),char(113), +char(0),char(5),char(3),char(52),char(255),char(174),char(0),char(5),char(3),char(54), +char(255),char(133),char(0),char(5),char(3),char(56),char(255),char(133),char(0),char(5), +char(3),char(58),char(255),char(133),char(0),char(5),char(3),char(60),char(255),char(133), +char(0),char(5),char(3),char(64),char(255),char(133),char(0),char(5),char(3),char(66), +char(255),char(133),char(0),char(5),char(3),char(68),char(255),char(133),char(0),char(5), +char(3),char(74),char(255),char(133),char(0),char(5),char(3),char(76),char(255),char(133), +char(0),char(5),char(3),char(78),char(255),char(133),char(0),char(5),char(3),char(82), +char(255),char(133),char(0),char(5),char(3),char(84),char(255),char(133),char(0),char(5), +char(3),char(86),char(255),char(133),char(0),char(5),char(3),char(88),char(255),char(133), +char(0),char(5),char(3),char(90),char(255),char(133),char(0),char(5),char(3),char(92), +char(255),char(133),char(0),char(5),char(3),char(94),char(255),char(133),char(0),char(5), +char(3),char(96),char(255),char(133),char(0),char(5),char(3),char(98),char(255),char(195), +char(0),char(5),char(3),char(100),char(255),char(195),char(0),char(5),char(3),char(102), +char(255),char(195),char(0),char(5),char(3),char(104),char(255),char(195),char(0),char(5), +char(3),char(106),char(255),char(195),char(0),char(5),char(3),char(108),char(255),char(195), +char(0),char(5),char(3),char(110),char(255),char(195),char(0),char(5),char(3),char(111), +char(0),char(20),char(0),char(5),char(3),char(113),char(0),char(20),char(0),char(5), +char(3),char(115),char(0),char(20),char(0),char(5),char(3),char(143),char(0),char(41), +char(0),char(10),char(0),char(36),char(255),char(113),char(0),char(10),char(0),char(55), +char(0),char(41),char(0),char(10),char(0),char(57),char(0),char(41),char(0),char(10), +char(0),char(58),char(0),char(41),char(0),char(10),char(0),char(60),char(0),char(20), +char(0),char(10),char(0),char(68),char(255),char(174),char(0),char(10),char(0),char(70), +char(255),char(133),char(0),char(10),char(0),char(71),char(255),char(133),char(0),char(10), +char(0),char(72),char(255),char(133),char(0),char(10),char(0),char(74),char(255),char(195), +char(0),char(10),char(0),char(80),char(255),char(195),char(0),char(10),char(0),char(81), +char(255),char(195),char(0),char(10),char(0),char(82),char(255),char(133),char(0),char(10), +char(0),char(83),char(255),char(195),char(0),char(10),char(0),char(84),char(255),char(133), +char(0),char(10),char(0),char(85),char(255),char(195),char(0),char(10),char(0),char(86), +char(255),char(195),char(0),char(10),char(0),char(88),char(255),char(195),char(0),char(10), +char(0),char(130),char(255),char(113),char(0),char(10),char(0),char(131),char(255),char(113), +char(0),char(10),char(0),char(132),char(255),char(113),char(0),char(10),char(0),char(133), +char(255),char(113),char(0),char(10),char(0),char(134),char(255),char(113),char(0),char(10), +char(0),char(135),char(255),char(113),char(0),char(10),char(0),char(159),char(0),char(20), +char(0),char(10),char(0),char(162),char(255),char(133),char(0),char(10),char(0),char(163), +char(255),char(174),char(0),char(10),char(0),char(164),char(255),char(174),char(0),char(10), +char(0),char(165),char(255),char(174),char(0),char(10),char(0),char(166),char(255),char(174), +char(0),char(10),char(0),char(167),char(255),char(174),char(0),char(10),char(0),char(168), +char(255),char(174),char(0),char(10),char(0),char(169),char(255),char(133),char(0),char(10), +char(0),char(170),char(255),char(133),char(0),char(10),char(0),char(171),char(255),char(133), +char(0),char(10),char(0),char(172),char(255),char(133),char(0),char(10),char(0),char(173), +char(255),char(133),char(0),char(10),char(0),char(180),char(255),char(133),char(0),char(10), +char(0),char(181),char(255),char(133),char(0),char(10),char(0),char(182),char(255),char(133), +char(0),char(10),char(0),char(183),char(255),char(133),char(0),char(10),char(0),char(184), +char(255),char(133),char(0),char(10),char(0),char(186),char(255),char(133),char(0),char(10), +char(0),char(187),char(255),char(195),char(0),char(10),char(0),char(188),char(255),char(195), +char(0),char(10),char(0),char(189),char(255),char(195),char(0),char(10),char(0),char(190), +char(255),char(195),char(0),char(10),char(0),char(194),char(255),char(113),char(0),char(10), +char(0),char(195),char(255),char(174),char(0),char(10),char(0),char(196),char(255),char(113), +char(0),char(10),char(0),char(197),char(255),char(174),char(0),char(10),char(0),char(198), +char(255),char(113),char(0),char(10),char(0),char(199),char(255),char(174),char(0),char(10), +char(0),char(201),char(255),char(133),char(0),char(10),char(0),char(203),char(255),char(133), +char(0),char(10),char(0),char(205),char(255),char(133),char(0),char(10),char(0),char(207), +char(255),char(133),char(0),char(10),char(0),char(209),char(255),char(133),char(0),char(10), +char(0),char(211),char(255),char(133),char(0),char(10),char(0),char(213),char(255),char(133), +char(0),char(10),char(0),char(215),char(255),char(133),char(0),char(10),char(0),char(217), +char(255),char(133),char(0),char(10),char(0),char(219),char(255),char(133),char(0),char(10), +char(0),char(221),char(255),char(133),char(0),char(10),char(0),char(223),char(255),char(195), +char(0),char(10),char(0),char(225),char(255),char(195),char(0),char(10),char(0),char(227), +char(255),char(195),char(0),char(10),char(0),char(229),char(255),char(195),char(0),char(10), +char(0),char(250),char(255),char(195),char(0),char(10),char(1),char(6),char(255),char(195), +char(0),char(10),char(1),char(8),char(255),char(195),char(0),char(10),char(1),char(13), +char(255),char(195),char(0),char(10),char(1),char(15),char(255),char(133),char(0),char(10), +char(1),char(17),char(255),char(133),char(0),char(10),char(1),char(19),char(255),char(133), +char(0),char(10),char(1),char(21),char(255),char(133),char(0),char(10),char(1),char(23), +char(255),char(195),char(0),char(10),char(1),char(25),char(255),char(195),char(0),char(10), +char(1),char(29),char(255),char(195),char(0),char(10),char(1),char(33),char(255),char(195), +char(0),char(10),char(1),char(36),char(0),char(41),char(0),char(10),char(1),char(38), +char(0),char(41),char(0),char(10),char(1),char(43),char(255),char(195),char(0),char(10), +char(1),char(45),char(255),char(195),char(0),char(10),char(1),char(47),char(255),char(195), +char(0),char(10),char(1),char(49),char(255),char(195),char(0),char(10),char(1),char(51), +char(255),char(195),char(0),char(10),char(1),char(53),char(255),char(195),char(0),char(10), +char(1),char(54),char(0),char(41),char(0),char(10),char(1),char(56),char(0),char(20), +char(0),char(10),char(1),char(58),char(0),char(20),char(0),char(10),char(1),char(67), +char(255),char(113),char(0),char(10),char(1),char(68),char(255),char(174),char(0),char(10), +char(1),char(70),char(255),char(174),char(0),char(10),char(1),char(72),char(255),char(133), +char(0),char(10),char(1),char(74),char(255),char(195),char(0),char(10),char(1),char(86), +char(255),char(113),char(0),char(10),char(1),char(95),char(255),char(113),char(0),char(10), +char(1),char(98),char(255),char(113),char(0),char(10),char(1),char(105),char(255),char(113), +char(0),char(10),char(1),char(121),char(255),char(174),char(0),char(10),char(1),char(122), +char(255),char(215),char(0),char(10),char(1),char(123),char(255),char(215),char(0),char(10), +char(1),char(126),char(255),char(174),char(0),char(10),char(1),char(129),char(255),char(195), +char(0),char(10),char(1),char(130),char(255),char(215),char(0),char(10),char(1),char(131), +char(255),char(215),char(0),char(10),char(1),char(132),char(255),char(215),char(0),char(10), +char(1),char(135),char(255),char(215),char(0),char(10),char(1),char(137),char(255),char(215), +char(0),char(10),char(1),char(140),char(255),char(174),char(0),char(10),char(1),char(142), +char(255),char(195),char(0),char(10),char(1),char(143),char(255),char(174),char(0),char(10), +char(1),char(144),char(255),char(174),char(0),char(10),char(1),char(147),char(255),char(174), +char(0),char(10),char(1),char(153),char(255),char(174),char(0),char(10),char(1),char(164), +char(255),char(133),char(0),char(10),char(1),char(170),char(255),char(113),char(0),char(10), +char(1),char(174),char(255),char(133),char(0),char(10),char(1),char(181),char(255),char(133), +char(0),char(10),char(1),char(202),char(255),char(215),char(0),char(10),char(1),char(206), +char(255),char(113),char(0),char(10),char(1),char(207),char(255),char(133),char(0),char(10), +char(1),char(213),char(255),char(113),char(0),char(10),char(1),char(216),char(255),char(133), +char(0),char(10),char(1),char(219),char(255),char(133),char(0),char(10),char(1),char(222), +char(255),char(133),char(0),char(10),char(1),char(234),char(255),char(133),char(0),char(10), +char(1),char(237),char(255),char(133),char(0),char(10),char(1),char(238),char(255),char(195), +char(0),char(10),char(1),char(242),char(255),char(113),char(0),char(10),char(1),char(250), +char(0),char(41),char(0),char(10),char(1),char(252),char(0),char(41),char(0),char(10), +char(1),char(254),char(0),char(41),char(0),char(10),char(2),char(0),char(0),char(20), +char(0),char(10),char(2),char(87),char(255),char(195),char(0),char(10),char(2),char(88), +char(255),char(113),char(0),char(10),char(2),char(89),char(255),char(174),char(0),char(10), +char(2),char(96),char(255),char(133),char(0),char(10),char(2),char(98),char(255),char(195), +char(0),char(10),char(2),char(106),char(255),char(133),char(0),char(10),char(2),char(114), +char(255),char(113),char(0),char(10),char(2),char(115),char(255),char(113),char(0),char(10), +char(2),char(125),char(255),char(236),char(0),char(10),char(2),char(127),char(255),char(133), +char(0),char(10),char(2),char(133),char(255),char(133),char(0),char(10),char(2),char(135), +char(255),char(133),char(0),char(10),char(2),char(137),char(255),char(133),char(0),char(10), +char(2),char(141),char(255),char(133),char(0),char(10),char(2),char(178),char(255),char(133), +char(0),char(10),char(2),char(180),char(255),char(133),char(0),char(10),char(2),char(206), +char(255),char(133),char(0),char(10),char(2),char(207),char(255),char(113),char(0),char(10), +char(2),char(217),char(255),char(113),char(0),char(10),char(2),char(218),char(255),char(215), +char(0),char(10),char(2),char(219),char(255),char(113),char(0),char(10),char(2),char(220), +char(255),char(215),char(0),char(10),char(2),char(221),char(255),char(113),char(0),char(10), +char(2),char(222),char(255),char(215),char(0),char(10),char(2),char(224),char(255),char(133), +char(0),char(10),char(2),char(226),char(255),char(215),char(0),char(10),char(2),char(228), +char(255),char(215),char(0),char(10),char(2),char(240),char(255),char(133),char(0),char(10), +char(2),char(242),char(255),char(133),char(0),char(10),char(2),char(244),char(255),char(133), +char(0),char(10),char(3),char(9),char(255),char(113),char(0),char(10),char(3),char(10), +char(255),char(133),char(0),char(10),char(3),char(11),char(255),char(113),char(0),char(10), +char(3),char(12),char(255),char(133),char(0),char(10),char(3),char(17),char(255),char(133), +char(0),char(10),char(3),char(18),char(255),char(113),char(0),char(10),char(3),char(22), +char(255),char(133),char(0),char(10),char(3),char(26),char(255),char(133),char(0),char(10), +char(3),char(27),char(255),char(133),char(0),char(10),char(3),char(28),char(255),char(113), +char(0),char(10),char(3),char(29),char(255),char(113),char(0),char(10),char(3),char(30), +char(255),char(174),char(0),char(10),char(3),char(31),char(255),char(113),char(0),char(10), +char(3),char(32),char(255),char(174),char(0),char(10),char(3),char(33),char(255),char(113), +char(0),char(10),char(3),char(34),char(255),char(174),char(0),char(10),char(3),char(35), +char(255),char(113),char(0),char(10),char(3),char(37),char(255),char(113),char(0),char(10), +char(3),char(38),char(255),char(174),char(0),char(10),char(3),char(39),char(255),char(113), +char(0),char(10),char(3),char(40),char(255),char(174),char(0),char(10),char(3),char(41), +char(255),char(113),char(0),char(10),char(3),char(42),char(255),char(174),char(0),char(10), +char(3),char(43),char(255),char(113),char(0),char(10),char(3),char(44),char(255),char(174), +char(0),char(10),char(3),char(45),char(255),char(113),char(0),char(10),char(3),char(46), +char(255),char(174),char(0),char(10),char(3),char(47),char(255),char(113),char(0),char(10), +char(3),char(48),char(255),char(174),char(0),char(10),char(3),char(49),char(255),char(113), +char(0),char(10),char(3),char(50),char(255),char(174),char(0),char(10),char(3),char(51), +char(255),char(113),char(0),char(10),char(3),char(52),char(255),char(174),char(0),char(10), +char(3),char(54),char(255),char(133),char(0),char(10),char(3),char(56),char(255),char(133), +char(0),char(10),char(3),char(58),char(255),char(133),char(0),char(10),char(3),char(60), +char(255),char(133),char(0),char(10),char(3),char(64),char(255),char(133),char(0),char(10), +char(3),char(66),char(255),char(133),char(0),char(10),char(3),char(68),char(255),char(133), +char(0),char(10),char(3),char(74),char(255),char(133),char(0),char(10),char(3),char(76), +char(255),char(133),char(0),char(10),char(3),char(78),char(255),char(133),char(0),char(10), +char(3),char(82),char(255),char(133),char(0),char(10),char(3),char(84),char(255),char(133), +char(0),char(10),char(3),char(86),char(255),char(133),char(0),char(10),char(3),char(88), +char(255),char(133),char(0),char(10),char(3),char(90),char(255),char(133),char(0),char(10), +char(3),char(92),char(255),char(133),char(0),char(10),char(3),char(94),char(255),char(133), +char(0),char(10),char(3),char(96),char(255),char(133),char(0),char(10),char(3),char(98), +char(255),char(195),char(0),char(10),char(3),char(100),char(255),char(195),char(0),char(10), +char(3),char(102),char(255),char(195),char(0),char(10),char(3),char(104),char(255),char(195), +char(0),char(10),char(3),char(106),char(255),char(195),char(0),char(10),char(3),char(108), +char(255),char(195),char(0),char(10),char(3),char(110),char(255),char(195),char(0),char(10), +char(3),char(111),char(0),char(20),char(0),char(10),char(3),char(113),char(0),char(20), +char(0),char(10),char(3),char(115),char(0),char(20),char(0),char(10),char(3),char(143), +char(0),char(41),char(0),char(11),char(0),char(45),char(0),char(184),char(0),char(15), +char(0),char(38),char(255),char(154),char(0),char(15),char(0),char(42),char(255),char(154), +char(0),char(15),char(0),char(50),char(255),char(154),char(0),char(15),char(0),char(52), +char(255),char(154),char(0),char(15),char(0),char(55),char(255),char(113),char(0),char(15), +char(0),char(56),char(255),char(215),char(0),char(15),char(0),char(57),char(255),char(133), +char(0),char(15),char(0),char(58),char(255),char(133),char(0),char(15),char(0),char(60), +char(255),char(133),char(0),char(15),char(0),char(137),char(255),char(154),char(0),char(15), +char(0),char(148),char(255),char(154),char(0),char(15),char(0),char(149),char(255),char(154), +char(0),char(15),char(0),char(150),char(255),char(154),char(0),char(15),char(0),char(151), +char(255),char(154),char(0),char(15),char(0),char(152),char(255),char(154),char(0),char(15), +char(0),char(154),char(255),char(154),char(0),char(15),char(0),char(155),char(255),char(215), +char(0),char(15),char(0),char(156),char(255),char(215),char(0),char(15),char(0),char(157), +char(255),char(215),char(0),char(15),char(0),char(158),char(255),char(215),char(0),char(15), +char(0),char(159),char(255),char(133),char(0),char(15),char(0),char(200),char(255),char(154), +char(0),char(15),char(0),char(202),char(255),char(154),char(0),char(15),char(0),char(204), +char(255),char(154),char(0),char(15),char(0),char(206),char(255),char(154),char(0),char(15), +char(0),char(222),char(255),char(154),char(0),char(15),char(0),char(224),char(255),char(154), +char(0),char(15),char(0),char(226),char(255),char(154),char(0),char(15),char(0),char(228), +char(255),char(154),char(0),char(15),char(1),char(14),char(255),char(154),char(0),char(15), +char(1),char(16),char(255),char(154),char(0),char(15),char(1),char(18),char(255),char(154), +char(0),char(15),char(1),char(20),char(255),char(154),char(0),char(15),char(1),char(36), +char(255),char(113),char(0),char(15),char(1),char(38),char(255),char(113),char(0),char(15), +char(1),char(42),char(255),char(215),char(0),char(15),char(1),char(44),char(255),char(215), +char(0),char(15),char(1),char(46),char(255),char(215),char(0),char(15),char(1),char(48), +char(255),char(215),char(0),char(15),char(1),char(50),char(255),char(215),char(0),char(15), +char(1),char(52),char(255),char(215),char(0),char(15),char(1),char(54),char(255),char(133), +char(0),char(15),char(1),char(56),char(255),char(133),char(0),char(15),char(1),char(58), +char(255),char(133),char(0),char(15),char(1),char(71),char(255),char(154),char(0),char(15), +char(1),char(102),char(255),char(174),char(0),char(15),char(1),char(109),char(255),char(174), +char(0),char(15),char(1),char(113),char(255),char(113),char(0),char(15),char(1),char(114), +char(255),char(133),char(0),char(15),char(1),char(115),char(255),char(154),char(0),char(15), +char(1),char(117),char(255),char(133),char(0),char(15),char(1),char(120),char(255),char(133), +char(0),char(15),char(1),char(133),char(255),char(215),char(0),char(15),char(1),char(157), +char(255),char(113),char(0),char(15),char(1),char(159),char(255),char(154),char(0),char(15), +char(1),char(166),char(255),char(113),char(0),char(15),char(1),char(184),char(255),char(154), +char(0),char(15),char(1),char(187),char(255),char(154),char(0),char(15),char(1),char(188), +char(255),char(113),char(0),char(15),char(1),char(190),char(255),char(174),char(0),char(15), +char(1),char(193),char(255),char(92),char(0),char(15),char(1),char(196),char(255),char(113), +char(0),char(15),char(1),char(220),char(255),char(154),char(0),char(15),char(1),char(225), +char(255),char(133),char(0),char(15),char(1),char(228),char(255),char(154),char(0),char(15), +char(1),char(250),char(255),char(133),char(0),char(15),char(1),char(252),char(255),char(133), +char(0),char(15),char(1),char(254),char(255),char(133),char(0),char(15),char(2),char(0), +char(255),char(133),char(0),char(15),char(2),char(84),char(255),char(133),char(0),char(15), +char(2),char(95),char(255),char(154),char(0),char(15),char(2),char(97),char(255),char(215), +char(0),char(15),char(2),char(108),char(255),char(154),char(0),char(15),char(2),char(124), +char(255),char(92),char(0),char(15),char(2),char(126),char(255),char(154),char(0),char(15), +char(2),char(128),char(255),char(133),char(0),char(15),char(2),char(130),char(255),char(133), +char(0),char(15),char(2),char(132),char(255),char(154),char(0),char(15),char(2),char(134), +char(255),char(154),char(0),char(15),char(2),char(136),char(255),char(154),char(0),char(15), +char(2),char(138),char(255),char(154),char(0),char(15),char(2),char(140),char(255),char(154), +char(0),char(15),char(2),char(169),char(255),char(113),char(0),char(15),char(2),char(170), +char(255),char(154),char(0),char(15),char(2),char(177),char(255),char(154),char(0),char(15), +char(2),char(179),char(255),char(154),char(0),char(15),char(2),char(181),char(255),char(113), +char(0),char(15),char(2),char(182),char(255),char(154),char(0),char(15),char(2),char(183), +char(255),char(133),char(0),char(15),char(2),char(185),char(255),char(133),char(0),char(15), +char(2),char(189),char(255),char(113),char(0),char(15),char(2),char(190),char(255),char(154), +char(0),char(15),char(2),char(191),char(255),char(92),char(0),char(15),char(2),char(192), +char(255),char(133),char(0),char(15),char(2),char(193),char(255),char(92),char(0),char(15), +char(2),char(194),char(255),char(133),char(0),char(15),char(2),char(197),char(255),char(133), +char(0),char(15),char(2),char(199),char(255),char(133),char(0),char(15),char(2),char(212), +char(255),char(92),char(0),char(15),char(2),char(213),char(255),char(133),char(0),char(15), +char(2),char(239),char(255),char(154),char(0),char(15),char(2),char(241),char(255),char(154), +char(0),char(15),char(2),char(243),char(255),char(154),char(0),char(15),char(2),char(253), +char(255),char(92),char(0),char(15),char(2),char(254),char(255),char(133),char(0),char(15), +char(3),char(13),char(255),char(133),char(0),char(15),char(3),char(14),char(255),char(154), +char(0),char(15),char(3),char(15),char(255),char(133),char(0),char(15),char(3),char(16), +char(255),char(154),char(0),char(15),char(3),char(21),char(255),char(154),char(0),char(15), +char(3),char(23),char(255),char(113),char(0),char(15),char(3),char(24),char(255),char(154), +char(0),char(15),char(3),char(73),char(255),char(154),char(0),char(15),char(3),char(75), +char(255),char(154),char(0),char(15),char(3),char(77),char(255),char(154),char(0),char(15), +char(3),char(79),char(255),char(154),char(0),char(15),char(3),char(81),char(255),char(154), +char(0),char(15),char(3),char(83),char(255),char(154),char(0),char(15),char(3),char(85), +char(255),char(154),char(0),char(15),char(3),char(87),char(255),char(154),char(0),char(15), +char(3),char(89),char(255),char(154),char(0),char(15),char(3),char(91),char(255),char(154), +char(0),char(15),char(3),char(93),char(255),char(154),char(0),char(15),char(3),char(95), +char(255),char(154),char(0),char(15),char(3),char(97),char(255),char(215),char(0),char(15), +char(3),char(99),char(255),char(215),char(0),char(15),char(3),char(101),char(255),char(215), +char(0),char(15),char(3),char(103),char(255),char(215),char(0),char(15),char(3),char(105), +char(255),char(215),char(0),char(15),char(3),char(107),char(255),char(215),char(0),char(15), +char(3),char(109),char(255),char(215),char(0),char(15),char(3),char(111),char(255),char(133), +char(0),char(15),char(3),char(113),char(255),char(133),char(0),char(15),char(3),char(115), +char(255),char(133),char(0),char(15),char(3),char(143),char(255),char(113),char(0),char(16), +char(0),char(55),char(255),char(174),char(0),char(16),char(1),char(36),char(255),char(174), +char(0),char(16),char(1),char(38),char(255),char(174),char(0),char(16),char(1),char(113), +char(255),char(174),char(0),char(16),char(1),char(157),char(255),char(174),char(0),char(16), +char(1),char(166),char(255),char(174),char(0),char(16),char(1),char(188),char(255),char(174), +char(0),char(16),char(1),char(196),char(255),char(174),char(0),char(16),char(1),char(220), +char(255),char(215),char(0),char(16),char(1),char(228),char(255),char(215),char(0),char(16), +char(2),char(169),char(255),char(174),char(0),char(16),char(2),char(170),char(255),char(215), +char(0),char(16),char(2),char(181),char(255),char(174),char(0),char(16),char(2),char(182), +char(255),char(215),char(0),char(16),char(2),char(189),char(255),char(174),char(0),char(16), +char(2),char(190),char(255),char(215),char(0),char(16),char(3),char(23),char(255),char(174), +char(0),char(16),char(3),char(24),char(255),char(215),char(0),char(16),char(3),char(143), +char(255),char(174),char(0),char(17),char(0),char(38),char(255),char(154),char(0),char(17), +char(0),char(42),char(255),char(154),char(0),char(17),char(0),char(50),char(255),char(154), +char(0),char(17),char(0),char(52),char(255),char(154),char(0),char(17),char(0),char(55), +char(255),char(113),char(0),char(17),char(0),char(56),char(255),char(215),char(0),char(17), +char(0),char(57),char(255),char(133),char(0),char(17),char(0),char(58),char(255),char(133), +char(0),char(17),char(0),char(60),char(255),char(133),char(0),char(17),char(0),char(137), +char(255),char(154),char(0),char(17),char(0),char(148),char(255),char(154),char(0),char(17), +char(0),char(149),char(255),char(154),char(0),char(17),char(0),char(150),char(255),char(154), +char(0),char(17),char(0),char(151),char(255),char(154),char(0),char(17),char(0),char(152), +char(255),char(154),char(0),char(17),char(0),char(154),char(255),char(154),char(0),char(17), +char(0),char(155),char(255),char(215),char(0),char(17),char(0),char(156),char(255),char(215), +char(0),char(17),char(0),char(157),char(255),char(215),char(0),char(17),char(0),char(158), +char(255),char(215),char(0),char(17),char(0),char(159),char(255),char(133),char(0),char(17), +char(0),char(200),char(255),char(154),char(0),char(17),char(0),char(202),char(255),char(154), +char(0),char(17),char(0),char(204),char(255),char(154),char(0),char(17),char(0),char(206), +char(255),char(154),char(0),char(17),char(0),char(222),char(255),char(154),char(0),char(17), +char(0),char(224),char(255),char(154),char(0),char(17),char(0),char(226),char(255),char(154), +char(0),char(17),char(0),char(228),char(255),char(154),char(0),char(17),char(1),char(14), +char(255),char(154),char(0),char(17),char(1),char(16),char(255),char(154),char(0),char(17), +char(1),char(18),char(255),char(154),char(0),char(17),char(1),char(20),char(255),char(154), +char(0),char(17),char(1),char(36),char(255),char(113),char(0),char(17),char(1),char(38), +char(255),char(113),char(0),char(17),char(1),char(42),char(255),char(215),char(0),char(17), +char(1),char(44),char(255),char(215),char(0),char(17),char(1),char(46),char(255),char(215), +char(0),char(17),char(1),char(48),char(255),char(215),char(0),char(17),char(1),char(50), +char(255),char(215),char(0),char(17),char(1),char(52),char(255),char(215),char(0),char(17), +char(1),char(54),char(255),char(133),char(0),char(17),char(1),char(56),char(255),char(133), +char(0),char(17),char(1),char(58),char(255),char(133),char(0),char(17),char(1),char(71), +char(255),char(154),char(0),char(17),char(1),char(102),char(255),char(174),char(0),char(17), +char(1),char(109),char(255),char(174),char(0),char(17),char(1),char(113),char(255),char(113), +char(0),char(17),char(1),char(114),char(255),char(133),char(0),char(17),char(1),char(115), +char(255),char(154),char(0),char(17),char(1),char(117),char(255),char(133),char(0),char(17), +char(1),char(120),char(255),char(133),char(0),char(17),char(1),char(133),char(255),char(215), +char(0),char(17),char(1),char(157),char(255),char(113),char(0),char(17),char(1),char(159), +char(255),char(154),char(0),char(17),char(1),char(166),char(255),char(113),char(0),char(17), +char(1),char(184),char(255),char(154),char(0),char(17),char(1),char(187),char(255),char(154), +char(0),char(17),char(1),char(188),char(255),char(113),char(0),char(17),char(1),char(190), +char(255),char(174),char(0),char(17),char(1),char(193),char(255),char(92),char(0),char(17), +char(1),char(196),char(255),char(113),char(0),char(17),char(1),char(220),char(255),char(154), +char(0),char(17),char(1),char(225),char(255),char(133),char(0),char(17),char(1),char(228), +char(255),char(154),char(0),char(17),char(1),char(250),char(255),char(133),char(0),char(17), +char(1),char(252),char(255),char(133),char(0),char(17),char(1),char(254),char(255),char(133), +char(0),char(17),char(2),char(0),char(255),char(133),char(0),char(17),char(2),char(84), +char(255),char(133),char(0),char(17),char(2),char(95),char(255),char(154),char(0),char(17), +char(2),char(97),char(255),char(215),char(0),char(17),char(2),char(108),char(255),char(154), +char(0),char(17),char(2),char(124),char(255),char(92),char(0),char(17),char(2),char(126), +char(255),char(154),char(0),char(17),char(2),char(128),char(255),char(133),char(0),char(17), +char(2),char(130),char(255),char(133),char(0),char(17),char(2),char(132),char(255),char(154), +char(0),char(17),char(2),char(134),char(255),char(154),char(0),char(17),char(2),char(136), +char(255),char(154),char(0),char(17),char(2),char(138),char(255),char(154),char(0),char(17), +char(2),char(140),char(255),char(154),char(0),char(17),char(2),char(169),char(255),char(113), +char(0),char(17),char(2),char(170),char(255),char(154),char(0),char(17),char(2),char(177), +char(255),char(154),char(0),char(17),char(2),char(179),char(255),char(154),char(0),char(17), +char(2),char(181),char(255),char(113),char(0),char(17),char(2),char(182),char(255),char(154), +char(0),char(17),char(2),char(183),char(255),char(133),char(0),char(17),char(2),char(185), +char(255),char(133),char(0),char(17),char(2),char(189),char(255),char(113),char(0),char(17), +char(2),char(190),char(255),char(154),char(0),char(17),char(2),char(191),char(255),char(92), +char(0),char(17),char(2),char(192),char(255),char(133),char(0),char(17),char(2),char(193), +char(255),char(92),char(0),char(17),char(2),char(194),char(255),char(133),char(0),char(17), +char(2),char(197),char(255),char(133),char(0),char(17),char(2),char(199),char(255),char(133), +char(0),char(17),char(2),char(212),char(255),char(92),char(0),char(17),char(2),char(213), +char(255),char(133),char(0),char(17),char(2),char(239),char(255),char(154),char(0),char(17), +char(2),char(241),char(255),char(154),char(0),char(17),char(2),char(243),char(255),char(154), +char(0),char(17),char(2),char(253),char(255),char(92),char(0),char(17),char(2),char(254), +char(255),char(133),char(0),char(17),char(3),char(13),char(255),char(133),char(0),char(17), +char(3),char(14),char(255),char(154),char(0),char(17),char(3),char(15),char(255),char(133), +char(0),char(17),char(3),char(16),char(255),char(154),char(0),char(17),char(3),char(21), +char(255),char(154),char(0),char(17),char(3),char(23),char(255),char(113),char(0),char(17), +char(3),char(24),char(255),char(154),char(0),char(17),char(3),char(73),char(255),char(154), +char(0),char(17),char(3),char(75),char(255),char(154),char(0),char(17),char(3),char(77), +char(255),char(154),char(0),char(17),char(3),char(79),char(255),char(154),char(0),char(17), +char(3),char(81),char(255),char(154),char(0),char(17),char(3),char(83),char(255),char(154), +char(0),char(17),char(3),char(85),char(255),char(154),char(0),char(17),char(3),char(87), +char(255),char(154),char(0),char(17),char(3),char(89),char(255),char(154),char(0),char(17), +char(3),char(91),char(255),char(154),char(0),char(17),char(3),char(93),char(255),char(154), +char(0),char(17),char(3),char(95),char(255),char(154),char(0),char(17),char(3),char(97), +char(255),char(215),char(0),char(17),char(3),char(99),char(255),char(215),char(0),char(17), +char(3),char(101),char(255),char(215),char(0),char(17),char(3),char(103),char(255),char(215), +char(0),char(17),char(3),char(105),char(255),char(215),char(0),char(17),char(3),char(107), +char(255),char(215),char(0),char(17),char(3),char(109),char(255),char(215),char(0),char(17), +char(3),char(111),char(255),char(133),char(0),char(17),char(3),char(113),char(255),char(133), +char(0),char(17),char(3),char(115),char(255),char(133),char(0),char(17),char(3),char(143), +char(255),char(113),char(0),char(36),char(0),char(5),char(255),char(113),char(0),char(36), +char(0),char(10),char(255),char(113),char(0),char(36),char(0),char(38),char(255),char(215), +char(0),char(36),char(0),char(42),char(255),char(215),char(0),char(36),char(0),char(45), +char(1),char(10),char(0),char(36),char(0),char(50),char(255),char(215),char(0),char(36), +char(0),char(52),char(255),char(215),char(0),char(36),char(0),char(55),char(255),char(113), +char(0),char(36),char(0),char(57),char(255),char(174),char(0),char(36),char(0),char(58), +char(255),char(174),char(0),char(36),char(0),char(60),char(255),char(133),char(0),char(36), +char(0),char(137),char(255),char(215),char(0),char(36),char(0),char(148),char(255),char(215), +char(0),char(36),char(0),char(149),char(255),char(215),char(0),char(36),char(0),char(150), +char(255),char(215),char(0),char(36),char(0),char(151),char(255),char(215),char(0),char(36), +char(0),char(152),char(255),char(215),char(0),char(36),char(0),char(154),char(255),char(215), +char(0),char(36),char(0),char(159),char(255),char(133),char(0),char(36),char(0),char(200), +char(255),char(215),char(0),char(36),char(0),char(202),char(255),char(215),char(0),char(36), +char(0),char(204),char(255),char(215),char(0),char(36),char(0),char(206),char(255),char(215), +char(0),char(36),char(0),char(222),char(255),char(215),char(0),char(36),char(0),char(224), +char(255),char(215),char(0),char(36),char(0),char(226),char(255),char(215),char(0),char(36), +char(0),char(228),char(255),char(215),char(0),char(36),char(1),char(14),char(255),char(215), +char(0),char(36),char(1),char(16),char(255),char(215),char(0),char(36),char(1),char(18), +char(255),char(215),char(0),char(36),char(1),char(20),char(255),char(215),char(0),char(36), +char(1),char(36),char(255),char(113),char(0),char(36),char(1),char(38),char(255),char(113), +char(0),char(36),char(1),char(54),char(255),char(174),char(0),char(36),char(1),char(56), +char(255),char(133),char(0),char(36),char(1),char(58),char(255),char(133),char(0),char(36), +char(1),char(71),char(255),char(215),char(0),char(36),char(1),char(250),char(255),char(174), +char(0),char(36),char(1),char(252),char(255),char(174),char(0),char(36),char(1),char(254), +char(255),char(174),char(0),char(36),char(2),char(0),char(255),char(133),char(0),char(36), +char(2),char(7),char(255),char(113),char(0),char(36),char(2),char(11),char(255),char(113), +char(0),char(36),char(2),char(95),char(255),char(215),char(0),char(36),char(3),char(73), +char(255),char(215),char(0),char(36),char(3),char(75),char(255),char(215),char(0),char(36), +char(3),char(77),char(255),char(215),char(0),char(36),char(3),char(79),char(255),char(215), +char(0),char(36),char(3),char(81),char(255),char(215),char(0),char(36),char(3),char(83), +char(255),char(215),char(0),char(36),char(3),char(85),char(255),char(215),char(0),char(36), +char(3),char(87),char(255),char(215),char(0),char(36),char(3),char(89),char(255),char(215), +char(0),char(36),char(3),char(91),char(255),char(215),char(0),char(36),char(3),char(93), +char(255),char(215),char(0),char(36),char(3),char(95),char(255),char(215),char(0),char(36), +char(3),char(111),char(255),char(133),char(0),char(36),char(3),char(113),char(255),char(133), +char(0),char(36),char(3),char(115),char(255),char(133),char(0),char(36),char(3),char(143), +char(255),char(113),char(0),char(37),char(0),char(15),char(255),char(174),char(0),char(37), +char(0),char(17),char(255),char(174),char(0),char(37),char(0),char(36),char(255),char(215), +char(0),char(37),char(0),char(55),char(255),char(195),char(0),char(37),char(0),char(57), +char(255),char(236),char(0),char(37),char(0),char(58),char(255),char(236),char(0),char(37), +char(0),char(59),char(255),char(215),char(0),char(37),char(0),char(60),char(255),char(236), +char(0),char(37),char(0),char(61),char(255),char(236),char(0),char(37),char(0),char(130), +char(255),char(215),char(0),char(37),char(0),char(131),char(255),char(215),char(0),char(37), +char(0),char(132),char(255),char(215),char(0),char(37),char(0),char(133),char(255),char(215), +char(0),char(37),char(0),char(134),char(255),char(215),char(0),char(37),char(0),char(135), +char(255),char(215),char(0),char(37),char(0),char(159),char(255),char(236),char(0),char(37), +char(0),char(194),char(255),char(215),char(0),char(37),char(0),char(196),char(255),char(215), +char(0),char(37),char(0),char(198),char(255),char(215),char(0),char(37),char(1),char(36), +char(255),char(195),char(0),char(37),char(1),char(38),char(255),char(195),char(0),char(37), +char(1),char(54),char(255),char(236),char(0),char(37),char(1),char(56),char(255),char(236), +char(0),char(37),char(1),char(58),char(255),char(236),char(0),char(37),char(1),char(59), +char(255),char(236),char(0),char(37),char(1),char(61),char(255),char(236),char(0),char(37), +char(1),char(63),char(255),char(236),char(0),char(37),char(1),char(67),char(255),char(215), +char(0),char(37),char(1),char(160),char(255),char(236),char(0),char(37),char(1),char(250), +char(255),char(236),char(0),char(37),char(1),char(252),char(255),char(236),char(0),char(37), +char(1),char(254),char(255),char(236),char(0),char(37),char(2),char(0),char(255),char(236), +char(0),char(37),char(2),char(8),char(255),char(174),char(0),char(37),char(2),char(12), +char(255),char(174),char(0),char(37),char(2),char(88),char(255),char(215),char(0),char(37), +char(3),char(29),char(255),char(215),char(0),char(37),char(3),char(31),char(255),char(215), +char(0),char(37),char(3),char(33),char(255),char(215),char(0),char(37),char(3),char(35), +char(255),char(215),char(0),char(37),char(3),char(37),char(255),char(215),char(0),char(37), +char(3),char(39),char(255),char(215),char(0),char(37),char(3),char(41),char(255),char(215), +char(0),char(37),char(3),char(43),char(255),char(215),char(0),char(37),char(3),char(45), +char(255),char(215),char(0),char(37),char(3),char(47),char(255),char(215),char(0),char(37), +char(3),char(49),char(255),char(215),char(0),char(37),char(3),char(51),char(255),char(215), +char(0),char(37),char(3),char(111),char(255),char(236),char(0),char(37),char(3),char(113), +char(255),char(236),char(0),char(37),char(3),char(115),char(255),char(236),char(0),char(37), +char(3),char(143),char(255),char(195),char(0),char(38),char(0),char(38),char(255),char(215), +char(0),char(38),char(0),char(42),char(255),char(215),char(0),char(38),char(0),char(50), +char(255),char(215),char(0),char(38),char(0),char(52),char(255),char(215),char(0),char(38), +char(0),char(137),char(255),char(215),char(0),char(38),char(0),char(148),char(255),char(215), +char(0),char(38),char(0),char(149),char(255),char(215),char(0),char(38),char(0),char(150), +char(255),char(215),char(0),char(38),char(0),char(151),char(255),char(215),char(0),char(38), +char(0),char(152),char(255),char(215),char(0),char(38),char(0),char(154),char(255),char(215), +char(0),char(38),char(0),char(200),char(255),char(215),char(0),char(38),char(0),char(202), +char(255),char(215),char(0),char(38),char(0),char(204),char(255),char(215),char(0),char(38), +char(0),char(206),char(255),char(215),char(0),char(38),char(0),char(222),char(255),char(215), +char(0),char(38),char(0),char(224),char(255),char(215),char(0),char(38),char(0),char(226), +char(255),char(215),char(0),char(38),char(0),char(228),char(255),char(215),char(0),char(38), +char(1),char(14),char(255),char(215),char(0),char(38),char(1),char(16),char(255),char(215), +char(0),char(38),char(1),char(18),char(255),char(215),char(0),char(38),char(1),char(20), +char(255),char(215),char(0),char(38),char(1),char(71),char(255),char(215),char(0),char(38), +char(2),char(95),char(255),char(215),char(0),char(38),char(3),char(73),char(255),char(215), +char(0),char(38),char(3),char(75),char(255),char(215),char(0),char(38),char(3),char(77), +char(255),char(215),char(0),char(38),char(3),char(79),char(255),char(215),char(0),char(38), +char(3),char(81),char(255),char(215),char(0),char(38),char(3),char(83),char(255),char(215), +char(0),char(38),char(3),char(85),char(255),char(215),char(0),char(38),char(3),char(87), +char(255),char(215),char(0),char(38),char(3),char(89),char(255),char(215),char(0),char(38), +char(3),char(91),char(255),char(215),char(0),char(38),char(3),char(93),char(255),char(215), +char(0),char(38),char(3),char(95),char(255),char(215),char(0),char(39),char(0),char(15), +char(255),char(174),char(0),char(39),char(0),char(17),char(255),char(174),char(0),char(39), +char(0),char(36),char(255),char(215),char(0),char(39),char(0),char(55),char(255),char(195), +char(0),char(39),char(0),char(57),char(255),char(236),char(0),char(39),char(0),char(58), +char(255),char(236),char(0),char(39),char(0),char(59),char(255),char(215),char(0),char(39), +char(0),char(60),char(255),char(236),char(0),char(39),char(0),char(61),char(255),char(236), +char(0),char(39),char(0),char(130),char(255),char(215),char(0),char(39),char(0),char(131), +char(255),char(215),char(0),char(39),char(0),char(132),char(255),char(215),char(0),char(39), +char(0),char(133),char(255),char(215),char(0),char(39),char(0),char(134),char(255),char(215), +char(0),char(39),char(0),char(135),char(255),char(215),char(0),char(39),char(0),char(159), +char(255),char(236),char(0),char(39),char(0),char(194),char(255),char(215),char(0),char(39), +char(0),char(196),char(255),char(215),char(0),char(39),char(0),char(198),char(255),char(215), +char(0),char(39),char(1),char(36),char(255),char(195),char(0),char(39),char(1),char(38), +char(255),char(195),char(0),char(39),char(1),char(54),char(255),char(236),char(0),char(39), +char(1),char(56),char(255),char(236),char(0),char(39),char(1),char(58),char(255),char(236), +char(0),char(39),char(1),char(59),char(255),char(236),char(0),char(39),char(1),char(61), +char(255),char(236),char(0),char(39),char(1),char(63),char(255),char(236),char(0),char(39), +char(1),char(67),char(255),char(215),char(0),char(39),char(1),char(160),char(255),char(236), +char(0),char(39),char(1),char(250),char(255),char(236),char(0),char(39),char(1),char(252), +char(255),char(236),char(0),char(39),char(1),char(254),char(255),char(236),char(0),char(39), +char(2),char(0),char(255),char(236),char(0),char(39),char(2),char(8),char(255),char(174), +char(0),char(39),char(2),char(12),char(255),char(174),char(0),char(39),char(2),char(88), +char(255),char(215),char(0),char(39),char(3),char(29),char(255),char(215),char(0),char(39), +char(3),char(31),char(255),char(215),char(0),char(39),char(3),char(33),char(255),char(215), +char(0),char(39),char(3),char(35),char(255),char(215),char(0),char(39),char(3),char(37), +char(255),char(215),char(0),char(39),char(3),char(39),char(255),char(215),char(0),char(39), +char(3),char(41),char(255),char(215),char(0),char(39),char(3),char(43),char(255),char(215), +char(0),char(39),char(3),char(45),char(255),char(215),char(0),char(39),char(3),char(47), +char(255),char(215),char(0),char(39),char(3),char(49),char(255),char(215),char(0),char(39), +char(3),char(51),char(255),char(215),char(0),char(39),char(3),char(111),char(255),char(236), +char(0),char(39),char(3),char(113),char(255),char(236),char(0),char(39),char(3),char(115), +char(255),char(236),char(0),char(39),char(3),char(143),char(255),char(195),char(0),char(40), +char(0),char(45),char(0),char(123),char(0),char(41),char(0),char(15),char(255),char(133), +char(0),char(41),char(0),char(17),char(255),char(133),char(0),char(41),char(0),char(34), +char(0),char(41),char(0),char(41),char(0),char(36),char(255),char(215),char(0),char(41), +char(0),char(130),char(255),char(215),char(0),char(41),char(0),char(131),char(255),char(215), +char(0),char(41),char(0),char(132),char(255),char(215),char(0),char(41),char(0),char(133), +char(255),char(215),char(0),char(41),char(0),char(134),char(255),char(215),char(0),char(41), +char(0),char(135),char(255),char(215),char(0),char(41),char(0),char(194),char(255),char(215), +char(0),char(41),char(0),char(196),char(255),char(215),char(0),char(41),char(0),char(198), +char(255),char(215),char(0),char(41),char(1),char(67),char(255),char(215),char(0),char(41), +char(2),char(8),char(255),char(133),char(0),char(41),char(2),char(12),char(255),char(133), +char(0),char(41),char(2),char(88),char(255),char(215),char(0),char(41),char(3),char(29), +char(255),char(215),char(0),char(41),char(3),char(31),char(255),char(215),char(0),char(41), +char(3),char(33),char(255),char(215),char(0),char(41),char(3),char(35),char(255),char(215), +char(0),char(41),char(3),char(37),char(255),char(215),char(0),char(41),char(3),char(39), +char(255),char(215),char(0),char(41),char(3),char(41),char(255),char(215),char(0),char(41), +char(3),char(43),char(255),char(215),char(0),char(41),char(3),char(45),char(255),char(215), +char(0),char(41),char(3),char(47),char(255),char(215),char(0),char(41),char(3),char(49), +char(255),char(215),char(0),char(41),char(3),char(51),char(255),char(215),char(0),char(46), +char(0),char(38),char(255),char(215),char(0),char(46),char(0),char(42),char(255),char(215), +char(0),char(46),char(0),char(50),char(255),char(215),char(0),char(46),char(0),char(52), +char(255),char(215),char(0),char(46),char(0),char(137),char(255),char(215),char(0),char(46), +char(0),char(148),char(255),char(215),char(0),char(46),char(0),char(149),char(255),char(215), +char(0),char(46),char(0),char(150),char(255),char(215),char(0),char(46),char(0),char(151), +char(255),char(215),char(0),char(46),char(0),char(152),char(255),char(215),char(0),char(46), +char(0),char(154),char(255),char(215),char(0),char(46),char(0),char(200),char(255),char(215), +char(0),char(46),char(0),char(202),char(255),char(215),char(0),char(46),char(0),char(204), +char(255),char(215),char(0),char(46),char(0),char(206),char(255),char(215),char(0),char(46), +char(0),char(222),char(255),char(215),char(0),char(46),char(0),char(224),char(255),char(215), +char(0),char(46),char(0),char(226),char(255),char(215),char(0),char(46),char(0),char(228), +char(255),char(215),char(0),char(46),char(1),char(14),char(255),char(215),char(0),char(46), +char(1),char(16),char(255),char(215),char(0),char(46),char(1),char(18),char(255),char(215), +char(0),char(46),char(1),char(20),char(255),char(215),char(0),char(46),char(1),char(71), +char(255),char(215),char(0),char(46),char(2),char(95),char(255),char(215),char(0),char(46), +char(3),char(73),char(255),char(215),char(0),char(46),char(3),char(75),char(255),char(215), +char(0),char(46),char(3),char(77),char(255),char(215),char(0),char(46),char(3),char(79), +char(255),char(215),char(0),char(46),char(3),char(81),char(255),char(215),char(0),char(46), +char(3),char(83),char(255),char(215),char(0),char(46),char(3),char(85),char(255),char(215), +char(0),char(46),char(3),char(87),char(255),char(215),char(0),char(46),char(3),char(89), +char(255),char(215),char(0),char(46),char(3),char(91),char(255),char(215),char(0),char(46), +char(3),char(93),char(255),char(215),char(0),char(46),char(3),char(95),char(255),char(215), +char(0),char(47),char(0),char(5),char(255),char(92),char(0),char(47),char(0),char(10), +char(255),char(92),char(0),char(47),char(0),char(38),char(255),char(215),char(0),char(47), +char(0),char(42),char(255),char(215),char(0),char(47),char(0),char(50),char(255),char(215), +char(0),char(47),char(0),char(52),char(255),char(215),char(0),char(47),char(0),char(55), +char(255),char(215),char(0),char(47),char(0),char(56),char(255),char(236),char(0),char(47), +char(0),char(57),char(255),char(215),char(0),char(47),char(0),char(58),char(255),char(215), +char(0),char(47),char(0),char(60),char(255),char(195),char(0),char(47),char(0),char(137), +char(255),char(215),char(0),char(47),char(0),char(148),char(255),char(215),char(0),char(47), +char(0),char(149),char(255),char(215),char(0),char(47),char(0),char(150),char(255),char(215), +char(0),char(47),char(0),char(151),char(255),char(215),char(0),char(47),char(0),char(152), +char(255),char(215),char(0),char(47),char(0),char(154),char(255),char(215),char(0),char(47), +char(0),char(155),char(255),char(236),char(0),char(47),char(0),char(156),char(255),char(236), +char(0),char(47),char(0),char(157),char(255),char(236),char(0),char(47),char(0),char(158), +char(255),char(236),char(0),char(47),char(0),char(159),char(255),char(195),char(0),char(47), +char(0),char(200),char(255),char(215),char(0),char(47),char(0),char(202),char(255),char(215), +char(0),char(47),char(0),char(204),char(255),char(215),char(0),char(47),char(0),char(206), +char(255),char(215),char(0),char(47),char(0),char(222),char(255),char(215),char(0),char(47), +char(0),char(224),char(255),char(215),char(0),char(47),char(0),char(226),char(255),char(215), +char(0),char(47),char(0),char(228),char(255),char(215),char(0),char(47),char(1),char(14), +char(255),char(215),char(0),char(47),char(1),char(16),char(255),char(215),char(0),char(47), +char(1),char(18),char(255),char(215),char(0),char(47),char(1),char(20),char(255),char(215), +char(0),char(47),char(1),char(36),char(255),char(215),char(0),char(47),char(1),char(38), +char(255),char(215),char(0),char(47),char(1),char(42),char(255),char(236),char(0),char(47), +char(1),char(44),char(255),char(236),char(0),char(47),char(1),char(46),char(255),char(236), +char(0),char(47),char(1),char(48),char(255),char(236),char(0),char(47),char(1),char(50), +char(255),char(236),char(0),char(47),char(1),char(52),char(255),char(236),char(0),char(47), +char(1),char(54),char(255),char(215),char(0),char(47),char(1),char(56),char(255),char(195), +char(0),char(47),char(1),char(58),char(255),char(195),char(0),char(47),char(1),char(71), +char(255),char(215),char(0),char(47),char(1),char(250),char(255),char(215),char(0),char(47), +char(1),char(252),char(255),char(215),char(0),char(47),char(1),char(254),char(255),char(215), +char(0),char(47),char(2),char(0),char(255),char(195),char(0),char(47),char(2),char(7), +char(255),char(92),char(0),char(47),char(2),char(11),char(255),char(92),char(0),char(47), +char(2),char(95),char(255),char(215),char(0),char(47),char(2),char(97),char(255),char(236), +char(0),char(47),char(3),char(73),char(255),char(215),char(0),char(47),char(3),char(75), +char(255),char(215),char(0),char(47),char(3),char(77),char(255),char(215),char(0),char(47), +char(3),char(79),char(255),char(215),char(0),char(47),char(3),char(81),char(255),char(215), +char(0),char(47),char(3),char(83),char(255),char(215),char(0),char(47),char(3),char(85), +char(255),char(215),char(0),char(47),char(3),char(87),char(255),char(215),char(0),char(47), +char(3),char(89),char(255),char(215),char(0),char(47),char(3),char(91),char(255),char(215), +char(0),char(47),char(3),char(93),char(255),char(215),char(0),char(47),char(3),char(95), +char(255),char(215),char(0),char(47),char(3),char(97),char(255),char(236),char(0),char(47), +char(3),char(99),char(255),char(236),char(0),char(47),char(3),char(101),char(255),char(236), +char(0),char(47),char(3),char(103),char(255),char(236),char(0),char(47),char(3),char(105), +char(255),char(236),char(0),char(47),char(3),char(107),char(255),char(236),char(0),char(47), +char(3),char(109),char(255),char(236),char(0),char(47),char(3),char(111),char(255),char(195), +char(0),char(47),char(3),char(113),char(255),char(195),char(0),char(47),char(3),char(115), +char(255),char(195),char(0),char(47),char(3),char(143),char(255),char(215),char(0),char(50), +char(0),char(15),char(255),char(174),char(0),char(50),char(0),char(17),char(255),char(174), +char(0),char(50),char(0),char(36),char(255),char(215),char(0),char(50),char(0),char(55), +char(255),char(195),char(0),char(50),char(0),char(57),char(255),char(236),char(0),char(50), +char(0),char(58),char(255),char(236),char(0),char(50),char(0),char(59),char(255),char(215), +char(0),char(50),char(0),char(60),char(255),char(236),char(0),char(50),char(0),char(61), +char(255),char(236),char(0),char(50),char(0),char(130),char(255),char(215),char(0),char(50), +char(0),char(131),char(255),char(215),char(0),char(50),char(0),char(132),char(255),char(215), +char(0),char(50),char(0),char(133),char(255),char(215),char(0),char(50),char(0),char(134), +char(255),char(215),char(0),char(50),char(0),char(135),char(255),char(215),char(0),char(50), +char(0),char(159),char(255),char(236),char(0),char(50),char(0),char(194),char(255),char(215), +char(0),char(50),char(0),char(196),char(255),char(215),char(0),char(50),char(0),char(198), +char(255),char(215),char(0),char(50),char(1),char(36),char(255),char(195),char(0),char(50), +char(1),char(38),char(255),char(195),char(0),char(50),char(1),char(54),char(255),char(236), +char(0),char(50),char(1),char(56),char(255),char(236),char(0),char(50),char(1),char(58), +char(255),char(236),char(0),char(50),char(1),char(59),char(255),char(236),char(0),char(50), +char(1),char(61),char(255),char(236),char(0),char(50),char(1),char(63),char(255),char(236), +char(0),char(50),char(1),char(67),char(255),char(215),char(0),char(50),char(1),char(160), +char(255),char(236),char(0),char(50),char(1),char(250),char(255),char(236),char(0),char(50), +char(1),char(252),char(255),char(236),char(0),char(50),char(1),char(254),char(255),char(236), +char(0),char(50),char(2),char(0),char(255),char(236),char(0),char(50),char(2),char(8), +char(255),char(174),char(0),char(50),char(2),char(12),char(255),char(174),char(0),char(50), +char(2),char(88),char(255),char(215),char(0),char(50),char(3),char(29),char(255),char(215), +char(0),char(50),char(3),char(31),char(255),char(215),char(0),char(50),char(3),char(33), +char(255),char(215),char(0),char(50),char(3),char(35),char(255),char(215),char(0),char(50), +char(3),char(37),char(255),char(215),char(0),char(50),char(3),char(39),char(255),char(215), +char(0),char(50),char(3),char(41),char(255),char(215),char(0),char(50),char(3),char(43), +char(255),char(215),char(0),char(50),char(3),char(45),char(255),char(215),char(0),char(50), +char(3),char(47),char(255),char(215),char(0),char(50),char(3),char(49),char(255),char(215), +char(0),char(50),char(3),char(51),char(255),char(215),char(0),char(50),char(3),char(111), +char(255),char(236),char(0),char(50),char(3),char(113),char(255),char(236),char(0),char(50), +char(3),char(115),char(255),char(236),char(0),char(50),char(3),char(143),char(255),char(195), +char(0),char(51),char(0),char(15),char(254),char(246),char(0),char(51),char(0),char(17), +char(254),char(246),char(0),char(51),char(0),char(36),char(255),char(154),char(0),char(51), +char(0),char(59),char(255),char(215),char(0),char(51),char(0),char(61),char(255),char(236), +char(0),char(51),char(0),char(130),char(255),char(154),char(0),char(51),char(0),char(131), +char(255),char(154),char(0),char(51),char(0),char(132),char(255),char(154),char(0),char(51), +char(0),char(133),char(255),char(154),char(0),char(51),char(0),char(134),char(255),char(154), +char(0),char(51),char(0),char(135),char(255),char(154),char(0),char(51),char(0),char(194), +char(255),char(154),char(0),char(51),char(0),char(196),char(255),char(154),char(0),char(51), +char(0),char(198),char(255),char(154),char(0),char(51),char(1),char(59),char(255),char(236), +char(0),char(51),char(1),char(61),char(255),char(236),char(0),char(51),char(1),char(63), +char(255),char(236),char(0),char(51),char(1),char(67),char(255),char(154),char(0),char(51), +char(2),char(8),char(254),char(246),char(0),char(51),char(2),char(12),char(254),char(246), +char(0),char(51),char(2),char(88),char(255),char(154),char(0),char(51),char(3),char(29), +char(255),char(154),char(0),char(51),char(3),char(31),char(255),char(154),char(0),char(51), +char(3),char(33),char(255),char(154),char(0),char(51),char(3),char(35),char(255),char(154), +char(0),char(51),char(3),char(37),char(255),char(154),char(0),char(51),char(3),char(39), +char(255),char(154),char(0),char(51),char(3),char(41),char(255),char(154),char(0),char(51), +char(3),char(43),char(255),char(154),char(0),char(51),char(3),char(45),char(255),char(154), +char(0),char(51),char(3),char(47),char(255),char(154),char(0),char(51),char(3),char(49), +char(255),char(154),char(0),char(51),char(3),char(51),char(255),char(154),char(0),char(52), +char(0),char(15),char(255),char(174),char(0),char(52),char(0),char(17),char(255),char(174), +char(0),char(52),char(0),char(36),char(255),char(215),char(0),char(52),char(0),char(55), +char(255),char(195),char(0),char(52),char(0),char(57),char(255),char(236),char(0),char(52), +char(0),char(58),char(255),char(236),char(0),char(52),char(0),char(59),char(255),char(215), +char(0),char(52),char(0),char(60),char(255),char(236),char(0),char(52),char(0),char(61), +char(255),char(236),char(0),char(52),char(0),char(130),char(255),char(215),char(0),char(52), +char(0),char(131),char(255),char(215),char(0),char(52),char(0),char(132),char(255),char(215), +char(0),char(52),char(0),char(133),char(255),char(215),char(0),char(52),char(0),char(134), +char(255),char(215),char(0),char(52),char(0),char(135),char(255),char(215),char(0),char(52), +char(0),char(159),char(255),char(236),char(0),char(52),char(0),char(194),char(255),char(215), +char(0),char(52),char(0),char(196),char(255),char(215),char(0),char(52),char(0),char(198), +char(255),char(215),char(0),char(52),char(1),char(36),char(255),char(195),char(0),char(52), +char(1),char(38),char(255),char(195),char(0),char(52),char(1),char(54),char(255),char(236), +char(0),char(52),char(1),char(56),char(255),char(236),char(0),char(52),char(1),char(58), +char(255),char(236),char(0),char(52),char(1),char(59),char(255),char(236),char(0),char(52), +char(1),char(61),char(255),char(236),char(0),char(52),char(1),char(63),char(255),char(236), +char(0),char(52),char(1),char(67),char(255),char(215),char(0),char(52),char(1),char(160), +char(255),char(236),char(0),char(52),char(1),char(250),char(255),char(236),char(0),char(52), +char(1),char(252),char(255),char(236),char(0),char(52),char(1),char(254),char(255),char(236), +char(0),char(52),char(2),char(0),char(255),char(236),char(0),char(52),char(2),char(8), +char(255),char(174),char(0),char(52),char(2),char(12),char(255),char(174),char(0),char(52), +char(2),char(88),char(255),char(215),char(0),char(52),char(3),char(29),char(255),char(215), +char(0),char(52),char(3),char(31),char(255),char(215),char(0),char(52),char(3),char(33), +char(255),char(215),char(0),char(52),char(3),char(35),char(255),char(215),char(0),char(52), +char(3),char(37),char(255),char(215),char(0),char(52),char(3),char(39),char(255),char(215), +char(0),char(52),char(3),char(41),char(255),char(215),char(0),char(52),char(3),char(43), +char(255),char(215),char(0),char(52),char(3),char(45),char(255),char(215),char(0),char(52), +char(3),char(47),char(255),char(215),char(0),char(52),char(3),char(49),char(255),char(215), +char(0),char(52),char(3),char(51),char(255),char(215),char(0),char(52),char(3),char(111), +char(255),char(236),char(0),char(52),char(3),char(113),char(255),char(236),char(0),char(52), +char(3),char(115),char(255),char(236),char(0),char(52),char(3),char(143),char(255),char(195), +char(0),char(55),char(0),char(15),char(255),char(133),char(0),char(55),char(0),char(16), +char(255),char(174),char(0),char(55),char(0),char(17),char(255),char(133),char(0),char(55), +char(0),char(34),char(0),char(41),char(0),char(55),char(0),char(36),char(255),char(113), +char(0),char(55),char(0),char(38),char(255),char(215),char(0),char(55),char(0),char(42), +char(255),char(215),char(0),char(55),char(0),char(50),char(255),char(215),char(0),char(55), +char(0),char(52),char(255),char(215),char(0),char(55),char(0),char(55),char(0),char(41), +char(0),char(55),char(0),char(68),char(255),char(92),char(0),char(55),char(0),char(70), +char(255),char(113),char(0),char(55),char(0),char(71),char(255),char(113),char(0),char(55), +char(0),char(72),char(255),char(113),char(0),char(55),char(0),char(74),char(255),char(113), +char(0),char(55),char(0),char(80),char(255),char(154),char(0),char(55),char(0),char(81), +char(255),char(154),char(0),char(55),char(0),char(82),char(255),char(113),char(0),char(55), +char(0),char(83),char(255),char(154),char(0),char(55),char(0),char(84),char(255),char(113), +char(0),char(55),char(0),char(85),char(255),char(154),char(0),char(55),char(0),char(86), +char(255),char(133),char(0),char(55),char(0),char(88),char(255),char(154),char(0),char(55), +char(0),char(89),char(255),char(215),char(0),char(55),char(0),char(90),char(255),char(215), +char(0),char(55),char(0),char(91),char(255),char(215),char(0),char(55),char(0),char(92), +char(255),char(215),char(0),char(55),char(0),char(93),char(255),char(174),char(0),char(55), +char(0),char(130),char(255),char(113),char(0),char(55),char(0),char(131),char(255),char(113), +char(0),char(55),char(0),char(132),char(255),char(113),char(0),char(55),char(0),char(133), +char(255),char(113),char(0),char(55),char(0),char(134),char(255),char(113),char(0),char(55), +char(0),char(135),char(255),char(113),char(0),char(55),char(0),char(137),char(255),char(215), +char(0),char(55),char(0),char(148),char(255),char(215),char(0),char(55),char(0),char(149), +char(255),char(215),char(0),char(55),char(0),char(150),char(255),char(215),char(0),char(55), +char(0),char(151),char(255),char(215),char(0),char(55),char(0),char(152),char(255),char(215), +char(0),char(55),char(0),char(154),char(255),char(215),char(0),char(55),char(0),char(162), +char(255),char(113),char(0),char(55),char(0),char(163),char(255),char(92),char(0),char(55), +char(0),char(164),char(255),char(92),char(0),char(55),char(0),char(165),char(255),char(92), +char(0),char(55),char(0),char(166),char(255),char(92),char(0),char(55),char(0),char(167), +char(255),char(92),char(0),char(55),char(0),char(168),char(255),char(92),char(0),char(55), +char(0),char(169),char(255),char(113),char(0),char(55),char(0),char(170),char(255),char(113), +char(0),char(55),char(0),char(171),char(255),char(113),char(0),char(55),char(0),char(172), +char(255),char(113),char(0),char(55),char(0),char(173),char(255),char(113),char(0),char(55), +char(0),char(180),char(255),char(113),char(0),char(55),char(0),char(181),char(255),char(113), +char(0),char(55),char(0),char(182),char(255),char(113),char(0),char(55),char(0),char(183), +char(255),char(113),char(0),char(55),char(0),char(184),char(255),char(113),char(0),char(55), +char(0),char(186),char(255),char(113),char(0),char(55),char(0),char(187),char(255),char(154), +char(0),char(55),char(0),char(188),char(255),char(154),char(0),char(55),char(0),char(189), +char(255),char(154),char(0),char(55),char(0),char(190),char(255),char(154),char(0),char(55), +char(0),char(191),char(255),char(215),char(0),char(55),char(0),char(194),char(255),char(113), +char(0),char(55),char(0),char(195),char(255),char(92),char(0),char(55),char(0),char(196), +char(255),char(113),char(0),char(55),char(0),char(197),char(255),char(92),char(0),char(55), +char(0),char(198),char(255),char(113),char(0),char(55),char(0),char(199),char(255),char(92), +char(0),char(55),char(0),char(200),char(255),char(215),char(0),char(55),char(0),char(201), +char(255),char(113),char(0),char(55),char(0),char(202),char(255),char(215),char(0),char(55), +char(0),char(203),char(255),char(113),char(0),char(55),char(0),char(204),char(255),char(215), +char(0),char(55),char(0),char(205),char(255),char(113),char(0),char(55),char(0),char(206), +char(255),char(215),char(0),char(55),char(0),char(207),char(255),char(113),char(0),char(55), +char(0),char(209),char(255),char(113),char(0),char(55),char(0),char(211),char(255),char(113), +char(0),char(55),char(0),char(213),char(255),char(113),char(0),char(55),char(0),char(215), +char(255),char(113),char(0),char(55),char(0),char(217),char(255),char(113),char(0),char(55), +char(0),char(219),char(255),char(113),char(0),char(55),char(0),char(221),char(255),char(113), +char(0),char(55),char(0),char(222),char(255),char(215),char(0),char(55),char(0),char(223), +char(255),char(113),char(0),char(55),char(0),char(224),char(255),char(215),char(0),char(55), +char(0),char(225),char(255),char(113),char(0),char(55),char(0),char(226),char(255),char(215), +char(0),char(55),char(0),char(227),char(255),char(113),char(0),char(55),char(0),char(228), +char(255),char(215),char(0),char(55),char(0),char(229),char(255),char(113),char(0),char(55), +char(0),char(250),char(255),char(154),char(0),char(55),char(1),char(6),char(255),char(154), +char(0),char(55),char(1),char(8),char(255),char(154),char(0),char(55),char(1),char(13), +char(255),char(154),char(0),char(55),char(1),char(14),char(255),char(215),char(0),char(55), +char(1),char(15),char(255),char(113),char(0),char(55),char(1),char(16),char(255),char(215), +char(0),char(55),char(1),char(17),char(255),char(113),char(0),char(55),char(1),char(18), +char(255),char(215),char(0),char(55),char(1),char(19),char(255),char(113),char(0),char(55), +char(1),char(20),char(255),char(215),char(0),char(55),char(1),char(21),char(255),char(113), +char(0),char(55),char(1),char(23),char(255),char(154),char(0),char(55),char(1),char(25), +char(255),char(154),char(0),char(55),char(1),char(29),char(255),char(133),char(0),char(55), +char(1),char(33),char(255),char(133),char(0),char(55),char(1),char(36),char(0),char(41), +char(0),char(55),char(1),char(38),char(0),char(41),char(0),char(55),char(1),char(43), +char(255),char(154),char(0),char(55),char(1),char(45),char(255),char(154),char(0),char(55), +char(1),char(47),char(255),char(154),char(0),char(55),char(1),char(49),char(255),char(154), +char(0),char(55),char(1),char(51),char(255),char(154),char(0),char(55),char(1),char(53), +char(255),char(154),char(0),char(55),char(1),char(55),char(255),char(215),char(0),char(55), +char(1),char(60),char(255),char(174),char(0),char(55),char(1),char(62),char(255),char(174), +char(0),char(55),char(1),char(64),char(255),char(174),char(0),char(55),char(1),char(67), +char(255),char(113),char(0),char(55),char(1),char(68),char(255),char(92),char(0),char(55), +char(1),char(70),char(255),char(92),char(0),char(55),char(1),char(71),char(255),char(215), +char(0),char(55),char(1),char(72),char(255),char(113),char(0),char(55),char(1),char(74), +char(255),char(133),char(0),char(55),char(1),char(251),char(255),char(215),char(0),char(55), +char(1),char(253),char(255),char(215),char(0),char(55),char(2),char(2),char(255),char(174), +char(0),char(55),char(2),char(3),char(255),char(174),char(0),char(55),char(2),char(4), +char(255),char(174),char(0),char(55),char(2),char(8),char(255),char(133),char(0),char(55), +char(2),char(12),char(255),char(133),char(0),char(55),char(2),char(87),char(255),char(154), +char(0),char(55),char(2),char(88),char(255),char(113),char(0),char(55),char(2),char(89), +char(255),char(92),char(0),char(55),char(2),char(95),char(255),char(215),char(0),char(55), +char(2),char(96),char(255),char(113),char(0),char(55),char(2),char(98),char(255),char(154), +char(0),char(55),char(3),char(29),char(255),char(113),char(0),char(55),char(3),char(30), +char(255),char(92),char(0),char(55),char(3),char(31),char(255),char(113),char(0),char(55), +char(3),char(32),char(255),char(92),char(0),char(55),char(3),char(33),char(255),char(113), +char(0),char(55),char(3),char(34),char(255),char(92),char(0),char(55),char(3),char(35), +char(255),char(113),char(0),char(55),char(3),char(37),char(255),char(113),char(0),char(55), +char(3),char(38),char(255),char(92),char(0),char(55),char(3),char(39),char(255),char(113), +char(0),char(55),char(3),char(40),char(255),char(92),char(0),char(55),char(3),char(41), +char(255),char(113),char(0),char(55),char(3),char(42),char(255),char(92),char(0),char(55), +char(3),char(43),char(255),char(113),char(0),char(55),char(3),char(44),char(255),char(92), +char(0),char(55),char(3),char(45),char(255),char(113),char(0),char(55),char(3),char(46), +char(255),char(92),char(0),char(55),char(3),char(47),char(255),char(113),char(0),char(55), +char(3),char(48),char(255),char(92),char(0),char(55),char(3),char(49),char(255),char(113), +char(0),char(55),char(3),char(50),char(255),char(92),char(0),char(55),char(3),char(51), +char(255),char(113),char(0),char(55),char(3),char(52),char(255),char(92),char(0),char(55), +char(3),char(54),char(255),char(113),char(0),char(55),char(3),char(56),char(255),char(113), +char(0),char(55),char(3),char(58),char(255),char(113),char(0),char(55),char(3),char(60), +char(255),char(113),char(0),char(55),char(3),char(64),char(255),char(113),char(0),char(55), +char(3),char(66),char(255),char(113),char(0),char(55),char(3),char(68),char(255),char(113), +char(0),char(55),char(3),char(73),char(255),char(215),char(0),char(55),char(3),char(74), +char(255),char(113),char(0),char(55),char(3),char(75),char(255),char(215),char(0),char(55), +char(3),char(76),char(255),char(113),char(0),char(55),char(3),char(77),char(255),char(215), +char(0),char(55),char(3),char(78),char(255),char(113),char(0),char(55),char(3),char(79), +char(255),char(215),char(0),char(55),char(3),char(81),char(255),char(215),char(0),char(55), +char(3),char(82),char(255),char(113),char(0),char(55),char(3),char(83),char(255),char(215), +char(0),char(55),char(3),char(84),char(255),char(113),char(0),char(55),char(3),char(85), +char(255),char(215),char(0),char(55),char(3),char(86),char(255),char(113),char(0),char(55), +char(3),char(87),char(255),char(215),char(0),char(55),char(3),char(88),char(255),char(113), +char(0),char(55),char(3),char(89),char(255),char(215),char(0),char(55),char(3),char(90), +char(255),char(113),char(0),char(55),char(3),char(91),char(255),char(215),char(0),char(55), +char(3),char(92),char(255),char(113),char(0),char(55),char(3),char(93),char(255),char(215), +char(0),char(55),char(3),char(94),char(255),char(113),char(0),char(55),char(3),char(95), +char(255),char(215),char(0),char(55),char(3),char(96),char(255),char(113),char(0),char(55), +char(3),char(98),char(255),char(154),char(0),char(55),char(3),char(100),char(255),char(154), +char(0),char(55),char(3),char(102),char(255),char(154),char(0),char(55),char(3),char(104), +char(255),char(154),char(0),char(55),char(3),char(106),char(255),char(154),char(0),char(55), +char(3),char(108),char(255),char(154),char(0),char(55),char(3),char(110),char(255),char(154), +char(0),char(55),char(3),char(112),char(255),char(215),char(0),char(55),char(3),char(143), +char(0),char(41),char(0),char(56),char(0),char(15),char(255),char(215),char(0),char(56), +char(0),char(17),char(255),char(215),char(0),char(56),char(0),char(36),char(255),char(236), +char(0),char(56),char(0),char(130),char(255),char(236),char(0),char(56),char(0),char(131), +char(255),char(236),char(0),char(56),char(0),char(132),char(255),char(236),char(0),char(56), +char(0),char(133),char(255),char(236),char(0),char(56),char(0),char(134),char(255),char(236), +char(0),char(56),char(0),char(135),char(255),char(236),char(0),char(56),char(0),char(194), +char(255),char(236),char(0),char(56),char(0),char(196),char(255),char(236),char(0),char(56), +char(0),char(198),char(255),char(236),char(0),char(56),char(1),char(67),char(255),char(236), +char(0),char(56),char(2),char(8),char(255),char(215),char(0),char(56),char(2),char(12), +char(255),char(215),char(0),char(56),char(2),char(88),char(255),char(236),char(0),char(56), +char(3),char(29),char(255),char(236),char(0),char(56),char(3),char(31),char(255),char(236), +char(0),char(56),char(3),char(33),char(255),char(236),char(0),char(56),char(3),char(35), +char(255),char(236),char(0),char(56),char(3),char(37),char(255),char(236),char(0),char(56), +char(3),char(39),char(255),char(236),char(0),char(56),char(3),char(41),char(255),char(236), +char(0),char(56),char(3),char(43),char(255),char(236),char(0),char(56),char(3),char(45), +char(255),char(236),char(0),char(56),char(3),char(47),char(255),char(236),char(0),char(56), +char(3),char(49),char(255),char(236),char(0),char(56),char(3),char(51),char(255),char(236), +char(0),char(57),char(0),char(15),char(255),char(154),char(0),char(57),char(0),char(17), +char(255),char(154),char(0),char(57),char(0),char(34),char(0),char(41),char(0),char(57), +char(0),char(36),char(255),char(174),char(0),char(57),char(0),char(38),char(255),char(236), +char(0),char(57),char(0),char(42),char(255),char(236),char(0),char(57),char(0),char(50), +char(255),char(236),char(0),char(57),char(0),char(52),char(255),char(236),char(0),char(57), +char(0),char(68),char(255),char(215),char(0),char(57),char(0),char(70),char(255),char(215), +char(0),char(57),char(0),char(71),char(255),char(215),char(0),char(57),char(0),char(72), +char(255),char(215),char(0),char(57),char(0),char(74),char(255),char(236),char(0),char(57), +char(0),char(80),char(255),char(236),char(0),char(57),char(0),char(81),char(255),char(236), +char(0),char(57),char(0),char(82),char(255),char(215),char(0),char(57),char(0),char(83), +char(255),char(236),char(0),char(57),char(0),char(84),char(255),char(215),char(0),char(57), +char(0),char(85),char(255),char(236),char(0),char(57),char(0),char(86),char(255),char(236), +char(0),char(57),char(0),char(88),char(255),char(236),char(0),char(57),char(0),char(130), +char(255),char(174),char(0),char(57),char(0),char(131),char(255),char(174),char(0),char(57), +char(0),char(132),char(255),char(174),char(0),char(57),char(0),char(133),char(255),char(174), +char(0),char(57),char(0),char(134),char(255),char(174),char(0),char(57),char(0),char(135), +char(255),char(174),char(0),char(57),char(0),char(137),char(255),char(236),char(0),char(57), +char(0),char(148),char(255),char(236),char(0),char(57),char(0),char(149),char(255),char(236), +char(0),char(57),char(0),char(150),char(255),char(236),char(0),char(57),char(0),char(151), +char(255),char(236),char(0),char(57),char(0),char(152),char(255),char(236),char(0),char(57), +char(0),char(154),char(255),char(236),char(0),char(57),char(0),char(162),char(255),char(215), +char(0),char(57),char(0),char(163),char(255),char(215),char(0),char(57),char(0),char(164), +char(255),char(215),char(0),char(57),char(0),char(165),char(255),char(215),char(0),char(57), +char(0),char(166),char(255),char(215),char(0),char(57),char(0),char(167),char(255),char(215), +char(0),char(57),char(0),char(168),char(255),char(215),char(0),char(57),char(0),char(169), +char(255),char(215),char(0),char(57),char(0),char(170),char(255),char(215),char(0),char(57), +char(0),char(171),char(255),char(215),char(0),char(57),char(0),char(172),char(255),char(215), +char(0),char(57),char(0),char(173),char(255),char(215),char(0),char(57),char(0),char(180), +char(255),char(215),char(0),char(57),char(0),char(181),char(255),char(215),char(0),char(57), +char(0),char(182),char(255),char(215),char(0),char(57),char(0),char(183),char(255),char(215), +char(0),char(57),char(0),char(184),char(255),char(215),char(0),char(57),char(0),char(186), +char(255),char(215),char(0),char(57),char(0),char(187),char(255),char(236),char(0),char(57), +char(0),char(188),char(255),char(236),char(0),char(57),char(0),char(189),char(255),char(236), +char(0),char(57),char(0),char(190),char(255),char(236),char(0),char(57),char(0),char(194), +char(255),char(174),char(0),char(57),char(0),char(195),char(255),char(215),char(0),char(57), +char(0),char(196),char(255),char(174),char(0),char(57),char(0),char(197),char(255),char(215), +char(0),char(57),char(0),char(198),char(255),char(174),char(0),char(57),char(0),char(199), +char(255),char(215),char(0),char(57),char(0),char(200),char(255),char(236),char(0),char(57), +char(0),char(201),char(255),char(215),char(0),char(57),char(0),char(202),char(255),char(236), +char(0),char(57),char(0),char(203),char(255),char(215),char(0),char(57),char(0),char(204), +char(255),char(236),char(0),char(57),char(0),char(205),char(255),char(215),char(0),char(57), +char(0),char(206),char(255),char(236),char(0),char(57),char(0),char(207),char(255),char(215), +char(0),char(57),char(0),char(209),char(255),char(215),char(0),char(57),char(0),char(211), +char(255),char(215),char(0),char(57),char(0),char(213),char(255),char(215),char(0),char(57), +char(0),char(215),char(255),char(215),char(0),char(57),char(0),char(217),char(255),char(215), +char(0),char(57),char(0),char(219),char(255),char(215),char(0),char(57),char(0),char(221), +char(255),char(215),char(0),char(57),char(0),char(222),char(255),char(236),char(0),char(57), +char(0),char(223),char(255),char(236),char(0),char(57),char(0),char(224),char(255),char(236), +char(0),char(57),char(0),char(225),char(255),char(236),char(0),char(57),char(0),char(226), +char(255),char(236),char(0),char(57),char(0),char(227),char(255),char(236),char(0),char(57), +char(0),char(228),char(255),char(236),char(0),char(57),char(0),char(229),char(255),char(236), +char(0),char(57),char(0),char(250),char(255),char(236),char(0),char(57),char(1),char(6), +char(255),char(236),char(0),char(57),char(1),char(8),char(255),char(236),char(0),char(57), +char(1),char(13),char(255),char(236),char(0),char(57),char(1),char(14),char(255),char(236), +char(0),char(57),char(1),char(15),char(255),char(215),char(0),char(57),char(1),char(16), +char(255),char(236),char(0),char(57),char(1),char(17),char(255),char(215),char(0),char(57), +char(1),char(18),char(255),char(236),char(0),char(57),char(1),char(19),char(255),char(215), +char(0),char(57),char(1),char(20),char(255),char(236),char(0),char(57),char(1),char(21), +char(255),char(215),char(0),char(57),char(1),char(23),char(255),char(236),char(0),char(57), +char(1),char(25),char(255),char(236),char(0),char(57),char(1),char(29),char(255),char(236), +char(0),char(57),char(1),char(33),char(255),char(236),char(0),char(57),char(1),char(43), +char(255),char(236),char(0),char(57),char(1),char(45),char(255),char(236),char(0),char(57), +char(1),char(47),char(255),char(236),char(0),char(57),char(1),char(49),char(255),char(236), +char(0),char(57),char(1),char(51),char(255),char(236),char(0),char(57),char(1),char(53), +char(255),char(236),char(0),char(57),char(1),char(67),char(255),char(174),char(0),char(57), +char(1),char(68),char(255),char(215),char(0),char(57),char(1),char(70),char(255),char(215), +char(0),char(57),char(1),char(71),char(255),char(236),char(0),char(57),char(1),char(72), +char(255),char(215),char(0),char(57),char(1),char(74),char(255),char(236),char(0),char(57), +char(2),char(8),char(255),char(154),char(0),char(57),char(2),char(12),char(255),char(154), +char(0),char(57),char(2),char(87),char(255),char(236),char(0),char(57),char(2),char(88), +char(255),char(174),char(0),char(57),char(2),char(89),char(255),char(215),char(0),char(57), +char(2),char(95),char(255),char(236),char(0),char(57),char(2),char(96),char(255),char(215), +char(0),char(57),char(2),char(98),char(255),char(236),char(0),char(57),char(3),char(29), +char(255),char(174),char(0),char(57),char(3),char(30),char(255),char(215),char(0),char(57), +char(3),char(31),char(255),char(174),char(0),char(57),char(3),char(32),char(255),char(215), +char(0),char(57),char(3),char(33),char(255),char(174),char(0),char(57),char(3),char(34), +char(255),char(215),char(0),char(57),char(3),char(35),char(255),char(174),char(0),char(57), +char(3),char(37),char(255),char(174),char(0),char(57),char(3),char(38),char(255),char(215), +char(0),char(57),char(3),char(39),char(255),char(174),char(0),char(57),char(3),char(40), +char(255),char(215),char(0),char(57),char(3),char(41),char(255),char(174),char(0),char(57), +char(3),char(42),char(255),char(215),char(0),char(57),char(3),char(43),char(255),char(174), +char(0),char(57),char(3),char(44),char(255),char(215),char(0),char(57),char(3),char(45), +char(255),char(174),char(0),char(57),char(3),char(46),char(255),char(215),char(0),char(57), +char(3),char(47),char(255),char(174),char(0),char(57),char(3),char(48),char(255),char(215), +char(0),char(57),char(3),char(49),char(255),char(174),char(0),char(57),char(3),char(50), +char(255),char(215),char(0),char(57),char(3),char(51),char(255),char(174),char(0),char(57), +char(3),char(52),char(255),char(215),char(0),char(57),char(3),char(54),char(255),char(215), +char(0),char(57),char(3),char(56),char(255),char(215),char(0),char(57),char(3),char(58), +char(255),char(215),char(0),char(57),char(3),char(60),char(255),char(215),char(0),char(57), +char(3),char(64),char(255),char(215),char(0),char(57),char(3),char(66),char(255),char(215), +char(0),char(57),char(3),char(68),char(255),char(215),char(0),char(57),char(3),char(73), +char(255),char(236),char(0),char(57),char(3),char(74),char(255),char(215),char(0),char(57), +char(3),char(75),char(255),char(236),char(0),char(57),char(3),char(76),char(255),char(215), +char(0),char(57),char(3),char(77),char(255),char(236),char(0),char(57),char(3),char(78), +char(255),char(215),char(0),char(57),char(3),char(79),char(255),char(236),char(0),char(57), +char(3),char(81),char(255),char(236),char(0),char(57),char(3),char(82),char(255),char(215), +char(0),char(57),char(3),char(83),char(255),char(236),char(0),char(57),char(3),char(84), +char(255),char(215),char(0),char(57),char(3),char(85),char(255),char(236),char(0),char(57), +char(3),char(86),char(255),char(215),char(0),char(57),char(3),char(87),char(255),char(236), +char(0),char(57),char(3),char(88),char(255),char(215),char(0),char(57),char(3),char(89), +char(255),char(236),char(0),char(57),char(3),char(90),char(255),char(215),char(0),char(57), +char(3),char(91),char(255),char(236),char(0),char(57),char(3),char(92),char(255),char(215), +char(0),char(57),char(3),char(93),char(255),char(236),char(0),char(57),char(3),char(94), +char(255),char(215),char(0),char(57),char(3),char(95),char(255),char(236),char(0),char(57), +char(3),char(96),char(255),char(215),char(0),char(57),char(3),char(98),char(255),char(236), +char(0),char(57),char(3),char(100),char(255),char(236),char(0),char(57),char(3),char(102), +char(255),char(236),char(0),char(57),char(3),char(104),char(255),char(236),char(0),char(57), +char(3),char(106),char(255),char(236),char(0),char(57),char(3),char(108),char(255),char(236), +char(0),char(57),char(3),char(110),char(255),char(236),char(0),char(58),char(0),char(15), +char(255),char(154),char(0),char(58),char(0),char(17),char(255),char(154),char(0),char(58), +char(0),char(34),char(0),char(41),char(0),char(58),char(0),char(36),char(255),char(174), +char(0),char(58),char(0),char(38),char(255),char(236),char(0),char(58),char(0),char(42), +char(255),char(236),char(0),char(58),char(0),char(50),char(255),char(236),char(0),char(58), +char(0),char(52),char(255),char(236),char(0),char(58),char(0),char(68),char(255),char(215), +char(0),char(58),char(0),char(70),char(255),char(215),char(0),char(58),char(0),char(71), +char(255),char(215),char(0),char(58),char(0),char(72),char(255),char(215),char(0),char(58), +char(0),char(74),char(255),char(236),char(0),char(58),char(0),char(80),char(255),char(236), +char(0),char(58),char(0),char(81),char(255),char(236),char(0),char(58),char(0),char(82), +char(255),char(215),char(0),char(58),char(0),char(83),char(255),char(236),char(0),char(58), +char(0),char(84),char(255),char(215),char(0),char(58),char(0),char(85),char(255),char(236), +char(0),char(58),char(0),char(86),char(255),char(236),char(0),char(58),char(0),char(88), +char(255),char(236),char(0),char(58),char(0),char(130),char(255),char(174),char(0),char(58), +char(0),char(131),char(255),char(174),char(0),char(58),char(0),char(132),char(255),char(174), +char(0),char(58),char(0),char(133),char(255),char(174),char(0),char(58),char(0),char(134), +char(255),char(174),char(0),char(58),char(0),char(135),char(255),char(174),char(0),char(58), +char(0),char(137),char(255),char(236),char(0),char(58),char(0),char(148),char(255),char(236), +char(0),char(58),char(0),char(149),char(255),char(236),char(0),char(58),char(0),char(150), +char(255),char(236),char(0),char(58),char(0),char(151),char(255),char(236),char(0),char(58), +char(0),char(152),char(255),char(236),char(0),char(58),char(0),char(154),char(255),char(236), +char(0),char(58),char(0),char(162),char(255),char(215),char(0),char(58),char(0),char(163), +char(255),char(215),char(0),char(58),char(0),char(164),char(255),char(215),char(0),char(58), +char(0),char(165),char(255),char(215),char(0),char(58),char(0),char(166),char(255),char(215), +char(0),char(58),char(0),char(167),char(255),char(215),char(0),char(58),char(0),char(168), +char(255),char(215),char(0),char(58),char(0),char(169),char(255),char(215),char(0),char(58), +char(0),char(170),char(255),char(215),char(0),char(58),char(0),char(171),char(255),char(215), +char(0),char(58),char(0),char(172),char(255),char(215),char(0),char(58),char(0),char(173), +char(255),char(215),char(0),char(58),char(0),char(180),char(255),char(215),char(0),char(58), +char(0),char(181),char(255),char(215),char(0),char(58),char(0),char(182),char(255),char(215), +char(0),char(58),char(0),char(183),char(255),char(215),char(0),char(58),char(0),char(184), +char(255),char(215),char(0),char(58),char(0),char(186),char(255),char(215),char(0),char(58), +char(0),char(187),char(255),char(236),char(0),char(58),char(0),char(188),char(255),char(236), +char(0),char(58),char(0),char(189),char(255),char(236),char(0),char(58),char(0),char(190), +char(255),char(236),char(0),char(58),char(0),char(194),char(255),char(174),char(0),char(58), +char(0),char(195),char(255),char(215),char(0),char(58),char(0),char(196),char(255),char(174), +char(0),char(58),char(0),char(197),char(255),char(215),char(0),char(58),char(0),char(198), +char(255),char(174),char(0),char(58),char(0),char(199),char(255),char(215),char(0),char(58), +char(0),char(200),char(255),char(236),char(0),char(58),char(0),char(201),char(255),char(215), +char(0),char(58),char(0),char(202),char(255),char(236),char(0),char(58),char(0),char(203), +char(255),char(215),char(0),char(58),char(0),char(204),char(255),char(236),char(0),char(58), +char(0),char(205),char(255),char(215),char(0),char(58),char(0),char(206),char(255),char(236), +char(0),char(58),char(0),char(207),char(255),char(215),char(0),char(58),char(0),char(209), +char(255),char(215),char(0),char(58),char(0),char(211),char(255),char(215),char(0),char(58), +char(0),char(213),char(255),char(215),char(0),char(58),char(0),char(215),char(255),char(215), +char(0),char(58),char(0),char(217),char(255),char(215),char(0),char(58),char(0),char(219), +char(255),char(215),char(0),char(58),char(0),char(221),char(255),char(215),char(0),char(58), +char(0),char(222),char(255),char(236),char(0),char(58),char(0),char(223),char(255),char(236), +char(0),char(58),char(0),char(224),char(255),char(236),char(0),char(58),char(0),char(225), +char(255),char(236),char(0),char(58),char(0),char(226),char(255),char(236),char(0),char(58), +char(0),char(227),char(255),char(236),char(0),char(58),char(0),char(228),char(255),char(236), +char(0),char(58),char(0),char(229),char(255),char(236),char(0),char(58),char(0),char(250), +char(255),char(236),char(0),char(58),char(1),char(6),char(255),char(236),char(0),char(58), +char(1),char(8),char(255),char(236),char(0),char(58),char(1),char(13),char(255),char(236), +char(0),char(58),char(1),char(14),char(255),char(236),char(0),char(58),char(1),char(15), +char(255),char(215),char(0),char(58),char(1),char(16),char(255),char(236),char(0),char(58), +char(1),char(17),char(255),char(215),char(0),char(58),char(1),char(18),char(255),char(236), +char(0),char(58),char(1),char(19),char(255),char(215),char(0),char(58),char(1),char(20), +char(255),char(236),char(0),char(58),char(1),char(21),char(255),char(215),char(0),char(58), +char(1),char(23),char(255),char(236),char(0),char(58),char(1),char(25),char(255),char(236), +char(0),char(58),char(1),char(29),char(255),char(236),char(0),char(58),char(1),char(33), +char(255),char(236),char(0),char(58),char(1),char(43),char(255),char(236),char(0),char(58), +char(1),char(45),char(255),char(236),char(0),char(58),char(1),char(47),char(255),char(236), +char(0),char(58),char(1),char(49),char(255),char(236),char(0),char(58),char(1),char(51), +char(255),char(236),char(0),char(58),char(1),char(53),char(255),char(236),char(0),char(58), +char(1),char(67),char(255),char(174),char(0),char(58),char(1),char(68),char(255),char(215), +char(0),char(58),char(1),char(70),char(255),char(215),char(0),char(58),char(1),char(71), +char(255),char(236),char(0),char(58),char(1),char(72),char(255),char(215),char(0),char(58), +char(1),char(74),char(255),char(236),char(0),char(58),char(2),char(8),char(255),char(154), +char(0),char(58),char(2),char(12),char(255),char(154),char(0),char(58),char(2),char(87), +char(255),char(236),char(0),char(58),char(2),char(88),char(255),char(174),char(0),char(58), +char(2),char(89),char(255),char(215),char(0),char(58),char(2),char(95),char(255),char(236), +char(0),char(58),char(2),char(96),char(255),char(215),char(0),char(58),char(2),char(98), +char(255),char(236),char(0),char(58),char(3),char(29),char(255),char(174),char(0),char(58), +char(3),char(30),char(255),char(215),char(0),char(58),char(3),char(31),char(255),char(174), +char(0),char(58),char(3),char(32),char(255),char(215),char(0),char(58),char(3),char(33), +char(255),char(174),char(0),char(58),char(3),char(34),char(255),char(215),char(0),char(58), +char(3),char(35),char(255),char(174),char(0),char(58),char(3),char(37),char(255),char(174), +char(0),char(58),char(3),char(38),char(255),char(215),char(0),char(58),char(3),char(39), +char(255),char(174),char(0),char(58),char(3),char(40),char(255),char(215),char(0),char(58), +char(3),char(41),char(255),char(174),char(0),char(58),char(3),char(42),char(255),char(215), +char(0),char(58),char(3),char(43),char(255),char(174),char(0),char(58),char(3),char(44), +char(255),char(215),char(0),char(58),char(3),char(45),char(255),char(174),char(0),char(58), +char(3),char(46),char(255),char(215),char(0),char(58),char(3),char(47),char(255),char(174), +char(0),char(58),char(3),char(48),char(255),char(215),char(0),char(58),char(3),char(49), +char(255),char(174),char(0),char(58),char(3),char(50),char(255),char(215),char(0),char(58), +char(3),char(51),char(255),char(174),char(0),char(58),char(3),char(52),char(255),char(215), +char(0),char(58),char(3),char(54),char(255),char(215),char(0),char(58),char(3),char(56), +char(255),char(215),char(0),char(58),char(3),char(58),char(255),char(215),char(0),char(58), +char(3),char(60),char(255),char(215),char(0),char(58),char(3),char(64),char(255),char(215), +char(0),char(58),char(3),char(66),char(255),char(215),char(0),char(58),char(3),char(68), +char(255),char(215),char(0),char(58),char(3),char(73),char(255),char(236),char(0),char(58), +char(3),char(74),char(255),char(215),char(0),char(58),char(3),char(75),char(255),char(236), +char(0),char(58),char(3),char(76),char(255),char(215),char(0),char(58),char(3),char(77), +char(255),char(236),char(0),char(58),char(3),char(78),char(255),char(215),char(0),char(58), +char(3),char(79),char(255),char(236),char(0),char(58),char(3),char(81),char(255),char(236), +char(0),char(58),char(3),char(82),char(255),char(215),char(0),char(58),char(3),char(83), +char(255),char(236),char(0),char(58),char(3),char(84),char(255),char(215),char(0),char(58), +char(3),char(85),char(255),char(236),char(0),char(58),char(3),char(86),char(255),char(215), +char(0),char(58),char(3),char(87),char(255),char(236),char(0),char(58),char(3),char(88), +char(255),char(215),char(0),char(58),char(3),char(89),char(255),char(236),char(0),char(58), +char(3),char(90),char(255),char(215),char(0),char(58),char(3),char(91),char(255),char(236), +char(0),char(58),char(3),char(92),char(255),char(215),char(0),char(58),char(3),char(93), +char(255),char(236),char(0),char(58),char(3),char(94),char(255),char(215),char(0),char(58), +char(3),char(95),char(255),char(236),char(0),char(58),char(3),char(96),char(255),char(215), +char(0),char(58),char(3),char(98),char(255),char(236),char(0),char(58),char(3),char(100), +char(255),char(236),char(0),char(58),char(3),char(102),char(255),char(236),char(0),char(58), +char(3),char(104),char(255),char(236),char(0),char(58),char(3),char(106),char(255),char(236), +char(0),char(58),char(3),char(108),char(255),char(236),char(0),char(58),char(3),char(110), +char(255),char(236),char(0),char(59),char(0),char(38),char(255),char(215),char(0),char(59), +char(0),char(42),char(255),char(215),char(0),char(59),char(0),char(50),char(255),char(215), +char(0),char(59),char(0),char(52),char(255),char(215),char(0),char(59),char(0),char(137), +char(255),char(215),char(0),char(59),char(0),char(148),char(255),char(215),char(0),char(59), +char(0),char(149),char(255),char(215),char(0),char(59),char(0),char(150),char(255),char(215), +char(0),char(59),char(0),char(151),char(255),char(215),char(0),char(59),char(0),char(152), +char(255),char(215),char(0),char(59),char(0),char(154),char(255),char(215),char(0),char(59), +char(0),char(200),char(255),char(215),char(0),char(59),char(0),char(202),char(255),char(215), +char(0),char(59),char(0),char(204),char(255),char(215),char(0),char(59),char(0),char(206), +char(255),char(215),char(0),char(59),char(0),char(222),char(255),char(215),char(0),char(59), +char(0),char(224),char(255),char(215),char(0),char(59),char(0),char(226),char(255),char(215), +char(0),char(59),char(0),char(228),char(255),char(215),char(0),char(59),char(1),char(14), +char(255),char(215),char(0),char(59),char(1),char(16),char(255),char(215),char(0),char(59), +char(1),char(18),char(255),char(215),char(0),char(59),char(1),char(20),char(255),char(215), +char(0),char(59),char(1),char(71),char(255),char(215),char(0),char(59),char(2),char(95), +char(255),char(215),char(0),char(59),char(3),char(73),char(255),char(215),char(0),char(59), +char(3),char(75),char(255),char(215),char(0),char(59),char(3),char(77),char(255),char(215), +char(0),char(59),char(3),char(79),char(255),char(215),char(0),char(59),char(3),char(81), +char(255),char(215),char(0),char(59),char(3),char(83),char(255),char(215),char(0),char(59), +char(3),char(85),char(255),char(215),char(0),char(59),char(3),char(87),char(255),char(215), +char(0),char(59),char(3),char(89),char(255),char(215),char(0),char(59),char(3),char(91), +char(255),char(215),char(0),char(59),char(3),char(93),char(255),char(215),char(0),char(59), +char(3),char(95),char(255),char(215),char(0),char(60),char(0),char(15),char(255),char(133), +char(0),char(60),char(0),char(17),char(255),char(133),char(0),char(60),char(0),char(34), +char(0),char(41),char(0),char(60),char(0),char(36),char(255),char(133),char(0),char(60), +char(0),char(38),char(255),char(215),char(0),char(60),char(0),char(42),char(255),char(215), +char(0),char(60),char(0),char(50),char(255),char(215),char(0),char(60),char(0),char(52), +char(255),char(215),char(0),char(60),char(0),char(68),char(255),char(154),char(0),char(60), +char(0),char(70),char(255),char(154),char(0),char(60),char(0),char(71),char(255),char(154), +char(0),char(60),char(0),char(72),char(255),char(154),char(0),char(60),char(0),char(74), +char(255),char(215),char(0),char(60),char(0),char(80),char(255),char(195),char(0),char(60), +char(0),char(81),char(255),char(195),char(0),char(60),char(0),char(82),char(255),char(154), +char(0),char(60),char(0),char(83),char(255),char(195),char(0),char(60),char(0),char(84), +char(255),char(154),char(0),char(60),char(0),char(85),char(255),char(195),char(0),char(60), +char(0),char(86),char(255),char(174),char(0),char(60),char(0),char(88),char(255),char(195), +char(0),char(60),char(0),char(93),char(255),char(215),char(0),char(60),char(0),char(130), +char(255),char(133),char(0),char(60),char(0),char(131),char(255),char(133),char(0),char(60), +char(0),char(132),char(255),char(133),char(0),char(60),char(0),char(133),char(255),char(133), +char(0),char(60),char(0),char(134),char(255),char(133),char(0),char(60),char(0),char(135), +char(255),char(133),char(0),char(60),char(0),char(137),char(255),char(215),char(0),char(60), +char(0),char(148),char(255),char(215),char(0),char(60),char(0),char(149),char(255),char(215), +char(0),char(60),char(0),char(150),char(255),char(215),char(0),char(60),char(0),char(151), +char(255),char(215),char(0),char(60),char(0),char(152),char(255),char(215),char(0),char(60), +char(0),char(154),char(255),char(215),char(0),char(60),char(0),char(162),char(255),char(154), +char(0),char(60),char(0),char(163),char(255),char(154),char(0),char(60),char(0),char(164), +char(255),char(154),char(0),char(60),char(0),char(165),char(255),char(154),char(0),char(60), +char(0),char(166),char(255),char(154),char(0),char(60),char(0),char(167),char(255),char(154), +char(0),char(60),char(0),char(168),char(255),char(154),char(0),char(60),char(0),char(169), +char(255),char(154),char(0),char(60),char(0),char(170),char(255),char(154),char(0),char(60), +char(0),char(171),char(255),char(154),char(0),char(60),char(0),char(172),char(255),char(154), +char(0),char(60),char(0),char(173),char(255),char(154),char(0),char(60),char(0),char(180), +char(255),char(154),char(0),char(60),char(0),char(181),char(255),char(154),char(0),char(60), +char(0),char(182),char(255),char(154),char(0),char(60),char(0),char(183),char(255),char(154), +char(0),char(60),char(0),char(184),char(255),char(154),char(0),char(60),char(0),char(186), +char(255),char(154),char(0),char(60),char(0),char(187),char(255),char(195),char(0),char(60), +char(0),char(188),char(255),char(195),char(0),char(60),char(0),char(189),char(255),char(195), +char(0),char(60),char(0),char(190),char(255),char(195),char(0),char(60),char(0),char(194), +char(255),char(133),char(0),char(60),char(0),char(195),char(255),char(154),char(0),char(60), +char(0),char(196),char(255),char(133),char(0),char(60),char(0),char(197),char(255),char(154), +char(0),char(60),char(0),char(198),char(255),char(133),char(0),char(60),char(0),char(199), +char(255),char(154),char(0),char(60),char(0),char(200),char(255),char(215),char(0),char(60), +char(0),char(201),char(255),char(154),char(0),char(60),char(0),char(202),char(255),char(215), +char(0),char(60),char(0),char(203),char(255),char(154),char(0),char(60),char(0),char(204), +char(255),char(215),char(0),char(60),char(0),char(205),char(255),char(154),char(0),char(60), +char(0),char(206),char(255),char(215),char(0),char(60),char(0),char(207),char(255),char(154), +char(0),char(60),char(0),char(209),char(255),char(154),char(0),char(60),char(0),char(211), +char(255),char(154),char(0),char(60),char(0),char(213),char(255),char(154),char(0),char(60), +char(0),char(215),char(255),char(154),char(0),char(60),char(0),char(217),char(255),char(154), +char(0),char(60),char(0),char(219),char(255),char(154),char(0),char(60),char(0),char(221), +char(255),char(154),char(0),char(60),char(0),char(222),char(255),char(215),char(0),char(60), +char(0),char(223),char(255),char(215),char(0),char(60),char(0),char(224),char(255),char(215), +char(0),char(60),char(0),char(225),char(255),char(215),char(0),char(60),char(0),char(226), +char(255),char(215),char(0),char(60),char(0),char(227),char(255),char(215),char(0),char(60), +char(0),char(228),char(255),char(215),char(0),char(60),char(0),char(229),char(255),char(215), +char(0),char(60),char(0),char(250),char(255),char(195),char(0),char(60),char(1),char(6), +char(255),char(195),char(0),char(60),char(1),char(8),char(255),char(195),char(0),char(60), +char(1),char(13),char(255),char(195),char(0),char(60),char(1),char(14),char(255),char(215), +char(0),char(60),char(1),char(15),char(255),char(154),char(0),char(60),char(1),char(16), +char(255),char(215),char(0),char(60),char(1),char(17),char(255),char(154),char(0),char(60), +char(1),char(18),char(255),char(215),char(0),char(60),char(1),char(19),char(255),char(154), +char(0),char(60),char(1),char(20),char(255),char(215),char(0),char(60),char(1),char(21), +char(255),char(154),char(0),char(60),char(1),char(23),char(255),char(195),char(0),char(60), +char(1),char(25),char(255),char(195),char(0),char(60),char(1),char(29),char(255),char(174), +char(0),char(60),char(1),char(33),char(255),char(174),char(0),char(60),char(1),char(43), +char(255),char(195),char(0),char(60),char(1),char(45),char(255),char(195),char(0),char(60), +char(1),char(47),char(255),char(195),char(0),char(60),char(1),char(49),char(255),char(195), +char(0),char(60),char(1),char(51),char(255),char(195),char(0),char(60),char(1),char(53), +char(255),char(195),char(0),char(60),char(1),char(60),char(255),char(215),char(0),char(60), +char(1),char(62),char(255),char(215),char(0),char(60),char(1),char(64),char(255),char(215), +char(0),char(60),char(1),char(67),char(255),char(133),char(0),char(60),char(1),char(68), +char(255),char(154),char(0),char(60),char(1),char(70),char(255),char(154),char(0),char(60), +char(1),char(71),char(255),char(215),char(0),char(60),char(1),char(72),char(255),char(154), +char(0),char(60),char(1),char(74),char(255),char(174),char(0),char(60),char(2),char(8), +char(255),char(133),char(0),char(60),char(2),char(12),char(255),char(133),char(0),char(60), +char(2),char(87),char(255),char(195),char(0),char(60),char(2),char(88),char(255),char(133), +char(0),char(60),char(2),char(89),char(255),char(154),char(0),char(60),char(2),char(95), +char(255),char(215),char(0),char(60),char(2),char(96),char(255),char(154),char(0),char(60), +char(2),char(98),char(255),char(195),char(0),char(60),char(3),char(29),char(255),char(133), +char(0),char(60),char(3),char(30),char(255),char(154),char(0),char(60),char(3),char(31), +char(255),char(133),char(0),char(60),char(3),char(32),char(255),char(154),char(0),char(60), +char(3),char(33),char(255),char(133),char(0),char(60),char(3),char(34),char(255),char(154), +char(0),char(60),char(3),char(35),char(255),char(133),char(0),char(60),char(3),char(37), +char(255),char(133),char(0),char(60),char(3),char(38),char(255),char(154),char(0),char(60), +char(3),char(39),char(255),char(133),char(0),char(60),char(3),char(40),char(255),char(154), +char(0),char(60),char(3),char(41),char(255),char(133),char(0),char(60),char(3),char(42), +char(255),char(154),char(0),char(60),char(3),char(43),char(255),char(133),char(0),char(60), +char(3),char(44),char(255),char(154),char(0),char(60),char(3),char(45),char(255),char(133), +char(0),char(60),char(3),char(46),char(255),char(154),char(0),char(60),char(3),char(47), +char(255),char(133),char(0),char(60),char(3),char(48),char(255),char(154),char(0),char(60), +char(3),char(49),char(255),char(133),char(0),char(60),char(3),char(50),char(255),char(154), +char(0),char(60),char(3),char(51),char(255),char(133),char(0),char(60),char(3),char(52), +char(255),char(154),char(0),char(60),char(3),char(54),char(255),char(154),char(0),char(60), +char(3),char(56),char(255),char(154),char(0),char(60),char(3),char(58),char(255),char(154), +char(0),char(60),char(3),char(60),char(255),char(154),char(0),char(60),char(3),char(64), +char(255),char(154),char(0),char(60),char(3),char(66),char(255),char(154),char(0),char(60), +char(3),char(68),char(255),char(154),char(0),char(60),char(3),char(73),char(255),char(215), +char(0),char(60),char(3),char(74),char(255),char(154),char(0),char(60),char(3),char(75), +char(255),char(215),char(0),char(60),char(3),char(76),char(255),char(154),char(0),char(60), +char(3),char(77),char(255),char(215),char(0),char(60),char(3),char(78),char(255),char(154), +char(0),char(60),char(3),char(79),char(255),char(215),char(0),char(60),char(3),char(81), +char(255),char(215),char(0),char(60),char(3),char(82),char(255),char(154),char(0),char(60), +char(3),char(83),char(255),char(215),char(0),char(60),char(3),char(84),char(255),char(154), +char(0),char(60),char(3),char(85),char(255),char(215),char(0),char(60),char(3),char(86), +char(255),char(154),char(0),char(60),char(3),char(87),char(255),char(215),char(0),char(60), +char(3),char(88),char(255),char(154),char(0),char(60),char(3),char(89),char(255),char(215), +char(0),char(60),char(3),char(90),char(255),char(154),char(0),char(60),char(3),char(91), +char(255),char(215),char(0),char(60),char(3),char(92),char(255),char(154),char(0),char(60), +char(3),char(93),char(255),char(215),char(0),char(60),char(3),char(94),char(255),char(154), +char(0),char(60),char(3),char(95),char(255),char(215),char(0),char(60),char(3),char(96), +char(255),char(154),char(0),char(60),char(3),char(98),char(255),char(195),char(0),char(60), +char(3),char(100),char(255),char(195),char(0),char(60),char(3),char(102),char(255),char(195), +char(0),char(60),char(3),char(104),char(255),char(195),char(0),char(60),char(3),char(106), +char(255),char(195),char(0),char(60),char(3),char(108),char(255),char(195),char(0),char(60), +char(3),char(110),char(255),char(195),char(0),char(61),char(0),char(38),char(255),char(236), +char(0),char(61),char(0),char(42),char(255),char(236),char(0),char(61),char(0),char(50), +char(255),char(236),char(0),char(61),char(0),char(52),char(255),char(236),char(0),char(61), +char(0),char(137),char(255),char(236),char(0),char(61),char(0),char(148),char(255),char(236), +char(0),char(61),char(0),char(149),char(255),char(236),char(0),char(61),char(0),char(150), +char(255),char(236),char(0),char(61),char(0),char(151),char(255),char(236),char(0),char(61), +char(0),char(152),char(255),char(236),char(0),char(61),char(0),char(154),char(255),char(236), +char(0),char(61),char(0),char(200),char(255),char(236),char(0),char(61),char(0),char(202), +char(255),char(236),char(0),char(61),char(0),char(204),char(255),char(236),char(0),char(61), +char(0),char(206),char(255),char(236),char(0),char(61),char(0),char(222),char(255),char(236), +char(0),char(61),char(0),char(224),char(255),char(236),char(0),char(61),char(0),char(226), +char(255),char(236),char(0),char(61),char(0),char(228),char(255),char(236),char(0),char(61), +char(1),char(14),char(255),char(236),char(0),char(61),char(1),char(16),char(255),char(236), +char(0),char(61),char(1),char(18),char(255),char(236),char(0),char(61),char(1),char(20), +char(255),char(236),char(0),char(61),char(1),char(71),char(255),char(236),char(0),char(61), +char(2),char(95),char(255),char(236),char(0),char(61),char(3),char(73),char(255),char(236), +char(0),char(61),char(3),char(75),char(255),char(236),char(0),char(61),char(3),char(77), +char(255),char(236),char(0),char(61),char(3),char(79),char(255),char(236),char(0),char(61), +char(3),char(81),char(255),char(236),char(0),char(61),char(3),char(83),char(255),char(236), +char(0),char(61),char(3),char(85),char(255),char(236),char(0),char(61),char(3),char(87), +char(255),char(236),char(0),char(61),char(3),char(89),char(255),char(236),char(0),char(61), +char(3),char(91),char(255),char(236),char(0),char(61),char(3),char(93),char(255),char(236), +char(0),char(61),char(3),char(95),char(255),char(236),char(0),char(62),char(0),char(45), +char(0),char(184),char(0),char(68),char(0),char(5),char(255),char(236),char(0),char(68), +char(0),char(10),char(255),char(236),char(0),char(68),char(2),char(7),char(255),char(236), +char(0),char(68),char(2),char(11),char(255),char(236),char(0),char(69),char(0),char(5), +char(255),char(236),char(0),char(69),char(0),char(10),char(255),char(236),char(0),char(69), +char(0),char(89),char(255),char(215),char(0),char(69),char(0),char(90),char(255),char(215), +char(0),char(69),char(0),char(91),char(255),char(215),char(0),char(69),char(0),char(92), +char(255),char(215),char(0),char(69),char(0),char(93),char(255),char(236),char(0),char(69), +char(0),char(191),char(255),char(215),char(0),char(69),char(1),char(55),char(255),char(215), +char(0),char(69),char(1),char(60),char(255),char(236),char(0),char(69),char(1),char(62), +char(255),char(236),char(0),char(69),char(1),char(64),char(255),char(236),char(0),char(69), +char(1),char(251),char(255),char(215),char(0),char(69),char(1),char(253),char(255),char(215), +char(0),char(69),char(2),char(7),char(255),char(236),char(0),char(69),char(2),char(11), +char(255),char(236),char(0),char(69),char(3),char(112),char(255),char(215),char(0),char(70), +char(0),char(5),char(0),char(41),char(0),char(70),char(0),char(10),char(0),char(41), +char(0),char(70),char(2),char(7),char(0),char(41),char(0),char(70),char(2),char(11), +char(0),char(41),char(0),char(72),char(0),char(5),char(255),char(236),char(0),char(72), +char(0),char(10),char(255),char(236),char(0),char(72),char(0),char(89),char(255),char(215), +char(0),char(72),char(0),char(90),char(255),char(215),char(0),char(72),char(0),char(91), +char(255),char(215),char(0),char(72),char(0),char(92),char(255),char(215),char(0),char(72), +char(0),char(93),char(255),char(236),char(0),char(72),char(0),char(191),char(255),char(215), +char(0),char(72),char(1),char(55),char(255),char(215),char(0),char(72),char(1),char(60), +char(255),char(236),char(0),char(72),char(1),char(62),char(255),char(236),char(0),char(72), +char(1),char(64),char(255),char(236),char(0),char(72),char(1),char(251),char(255),char(215), +char(0),char(72),char(1),char(253),char(255),char(215),char(0),char(72),char(2),char(7), +char(255),char(236),char(0),char(72),char(2),char(11),char(255),char(236),char(0),char(72), +char(3),char(112),char(255),char(215),char(0),char(73),char(0),char(5),char(0),char(123), +char(0),char(73),char(0),char(10),char(0),char(123),char(0),char(73),char(2),char(7), +char(0),char(123),char(0),char(73),char(2),char(11),char(0),char(123),char(0),char(75), +char(0),char(5),char(255),char(236),char(0),char(75),char(0),char(10),char(255),char(236), +char(0),char(75),char(2),char(7),char(255),char(236),char(0),char(75),char(2),char(11), +char(255),char(236),char(0),char(78),char(0),char(70),char(255),char(215),char(0),char(78), +char(0),char(71),char(255),char(215),char(0),char(78),char(0),char(72),char(255),char(215), +char(0),char(78),char(0),char(82),char(255),char(215),char(0),char(78),char(0),char(84), +char(255),char(215),char(0),char(78),char(0),char(162),char(255),char(215),char(0),char(78), +char(0),char(169),char(255),char(215),char(0),char(78),char(0),char(170),char(255),char(215), +char(0),char(78),char(0),char(171),char(255),char(215),char(0),char(78),char(0),char(172), +char(255),char(215),char(0),char(78),char(0),char(173),char(255),char(215),char(0),char(78), +char(0),char(180),char(255),char(215),char(0),char(78),char(0),char(181),char(255),char(215), +char(0),char(78),char(0),char(182),char(255),char(215),char(0),char(78),char(0),char(183), +char(255),char(215),char(0),char(78),char(0),char(184),char(255),char(215),char(0),char(78), +char(0),char(186),char(255),char(215),char(0),char(78),char(0),char(201),char(255),char(215), +char(0),char(78),char(0),char(203),char(255),char(215),char(0),char(78),char(0),char(205), +char(255),char(215),char(0),char(78),char(0),char(207),char(255),char(215),char(0),char(78), +char(0),char(209),char(255),char(215),char(0),char(78),char(0),char(211),char(255),char(215), +char(0),char(78),char(0),char(213),char(255),char(215),char(0),char(78),char(0),char(215), +char(255),char(215),char(0),char(78),char(0),char(217),char(255),char(215),char(0),char(78), +char(0),char(219),char(255),char(215),char(0),char(78),char(0),char(221),char(255),char(215), +char(0),char(78),char(1),char(15),char(255),char(215),char(0),char(78),char(1),char(17), +char(255),char(215),char(0),char(78),char(1),char(19),char(255),char(215),char(0),char(78), +char(1),char(21),char(255),char(215),char(0),char(78),char(1),char(72),char(255),char(215), +char(0),char(78),char(2),char(96),char(255),char(215),char(0),char(78),char(3),char(54), +char(255),char(215),char(0),char(78),char(3),char(56),char(255),char(215),char(0),char(78), +char(3),char(58),char(255),char(215),char(0),char(78),char(3),char(60),char(255),char(215), +char(0),char(78),char(3),char(64),char(255),char(215),char(0),char(78),char(3),char(66), +char(255),char(215),char(0),char(78),char(3),char(68),char(255),char(215),char(0),char(78), +char(3),char(74),char(255),char(215),char(0),char(78),char(3),char(76),char(255),char(215), +char(0),char(78),char(3),char(78),char(255),char(215),char(0),char(78),char(3),char(82), +char(255),char(215),char(0),char(78),char(3),char(84),char(255),char(215),char(0),char(78), +char(3),char(86),char(255),char(215),char(0),char(78),char(3),char(88),char(255),char(215), +char(0),char(78),char(3),char(90),char(255),char(215),char(0),char(78),char(3),char(92), +char(255),char(215),char(0),char(78),char(3),char(94),char(255),char(215),char(0),char(78), +char(3),char(96),char(255),char(215),char(0),char(80),char(0),char(5),char(255),char(236), +char(0),char(80),char(0),char(10),char(255),char(236),char(0),char(80),char(2),char(7), +char(255),char(236),char(0),char(80),char(2),char(11),char(255),char(236),char(0),char(81), +char(0),char(5),char(255),char(236),char(0),char(81),char(0),char(10),char(255),char(236), +char(0),char(81),char(2),char(7),char(255),char(236),char(0),char(81),char(2),char(11), +char(255),char(236),char(0),char(82),char(0),char(5),char(255),char(236),char(0),char(82), +char(0),char(10),char(255),char(236),char(0),char(82),char(0),char(89),char(255),char(215), +char(0),char(82),char(0),char(90),char(255),char(215),char(0),char(82),char(0),char(91), +char(255),char(215),char(0),char(82),char(0),char(92),char(255),char(215),char(0),char(82), +char(0),char(93),char(255),char(236),char(0),char(82),char(0),char(191),char(255),char(215), +char(0),char(82),char(1),char(55),char(255),char(215),char(0),char(82),char(1),char(60), +char(255),char(236),char(0),char(82),char(1),char(62),char(255),char(236),char(0),char(82), +char(1),char(64),char(255),char(236),char(0),char(82),char(1),char(251),char(255),char(215), +char(0),char(82),char(1),char(253),char(255),char(215),char(0),char(82),char(2),char(7), +char(255),char(236),char(0),char(82),char(2),char(11),char(255),char(236),char(0),char(82), +char(3),char(112),char(255),char(215),char(0),char(83),char(0),char(5),char(255),char(236), +char(0),char(83),char(0),char(10),char(255),char(236),char(0),char(83),char(0),char(89), +char(255),char(215),char(0),char(83),char(0),char(90),char(255),char(215),char(0),char(83), +char(0),char(91),char(255),char(215),char(0),char(83),char(0),char(92),char(255),char(215), +char(0),char(83),char(0),char(93),char(255),char(236),char(0),char(83),char(0),char(191), +char(255),char(215),char(0),char(83),char(1),char(55),char(255),char(215),char(0),char(83), +char(1),char(60),char(255),char(236),char(0),char(83),char(1),char(62),char(255),char(236), +char(0),char(83),char(1),char(64),char(255),char(236),char(0),char(83),char(1),char(251), +char(255),char(215),char(0),char(83),char(1),char(253),char(255),char(215),char(0),char(83), +char(2),char(7),char(255),char(236),char(0),char(83),char(2),char(11),char(255),char(236), +char(0),char(83),char(3),char(112),char(255),char(215),char(0),char(85),char(0),char(5), +char(0),char(82),char(0),char(85),char(0),char(10),char(0),char(82),char(0),char(85), +char(0),char(68),char(255),char(215),char(0),char(85),char(0),char(70),char(255),char(215), +char(0),char(85),char(0),char(71),char(255),char(215),char(0),char(85),char(0),char(72), +char(255),char(215),char(0),char(85),char(0),char(74),char(255),char(236),char(0),char(85), +char(0),char(82),char(255),char(215),char(0),char(85),char(0),char(84),char(255),char(215), +char(0),char(85),char(0),char(162),char(255),char(215),char(0),char(85),char(0),char(163), +char(255),char(215),char(0),char(85),char(0),char(164),char(255),char(215),char(0),char(85), +char(0),char(165),char(255),char(215),char(0),char(85),char(0),char(166),char(255),char(215), +char(0),char(85),char(0),char(167),char(255),char(215),char(0),char(85),char(0),char(168), +char(255),char(215),char(0),char(85),char(0),char(169),char(255),char(215),char(0),char(85), +char(0),char(170),char(255),char(215),char(0),char(85),char(0),char(171),char(255),char(215), +char(0),char(85),char(0),char(172),char(255),char(215),char(0),char(85),char(0),char(173), +char(255),char(215),char(0),char(85),char(0),char(180),char(255),char(215),char(0),char(85), +char(0),char(181),char(255),char(215),char(0),char(85),char(0),char(182),char(255),char(215), +char(0),char(85),char(0),char(183),char(255),char(215),char(0),char(85),char(0),char(184), +char(255),char(215),char(0),char(85),char(0),char(186),char(255),char(215),char(0),char(85), +char(0),char(195),char(255),char(215),char(0),char(85),char(0),char(197),char(255),char(215), +char(0),char(85),char(0),char(199),char(255),char(215),char(0),char(85),char(0),char(201), +char(255),char(215),char(0),char(85),char(0),char(203),char(255),char(215),char(0),char(85), +char(0),char(205),char(255),char(215),char(0),char(85),char(0),char(207),char(255),char(215), +char(0),char(85),char(0),char(209),char(255),char(215),char(0),char(85),char(0),char(211), +char(255),char(215),char(0),char(85),char(0),char(213),char(255),char(215),char(0),char(85), +char(0),char(215),char(255),char(215),char(0),char(85),char(0),char(217),char(255),char(215), +char(0),char(85),char(0),char(219),char(255),char(215),char(0),char(85),char(0),char(221), +char(255),char(215),char(0),char(85),char(0),char(223),char(255),char(236),char(0),char(85), +char(0),char(225),char(255),char(236),char(0),char(85),char(0),char(227),char(255),char(236), +char(0),char(85),char(0),char(229),char(255),char(236),char(0),char(85),char(1),char(15), +char(255),char(215),char(0),char(85),char(1),char(17),char(255),char(215),char(0),char(85), +char(1),char(19),char(255),char(215),char(0),char(85),char(1),char(21),char(255),char(215), +char(0),char(85),char(1),char(68),char(255),char(215),char(0),char(85),char(1),char(70), +char(255),char(215),char(0),char(85),char(1),char(72),char(255),char(215),char(0),char(85), +char(2),char(7),char(0),char(82),char(0),char(85),char(2),char(11),char(0),char(82), +char(0),char(85),char(2),char(89),char(255),char(215),char(0),char(85),char(2),char(96), +char(255),char(215),char(0),char(85),char(3),char(30),char(255),char(215),char(0),char(85), +char(3),char(32),char(255),char(215),char(0),char(85),char(3),char(34),char(255),char(215), +char(0),char(85),char(3),char(38),char(255),char(215),char(0),char(85),char(3),char(40), +char(255),char(215),char(0),char(85),char(3),char(42),char(255),char(215),char(0),char(85), +char(3),char(44),char(255),char(215),char(0),char(85),char(3),char(46),char(255),char(215), +char(0),char(85),char(3),char(48),char(255),char(215),char(0),char(85),char(3),char(50), +char(255),char(215),char(0),char(85),char(3),char(52),char(255),char(215),char(0),char(85), +char(3),char(54),char(255),char(215),char(0),char(85),char(3),char(56),char(255),char(215), +char(0),char(85),char(3),char(58),char(255),char(215),char(0),char(85),char(3),char(60), +char(255),char(215),char(0),char(85),char(3),char(64),char(255),char(215),char(0),char(85), +char(3),char(66),char(255),char(215),char(0),char(85),char(3),char(68),char(255),char(215), +char(0),char(85),char(3),char(74),char(255),char(215),char(0),char(85),char(3),char(76), +char(255),char(215),char(0),char(85),char(3),char(78),char(255),char(215),char(0),char(85), +char(3),char(82),char(255),char(215),char(0),char(85),char(3),char(84),char(255),char(215), +char(0),char(85),char(3),char(86),char(255),char(215),char(0),char(85),char(3),char(88), +char(255),char(215),char(0),char(85),char(3),char(90),char(255),char(215),char(0),char(85), +char(3),char(92),char(255),char(215),char(0),char(85),char(3),char(94),char(255),char(215), +char(0),char(85),char(3),char(96),char(255),char(215),char(0),char(87),char(0),char(5), +char(0),char(41),char(0),char(87),char(0),char(10),char(0),char(41),char(0),char(87), +char(2),char(7),char(0),char(41),char(0),char(87),char(2),char(11),char(0),char(41), +char(0),char(89),char(0),char(5),char(0),char(82),char(0),char(89),char(0),char(10), +char(0),char(82),char(0),char(89),char(0),char(15),char(255),char(174),char(0),char(89), +char(0),char(17),char(255),char(174),char(0),char(89),char(0),char(34),char(0),char(41), +char(0),char(89),char(2),char(7),char(0),char(82),char(0),char(89),char(2),char(8), +char(255),char(174),char(0),char(89),char(2),char(11),char(0),char(82),char(0),char(89), +char(2),char(12),char(255),char(174),char(0),char(90),char(0),char(5),char(0),char(82), +char(0),char(90),char(0),char(10),char(0),char(82),char(0),char(90),char(0),char(15), +char(255),char(174),char(0),char(90),char(0),char(17),char(255),char(174),char(0),char(90), +char(0),char(34),char(0),char(41),char(0),char(90),char(2),char(7),char(0),char(82), +char(0),char(90),char(2),char(8),char(255),char(174),char(0),char(90),char(2),char(11), +char(0),char(82),char(0),char(90),char(2),char(12),char(255),char(174),char(0),char(91), +char(0),char(70),char(255),char(215),char(0),char(91),char(0),char(71),char(255),char(215), +char(0),char(91),char(0),char(72),char(255),char(215),char(0),char(91),char(0),char(82), +char(255),char(215),char(0),char(91),char(0),char(84),char(255),char(215),char(0),char(91), +char(0),char(162),char(255),char(215),char(0),char(91),char(0),char(169),char(255),char(215), +char(0),char(91),char(0),char(170),char(255),char(215),char(0),char(91),char(0),char(171), +char(255),char(215),char(0),char(91),char(0),char(172),char(255),char(215),char(0),char(91), +char(0),char(173),char(255),char(215),char(0),char(91),char(0),char(180),char(255),char(215), +char(0),char(91),char(0),char(181),char(255),char(215),char(0),char(91),char(0),char(182), +char(255),char(215),char(0),char(91),char(0),char(183),char(255),char(215),char(0),char(91), +char(0),char(184),char(255),char(215),char(0),char(91),char(0),char(186),char(255),char(215), +char(0),char(91),char(0),char(201),char(255),char(215),char(0),char(91),char(0),char(203), +char(255),char(215),char(0),char(91),char(0),char(205),char(255),char(215),char(0),char(91), +char(0),char(207),char(255),char(215),char(0),char(91),char(0),char(209),char(255),char(215), +char(0),char(91),char(0),char(211),char(255),char(215),char(0),char(91),char(0),char(213), +char(255),char(215),char(0),char(91),char(0),char(215),char(255),char(215),char(0),char(91), +char(0),char(217),char(255),char(215),char(0),char(91),char(0),char(219),char(255),char(215), +char(0),char(91),char(0),char(221),char(255),char(215),char(0),char(91),char(1),char(15), +char(255),char(215),char(0),char(91),char(1),char(17),char(255),char(215),char(0),char(91), +char(1),char(19),char(255),char(215),char(0),char(91),char(1),char(21),char(255),char(215), +char(0),char(91),char(1),char(72),char(255),char(215),char(0),char(91),char(2),char(96), +char(255),char(215),char(0),char(91),char(3),char(54),char(255),char(215),char(0),char(91), +char(3),char(56),char(255),char(215),char(0),char(91),char(3),char(58),char(255),char(215), +char(0),char(91),char(3),char(60),char(255),char(215),char(0),char(91),char(3),char(64), +char(255),char(215),char(0),char(91),char(3),char(66),char(255),char(215),char(0),char(91), +char(3),char(68),char(255),char(215),char(0),char(91),char(3),char(74),char(255),char(215), +char(0),char(91),char(3),char(76),char(255),char(215),char(0),char(91),char(3),char(78), +char(255),char(215),char(0),char(91),char(3),char(82),char(255),char(215),char(0),char(91), +char(3),char(84),char(255),char(215),char(0),char(91),char(3),char(86),char(255),char(215), +char(0),char(91),char(3),char(88),char(255),char(215),char(0),char(91),char(3),char(90), +char(255),char(215),char(0),char(91),char(3),char(92),char(255),char(215),char(0),char(91), +char(3),char(94),char(255),char(215),char(0),char(91),char(3),char(96),char(255),char(215), +char(0),char(92),char(0),char(5),char(0),char(82),char(0),char(92),char(0),char(10), +char(0),char(82),char(0),char(92),char(0),char(15),char(255),char(174),char(0),char(92), +char(0),char(17),char(255),char(174),char(0),char(92),char(0),char(34),char(0),char(41), +char(0),char(92),char(2),char(7),char(0),char(82),char(0),char(92),char(2),char(8), +char(255),char(174),char(0),char(92),char(2),char(11),char(0),char(82),char(0),char(92), +char(2),char(12),char(255),char(174),char(0),char(94),char(0),char(45),char(0),char(184), +char(0),char(130),char(0),char(5),char(255),char(113),char(0),char(130),char(0),char(10), +char(255),char(113),char(0),char(130),char(0),char(38),char(255),char(215),char(0),char(130), +char(0),char(42),char(255),char(215),char(0),char(130),char(0),char(45),char(1),char(10), +char(0),char(130),char(0),char(50),char(255),char(215),char(0),char(130),char(0),char(52), +char(255),char(215),char(0),char(130),char(0),char(55),char(255),char(113),char(0),char(130), +char(0),char(57),char(255),char(174),char(0),char(130),char(0),char(58),char(255),char(174), +char(0),char(130),char(0),char(60),char(255),char(133),char(0),char(130),char(0),char(137), +char(255),char(215),char(0),char(130),char(0),char(148),char(255),char(215),char(0),char(130), +char(0),char(149),char(255),char(215),char(0),char(130),char(0),char(150),char(255),char(215), +char(0),char(130),char(0),char(151),char(255),char(215),char(0),char(130),char(0),char(152), +char(255),char(215),char(0),char(130),char(0),char(154),char(255),char(215),char(0),char(130), +char(0),char(159),char(255),char(133),char(0),char(130),char(0),char(200),char(255),char(215), +char(0),char(130),char(0),char(202),char(255),char(215),char(0),char(130),char(0),char(204), +char(255),char(215),char(0),char(130),char(0),char(206),char(255),char(215),char(0),char(130), +char(0),char(222),char(255),char(215),char(0),char(130),char(0),char(224),char(255),char(215), +char(0),char(130),char(0),char(226),char(255),char(215),char(0),char(130),char(0),char(228), +char(255),char(215),char(0),char(130),char(1),char(14),char(255),char(215),char(0),char(130), +char(1),char(16),char(255),char(215),char(0),char(130),char(1),char(18),char(255),char(215), +char(0),char(130),char(1),char(20),char(255),char(215),char(0),char(130),char(1),char(36), +char(255),char(113),char(0),char(130),char(1),char(38),char(255),char(113),char(0),char(130), +char(1),char(54),char(255),char(174),char(0),char(130),char(1),char(56),char(255),char(133), +char(0),char(130),char(1),char(58),char(255),char(133),char(0),char(130),char(1),char(71), +char(255),char(215),char(0),char(130),char(1),char(250),char(255),char(174),char(0),char(130), +char(1),char(252),char(255),char(174),char(0),char(130),char(1),char(254),char(255),char(174), +char(0),char(130),char(2),char(0),char(255),char(133),char(0),char(130),char(2),char(7), +char(255),char(113),char(0),char(130),char(2),char(11),char(255),char(113),char(0),char(130), +char(2),char(95),char(255),char(215),char(0),char(130),char(3),char(73),char(255),char(215), +char(0),char(130),char(3),char(75),char(255),char(215),char(0),char(130),char(3),char(77), +char(255),char(215),char(0),char(130),char(3),char(79),char(255),char(215),char(0),char(130), +char(3),char(81),char(255),char(215),char(0),char(130),char(3),char(83),char(255),char(215), +char(0),char(130),char(3),char(85),char(255),char(215),char(0),char(130),char(3),char(87), +char(255),char(215),char(0),char(130),char(3),char(89),char(255),char(215),char(0),char(130), +char(3),char(91),char(255),char(215),char(0),char(130),char(3),char(93),char(255),char(215), +char(0),char(130),char(3),char(95),char(255),char(215),char(0),char(130),char(3),char(111), +char(255),char(133),char(0),char(130),char(3),char(113),char(255),char(133),char(0),char(130), +char(3),char(115),char(255),char(133),char(0),char(130),char(3),char(143),char(255),char(113), +char(0),char(131),char(0),char(5),char(255),char(113),char(0),char(131),char(0),char(10), +char(255),char(113),char(0),char(131),char(0),char(38),char(255),char(215),char(0),char(131), +char(0),char(42),char(255),char(215),char(0),char(131),char(0),char(45),char(1),char(10), +char(0),char(131),char(0),char(50),char(255),char(215),char(0),char(131),char(0),char(52), +char(255),char(215),char(0),char(131),char(0),char(55),char(255),char(113),char(0),char(131), +char(0),char(57),char(255),char(174),char(0),char(131),char(0),char(58),char(255),char(174), +char(0),char(131),char(0),char(60),char(255),char(133),char(0),char(131),char(0),char(137), +char(255),char(215),char(0),char(131),char(0),char(148),char(255),char(215),char(0),char(131), +char(0),char(149),char(255),char(215),char(0),char(131),char(0),char(150),char(255),char(215), +char(0),char(131),char(0),char(151),char(255),char(215),char(0),char(131),char(0),char(152), +char(255),char(215),char(0),char(131),char(0),char(154),char(255),char(215),char(0),char(131), +char(0),char(159),char(255),char(133),char(0),char(131),char(0),char(200),char(255),char(215), +char(0),char(131),char(0),char(202),char(255),char(215),char(0),char(131),char(0),char(204), +char(255),char(215),char(0),char(131),char(0),char(206),char(255),char(215),char(0),char(131), +char(0),char(222),char(255),char(215),char(0),char(131),char(0),char(224),char(255),char(215), +char(0),char(131),char(0),char(226),char(255),char(215),char(0),char(131),char(0),char(228), +char(255),char(215),char(0),char(131),char(1),char(14),char(255),char(215),char(0),char(131), +char(1),char(16),char(255),char(215),char(0),char(131),char(1),char(18),char(255),char(215), +char(0),char(131),char(1),char(20),char(255),char(215),char(0),char(131),char(1),char(36), +char(255),char(113),char(0),char(131),char(1),char(38),char(255),char(113),char(0),char(131), +char(1),char(54),char(255),char(174),char(0),char(131),char(1),char(56),char(255),char(133), +char(0),char(131),char(1),char(58),char(255),char(133),char(0),char(131),char(1),char(71), +char(255),char(215),char(0),char(131),char(1),char(250),char(255),char(174),char(0),char(131), +char(1),char(252),char(255),char(174),char(0),char(131),char(1),char(254),char(255),char(174), +char(0),char(131),char(2),char(0),char(255),char(133),char(0),char(131),char(2),char(7), +char(255),char(113),char(0),char(131),char(2),char(11),char(255),char(113),char(0),char(131), +char(2),char(95),char(255),char(215),char(0),char(131),char(3),char(73),char(255),char(215), +char(0),char(131),char(3),char(75),char(255),char(215),char(0),char(131),char(3),char(77), +char(255),char(215),char(0),char(131),char(3),char(79),char(255),char(215),char(0),char(131), +char(3),char(81),char(255),char(215),char(0),char(131),char(3),char(83),char(255),char(215), +char(0),char(131),char(3),char(85),char(255),char(215),char(0),char(131),char(3),char(87), +char(255),char(215),char(0),char(131),char(3),char(89),char(255),char(215),char(0),char(131), +char(3),char(91),char(255),char(215),char(0),char(131),char(3),char(93),char(255),char(215), +char(0),char(131),char(3),char(95),char(255),char(215),char(0),char(131),char(3),char(111), +char(255),char(133),char(0),char(131),char(3),char(113),char(255),char(133),char(0),char(131), +char(3),char(115),char(255),char(133),char(0),char(131),char(3),char(143),char(255),char(113), +char(0),char(132),char(0),char(5),char(255),char(113),char(0),char(132),char(0),char(10), +char(255),char(113),char(0),char(132),char(0),char(38),char(255),char(215),char(0),char(132), +char(0),char(42),char(255),char(215),char(0),char(132),char(0),char(45),char(1),char(10), +char(0),char(132),char(0),char(50),char(255),char(215),char(0),char(132),char(0),char(52), +char(255),char(215),char(0),char(132),char(0),char(55),char(255),char(113),char(0),char(132), +char(0),char(57),char(255),char(174),char(0),char(132),char(0),char(58),char(255),char(174), +char(0),char(132),char(0),char(60),char(255),char(133),char(0),char(132),char(0),char(137), +char(255),char(215),char(0),char(132),char(0),char(148),char(255),char(215),char(0),char(132), +char(0),char(149),char(255),char(215),char(0),char(132),char(0),char(150),char(255),char(215), +char(0),char(132),char(0),char(151),char(255),char(215),char(0),char(132),char(0),char(152), +char(255),char(215),char(0),char(132),char(0),char(154),char(255),char(215),char(0),char(132), +char(0),char(159),char(255),char(133),char(0),char(132),char(0),char(200),char(255),char(215), +char(0),char(132),char(0),char(202),char(255),char(215),char(0),char(132),char(0),char(204), +char(255),char(215),char(0),char(132),char(0),char(206),char(255),char(215),char(0),char(132), +char(0),char(222),char(255),char(215),char(0),char(132),char(0),char(224),char(255),char(215), +char(0),char(132),char(0),char(226),char(255),char(215),char(0),char(132),char(0),char(228), +char(255),char(215),char(0),char(132),char(1),char(14),char(255),char(215),char(0),char(132), +char(1),char(16),char(255),char(215),char(0),char(132),char(1),char(18),char(255),char(215), +char(0),char(132),char(1),char(20),char(255),char(215),char(0),char(132),char(1),char(36), +char(255),char(113),char(0),char(132),char(1),char(38),char(255),char(113),char(0),char(132), +char(1),char(54),char(255),char(174),char(0),char(132),char(1),char(56),char(255),char(133), +char(0),char(132),char(1),char(58),char(255),char(133),char(0),char(132),char(1),char(71), +char(255),char(215),char(0),char(132),char(1),char(250),char(255),char(174),char(0),char(132), +char(1),char(252),char(255),char(174),char(0),char(132),char(1),char(254),char(255),char(174), +char(0),char(132),char(2),char(0),char(255),char(133),char(0),char(132),char(2),char(7), +char(255),char(113),char(0),char(132),char(2),char(11),char(255),char(113),char(0),char(132), +char(2),char(95),char(255),char(215),char(0),char(132),char(3),char(73),char(255),char(215), +char(0),char(132),char(3),char(75),char(255),char(215),char(0),char(132),char(3),char(77), +char(255),char(215),char(0),char(132),char(3),char(79),char(255),char(215),char(0),char(132), +char(3),char(81),char(255),char(215),char(0),char(132),char(3),char(83),char(255),char(215), +char(0),char(132),char(3),char(85),char(255),char(215),char(0),char(132),char(3),char(87), +char(255),char(215),char(0),char(132),char(3),char(89),char(255),char(215),char(0),char(132), +char(3),char(91),char(255),char(215),char(0),char(132),char(3),char(93),char(255),char(215), +char(0),char(132),char(3),char(95),char(255),char(215),char(0),char(132),char(3),char(111), +char(255),char(133),char(0),char(132),char(3),char(113),char(255),char(133),char(0),char(132), +char(3),char(115),char(255),char(133),char(0),char(132),char(3),char(143),char(255),char(113), +char(0),char(133),char(0),char(5),char(255),char(113),char(0),char(133),char(0),char(10), +char(255),char(113),char(0),char(133),char(0),char(38),char(255),char(215),char(0),char(133), +char(0),char(42),char(255),char(215),char(0),char(133),char(0),char(45),char(1),char(10), +char(0),char(133),char(0),char(50),char(255),char(215),char(0),char(133),char(0),char(52), +char(255),char(215),char(0),char(133),char(0),char(55),char(255),char(113),char(0),char(133), +char(0),char(57),char(255),char(174),char(0),char(133),char(0),char(58),char(255),char(174), +char(0),char(133),char(0),char(60),char(255),char(133),char(0),char(133),char(0),char(137), +char(255),char(215),char(0),char(133),char(0),char(148),char(255),char(215),char(0),char(133), +char(0),char(149),char(255),char(215),char(0),char(133),char(0),char(150),char(255),char(215), +char(0),char(133),char(0),char(151),char(255),char(215),char(0),char(133),char(0),char(152), +char(255),char(215),char(0),char(133),char(0),char(154),char(255),char(215),char(0),char(133), +char(0),char(159),char(255),char(133),char(0),char(133),char(0),char(200),char(255),char(215), +char(0),char(133),char(0),char(202),char(255),char(215),char(0),char(133),char(0),char(204), +char(255),char(215),char(0),char(133),char(0),char(206),char(255),char(215),char(0),char(133), +char(0),char(222),char(255),char(215),char(0),char(133),char(0),char(224),char(255),char(215), +char(0),char(133),char(0),char(226),char(255),char(215),char(0),char(133),char(0),char(228), +char(255),char(215),char(0),char(133),char(1),char(14),char(255),char(215),char(0),char(133), +char(1),char(16),char(255),char(215),char(0),char(133),char(1),char(18),char(255),char(215), +char(0),char(133),char(1),char(20),char(255),char(215),char(0),char(133),char(1),char(36), +char(255),char(113),char(0),char(133),char(1),char(38),char(255),char(113),char(0),char(133), +char(1),char(54),char(255),char(174),char(0),char(133),char(1),char(56),char(255),char(133), +char(0),char(133),char(1),char(58),char(255),char(133),char(0),char(133),char(1),char(71), +char(255),char(215),char(0),char(133),char(1),char(250),char(255),char(174),char(0),char(133), +char(1),char(252),char(255),char(174),char(0),char(133),char(1),char(254),char(255),char(174), +char(0),char(133),char(2),char(0),char(255),char(133),char(0),char(133),char(2),char(7), +char(255),char(113),char(0),char(133),char(2),char(11),char(255),char(113),char(0),char(133), +char(2),char(95),char(255),char(215),char(0),char(133),char(3),char(73),char(255),char(215), +char(0),char(133),char(3),char(75),char(255),char(215),char(0),char(133),char(3),char(77), +char(255),char(215),char(0),char(133),char(3),char(79),char(255),char(215),char(0),char(133), +char(3),char(81),char(255),char(215),char(0),char(133),char(3),char(83),char(255),char(215), +char(0),char(133),char(3),char(85),char(255),char(215),char(0),char(133),char(3),char(87), +char(255),char(215),char(0),char(133),char(3),char(89),char(255),char(215),char(0),char(133), +char(3),char(91),char(255),char(215),char(0),char(133),char(3),char(93),char(255),char(215), +char(0),char(133),char(3),char(95),char(255),char(215),char(0),char(133),char(3),char(111), +char(255),char(133),char(0),char(133),char(3),char(113),char(255),char(133),char(0),char(133), +char(3),char(115),char(255),char(133),char(0),char(133),char(3),char(143),char(255),char(113), +char(0),char(134),char(0),char(5),char(255),char(113),char(0),char(134),char(0),char(10), +char(255),char(113),char(0),char(134),char(0),char(38),char(255),char(215),char(0),char(134), +char(0),char(42),char(255),char(215),char(0),char(134),char(0),char(45),char(1),char(10), +char(0),char(134),char(0),char(50),char(255),char(215),char(0),char(134),char(0),char(52), +char(255),char(215),char(0),char(134),char(0),char(55),char(255),char(113),char(0),char(134), +char(0),char(57),char(255),char(174),char(0),char(134),char(0),char(58),char(255),char(174), +char(0),char(134),char(0),char(60),char(255),char(133),char(0),char(134),char(0),char(137), +char(255),char(215),char(0),char(134),char(0),char(148),char(255),char(215),char(0),char(134), +char(0),char(149),char(255),char(215),char(0),char(134),char(0),char(150),char(255),char(215), +char(0),char(134),char(0),char(151),char(255),char(215),char(0),char(134),char(0),char(152), +char(255),char(215),char(0),char(134),char(0),char(154),char(255),char(215),char(0),char(134), +char(0),char(159),char(255),char(133),char(0),char(134),char(0),char(200),char(255),char(215), +char(0),char(134),char(0),char(202),char(255),char(215),char(0),char(134),char(0),char(204), +char(255),char(215),char(0),char(134),char(0),char(206),char(255),char(215),char(0),char(134), +char(0),char(222),char(255),char(215),char(0),char(134),char(0),char(224),char(255),char(215), +char(0),char(134),char(0),char(226),char(255),char(215),char(0),char(134),char(0),char(228), +char(255),char(215),char(0),char(134),char(1),char(14),char(255),char(215),char(0),char(134), +char(1),char(16),char(255),char(215),char(0),char(134),char(1),char(18),char(255),char(215), +char(0),char(134),char(1),char(20),char(255),char(215),char(0),char(134),char(1),char(36), +char(255),char(113),char(0),char(134),char(1),char(38),char(255),char(113),char(0),char(134), +char(1),char(54),char(255),char(174),char(0),char(134),char(1),char(56),char(255),char(133), +char(0),char(134),char(1),char(58),char(255),char(133),char(0),char(134),char(1),char(71), +char(255),char(215),char(0),char(134),char(1),char(250),char(255),char(174),char(0),char(134), +char(1),char(252),char(255),char(174),char(0),char(134),char(1),char(254),char(255),char(174), +char(0),char(134),char(2),char(0),char(255),char(133),char(0),char(134),char(2),char(7), +char(255),char(113),char(0),char(134),char(2),char(11),char(255),char(113),char(0),char(134), +char(2),char(95),char(255),char(215),char(0),char(134),char(3),char(73),char(255),char(215), +char(0),char(134),char(3),char(75),char(255),char(215),char(0),char(134),char(3),char(77), +char(255),char(215),char(0),char(134),char(3),char(79),char(255),char(215),char(0),char(134), +char(3),char(81),char(255),char(215),char(0),char(134),char(3),char(83),char(255),char(215), +char(0),char(134),char(3),char(85),char(255),char(215),char(0),char(134),char(3),char(87), +char(255),char(215),char(0),char(134),char(3),char(89),char(255),char(215),char(0),char(134), +char(3),char(91),char(255),char(215),char(0),char(134),char(3),char(93),char(255),char(215), +char(0),char(134),char(3),char(95),char(255),char(215),char(0),char(134),char(3),char(111), +char(255),char(133),char(0),char(134),char(3),char(113),char(255),char(133),char(0),char(134), +char(3),char(115),char(255),char(133),char(0),char(134),char(3),char(143),char(255),char(113), +char(0),char(135),char(0),char(5),char(255),char(113),char(0),char(135),char(0),char(10), +char(255),char(113),char(0),char(135),char(0),char(38),char(255),char(215),char(0),char(135), +char(0),char(42),char(255),char(215),char(0),char(135),char(0),char(45),char(1),char(10), +char(0),char(135),char(0),char(50),char(255),char(215),char(0),char(135),char(0),char(52), +char(255),char(215),char(0),char(135),char(0),char(55),char(255),char(113),char(0),char(135), +char(0),char(57),char(255),char(174),char(0),char(135),char(0),char(58),char(255),char(174), +char(0),char(135),char(0),char(60),char(255),char(133),char(0),char(135),char(0),char(137), +char(255),char(215),char(0),char(135),char(0),char(148),char(255),char(215),char(0),char(135), +char(0),char(149),char(255),char(215),char(0),char(135),char(0),char(150),char(255),char(215), +char(0),char(135),char(0),char(151),char(255),char(215),char(0),char(135),char(0),char(152), +char(255),char(215),char(0),char(135),char(0),char(154),char(255),char(215),char(0),char(135), +char(0),char(159),char(255),char(133),char(0),char(135),char(0),char(200),char(255),char(215), +char(0),char(135),char(0),char(202),char(255),char(215),char(0),char(135),char(0),char(204), +char(255),char(215),char(0),char(135),char(0),char(206),char(255),char(215),char(0),char(135), +char(0),char(222),char(255),char(215),char(0),char(135),char(0),char(224),char(255),char(215), +char(0),char(135),char(0),char(226),char(255),char(215),char(0),char(135),char(0),char(228), +char(255),char(215),char(0),char(135),char(1),char(14),char(255),char(215),char(0),char(135), +char(1),char(16),char(255),char(215),char(0),char(135),char(1),char(18),char(255),char(215), +char(0),char(135),char(1),char(20),char(255),char(215),char(0),char(135),char(1),char(36), +char(255),char(113),char(0),char(135),char(1),char(38),char(255),char(113),char(0),char(135), +char(1),char(54),char(255),char(174),char(0),char(135),char(1),char(56),char(255),char(133), +char(0),char(135),char(1),char(58),char(255),char(133),char(0),char(135),char(1),char(71), +char(255),char(215),char(0),char(135),char(1),char(250),char(255),char(174),char(0),char(135), +char(1),char(252),char(255),char(174),char(0),char(135),char(1),char(254),char(255),char(174), +char(0),char(135),char(2),char(0),char(255),char(133),char(0),char(135),char(2),char(7), +char(255),char(113),char(0),char(135),char(2),char(11),char(255),char(113),char(0),char(135), +char(2),char(95),char(255),char(215),char(0),char(135),char(3),char(73),char(255),char(215), +char(0),char(135),char(3),char(75),char(255),char(215),char(0),char(135),char(3),char(77), +char(255),char(215),char(0),char(135),char(3),char(79),char(255),char(215),char(0),char(135), +char(3),char(81),char(255),char(215),char(0),char(135),char(3),char(83),char(255),char(215), +char(0),char(135),char(3),char(85),char(255),char(215),char(0),char(135),char(3),char(87), +char(255),char(215),char(0),char(135),char(3),char(89),char(255),char(215),char(0),char(135), +char(3),char(91),char(255),char(215),char(0),char(135),char(3),char(93),char(255),char(215), +char(0),char(135),char(3),char(95),char(255),char(215),char(0),char(135),char(3),char(111), +char(255),char(133),char(0),char(135),char(3),char(113),char(255),char(133),char(0),char(135), +char(3),char(115),char(255),char(133),char(0),char(135),char(3),char(143),char(255),char(113), +char(0),char(136),char(0),char(45),char(0),char(123),char(0),char(137),char(0),char(38), +char(255),char(215),char(0),char(137),char(0),char(42),char(255),char(215),char(0),char(137), +char(0),char(50),char(255),char(215),char(0),char(137),char(0),char(52),char(255),char(215), +char(0),char(137),char(0),char(137),char(255),char(215),char(0),char(137),char(0),char(148), +char(255),char(215),char(0),char(137),char(0),char(149),char(255),char(215),char(0),char(137), +char(0),char(150),char(255),char(215),char(0),char(137),char(0),char(151),char(255),char(215), +char(0),char(137),char(0),char(152),char(255),char(215),char(0),char(137),char(0),char(154), +char(255),char(215),char(0),char(137),char(0),char(200),char(255),char(215),char(0),char(137), +char(0),char(202),char(255),char(215),char(0),char(137),char(0),char(204),char(255),char(215), +char(0),char(137),char(0),char(206),char(255),char(215),char(0),char(137),char(0),char(222), +char(255),char(215),char(0),char(137),char(0),char(224),char(255),char(215),char(0),char(137), +char(0),char(226),char(255),char(215),char(0),char(137),char(0),char(228),char(255),char(215), +char(0),char(137),char(1),char(14),char(255),char(215),char(0),char(137),char(1),char(16), +char(255),char(215),char(0),char(137),char(1),char(18),char(255),char(215),char(0),char(137), +char(1),char(20),char(255),char(215),char(0),char(137),char(1),char(71),char(255),char(215), +char(0),char(137),char(2),char(95),char(255),char(215),char(0),char(137),char(3),char(73), +char(255),char(215),char(0),char(137),char(3),char(75),char(255),char(215),char(0),char(137), +char(3),char(77),char(255),char(215),char(0),char(137),char(3),char(79),char(255),char(215), +char(0),char(137),char(3),char(81),char(255),char(215),char(0),char(137),char(3),char(83), +char(255),char(215),char(0),char(137),char(3),char(85),char(255),char(215),char(0),char(137), +char(3),char(87),char(255),char(215),char(0),char(137),char(3),char(89),char(255),char(215), +char(0),char(137),char(3),char(91),char(255),char(215),char(0),char(137),char(3),char(93), +char(255),char(215),char(0),char(137),char(3),char(95),char(255),char(215),char(0),char(138), +char(0),char(45),char(0),char(123),char(0),char(139),char(0),char(45),char(0),char(123), +char(0),char(140),char(0),char(45),char(0),char(123),char(0),char(141),char(0),char(45), +char(0),char(123),char(0),char(146),char(0),char(15),char(255),char(174),char(0),char(146), +char(0),char(17),char(255),char(174),char(0),char(146),char(0),char(36),char(255),char(215), +char(0),char(146),char(0),char(55),char(255),char(195),char(0),char(146),char(0),char(57), +char(255),char(236),char(0),char(146),char(0),char(58),char(255),char(236),char(0),char(146), +char(0),char(59),char(255),char(215),char(0),char(146),char(0),char(60),char(255),char(236), +char(0),char(146),char(0),char(61),char(255),char(236),char(0),char(146),char(0),char(130), +char(255),char(215),char(0),char(146),char(0),char(131),char(255),char(215),char(0),char(146), +char(0),char(132),char(255),char(215),char(0),char(146),char(0),char(133),char(255),char(215), +char(0),char(146),char(0),char(134),char(255),char(215),char(0),char(146),char(0),char(135), +char(255),char(215),char(0),char(146),char(0),char(159),char(255),char(236),char(0),char(146), +char(0),char(194),char(255),char(215),char(0),char(146),char(0),char(196),char(255),char(215), +char(0),char(146),char(0),char(198),char(255),char(215),char(0),char(146),char(1),char(36), +char(255),char(195),char(0),char(146),char(1),char(38),char(255),char(195),char(0),char(146), +char(1),char(54),char(255),char(236),char(0),char(146),char(1),char(56),char(255),char(236), +char(0),char(146),char(1),char(58),char(255),char(236),char(0),char(146),char(1),char(59), +char(255),char(236),char(0),char(146),char(1),char(61),char(255),char(236),char(0),char(146), +char(1),char(63),char(255),char(236),char(0),char(146),char(1),char(67),char(255),char(215), +char(0),char(146),char(1),char(160),char(255),char(236),char(0),char(146),char(1),char(250), +char(255),char(236),char(0),char(146),char(1),char(252),char(255),char(236),char(0),char(146), +char(1),char(254),char(255),char(236),char(0),char(146),char(2),char(0),char(255),char(236), +char(0),char(146),char(2),char(8),char(255),char(174),char(0),char(146),char(2),char(12), +char(255),char(174),char(0),char(146),char(2),char(88),char(255),char(215),char(0),char(146), +char(3),char(29),char(255),char(215),char(0),char(146),char(3),char(31),char(255),char(215), +char(0),char(146),char(3),char(33),char(255),char(215),char(0),char(146),char(3),char(35), +char(255),char(215),char(0),char(146),char(3),char(37),char(255),char(215),char(0),char(146), +char(3),char(39),char(255),char(215),char(0),char(146),char(3),char(41),char(255),char(215), +char(0),char(146),char(3),char(43),char(255),char(215),char(0),char(146),char(3),char(45), +char(255),char(215),char(0),char(146),char(3),char(47),char(255),char(215),char(0),char(146), +char(3),char(49),char(255),char(215),char(0),char(146),char(3),char(51),char(255),char(215), +char(0),char(146),char(3),char(111),char(255),char(236),char(0),char(146),char(3),char(113), +char(255),char(236),char(0),char(146),char(3),char(115),char(255),char(236),char(0),char(146), +char(3),char(143),char(255),char(195),char(0),char(148),char(0),char(15),char(255),char(174), +char(0),char(148),char(0),char(17),char(255),char(174),char(0),char(148),char(0),char(36), +char(255),char(215),char(0),char(148),char(0),char(55),char(255),char(195),char(0),char(148), +char(0),char(57),char(255),char(236),char(0),char(148),char(0),char(58),char(255),char(236), +char(0),char(148),char(0),char(59),char(255),char(215),char(0),char(148),char(0),char(60), +char(255),char(236),char(0),char(148),char(0),char(61),char(255),char(236),char(0),char(148), +char(0),char(130),char(255),char(215),char(0),char(148),char(0),char(131),char(255),char(215), +char(0),char(148),char(0),char(132),char(255),char(215),char(0),char(148),char(0),char(133), +char(255),char(215),char(0),char(148),char(0),char(134),char(255),char(215),char(0),char(148), +char(0),char(135),char(255),char(215),char(0),char(148),char(0),char(159),char(255),char(236), +char(0),char(148),char(0),char(194),char(255),char(215),char(0),char(148),char(0),char(196), +char(255),char(215),char(0),char(148),char(0),char(198),char(255),char(215),char(0),char(148), +char(1),char(36),char(255),char(195),char(0),char(148),char(1),char(38),char(255),char(195), +char(0),char(148),char(1),char(54),char(255),char(236),char(0),char(148),char(1),char(56), +char(255),char(236),char(0),char(148),char(1),char(58),char(255),char(236),char(0),char(148), +char(1),char(59),char(255),char(236),char(0),char(148),char(1),char(61),char(255),char(236), +char(0),char(148),char(1),char(63),char(255),char(236),char(0),char(148),char(1),char(67), +char(255),char(215),char(0),char(148),char(1),char(160),char(255),char(236),char(0),char(148), +char(1),char(250),char(255),char(236),char(0),char(148),char(1),char(252),char(255),char(236), +char(0),char(148),char(1),char(254),char(255),char(236),char(0),char(148),char(2),char(0), +char(255),char(236),char(0),char(148),char(2),char(8),char(255),char(174),char(0),char(148), +char(2),char(12),char(255),char(174),char(0),char(148),char(2),char(88),char(255),char(215), +char(0),char(148),char(3),char(29),char(255),char(215),char(0),char(148),char(3),char(31), +char(255),char(215),char(0),char(148),char(3),char(33),char(255),char(215),char(0),char(148), +char(3),char(35),char(255),char(215),char(0),char(148),char(3),char(37),char(255),char(215), +char(0),char(148),char(3),char(39),char(255),char(215),char(0),char(148),char(3),char(41), +char(255),char(215),char(0),char(148),char(3),char(43),char(255),char(215),char(0),char(148), +char(3),char(45),char(255),char(215),char(0),char(148),char(3),char(47),char(255),char(215), +char(0),char(148),char(3),char(49),char(255),char(215),char(0),char(148),char(3),char(51), +char(255),char(215),char(0),char(148),char(3),char(111),char(255),char(236),char(0),char(148), +char(3),char(113),char(255),char(236),char(0),char(148),char(3),char(115),char(255),char(236), +char(0),char(148),char(3),char(143),char(255),char(195),char(0),char(149),char(0),char(15), +char(255),char(174),char(0),char(149),char(0),char(17),char(255),char(174),char(0),char(149), +char(0),char(36),char(255),char(215),char(0),char(149),char(0),char(55),char(255),char(195), +char(0),char(149),char(0),char(57),char(255),char(236),char(0),char(149),char(0),char(58), +char(255),char(236),char(0),char(149),char(0),char(59),char(255),char(215),char(0),char(149), +char(0),char(60),char(255),char(236),char(0),char(149),char(0),char(61),char(255),char(236), +char(0),char(149),char(0),char(130),char(255),char(215),char(0),char(149),char(0),char(131), +char(255),char(215),char(0),char(149),char(0),char(132),char(255),char(215),char(0),char(149), +char(0),char(133),char(255),char(215),char(0),char(149),char(0),char(134),char(255),char(215), +char(0),char(149),char(0),char(135),char(255),char(215),char(0),char(149),char(0),char(159), +char(255),char(236),char(0),char(149),char(0),char(194),char(255),char(215),char(0),char(149), +char(0),char(196),char(255),char(215),char(0),char(149),char(0),char(198),char(255),char(215), +char(0),char(149),char(1),char(36),char(255),char(195),char(0),char(149),char(1),char(38), +char(255),char(195),char(0),char(149),char(1),char(54),char(255),char(236),char(0),char(149), +char(1),char(56),char(255),char(236),char(0),char(149),char(1),char(58),char(255),char(236), +char(0),char(149),char(1),char(59),char(255),char(236),char(0),char(149),char(1),char(61), +char(255),char(236),char(0),char(149),char(1),char(63),char(255),char(236),char(0),char(149), +char(1),char(67),char(255),char(215),char(0),char(149),char(1),char(160),char(255),char(236), +char(0),char(149),char(1),char(250),char(255),char(236),char(0),char(149),char(1),char(252), +char(255),char(236),char(0),char(149),char(1),char(254),char(255),char(236),char(0),char(149), +char(2),char(0),char(255),char(236),char(0),char(149),char(2),char(8),char(255),char(174), +char(0),char(149),char(2),char(12),char(255),char(174),char(0),char(149),char(2),char(88), +char(255),char(215),char(0),char(149),char(3),char(29),char(255),char(215),char(0),char(149), +char(3),char(31),char(255),char(215),char(0),char(149),char(3),char(33),char(255),char(215), +char(0),char(149),char(3),char(35),char(255),char(215),char(0),char(149),char(3),char(37), +char(255),char(215),char(0),char(149),char(3),char(39),char(255),char(215),char(0),char(149), +char(3),char(41),char(255),char(215),char(0),char(149),char(3),char(43),char(255),char(215), +char(0),char(149),char(3),char(45),char(255),char(215),char(0),char(149),char(3),char(47), +char(255),char(215),char(0),char(149),char(3),char(49),char(255),char(215),char(0),char(149), +char(3),char(51),char(255),char(215),char(0),char(149),char(3),char(111),char(255),char(236), +char(0),char(149),char(3),char(113),char(255),char(236),char(0),char(149),char(3),char(115), +char(255),char(236),char(0),char(149),char(3),char(143),char(255),char(195),char(0),char(150), +char(0),char(15),char(255),char(174),char(0),char(150),char(0),char(17),char(255),char(174), +char(0),char(150),char(0),char(36),char(255),char(215),char(0),char(150),char(0),char(55), +char(255),char(195),char(0),char(150),char(0),char(57),char(255),char(236),char(0),char(150), +char(0),char(58),char(255),char(236),char(0),char(150),char(0),char(59),char(255),char(215), +char(0),char(150),char(0),char(60),char(255),char(236),char(0),char(150),char(0),char(61), +char(255),char(236),char(0),char(150),char(0),char(130),char(255),char(215),char(0),char(150), +char(0),char(131),char(255),char(215),char(0),char(150),char(0),char(132),char(255),char(215), +char(0),char(150),char(0),char(133),char(255),char(215),char(0),char(150),char(0),char(134), +char(255),char(215),char(0),char(150),char(0),char(135),char(255),char(215),char(0),char(150), +char(0),char(159),char(255),char(236),char(0),char(150),char(0),char(194),char(255),char(215), +char(0),char(150),char(0),char(196),char(255),char(215),char(0),char(150),char(0),char(198), +char(255),char(215),char(0),char(150),char(1),char(36),char(255),char(195),char(0),char(150), +char(1),char(38),char(255),char(195),char(0),char(150),char(1),char(54),char(255),char(236), +char(0),char(150),char(1),char(56),char(255),char(236),char(0),char(150),char(1),char(58), +char(255),char(236),char(0),char(150),char(1),char(59),char(255),char(236),char(0),char(150), +char(1),char(61),char(255),char(236),char(0),char(150),char(1),char(63),char(255),char(236), +char(0),char(150),char(1),char(67),char(255),char(215),char(0),char(150),char(1),char(160), +char(255),char(236),char(0),char(150),char(1),char(250),char(255),char(236),char(0),char(150), +char(1),char(252),char(255),char(236),char(0),char(150),char(1),char(254),char(255),char(236), +char(0),char(150),char(2),char(0),char(255),char(236),char(0),char(150),char(2),char(8), +char(255),char(174),char(0),char(150),char(2),char(12),char(255),char(174),char(0),char(150), +char(2),char(88),char(255),char(215),char(0),char(150),char(3),char(29),char(255),char(215), +char(0),char(150),char(3),char(31),char(255),char(215),char(0),char(150),char(3),char(33), +char(255),char(215),char(0),char(150),char(3),char(35),char(255),char(215),char(0),char(150), +char(3),char(37),char(255),char(215),char(0),char(150),char(3),char(39),char(255),char(215), +char(0),char(150),char(3),char(41),char(255),char(215),char(0),char(150),char(3),char(43), +char(255),char(215),char(0),char(150),char(3),char(45),char(255),char(215),char(0),char(150), +char(3),char(47),char(255),char(215),char(0),char(150),char(3),char(49),char(255),char(215), +char(0),char(150),char(3),char(51),char(255),char(215),char(0),char(150),char(3),char(111), +char(255),char(236),char(0),char(150),char(3),char(113),char(255),char(236),char(0),char(150), +char(3),char(115),char(255),char(236),char(0),char(150),char(3),char(143),char(255),char(195), +char(0),char(151),char(0),char(15),char(255),char(174),char(0),char(151),char(0),char(17), +char(255),char(174),char(0),char(151),char(0),char(36),char(255),char(215),char(0),char(151), +char(0),char(55),char(255),char(195),char(0),char(151),char(0),char(57),char(255),char(236), +char(0),char(151),char(0),char(58),char(255),char(236),char(0),char(151),char(0),char(59), +char(255),char(215),char(0),char(151),char(0),char(60),char(255),char(236),char(0),char(151), +char(0),char(61),char(255),char(236),char(0),char(151),char(0),char(130),char(255),char(215), +char(0),char(151),char(0),char(131),char(255),char(215),char(0),char(151),char(0),char(132), +char(255),char(215),char(0),char(151),char(0),char(133),char(255),char(215),char(0),char(151), +char(0),char(134),char(255),char(215),char(0),char(151),char(0),char(135),char(255),char(215), +char(0),char(151),char(0),char(159),char(255),char(236),char(0),char(151),char(0),char(194), +char(255),char(215),char(0),char(151),char(0),char(196),char(255),char(215),char(0),char(151), +char(0),char(198),char(255),char(215),char(0),char(151),char(1),char(36),char(255),char(195), +char(0),char(151),char(1),char(38),char(255),char(195),char(0),char(151),char(1),char(54), +char(255),char(236),char(0),char(151),char(1),char(56),char(255),char(236),char(0),char(151), +char(1),char(58),char(255),char(236),char(0),char(151),char(1),char(59),char(255),char(236), +char(0),char(151),char(1),char(61),char(255),char(236),char(0),char(151),char(1),char(63), +char(255),char(236),char(0),char(151),char(1),char(67),char(255),char(215),char(0),char(151), +char(1),char(160),char(255),char(236),char(0),char(151),char(1),char(250),char(255),char(236), +char(0),char(151),char(1),char(252),char(255),char(236),char(0),char(151),char(1),char(254), +char(255),char(236),char(0),char(151),char(2),char(0),char(255),char(236),char(0),char(151), +char(2),char(8),char(255),char(174),char(0),char(151),char(2),char(12),char(255),char(174), +char(0),char(151),char(2),char(88),char(255),char(215),char(0),char(151),char(3),char(29), +char(255),char(215),char(0),char(151),char(3),char(31),char(255),char(215),char(0),char(151), +char(3),char(33),char(255),char(215),char(0),char(151),char(3),char(35),char(255),char(215), +char(0),char(151),char(3),char(37),char(255),char(215),char(0),char(151),char(3),char(39), +char(255),char(215),char(0),char(151),char(3),char(41),char(255),char(215),char(0),char(151), +char(3),char(43),char(255),char(215),char(0),char(151),char(3),char(45),char(255),char(215), +char(0),char(151),char(3),char(47),char(255),char(215),char(0),char(151),char(3),char(49), +char(255),char(215),char(0),char(151),char(3),char(51),char(255),char(215),char(0),char(151), +char(3),char(111),char(255),char(236),char(0),char(151),char(3),char(113),char(255),char(236), +char(0),char(151),char(3),char(115),char(255),char(236),char(0),char(151),char(3),char(143), +char(255),char(195),char(0),char(152),char(0),char(15),char(255),char(174),char(0),char(152), +char(0),char(17),char(255),char(174),char(0),char(152),char(0),char(36),char(255),char(215), +char(0),char(152),char(0),char(55),char(255),char(195),char(0),char(152),char(0),char(57), +char(255),char(236),char(0),char(152),char(0),char(58),char(255),char(236),char(0),char(152), +char(0),char(59),char(255),char(215),char(0),char(152),char(0),char(60),char(255),char(236), +char(0),char(152),char(0),char(61),char(255),char(236),char(0),char(152),char(0),char(130), +char(255),char(215),char(0),char(152),char(0),char(131),char(255),char(215),char(0),char(152), +char(0),char(132),char(255),char(215),char(0),char(152),char(0),char(133),char(255),char(215), +char(0),char(152),char(0),char(134),char(255),char(215),char(0),char(152),char(0),char(135), +char(255),char(215),char(0),char(152),char(0),char(159),char(255),char(236),char(0),char(152), +char(0),char(194),char(255),char(215),char(0),char(152),char(0),char(196),char(255),char(215), +char(0),char(152),char(0),char(198),char(255),char(215),char(0),char(152),char(1),char(36), +char(255),char(195),char(0),char(152),char(1),char(38),char(255),char(195),char(0),char(152), +char(1),char(54),char(255),char(236),char(0),char(152),char(1),char(56),char(255),char(236), +char(0),char(152),char(1),char(58),char(255),char(236),char(0),char(152),char(1),char(59), +char(255),char(236),char(0),char(152),char(1),char(61),char(255),char(236),char(0),char(152), +char(1),char(63),char(255),char(236),char(0),char(152),char(1),char(67),char(255),char(215), +char(0),char(152),char(1),char(160),char(255),char(236),char(0),char(152),char(1),char(250), +char(255),char(236),char(0),char(152),char(1),char(252),char(255),char(236),char(0),char(152), +char(1),char(254),char(255),char(236),char(0),char(152),char(2),char(0),char(255),char(236), +char(0),char(152),char(2),char(8),char(255),char(174),char(0),char(152),char(2),char(12), +char(255),char(174),char(0),char(152),char(2),char(88),char(255),char(215),char(0),char(152), +char(3),char(29),char(255),char(215),char(0),char(152),char(3),char(31),char(255),char(215), +char(0),char(152),char(3),char(33),char(255),char(215),char(0),char(152),char(3),char(35), +char(255),char(215),char(0),char(152),char(3),char(37),char(255),char(215),char(0),char(152), +char(3),char(39),char(255),char(215),char(0),char(152),char(3),char(41),char(255),char(215), +char(0),char(152),char(3),char(43),char(255),char(215),char(0),char(152),char(3),char(45), +char(255),char(215),char(0),char(152),char(3),char(47),char(255),char(215),char(0),char(152), +char(3),char(49),char(255),char(215),char(0),char(152),char(3),char(51),char(255),char(215), +char(0),char(152),char(3),char(111),char(255),char(236),char(0),char(152),char(3),char(113), +char(255),char(236),char(0),char(152),char(3),char(115),char(255),char(236),char(0),char(152), +char(3),char(143),char(255),char(195),char(0),char(154),char(0),char(15),char(255),char(174), +char(0),char(154),char(0),char(17),char(255),char(174),char(0),char(154),char(0),char(36), +char(255),char(215),char(0),char(154),char(0),char(55),char(255),char(195),char(0),char(154), +char(0),char(57),char(255),char(236),char(0),char(154),char(0),char(58),char(255),char(236), +char(0),char(154),char(0),char(59),char(255),char(215),char(0),char(154),char(0),char(60), +char(255),char(236),char(0),char(154),char(0),char(61),char(255),char(236),char(0),char(154), +char(0),char(130),char(255),char(215),char(0),char(154),char(0),char(131),char(255),char(215), +char(0),char(154),char(0),char(132),char(255),char(215),char(0),char(154),char(0),char(133), +char(255),char(215),char(0),char(154),char(0),char(134),char(255),char(215),char(0),char(154), +char(0),char(135),char(255),char(215),char(0),char(154),char(0),char(159),char(255),char(236), +char(0),char(154),char(0),char(194),char(255),char(215),char(0),char(154),char(0),char(196), +char(255),char(215),char(0),char(154),char(0),char(198),char(255),char(215),char(0),char(154), +char(1),char(36),char(255),char(195),char(0),char(154),char(1),char(38),char(255),char(195), +char(0),char(154),char(1),char(54),char(255),char(236),char(0),char(154),char(1),char(56), +char(255),char(236),char(0),char(154),char(1),char(58),char(255),char(236),char(0),char(154), +char(1),char(59),char(255),char(236),char(0),char(154),char(1),char(61),char(255),char(236), +char(0),char(154),char(1),char(63),char(255),char(236),char(0),char(154),char(1),char(67), +char(255),char(215),char(0),char(154),char(1),char(160),char(255),char(236),char(0),char(154), +char(1),char(250),char(255),char(236),char(0),char(154),char(1),char(252),char(255),char(236), +char(0),char(154),char(1),char(254),char(255),char(236),char(0),char(154),char(2),char(0), +char(255),char(236),char(0),char(154),char(2),char(8),char(255),char(174),char(0),char(154), +char(2),char(12),char(255),char(174),char(0),char(154),char(2),char(88),char(255),char(215), +char(0),char(154),char(3),char(29),char(255),char(215),char(0),char(154),char(3),char(31), +char(255),char(215),char(0),char(154),char(3),char(33),char(255),char(215),char(0),char(154), +char(3),char(35),char(255),char(215),char(0),char(154),char(3),char(37),char(255),char(215), +char(0),char(154),char(3),char(39),char(255),char(215),char(0),char(154),char(3),char(41), +char(255),char(215),char(0),char(154),char(3),char(43),char(255),char(215),char(0),char(154), +char(3),char(45),char(255),char(215),char(0),char(154),char(3),char(47),char(255),char(215), +char(0),char(154),char(3),char(49),char(255),char(215),char(0),char(154),char(3),char(51), +char(255),char(215),char(0),char(154),char(3),char(111),char(255),char(236),char(0),char(154), +char(3),char(113),char(255),char(236),char(0),char(154),char(3),char(115),char(255),char(236), +char(0),char(154),char(3),char(143),char(255),char(195),char(0),char(155),char(0),char(15), +char(255),char(215),char(0),char(155),char(0),char(17),char(255),char(215),char(0),char(155), +char(0),char(36),char(255),char(236),char(0),char(155),char(0),char(130),char(255),char(236), +char(0),char(155),char(0),char(131),char(255),char(236),char(0),char(155),char(0),char(132), +char(255),char(236),char(0),char(155),char(0),char(133),char(255),char(236),char(0),char(155), +char(0),char(134),char(255),char(236),char(0),char(155),char(0),char(135),char(255),char(236), +char(0),char(155),char(0),char(194),char(255),char(236),char(0),char(155),char(0),char(196), +char(255),char(236),char(0),char(155),char(0),char(198),char(255),char(236),char(0),char(155), +char(1),char(67),char(255),char(236),char(0),char(155),char(2),char(8),char(255),char(215), +char(0),char(155),char(2),char(12),char(255),char(215),char(0),char(155),char(2),char(88), +char(255),char(236),char(0),char(155),char(3),char(29),char(255),char(236),char(0),char(155), +char(3),char(31),char(255),char(236),char(0),char(155),char(3),char(33),char(255),char(236), +char(0),char(155),char(3),char(35),char(255),char(236),char(0),char(155),char(3),char(37), +char(255),char(236),char(0),char(155),char(3),char(39),char(255),char(236),char(0),char(155), +char(3),char(41),char(255),char(236),char(0),char(155),char(3),char(43),char(255),char(236), +char(0),char(155),char(3),char(45),char(255),char(236),char(0),char(155),char(3),char(47), +char(255),char(236),char(0),char(155),char(3),char(49),char(255),char(236),char(0),char(155), +char(3),char(51),char(255),char(236),char(0),char(156),char(0),char(15),char(255),char(215), +char(0),char(156),char(0),char(17),char(255),char(215),char(0),char(156),char(0),char(36), +char(255),char(236),char(0),char(156),char(0),char(130),char(255),char(236),char(0),char(156), +char(0),char(131),char(255),char(236),char(0),char(156),char(0),char(132),char(255),char(236), +char(0),char(156),char(0),char(133),char(255),char(236),char(0),char(156),char(0),char(134), +char(255),char(236),char(0),char(156),char(0),char(135),char(255),char(236),char(0),char(156), +char(0),char(194),char(255),char(236),char(0),char(156),char(0),char(196),char(255),char(236), +char(0),char(156),char(0),char(198),char(255),char(236),char(0),char(156),char(1),char(67), +char(255),char(236),char(0),char(156),char(2),char(8),char(255),char(215),char(0),char(156), +char(2),char(12),char(255),char(215),char(0),char(156),char(2),char(88),char(255),char(236), +char(0),char(156),char(3),char(29),char(255),char(236),char(0),char(156),char(3),char(31), +char(255),char(236),char(0),char(156),char(3),char(33),char(255),char(236),char(0),char(156), +char(3),char(35),char(255),char(236),char(0),char(156),char(3),char(37),char(255),char(236), +char(0),char(156),char(3),char(39),char(255),char(236),char(0),char(156),char(3),char(41), +char(255),char(236),char(0),char(156),char(3),char(43),char(255),char(236),char(0),char(156), +char(3),char(45),char(255),char(236),char(0),char(156),char(3),char(47),char(255),char(236), +char(0),char(156),char(3),char(49),char(255),char(236),char(0),char(156),char(3),char(51), +char(255),char(236),char(0),char(157),char(0),char(15),char(255),char(215),char(0),char(157), +char(0),char(17),char(255),char(215),char(0),char(157),char(0),char(36),char(255),char(236), +char(0),char(157),char(0),char(130),char(255),char(236),char(0),char(157),char(0),char(131), +char(255),char(236),char(0),char(157),char(0),char(132),char(255),char(236),char(0),char(157), +char(0),char(133),char(255),char(236),char(0),char(157),char(0),char(134),char(255),char(236), +char(0),char(157),char(0),char(135),char(255),char(236),char(0),char(157),char(0),char(194), +char(255),char(236),char(0),char(157),char(0),char(196),char(255),char(236),char(0),char(157), +char(0),char(198),char(255),char(236),char(0),char(157),char(1),char(67),char(255),char(236), +char(0),char(157),char(2),char(8),char(255),char(215),char(0),char(157),char(2),char(12), +char(255),char(215),char(0),char(157),char(2),char(88),char(255),char(236),char(0),char(157), +char(3),char(29),char(255),char(236),char(0),char(157),char(3),char(31),char(255),char(236), +char(0),char(157),char(3),char(33),char(255),char(236),char(0),char(157),char(3),char(35), +char(255),char(236),char(0),char(157),char(3),char(37),char(255),char(236),char(0),char(157), +char(3),char(39),char(255),char(236),char(0),char(157),char(3),char(41),char(255),char(236), +char(0),char(157),char(3),char(43),char(255),char(236),char(0),char(157),char(3),char(45), +char(255),char(236),char(0),char(157),char(3),char(47),char(255),char(236),char(0),char(157), +char(3),char(49),char(255),char(236),char(0),char(157),char(3),char(51),char(255),char(236), +char(0),char(158),char(0),char(15),char(255),char(215),char(0),char(158),char(0),char(17), +char(255),char(215),char(0),char(158),char(0),char(36),char(255),char(236),char(0),char(158), +char(0),char(130),char(255),char(236),char(0),char(158),char(0),char(131),char(255),char(236), +char(0),char(158),char(0),char(132),char(255),char(236),char(0),char(158),char(0),char(133), +char(255),char(236),char(0),char(158),char(0),char(134),char(255),char(236),char(0),char(158), +char(0),char(135),char(255),char(236),char(0),char(158),char(0),char(194),char(255),char(236), +char(0),char(158),char(0),char(196),char(255),char(236),char(0),char(158),char(0),char(198), +char(255),char(236),char(0),char(158),char(1),char(67),char(255),char(236),char(0),char(158), +char(2),char(8),char(255),char(215),char(0),char(158),char(2),char(12),char(255),char(215), +char(0),char(158),char(2),char(88),char(255),char(236),char(0),char(158),char(3),char(29), +char(255),char(236),char(0),char(158),char(3),char(31),char(255),char(236),char(0),char(158), +char(3),char(33),char(255),char(236),char(0),char(158),char(3),char(35),char(255),char(236), +char(0),char(158),char(3),char(37),char(255),char(236),char(0),char(158),char(3),char(39), +char(255),char(236),char(0),char(158),char(3),char(41),char(255),char(236),char(0),char(158), +char(3),char(43),char(255),char(236),char(0),char(158),char(3),char(45),char(255),char(236), +char(0),char(158),char(3),char(47),char(255),char(236),char(0),char(158),char(3),char(49), +char(255),char(236),char(0),char(158),char(3),char(51),char(255),char(236),char(0),char(159), +char(0),char(15),char(255),char(133),char(0),char(159),char(0),char(17),char(255),char(133), +char(0),char(159),char(0),char(34),char(0),char(41),char(0),char(159),char(0),char(36), +char(255),char(133),char(0),char(159),char(0),char(38),char(255),char(215),char(0),char(159), +char(0),char(42),char(255),char(215),char(0),char(159),char(0),char(50),char(255),char(215), +char(0),char(159),char(0),char(52),char(255),char(215),char(0),char(159),char(0),char(68), +char(255),char(154),char(0),char(159),char(0),char(70),char(255),char(154),char(0),char(159), +char(0),char(71),char(255),char(154),char(0),char(159),char(0),char(72),char(255),char(154), +char(0),char(159),char(0),char(74),char(255),char(215),char(0),char(159),char(0),char(80), +char(255),char(195),char(0),char(159),char(0),char(81),char(255),char(195),char(0),char(159), +char(0),char(82),char(255),char(154),char(0),char(159),char(0),char(83),char(255),char(195), +char(0),char(159),char(0),char(84),char(255),char(154),char(0),char(159),char(0),char(85), +char(255),char(195),char(0),char(159),char(0),char(86),char(255),char(174),char(0),char(159), +char(0),char(88),char(255),char(195),char(0),char(159),char(0),char(93),char(255),char(215), +char(0),char(159),char(0),char(130),char(255),char(133),char(0),char(159),char(0),char(131), +char(255),char(133),char(0),char(159),char(0),char(132),char(255),char(133),char(0),char(159), +char(0),char(133),char(255),char(133),char(0),char(159),char(0),char(134),char(255),char(133), +char(0),char(159),char(0),char(135),char(255),char(133),char(0),char(159),char(0),char(137), +char(255),char(215),char(0),char(159),char(0),char(148),char(255),char(215),char(0),char(159), +char(0),char(149),char(255),char(215),char(0),char(159),char(0),char(150),char(255),char(215), +char(0),char(159),char(0),char(151),char(255),char(215),char(0),char(159),char(0),char(152), +char(255),char(215),char(0),char(159),char(0),char(154),char(255),char(215),char(0),char(159), +char(0),char(162),char(255),char(154),char(0),char(159),char(0),char(163),char(255),char(154), +char(0),char(159),char(0),char(164),char(255),char(154),char(0),char(159),char(0),char(165), +char(255),char(154),char(0),char(159),char(0),char(166),char(255),char(154),char(0),char(159), +char(0),char(167),char(255),char(154),char(0),char(159),char(0),char(168),char(255),char(154), +char(0),char(159),char(0),char(169),char(255),char(154),char(0),char(159),char(0),char(170), +char(255),char(154),char(0),char(159),char(0),char(171),char(255),char(154),char(0),char(159), +char(0),char(172),char(255),char(154),char(0),char(159),char(0),char(173),char(255),char(154), +char(0),char(159),char(0),char(180),char(255),char(154),char(0),char(159),char(0),char(181), +char(255),char(154),char(0),char(159),char(0),char(182),char(255),char(154),char(0),char(159), +char(0),char(183),char(255),char(154),char(0),char(159),char(0),char(184),char(255),char(154), +char(0),char(159),char(0),char(186),char(255),char(154),char(0),char(159),char(0),char(187), +char(255),char(195),char(0),char(159),char(0),char(188),char(255),char(195),char(0),char(159), +char(0),char(189),char(255),char(195),char(0),char(159),char(0),char(190),char(255),char(195), +char(0),char(159),char(0),char(194),char(255),char(133),char(0),char(159),char(0),char(195), +char(255),char(154),char(0),char(159),char(0),char(196),char(255),char(133),char(0),char(159), +char(0),char(197),char(255),char(154),char(0),char(159),char(0),char(198),char(255),char(133), +char(0),char(159),char(0),char(199),char(255),char(154),char(0),char(159),char(0),char(200), +char(255),char(215),char(0),char(159),char(0),char(201),char(255),char(154),char(0),char(159), +char(0),char(202),char(255),char(215),char(0),char(159),char(0),char(203),char(255),char(154), +char(0),char(159),char(0),char(204),char(255),char(215),char(0),char(159),char(0),char(205), +char(255),char(154),char(0),char(159),char(0),char(206),char(255),char(215),char(0),char(159), +char(0),char(207),char(255),char(154),char(0),char(159),char(0),char(209),char(255),char(154), +char(0),char(159),char(0),char(211),char(255),char(154),char(0),char(159),char(0),char(213), +char(255),char(154),char(0),char(159),char(0),char(215),char(255),char(154),char(0),char(159), +char(0),char(217),char(255),char(154),char(0),char(159),char(0),char(219),char(255),char(154), +char(0),char(159),char(0),char(221),char(255),char(154),char(0),char(159),char(0),char(222), +char(255),char(215),char(0),char(159),char(0),char(223),char(255),char(215),char(0),char(159), +char(0),char(224),char(255),char(215),char(0),char(159),char(0),char(225),char(255),char(215), +char(0),char(159),char(0),char(226),char(255),char(215),char(0),char(159),char(0),char(227), +char(255),char(215),char(0),char(159),char(0),char(228),char(255),char(215),char(0),char(159), +char(0),char(229),char(255),char(215),char(0),char(159),char(0),char(250),char(255),char(195), +char(0),char(159),char(1),char(6),char(255),char(195),char(0),char(159),char(1),char(8), +char(255),char(195),char(0),char(159),char(1),char(13),char(255),char(195),char(0),char(159), +char(1),char(14),char(255),char(215),char(0),char(159),char(1),char(15),char(255),char(154), +char(0),char(159),char(1),char(16),char(255),char(215),char(0),char(159),char(1),char(17), +char(255),char(154),char(0),char(159),char(1),char(18),char(255),char(215),char(0),char(159), +char(1),char(19),char(255),char(154),char(0),char(159),char(1),char(20),char(255),char(215), +char(0),char(159),char(1),char(21),char(255),char(154),char(0),char(159),char(1),char(23), +char(255),char(195),char(0),char(159),char(1),char(25),char(255),char(195),char(0),char(159), +char(1),char(29),char(255),char(174),char(0),char(159),char(1),char(33),char(255),char(174), +char(0),char(159),char(1),char(43),char(255),char(195),char(0),char(159),char(1),char(45), +char(255),char(195),char(0),char(159),char(1),char(47),char(255),char(195),char(0),char(159), +char(1),char(49),char(255),char(195),char(0),char(159),char(1),char(51),char(255),char(195), +char(0),char(159),char(1),char(53),char(255),char(195),char(0),char(159),char(1),char(60), +char(255),char(215),char(0),char(159),char(1),char(62),char(255),char(215),char(0),char(159), +char(1),char(64),char(255),char(215),char(0),char(159),char(1),char(67),char(255),char(133), +char(0),char(159),char(1),char(68),char(255),char(154),char(0),char(159),char(1),char(70), +char(255),char(154),char(0),char(159),char(1),char(71),char(255),char(215),char(0),char(159), +char(1),char(72),char(255),char(154),char(0),char(159),char(1),char(74),char(255),char(174), +char(0),char(159),char(2),char(8),char(255),char(133),char(0),char(159),char(2),char(12), +char(255),char(133),char(0),char(159),char(2),char(87),char(255),char(195),char(0),char(159), +char(2),char(88),char(255),char(133),char(0),char(159),char(2),char(89),char(255),char(154), +char(0),char(159),char(2),char(95),char(255),char(215),char(0),char(159),char(2),char(96), +char(255),char(154),char(0),char(159),char(2),char(98),char(255),char(195),char(0),char(159), +char(3),char(29),char(255),char(133),char(0),char(159),char(3),char(30),char(255),char(154), +char(0),char(159),char(3),char(31),char(255),char(133),char(0),char(159),char(3),char(32), +char(255),char(154),char(0),char(159),char(3),char(33),char(255),char(133),char(0),char(159), +char(3),char(34),char(255),char(154),char(0),char(159),char(3),char(35),char(255),char(133), +char(0),char(159),char(3),char(37),char(255),char(133),char(0),char(159),char(3),char(38), +char(255),char(154),char(0),char(159),char(3),char(39),char(255),char(133),char(0),char(159), +char(3),char(40),char(255),char(154),char(0),char(159),char(3),char(41),char(255),char(133), +char(0),char(159),char(3),char(42),char(255),char(154),char(0),char(159),char(3),char(43), +char(255),char(133),char(0),char(159),char(3),char(44),char(255),char(154),char(0),char(159), +char(3),char(45),char(255),char(133),char(0),char(159),char(3),char(46),char(255),char(154), +char(0),char(159),char(3),char(47),char(255),char(133),char(0),char(159),char(3),char(48), +char(255),char(154),char(0),char(159),char(3),char(49),char(255),char(133),char(0),char(159), +char(3),char(50),char(255),char(154),char(0),char(159),char(3),char(51),char(255),char(133), +char(0),char(159),char(3),char(52),char(255),char(154),char(0),char(159),char(3),char(54), +char(255),char(154),char(0),char(159),char(3),char(56),char(255),char(154),char(0),char(159), +char(3),char(58),char(255),char(154),char(0),char(159),char(3),char(60),char(255),char(154), +char(0),char(159),char(3),char(64),char(255),char(154),char(0),char(159),char(3),char(66), +char(255),char(154),char(0),char(159),char(3),char(68),char(255),char(154),char(0),char(159), +char(3),char(73),char(255),char(215),char(0),char(159),char(3),char(74),char(255),char(154), +char(0),char(159),char(3),char(75),char(255),char(215),char(0),char(159),char(3),char(76), +char(255),char(154),char(0),char(159),char(3),char(77),char(255),char(215),char(0),char(159), +char(3),char(78),char(255),char(154),char(0),char(159),char(3),char(79),char(255),char(215), +char(0),char(159),char(3),char(81),char(255),char(215),char(0),char(159),char(3),char(82), +char(255),char(154),char(0),char(159),char(3),char(83),char(255),char(215),char(0),char(159), +char(3),char(84),char(255),char(154),char(0),char(159),char(3),char(85),char(255),char(215), +char(0),char(159),char(3),char(86),char(255),char(154),char(0),char(159),char(3),char(87), +char(255),char(215),char(0),char(159),char(3),char(88),char(255),char(154),char(0),char(159), +char(3),char(89),char(255),char(215),char(0),char(159),char(3),char(90),char(255),char(154), +char(0),char(159),char(3),char(91),char(255),char(215),char(0),char(159),char(3),char(92), +char(255),char(154),char(0),char(159),char(3),char(93),char(255),char(215),char(0),char(159), +char(3),char(94),char(255),char(154),char(0),char(159),char(3),char(95),char(255),char(215), +char(0),char(159),char(3),char(96),char(255),char(154),char(0),char(159),char(3),char(98), +char(255),char(195),char(0),char(159),char(3),char(100),char(255),char(195),char(0),char(159), +char(3),char(102),char(255),char(195),char(0),char(159),char(3),char(104),char(255),char(195), +char(0),char(159),char(3),char(106),char(255),char(195),char(0),char(159),char(3),char(108), +char(255),char(195),char(0),char(159),char(3),char(110),char(255),char(195),char(0),char(160), +char(0),char(15),char(254),char(246),char(0),char(160),char(0),char(17),char(254),char(246), +char(0),char(160),char(0),char(36),char(255),char(154),char(0),char(160),char(0),char(59), +char(255),char(215),char(0),char(160),char(0),char(61),char(255),char(236),char(0),char(160), +char(0),char(130),char(255),char(154),char(0),char(160),char(0),char(131),char(255),char(154), +char(0),char(160),char(0),char(132),char(255),char(154),char(0),char(160),char(0),char(133), +char(255),char(154),char(0),char(160),char(0),char(134),char(255),char(154),char(0),char(160), +char(0),char(135),char(255),char(154),char(0),char(160),char(0),char(194),char(255),char(154), +char(0),char(160),char(0),char(196),char(255),char(154),char(0),char(160),char(0),char(198), +char(255),char(154),char(0),char(160),char(1),char(59),char(255),char(236),char(0),char(160), +char(1),char(61),char(255),char(236),char(0),char(160),char(1),char(63),char(255),char(236), +char(0),char(160),char(1),char(67),char(255),char(154),char(0),char(160),char(2),char(8), +char(254),char(246),char(0),char(160),char(2),char(12),char(254),char(246),char(0),char(160), +char(2),char(88),char(255),char(154),char(0),char(160),char(3),char(29),char(255),char(154), +char(0),char(160),char(3),char(31),char(255),char(154),char(0),char(160),char(3),char(33), +char(255),char(154),char(0),char(160),char(3),char(35),char(255),char(154),char(0),char(160), +char(3),char(37),char(255),char(154),char(0),char(160),char(3),char(39),char(255),char(154), +char(0),char(160),char(3),char(41),char(255),char(154),char(0),char(160),char(3),char(43), +char(255),char(154),char(0),char(160),char(3),char(45),char(255),char(154),char(0),char(160), +char(3),char(47),char(255),char(154),char(0),char(160),char(3),char(49),char(255),char(154), +char(0),char(160),char(3),char(51),char(255),char(154),char(0),char(162),char(0),char(5), +char(255),char(236),char(0),char(162),char(0),char(10),char(255),char(236),char(0),char(162), +char(2),char(7),char(255),char(236),char(0),char(162),char(2),char(11),char(255),char(236), +char(0),char(163),char(0),char(5),char(255),char(236),char(0),char(163),char(0),char(10), +char(255),char(236),char(0),char(163),char(2),char(7),char(255),char(236),char(0),char(163), +char(2),char(11),char(255),char(236),char(0),char(164),char(0),char(5),char(255),char(236), +char(0),char(164),char(0),char(10),char(255),char(236),char(0),char(164),char(2),char(7), +char(255),char(236),char(0),char(164),char(2),char(11),char(255),char(236),char(0),char(165), +char(0),char(5),char(255),char(236),char(0),char(165),char(0),char(10),char(255),char(236), +char(0),char(165),char(2),char(7),char(255),char(236),char(0),char(165),char(2),char(11), +char(255),char(236),char(0),char(166),char(0),char(5),char(255),char(236),char(0),char(166), +char(0),char(10),char(255),char(236),char(0),char(166),char(2),char(7),char(255),char(236), +char(0),char(166),char(2),char(11),char(255),char(236),char(0),char(167),char(0),char(5), +char(255),char(236),char(0),char(167),char(0),char(10),char(255),char(236),char(0),char(167), +char(2),char(7),char(255),char(236),char(0),char(167),char(2),char(11),char(255),char(236), +char(0),char(170),char(0),char(5),char(255),char(236),char(0),char(170),char(0),char(10), +char(255),char(236),char(0),char(170),char(0),char(89),char(255),char(215),char(0),char(170), +char(0),char(90),char(255),char(215),char(0),char(170),char(0),char(91),char(255),char(215), +char(0),char(170),char(0),char(92),char(255),char(215),char(0),char(170),char(0),char(93), +char(255),char(236),char(0),char(170),char(0),char(191),char(255),char(215),char(0),char(170), +char(1),char(55),char(255),char(215),char(0),char(170),char(1),char(60),char(255),char(236), +char(0),char(170),char(1),char(62),char(255),char(236),char(0),char(170),char(1),char(64), +char(255),char(236),char(0),char(170),char(1),char(251),char(255),char(215),char(0),char(170), +char(1),char(253),char(255),char(215),char(0),char(170),char(2),char(7),char(255),char(236), +char(0),char(170),char(2),char(11),char(255),char(236),char(0),char(170),char(3),char(112), +char(255),char(215),char(0),char(171),char(0),char(5),char(255),char(236),char(0),char(171), +char(0),char(10),char(255),char(236),char(0),char(171),char(0),char(89),char(255),char(215), +char(0),char(171),char(0),char(90),char(255),char(215),char(0),char(171),char(0),char(91), +char(255),char(215),char(0),char(171),char(0),char(92),char(255),char(215),char(0),char(171), +char(0),char(93),char(255),char(236),char(0),char(171),char(0),char(191),char(255),char(215), +char(0),char(171),char(1),char(55),char(255),char(215),char(0),char(171),char(1),char(60), +char(255),char(236),char(0),char(171),char(1),char(62),char(255),char(236),char(0),char(171), +char(1),char(64),char(255),char(236),char(0),char(171),char(1),char(251),char(255),char(215), +char(0),char(171),char(1),char(253),char(255),char(215),char(0),char(171),char(2),char(7), +char(255),char(236),char(0),char(171),char(2),char(11),char(255),char(236),char(0),char(171), +char(3),char(112),char(255),char(215),char(0),char(172),char(0),char(5),char(255),char(236), +char(0),char(172),char(0),char(10),char(255),char(236),char(0),char(172),char(0),char(89), +char(255),char(215),char(0),char(172),char(0),char(90),char(255),char(215),char(0),char(172), +char(0),char(91),char(255),char(215),char(0),char(172),char(0),char(92),char(255),char(215), +char(0),char(172),char(0),char(93),char(255),char(236),char(0),char(172),char(0),char(191), +char(255),char(215),char(0),char(172),char(1),char(55),char(255),char(215),char(0),char(172), +char(1),char(60),char(255),char(236),char(0),char(172),char(1),char(62),char(255),char(236), +char(0),char(172),char(1),char(64),char(255),char(236),char(0),char(172),char(1),char(251), +char(255),char(215),char(0),char(172),char(1),char(253),char(255),char(215),char(0),char(172), +char(2),char(7),char(255),char(236),char(0),char(172),char(2),char(11),char(255),char(236), +char(0),char(172),char(3),char(112),char(255),char(215),char(0),char(173),char(0),char(5), +char(255),char(236),char(0),char(173),char(0),char(10),char(255),char(236),char(0),char(173), +char(0),char(89),char(255),char(215),char(0),char(173),char(0),char(90),char(255),char(215), +char(0),char(173),char(0),char(91),char(255),char(215),char(0),char(173),char(0),char(92), +char(255),char(215),char(0),char(173),char(0),char(93),char(255),char(236),char(0),char(173), +char(0),char(191),char(255),char(215),char(0),char(173),char(1),char(55),char(255),char(215), +char(0),char(173),char(1),char(60),char(255),char(236),char(0),char(173),char(1),char(62), +char(255),char(236),char(0),char(173),char(1),char(64),char(255),char(236),char(0),char(173), +char(1),char(251),char(255),char(215),char(0),char(173),char(1),char(253),char(255),char(215), +char(0),char(173),char(2),char(7),char(255),char(236),char(0),char(173),char(2),char(11), +char(255),char(236),char(0),char(173),char(3),char(112),char(255),char(215),char(0),char(178), +char(0),char(5),char(255),char(236),char(0),char(178),char(0),char(10),char(255),char(236), +char(0),char(178),char(0),char(89),char(255),char(215),char(0),char(178),char(0),char(90), +char(255),char(215),char(0),char(178),char(0),char(91),char(255),char(215),char(0),char(178), +char(0),char(92),char(255),char(215),char(0),char(178),char(0),char(93),char(255),char(236), +char(0),char(178),char(0),char(191),char(255),char(215),char(0),char(178),char(1),char(55), +char(255),char(215),char(0),char(178),char(1),char(60),char(255),char(236),char(0),char(178), +char(1),char(62),char(255),char(236),char(0),char(178),char(1),char(64),char(255),char(236), +char(0),char(178),char(1),char(251),char(255),char(215),char(0),char(178),char(1),char(253), +char(255),char(215),char(0),char(178),char(2),char(7),char(255),char(236),char(0),char(178), +char(2),char(11),char(255),char(236),char(0),char(178),char(3),char(112),char(255),char(215), +char(0),char(180),char(0),char(5),char(255),char(236),char(0),char(180),char(0),char(10), +char(255),char(236),char(0),char(180),char(0),char(89),char(255),char(215),char(0),char(180), +char(0),char(90),char(255),char(215),char(0),char(180),char(0),char(91),char(255),char(215), +char(0),char(180),char(0),char(92),char(255),char(215),char(0),char(180),char(0),char(93), +char(255),char(236),char(0),char(180),char(0),char(191),char(255),char(215),char(0),char(180), +char(1),char(55),char(255),char(215),char(0),char(180),char(1),char(60),char(255),char(236), +char(0),char(180),char(1),char(62),char(255),char(236),char(0),char(180),char(1),char(64), +char(255),char(236),char(0),char(180),char(1),char(251),char(255),char(215),char(0),char(180), +char(1),char(253),char(255),char(215),char(0),char(180),char(2),char(7),char(255),char(236), +char(0),char(180),char(2),char(11),char(255),char(236),char(0),char(180),char(3),char(112), +char(255),char(215),char(0),char(181),char(0),char(5),char(255),char(236),char(0),char(181), +char(0),char(10),char(255),char(236),char(0),char(181),char(0),char(89),char(255),char(215), +char(0),char(181),char(0),char(90),char(255),char(215),char(0),char(181),char(0),char(91), +char(255),char(215),char(0),char(181),char(0),char(92),char(255),char(215),char(0),char(181), +char(0),char(93),char(255),char(236),char(0),char(181),char(0),char(191),char(255),char(215), +char(0),char(181),char(1),char(55),char(255),char(215),char(0),char(181),char(1),char(60), +char(255),char(236),char(0),char(181),char(1),char(62),char(255),char(236),char(0),char(181), +char(1),char(64),char(255),char(236),char(0),char(181),char(1),char(251),char(255),char(215), +char(0),char(181),char(1),char(253),char(255),char(215),char(0),char(181),char(2),char(7), +char(255),char(236),char(0),char(181),char(2),char(11),char(255),char(236),char(0),char(181), +char(3),char(112),char(255),char(215),char(0),char(182),char(0),char(5),char(255),char(236), +char(0),char(182),char(0),char(10),char(255),char(236),char(0),char(182),char(0),char(89), +char(255),char(215),char(0),char(182),char(0),char(90),char(255),char(215),char(0),char(182), +char(0),char(91),char(255),char(215),char(0),char(182),char(0),char(92),char(255),char(215), +char(0),char(182),char(0),char(93),char(255),char(236),char(0),char(182),char(0),char(191), +char(255),char(215),char(0),char(182),char(1),char(55),char(255),char(215),char(0),char(182), +char(1),char(60),char(255),char(236),char(0),char(182),char(1),char(62),char(255),char(236), +char(0),char(182),char(1),char(64),char(255),char(236),char(0),char(182),char(1),char(251), +char(255),char(215),char(0),char(182),char(1),char(253),char(255),char(215),char(0),char(182), +char(2),char(7),char(255),char(236),char(0),char(182),char(2),char(11),char(255),char(236), +char(0),char(182),char(3),char(112),char(255),char(215),char(0),char(184),char(0),char(5), +char(255),char(215),char(0),char(184),char(0),char(10),char(255),char(215),char(0),char(184), +char(2),char(7),char(255),char(215),char(0),char(184),char(2),char(11),char(255),char(215), +char(0),char(186),char(0),char(5),char(255),char(236),char(0),char(186),char(0),char(10), +char(255),char(236),char(0),char(186),char(0),char(89),char(255),char(215),char(0),char(186), +char(0),char(90),char(255),char(215),char(0),char(186),char(0),char(91),char(255),char(215), +char(0),char(186),char(0),char(92),char(255),char(215),char(0),char(186),char(0),char(93), +char(255),char(236),char(0),char(186),char(0),char(191),char(255),char(215),char(0),char(186), +char(1),char(55),char(255),char(215),char(0),char(186),char(1),char(60),char(255),char(236), +char(0),char(186),char(1),char(62),char(255),char(236),char(0),char(186),char(1),char(64), +char(255),char(236),char(0),char(186),char(1),char(251),char(255),char(215),char(0),char(186), +char(1),char(253),char(255),char(215),char(0),char(186),char(2),char(7),char(255),char(236), +char(0),char(186),char(2),char(11),char(255),char(236),char(0),char(186),char(3),char(112), +char(255),char(215),char(0),char(191),char(0),char(5),char(0),char(82),char(0),char(191), +char(0),char(10),char(0),char(82),char(0),char(191),char(0),char(15),char(255),char(174), +char(0),char(191),char(0),char(17),char(255),char(174),char(0),char(191),char(0),char(34), +char(0),char(41),char(0),char(191),char(2),char(7),char(0),char(82),char(0),char(191), +char(2),char(8),char(255),char(174),char(0),char(191),char(2),char(11),char(0),char(82), +char(0),char(191),char(2),char(12),char(255),char(174),char(0),char(192),char(0),char(5), +char(255),char(236),char(0),char(192),char(0),char(10),char(255),char(236),char(0),char(192), +char(0),char(89),char(255),char(215),char(0),char(192),char(0),char(90),char(255),char(215), +char(0),char(192),char(0),char(91),char(255),char(215),char(0),char(192),char(0),char(92), +char(255),char(215),char(0),char(192),char(0),char(93),char(255),char(236),char(0),char(192), +char(0),char(191),char(255),char(215),char(0),char(192),char(1),char(55),char(255),char(215), +char(0),char(192),char(1),char(60),char(255),char(236),char(0),char(192),char(1),char(62), +char(255),char(236),char(0),char(192),char(1),char(64),char(255),char(236),char(0),char(192), +char(1),char(251),char(255),char(215),char(0),char(192),char(1),char(253),char(255),char(215), +char(0),char(192),char(2),char(7),char(255),char(236),char(0),char(192),char(2),char(11), +char(255),char(236),char(0),char(192),char(3),char(112),char(255),char(215),char(0),char(193), +char(0),char(5),char(0),char(82),char(0),char(193),char(0),char(10),char(0),char(82), +char(0),char(193),char(0),char(15),char(255),char(174),char(0),char(193),char(0),char(17), +char(255),char(174),char(0),char(193),char(0),char(34),char(0),char(41),char(0),char(193), +char(2),char(7),char(0),char(82),char(0),char(193),char(2),char(8),char(255),char(174), +char(0),char(193),char(2),char(11),char(0),char(82),char(0),char(193),char(2),char(12), +char(255),char(174),char(0),char(194),char(0),char(5),char(255),char(113),char(0),char(194), +char(0),char(10),char(255),char(113),char(0),char(194),char(0),char(38),char(255),char(215), +char(0),char(194),char(0),char(42),char(255),char(215),char(0),char(194),char(0),char(45), +char(1),char(10),char(0),char(194),char(0),char(50),char(255),char(215),char(0),char(194), +char(0),char(52),char(255),char(215),char(0),char(194),char(0),char(55),char(255),char(113), +char(0),char(194),char(0),char(57),char(255),char(174),char(0),char(194),char(0),char(58), +char(255),char(174),char(0),char(194),char(0),char(60),char(255),char(133),char(0),char(194), +char(0),char(137),char(255),char(215),char(0),char(194),char(0),char(148),char(255),char(215), +char(0),char(194),char(0),char(149),char(255),char(215),char(0),char(194),char(0),char(150), +char(255),char(215),char(0),char(194),char(0),char(151),char(255),char(215),char(0),char(194), +char(0),char(152),char(255),char(215),char(0),char(194),char(0),char(154),char(255),char(215), +char(0),char(194),char(0),char(159),char(255),char(133),char(0),char(194),char(0),char(200), +char(255),char(215),char(0),char(194),char(0),char(202),char(255),char(215),char(0),char(194), +char(0),char(204),char(255),char(215),char(0),char(194),char(0),char(206),char(255),char(215), +char(0),char(194),char(0),char(222),char(255),char(215),char(0),char(194),char(0),char(224), +char(255),char(215),char(0),char(194),char(0),char(226),char(255),char(215),char(0),char(194), +char(0),char(228),char(255),char(215),char(0),char(194),char(1),char(14),char(255),char(215), +char(0),char(194),char(1),char(16),char(255),char(215),char(0),char(194),char(1),char(18), +char(255),char(215),char(0),char(194),char(1),char(20),char(255),char(215),char(0),char(194), +char(1),char(36),char(255),char(113),char(0),char(194),char(1),char(38),char(255),char(113), +char(0),char(194),char(1),char(54),char(255),char(174),char(0),char(194),char(1),char(56), +char(255),char(133),char(0),char(194),char(1),char(58),char(255),char(133),char(0),char(194), +char(1),char(71),char(255),char(215),char(0),char(194),char(1),char(250),char(255),char(174), +char(0),char(194),char(1),char(252),char(255),char(174),char(0),char(194),char(1),char(254), +char(255),char(174),char(0),char(194),char(2),char(0),char(255),char(133),char(0),char(194), +char(2),char(7),char(255),char(113),char(0),char(194),char(2),char(11),char(255),char(113), +char(0),char(194),char(2),char(95),char(255),char(215),char(0),char(194),char(3),char(73), +char(255),char(215),char(0),char(194),char(3),char(75),char(255),char(215),char(0),char(194), +char(3),char(77),char(255),char(215),char(0),char(194),char(3),char(79),char(255),char(215), +char(0),char(194),char(3),char(81),char(255),char(215),char(0),char(194),char(3),char(83), +char(255),char(215),char(0),char(194),char(3),char(85),char(255),char(215),char(0),char(194), +char(3),char(87),char(255),char(215),char(0),char(194),char(3),char(89),char(255),char(215), +char(0),char(194),char(3),char(91),char(255),char(215),char(0),char(194),char(3),char(93), +char(255),char(215),char(0),char(194),char(3),char(95),char(255),char(215),char(0),char(194), +char(3),char(111),char(255),char(133),char(0),char(194),char(3),char(113),char(255),char(133), +char(0),char(194),char(3),char(115),char(255),char(133),char(0),char(194),char(3),char(143), +char(255),char(113),char(0),char(195),char(0),char(5),char(255),char(236),char(0),char(195), +char(0),char(10),char(255),char(236),char(0),char(195),char(2),char(7),char(255),char(236), +char(0),char(195),char(2),char(11),char(255),char(236),char(0),char(196),char(0),char(5), +char(255),char(113),char(0),char(196),char(0),char(10),char(255),char(113),char(0),char(196), +char(0),char(38),char(255),char(215),char(0),char(196),char(0),char(42),char(255),char(215), +char(0),char(196),char(0),char(45),char(1),char(10),char(0),char(196),char(0),char(50), +char(255),char(215),char(0),char(196),char(0),char(52),char(255),char(215),char(0),char(196), +char(0),char(55),char(255),char(113),char(0),char(196),char(0),char(57),char(255),char(174), +char(0),char(196),char(0),char(58),char(255),char(174),char(0),char(196),char(0),char(60), +char(255),char(133),char(0),char(196),char(0),char(137),char(255),char(215),char(0),char(196), +char(0),char(148),char(255),char(215),char(0),char(196),char(0),char(149),char(255),char(215), +char(0),char(196),char(0),char(150),char(255),char(215),char(0),char(196),char(0),char(151), +char(255),char(215),char(0),char(196),char(0),char(152),char(255),char(215),char(0),char(196), +char(0),char(154),char(255),char(215),char(0),char(196),char(0),char(159),char(255),char(133), +char(0),char(196),char(0),char(200),char(255),char(215),char(0),char(196),char(0),char(202), +char(255),char(215),char(0),char(196),char(0),char(204),char(255),char(215),char(0),char(196), +char(0),char(206),char(255),char(215),char(0),char(196),char(0),char(222),char(255),char(215), +char(0),char(196),char(0),char(224),char(255),char(215),char(0),char(196),char(0),char(226), +char(255),char(215),char(0),char(196),char(0),char(228),char(255),char(215),char(0),char(196), +char(1),char(14),char(255),char(215),char(0),char(196),char(1),char(16),char(255),char(215), +char(0),char(196),char(1),char(18),char(255),char(215),char(0),char(196),char(1),char(20), +char(255),char(215),char(0),char(196),char(1),char(36),char(255),char(113),char(0),char(196), +char(1),char(38),char(255),char(113),char(0),char(196),char(1),char(54),char(255),char(174), +char(0),char(196),char(1),char(56),char(255),char(133),char(0),char(196),char(1),char(58), +char(255),char(133),char(0),char(196),char(1),char(71),char(255),char(215),char(0),char(196), +char(1),char(250),char(255),char(174),char(0),char(196),char(1),char(252),char(255),char(174), +char(0),char(196),char(1),char(254),char(255),char(174),char(0),char(196),char(2),char(0), +char(255),char(133),char(0),char(196),char(2),char(7),char(255),char(113),char(0),char(196), +char(2),char(11),char(255),char(113),char(0),char(196),char(2),char(95),char(255),char(215), +char(0),char(196),char(3),char(73),char(255),char(215),char(0),char(196),char(3),char(75), +char(255),char(215),char(0),char(196),char(3),char(77),char(255),char(215),char(0),char(196), +char(3),char(79),char(255),char(215),char(0),char(196),char(3),char(81),char(255),char(215), +char(0),char(196),char(3),char(83),char(255),char(215),char(0),char(196),char(3),char(85), +char(255),char(215),char(0),char(196),char(3),char(87),char(255),char(215),char(0),char(196), +char(3),char(89),char(255),char(215),char(0),char(196),char(3),char(91),char(255),char(215), +char(0),char(196),char(3),char(93),char(255),char(215),char(0),char(196),char(3),char(95), +char(255),char(215),char(0),char(196),char(3),char(111),char(255),char(133),char(0),char(196), +char(3),char(113),char(255),char(133),char(0),char(196),char(3),char(115),char(255),char(133), +char(0),char(196),char(3),char(143),char(255),char(113),char(0),char(197),char(0),char(5), +char(255),char(236),char(0),char(197),char(0),char(10),char(255),char(236),char(0),char(197), +char(2),char(7),char(255),char(236),char(0),char(197),char(2),char(11),char(255),char(236), +char(0),char(198),char(0),char(5),char(255),char(113),char(0),char(198),char(0),char(10), +char(255),char(113),char(0),char(198),char(0),char(38),char(255),char(215),char(0),char(198), +char(0),char(42),char(255),char(215),char(0),char(198),char(0),char(45),char(1),char(10), +char(0),char(198),char(0),char(50),char(255),char(215),char(0),char(198),char(0),char(52), +char(255),char(215),char(0),char(198),char(0),char(55),char(255),char(113),char(0),char(198), +char(0),char(57),char(255),char(174),char(0),char(198),char(0),char(58),char(255),char(174), +char(0),char(198),char(0),char(60),char(255),char(133),char(0),char(198),char(0),char(137), +char(255),char(215),char(0),char(198),char(0),char(148),char(255),char(215),char(0),char(198), +char(0),char(149),char(255),char(215),char(0),char(198),char(0),char(150),char(255),char(215), +char(0),char(198),char(0),char(151),char(255),char(215),char(0),char(198),char(0),char(152), +char(255),char(215),char(0),char(198),char(0),char(154),char(255),char(215),char(0),char(198), +char(0),char(159),char(255),char(133),char(0),char(198),char(0),char(200),char(255),char(215), +char(0),char(198),char(0),char(202),char(255),char(215),char(0),char(198),char(0),char(204), +char(255),char(215),char(0),char(198),char(0),char(206),char(255),char(215),char(0),char(198), +char(0),char(222),char(255),char(215),char(0),char(198),char(0),char(224),char(255),char(215), +char(0),char(198),char(0),char(226),char(255),char(215),char(0),char(198),char(0),char(228), +char(255),char(215),char(0),char(198),char(1),char(14),char(255),char(215),char(0),char(198), +char(1),char(16),char(255),char(215),char(0),char(198),char(1),char(18),char(255),char(215), +char(0),char(198),char(1),char(20),char(255),char(215),char(0),char(198),char(1),char(36), +char(255),char(113),char(0),char(198),char(1),char(38),char(255),char(113),char(0),char(198), +char(1),char(54),char(255),char(174),char(0),char(198),char(1),char(56),char(255),char(133), +char(0),char(198),char(1),char(58),char(255),char(133),char(0),char(198),char(1),char(71), +char(255),char(215),char(0),char(198),char(1),char(250),char(255),char(174),char(0),char(198), +char(1),char(252),char(255),char(174),char(0),char(198),char(1),char(254),char(255),char(174), +char(0),char(198),char(2),char(0),char(255),char(133),char(0),char(198),char(2),char(7), +char(255),char(113),char(0),char(198),char(2),char(11),char(255),char(113),char(0),char(198), +char(2),char(95),char(255),char(215),char(0),char(198),char(3),char(73),char(255),char(215), +char(0),char(198),char(3),char(75),char(255),char(215),char(0),char(198),char(3),char(77), +char(255),char(215),char(0),char(198),char(3),char(79),char(255),char(215),char(0),char(198), +char(3),char(81),char(255),char(215),char(0),char(198),char(3),char(83),char(255),char(215), +char(0),char(198),char(3),char(85),char(255),char(215),char(0),char(198),char(3),char(87), +char(255),char(215),char(0),char(198),char(3),char(89),char(255),char(215),char(0),char(198), +char(3),char(91),char(255),char(215),char(0),char(198),char(3),char(93),char(255),char(215), +char(0),char(198),char(3),char(95),char(255),char(215),char(0),char(198),char(3),char(111), +char(255),char(133),char(0),char(198),char(3),char(113),char(255),char(133),char(0),char(198), +char(3),char(115),char(255),char(133),char(0),char(198),char(3),char(143),char(255),char(113), +char(0),char(199),char(0),char(5),char(255),char(236),char(0),char(199),char(0),char(10), +char(255),char(236),char(0),char(199),char(2),char(7),char(255),char(236),char(0),char(199), +char(2),char(11),char(255),char(236),char(0),char(200),char(0),char(38),char(255),char(215), +char(0),char(200),char(0),char(42),char(255),char(215),char(0),char(200),char(0),char(50), +char(255),char(215),char(0),char(200),char(0),char(52),char(255),char(215),char(0),char(200), +char(0),char(137),char(255),char(215),char(0),char(200),char(0),char(148),char(255),char(215), +char(0),char(200),char(0),char(149),char(255),char(215),char(0),char(200),char(0),char(150), +char(255),char(215),char(0),char(200),char(0),char(151),char(255),char(215),char(0),char(200), +char(0),char(152),char(255),char(215),char(0),char(200),char(0),char(154),char(255),char(215), +char(0),char(200),char(0),char(200),char(255),char(215),char(0),char(200),char(0),char(202), +char(255),char(215),char(0),char(200),char(0),char(204),char(255),char(215),char(0),char(200), +char(0),char(206),char(255),char(215),char(0),char(200),char(0),char(222),char(255),char(215), +char(0),char(200),char(0),char(224),char(255),char(215),char(0),char(200),char(0),char(226), +char(255),char(215),char(0),char(200),char(0),char(228),char(255),char(215),char(0),char(200), +char(1),char(14),char(255),char(215),char(0),char(200),char(1),char(16),char(255),char(215), +char(0),char(200),char(1),char(18),char(255),char(215),char(0),char(200),char(1),char(20), +char(255),char(215),char(0),char(200),char(1),char(71),char(255),char(215),char(0),char(200), +char(2),char(95),char(255),char(215),char(0),char(200),char(3),char(73),char(255),char(215), +char(0),char(200),char(3),char(75),char(255),char(215),char(0),char(200),char(3),char(77), +char(255),char(215),char(0),char(200),char(3),char(79),char(255),char(215),char(0),char(200), +char(3),char(81),char(255),char(215),char(0),char(200),char(3),char(83),char(255),char(215), +char(0),char(200),char(3),char(85),char(255),char(215),char(0),char(200),char(3),char(87), +char(255),char(215),char(0),char(200),char(3),char(89),char(255),char(215),char(0),char(200), +char(3),char(91),char(255),char(215),char(0),char(200),char(3),char(93),char(255),char(215), +char(0),char(200),char(3),char(95),char(255),char(215),char(0),char(202),char(0),char(38), +char(255),char(215),char(0),char(202),char(0),char(42),char(255),char(215),char(0),char(202), +char(0),char(50),char(255),char(215),char(0),char(202),char(0),char(52),char(255),char(215), +char(0),char(202),char(0),char(137),char(255),char(215),char(0),char(202),char(0),char(148), +char(255),char(215),char(0),char(202),char(0),char(149),char(255),char(215),char(0),char(202), +char(0),char(150),char(255),char(215),char(0),char(202),char(0),char(151),char(255),char(215), +char(0),char(202),char(0),char(152),char(255),char(215),char(0),char(202),char(0),char(154), +char(255),char(215),char(0),char(202),char(0),char(200),char(255),char(215),char(0),char(202), +char(0),char(202),char(255),char(215),char(0),char(202),char(0),char(204),char(255),char(215), +char(0),char(202),char(0),char(206),char(255),char(215),char(0),char(202),char(0),char(222), +char(255),char(215),char(0),char(202),char(0),char(224),char(255),char(215),char(0),char(202), +char(0),char(226),char(255),char(215),char(0),char(202),char(0),char(228),char(255),char(215), +char(0),char(202),char(1),char(14),char(255),char(215),char(0),char(202),char(1),char(16), +char(255),char(215),char(0),char(202),char(1),char(18),char(255),char(215),char(0),char(202), +char(1),char(20),char(255),char(215),char(0),char(202),char(1),char(71),char(255),char(215), +char(0),char(202),char(2),char(95),char(255),char(215),char(0),char(202),char(3),char(73), +char(255),char(215),char(0),char(202),char(3),char(75),char(255),char(215),char(0),char(202), +char(3),char(77),char(255),char(215),char(0),char(202),char(3),char(79),char(255),char(215), +char(0),char(202),char(3),char(81),char(255),char(215),char(0),char(202),char(3),char(83), +char(255),char(215),char(0),char(202),char(3),char(85),char(255),char(215),char(0),char(202), +char(3),char(87),char(255),char(215),char(0),char(202),char(3),char(89),char(255),char(215), +char(0),char(202),char(3),char(91),char(255),char(215),char(0),char(202),char(3),char(93), +char(255),char(215),char(0),char(202),char(3),char(95),char(255),char(215),char(0),char(204), +char(0),char(38),char(255),char(215),char(0),char(204),char(0),char(42),char(255),char(215), +char(0),char(204),char(0),char(50),char(255),char(215),char(0),char(204),char(0),char(52), +char(255),char(215),char(0),char(204),char(0),char(137),char(255),char(215),char(0),char(204), +char(0),char(148),char(255),char(215),char(0),char(204),char(0),char(149),char(255),char(215), +char(0),char(204),char(0),char(150),char(255),char(215),char(0),char(204),char(0),char(151), +char(255),char(215),char(0),char(204),char(0),char(152),char(255),char(215),char(0),char(204), +char(0),char(154),char(255),char(215),char(0),char(204),char(0),char(200),char(255),char(215), +char(0),char(204),char(0),char(202),char(255),char(215),char(0),char(204),char(0),char(204), +char(255),char(215),char(0),char(204),char(0),char(206),char(255),char(215),char(0),char(204), +char(0),char(222),char(255),char(215),char(0),char(204),char(0),char(224),char(255),char(215), +char(0),char(204),char(0),char(226),char(255),char(215),char(0),char(204),char(0),char(228), +char(255),char(215),char(0),char(204),char(1),char(14),char(255),char(215),char(0),char(204), +char(1),char(16),char(255),char(215),char(0),char(204),char(1),char(18),char(255),char(215), +char(0),char(204),char(1),char(20),char(255),char(215),char(0),char(204),char(1),char(71), +char(255),char(215),char(0),char(204),char(2),char(95),char(255),char(215),char(0),char(204), +char(3),char(73),char(255),char(215),char(0),char(204),char(3),char(75),char(255),char(215), +char(0),char(204),char(3),char(77),char(255),char(215),char(0),char(204),char(3),char(79), +char(255),char(215),char(0),char(204),char(3),char(81),char(255),char(215),char(0),char(204), +char(3),char(83),char(255),char(215),char(0),char(204),char(3),char(85),char(255),char(215), +char(0),char(204),char(3),char(87),char(255),char(215),char(0),char(204),char(3),char(89), +char(255),char(215),char(0),char(204),char(3),char(91),char(255),char(215),char(0),char(204), +char(3),char(93),char(255),char(215),char(0),char(204),char(3),char(95),char(255),char(215), +char(0),char(206),char(0),char(38),char(255),char(215),char(0),char(206),char(0),char(42), +char(255),char(215),char(0),char(206),char(0),char(50),char(255),char(215),char(0),char(206), +char(0),char(52),char(255),char(215),char(0),char(206),char(0),char(137),char(255),char(215), +char(0),char(206),char(0),char(148),char(255),char(215),char(0),char(206),char(0),char(149), +char(255),char(215),char(0),char(206),char(0),char(150),char(255),char(215),char(0),char(206), +char(0),char(151),char(255),char(215),char(0),char(206),char(0),char(152),char(255),char(215), +char(0),char(206),char(0),char(154),char(255),char(215),char(0),char(206),char(0),char(200), +char(255),char(215),char(0),char(206),char(0),char(202),char(255),char(215),char(0),char(206), +char(0),char(204),char(255),char(215),char(0),char(206),char(0),char(206),char(255),char(215), +char(0),char(206),char(0),char(222),char(255),char(215),char(0),char(206),char(0),char(224), +char(255),char(215),char(0),char(206),char(0),char(226),char(255),char(215),char(0),char(206), +char(0),char(228),char(255),char(215),char(0),char(206),char(1),char(14),char(255),char(215), +char(0),char(206),char(1),char(16),char(255),char(215),char(0),char(206),char(1),char(18), +char(255),char(215),char(0),char(206),char(1),char(20),char(255),char(215),char(0),char(206), +char(1),char(71),char(255),char(215),char(0),char(206),char(2),char(95),char(255),char(215), +char(0),char(206),char(3),char(73),char(255),char(215),char(0),char(206),char(3),char(75), +char(255),char(215),char(0),char(206),char(3),char(77),char(255),char(215),char(0),char(206), +char(3),char(79),char(255),char(215),char(0),char(206),char(3),char(81),char(255),char(215), +char(0),char(206),char(3),char(83),char(255),char(215),char(0),char(206),char(3),char(85), +char(255),char(215),char(0),char(206),char(3),char(87),char(255),char(215),char(0),char(206), +char(3),char(89),char(255),char(215),char(0),char(206),char(3),char(91),char(255),char(215), +char(0),char(206),char(3),char(93),char(255),char(215),char(0),char(206),char(3),char(95), +char(255),char(215),char(0),char(208),char(0),char(15),char(255),char(174),char(0),char(208), +char(0),char(17),char(255),char(174),char(0),char(208),char(0),char(36),char(255),char(215), +char(0),char(208),char(0),char(55),char(255),char(195),char(0),char(208),char(0),char(57), +char(255),char(236),char(0),char(208),char(0),char(58),char(255),char(236),char(0),char(208), +char(0),char(59),char(255),char(215),char(0),char(208),char(0),char(60),char(255),char(236), +char(0),char(208),char(0),char(61),char(255),char(236),char(0),char(208),char(0),char(130), +char(255),char(215),char(0),char(208),char(0),char(131),char(255),char(215),char(0),char(208), +char(0),char(132),char(255),char(215),char(0),char(208),char(0),char(133),char(255),char(215), +char(0),char(208),char(0),char(134),char(255),char(215),char(0),char(208),char(0),char(135), +char(255),char(215),char(0),char(208),char(0),char(159),char(255),char(236),char(0),char(208), +char(0),char(194),char(255),char(215),char(0),char(208),char(0),char(196),char(255),char(215), +char(0),char(208),char(0),char(198),char(255),char(215),char(0),char(208),char(1),char(36), +char(255),char(195),char(0),char(208),char(1),char(38),char(255),char(195),char(0),char(208), +char(1),char(54),char(255),char(236),char(0),char(208),char(1),char(56),char(255),char(236), +char(0),char(208),char(1),char(58),char(255),char(236),char(0),char(208),char(1),char(59), +char(255),char(236),char(0),char(208),char(1),char(61),char(255),char(236),char(0),char(208), +char(1),char(63),char(255),char(236),char(0),char(208),char(1),char(67),char(255),char(215), +char(0),char(208),char(1),char(160),char(255),char(236),char(0),char(208),char(1),char(250), +char(255),char(236),char(0),char(208),char(1),char(252),char(255),char(236),char(0),char(208), +char(1),char(254),char(255),char(236),char(0),char(208),char(2),char(0),char(255),char(236), +char(0),char(208),char(2),char(8),char(255),char(174),char(0),char(208),char(2),char(12), +char(255),char(174),char(0),char(208),char(2),char(88),char(255),char(215),char(0),char(208), +char(3),char(29),char(255),char(215),char(0),char(208),char(3),char(31),char(255),char(215), +char(0),char(208),char(3),char(33),char(255),char(215),char(0),char(208),char(3),char(35), +char(255),char(215),char(0),char(208),char(3),char(37),char(255),char(215),char(0),char(208), +char(3),char(39),char(255),char(215),char(0),char(208),char(3),char(41),char(255),char(215), +char(0),char(208),char(3),char(43),char(255),char(215),char(0),char(208),char(3),char(45), +char(255),char(215),char(0),char(208),char(3),char(47),char(255),char(215),char(0),char(208), +char(3),char(49),char(255),char(215),char(0),char(208),char(3),char(51),char(255),char(215), +char(0),char(208),char(3),char(111),char(255),char(236),char(0),char(208),char(3),char(113), +char(255),char(236),char(0),char(208),char(3),char(115),char(255),char(236),char(0),char(208), +char(3),char(143),char(255),char(195),char(0),char(209),char(0),char(5),char(0),char(82), +char(0),char(209),char(0),char(10),char(0),char(82),char(0),char(209),char(0),char(12), +char(0),char(143),char(0),char(209),char(0),char(34),char(0),char(164),char(0),char(209), +char(0),char(64),char(0),char(143),char(0),char(209),char(0),char(69),char(0),char(61), +char(0),char(209),char(0),char(75),char(0),char(61),char(0),char(209),char(0),char(78), +char(0),char(61),char(0),char(209),char(0),char(79),char(0),char(61),char(0),char(209), +char(0),char(96),char(0),char(143),char(0),char(209),char(0),char(231),char(0),char(61), +char(0),char(209),char(0),char(233),char(0),char(123),char(0),char(209),char(2),char(7), +char(0),char(82),char(0),char(209),char(2),char(11),char(0),char(82),char(0),char(210), +char(0),char(15),char(255),char(174),char(0),char(210),char(0),char(17),char(255),char(174), +char(0),char(210),char(0),char(36),char(255),char(215),char(0),char(210),char(0),char(55), +char(255),char(195),char(0),char(210),char(0),char(57),char(255),char(236),char(0),char(210), +char(0),char(58),char(255),char(236),char(0),char(210),char(0),char(59),char(255),char(215), +char(0),char(210),char(0),char(60),char(255),char(236),char(0),char(210),char(0),char(61), +char(255),char(236),char(0),char(210),char(0),char(130),char(255),char(215),char(0),char(210), +char(0),char(131),char(255),char(215),char(0),char(210),char(0),char(132),char(255),char(215), +char(0),char(210),char(0),char(133),char(255),char(215),char(0),char(210),char(0),char(134), +char(255),char(215),char(0),char(210),char(0),char(135),char(255),char(215),char(0),char(210), +char(0),char(159),char(255),char(236),char(0),char(210),char(0),char(194),char(255),char(215), +char(0),char(210),char(0),char(196),char(255),char(215),char(0),char(210),char(0),char(198), +char(255),char(215),char(0),char(210),char(1),char(36),char(255),char(195),char(0),char(210), +char(1),char(38),char(255),char(195),char(0),char(210),char(1),char(54),char(255),char(236), +char(0),char(210),char(1),char(56),char(255),char(236),char(0),char(210),char(1),char(58), +char(255),char(236),char(0),char(210),char(1),char(59),char(255),char(236),char(0),char(210), +char(1),char(61),char(255),char(236),char(0),char(210),char(1),char(63),char(255),char(236), +char(0),char(210),char(1),char(67),char(255),char(215),char(0),char(210),char(1),char(160), +char(255),char(236),char(0),char(210),char(1),char(250),char(255),char(236),char(0),char(210), +char(1),char(252),char(255),char(236),char(0),char(210),char(1),char(254),char(255),char(236), +char(0),char(210),char(2),char(0),char(255),char(236),char(0),char(210),char(2),char(8), +char(255),char(174),char(0),char(210),char(2),char(12),char(255),char(174),char(0),char(210), +char(2),char(88),char(255),char(215),char(0),char(210),char(3),char(29),char(255),char(215), +char(0),char(210),char(3),char(31),char(255),char(215),char(0),char(210),char(3),char(33), +char(255),char(215),char(0),char(210),char(3),char(35),char(255),char(215),char(0),char(210), +char(3),char(37),char(255),char(215),char(0),char(210),char(3),char(39),char(255),char(215), +char(0),char(210),char(3),char(41),char(255),char(215),char(0),char(210),char(3),char(43), +char(255),char(215),char(0),char(210),char(3),char(45),char(255),char(215),char(0),char(210), +char(3),char(47),char(255),char(215),char(0),char(210),char(3),char(49),char(255),char(215), +char(0),char(210),char(3),char(51),char(255),char(215),char(0),char(210),char(3),char(111), +char(255),char(236),char(0),char(210),char(3),char(113),char(255),char(236),char(0),char(210), +char(3),char(115),char(255),char(236),char(0),char(210),char(3),char(143),char(255),char(195), +char(0),char(212),char(0),char(45),char(0),char(123),char(0),char(213),char(0),char(5), +char(255),char(236),char(0),char(213),char(0),char(10),char(255),char(236),char(0),char(213), +char(0),char(89),char(255),char(215),char(0),char(213),char(0),char(90),char(255),char(215), +char(0),char(213),char(0),char(91),char(255),char(215),char(0),char(213),char(0),char(92), +char(255),char(215),char(0),char(213),char(0),char(93),char(255),char(236),char(0),char(213), +char(0),char(191),char(255),char(215),char(0),char(213),char(1),char(55),char(255),char(215), +char(0),char(213),char(1),char(60),char(255),char(236),char(0),char(213),char(1),char(62), +char(255),char(236),char(0),char(213),char(1),char(64),char(255),char(236),char(0),char(213), +char(1),char(251),char(255),char(215),char(0),char(213),char(1),char(253),char(255),char(215), +char(0),char(213),char(2),char(7),char(255),char(236),char(0),char(213),char(2),char(11), +char(255),char(236),char(0),char(213),char(3),char(112),char(255),char(215),char(0),char(214), +char(0),char(45),char(0),char(123),char(0),char(215),char(0),char(5),char(255),char(236), +char(0),char(215),char(0),char(10),char(255),char(236),char(0),char(215),char(0),char(89), +char(255),char(215),char(0),char(215),char(0),char(90),char(255),char(215),char(0),char(215), +char(0),char(91),char(255),char(215),char(0),char(215),char(0),char(92),char(255),char(215), +char(0),char(215),char(0),char(93),char(255),char(236),char(0),char(215),char(0),char(191), +char(255),char(215),char(0),char(215),char(1),char(55),char(255),char(215),char(0),char(215), +char(1),char(60),char(255),char(236),char(0),char(215),char(1),char(62),char(255),char(236), +char(0),char(215),char(1),char(64),char(255),char(236),char(0),char(215),char(1),char(251), +char(255),char(215),char(0),char(215),char(1),char(253),char(255),char(215),char(0),char(215), +char(2),char(7),char(255),char(236),char(0),char(215),char(2),char(11),char(255),char(236), +char(0),char(215),char(3),char(112),char(255),char(215),char(0),char(216),char(0),char(45), +char(0),char(123),char(0),char(217),char(0),char(5),char(255),char(236),char(0),char(217), +char(0),char(10),char(255),char(236),char(0),char(217),char(0),char(89),char(255),char(215), +char(0),char(217),char(0),char(90),char(255),char(215),char(0),char(217),char(0),char(91), +char(255),char(215),char(0),char(217),char(0),char(92),char(255),char(215),char(0),char(217), +char(0),char(93),char(255),char(236),char(0),char(217),char(0),char(191),char(255),char(215), +char(0),char(217),char(1),char(55),char(255),char(215),char(0),char(217),char(1),char(60), +char(255),char(236),char(0),char(217),char(1),char(62),char(255),char(236),char(0),char(217), +char(1),char(64),char(255),char(236),char(0),char(217),char(1),char(251),char(255),char(215), +char(0),char(217),char(1),char(253),char(255),char(215),char(0),char(217),char(2),char(7), +char(255),char(236),char(0),char(217),char(2),char(11),char(255),char(236),char(0),char(217), +char(3),char(112),char(255),char(215),char(0),char(218),char(0),char(45),char(0),char(123), +char(0),char(219),char(0),char(5),char(255),char(236),char(0),char(219),char(0),char(10), +char(255),char(236),char(0),char(219),char(0),char(89),char(255),char(215),char(0),char(219), +char(0),char(90),char(255),char(215),char(0),char(219),char(0),char(91),char(255),char(215), +char(0),char(219),char(0),char(92),char(255),char(215),char(0),char(219),char(0),char(93), +char(255),char(236),char(0),char(219),char(0),char(191),char(255),char(215),char(0),char(219), +char(1),char(55),char(255),char(215),char(0),char(219),char(1),char(60),char(255),char(236), +char(0),char(219),char(1),char(62),char(255),char(236),char(0),char(219),char(1),char(64), +char(255),char(236),char(0),char(219),char(1),char(251),char(255),char(215),char(0),char(219), +char(1),char(253),char(255),char(215),char(0),char(219),char(2),char(7),char(255),char(236), +char(0),char(219),char(2),char(11),char(255),char(236),char(0),char(219),char(3),char(112), +char(255),char(215),char(0),char(220),char(0),char(45),char(0),char(123),char(0),char(221), +char(0),char(5),char(255),char(236),char(0),char(221),char(0),char(10),char(255),char(236), +char(0),char(221),char(0),char(89),char(255),char(215),char(0),char(221),char(0),char(90), +char(255),char(215),char(0),char(221),char(0),char(91),char(255),char(215),char(0),char(221), +char(0),char(92),char(255),char(215),char(0),char(221),char(0),char(93),char(255),char(236), +char(0),char(221),char(0),char(191),char(255),char(215),char(0),char(221),char(1),char(55), +char(255),char(215),char(0),char(221),char(1),char(60),char(255),char(236),char(0),char(221), +char(1),char(62),char(255),char(236),char(0),char(221),char(1),char(64),char(255),char(236), +char(0),char(221),char(1),char(251),char(255),char(215),char(0),char(221),char(1),char(253), +char(255),char(215),char(0),char(221),char(2),char(7),char(255),char(236),char(0),char(221), +char(2),char(11),char(255),char(236),char(0),char(221),char(3),char(112),char(255),char(215), +char(0),char(231),char(0),char(5),char(255),char(236),char(0),char(231),char(0),char(10), +char(255),char(236),char(0),char(231),char(2),char(7),char(255),char(236),char(0),char(231), +char(2),char(11),char(255),char(236),char(0),char(248),char(0),char(38),char(255),char(215), +char(0),char(248),char(0),char(42),char(255),char(215),char(0),char(248),char(0),char(50), +char(255),char(215),char(0),char(248),char(0),char(52),char(255),char(215),char(0),char(248), +char(0),char(137),char(255),char(215),char(0),char(248),char(0),char(148),char(255),char(215), +char(0),char(248),char(0),char(149),char(255),char(215),char(0),char(248),char(0),char(150), +char(255),char(215),char(0),char(248),char(0),char(151),char(255),char(215),char(0),char(248), +char(0),char(152),char(255),char(215),char(0),char(248),char(0),char(154),char(255),char(215), +char(0),char(248),char(0),char(200),char(255),char(215),char(0),char(248),char(0),char(202), +char(255),char(215),char(0),char(248),char(0),char(204),char(255),char(215),char(0),char(248), +char(0),char(206),char(255),char(215),char(0),char(248),char(0),char(222),char(255),char(215), +char(0),char(248),char(0),char(224),char(255),char(215),char(0),char(248),char(0),char(226), +char(255),char(215),char(0),char(248),char(0),char(228),char(255),char(215),char(0),char(248), +char(1),char(14),char(255),char(215),char(0),char(248),char(1),char(16),char(255),char(215), +char(0),char(248),char(1),char(18),char(255),char(215),char(0),char(248),char(1),char(20), +char(255),char(215),char(0),char(248),char(1),char(71),char(255),char(215),char(0),char(248), +char(2),char(95),char(255),char(215),char(0),char(248),char(3),char(73),char(255),char(215), +char(0),char(248),char(3),char(75),char(255),char(215),char(0),char(248),char(3),char(77), +char(255),char(215),char(0),char(248),char(3),char(79),char(255),char(215),char(0),char(248), +char(3),char(81),char(255),char(215),char(0),char(248),char(3),char(83),char(255),char(215), +char(0),char(248),char(3),char(85),char(255),char(215),char(0),char(248),char(3),char(87), +char(255),char(215),char(0),char(248),char(3),char(89),char(255),char(215),char(0),char(248), +char(3),char(91),char(255),char(215),char(0),char(248),char(3),char(93),char(255),char(215), +char(0),char(248),char(3),char(95),char(255),char(215),char(0),char(249),char(0),char(70), +char(255),char(215),char(0),char(249),char(0),char(71),char(255),char(215),char(0),char(249), +char(0),char(72),char(255),char(215),char(0),char(249),char(0),char(82),char(255),char(215), +char(0),char(249),char(0),char(84),char(255),char(215),char(0),char(249),char(0),char(162), +char(255),char(215),char(0),char(249),char(0),char(169),char(255),char(215),char(0),char(249), +char(0),char(170),char(255),char(215),char(0),char(249),char(0),char(171),char(255),char(215), +char(0),char(249),char(0),char(172),char(255),char(215),char(0),char(249),char(0),char(173), +char(255),char(215),char(0),char(249),char(0),char(180),char(255),char(215),char(0),char(249), +char(0),char(181),char(255),char(215),char(0),char(249),char(0),char(182),char(255),char(215), +char(0),char(249),char(0),char(183),char(255),char(215),char(0),char(249),char(0),char(184), +char(255),char(215),char(0),char(249),char(0),char(186),char(255),char(215),char(0),char(249), +char(0),char(201),char(255),char(215),char(0),char(249),char(0),char(203),char(255),char(215), +char(0),char(249),char(0),char(205),char(255),char(215),char(0),char(249),char(0),char(207), +char(255),char(215),char(0),char(249),char(0),char(209),char(255),char(215),char(0),char(249), +char(0),char(211),char(255),char(215),char(0),char(249),char(0),char(213),char(255),char(215), +char(0),char(249),char(0),char(215),char(255),char(215),char(0),char(249),char(0),char(217), +char(255),char(215),char(0),char(249),char(0),char(219),char(255),char(215),char(0),char(249), +char(0),char(221),char(255),char(215),char(0),char(249),char(1),char(15),char(255),char(215), +char(0),char(249),char(1),char(17),char(255),char(215),char(0),char(249),char(1),char(19), +char(255),char(215),char(0),char(249),char(1),char(21),char(255),char(215),char(0),char(249), +char(1),char(72),char(255),char(215),char(0),char(249),char(2),char(96),char(255),char(215), +char(0),char(249),char(3),char(54),char(255),char(215),char(0),char(249),char(3),char(56), +char(255),char(215),char(0),char(249),char(3),char(58),char(255),char(215),char(0),char(249), +char(3),char(60),char(255),char(215),char(0),char(249),char(3),char(64),char(255),char(215), +char(0),char(249),char(3),char(66),char(255),char(215),char(0),char(249),char(3),char(68), +char(255),char(215),char(0),char(249),char(3),char(74),char(255),char(215),char(0),char(249), +char(3),char(76),char(255),char(215),char(0),char(249),char(3),char(78),char(255),char(215), +char(0),char(249),char(3),char(82),char(255),char(215),char(0),char(249),char(3),char(84), +char(255),char(215),char(0),char(249),char(3),char(86),char(255),char(215),char(0),char(249), +char(3),char(88),char(255),char(215),char(0),char(249),char(3),char(90),char(255),char(215), +char(0),char(249),char(3),char(92),char(255),char(215),char(0),char(249),char(3),char(94), +char(255),char(215),char(0),char(249),char(3),char(96),char(255),char(215),char(0),char(250), +char(0),char(70),char(255),char(215),char(0),char(250),char(0),char(71),char(255),char(215), +char(0),char(250),char(0),char(72),char(255),char(215),char(0),char(250),char(0),char(82), +char(255),char(215),char(0),char(250),char(0),char(84),char(255),char(215),char(0),char(250), +char(0),char(162),char(255),char(215),char(0),char(250),char(0),char(169),char(255),char(215), +char(0),char(250),char(0),char(170),char(255),char(215),char(0),char(250),char(0),char(171), +char(255),char(215),char(0),char(250),char(0),char(172),char(255),char(215),char(0),char(250), +char(0),char(173),char(255),char(215),char(0),char(250),char(0),char(180),char(255),char(215), +char(0),char(250),char(0),char(181),char(255),char(215),char(0),char(250),char(0),char(182), +char(255),char(215),char(0),char(250),char(0),char(183),char(255),char(215),char(0),char(250), +char(0),char(184),char(255),char(215),char(0),char(250),char(0),char(186),char(255),char(215), +char(0),char(250),char(0),char(201),char(255),char(215),char(0),char(250),char(0),char(203), +char(255),char(215),char(0),char(250),char(0),char(205),char(255),char(215),char(0),char(250), +char(0),char(207),char(255),char(215),char(0),char(250),char(0),char(209),char(255),char(215), +char(0),char(250),char(0),char(211),char(255),char(215),char(0),char(250),char(0),char(213), +char(255),char(215),char(0),char(250),char(0),char(215),char(255),char(215),char(0),char(250), +char(0),char(217),char(255),char(215),char(0),char(250),char(0),char(219),char(255),char(215), +char(0),char(250),char(0),char(221),char(255),char(215),char(0),char(250),char(1),char(15), +char(255),char(215),char(0),char(250),char(1),char(17),char(255),char(215),char(0),char(250), +char(1),char(19),char(255),char(215),char(0),char(250),char(1),char(21),char(255),char(215), +char(0),char(250),char(1),char(72),char(255),char(215),char(0),char(250),char(2),char(96), +char(255),char(215),char(0),char(250),char(3),char(54),char(255),char(215),char(0),char(250), +char(3),char(56),char(255),char(215),char(0),char(250),char(3),char(58),char(255),char(215), +char(0),char(250),char(3),char(60),char(255),char(215),char(0),char(250),char(3),char(64), +char(255),char(215),char(0),char(250),char(3),char(66),char(255),char(215),char(0),char(250), +char(3),char(68),char(255),char(215),char(0),char(250),char(3),char(74),char(255),char(215), +char(0),char(250),char(3),char(76),char(255),char(215),char(0),char(250),char(3),char(78), +char(255),char(215),char(0),char(250),char(3),char(82),char(255),char(215),char(0),char(250), +char(3),char(84),char(255),char(215),char(0),char(250),char(3),char(86),char(255),char(215), +char(0),char(250),char(3),char(88),char(255),char(215),char(0),char(250),char(3),char(90), +char(255),char(215),char(0),char(250),char(3),char(92),char(255),char(215),char(0),char(250), +char(3),char(94),char(255),char(215),char(0),char(250),char(3),char(96),char(255),char(215), +char(0),char(251),char(0),char(5),char(255),char(92),char(0),char(251),char(0),char(10), +char(255),char(92),char(0),char(251),char(0),char(38),char(255),char(215),char(0),char(251), +char(0),char(42),char(255),char(215),char(0),char(251),char(0),char(50),char(255),char(215), +char(0),char(251),char(0),char(52),char(255),char(215),char(0),char(251),char(0),char(55), +char(255),char(215),char(0),char(251),char(0),char(56),char(255),char(236),char(0),char(251), +char(0),char(57),char(255),char(215),char(0),char(251),char(0),char(58),char(255),char(215), +char(0),char(251),char(0),char(60),char(255),char(195),char(0),char(251),char(0),char(137), +char(255),char(215),char(0),char(251),char(0),char(148),char(255),char(215),char(0),char(251), +char(0),char(149),char(255),char(215),char(0),char(251),char(0),char(150),char(255),char(215), +char(0),char(251),char(0),char(151),char(255),char(215),char(0),char(251),char(0),char(152), +char(255),char(215),char(0),char(251),char(0),char(154),char(255),char(215),char(0),char(251), +char(0),char(155),char(255),char(236),char(0),char(251),char(0),char(156),char(255),char(236), +char(0),char(251),char(0),char(157),char(255),char(236),char(0),char(251),char(0),char(158), +char(255),char(236),char(0),char(251),char(0),char(159),char(255),char(195),char(0),char(251), +char(0),char(200),char(255),char(215),char(0),char(251),char(0),char(202),char(255),char(215), +char(0),char(251),char(0),char(204),char(255),char(215),char(0),char(251),char(0),char(206), +char(255),char(215),char(0),char(251),char(0),char(222),char(255),char(215),char(0),char(251), +char(0),char(224),char(255),char(215),char(0),char(251),char(0),char(226),char(255),char(215), +char(0),char(251),char(0),char(228),char(255),char(215),char(0),char(251),char(1),char(14), +char(255),char(215),char(0),char(251),char(1),char(16),char(255),char(215),char(0),char(251), +char(1),char(18),char(255),char(215),char(0),char(251),char(1),char(20),char(255),char(215), +char(0),char(251),char(1),char(36),char(255),char(215),char(0),char(251),char(1),char(38), +char(255),char(215),char(0),char(251),char(1),char(42),char(255),char(236),char(0),char(251), +char(1),char(44),char(255),char(236),char(0),char(251),char(1),char(46),char(255),char(236), +char(0),char(251),char(1),char(48),char(255),char(236),char(0),char(251),char(1),char(50), +char(255),char(236),char(0),char(251),char(1),char(52),char(255),char(236),char(0),char(251), +char(1),char(54),char(255),char(215),char(0),char(251),char(1),char(56),char(255),char(195), +char(0),char(251),char(1),char(58),char(255),char(195),char(0),char(251),char(1),char(71), +char(255),char(215),char(0),char(251),char(1),char(250),char(255),char(215),char(0),char(251), +char(1),char(252),char(255),char(215),char(0),char(251),char(1),char(254),char(255),char(215), +char(0),char(251),char(2),char(0),char(255),char(195),char(0),char(251),char(2),char(7), +char(255),char(92),char(0),char(251),char(2),char(11),char(255),char(92),char(0),char(251), +char(2),char(95),char(255),char(215),char(0),char(251),char(2),char(97),char(255),char(236), +char(0),char(251),char(3),char(73),char(255),char(215),char(0),char(251),char(3),char(75), +char(255),char(215),char(0),char(251),char(3),char(77),char(255),char(215),char(0),char(251), +char(3),char(79),char(255),char(215),char(0),char(251),char(3),char(81),char(255),char(215), +char(0),char(251),char(3),char(83),char(255),char(215),char(0),char(251),char(3),char(85), +char(255),char(215),char(0),char(251),char(3),char(87),char(255),char(215),char(0),char(251), +char(3),char(89),char(255),char(215),char(0),char(251),char(3),char(91),char(255),char(215), +char(0),char(251),char(3),char(93),char(255),char(215),char(0),char(251),char(3),char(95), +char(255),char(215),char(0),char(251),char(3),char(97),char(255),char(236),char(0),char(251), +char(3),char(99),char(255),char(236),char(0),char(251),char(3),char(101),char(255),char(236), +char(0),char(251),char(3),char(103),char(255),char(236),char(0),char(251),char(3),char(105), +char(255),char(236),char(0),char(251),char(3),char(107),char(255),char(236),char(0),char(251), +char(3),char(109),char(255),char(236),char(0),char(251),char(3),char(111),char(255),char(195), +char(0),char(251),char(3),char(113),char(255),char(195),char(0),char(251),char(3),char(115), +char(255),char(195),char(0),char(251),char(3),char(143),char(255),char(215),char(0),char(253), +char(0),char(5),char(255),char(92),char(0),char(253),char(0),char(10),char(255),char(92), +char(0),char(253),char(0),char(38),char(255),char(215),char(0),char(253),char(0),char(42), +char(255),char(215),char(0),char(253),char(0),char(50),char(255),char(215),char(0),char(253), +char(0),char(52),char(255),char(215),char(0),char(253),char(0),char(55),char(255),char(215), +char(0),char(253),char(0),char(56),char(255),char(236),char(0),char(253),char(0),char(57), +char(255),char(215),char(0),char(253),char(0),char(58),char(255),char(215),char(0),char(253), +char(0),char(60),char(255),char(195),char(0),char(253),char(0),char(137),char(255),char(215), +char(0),char(253),char(0),char(148),char(255),char(215),char(0),char(253),char(0),char(149), +char(255),char(215),char(0),char(253),char(0),char(150),char(255),char(215),char(0),char(253), +char(0),char(151),char(255),char(215),char(0),char(253),char(0),char(152),char(255),char(215), +char(0),char(253),char(0),char(154),char(255),char(215),char(0),char(253),char(0),char(155), +char(255),char(236),char(0),char(253),char(0),char(156),char(255),char(236),char(0),char(253), +char(0),char(157),char(255),char(236),char(0),char(253),char(0),char(158),char(255),char(236), +char(0),char(253),char(0),char(159),char(255),char(195),char(0),char(253),char(0),char(200), +char(255),char(215),char(0),char(253),char(0),char(202),char(255),char(215),char(0),char(253), +char(0),char(204),char(255),char(215),char(0),char(253),char(0),char(206),char(255),char(215), +char(0),char(253),char(0),char(222),char(255),char(215),char(0),char(253),char(0),char(224), +char(255),char(215),char(0),char(253),char(0),char(226),char(255),char(215),char(0),char(253), +char(0),char(228),char(255),char(215),char(0),char(253),char(1),char(14),char(255),char(215), +char(0),char(253),char(1),char(16),char(255),char(215),char(0),char(253),char(1),char(18), +char(255),char(215),char(0),char(253),char(1),char(20),char(255),char(215),char(0),char(253), +char(1),char(36),char(255),char(215),char(0),char(253),char(1),char(38),char(255),char(215), +char(0),char(253),char(1),char(42),char(255),char(236),char(0),char(253),char(1),char(44), +char(255),char(236),char(0),char(253),char(1),char(46),char(255),char(236),char(0),char(253), +char(1),char(48),char(255),char(236),char(0),char(253),char(1),char(50),char(255),char(236), +char(0),char(253),char(1),char(52),char(255),char(236),char(0),char(253),char(1),char(54), +char(255),char(215),char(0),char(253),char(1),char(56),char(255),char(195),char(0),char(253), +char(1),char(58),char(255),char(195),char(0),char(253),char(1),char(71),char(255),char(215), +char(0),char(253),char(1),char(250),char(255),char(215),char(0),char(253),char(1),char(252), +char(255),char(215),char(0),char(253),char(1),char(254),char(255),char(215),char(0),char(253), +char(2),char(0),char(255),char(195),char(0),char(253),char(2),char(7),char(255),char(92), +char(0),char(253),char(2),char(11),char(255),char(92),char(0),char(253),char(2),char(95), +char(255),char(215),char(0),char(253),char(2),char(97),char(255),char(236),char(0),char(253), +char(3),char(73),char(255),char(215),char(0),char(253),char(3),char(75),char(255),char(215), +char(0),char(253),char(3),char(77),char(255),char(215),char(0),char(253),char(3),char(79), +char(255),char(215),char(0),char(253),char(3),char(81),char(255),char(215),char(0),char(253), +char(3),char(83),char(255),char(215),char(0),char(253),char(3),char(85),char(255),char(215), +char(0),char(253),char(3),char(87),char(255),char(215),char(0),char(253),char(3),char(89), +char(255),char(215),char(0),char(253),char(3),char(91),char(255),char(215),char(0),char(253), +char(3),char(93),char(255),char(215),char(0),char(253),char(3),char(95),char(255),char(215), +char(0),char(253),char(3),char(97),char(255),char(236),char(0),char(253),char(3),char(99), +char(255),char(236),char(0),char(253),char(3),char(101),char(255),char(236),char(0),char(253), +char(3),char(103),char(255),char(236),char(0),char(253),char(3),char(105),char(255),char(236), +char(0),char(253),char(3),char(107),char(255),char(236),char(0),char(253),char(3),char(109), +char(255),char(236),char(0),char(253),char(3),char(111),char(255),char(195),char(0),char(253), +char(3),char(113),char(255),char(195),char(0),char(253),char(3),char(115),char(255),char(195), +char(0),char(253),char(3),char(143),char(255),char(215),char(0),char(255),char(0),char(5), +char(255),char(92),char(0),char(255),char(0),char(10),char(255),char(92),char(0),char(255), +char(0),char(38),char(255),char(215),char(0),char(255),char(0),char(42),char(255),char(215), +char(0),char(255),char(0),char(50),char(255),char(215),char(0),char(255),char(0),char(52), +char(255),char(215),char(0),char(255),char(0),char(55),char(255),char(215),char(0),char(255), +char(0),char(56),char(255),char(236),char(0),char(255),char(0),char(57),char(255),char(215), +char(0),char(255),char(0),char(58),char(255),char(215),char(0),char(255),char(0),char(60), +char(255),char(195),char(0),char(255),char(0),char(137),char(255),char(215),char(0),char(255), +char(0),char(148),char(255),char(215),char(0),char(255),char(0),char(149),char(255),char(215), +char(0),char(255),char(0),char(150),char(255),char(215),char(0),char(255),char(0),char(151), +char(255),char(215),char(0),char(255),char(0),char(152),char(255),char(215),char(0),char(255), +char(0),char(154),char(255),char(215),char(0),char(255),char(0),char(155),char(255),char(236), +char(0),char(255),char(0),char(156),char(255),char(236),char(0),char(255),char(0),char(157), +char(255),char(236),char(0),char(255),char(0),char(158),char(255),char(236),char(0),char(255), +char(0),char(159),char(255),char(195),char(0),char(255),char(0),char(200),char(255),char(215), +char(0),char(255),char(0),char(202),char(255),char(215),char(0),char(255),char(0),char(204), +char(255),char(215),char(0),char(255),char(0),char(206),char(255),char(215),char(0),char(255), +char(0),char(222),char(255),char(215),char(0),char(255),char(0),char(224),char(255),char(215), +char(0),char(255),char(0),char(226),char(255),char(215),char(0),char(255),char(0),char(228), +char(255),char(215),char(0),char(255),char(1),char(14),char(255),char(215),char(0),char(255), +char(1),char(16),char(255),char(215),char(0),char(255),char(1),char(18),char(255),char(215), +char(0),char(255),char(1),char(20),char(255),char(215),char(0),char(255),char(1),char(36), +char(255),char(215),char(0),char(255),char(1),char(38),char(255),char(215),char(0),char(255), +char(1),char(42),char(255),char(236),char(0),char(255),char(1),char(44),char(255),char(236), +char(0),char(255),char(1),char(46),char(255),char(236),char(0),char(255),char(1),char(48), +char(255),char(236),char(0),char(255),char(1),char(50),char(255),char(236),char(0),char(255), +char(1),char(52),char(255),char(236),char(0),char(255),char(1),char(54),char(255),char(215), +char(0),char(255),char(1),char(56),char(255),char(195),char(0),char(255),char(1),char(58), +char(255),char(195),char(0),char(255),char(1),char(71),char(255),char(215),char(0),char(255), +char(1),char(250),char(255),char(215),char(0),char(255),char(1),char(252),char(255),char(215), +char(0),char(255),char(1),char(254),char(255),char(215),char(0),char(255),char(2),char(0), +char(255),char(195),char(0),char(255),char(2),char(7),char(255),char(92),char(0),char(255), +char(2),char(11),char(255),char(92),char(0),char(255),char(2),char(95),char(255),char(215), +char(0),char(255),char(2),char(97),char(255),char(236),char(0),char(255),char(3),char(73), +char(255),char(215),char(0),char(255),char(3),char(75),char(255),char(215),char(0),char(255), +char(3),char(77),char(255),char(215),char(0),char(255),char(3),char(79),char(255),char(215), +char(0),char(255),char(3),char(81),char(255),char(215),char(0),char(255),char(3),char(83), +char(255),char(215),char(0),char(255),char(3),char(85),char(255),char(215),char(0),char(255), +char(3),char(87),char(255),char(215),char(0),char(255),char(3),char(89),char(255),char(215), +char(0),char(255),char(3),char(91),char(255),char(215),char(0),char(255),char(3),char(93), +char(255),char(215),char(0),char(255),char(3),char(95),char(255),char(215),char(0),char(255), +char(3),char(97),char(255),char(236),char(0),char(255),char(3),char(99),char(255),char(236), +char(0),char(255),char(3),char(101),char(255),char(236),char(0),char(255),char(3),char(103), +char(255),char(236),char(0),char(255),char(3),char(105),char(255),char(236),char(0),char(255), +char(3),char(107),char(255),char(236),char(0),char(255),char(3),char(109),char(255),char(236), +char(0),char(255),char(3),char(111),char(255),char(195),char(0),char(255),char(3),char(113), +char(255),char(195),char(0),char(255),char(3),char(115),char(255),char(195),char(0),char(255), +char(3),char(143),char(255),char(215),char(1),char(0),char(0),char(5),char(0),char(82), +char(1),char(0),char(0),char(10),char(0),char(82),char(1),char(0),char(0),char(12), +char(0),char(143),char(1),char(0),char(0),char(34),char(0),char(143),char(1),char(0), +char(0),char(64),char(0),char(143),char(1),char(0),char(0),char(69),char(0),char(61), +char(1),char(0),char(0),char(75),char(0),char(61),char(1),char(0),char(0),char(78), +char(0),char(61),char(1),char(0),char(0),char(79),char(0),char(61),char(1),char(0), +char(0),char(96),char(0),char(143),char(1),char(0),char(0),char(231),char(0),char(61), +char(1),char(0),char(0),char(233),char(0),char(143),char(1),char(0),char(2),char(7), +char(0),char(82),char(1),char(0),char(2),char(11),char(0),char(82),char(1),char(1), +char(0),char(5),char(255),char(92),char(1),char(1),char(0),char(10),char(255),char(92), +char(1),char(1),char(0),char(38),char(255),char(215),char(1),char(1),char(0),char(42), +char(255),char(215),char(1),char(1),char(0),char(50),char(255),char(215),char(1),char(1), +char(0),char(52),char(255),char(215),char(1),char(1),char(0),char(55),char(255),char(215), +char(1),char(1),char(0),char(56),char(255),char(236),char(1),char(1),char(0),char(57), +char(255),char(215),char(1),char(1),char(0),char(58),char(255),char(215),char(1),char(1), +char(0),char(60),char(255),char(195),char(1),char(1),char(0),char(137),char(255),char(215), +char(1),char(1),char(0),char(148),char(255),char(215),char(1),char(1),char(0),char(149), +char(255),char(215),char(1),char(1),char(0),char(150),char(255),char(215),char(1),char(1), +char(0),char(151),char(255),char(215),char(1),char(1),char(0),char(152),char(255),char(215), +char(1),char(1),char(0),char(154),char(255),char(215),char(1),char(1),char(0),char(155), +char(255),char(236),char(1),char(1),char(0),char(156),char(255),char(236),char(1),char(1), +char(0),char(157),char(255),char(236),char(1),char(1),char(0),char(158),char(255),char(236), +char(1),char(1),char(0),char(159),char(255),char(195),char(1),char(1),char(0),char(200), +char(255),char(215),char(1),char(1),char(0),char(202),char(255),char(215),char(1),char(1), +char(0),char(204),char(255),char(215),char(1),char(1),char(0),char(206),char(255),char(215), +char(1),char(1),char(0),char(222),char(255),char(215),char(1),char(1),char(0),char(224), +char(255),char(215),char(1),char(1),char(0),char(226),char(255),char(215),char(1),char(1), +char(0),char(228),char(255),char(215),char(1),char(1),char(1),char(14),char(255),char(215), +char(1),char(1),char(1),char(16),char(255),char(215),char(1),char(1),char(1),char(18), +char(255),char(215),char(1),char(1),char(1),char(20),char(255),char(215),char(1),char(1), +char(1),char(36),char(255),char(215),char(1),char(1),char(1),char(38),char(255),char(215), +char(1),char(1),char(1),char(42),char(255),char(236),char(1),char(1),char(1),char(44), +char(255),char(236),char(1),char(1),char(1),char(46),char(255),char(236),char(1),char(1), +char(1),char(48),char(255),char(236),char(1),char(1),char(1),char(50),char(255),char(236), +char(1),char(1),char(1),char(52),char(255),char(236),char(1),char(1),char(1),char(54), +char(255),char(215),char(1),char(1),char(1),char(56),char(255),char(195),char(1),char(1), +char(1),char(58),char(255),char(195),char(1),char(1),char(1),char(71),char(255),char(215), +char(1),char(1),char(1),char(250),char(255),char(215),char(1),char(1),char(1),char(252), +char(255),char(215),char(1),char(1),char(1),char(254),char(255),char(215),char(1),char(1), +char(2),char(0),char(255),char(195),char(1),char(1),char(2),char(7),char(255),char(92), +char(1),char(1),char(2),char(11),char(255),char(92),char(1),char(1),char(2),char(95), +char(255),char(215),char(1),char(1),char(2),char(97),char(255),char(236),char(1),char(1), +char(3),char(73),char(255),char(215),char(1),char(1),char(3),char(75),char(255),char(215), +char(1),char(1),char(3),char(77),char(255),char(215),char(1),char(1),char(3),char(79), +char(255),char(215),char(1),char(1),char(3),char(81),char(255),char(215),char(1),char(1), +char(3),char(83),char(255),char(215),char(1),char(1),char(3),char(85),char(255),char(215), +char(1),char(1),char(3),char(87),char(255),char(215),char(1),char(1),char(3),char(89), +char(255),char(215),char(1),char(1),char(3),char(91),char(255),char(215),char(1),char(1), +char(3),char(93),char(255),char(215),char(1),char(1),char(3),char(95),char(255),char(215), +char(1),char(1),char(3),char(97),char(255),char(236),char(1),char(1),char(3),char(99), +char(255),char(236),char(1),char(1),char(3),char(101),char(255),char(236),char(1),char(1), +char(3),char(103),char(255),char(236),char(1),char(1),char(3),char(105),char(255),char(236), +char(1),char(1),char(3),char(107),char(255),char(236),char(1),char(1),char(3),char(109), +char(255),char(236),char(1),char(1),char(3),char(111),char(255),char(195),char(1),char(1), +char(3),char(113),char(255),char(195),char(1),char(1),char(3),char(115),char(255),char(195), +char(1),char(1),char(3),char(143),char(255),char(215),char(1),char(3),char(0),char(5), +char(255),char(92),char(1),char(3),char(0),char(10),char(255),char(92),char(1),char(3), +char(0),char(38),char(255),char(215),char(1),char(3),char(0),char(42),char(255),char(215), +char(1),char(3),char(0),char(50),char(255),char(215),char(1),char(3),char(0),char(52), +char(255),char(215),char(1),char(3),char(0),char(55),char(255),char(215),char(1),char(3), +char(0),char(56),char(255),char(236),char(1),char(3),char(0),char(57),char(255),char(215), +char(1),char(3),char(0),char(58),char(255),char(215),char(1),char(3),char(0),char(60), +char(255),char(195),char(1),char(3),char(0),char(137),char(255),char(215),char(1),char(3), +char(0),char(148),char(255),char(215),char(1),char(3),char(0),char(149),char(255),char(215), +char(1),char(3),char(0),char(150),char(255),char(215),char(1),char(3),char(0),char(151), +char(255),char(215),char(1),char(3),char(0),char(152),char(255),char(215),char(1),char(3), +char(0),char(154),char(255),char(215),char(1),char(3),char(0),char(155),char(255),char(236), +char(1),char(3),char(0),char(156),char(255),char(236),char(1),char(3),char(0),char(157), +char(255),char(236),char(1),char(3),char(0),char(158),char(255),char(236),char(1),char(3), +char(0),char(159),char(255),char(195),char(1),char(3),char(0),char(200),char(255),char(215), +char(1),char(3),char(0),char(202),char(255),char(215),char(1),char(3),char(0),char(204), +char(255),char(215),char(1),char(3),char(0),char(206),char(255),char(215),char(1),char(3), +char(0),char(222),char(255),char(215),char(1),char(3),char(0),char(224),char(255),char(215), +char(1),char(3),char(0),char(226),char(255),char(215),char(1),char(3),char(0),char(228), +char(255),char(215),char(1),char(3),char(1),char(14),char(255),char(215),char(1),char(3), +char(1),char(16),char(255),char(215),char(1),char(3),char(1),char(18),char(255),char(215), +char(1),char(3),char(1),char(20),char(255),char(215),char(1),char(3),char(1),char(36), +char(255),char(215),char(1),char(3),char(1),char(38),char(255),char(215),char(1),char(3), +char(1),char(42),char(255),char(236),char(1),char(3),char(1),char(44),char(255),char(236), +char(1),char(3),char(1),char(46),char(255),char(236),char(1),char(3),char(1),char(48), +char(255),char(236),char(1),char(3),char(1),char(50),char(255),char(236),char(1),char(3), +char(1),char(52),char(255),char(236),char(1),char(3),char(1),char(54),char(255),char(215), +char(1),char(3),char(1),char(56),char(255),char(195),char(1),char(3),char(1),char(58), +char(255),char(195),char(1),char(3),char(1),char(71),char(255),char(215),char(1),char(3), +char(1),char(250),char(255),char(215),char(1),char(3),char(1),char(252),char(255),char(215), +char(1),char(3),char(1),char(254),char(255),char(215),char(1),char(3),char(2),char(0), +char(255),char(195),char(1),char(3),char(2),char(7),char(255),char(92),char(1),char(3), +char(2),char(11),char(255),char(92),char(1),char(3),char(2),char(95),char(255),char(215), +char(1),char(3),char(2),char(97),char(255),char(236),char(1),char(3),char(3),char(73), +char(255),char(215),char(1),char(3),char(3),char(75),char(255),char(215),char(1),char(3), +char(3),char(77),char(255),char(215),char(1),char(3),char(3),char(79),char(255),char(215), +char(1),char(3),char(3),char(81),char(255),char(215),char(1),char(3),char(3),char(83), +char(255),char(215),char(1),char(3),char(3),char(85),char(255),char(215),char(1),char(3), +char(3),char(87),char(255),char(215),char(1),char(3),char(3),char(89),char(255),char(215), +char(1),char(3),char(3),char(91),char(255),char(215),char(1),char(3),char(3),char(93), +char(255),char(215),char(1),char(3),char(3),char(95),char(255),char(215),char(1),char(3), +char(3),char(97),char(255),char(236),char(1),char(3),char(3),char(99),char(255),char(236), +char(1),char(3),char(3),char(101),char(255),char(236),char(1),char(3),char(3),char(103), +char(255),char(236),char(1),char(3),char(3),char(105),char(255),char(236),char(1),char(3), +char(3),char(107),char(255),char(236),char(1),char(3),char(3),char(109),char(255),char(236), +char(1),char(3),char(3),char(111),char(255),char(195),char(1),char(3),char(3),char(113), +char(255),char(195),char(1),char(3),char(3),char(115),char(255),char(195),char(1),char(3), +char(3),char(143),char(255),char(215),char(1),char(8),char(0),char(5),char(255),char(236), +char(1),char(8),char(0),char(10),char(255),char(236),char(1),char(8),char(2),char(7), +char(255),char(236),char(1),char(8),char(2),char(11),char(255),char(236),char(1),char(14), +char(0),char(15),char(255),char(174),char(1),char(14),char(0),char(17),char(255),char(174), +char(1),char(14),char(0),char(36),char(255),char(215),char(1),char(14),char(0),char(55), +char(255),char(195),char(1),char(14),char(0),char(57),char(255),char(236),char(1),char(14), +char(0),char(58),char(255),char(236),char(1),char(14),char(0),char(59),char(255),char(215), +char(1),char(14),char(0),char(60),char(255),char(236),char(1),char(14),char(0),char(61), +char(255),char(236),char(1),char(14),char(0),char(130),char(255),char(215),char(1),char(14), +char(0),char(131),char(255),char(215),char(1),char(14),char(0),char(132),char(255),char(215), +char(1),char(14),char(0),char(133),char(255),char(215),char(1),char(14),char(0),char(134), +char(255),char(215),char(1),char(14),char(0),char(135),char(255),char(215),char(1),char(14), +char(0),char(159),char(255),char(236),char(1),char(14),char(0),char(194),char(255),char(215), +char(1),char(14),char(0),char(196),char(255),char(215),char(1),char(14),char(0),char(198), +char(255),char(215),char(1),char(14),char(1),char(36),char(255),char(195),char(1),char(14), +char(1),char(38),char(255),char(195),char(1),char(14),char(1),char(54),char(255),char(236), +char(1),char(14),char(1),char(56),char(255),char(236),char(1),char(14),char(1),char(58), +char(255),char(236),char(1),char(14),char(1),char(59),char(255),char(236),char(1),char(14), +char(1),char(61),char(255),char(236),char(1),char(14),char(1),char(63),char(255),char(236), +char(1),char(14),char(1),char(67),char(255),char(215),char(1),char(14),char(1),char(160), +char(255),char(236),char(1),char(14),char(1),char(250),char(255),char(236),char(1),char(14), +char(1),char(252),char(255),char(236),char(1),char(14),char(1),char(254),char(255),char(236), +char(1),char(14),char(2),char(0),char(255),char(236),char(1),char(14),char(2),char(8), +char(255),char(174),char(1),char(14),char(2),char(12),char(255),char(174),char(1),char(14), +char(2),char(88),char(255),char(215),char(1),char(14),char(3),char(29),char(255),char(215), +char(1),char(14),char(3),char(31),char(255),char(215),char(1),char(14),char(3),char(33), +char(255),char(215),char(1),char(14),char(3),char(35),char(255),char(215),char(1),char(14), +char(3),char(37),char(255),char(215),char(1),char(14),char(3),char(39),char(255),char(215), +char(1),char(14),char(3),char(41),char(255),char(215),char(1),char(14),char(3),char(43), +char(255),char(215),char(1),char(14),char(3),char(45),char(255),char(215),char(1),char(14), +char(3),char(47),char(255),char(215),char(1),char(14),char(3),char(49),char(255),char(215), +char(1),char(14),char(3),char(51),char(255),char(215),char(1),char(14),char(3),char(111), +char(255),char(236),char(1),char(14),char(3),char(113),char(255),char(236),char(1),char(14), +char(3),char(115),char(255),char(236),char(1),char(14),char(3),char(143),char(255),char(195), +char(1),char(16),char(0),char(15),char(255),char(174),char(1),char(16),char(0),char(17), +char(255),char(174),char(1),char(16),char(0),char(36),char(255),char(215),char(1),char(16), +char(0),char(55),char(255),char(195),char(1),char(16),char(0),char(57),char(255),char(236), +char(1),char(16),char(0),char(58),char(255),char(236),char(1),char(16),char(0),char(59), +char(255),char(215),char(1),char(16),char(0),char(60),char(255),char(236),char(1),char(16), +char(0),char(61),char(255),char(236),char(1),char(16),char(0),char(130),char(255),char(215), +char(1),char(16),char(0),char(131),char(255),char(215),char(1),char(16),char(0),char(132), +char(255),char(215),char(1),char(16),char(0),char(133),char(255),char(215),char(1),char(16), +char(0),char(134),char(255),char(215),char(1),char(16),char(0),char(135),char(255),char(215), +char(1),char(16),char(0),char(159),char(255),char(236),char(1),char(16),char(0),char(194), +char(255),char(215),char(1),char(16),char(0),char(196),char(255),char(215),char(1),char(16), +char(0),char(198),char(255),char(215),char(1),char(16),char(1),char(36),char(255),char(195), +char(1),char(16),char(1),char(38),char(255),char(195),char(1),char(16),char(1),char(54), +char(255),char(236),char(1),char(16),char(1),char(56),char(255),char(236),char(1),char(16), +char(1),char(58),char(255),char(236),char(1),char(16),char(1),char(59),char(255),char(236), +char(1),char(16),char(1),char(61),char(255),char(236),char(1),char(16),char(1),char(63), +char(255),char(236),char(1),char(16),char(1),char(67),char(255),char(215),char(1),char(16), +char(1),char(160),char(255),char(236),char(1),char(16),char(1),char(250),char(255),char(236), +char(1),char(16),char(1),char(252),char(255),char(236),char(1),char(16),char(1),char(254), +char(255),char(236),char(1),char(16),char(2),char(0),char(255),char(236),char(1),char(16), +char(2),char(8),char(255),char(174),char(1),char(16),char(2),char(12),char(255),char(174), +char(1),char(16),char(2),char(88),char(255),char(215),char(1),char(16),char(3),char(29), +char(255),char(215),char(1),char(16),char(3),char(31),char(255),char(215),char(1),char(16), +char(3),char(33),char(255),char(215),char(1),char(16),char(3),char(35),char(255),char(215), +char(1),char(16),char(3),char(37),char(255),char(215),char(1),char(16),char(3),char(39), +char(255),char(215),char(1),char(16),char(3),char(41),char(255),char(215),char(1),char(16), +char(3),char(43),char(255),char(215),char(1),char(16),char(3),char(45),char(255),char(215), +char(1),char(16),char(3),char(47),char(255),char(215),char(1),char(16),char(3),char(49), +char(255),char(215),char(1),char(16),char(3),char(51),char(255),char(215),char(1),char(16), +char(3),char(111),char(255),char(236),char(1),char(16),char(3),char(113),char(255),char(236), +char(1),char(16),char(3),char(115),char(255),char(236),char(1),char(16),char(3),char(143), +char(255),char(195),char(1),char(18),char(0),char(15),char(255),char(174),char(1),char(18), +char(0),char(17),char(255),char(174),char(1),char(18),char(0),char(36),char(255),char(215), +char(1),char(18),char(0),char(55),char(255),char(195),char(1),char(18),char(0),char(57), +char(255),char(236),char(1),char(18),char(0),char(58),char(255),char(236),char(1),char(18), +char(0),char(59),char(255),char(215),char(1),char(18),char(0),char(60),char(255),char(236), +char(1),char(18),char(0),char(61),char(255),char(236),char(1),char(18),char(0),char(130), +char(255),char(215),char(1),char(18),char(0),char(131),char(255),char(215),char(1),char(18), +char(0),char(132),char(255),char(215),char(1),char(18),char(0),char(133),char(255),char(215), +char(1),char(18),char(0),char(134),char(255),char(215),char(1),char(18),char(0),char(135), +char(255),char(215),char(1),char(18),char(0),char(159),char(255),char(236),char(1),char(18), +char(0),char(194),char(255),char(215),char(1),char(18),char(0),char(196),char(255),char(215), +char(1),char(18),char(0),char(198),char(255),char(215),char(1),char(18),char(1),char(36), +char(255),char(195),char(1),char(18),char(1),char(38),char(255),char(195),char(1),char(18), +char(1),char(54),char(255),char(236),char(1),char(18),char(1),char(56),char(255),char(236), +char(1),char(18),char(1),char(58),char(255),char(236),char(1),char(18),char(1),char(59), +char(255),char(236),char(1),char(18),char(1),char(61),char(255),char(236),char(1),char(18), +char(1),char(63),char(255),char(236),char(1),char(18),char(1),char(67),char(255),char(215), +char(1),char(18),char(1),char(160),char(255),char(236),char(1),char(18),char(1),char(250), +char(255),char(236),char(1),char(18),char(1),char(252),char(255),char(236),char(1),char(18), +char(1),char(254),char(255),char(236),char(1),char(18),char(2),char(0),char(255),char(236), +char(1),char(18),char(2),char(8),char(255),char(174),char(1),char(18),char(2),char(12), +char(255),char(174),char(1),char(18),char(2),char(88),char(255),char(215),char(1),char(18), +char(3),char(29),char(255),char(215),char(1),char(18),char(3),char(31),char(255),char(215), +char(1),char(18),char(3),char(33),char(255),char(215),char(1),char(18),char(3),char(35), +char(255),char(215),char(1),char(18),char(3),char(37),char(255),char(215),char(1),char(18), +char(3),char(39),char(255),char(215),char(1),char(18),char(3),char(41),char(255),char(215), +char(1),char(18),char(3),char(43),char(255),char(215),char(1),char(18),char(3),char(45), +char(255),char(215),char(1),char(18),char(3),char(47),char(255),char(215),char(1),char(18), +char(3),char(49),char(255),char(215),char(1),char(18),char(3),char(51),char(255),char(215), +char(1),char(18),char(3),char(111),char(255),char(236),char(1),char(18),char(3),char(113), +char(255),char(236),char(1),char(18),char(3),char(115),char(255),char(236),char(1),char(18), +char(3),char(143),char(255),char(195),char(1),char(20),char(0),char(45),char(0),char(123), +char(1),char(23),char(0),char(5),char(0),char(82),char(1),char(23),char(0),char(10), +char(0),char(82),char(1),char(23),char(0),char(68),char(255),char(215),char(1),char(23), +char(0),char(70),char(255),char(215),char(1),char(23),char(0),char(71),char(255),char(215), +char(1),char(23),char(0),char(72),char(255),char(215),char(1),char(23),char(0),char(74), +char(255),char(236),char(1),char(23),char(0),char(82),char(255),char(215),char(1),char(23), +char(0),char(84),char(255),char(215),char(1),char(23),char(0),char(162),char(255),char(215), +char(1),char(23),char(0),char(163),char(255),char(215),char(1),char(23),char(0),char(164), +char(255),char(215),char(1),char(23),char(0),char(165),char(255),char(215),char(1),char(23), +char(0),char(166),char(255),char(215),char(1),char(23),char(0),char(167),char(255),char(215), +char(1),char(23),char(0),char(168),char(255),char(215),char(1),char(23),char(0),char(169), +char(255),char(215),char(1),char(23),char(0),char(170),char(255),char(215),char(1),char(23), +char(0),char(171),char(255),char(215),char(1),char(23),char(0),char(172),char(255),char(215), +char(1),char(23),char(0),char(173),char(255),char(215),char(1),char(23),char(0),char(180), +char(255),char(215),char(1),char(23),char(0),char(181),char(255),char(215),char(1),char(23), +char(0),char(182),char(255),char(215),char(1),char(23),char(0),char(183),char(255),char(215), +char(1),char(23),char(0),char(184),char(255),char(215),char(1),char(23),char(0),char(186), +char(255),char(215),char(1),char(23),char(0),char(195),char(255),char(215),char(1),char(23), +char(0),char(197),char(255),char(215),char(1),char(23),char(0),char(199),char(255),char(215), +char(1),char(23),char(0),char(201),char(255),char(215),char(1),char(23),char(0),char(203), +char(255),char(215),char(1),char(23),char(0),char(205),char(255),char(215),char(1),char(23), +char(0),char(207),char(255),char(215),char(1),char(23),char(0),char(209),char(255),char(215), +char(1),char(23),char(0),char(211),char(255),char(215),char(1),char(23),char(0),char(213), +char(255),char(215),char(1),char(23),char(0),char(215),char(255),char(215),char(1),char(23), +char(0),char(217),char(255),char(215),char(1),char(23),char(0),char(219),char(255),char(215), +char(1),char(23),char(0),char(221),char(255),char(215),char(1),char(23),char(0),char(223), +char(255),char(236),char(1),char(23),char(0),char(225),char(255),char(236),char(1),char(23), +char(0),char(227),char(255),char(236),char(1),char(23),char(0),char(229),char(255),char(236), +char(1),char(23),char(1),char(15),char(255),char(215),char(1),char(23),char(1),char(17), +char(255),char(215),char(1),char(23),char(1),char(19),char(255),char(215),char(1),char(23), +char(1),char(21),char(255),char(215),char(1),char(23),char(1),char(68),char(255),char(215), +char(1),char(23),char(1),char(70),char(255),char(215),char(1),char(23),char(1),char(72), +char(255),char(215),char(1),char(23),char(2),char(7),char(0),char(82),char(1),char(23), +char(2),char(11),char(0),char(82),char(1),char(23),char(2),char(89),char(255),char(215), +char(1),char(23),char(2),char(96),char(255),char(215),char(1),char(23),char(3),char(30), +char(255),char(215),char(1),char(23),char(3),char(32),char(255),char(215),char(1),char(23), +char(3),char(34),char(255),char(215),char(1),char(23),char(3),char(38),char(255),char(215), +char(1),char(23),char(3),char(40),char(255),char(215),char(1),char(23),char(3),char(42), +char(255),char(215),char(1),char(23),char(3),char(44),char(255),char(215),char(1),char(23), +char(3),char(46),char(255),char(215),char(1),char(23),char(3),char(48),char(255),char(215), +char(1),char(23),char(3),char(50),char(255),char(215),char(1),char(23),char(3),char(52), +char(255),char(215),char(1),char(23),char(3),char(54),char(255),char(215),char(1),char(23), +char(3),char(56),char(255),char(215),char(1),char(23),char(3),char(58),char(255),char(215), +char(1),char(23),char(3),char(60),char(255),char(215),char(1),char(23),char(3),char(64), +char(255),char(215),char(1),char(23),char(3),char(66),char(255),char(215),char(1),char(23), +char(3),char(68),char(255),char(215),char(1),char(23),char(3),char(74),char(255),char(215), +char(1),char(23),char(3),char(76),char(255),char(215),char(1),char(23),char(3),char(78), +char(255),char(215),char(1),char(23),char(3),char(82),char(255),char(215),char(1),char(23), +char(3),char(84),char(255),char(215),char(1),char(23),char(3),char(86),char(255),char(215), +char(1),char(23),char(3),char(88),char(255),char(215),char(1),char(23),char(3),char(90), +char(255),char(215),char(1),char(23),char(3),char(92),char(255),char(215),char(1),char(23), +char(3),char(94),char(255),char(215),char(1),char(23),char(3),char(96),char(255),char(215), +char(1),char(25),char(0),char(5),char(0),char(82),char(1),char(25),char(0),char(10), +char(0),char(82),char(1),char(25),char(0),char(68),char(255),char(215),char(1),char(25), +char(0),char(70),char(255),char(215),char(1),char(25),char(0),char(71),char(255),char(215), +char(1),char(25),char(0),char(72),char(255),char(215),char(1),char(25),char(0),char(74), +char(255),char(236),char(1),char(25),char(0),char(82),char(255),char(215),char(1),char(25), +char(0),char(84),char(255),char(215),char(1),char(25),char(0),char(162),char(255),char(215), +char(1),char(25),char(0),char(163),char(255),char(215),char(1),char(25),char(0),char(164), +char(255),char(215),char(1),char(25),char(0),char(165),char(255),char(215),char(1),char(25), +char(0),char(166),char(255),char(215),char(1),char(25),char(0),char(167),char(255),char(215), +char(1),char(25),char(0),char(168),char(255),char(215),char(1),char(25),char(0),char(169), +char(255),char(215),char(1),char(25),char(0),char(170),char(255),char(215),char(1),char(25), +char(0),char(171),char(255),char(215),char(1),char(25),char(0),char(172),char(255),char(215), +char(1),char(25),char(0),char(173),char(255),char(215),char(1),char(25),char(0),char(180), +char(255),char(215),char(1),char(25),char(0),char(181),char(255),char(215),char(1),char(25), +char(0),char(182),char(255),char(215),char(1),char(25),char(0),char(183),char(255),char(215), +char(1),char(25),char(0),char(184),char(255),char(215),char(1),char(25),char(0),char(186), +char(255),char(215),char(1),char(25),char(0),char(195),char(255),char(215),char(1),char(25), +char(0),char(197),char(255),char(215),char(1),char(25),char(0),char(199),char(255),char(215), +char(1),char(25),char(0),char(201),char(255),char(215),char(1),char(25),char(0),char(203), +char(255),char(215),char(1),char(25),char(0),char(205),char(255),char(215),char(1),char(25), +char(0),char(207),char(255),char(215),char(1),char(25),char(0),char(209),char(255),char(215), +char(1),char(25),char(0),char(211),char(255),char(215),char(1),char(25),char(0),char(213), +char(255),char(215),char(1),char(25),char(0),char(215),char(255),char(215),char(1),char(25), +char(0),char(217),char(255),char(215),char(1),char(25),char(0),char(219),char(255),char(215), +char(1),char(25),char(0),char(221),char(255),char(215),char(1),char(25),char(0),char(223), +char(255),char(236),char(1),char(25),char(0),char(225),char(255),char(236),char(1),char(25), +char(0),char(227),char(255),char(236),char(1),char(25),char(0),char(229),char(255),char(236), +char(1),char(25),char(1),char(15),char(255),char(215),char(1),char(25),char(1),char(17), +char(255),char(215),char(1),char(25),char(1),char(19),char(255),char(215),char(1),char(25), +char(1),char(21),char(255),char(215),char(1),char(25),char(1),char(68),char(255),char(215), +char(1),char(25),char(1),char(70),char(255),char(215),char(1),char(25),char(1),char(72), +char(255),char(215),char(1),char(25),char(2),char(7),char(0),char(82),char(1),char(25), +char(2),char(11),char(0),char(82),char(1),char(25),char(2),char(89),char(255),char(215), +char(1),char(25),char(2),char(96),char(255),char(215),char(1),char(25),char(3),char(30), +char(255),char(215),char(1),char(25),char(3),char(32),char(255),char(215),char(1),char(25), +char(3),char(34),char(255),char(215),char(1),char(25),char(3),char(38),char(255),char(215), +char(1),char(25),char(3),char(40),char(255),char(215),char(1),char(25),char(3),char(42), +char(255),char(215),char(1),char(25),char(3),char(44),char(255),char(215),char(1),char(25), +char(3),char(46),char(255),char(215),char(1),char(25),char(3),char(48),char(255),char(215), +char(1),char(25),char(3),char(50),char(255),char(215),char(1),char(25),char(3),char(52), +char(255),char(215),char(1),char(25),char(3),char(54),char(255),char(215),char(1),char(25), +char(3),char(56),char(255),char(215),char(1),char(25),char(3),char(58),char(255),char(215), +char(1),char(25),char(3),char(60),char(255),char(215),char(1),char(25),char(3),char(64), +char(255),char(215),char(1),char(25),char(3),char(66),char(255),char(215),char(1),char(25), +char(3),char(68),char(255),char(215),char(1),char(25),char(3),char(74),char(255),char(215), +char(1),char(25),char(3),char(76),char(255),char(215),char(1),char(25),char(3),char(78), +char(255),char(215),char(1),char(25),char(3),char(82),char(255),char(215),char(1),char(25), +char(3),char(84),char(255),char(215),char(1),char(25),char(3),char(86),char(255),char(215), +char(1),char(25),char(3),char(88),char(255),char(215),char(1),char(25),char(3),char(90), +char(255),char(215),char(1),char(25),char(3),char(92),char(255),char(215),char(1),char(25), +char(3),char(94),char(255),char(215),char(1),char(25),char(3),char(96),char(255),char(215), +char(1),char(27),char(0),char(5),char(0),char(82),char(1),char(27),char(0),char(10), +char(0),char(82),char(1),char(27),char(0),char(68),char(255),char(215),char(1),char(27), +char(0),char(70),char(255),char(215),char(1),char(27),char(0),char(71),char(255),char(215), +char(1),char(27),char(0),char(72),char(255),char(215),char(1),char(27),char(0),char(74), +char(255),char(236),char(1),char(27),char(0),char(82),char(255),char(215),char(1),char(27), +char(0),char(84),char(255),char(215),char(1),char(27),char(0),char(162),char(255),char(215), +char(1),char(27),char(0),char(163),char(255),char(215),char(1),char(27),char(0),char(164), +char(255),char(215),char(1),char(27),char(0),char(165),char(255),char(215),char(1),char(27), +char(0),char(166),char(255),char(215),char(1),char(27),char(0),char(167),char(255),char(215), +char(1),char(27),char(0),char(168),char(255),char(215),char(1),char(27),char(0),char(169), +char(255),char(215),char(1),char(27),char(0),char(170),char(255),char(215),char(1),char(27), +char(0),char(171),char(255),char(215),char(1),char(27),char(0),char(172),char(255),char(215), +char(1),char(27),char(0),char(173),char(255),char(215),char(1),char(27),char(0),char(180), +char(255),char(215),char(1),char(27),char(0),char(181),char(255),char(215),char(1),char(27), +char(0),char(182),char(255),char(215),char(1),char(27),char(0),char(183),char(255),char(215), +char(1),char(27),char(0),char(184),char(255),char(215),char(1),char(27),char(0),char(186), +char(255),char(215),char(1),char(27),char(0),char(195),char(255),char(215),char(1),char(27), +char(0),char(197),char(255),char(215),char(1),char(27),char(0),char(199),char(255),char(215), +char(1),char(27),char(0),char(201),char(255),char(215),char(1),char(27),char(0),char(203), +char(255),char(215),char(1),char(27),char(0),char(205),char(255),char(215),char(1),char(27), +char(0),char(207),char(255),char(215),char(1),char(27),char(0),char(209),char(255),char(215), +char(1),char(27),char(0),char(211),char(255),char(215),char(1),char(27),char(0),char(213), +char(255),char(215),char(1),char(27),char(0),char(215),char(255),char(215),char(1),char(27), +char(0),char(217),char(255),char(215),char(1),char(27),char(0),char(219),char(255),char(215), +char(1),char(27),char(0),char(221),char(255),char(215),char(1),char(27),char(0),char(223), +char(255),char(236),char(1),char(27),char(0),char(225),char(255),char(236),char(1),char(27), +char(0),char(227),char(255),char(236),char(1),char(27),char(0),char(229),char(255),char(236), +char(1),char(27),char(1),char(15),char(255),char(215),char(1),char(27),char(1),char(17), +char(255),char(215),char(1),char(27),char(1),char(19),char(255),char(215),char(1),char(27), +char(1),char(21),char(255),char(215),char(1),char(27),char(1),char(68),char(255),char(215), +char(1),char(27),char(1),char(70),char(255),char(215),char(1),char(27),char(1),char(72), +char(255),char(215),char(1),char(27),char(2),char(7),char(0),char(82),char(1),char(27), +char(2),char(11),char(0),char(82),char(1),char(27),char(2),char(89),char(255),char(215), +char(1),char(27),char(2),char(96),char(255),char(215),char(1),char(27),char(3),char(30), +char(255),char(215),char(1),char(27),char(3),char(32),char(255),char(215),char(1),char(27), +char(3),char(34),char(255),char(215),char(1),char(27),char(3),char(38),char(255),char(215), +char(1),char(27),char(3),char(40),char(255),char(215),char(1),char(27),char(3),char(42), +char(255),char(215),char(1),char(27),char(3),char(44),char(255),char(215),char(1),char(27), +char(3),char(46),char(255),char(215),char(1),char(27),char(3),char(48),char(255),char(215), +char(1),char(27),char(3),char(50),char(255),char(215),char(1),char(27),char(3),char(52), +char(255),char(215),char(1),char(27),char(3),char(54),char(255),char(215),char(1),char(27), +char(3),char(56),char(255),char(215),char(1),char(27),char(3),char(58),char(255),char(215), +char(1),char(27),char(3),char(60),char(255),char(215),char(1),char(27),char(3),char(64), +char(255),char(215),char(1),char(27),char(3),char(66),char(255),char(215),char(1),char(27), +char(3),char(68),char(255),char(215),char(1),char(27),char(3),char(74),char(255),char(215), +char(1),char(27),char(3),char(76),char(255),char(215),char(1),char(27),char(3),char(78), +char(255),char(215),char(1),char(27),char(3),char(82),char(255),char(215),char(1),char(27), +char(3),char(84),char(255),char(215),char(1),char(27),char(3),char(86),char(255),char(215), +char(1),char(27),char(3),char(88),char(255),char(215),char(1),char(27),char(3),char(90), +char(255),char(215),char(1),char(27),char(3),char(92),char(255),char(215),char(1),char(27), +char(3),char(94),char(255),char(215),char(1),char(27),char(3),char(96),char(255),char(215), +char(1),char(36),char(0),char(15),char(255),char(133),char(1),char(36),char(0),char(16), +char(255),char(174),char(1),char(36),char(0),char(17),char(255),char(133),char(1),char(36), +char(0),char(34),char(0),char(41),char(1),char(36),char(0),char(36),char(255),char(113), +char(1),char(36),char(0),char(38),char(255),char(215),char(1),char(36),char(0),char(42), +char(255),char(215),char(1),char(36),char(0),char(50),char(255),char(215),char(1),char(36), +char(0),char(52),char(255),char(215),char(1),char(36),char(0),char(55),char(0),char(41), +char(1),char(36),char(0),char(68),char(255),char(92),char(1),char(36),char(0),char(70), +char(255),char(113),char(1),char(36),char(0),char(71),char(255),char(113),char(1),char(36), +char(0),char(72),char(255),char(113),char(1),char(36),char(0),char(74),char(255),char(113), +char(1),char(36),char(0),char(80),char(255),char(154),char(1),char(36),char(0),char(81), +char(255),char(154),char(1),char(36),char(0),char(82),char(255),char(113),char(1),char(36), +char(0),char(83),char(255),char(154),char(1),char(36),char(0),char(84),char(255),char(113), +char(1),char(36),char(0),char(85),char(255),char(154),char(1),char(36),char(0),char(86), +char(255),char(133),char(1),char(36),char(0),char(88),char(255),char(154),char(1),char(36), +char(0),char(89),char(255),char(215),char(1),char(36),char(0),char(90),char(255),char(215), +char(1),char(36),char(0),char(91),char(255),char(215),char(1),char(36),char(0),char(92), +char(255),char(215),char(1),char(36),char(0),char(93),char(255),char(174),char(1),char(36), +char(0),char(130),char(255),char(113),char(1),char(36),char(0),char(131),char(255),char(113), +char(1),char(36),char(0),char(132),char(255),char(113),char(1),char(36),char(0),char(133), +char(255),char(113),char(1),char(36),char(0),char(134),char(255),char(113),char(1),char(36), +char(0),char(135),char(255),char(113),char(1),char(36),char(0),char(137),char(255),char(215), +char(1),char(36),char(0),char(148),char(255),char(215),char(1),char(36),char(0),char(149), +char(255),char(215),char(1),char(36),char(0),char(150),char(255),char(215),char(1),char(36), +char(0),char(151),char(255),char(215),char(1),char(36),char(0),char(152),char(255),char(215), +char(1),char(36),char(0),char(154),char(255),char(215),char(1),char(36),char(0),char(162), +char(255),char(113),char(1),char(36),char(0),char(163),char(255),char(92),char(1),char(36), +char(0),char(164),char(255),char(92),char(1),char(36),char(0),char(165),char(255),char(92), +char(1),char(36),char(0),char(166),char(255),char(92),char(1),char(36),char(0),char(167), +char(255),char(92),char(1),char(36),char(0),char(168),char(255),char(92),char(1),char(36), +char(0),char(169),char(255),char(113),char(1),char(36),char(0),char(170),char(255),char(113), +char(1),char(36),char(0),char(171),char(255),char(113),char(1),char(36),char(0),char(172), +char(255),char(113),char(1),char(36),char(0),char(173),char(255),char(113),char(1),char(36), +char(0),char(180),char(255),char(113),char(1),char(36),char(0),char(181),char(255),char(113), +char(1),char(36),char(0),char(182),char(255),char(113),char(1),char(36),char(0),char(183), +char(255),char(113),char(1),char(36),char(0),char(184),char(255),char(113),char(1),char(36), +char(0),char(186),char(255),char(113),char(1),char(36),char(0),char(187),char(255),char(154), +char(1),char(36),char(0),char(188),char(255),char(154),char(1),char(36),char(0),char(189), +char(255),char(154),char(1),char(36),char(0),char(190),char(255),char(154),char(1),char(36), +char(0),char(191),char(255),char(215),char(1),char(36),char(0),char(194),char(255),char(113), +char(1),char(36),char(0),char(195),char(255),char(92),char(1),char(36),char(0),char(196), +char(255),char(113),char(1),char(36),char(0),char(197),char(255),char(92),char(1),char(36), +char(0),char(198),char(255),char(113),char(1),char(36),char(0),char(199),char(255),char(92), +char(1),char(36),char(0),char(200),char(255),char(215),char(1),char(36),char(0),char(201), +char(255),char(113),char(1),char(36),char(0),char(202),char(255),char(215),char(1),char(36), +char(0),char(203),char(255),char(113),char(1),char(36),char(0),char(204),char(255),char(215), +char(1),char(36),char(0),char(205),char(255),char(113),char(1),char(36),char(0),char(206), +char(255),char(215),char(1),char(36),char(0),char(207),char(255),char(113),char(1),char(36), +char(0),char(209),char(255),char(113),char(1),char(36),char(0),char(211),char(255),char(113), +char(1),char(36),char(0),char(213),char(255),char(113),char(1),char(36),char(0),char(215), +char(255),char(113),char(1),char(36),char(0),char(217),char(255),char(113),char(1),char(36), +char(0),char(219),char(255),char(113),char(1),char(36),char(0),char(221),char(255),char(113), +char(1),char(36),char(0),char(222),char(255),char(215),char(1),char(36),char(0),char(223), +char(255),char(113),char(1),char(36),char(0),char(224),char(255),char(215),char(1),char(36), +char(0),char(225),char(255),char(113),char(1),char(36),char(0),char(226),char(255),char(215), +char(1),char(36),char(0),char(227),char(255),char(113),char(1),char(36),char(0),char(228), +char(255),char(215),char(1),char(36),char(0),char(229),char(255),char(113),char(1),char(36), +char(0),char(250),char(255),char(154),char(1),char(36),char(1),char(6),char(255),char(154), +char(1),char(36),char(1),char(8),char(255),char(154),char(1),char(36),char(1),char(13), +char(255),char(154),char(1),char(36),char(1),char(14),char(255),char(215),char(1),char(36), +char(1),char(15),char(255),char(113),char(1),char(36),char(1),char(16),char(255),char(215), +char(1),char(36),char(1),char(17),char(255),char(113),char(1),char(36),char(1),char(18), +char(255),char(215),char(1),char(36),char(1),char(19),char(255),char(113),char(1),char(36), +char(1),char(20),char(255),char(215),char(1),char(36),char(1),char(21),char(255),char(113), +char(1),char(36),char(1),char(23),char(255),char(154),char(1),char(36),char(1),char(25), +char(255),char(154),char(1),char(36),char(1),char(29),char(255),char(133),char(1),char(36), +char(1),char(33),char(255),char(133),char(1),char(36),char(1),char(36),char(0),char(41), +char(1),char(36),char(1),char(38),char(0),char(41),char(1),char(36),char(1),char(43), +char(255),char(154),char(1),char(36),char(1),char(45),char(255),char(154),char(1),char(36), +char(1),char(47),char(255),char(154),char(1),char(36),char(1),char(49),char(255),char(154), +char(1),char(36),char(1),char(51),char(255),char(154),char(1),char(36),char(1),char(53), +char(255),char(154),char(1),char(36),char(1),char(55),char(255),char(215),char(1),char(36), +char(1),char(60),char(255),char(174),char(1),char(36),char(1),char(62),char(255),char(174), +char(1),char(36),char(1),char(64),char(255),char(174),char(1),char(36),char(1),char(67), +char(255),char(113),char(1),char(36),char(1),char(68),char(255),char(92),char(1),char(36), +char(1),char(70),char(255),char(92),char(1),char(36),char(1),char(71),char(255),char(215), +char(1),char(36),char(1),char(72),char(255),char(113),char(1),char(36),char(1),char(74), +char(255),char(133),char(1),char(36),char(1),char(251),char(255),char(215),char(1),char(36), +char(1),char(253),char(255),char(215),char(1),char(36),char(2),char(2),char(255),char(174), +char(1),char(36),char(2),char(3),char(255),char(174),char(1),char(36),char(2),char(4), +char(255),char(174),char(1),char(36),char(2),char(8),char(255),char(133),char(1),char(36), +char(2),char(12),char(255),char(133),char(1),char(36),char(2),char(87),char(255),char(154), +char(1),char(36),char(2),char(88),char(255),char(113),char(1),char(36),char(2),char(89), +char(255),char(92),char(1),char(36),char(2),char(95),char(255),char(215),char(1),char(36), +char(2),char(96),char(255),char(113),char(1),char(36),char(2),char(98),char(255),char(154), +char(1),char(36),char(3),char(29),char(255),char(113),char(1),char(36),char(3),char(30), +char(255),char(92),char(1),char(36),char(3),char(31),char(255),char(113),char(1),char(36), +char(3),char(32),char(255),char(92),char(1),char(36),char(3),char(33),char(255),char(113), +char(1),char(36),char(3),char(34),char(255),char(92),char(1),char(36),char(3),char(35), +char(255),char(113),char(1),char(36),char(3),char(37),char(255),char(113),char(1),char(36), +char(3),char(38),char(255),char(92),char(1),char(36),char(3),char(39),char(255),char(113), +char(1),char(36),char(3),char(40),char(255),char(92),char(1),char(36),char(3),char(41), +char(255),char(113),char(1),char(36),char(3),char(42),char(255),char(92),char(1),char(36), +char(3),char(43),char(255),char(113),char(1),char(36),char(3),char(44),char(255),char(92), +char(1),char(36),char(3),char(45),char(255),char(113),char(1),char(36),char(3),char(46), +char(255),char(92),char(1),char(36),char(3),char(47),char(255),char(113),char(1),char(36), +char(3),char(48),char(255),char(92),char(1),char(36),char(3),char(49),char(255),char(113), +char(1),char(36),char(3),char(50),char(255),char(92),char(1),char(36),char(3),char(51), +char(255),char(113),char(1),char(36),char(3),char(52),char(255),char(92),char(1),char(36), +char(3),char(54),char(255),char(113),char(1),char(36),char(3),char(56),char(255),char(113), +char(1),char(36),char(3),char(58),char(255),char(113),char(1),char(36),char(3),char(60), +char(255),char(113),char(1),char(36),char(3),char(64),char(255),char(113),char(1),char(36), +char(3),char(66),char(255),char(113),char(1),char(36),char(3),char(68),char(255),char(113), +char(1),char(36),char(3),char(73),char(255),char(215),char(1),char(36),char(3),char(74), +char(255),char(113),char(1),char(36),char(3),char(75),char(255),char(215),char(1),char(36), +char(3),char(76),char(255),char(113),char(1),char(36),char(3),char(77),char(255),char(215), +char(1),char(36),char(3),char(78),char(255),char(113),char(1),char(36),char(3),char(79), +char(255),char(215),char(1),char(36),char(3),char(81),char(255),char(215),char(1),char(36), +char(3),char(82),char(255),char(113),char(1),char(36),char(3),char(83),char(255),char(215), +char(1),char(36),char(3),char(84),char(255),char(113),char(1),char(36),char(3),char(85), +char(255),char(215),char(1),char(36),char(3),char(86),char(255),char(113),char(1),char(36), +char(3),char(87),char(255),char(215),char(1),char(36),char(3),char(88),char(255),char(113), +char(1),char(36),char(3),char(89),char(255),char(215),char(1),char(36),char(3),char(90), +char(255),char(113),char(1),char(36),char(3),char(91),char(255),char(215),char(1),char(36), +char(3),char(92),char(255),char(113),char(1),char(36),char(3),char(93),char(255),char(215), +char(1),char(36),char(3),char(94),char(255),char(113),char(1),char(36),char(3),char(95), +char(255),char(215),char(1),char(36),char(3),char(96),char(255),char(113),char(1),char(36), +char(3),char(98),char(255),char(154),char(1),char(36),char(3),char(100),char(255),char(154), +char(1),char(36),char(3),char(102),char(255),char(154),char(1),char(36),char(3),char(104), +char(255),char(154),char(1),char(36),char(3),char(106),char(255),char(154),char(1),char(36), +char(3),char(108),char(255),char(154),char(1),char(36),char(3),char(110),char(255),char(154), +char(1),char(36),char(3),char(112),char(255),char(215),char(1),char(36),char(3),char(143), +char(0),char(41),char(1),char(37),char(0),char(5),char(0),char(41),char(1),char(37), +char(0),char(10),char(0),char(41),char(1),char(37),char(2),char(7),char(0),char(41), +char(1),char(37),char(2),char(11),char(0),char(41),char(1),char(38),char(0),char(15), +char(255),char(133),char(1),char(38),char(0),char(16),char(255),char(174),char(1),char(38), +char(0),char(17),char(255),char(133),char(1),char(38),char(0),char(34),char(0),char(41), +char(1),char(38),char(0),char(36),char(255),char(113),char(1),char(38),char(0),char(38), +char(255),char(215),char(1),char(38),char(0),char(42),char(255),char(215),char(1),char(38), +char(0),char(50),char(255),char(215),char(1),char(38),char(0),char(52),char(255),char(215), +char(1),char(38),char(0),char(55),char(0),char(41),char(1),char(38),char(0),char(68), +char(255),char(92),char(1),char(38),char(0),char(70),char(255),char(113),char(1),char(38), +char(0),char(71),char(255),char(113),char(1),char(38),char(0),char(72),char(255),char(113), +char(1),char(38),char(0),char(74),char(255),char(113),char(1),char(38),char(0),char(80), +char(255),char(154),char(1),char(38),char(0),char(81),char(255),char(154),char(1),char(38), +char(0),char(82),char(255),char(113),char(1),char(38),char(0),char(83),char(255),char(154), +char(1),char(38),char(0),char(84),char(255),char(113),char(1),char(38),char(0),char(85), +char(255),char(154),char(1),char(38),char(0),char(86),char(255),char(133),char(1),char(38), +char(0),char(88),char(255),char(154),char(1),char(38),char(0),char(89),char(255),char(215), +char(1),char(38),char(0),char(90),char(255),char(215),char(1),char(38),char(0),char(91), +char(255),char(215),char(1),char(38),char(0),char(92),char(255),char(215),char(1),char(38), +char(0),char(93),char(255),char(174),char(1),char(38),char(0),char(130),char(255),char(113), +char(1),char(38),char(0),char(131),char(255),char(113),char(1),char(38),char(0),char(132), +char(255),char(113),char(1),char(38),char(0),char(133),char(255),char(113),char(1),char(38), +char(0),char(134),char(255),char(113),char(1),char(38),char(0),char(135),char(255),char(113), +char(1),char(38),char(0),char(137),char(255),char(215),char(1),char(38),char(0),char(148), +char(255),char(215),char(1),char(38),char(0),char(149),char(255),char(215),char(1),char(38), +char(0),char(150),char(255),char(215),char(1),char(38),char(0),char(151),char(255),char(215), +char(1),char(38),char(0),char(152),char(255),char(215),char(1),char(38),char(0),char(154), +char(255),char(215),char(1),char(38),char(0),char(162),char(255),char(113),char(1),char(38), +char(0),char(163),char(255),char(92),char(1),char(38),char(0),char(164),char(255),char(92), +char(1),char(38),char(0),char(165),char(255),char(92),char(1),char(38),char(0),char(166), +char(255),char(92),char(1),char(38),char(0),char(167),char(255),char(92),char(1),char(38), +char(0),char(168),char(255),char(92),char(1),char(38),char(0),char(169),char(255),char(113), +char(1),char(38),char(0),char(170),char(255),char(113),char(1),char(38),char(0),char(171), +char(255),char(113),char(1),char(38),char(0),char(172),char(255),char(113),char(1),char(38), +char(0),char(173),char(255),char(113),char(1),char(38),char(0),char(180),char(255),char(113), +char(1),char(38),char(0),char(181),char(255),char(113),char(1),char(38),char(0),char(182), +char(255),char(113),char(1),char(38),char(0),char(183),char(255),char(113),char(1),char(38), +char(0),char(184),char(255),char(113),char(1),char(38),char(0),char(186),char(255),char(113), +char(1),char(38),char(0),char(187),char(255),char(154),char(1),char(38),char(0),char(188), +char(255),char(154),char(1),char(38),char(0),char(189),char(255),char(154),char(1),char(38), +char(0),char(190),char(255),char(154),char(1),char(38),char(0),char(191),char(255),char(215), +char(1),char(38),char(0),char(194),char(255),char(113),char(1),char(38),char(0),char(195), +char(255),char(92),char(1),char(38),char(0),char(196),char(255),char(113),char(1),char(38), +char(0),char(197),char(255),char(92),char(1),char(38),char(0),char(198),char(255),char(113), +char(1),char(38),char(0),char(199),char(255),char(92),char(1),char(38),char(0),char(200), +char(255),char(215),char(1),char(38),char(0),char(201),char(255),char(113),char(1),char(38), +char(0),char(202),char(255),char(215),char(1),char(38),char(0),char(203),char(255),char(113), +char(1),char(38),char(0),char(204),char(255),char(215),char(1),char(38),char(0),char(205), +char(255),char(113),char(1),char(38),char(0),char(206),char(255),char(215),char(1),char(38), +char(0),char(207),char(255),char(113),char(1),char(38),char(0),char(209),char(255),char(113), +char(1),char(38),char(0),char(211),char(255),char(113),char(1),char(38),char(0),char(213), +char(255),char(113),char(1),char(38),char(0),char(215),char(255),char(113),char(1),char(38), +char(0),char(217),char(255),char(113),char(1),char(38),char(0),char(219),char(255),char(113), +char(1),char(38),char(0),char(221),char(255),char(113),char(1),char(38),char(0),char(222), +char(255),char(215),char(1),char(38),char(0),char(223),char(255),char(113),char(1),char(38), +char(0),char(224),char(255),char(215),char(1),char(38),char(0),char(225),char(255),char(113), +char(1),char(38),char(0),char(226),char(255),char(215),char(1),char(38),char(0),char(227), +char(255),char(113),char(1),char(38),char(0),char(228),char(255),char(215),char(1),char(38), +char(0),char(229),char(255),char(113),char(1),char(38),char(0),char(250),char(255),char(154), +char(1),char(38),char(1),char(6),char(255),char(154),char(1),char(38),char(1),char(8), +char(255),char(154),char(1),char(38),char(1),char(13),char(255),char(154),char(1),char(38), +char(1),char(14),char(255),char(215),char(1),char(38),char(1),char(15),char(255),char(113), +char(1),char(38),char(1),char(16),char(255),char(215),char(1),char(38),char(1),char(17), +char(255),char(113),char(1),char(38),char(1),char(18),char(255),char(215),char(1),char(38), +char(1),char(19),char(255),char(113),char(1),char(38),char(1),char(20),char(255),char(215), +char(1),char(38),char(1),char(21),char(255),char(113),char(1),char(38),char(1),char(23), +char(255),char(154),char(1),char(38),char(1),char(25),char(255),char(154),char(1),char(38), +char(1),char(29),char(255),char(133),char(1),char(38),char(1),char(33),char(255),char(133), +char(1),char(38),char(1),char(36),char(0),char(41),char(1),char(38),char(1),char(38), +char(0),char(41),char(1),char(38),char(1),char(43),char(255),char(154),char(1),char(38), +char(1),char(45),char(255),char(154),char(1),char(38),char(1),char(47),char(255),char(154), +char(1),char(38),char(1),char(49),char(255),char(154),char(1),char(38),char(1),char(51), +char(255),char(154),char(1),char(38),char(1),char(53),char(255),char(154),char(1),char(38), +char(1),char(55),char(255),char(215),char(1),char(38),char(1),char(60),char(255),char(174), +char(1),char(38),char(1),char(62),char(255),char(174),char(1),char(38),char(1),char(64), +char(255),char(174),char(1),char(38),char(1),char(67),char(255),char(113),char(1),char(38), +char(1),char(68),char(255),char(92),char(1),char(38),char(1),char(70),char(255),char(92), +char(1),char(38),char(1),char(71),char(255),char(215),char(1),char(38),char(1),char(72), +char(255),char(113),char(1),char(38),char(1),char(74),char(255),char(133),char(1),char(38), +char(1),char(251),char(255),char(215),char(1),char(38),char(1),char(253),char(255),char(215), +char(1),char(38),char(2),char(2),char(255),char(174),char(1),char(38),char(2),char(3), +char(255),char(174),char(1),char(38),char(2),char(4),char(255),char(174),char(1),char(38), +char(2),char(8),char(255),char(133),char(1),char(38),char(2),char(12),char(255),char(133), +char(1),char(38),char(2),char(87),char(255),char(154),char(1),char(38),char(2),char(88), +char(255),char(113),char(1),char(38),char(2),char(89),char(255),char(92),char(1),char(38), +char(2),char(95),char(255),char(215),char(1),char(38),char(2),char(96),char(255),char(113), +char(1),char(38),char(2),char(98),char(255),char(154),char(1),char(38),char(3),char(29), +char(255),char(113),char(1),char(38),char(3),char(30),char(255),char(92),char(1),char(38), +char(3),char(31),char(255),char(113),char(1),char(38),char(3),char(32),char(255),char(92), +char(1),char(38),char(3),char(33),char(255),char(113),char(1),char(38),char(3),char(34), +char(255),char(92),char(1),char(38),char(3),char(35),char(255),char(113),char(1),char(38), +char(3),char(37),char(255),char(113),char(1),char(38),char(3),char(38),char(255),char(92), +char(1),char(38),char(3),char(39),char(255),char(113),char(1),char(38),char(3),char(40), +char(255),char(92),char(1),char(38),char(3),char(41),char(255),char(113),char(1),char(38), +char(3),char(42),char(255),char(92),char(1),char(38),char(3),char(43),char(255),char(113), +char(1),char(38),char(3),char(44),char(255),char(92),char(1),char(38),char(3),char(45), +char(255),char(113),char(1),char(38),char(3),char(46),char(255),char(92),char(1),char(38), +char(3),char(47),char(255),char(113),char(1),char(38),char(3),char(48),char(255),char(92), +char(1),char(38),char(3),char(49),char(255),char(113),char(1),char(38),char(3),char(50), +char(255),char(92),char(1),char(38),char(3),char(51),char(255),char(113),char(1),char(38), +char(3),char(52),char(255),char(92),char(1),char(38),char(3),char(54),char(255),char(113), +char(1),char(38),char(3),char(56),char(255),char(113),char(1),char(38),char(3),char(58), +char(255),char(113),char(1),char(38),char(3),char(60),char(255),char(113),char(1),char(38), +char(3),char(64),char(255),char(113),char(1),char(38),char(3),char(66),char(255),char(113), +char(1),char(38),char(3),char(68),char(255),char(113),char(1),char(38),char(3),char(73), +char(255),char(215),char(1),char(38),char(3),char(74),char(255),char(113),char(1),char(38), +char(3),char(75),char(255),char(215),char(1),char(38),char(3),char(76),char(255),char(113), +char(1),char(38),char(3),char(77),char(255),char(215),char(1),char(38),char(3),char(78), +char(255),char(113),char(1),char(38),char(3),char(79),char(255),char(215),char(1),char(38), +char(3),char(81),char(255),char(215),char(1),char(38),char(3),char(82),char(255),char(113), +char(1),char(38),char(3),char(83),char(255),char(215),char(1),char(38),char(3),char(84), +char(255),char(113),char(1),char(38),char(3),char(85),char(255),char(215),char(1),char(38), +char(3),char(86),char(255),char(113),char(1),char(38),char(3),char(87),char(255),char(215), +char(1),char(38),char(3),char(88),char(255),char(113),char(1),char(38),char(3),char(89), +char(255),char(215),char(1),char(38),char(3),char(90),char(255),char(113),char(1),char(38), +char(3),char(91),char(255),char(215),char(1),char(38),char(3),char(92),char(255),char(113), +char(1),char(38),char(3),char(93),char(255),char(215),char(1),char(38),char(3),char(94), +char(255),char(113),char(1),char(38),char(3),char(95),char(255),char(215),char(1),char(38), +char(3),char(96),char(255),char(113),char(1),char(38),char(3),char(98),char(255),char(154), +char(1),char(38),char(3),char(100),char(255),char(154),char(1),char(38),char(3),char(102), +char(255),char(154),char(1),char(38),char(3),char(104),char(255),char(154),char(1),char(38), +char(3),char(106),char(255),char(154),char(1),char(38),char(3),char(108),char(255),char(154), +char(1),char(38),char(3),char(110),char(255),char(154),char(1),char(38),char(3),char(112), +char(255),char(215),char(1),char(38),char(3),char(143),char(0),char(41),char(1),char(39), +char(0),char(5),char(0),char(41),char(1),char(39),char(0),char(10),char(0),char(41), +char(1),char(39),char(2),char(7),char(0),char(41),char(1),char(39),char(2),char(11), +char(0),char(41),char(1),char(40),char(0),char(15),char(255),char(133),char(1),char(40), +char(0),char(16),char(255),char(174),char(1),char(40),char(0),char(17),char(255),char(133), +char(1),char(40),char(0),char(34),char(0),char(41),char(1),char(40),char(0),char(36), +char(255),char(113),char(1),char(40),char(0),char(38),char(255),char(215),char(1),char(40), +char(0),char(42),char(255),char(215),char(1),char(40),char(0),char(50),char(255),char(215), +char(1),char(40),char(0),char(52),char(255),char(215),char(1),char(40),char(0),char(55), +char(0),char(41),char(1),char(40),char(0),char(68),char(255),char(92),char(1),char(40), +char(0),char(70),char(255),char(113),char(1),char(40),char(0),char(71),char(255),char(113), +char(1),char(40),char(0),char(72),char(255),char(113),char(1),char(40),char(0),char(74), +char(255),char(113),char(1),char(40),char(0),char(80),char(255),char(154),char(1),char(40), +char(0),char(81),char(255),char(154),char(1),char(40),char(0),char(82),char(255),char(113), +char(1),char(40),char(0),char(83),char(255),char(154),char(1),char(40),char(0),char(84), +char(255),char(113),char(1),char(40),char(0),char(85),char(255),char(154),char(1),char(40), +char(0),char(86),char(255),char(133),char(1),char(40),char(0),char(88),char(255),char(154), +char(1),char(40),char(0),char(89),char(255),char(215),char(1),char(40),char(0),char(90), +char(255),char(215),char(1),char(40),char(0),char(91),char(255),char(215),char(1),char(40), +char(0),char(92),char(255),char(215),char(1),char(40),char(0),char(93),char(255),char(174), +char(1),char(40),char(0),char(130),char(255),char(113),char(1),char(40),char(0),char(131), +char(255),char(113),char(1),char(40),char(0),char(132),char(255),char(113),char(1),char(40), +char(0),char(133),char(255),char(113),char(1),char(40),char(0),char(134),char(255),char(113), +char(1),char(40),char(0),char(135),char(255),char(113),char(1),char(40),char(0),char(137), +char(255),char(215),char(1),char(40),char(0),char(148),char(255),char(215),char(1),char(40), +char(0),char(149),char(255),char(215),char(1),char(40),char(0),char(150),char(255),char(215), +char(1),char(40),char(0),char(151),char(255),char(215),char(1),char(40),char(0),char(152), +char(255),char(215),char(1),char(40),char(0),char(154),char(255),char(215),char(1),char(40), +char(0),char(162),char(255),char(113),char(1),char(40),char(0),char(163),char(255),char(92), +char(1),char(40),char(0),char(164),char(255),char(92),char(1),char(40),char(0),char(165), +char(255),char(92),char(1),char(40),char(0),char(166),char(255),char(92),char(1),char(40), +char(0),char(167),char(255),char(92),char(1),char(40),char(0),char(168),char(255),char(92), +char(1),char(40),char(0),char(169),char(255),char(113),char(1),char(40),char(0),char(170), +char(255),char(113),char(1),char(40),char(0),char(171),char(255),char(113),char(1),char(40), +char(0),char(172),char(255),char(113),char(1),char(40),char(0),char(173),char(255),char(113), +char(1),char(40),char(0),char(180),char(255),char(113),char(1),char(40),char(0),char(181), +char(255),char(113),char(1),char(40),char(0),char(182),char(255),char(113),char(1),char(40), +char(0),char(183),char(255),char(113),char(1),char(40),char(0),char(184),char(255),char(113), +char(1),char(40),char(0),char(186),char(255),char(113),char(1),char(40),char(0),char(187), +char(255),char(154),char(1),char(40),char(0),char(188),char(255),char(154),char(1),char(40), +char(0),char(189),char(255),char(154),char(1),char(40),char(0),char(190),char(255),char(154), +char(1),char(40),char(0),char(191),char(255),char(215),char(1),char(40),char(0),char(194), +char(255),char(113),char(1),char(40),char(0),char(195),char(255),char(92),char(1),char(40), +char(0),char(196),char(255),char(113),char(1),char(40),char(0),char(197),char(255),char(92), +char(1),char(40),char(0),char(198),char(255),char(113),char(1),char(40),char(0),char(199), +char(255),char(92),char(1),char(40),char(0),char(200),char(255),char(215),char(1),char(40), +char(0),char(201),char(255),char(113),char(1),char(40),char(0),char(202),char(255),char(215), +char(1),char(40),char(0),char(203),char(255),char(113),char(1),char(40),char(0),char(204), +char(255),char(215),char(1),char(40),char(0),char(205),char(255),char(113),char(1),char(40), +char(0),char(206),char(255),char(215),char(1),char(40),char(0),char(207),char(255),char(113), +char(1),char(40),char(0),char(209),char(255),char(113),char(1),char(40),char(0),char(211), +char(255),char(113),char(1),char(40),char(0),char(213),char(255),char(113),char(1),char(40), +char(0),char(215),char(255),char(113),char(1),char(40),char(0),char(217),char(255),char(113), +char(1),char(40),char(0),char(219),char(255),char(113),char(1),char(40),char(0),char(221), +char(255),char(113),char(1),char(40),char(0),char(222),char(255),char(215),char(1),char(40), +char(0),char(223),char(255),char(113),char(1),char(40),char(0),char(224),char(255),char(215), +char(1),char(40),char(0),char(225),char(255),char(113),char(1),char(40),char(0),char(226), +char(255),char(215),char(1),char(40),char(0),char(227),char(255),char(113),char(1),char(40), +char(0),char(228),char(255),char(215),char(1),char(40),char(0),char(229),char(255),char(113), +char(1),char(40),char(0),char(250),char(255),char(154),char(1),char(40),char(1),char(6), +char(255),char(154),char(1),char(40),char(1),char(8),char(255),char(154),char(1),char(40), +char(1),char(13),char(255),char(154),char(1),char(40),char(1),char(14),char(255),char(215), +char(1),char(40),char(1),char(15),char(255),char(113),char(1),char(40),char(1),char(16), +char(255),char(215),char(1),char(40),char(1),char(17),char(255),char(113),char(1),char(40), +char(1),char(18),char(255),char(215),char(1),char(40),char(1),char(19),char(255),char(113), +char(1),char(40),char(1),char(20),char(255),char(215),char(1),char(40),char(1),char(21), +char(255),char(113),char(1),char(40),char(1),char(23),char(255),char(154),char(1),char(40), +char(1),char(25),char(255),char(154),char(1),char(40),char(1),char(29),char(255),char(133), +char(1),char(40),char(1),char(33),char(255),char(133),char(1),char(40),char(1),char(36), +char(0),char(41),char(1),char(40),char(1),char(38),char(0),char(41),char(1),char(40), +char(1),char(43),char(255),char(154),char(1),char(40),char(1),char(45),char(255),char(154), +char(1),char(40),char(1),char(47),char(255),char(154),char(1),char(40),char(1),char(49), +char(255),char(154),char(1),char(40),char(1),char(51),char(255),char(154),char(1),char(40), +char(1),char(53),char(255),char(154),char(1),char(40),char(1),char(55),char(255),char(215), +char(1),char(40),char(1),char(60),char(255),char(174),char(1),char(40),char(1),char(62), +char(255),char(174),char(1),char(40),char(1),char(64),char(255),char(174),char(1),char(40), +char(1),char(67),char(255),char(113),char(1),char(40),char(1),char(68),char(255),char(92), +char(1),char(40),char(1),char(70),char(255),char(92),char(1),char(40),char(1),char(71), +char(255),char(215),char(1),char(40),char(1),char(72),char(255),char(113),char(1),char(40), +char(1),char(74),char(255),char(133),char(1),char(40),char(1),char(251),char(255),char(215), +char(1),char(40),char(1),char(253),char(255),char(215),char(1),char(40),char(2),char(2), +char(255),char(174),char(1),char(40),char(2),char(3),char(255),char(174),char(1),char(40), +char(2),char(4),char(255),char(174),char(1),char(40),char(2),char(8),char(255),char(133), +char(1),char(40),char(2),char(12),char(255),char(133),char(1),char(40),char(2),char(87), +char(255),char(154),char(1),char(40),char(2),char(88),char(255),char(113),char(1),char(40), +char(2),char(89),char(255),char(92),char(1),char(40),char(2),char(95),char(255),char(215), +char(1),char(40),char(2),char(96),char(255),char(113),char(1),char(40),char(2),char(98), +char(255),char(154),char(1),char(40),char(3),char(29),char(255),char(113),char(1),char(40), +char(3),char(30),char(255),char(92),char(1),char(40),char(3),char(31),char(255),char(113), +char(1),char(40),char(3),char(32),char(255),char(92),char(1),char(40),char(3),char(33), +char(255),char(113),char(1),char(40),char(3),char(34),char(255),char(92),char(1),char(40), +char(3),char(35),char(255),char(113),char(1),char(40),char(3),char(37),char(255),char(113), +char(1),char(40),char(3),char(38),char(255),char(92),char(1),char(40),char(3),char(39), +char(255),char(113),char(1),char(40),char(3),char(40),char(255),char(92),char(1),char(40), +char(3),char(41),char(255),char(113),char(1),char(40),char(3),char(42),char(255),char(92), +char(1),char(40),char(3),char(43),char(255),char(113),char(1),char(40),char(3),char(44), +char(255),char(92),char(1),char(40),char(3),char(45),char(255),char(113),char(1),char(40), +char(3),char(46),char(255),char(92),char(1),char(40),char(3),char(47),char(255),char(113), +char(1),char(40),char(3),char(48),char(255),char(92),char(1),char(40),char(3),char(49), +char(255),char(113),char(1),char(40),char(3),char(50),char(255),char(92),char(1),char(40), +char(3),char(51),char(255),char(113),char(1),char(40),char(3),char(52),char(255),char(92), +char(1),char(40),char(3),char(54),char(255),char(113),char(1),char(40),char(3),char(56), +char(255),char(113),char(1),char(40),char(3),char(58),char(255),char(113),char(1),char(40), +char(3),char(60),char(255),char(113),char(1),char(40),char(3),char(64),char(255),char(113), +char(1),char(40),char(3),char(66),char(255),char(113),char(1),char(40),char(3),char(68), +char(255),char(113),char(1),char(40),char(3),char(73),char(255),char(215),char(1),char(40), +char(3),char(74),char(255),char(113),char(1),char(40),char(3),char(75),char(255),char(215), +char(1),char(40),char(3),char(76),char(255),char(113),char(1),char(40),char(3),char(77), +char(255),char(215),char(1),char(40),char(3),char(78),char(255),char(113),char(1),char(40), +char(3),char(79),char(255),char(215),char(1),char(40),char(3),char(81),char(255),char(215), +char(1),char(40),char(3),char(82),char(255),char(113),char(1),char(40),char(3),char(83), +char(255),char(215),char(1),char(40),char(3),char(84),char(255),char(113),char(1),char(40), +char(3),char(85),char(255),char(215),char(1),char(40),char(3),char(86),char(255),char(113), +char(1),char(40),char(3),char(87),char(255),char(215),char(1),char(40),char(3),char(88), +char(255),char(113),char(1),char(40),char(3),char(89),char(255),char(215),char(1),char(40), +char(3),char(90),char(255),char(113),char(1),char(40),char(3),char(91),char(255),char(215), +char(1),char(40),char(3),char(92),char(255),char(113),char(1),char(40),char(3),char(93), +char(255),char(215),char(1),char(40),char(3),char(94),char(255),char(113),char(1),char(40), +char(3),char(95),char(255),char(215),char(1),char(40),char(3),char(96),char(255),char(113), +char(1),char(40),char(3),char(98),char(255),char(154),char(1),char(40),char(3),char(100), +char(255),char(154),char(1),char(40),char(3),char(102),char(255),char(154),char(1),char(40), +char(3),char(104),char(255),char(154),char(1),char(40),char(3),char(106),char(255),char(154), +char(1),char(40),char(3),char(108),char(255),char(154),char(1),char(40),char(3),char(110), +char(255),char(154),char(1),char(40),char(3),char(112),char(255),char(215),char(1),char(40), +char(3),char(143),char(0),char(41),char(1),char(42),char(0),char(15),char(255),char(215), +char(1),char(42),char(0),char(17),char(255),char(215),char(1),char(42),char(0),char(36), +char(255),char(236),char(1),char(42),char(0),char(130),char(255),char(236),char(1),char(42), +char(0),char(131),char(255),char(236),char(1),char(42),char(0),char(132),char(255),char(236), +char(1),char(42),char(0),char(133),char(255),char(236),char(1),char(42),char(0),char(134), +char(255),char(236),char(1),char(42),char(0),char(135),char(255),char(236),char(1),char(42), +char(0),char(194),char(255),char(236),char(1),char(42),char(0),char(196),char(255),char(236), +char(1),char(42),char(0),char(198),char(255),char(236),char(1),char(42),char(1),char(67), +char(255),char(236),char(1),char(42),char(2),char(8),char(255),char(215),char(1),char(42), +char(2),char(12),char(255),char(215),char(1),char(42),char(2),char(88),char(255),char(236), +char(1),char(42),char(3),char(29),char(255),char(236),char(1),char(42),char(3),char(31), +char(255),char(236),char(1),char(42),char(3),char(33),char(255),char(236),char(1),char(42), +char(3),char(35),char(255),char(236),char(1),char(42),char(3),char(37),char(255),char(236), +char(1),char(42),char(3),char(39),char(255),char(236),char(1),char(42),char(3),char(41), +char(255),char(236),char(1),char(42),char(3),char(43),char(255),char(236),char(1),char(42), +char(3),char(45),char(255),char(236),char(1),char(42),char(3),char(47),char(255),char(236), +char(1),char(42),char(3),char(49),char(255),char(236),char(1),char(42),char(3),char(51), +char(255),char(236),char(1),char(44),char(0),char(15),char(255),char(215),char(1),char(44), +char(0),char(17),char(255),char(215),char(1),char(44),char(0),char(36),char(255),char(236), +char(1),char(44),char(0),char(130),char(255),char(236),char(1),char(44),char(0),char(131), +char(255),char(236),char(1),char(44),char(0),char(132),char(255),char(236),char(1),char(44), +char(0),char(133),char(255),char(236),char(1),char(44),char(0),char(134),char(255),char(236), +char(1),char(44),char(0),char(135),char(255),char(236),char(1),char(44),char(0),char(194), +char(255),char(236),char(1),char(44),char(0),char(196),char(255),char(236),char(1),char(44), +char(0),char(198),char(255),char(236),char(1),char(44),char(1),char(67),char(255),char(236), +char(1),char(44),char(2),char(8),char(255),char(215),char(1),char(44),char(2),char(12), +char(255),char(215),char(1),char(44),char(2),char(88),char(255),char(236),char(1),char(44), +char(3),char(29),char(255),char(236),char(1),char(44),char(3),char(31),char(255),char(236), +char(1),char(44),char(3),char(33),char(255),char(236),char(1),char(44),char(3),char(35), +char(255),char(236),char(1),char(44),char(3),char(37),char(255),char(236),char(1),char(44), +char(3),char(39),char(255),char(236),char(1),char(44),char(3),char(41),char(255),char(236), +char(1),char(44),char(3),char(43),char(255),char(236),char(1),char(44),char(3),char(45), +char(255),char(236),char(1),char(44),char(3),char(47),char(255),char(236),char(1),char(44), +char(3),char(49),char(255),char(236),char(1),char(44),char(3),char(51),char(255),char(236), +char(1),char(46),char(0),char(15),char(255),char(215),char(1),char(46),char(0),char(17), +char(255),char(215),char(1),char(46),char(0),char(36),char(255),char(236),char(1),char(46), +char(0),char(130),char(255),char(236),char(1),char(46),char(0),char(131),char(255),char(236), +char(1),char(46),char(0),char(132),char(255),char(236),char(1),char(46),char(0),char(133), +char(255),char(236),char(1),char(46),char(0),char(134),char(255),char(236),char(1),char(46), +char(0),char(135),char(255),char(236),char(1),char(46),char(0),char(194),char(255),char(236), +char(1),char(46),char(0),char(196),char(255),char(236),char(1),char(46),char(0),char(198), +char(255),char(236),char(1),char(46),char(1),char(67),char(255),char(236),char(1),char(46), +char(2),char(8),char(255),char(215),char(1),char(46),char(2),char(12),char(255),char(215), +char(1),char(46),char(2),char(88),char(255),char(236),char(1),char(46),char(3),char(29), +char(255),char(236),char(1),char(46),char(3),char(31),char(255),char(236),char(1),char(46), +char(3),char(33),char(255),char(236),char(1),char(46),char(3),char(35),char(255),char(236), +char(1),char(46),char(3),char(37),char(255),char(236),char(1),char(46),char(3),char(39), +char(255),char(236),char(1),char(46),char(3),char(41),char(255),char(236),char(1),char(46), +char(3),char(43),char(255),char(236),char(1),char(46),char(3),char(45),char(255),char(236), +char(1),char(46),char(3),char(47),char(255),char(236),char(1),char(46),char(3),char(49), +char(255),char(236),char(1),char(46),char(3),char(51),char(255),char(236),char(1),char(48), +char(0),char(15),char(255),char(215),char(1),char(48),char(0),char(17),char(255),char(215), +char(1),char(48),char(0),char(36),char(255),char(236),char(1),char(48),char(0),char(130), +char(255),char(236),char(1),char(48),char(0),char(131),char(255),char(236),char(1),char(48), +char(0),char(132),char(255),char(236),char(1),char(48),char(0),char(133),char(255),char(236), +char(1),char(48),char(0),char(134),char(255),char(236),char(1),char(48),char(0),char(135), +char(255),char(236),char(1),char(48),char(0),char(194),char(255),char(236),char(1),char(48), +char(0),char(196),char(255),char(236),char(1),char(48),char(0),char(198),char(255),char(236), +char(1),char(48),char(1),char(67),char(255),char(236),char(1),char(48),char(2),char(8), +char(255),char(215),char(1),char(48),char(2),char(12),char(255),char(215),char(1),char(48), +char(2),char(88),char(255),char(236),char(1),char(48),char(3),char(29),char(255),char(236), +char(1),char(48),char(3),char(31),char(255),char(236),char(1),char(48),char(3),char(33), +char(255),char(236),char(1),char(48),char(3),char(35),char(255),char(236),char(1),char(48), +char(3),char(37),char(255),char(236),char(1),char(48),char(3),char(39),char(255),char(236), +char(1),char(48),char(3),char(41),char(255),char(236),char(1),char(48),char(3),char(43), +char(255),char(236),char(1),char(48),char(3),char(45),char(255),char(236),char(1),char(48), +char(3),char(47),char(255),char(236),char(1),char(48),char(3),char(49),char(255),char(236), +char(1),char(48),char(3),char(51),char(255),char(236),char(1),char(50),char(0),char(15), +char(255),char(215),char(1),char(50),char(0),char(17),char(255),char(215),char(1),char(50), +char(0),char(36),char(255),char(236),char(1),char(50),char(0),char(130),char(255),char(236), +char(1),char(50),char(0),char(131),char(255),char(236),char(1),char(50),char(0),char(132), +char(255),char(236),char(1),char(50),char(0),char(133),char(255),char(236),char(1),char(50), +char(0),char(134),char(255),char(236),char(1),char(50),char(0),char(135),char(255),char(236), +char(1),char(50),char(0),char(194),char(255),char(236),char(1),char(50),char(0),char(196), +char(255),char(236),char(1),char(50),char(0),char(198),char(255),char(236),char(1),char(50), +char(1),char(67),char(255),char(236),char(1),char(50),char(2),char(8),char(255),char(215), +char(1),char(50),char(2),char(12),char(255),char(215),char(1),char(50),char(2),char(88), +char(255),char(236),char(1),char(50),char(3),char(29),char(255),char(236),char(1),char(50), +char(3),char(31),char(255),char(236),char(1),char(50),char(3),char(33),char(255),char(236), +char(1),char(50),char(3),char(35),char(255),char(236),char(1),char(50),char(3),char(37), +char(255),char(236),char(1),char(50),char(3),char(39),char(255),char(236),char(1),char(50), +char(3),char(41),char(255),char(236),char(1),char(50),char(3),char(43),char(255),char(236), +char(1),char(50),char(3),char(45),char(255),char(236),char(1),char(50),char(3),char(47), +char(255),char(236),char(1),char(50),char(3),char(49),char(255),char(236),char(1),char(50), +char(3),char(51),char(255),char(236),char(1),char(52),char(0),char(15),char(255),char(215), +char(1),char(52),char(0),char(17),char(255),char(215),char(1),char(52),char(0),char(36), +char(255),char(236),char(1),char(52),char(0),char(130),char(255),char(236),char(1),char(52), +char(0),char(131),char(255),char(236),char(1),char(52),char(0),char(132),char(255),char(236), +char(1),char(52),char(0),char(133),char(255),char(236),char(1),char(52),char(0),char(134), +char(255),char(236),char(1),char(52),char(0),char(135),char(255),char(236),char(1),char(52), +char(0),char(194),char(255),char(236),char(1),char(52),char(0),char(196),char(255),char(236), +char(1),char(52),char(0),char(198),char(255),char(236),char(1),char(52),char(1),char(67), +char(255),char(236),char(1),char(52),char(2),char(8),char(255),char(215),char(1),char(52), +char(2),char(12),char(255),char(215),char(1),char(52),char(2),char(88),char(255),char(236), +char(1),char(52),char(3),char(29),char(255),char(236),char(1),char(52),char(3),char(31), +char(255),char(236),char(1),char(52),char(3),char(33),char(255),char(236),char(1),char(52), +char(3),char(35),char(255),char(236),char(1),char(52),char(3),char(37),char(255),char(236), +char(1),char(52),char(3),char(39),char(255),char(236),char(1),char(52),char(3),char(41), +char(255),char(236),char(1),char(52),char(3),char(43),char(255),char(236),char(1),char(52), +char(3),char(45),char(255),char(236),char(1),char(52),char(3),char(47),char(255),char(236), +char(1),char(52),char(3),char(49),char(255),char(236),char(1),char(52),char(3),char(51), +char(255),char(236),char(1),char(54),char(0),char(15),char(255),char(154),char(1),char(54), +char(0),char(17),char(255),char(154),char(1),char(54),char(0),char(34),char(0),char(41), +char(1),char(54),char(0),char(36),char(255),char(174),char(1),char(54),char(0),char(38), +char(255),char(236),char(1),char(54),char(0),char(42),char(255),char(236),char(1),char(54), +char(0),char(50),char(255),char(236),char(1),char(54),char(0),char(52),char(255),char(236), +char(1),char(54),char(0),char(68),char(255),char(215),char(1),char(54),char(0),char(70), +char(255),char(215),char(1),char(54),char(0),char(71),char(255),char(215),char(1),char(54), +char(0),char(72),char(255),char(215),char(1),char(54),char(0),char(74),char(255),char(236), +char(1),char(54),char(0),char(80),char(255),char(236),char(1),char(54),char(0),char(81), +char(255),char(236),char(1),char(54),char(0),char(82),char(255),char(215),char(1),char(54), +char(0),char(83),char(255),char(236),char(1),char(54),char(0),char(84),char(255),char(215), +char(1),char(54),char(0),char(85),char(255),char(236),char(1),char(54),char(0),char(86), +char(255),char(236),char(1),char(54),char(0),char(88),char(255),char(236),char(1),char(54), +char(0),char(130),char(255),char(174),char(1),char(54),char(0),char(131),char(255),char(174), +char(1),char(54),char(0),char(132),char(255),char(174),char(1),char(54),char(0),char(133), +char(255),char(174),char(1),char(54),char(0),char(134),char(255),char(174),char(1),char(54), +char(0),char(135),char(255),char(174),char(1),char(54),char(0),char(137),char(255),char(236), +char(1),char(54),char(0),char(148),char(255),char(236),char(1),char(54),char(0),char(149), +char(255),char(236),char(1),char(54),char(0),char(150),char(255),char(236),char(1),char(54), +char(0),char(151),char(255),char(236),char(1),char(54),char(0),char(152),char(255),char(236), +char(1),char(54),char(0),char(154),char(255),char(236),char(1),char(54),char(0),char(162), +char(255),char(215),char(1),char(54),char(0),char(163),char(255),char(215),char(1),char(54), +char(0),char(164),char(255),char(215),char(1),char(54),char(0),char(165),char(255),char(215), +char(1),char(54),char(0),char(166),char(255),char(215),char(1),char(54),char(0),char(167), +char(255),char(215),char(1),char(54),char(0),char(168),char(255),char(215),char(1),char(54), +char(0),char(169),char(255),char(215),char(1),char(54),char(0),char(170),char(255),char(215), +char(1),char(54),char(0),char(171),char(255),char(215),char(1),char(54),char(0),char(172), +char(255),char(215),char(1),char(54),char(0),char(173),char(255),char(215),char(1),char(54), +char(0),char(180),char(255),char(215),char(1),char(54),char(0),char(181),char(255),char(215), +char(1),char(54),char(0),char(182),char(255),char(215),char(1),char(54),char(0),char(183), +char(255),char(215),char(1),char(54),char(0),char(184),char(255),char(215),char(1),char(54), +char(0),char(186),char(255),char(215),char(1),char(54),char(0),char(187),char(255),char(236), +char(1),char(54),char(0),char(188),char(255),char(236),char(1),char(54),char(0),char(189), +char(255),char(236),char(1),char(54),char(0),char(190),char(255),char(236),char(1),char(54), +char(0),char(194),char(255),char(174),char(1),char(54),char(0),char(195),char(255),char(215), +char(1),char(54),char(0),char(196),char(255),char(174),char(1),char(54),char(0),char(197), +char(255),char(215),char(1),char(54),char(0),char(198),char(255),char(174),char(1),char(54), +char(0),char(199),char(255),char(215),char(1),char(54),char(0),char(200),char(255),char(236), +char(1),char(54),char(0),char(201),char(255),char(215),char(1),char(54),char(0),char(202), +char(255),char(236),char(1),char(54),char(0),char(203),char(255),char(215),char(1),char(54), +char(0),char(204),char(255),char(236),char(1),char(54),char(0),char(205),char(255),char(215), +char(1),char(54),char(0),char(206),char(255),char(236),char(1),char(54),char(0),char(207), +char(255),char(215),char(1),char(54),char(0),char(209),char(255),char(215),char(1),char(54), +char(0),char(211),char(255),char(215),char(1),char(54),char(0),char(213),char(255),char(215), +char(1),char(54),char(0),char(215),char(255),char(215),char(1),char(54),char(0),char(217), +char(255),char(215),char(1),char(54),char(0),char(219),char(255),char(215),char(1),char(54), +char(0),char(221),char(255),char(215),char(1),char(54),char(0),char(222),char(255),char(236), +char(1),char(54),char(0),char(223),char(255),char(236),char(1),char(54),char(0),char(224), +char(255),char(236),char(1),char(54),char(0),char(225),char(255),char(236),char(1),char(54), +char(0),char(226),char(255),char(236),char(1),char(54),char(0),char(227),char(255),char(236), +char(1),char(54),char(0),char(228),char(255),char(236),char(1),char(54),char(0),char(229), +char(255),char(236),char(1),char(54),char(0),char(250),char(255),char(236),char(1),char(54), +char(1),char(6),char(255),char(236),char(1),char(54),char(1),char(8),char(255),char(236), +char(1),char(54),char(1),char(13),char(255),char(236),char(1),char(54),char(1),char(14), +char(255),char(236),char(1),char(54),char(1),char(15),char(255),char(215),char(1),char(54), +char(1),char(16),char(255),char(236),char(1),char(54),char(1),char(17),char(255),char(215), +char(1),char(54),char(1),char(18),char(255),char(236),char(1),char(54),char(1),char(19), +char(255),char(215),char(1),char(54),char(1),char(20),char(255),char(236),char(1),char(54), +char(1),char(21),char(255),char(215),char(1),char(54),char(1),char(23),char(255),char(236), +char(1),char(54),char(1),char(25),char(255),char(236),char(1),char(54),char(1),char(29), +char(255),char(236),char(1),char(54),char(1),char(33),char(255),char(236),char(1),char(54), +char(1),char(43),char(255),char(236),char(1),char(54),char(1),char(45),char(255),char(236), +char(1),char(54),char(1),char(47),char(255),char(236),char(1),char(54),char(1),char(49), +char(255),char(236),char(1),char(54),char(1),char(51),char(255),char(236),char(1),char(54), +char(1),char(53),char(255),char(236),char(1),char(54),char(1),char(67),char(255),char(174), +char(1),char(54),char(1),char(68),char(255),char(215),char(1),char(54),char(1),char(70), +char(255),char(215),char(1),char(54),char(1),char(71),char(255),char(236),char(1),char(54), +char(1),char(72),char(255),char(215),char(1),char(54),char(1),char(74),char(255),char(236), +char(1),char(54),char(2),char(8),char(255),char(154),char(1),char(54),char(2),char(12), +char(255),char(154),char(1),char(54),char(2),char(87),char(255),char(236),char(1),char(54), +char(2),char(88),char(255),char(174),char(1),char(54),char(2),char(89),char(255),char(215), +char(1),char(54),char(2),char(95),char(255),char(236),char(1),char(54),char(2),char(96), +char(255),char(215),char(1),char(54),char(2),char(98),char(255),char(236),char(1),char(54), +char(3),char(29),char(255),char(174),char(1),char(54),char(3),char(30),char(255),char(215), +char(1),char(54),char(3),char(31),char(255),char(174),char(1),char(54),char(3),char(32), +char(255),char(215),char(1),char(54),char(3),char(33),char(255),char(174),char(1),char(54), +char(3),char(34),char(255),char(215),char(1),char(54),char(3),char(35),char(255),char(174), +char(1),char(54),char(3),char(37),char(255),char(174),char(1),char(54),char(3),char(38), +char(255),char(215),char(1),char(54),char(3),char(39),char(255),char(174),char(1),char(54), +char(3),char(40),char(255),char(215),char(1),char(54),char(3),char(41),char(255),char(174), +char(1),char(54),char(3),char(42),char(255),char(215),char(1),char(54),char(3),char(43), +char(255),char(174),char(1),char(54),char(3),char(44),char(255),char(215),char(1),char(54), +char(3),char(45),char(255),char(174),char(1),char(54),char(3),char(46),char(255),char(215), +char(1),char(54),char(3),char(47),char(255),char(174),char(1),char(54),char(3),char(48), +char(255),char(215),char(1),char(54),char(3),char(49),char(255),char(174),char(1),char(54), +char(3),char(50),char(255),char(215),char(1),char(54),char(3),char(51),char(255),char(174), +char(1),char(54),char(3),char(52),char(255),char(215),char(1),char(54),char(3),char(54), +char(255),char(215),char(1),char(54),char(3),char(56),char(255),char(215),char(1),char(54), +char(3),char(58),char(255),char(215),char(1),char(54),char(3),char(60),char(255),char(215), +char(1),char(54),char(3),char(64),char(255),char(215),char(1),char(54),char(3),char(66), +char(255),char(215),char(1),char(54),char(3),char(68),char(255),char(215),char(1),char(54), +char(3),char(73),char(255),char(236),char(1),char(54),char(3),char(74),char(255),char(215), +char(1),char(54),char(3),char(75),char(255),char(236),char(1),char(54),char(3),char(76), +char(255),char(215),char(1),char(54),char(3),char(77),char(255),char(236),char(1),char(54), +char(3),char(78),char(255),char(215),char(1),char(54),char(3),char(79),char(255),char(236), +char(1),char(54),char(3),char(81),char(255),char(236),char(1),char(54),char(3),char(82), +char(255),char(215),char(1),char(54),char(3),char(83),char(255),char(236),char(1),char(54), +char(3),char(84),char(255),char(215),char(1),char(54),char(3),char(85),char(255),char(236), +char(1),char(54),char(3),char(86),char(255),char(215),char(1),char(54),char(3),char(87), +char(255),char(236),char(1),char(54),char(3),char(88),char(255),char(215),char(1),char(54), +char(3),char(89),char(255),char(236),char(1),char(54),char(3),char(90),char(255),char(215), +char(1),char(54),char(3),char(91),char(255),char(236),char(1),char(54),char(3),char(92), +char(255),char(215),char(1),char(54),char(3),char(93),char(255),char(236),char(1),char(54), +char(3),char(94),char(255),char(215),char(1),char(54),char(3),char(95),char(255),char(236), +char(1),char(54),char(3),char(96),char(255),char(215),char(1),char(54),char(3),char(98), +char(255),char(236),char(1),char(54),char(3),char(100),char(255),char(236),char(1),char(54), +char(3),char(102),char(255),char(236),char(1),char(54),char(3),char(104),char(255),char(236), +char(1),char(54),char(3),char(106),char(255),char(236),char(1),char(54),char(3),char(108), +char(255),char(236),char(1),char(54),char(3),char(110),char(255),char(236),char(1),char(55), +char(0),char(5),char(0),char(82),char(1),char(55),char(0),char(10),char(0),char(82), +char(1),char(55),char(0),char(15),char(255),char(174),char(1),char(55),char(0),char(17), +char(255),char(174),char(1),char(55),char(0),char(34),char(0),char(41),char(1),char(55), +char(2),char(7),char(0),char(82),char(1),char(55),char(2),char(8),char(255),char(174), +char(1),char(55),char(2),char(11),char(0),char(82),char(1),char(55),char(2),char(12), +char(255),char(174),char(1),char(56),char(0),char(15),char(255),char(133),char(1),char(56), +char(0),char(17),char(255),char(133),char(1),char(56),char(0),char(34),char(0),char(41), +char(1),char(56),char(0),char(36),char(255),char(133),char(1),char(56),char(0),char(38), +char(255),char(215),char(1),char(56),char(0),char(42),char(255),char(215),char(1),char(56), +char(0),char(50),char(255),char(215),char(1),char(56),char(0),char(52),char(255),char(215), +char(1),char(56),char(0),char(68),char(255),char(154),char(1),char(56),char(0),char(70), +char(255),char(154),char(1),char(56),char(0),char(71),char(255),char(154),char(1),char(56), +char(0),char(72),char(255),char(154),char(1),char(56),char(0),char(74),char(255),char(215), +char(1),char(56),char(0),char(80),char(255),char(195),char(1),char(56),char(0),char(81), +char(255),char(195),char(1),char(56),char(0),char(82),char(255),char(154),char(1),char(56), +char(0),char(83),char(255),char(195),char(1),char(56),char(0),char(84),char(255),char(154), +char(1),char(56),char(0),char(85),char(255),char(195),char(1),char(56),char(0),char(86), +char(255),char(174),char(1),char(56),char(0),char(88),char(255),char(195),char(1),char(56), +char(0),char(93),char(255),char(215),char(1),char(56),char(0),char(130),char(255),char(133), +char(1),char(56),char(0),char(131),char(255),char(133),char(1),char(56),char(0),char(132), +char(255),char(133),char(1),char(56),char(0),char(133),char(255),char(133),char(1),char(56), +char(0),char(134),char(255),char(133),char(1),char(56),char(0),char(135),char(255),char(133), +char(1),char(56),char(0),char(137),char(255),char(215),char(1),char(56),char(0),char(148), +char(255),char(215),char(1),char(56),char(0),char(149),char(255),char(215),char(1),char(56), +char(0),char(150),char(255),char(215),char(1),char(56),char(0),char(151),char(255),char(215), +char(1),char(56),char(0),char(152),char(255),char(215),char(1),char(56),char(0),char(154), +char(255),char(215),char(1),char(56),char(0),char(162),char(255),char(154),char(1),char(56), +char(0),char(163),char(255),char(154),char(1),char(56),char(0),char(164),char(255),char(154), +char(1),char(56),char(0),char(165),char(255),char(154),char(1),char(56),char(0),char(166), +char(255),char(154),char(1),char(56),char(0),char(167),char(255),char(154),char(1),char(56), +char(0),char(168),char(255),char(154),char(1),char(56),char(0),char(169),char(255),char(154), +char(1),char(56),char(0),char(170),char(255),char(154),char(1),char(56),char(0),char(171), +char(255),char(154),char(1),char(56),char(0),char(172),char(255),char(154),char(1),char(56), +char(0),char(173),char(255),char(154),char(1),char(56),char(0),char(180),char(255),char(154), +char(1),char(56),char(0),char(181),char(255),char(154),char(1),char(56),char(0),char(182), +char(255),char(154),char(1),char(56),char(0),char(183),char(255),char(154),char(1),char(56), +char(0),char(184),char(255),char(154),char(1),char(56),char(0),char(186),char(255),char(154), +char(1),char(56),char(0),char(187),char(255),char(195),char(1),char(56),char(0),char(188), +char(255),char(195),char(1),char(56),char(0),char(189),char(255),char(195),char(1),char(56), +char(0),char(190),char(255),char(195),char(1),char(56),char(0),char(194),char(255),char(133), +char(1),char(56),char(0),char(195),char(255),char(154),char(1),char(56),char(0),char(196), +char(255),char(133),char(1),char(56),char(0),char(197),char(255),char(154),char(1),char(56), +char(0),char(198),char(255),char(133),char(1),char(56),char(0),char(199),char(255),char(154), +char(1),char(56),char(0),char(200),char(255),char(215),char(1),char(56),char(0),char(201), +char(255),char(154),char(1),char(56),char(0),char(202),char(255),char(215),char(1),char(56), +char(0),char(203),char(255),char(154),char(1),char(56),char(0),char(204),char(255),char(215), +char(1),char(56),char(0),char(205),char(255),char(154),char(1),char(56),char(0),char(206), +char(255),char(215),char(1),char(56),char(0),char(207),char(255),char(154),char(1),char(56), +char(0),char(209),char(255),char(154),char(1),char(56),char(0),char(211),char(255),char(154), +char(1),char(56),char(0),char(213),char(255),char(154),char(1),char(56),char(0),char(215), +char(255),char(154),char(1),char(56),char(0),char(217),char(255),char(154),char(1),char(56), +char(0),char(219),char(255),char(154),char(1),char(56),char(0),char(221),char(255),char(154), +char(1),char(56),char(0),char(222),char(255),char(215),char(1),char(56),char(0),char(223), +char(255),char(215),char(1),char(56),char(0),char(224),char(255),char(215),char(1),char(56), +char(0),char(225),char(255),char(215),char(1),char(56),char(0),char(226),char(255),char(215), +char(1),char(56),char(0),char(227),char(255),char(215),char(1),char(56),char(0),char(228), +char(255),char(215),char(1),char(56),char(0),char(229),char(255),char(215),char(1),char(56), +char(0),char(250),char(255),char(195),char(1),char(56),char(1),char(6),char(255),char(195), +char(1),char(56),char(1),char(8),char(255),char(195),char(1),char(56),char(1),char(13), +char(255),char(195),char(1),char(56),char(1),char(14),char(255),char(215),char(1),char(56), +char(1),char(15),char(255),char(154),char(1),char(56),char(1),char(16),char(255),char(215), +char(1),char(56),char(1),char(17),char(255),char(154),char(1),char(56),char(1),char(18), +char(255),char(215),char(1),char(56),char(1),char(19),char(255),char(154),char(1),char(56), +char(1),char(20),char(255),char(215),char(1),char(56),char(1),char(21),char(255),char(154), +char(1),char(56),char(1),char(23),char(255),char(195),char(1),char(56),char(1),char(25), +char(255),char(195),char(1),char(56),char(1),char(29),char(255),char(174),char(1),char(56), +char(1),char(33),char(255),char(174),char(1),char(56),char(1),char(43),char(255),char(195), +char(1),char(56),char(1),char(45),char(255),char(195),char(1),char(56),char(1),char(47), +char(255),char(195),char(1),char(56),char(1),char(49),char(255),char(195),char(1),char(56), +char(1),char(51),char(255),char(195),char(1),char(56),char(1),char(53),char(255),char(195), +char(1),char(56),char(1),char(60),char(255),char(215),char(1),char(56),char(1),char(62), +char(255),char(215),char(1),char(56),char(1),char(64),char(255),char(215),char(1),char(56), +char(1),char(67),char(255),char(133),char(1),char(56),char(1),char(68),char(255),char(154), +char(1),char(56),char(1),char(70),char(255),char(154),char(1),char(56),char(1),char(71), +char(255),char(215),char(1),char(56),char(1),char(72),char(255),char(154),char(1),char(56), +char(1),char(74),char(255),char(174),char(1),char(56),char(2),char(8),char(255),char(133), +char(1),char(56),char(2),char(12),char(255),char(133),char(1),char(56),char(2),char(87), +char(255),char(195),char(1),char(56),char(2),char(88),char(255),char(133),char(1),char(56), +char(2),char(89),char(255),char(154),char(1),char(56),char(2),char(95),char(255),char(215), +char(1),char(56),char(2),char(96),char(255),char(154),char(1),char(56),char(2),char(98), +char(255),char(195),char(1),char(56),char(3),char(29),char(255),char(133),char(1),char(56), +char(3),char(30),char(255),char(154),char(1),char(56),char(3),char(31),char(255),char(133), +char(1),char(56),char(3),char(32),char(255),char(154),char(1),char(56),char(3),char(33), +char(255),char(133),char(1),char(56),char(3),char(34),char(255),char(154),char(1),char(56), +char(3),char(35),char(255),char(133),char(1),char(56),char(3),char(37),char(255),char(133), +char(1),char(56),char(3),char(38),char(255),char(154),char(1),char(56),char(3),char(39), +char(255),char(133),char(1),char(56),char(3),char(40),char(255),char(154),char(1),char(56), +char(3),char(41),char(255),char(133),char(1),char(56),char(3),char(42),char(255),char(154), +char(1),char(56),char(3),char(43),char(255),char(133),char(1),char(56),char(3),char(44), +char(255),char(154),char(1),char(56),char(3),char(45),char(255),char(133),char(1),char(56), +char(3),char(46),char(255),char(154),char(1),char(56),char(3),char(47),char(255),char(133), +char(1),char(56),char(3),char(48),char(255),char(154),char(1),char(56),char(3),char(49), +char(255),char(133),char(1),char(56),char(3),char(50),char(255),char(154),char(1),char(56), +char(3),char(51),char(255),char(133),char(1),char(56),char(3),char(52),char(255),char(154), +char(1),char(56),char(3),char(54),char(255),char(154),char(1),char(56),char(3),char(56), +char(255),char(154),char(1),char(56),char(3),char(58),char(255),char(154),char(1),char(56), +char(3),char(60),char(255),char(154),char(1),char(56),char(3),char(64),char(255),char(154), +char(1),char(56),char(3),char(66),char(255),char(154),char(1),char(56),char(3),char(68), +char(255),char(154),char(1),char(56),char(3),char(73),char(255),char(215),char(1),char(56), +char(3),char(74),char(255),char(154),char(1),char(56),char(3),char(75),char(255),char(215), +char(1),char(56),char(3),char(76),char(255),char(154),char(1),char(56),char(3),char(77), +char(255),char(215),char(1),char(56),char(3),char(78),char(255),char(154),char(1),char(56), +char(3),char(79),char(255),char(215),char(1),char(56),char(3),char(81),char(255),char(215), +char(1),char(56),char(3),char(82),char(255),char(154),char(1),char(56),char(3),char(83), +char(255),char(215),char(1),char(56),char(3),char(84),char(255),char(154),char(1),char(56), +char(3),char(85),char(255),char(215),char(1),char(56),char(3),char(86),char(255),char(154), +char(1),char(56),char(3),char(87),char(255),char(215),char(1),char(56),char(3),char(88), +char(255),char(154),char(1),char(56),char(3),char(89),char(255),char(215),char(1),char(56), +char(3),char(90),char(255),char(154),char(1),char(56),char(3),char(91),char(255),char(215), +char(1),char(56),char(3),char(92),char(255),char(154),char(1),char(56),char(3),char(93), +char(255),char(215),char(1),char(56),char(3),char(94),char(255),char(154),char(1),char(56), +char(3),char(95),char(255),char(215),char(1),char(56),char(3),char(96),char(255),char(154), +char(1),char(56),char(3),char(98),char(255),char(195),char(1),char(56),char(3),char(100), +char(255),char(195),char(1),char(56),char(3),char(102),char(255),char(195),char(1),char(56), +char(3),char(104),char(255),char(195),char(1),char(56),char(3),char(106),char(255),char(195), +char(1),char(56),char(3),char(108),char(255),char(195),char(1),char(56),char(3),char(110), +char(255),char(195),char(1),char(57),char(0),char(5),char(0),char(82),char(1),char(57), +char(0),char(10),char(0),char(82),char(1),char(57),char(0),char(15),char(255),char(174), +char(1),char(57),char(0),char(17),char(255),char(174),char(1),char(57),char(0),char(34), +char(0),char(41),char(1),char(57),char(2),char(7),char(0),char(82),char(1),char(57), +char(2),char(8),char(255),char(174),char(1),char(57),char(2),char(11),char(0),char(82), +char(1),char(57),char(2),char(12),char(255),char(174),char(1),char(58),char(0),char(15), +char(255),char(133),char(1),char(58),char(0),char(17),char(255),char(133),char(1),char(58), +char(0),char(34),char(0),char(41),char(1),char(58),char(0),char(36),char(255),char(133), +char(1),char(58),char(0),char(38),char(255),char(215),char(1),char(58),char(0),char(42), +char(255),char(215),char(1),char(58),char(0),char(50),char(255),char(215),char(1),char(58), +char(0),char(52),char(255),char(215),char(1),char(58),char(0),char(68),char(255),char(154), +char(1),char(58),char(0),char(70),char(255),char(154),char(1),char(58),char(0),char(71), +char(255),char(154),char(1),char(58),char(0),char(72),char(255),char(154),char(1),char(58), +char(0),char(74),char(255),char(215),char(1),char(58),char(0),char(80),char(255),char(195), +char(1),char(58),char(0),char(81),char(255),char(195),char(1),char(58),char(0),char(82), +char(255),char(154),char(1),char(58),char(0),char(83),char(255),char(195),char(1),char(58), +char(0),char(84),char(255),char(154),char(1),char(58),char(0),char(85),char(255),char(195), +char(1),char(58),char(0),char(86),char(255),char(174),char(1),char(58),char(0),char(88), +char(255),char(195),char(1),char(58),char(0),char(93),char(255),char(215),char(1),char(58), +char(0),char(130),char(255),char(133),char(1),char(58),char(0),char(131),char(255),char(133), +char(1),char(58),char(0),char(132),char(255),char(133),char(1),char(58),char(0),char(133), +char(255),char(133),char(1),char(58),char(0),char(134),char(255),char(133),char(1),char(58), +char(0),char(135),char(255),char(133),char(1),char(58),char(0),char(137),char(255),char(215), +char(1),char(58),char(0),char(148),char(255),char(215),char(1),char(58),char(0),char(149), +char(255),char(215),char(1),char(58),char(0),char(150),char(255),char(215),char(1),char(58), +char(0),char(151),char(255),char(215),char(1),char(58),char(0),char(152),char(255),char(215), +char(1),char(58),char(0),char(154),char(255),char(215),char(1),char(58),char(0),char(162), +char(255),char(154),char(1),char(58),char(0),char(163),char(255),char(154),char(1),char(58), +char(0),char(164),char(255),char(154),char(1),char(58),char(0),char(165),char(255),char(154), +char(1),char(58),char(0),char(166),char(255),char(154),char(1),char(58),char(0),char(167), +char(255),char(154),char(1),char(58),char(0),char(168),char(255),char(154),char(1),char(58), +char(0),char(169),char(255),char(154),char(1),char(58),char(0),char(170),char(255),char(154), +char(1),char(58),char(0),char(171),char(255),char(154),char(1),char(58),char(0),char(172), +char(255),char(154),char(1),char(58),char(0),char(173),char(255),char(154),char(1),char(58), +char(0),char(180),char(255),char(154),char(1),char(58),char(0),char(181),char(255),char(154), +char(1),char(58),char(0),char(182),char(255),char(154),char(1),char(58),char(0),char(183), +char(255),char(154),char(1),char(58),char(0),char(184),char(255),char(154),char(1),char(58), +char(0),char(186),char(255),char(154),char(1),char(58),char(0),char(187),char(255),char(195), +char(1),char(58),char(0),char(188),char(255),char(195),char(1),char(58),char(0),char(189), +char(255),char(195),char(1),char(58),char(0),char(190),char(255),char(195),char(1),char(58), +char(0),char(194),char(255),char(133),char(1),char(58),char(0),char(195),char(255),char(154), +char(1),char(58),char(0),char(196),char(255),char(133),char(1),char(58),char(0),char(197), +char(255),char(154),char(1),char(58),char(0),char(198),char(255),char(133),char(1),char(58), +char(0),char(199),char(255),char(154),char(1),char(58),char(0),char(200),char(255),char(215), +char(1),char(58),char(0),char(201),char(255),char(154),char(1),char(58),char(0),char(202), +char(255),char(215),char(1),char(58),char(0),char(203),char(255),char(154),char(1),char(58), +char(0),char(204),char(255),char(215),char(1),char(58),char(0),char(205),char(255),char(154), +char(1),char(58),char(0),char(206),char(255),char(215),char(1),char(58),char(0),char(207), +char(255),char(154),char(1),char(58),char(0),char(209),char(255),char(154),char(1),char(58), +char(0),char(211),char(255),char(154),char(1),char(58),char(0),char(213),char(255),char(154), +char(1),char(58),char(0),char(215),char(255),char(154),char(1),char(58),char(0),char(217), +char(255),char(154),char(1),char(58),char(0),char(219),char(255),char(154),char(1),char(58), +char(0),char(221),char(255),char(154),char(1),char(58),char(0),char(222),char(255),char(215), +char(1),char(58),char(0),char(223),char(255),char(215),char(1),char(58),char(0),char(224), +char(255),char(215),char(1),char(58),char(0),char(225),char(255),char(215),char(1),char(58), +char(0),char(226),char(255),char(215),char(1),char(58),char(0),char(227),char(255),char(215), +char(1),char(58),char(0),char(228),char(255),char(215),char(1),char(58),char(0),char(229), +char(255),char(215),char(1),char(58),char(0),char(250),char(255),char(195),char(1),char(58), +char(1),char(6),char(255),char(195),char(1),char(58),char(1),char(8),char(255),char(195), +char(1),char(58),char(1),char(13),char(255),char(195),char(1),char(58),char(1),char(14), +char(255),char(215),char(1),char(58),char(1),char(15),char(255),char(154),char(1),char(58), +char(1),char(16),char(255),char(215),char(1),char(58),char(1),char(17),char(255),char(154), +char(1),char(58),char(1),char(18),char(255),char(215),char(1),char(58),char(1),char(19), +char(255),char(154),char(1),char(58),char(1),char(20),char(255),char(215),char(1),char(58), +char(1),char(21),char(255),char(154),char(1),char(58),char(1),char(23),char(255),char(195), +char(1),char(58),char(1),char(25),char(255),char(195),char(1),char(58),char(1),char(29), +char(255),char(174),char(1),char(58),char(1),char(33),char(255),char(174),char(1),char(58), +char(1),char(43),char(255),char(195),char(1),char(58),char(1),char(45),char(255),char(195), +char(1),char(58),char(1),char(47),char(255),char(195),char(1),char(58),char(1),char(49), +char(255),char(195),char(1),char(58),char(1),char(51),char(255),char(195),char(1),char(58), +char(1),char(53),char(255),char(195),char(1),char(58),char(1),char(60),char(255),char(215), +char(1),char(58),char(1),char(62),char(255),char(215),char(1),char(58),char(1),char(64), +char(255),char(215),char(1),char(58),char(1),char(67),char(255),char(133),char(1),char(58), +char(1),char(68),char(255),char(154),char(1),char(58),char(1),char(70),char(255),char(154), +char(1),char(58),char(1),char(71),char(255),char(215),char(1),char(58),char(1),char(72), +char(255),char(154),char(1),char(58),char(1),char(74),char(255),char(174),char(1),char(58), +char(2),char(8),char(255),char(133),char(1),char(58),char(2),char(12),char(255),char(133), +char(1),char(58),char(2),char(87),char(255),char(195),char(1),char(58),char(2),char(88), +char(255),char(133),char(1),char(58),char(2),char(89),char(255),char(154),char(1),char(58), +char(2),char(95),char(255),char(215),char(1),char(58),char(2),char(96),char(255),char(154), +char(1),char(58),char(2),char(98),char(255),char(195),char(1),char(58),char(3),char(29), +char(255),char(133),char(1),char(58),char(3),char(30),char(255),char(154),char(1),char(58), +char(3),char(31),char(255),char(133),char(1),char(58),char(3),char(32),char(255),char(154), +char(1),char(58),char(3),char(33),char(255),char(133),char(1),char(58),char(3),char(34), +char(255),char(154),char(1),char(58),char(3),char(35),char(255),char(133),char(1),char(58), +char(3),char(37),char(255),char(133),char(1),char(58),char(3),char(38),char(255),char(154), +char(1),char(58),char(3),char(39),char(255),char(133),char(1),char(58),char(3),char(40), +char(255),char(154),char(1),char(58),char(3),char(41),char(255),char(133),char(1),char(58), +char(3),char(42),char(255),char(154),char(1),char(58),char(3),char(43),char(255),char(133), +char(1),char(58),char(3),char(44),char(255),char(154),char(1),char(58),char(3),char(45), +char(255),char(133),char(1),char(58),char(3),char(46),char(255),char(154),char(1),char(58), +char(3),char(47),char(255),char(133),char(1),char(58),char(3),char(48),char(255),char(154), +char(1),char(58),char(3),char(49),char(255),char(133),char(1),char(58),char(3),char(50), +char(255),char(154),char(1),char(58),char(3),char(51),char(255),char(133),char(1),char(58), +char(3),char(52),char(255),char(154),char(1),char(58),char(3),char(54),char(255),char(154), +char(1),char(58),char(3),char(56),char(255),char(154),char(1),char(58),char(3),char(58), +char(255),char(154),char(1),char(58),char(3),char(60),char(255),char(154),char(1),char(58), +char(3),char(64),char(255),char(154),char(1),char(58),char(3),char(66),char(255),char(154), +char(1),char(58),char(3),char(68),char(255),char(154),char(1),char(58),char(3),char(73), +char(255),char(215),char(1),char(58),char(3),char(74),char(255),char(154),char(1),char(58), +char(3),char(75),char(255),char(215),char(1),char(58),char(3),char(76),char(255),char(154), +char(1),char(58),char(3),char(77),char(255),char(215),char(1),char(58),char(3),char(78), +char(255),char(154),char(1),char(58),char(3),char(79),char(255),char(215),char(1),char(58), +char(3),char(81),char(255),char(215),char(1),char(58),char(3),char(82),char(255),char(154), +char(1),char(58),char(3),char(83),char(255),char(215),char(1),char(58),char(3),char(84), +char(255),char(154),char(1),char(58),char(3),char(85),char(255),char(215),char(1),char(58), +char(3),char(86),char(255),char(154),char(1),char(58),char(3),char(87),char(255),char(215), +char(1),char(58),char(3),char(88),char(255),char(154),char(1),char(58),char(3),char(89), +char(255),char(215),char(1),char(58),char(3),char(90),char(255),char(154),char(1),char(58), +char(3),char(91),char(255),char(215),char(1),char(58),char(3),char(92),char(255),char(154), +char(1),char(58),char(3),char(93),char(255),char(215),char(1),char(58),char(3),char(94), +char(255),char(154),char(1),char(58),char(3),char(95),char(255),char(215),char(1),char(58), +char(3),char(96),char(255),char(154),char(1),char(58),char(3),char(98),char(255),char(195), +char(1),char(58),char(3),char(100),char(255),char(195),char(1),char(58),char(3),char(102), +char(255),char(195),char(1),char(58),char(3),char(104),char(255),char(195),char(1),char(58), +char(3),char(106),char(255),char(195),char(1),char(58),char(3),char(108),char(255),char(195), +char(1),char(58),char(3),char(110),char(255),char(195),char(1),char(59),char(0),char(38), +char(255),char(236),char(1),char(59),char(0),char(42),char(255),char(236),char(1),char(59), +char(0),char(50),char(255),char(236),char(1),char(59),char(0),char(52),char(255),char(236), +char(1),char(59),char(0),char(137),char(255),char(236),char(1),char(59),char(0),char(148), +char(255),char(236),char(1),char(59),char(0),char(149),char(255),char(236),char(1),char(59), +char(0),char(150),char(255),char(236),char(1),char(59),char(0),char(151),char(255),char(236), +char(1),char(59),char(0),char(152),char(255),char(236),char(1),char(59),char(0),char(154), +char(255),char(236),char(1),char(59),char(0),char(200),char(255),char(236),char(1),char(59), +char(0),char(202),char(255),char(236),char(1),char(59),char(0),char(204),char(255),char(236), +char(1),char(59),char(0),char(206),char(255),char(236),char(1),char(59),char(0),char(222), +char(255),char(236),char(1),char(59),char(0),char(224),char(255),char(236),char(1),char(59), +char(0),char(226),char(255),char(236),char(1),char(59),char(0),char(228),char(255),char(236), +char(1),char(59),char(1),char(14),char(255),char(236),char(1),char(59),char(1),char(16), +char(255),char(236),char(1),char(59),char(1),char(18),char(255),char(236),char(1),char(59), +char(1),char(20),char(255),char(236),char(1),char(59),char(1),char(71),char(255),char(236), +char(1),char(59),char(2),char(95),char(255),char(236),char(1),char(59),char(3),char(73), +char(255),char(236),char(1),char(59),char(3),char(75),char(255),char(236),char(1),char(59), +char(3),char(77),char(255),char(236),char(1),char(59),char(3),char(79),char(255),char(236), +char(1),char(59),char(3),char(81),char(255),char(236),char(1),char(59),char(3),char(83), +char(255),char(236),char(1),char(59),char(3),char(85),char(255),char(236),char(1),char(59), +char(3),char(87),char(255),char(236),char(1),char(59),char(3),char(89),char(255),char(236), +char(1),char(59),char(3),char(91),char(255),char(236),char(1),char(59),char(3),char(93), +char(255),char(236),char(1),char(59),char(3),char(95),char(255),char(236),char(1),char(61), +char(0),char(38),char(255),char(236),char(1),char(61),char(0),char(42),char(255),char(236), +char(1),char(61),char(0),char(50),char(255),char(236),char(1),char(61),char(0),char(52), +char(255),char(236),char(1),char(61),char(0),char(137),char(255),char(236),char(1),char(61), +char(0),char(148),char(255),char(236),char(1),char(61),char(0),char(149),char(255),char(236), +char(1),char(61),char(0),char(150),char(255),char(236),char(1),char(61),char(0),char(151), +char(255),char(236),char(1),char(61),char(0),char(152),char(255),char(236),char(1),char(61), +char(0),char(154),char(255),char(236),char(1),char(61),char(0),char(200),char(255),char(236), +char(1),char(61),char(0),char(202),char(255),char(236),char(1),char(61),char(0),char(204), +char(255),char(236),char(1),char(61),char(0),char(206),char(255),char(236),char(1),char(61), +char(0),char(222),char(255),char(236),char(1),char(61),char(0),char(224),char(255),char(236), +char(1),char(61),char(0),char(226),char(255),char(236),char(1),char(61),char(0),char(228), +char(255),char(236),char(1),char(61),char(1),char(14),char(255),char(236),char(1),char(61), +char(1),char(16),char(255),char(236),char(1),char(61),char(1),char(18),char(255),char(236), +char(1),char(61),char(1),char(20),char(255),char(236),char(1),char(61),char(1),char(71), +char(255),char(236),char(1),char(61),char(2),char(95),char(255),char(236),char(1),char(61), +char(3),char(73),char(255),char(236),char(1),char(61),char(3),char(75),char(255),char(236), +char(1),char(61),char(3),char(77),char(255),char(236),char(1),char(61),char(3),char(79), +char(255),char(236),char(1),char(61),char(3),char(81),char(255),char(236),char(1),char(61), +char(3),char(83),char(255),char(236),char(1),char(61),char(3),char(85),char(255),char(236), +char(1),char(61),char(3),char(87),char(255),char(236),char(1),char(61),char(3),char(89), +char(255),char(236),char(1),char(61),char(3),char(91),char(255),char(236),char(1),char(61), +char(3),char(93),char(255),char(236),char(1),char(61),char(3),char(95),char(255),char(236), +char(1),char(63),char(0),char(38),char(255),char(236),char(1),char(63),char(0),char(42), +char(255),char(236),char(1),char(63),char(0),char(50),char(255),char(236),char(1),char(63), +char(0),char(52),char(255),char(236),char(1),char(63),char(0),char(137),char(255),char(236), +char(1),char(63),char(0),char(148),char(255),char(236),char(1),char(63),char(0),char(149), +char(255),char(236),char(1),char(63),char(0),char(150),char(255),char(236),char(1),char(63), +char(0),char(151),char(255),char(236),char(1),char(63),char(0),char(152),char(255),char(236), +char(1),char(63),char(0),char(154),char(255),char(236),char(1),char(63),char(0),char(200), +char(255),char(236),char(1),char(63),char(0),char(202),char(255),char(236),char(1),char(63), +char(0),char(204),char(255),char(236),char(1),char(63),char(0),char(206),char(255),char(236), +char(1),char(63),char(0),char(222),char(255),char(236),char(1),char(63),char(0),char(224), +char(255),char(236),char(1),char(63),char(0),char(226),char(255),char(236),char(1),char(63), +char(0),char(228),char(255),char(236),char(1),char(63),char(1),char(14),char(255),char(236), +char(1),char(63),char(1),char(16),char(255),char(236),char(1),char(63),char(1),char(18), +char(255),char(236),char(1),char(63),char(1),char(20),char(255),char(236),char(1),char(63), +char(1),char(71),char(255),char(236),char(1),char(63),char(2),char(95),char(255),char(236), +char(1),char(63),char(3),char(73),char(255),char(236),char(1),char(63),char(3),char(75), +char(255),char(236),char(1),char(63),char(3),char(77),char(255),char(236),char(1),char(63), +char(3),char(79),char(255),char(236),char(1),char(63),char(3),char(81),char(255),char(236), +char(1),char(63),char(3),char(83),char(255),char(236),char(1),char(63),char(3),char(85), +char(255),char(236),char(1),char(63),char(3),char(87),char(255),char(236),char(1),char(63), +char(3),char(89),char(255),char(236),char(1),char(63),char(3),char(91),char(255),char(236), +char(1),char(63),char(3),char(93),char(255),char(236),char(1),char(63),char(3),char(95), +char(255),char(236),char(1),char(67),char(0),char(5),char(255),char(113),char(1),char(67), +char(0),char(10),char(255),char(113),char(1),char(67),char(0),char(38),char(255),char(215), +char(1),char(67),char(0),char(42),char(255),char(215),char(1),char(67),char(0),char(45), +char(1),char(10),char(1),char(67),char(0),char(50),char(255),char(215),char(1),char(67), +char(0),char(52),char(255),char(215),char(1),char(67),char(0),char(55),char(255),char(113), +char(1),char(67),char(0),char(57),char(255),char(174),char(1),char(67),char(0),char(58), +char(255),char(174),char(1),char(67),char(0),char(60),char(255),char(133),char(1),char(67), +char(0),char(137),char(255),char(215),char(1),char(67),char(0),char(148),char(255),char(215), +char(1),char(67),char(0),char(149),char(255),char(215),char(1),char(67),char(0),char(150), +char(255),char(215),char(1),char(67),char(0),char(151),char(255),char(215),char(1),char(67), +char(0),char(152),char(255),char(215),char(1),char(67),char(0),char(154),char(255),char(215), +char(1),char(67),char(0),char(159),char(255),char(133),char(1),char(67),char(0),char(200), +char(255),char(215),char(1),char(67),char(0),char(202),char(255),char(215),char(1),char(67), +char(0),char(204),char(255),char(215),char(1),char(67),char(0),char(206),char(255),char(215), +char(1),char(67),char(0),char(222),char(255),char(215),char(1),char(67),char(0),char(224), +char(255),char(215),char(1),char(67),char(0),char(226),char(255),char(215),char(1),char(67), +char(0),char(228),char(255),char(215),char(1),char(67),char(1),char(14),char(255),char(215), +char(1),char(67),char(1),char(16),char(255),char(215),char(1),char(67),char(1),char(18), +char(255),char(215),char(1),char(67),char(1),char(20),char(255),char(215),char(1),char(67), +char(1),char(36),char(255),char(113),char(1),char(67),char(1),char(38),char(255),char(113), +char(1),char(67),char(1),char(54),char(255),char(174),char(1),char(67),char(1),char(56), +char(255),char(133),char(1),char(67),char(1),char(58),char(255),char(133),char(1),char(67), +char(1),char(71),char(255),char(215),char(1),char(67),char(1),char(250),char(255),char(174), +char(1),char(67),char(1),char(252),char(255),char(174),char(1),char(67),char(1),char(254), +char(255),char(174),char(1),char(67),char(2),char(0),char(255),char(133),char(1),char(67), +char(2),char(7),char(255),char(113),char(1),char(67),char(2),char(11),char(255),char(113), +char(1),char(67),char(2),char(95),char(255),char(215),char(1),char(67),char(3),char(73), +char(255),char(215),char(1),char(67),char(3),char(75),char(255),char(215),char(1),char(67), +char(3),char(77),char(255),char(215),char(1),char(67),char(3),char(79),char(255),char(215), +char(1),char(67),char(3),char(81),char(255),char(215),char(1),char(67),char(3),char(83), +char(255),char(215),char(1),char(67),char(3),char(85),char(255),char(215),char(1),char(67), +char(3),char(87),char(255),char(215),char(1),char(67),char(3),char(89),char(255),char(215), +char(1),char(67),char(3),char(91),char(255),char(215),char(1),char(67),char(3),char(93), +char(255),char(215),char(1),char(67),char(3),char(95),char(255),char(215),char(1),char(67), +char(3),char(111),char(255),char(133),char(1),char(67),char(3),char(113),char(255),char(133), +char(1),char(67),char(3),char(115),char(255),char(133),char(1),char(67),char(3),char(143), +char(255),char(113),char(1),char(68),char(0),char(5),char(255),char(236),char(1),char(68), +char(0),char(10),char(255),char(236),char(1),char(68),char(2),char(7),char(255),char(236), +char(1),char(68),char(2),char(11),char(255),char(236),char(1),char(69),char(0),char(45), +char(0),char(123),char(1),char(71),char(0),char(15),char(255),char(174),char(1),char(71), +char(0),char(17),char(255),char(174),char(1),char(71),char(0),char(36),char(255),char(215), +char(1),char(71),char(0),char(55),char(255),char(195),char(1),char(71),char(0),char(57), +char(255),char(236),char(1),char(71),char(0),char(58),char(255),char(236),char(1),char(71), +char(0),char(59),char(255),char(215),char(1),char(71),char(0),char(60),char(255),char(236), +char(1),char(71),char(0),char(61),char(255),char(236),char(1),char(71),char(0),char(130), +char(255),char(215),char(1),char(71),char(0),char(131),char(255),char(215),char(1),char(71), +char(0),char(132),char(255),char(215),char(1),char(71),char(0),char(133),char(255),char(215), +char(1),char(71),char(0),char(134),char(255),char(215),char(1),char(71),char(0),char(135), +char(255),char(215),char(1),char(71),char(0),char(159),char(255),char(236),char(1),char(71), +char(0),char(194),char(255),char(215),char(1),char(71),char(0),char(196),char(255),char(215), +char(1),char(71),char(0),char(198),char(255),char(215),char(1),char(71),char(1),char(36), +char(255),char(195),char(1),char(71),char(1),char(38),char(255),char(195),char(1),char(71), +char(1),char(54),char(255),char(236),char(1),char(71),char(1),char(56),char(255),char(236), +char(1),char(71),char(1),char(58),char(255),char(236),char(1),char(71),char(1),char(59), +char(255),char(236),char(1),char(71),char(1),char(61),char(255),char(236),char(1),char(71), +char(1),char(63),char(255),char(236),char(1),char(71),char(1),char(67),char(255),char(215), +char(1),char(71),char(1),char(160),char(255),char(236),char(1),char(71),char(1),char(250), +char(255),char(236),char(1),char(71),char(1),char(252),char(255),char(236),char(1),char(71), +char(1),char(254),char(255),char(236),char(1),char(71),char(2),char(0),char(255),char(236), +char(1),char(71),char(2),char(8),char(255),char(174),char(1),char(71),char(2),char(12), +char(255),char(174),char(1),char(71),char(2),char(88),char(255),char(215),char(1),char(71), +char(3),char(29),char(255),char(215),char(1),char(71),char(3),char(31),char(255),char(215), +char(1),char(71),char(3),char(33),char(255),char(215),char(1),char(71),char(3),char(35), +char(255),char(215),char(1),char(71),char(3),char(37),char(255),char(215),char(1),char(71), +char(3),char(39),char(255),char(215),char(1),char(71),char(3),char(41),char(255),char(215), +char(1),char(71),char(3),char(43),char(255),char(215),char(1),char(71),char(3),char(45), +char(255),char(215),char(1),char(71),char(3),char(47),char(255),char(215),char(1),char(71), +char(3),char(49),char(255),char(215),char(1),char(71),char(3),char(51),char(255),char(215), +char(1),char(71),char(3),char(111),char(255),char(236),char(1),char(71),char(3),char(113), +char(255),char(236),char(1),char(71),char(3),char(115),char(255),char(236),char(1),char(71), +char(3),char(143),char(255),char(195),char(1),char(86),char(0),char(5),char(255),char(113), +char(1),char(86),char(0),char(10),char(255),char(113),char(1),char(86),char(1),char(102), +char(255),char(215),char(1),char(86),char(1),char(109),char(255),char(215),char(1),char(86), +char(1),char(113),char(255),char(113),char(1),char(86),char(1),char(114),char(255),char(133), +char(1),char(86),char(1),char(115),char(255),char(215),char(1),char(86),char(1),char(117), +char(255),char(174),char(1),char(86),char(1),char(120),char(255),char(133),char(1),char(86), +char(2),char(7),char(255),char(113),char(1),char(86),char(2),char(11),char(255),char(113), +char(1),char(86),char(2),char(84),char(255),char(133),char(1),char(91),char(0),char(15), +char(255),char(174),char(1),char(91),char(0),char(17),char(255),char(174),char(1),char(91), +char(1),char(86),char(255),char(215),char(1),char(91),char(1),char(95),char(255),char(215), +char(1),char(91),char(1),char(98),char(255),char(215),char(1),char(91),char(1),char(100), +char(255),char(236),char(1),char(91),char(1),char(105),char(255),char(215),char(1),char(91), +char(1),char(112),char(255),char(236),char(1),char(91),char(1),char(113),char(255),char(195), +char(1),char(91),char(1),char(114),char(255),char(236),char(1),char(91),char(1),char(116), +char(255),char(215),char(1),char(91),char(1),char(117),char(255),char(236),char(1),char(91), +char(1),char(120),char(255),char(236),char(1),char(91),char(1),char(136),char(255),char(236), +char(1),char(91),char(2),char(8),char(255),char(174),char(1),char(91),char(2),char(12), +char(255),char(174),char(1),char(91),char(2),char(84),char(255),char(236),char(1),char(92), +char(0),char(15),char(255),char(133),char(1),char(92),char(0),char(17),char(255),char(133), +char(1),char(92),char(1),char(86),char(255),char(133),char(1),char(92),char(1),char(95), +char(255),char(133),char(1),char(92),char(1),char(98),char(255),char(133),char(1),char(92), +char(1),char(102),char(255),char(215),char(1),char(92),char(1),char(105),char(255),char(133), +char(1),char(92),char(1),char(109),char(255),char(215),char(1),char(92),char(1),char(115), +char(255),char(195),char(1),char(92),char(1),char(118),char(255),char(236),char(1),char(92), +char(1),char(121),char(255),char(154),char(1),char(92),char(1),char(122),char(255),char(174), +char(1),char(92),char(1),char(123),char(255),char(195),char(1),char(92),char(1),char(124), +char(255),char(195),char(1),char(92),char(1),char(125),char(255),char(195),char(1),char(92), +char(1),char(126),char(255),char(154),char(1),char(92),char(1),char(129),char(255),char(195), +char(1),char(92),char(1),char(130),char(255),char(174),char(1),char(92),char(1),char(132), +char(255),char(195),char(1),char(92),char(1),char(134),char(255),char(195),char(1),char(92), +char(1),char(135),char(255),char(195),char(1),char(92),char(1),char(137),char(255),char(195), +char(1),char(92),char(1),char(140),char(255),char(154),char(1),char(92),char(1),char(142), +char(255),char(154),char(1),char(92),char(1),char(143),char(255),char(154),char(1),char(92), +char(1),char(144),char(255),char(154),char(1),char(92),char(1),char(146),char(255),char(195), +char(1),char(92),char(1),char(147),char(255),char(154),char(1),char(92),char(1),char(149), +char(255),char(195),char(1),char(92),char(1),char(150),char(255),char(195),char(1),char(92), +char(1),char(152),char(255),char(195),char(1),char(92),char(1),char(153),char(255),char(154), +char(1),char(92),char(1),char(154),char(255),char(195),char(1),char(92),char(1),char(155), +char(255),char(195),char(1),char(92),char(2),char(8),char(255),char(133),char(1),char(92), +char(2),char(12),char(255),char(133),char(1),char(92),char(2),char(33),char(255),char(236), +char(1),char(93),char(1),char(113),char(255),char(215),char(1),char(93),char(1),char(114), +char(255),char(236),char(1),char(93),char(1),char(120),char(255),char(236),char(1),char(93), +char(2),char(84),char(255),char(236),char(1),char(94),char(0),char(5),char(255),char(215), +char(1),char(94),char(0),char(10),char(255),char(215),char(1),char(94),char(2),char(7), +char(255),char(215),char(1),char(94),char(2),char(11),char(255),char(215),char(1),char(95), +char(0),char(5),char(255),char(113),char(1),char(95),char(0),char(10),char(255),char(113), +char(1),char(95),char(1),char(102),char(255),char(215),char(1),char(95),char(1),char(109), +char(255),char(215),char(1),char(95),char(1),char(113),char(255),char(113),char(1),char(95), +char(1),char(114),char(255),char(133),char(1),char(95),char(1),char(115),char(255),char(215), +char(1),char(95),char(1),char(117),char(255),char(174),char(1),char(95),char(1),char(120), +char(255),char(133),char(1),char(95),char(2),char(7),char(255),char(113),char(1),char(95), +char(2),char(11),char(255),char(113),char(1),char(95),char(2),char(84),char(255),char(133), +char(1),char(96),char(0),char(15),char(255),char(174),char(1),char(96),char(0),char(17), +char(255),char(174),char(1),char(96),char(1),char(86),char(255),char(215),char(1),char(96), +char(1),char(95),char(255),char(215),char(1),char(96),char(1),char(98),char(255),char(215), +char(1),char(96),char(1),char(105),char(255),char(215),char(1),char(96),char(1),char(116), +char(255),char(215),char(1),char(96),char(2),char(8),char(255),char(174),char(1),char(96), +char(2),char(12),char(255),char(174),char(1),char(97),char(0),char(15),char(255),char(133), +char(1),char(97),char(0),char(16),char(255),char(174),char(1),char(97),char(0),char(17), +char(255),char(133),char(1),char(97),char(1),char(86),char(255),char(92),char(1),char(97), +char(1),char(95),char(255),char(92),char(1),char(97),char(1),char(98),char(255),char(92), +char(1),char(97),char(1),char(102),char(255),char(195),char(1),char(97),char(1),char(105), +char(255),char(92),char(1),char(97),char(1),char(109),char(255),char(195),char(1),char(97), +char(1),char(115),char(255),char(154),char(1),char(97),char(1),char(118),char(255),char(195), +char(1),char(97),char(1),char(121),char(255),char(113),char(1),char(97),char(1),char(122), +char(255),char(154),char(1),char(97),char(1),char(123),char(255),char(154),char(1),char(97), +char(1),char(124),char(255),char(174),char(1),char(97),char(1),char(125),char(255),char(154), +char(1),char(97),char(1),char(126),char(255),char(113),char(1),char(97),char(1),char(128), +char(255),char(215),char(1),char(97),char(1),char(129),char(255),char(195),char(1),char(97), +char(1),char(130),char(255),char(154),char(1),char(97),char(1),char(132),char(255),char(154), +char(1),char(97),char(1),char(134),char(255),char(174),char(1),char(97),char(1),char(135), +char(255),char(154),char(1),char(97),char(1),char(137),char(255),char(154),char(1),char(97), +char(1),char(138),char(255),char(215),char(1),char(97),char(1),char(140),char(255),char(113), +char(1),char(97),char(1),char(142),char(255),char(154),char(1),char(97),char(1),char(143), +char(255),char(113),char(1),char(97),char(1),char(144),char(255),char(113),char(1),char(97), +char(1),char(146),char(255),char(154),char(1),char(97),char(1),char(147),char(255),char(113), +char(1),char(97),char(1),char(148),char(255),char(215),char(1),char(97),char(1),char(149), +char(255),char(154),char(1),char(97),char(1),char(150),char(255),char(154),char(1),char(97), +char(1),char(152),char(255),char(154),char(1),char(97),char(1),char(153),char(255),char(113), +char(1),char(97),char(1),char(154),char(255),char(154),char(1),char(97),char(1),char(155), +char(255),char(154),char(1),char(97),char(2),char(2),char(255),char(174),char(1),char(97), +char(2),char(3),char(255),char(174),char(1),char(97),char(2),char(4),char(255),char(174), +char(1),char(97),char(2),char(8),char(255),char(133),char(1),char(97),char(2),char(12), +char(255),char(133),char(1),char(97),char(2),char(33),char(255),char(195),char(1),char(97), +char(2),char(83),char(255),char(215),char(1),char(98),char(0),char(5),char(255),char(113), +char(1),char(98),char(0),char(10),char(255),char(113),char(1),char(98),char(1),char(102), +char(255),char(215),char(1),char(98),char(1),char(109),char(255),char(215),char(1),char(98), +char(1),char(113),char(255),char(113),char(1),char(98),char(1),char(114),char(255),char(133), +char(1),char(98),char(1),char(115),char(255),char(215),char(1),char(98),char(1),char(117), +char(255),char(174),char(1),char(98),char(1),char(120),char(255),char(133),char(1),char(98), +char(2),char(7),char(255),char(113),char(1),char(98),char(2),char(11),char(255),char(113), +char(1),char(98),char(2),char(84),char(255),char(133),char(1),char(100),char(1),char(102), +char(255),char(236),char(1),char(100),char(1),char(109),char(255),char(236),char(1),char(100), +char(1),char(115),char(255),char(195),char(1),char(102),char(0),char(15),char(255),char(174), +char(1),char(102),char(0),char(17),char(255),char(174),char(1),char(102),char(1),char(86), +char(255),char(215),char(1),char(102),char(1),char(95),char(255),char(215),char(1),char(102), +char(1),char(98),char(255),char(215),char(1),char(102),char(1),char(100),char(255),char(236), +char(1),char(102),char(1),char(105),char(255),char(215),char(1),char(102),char(1),char(112), +char(255),char(236),char(1),char(102),char(1),char(113),char(255),char(195),char(1),char(102), +char(1),char(114),char(255),char(236),char(1),char(102),char(1),char(116),char(255),char(215), +char(1),char(102),char(1),char(117),char(255),char(236),char(1),char(102),char(1),char(120), +char(255),char(236),char(1),char(102),char(1),char(136),char(255),char(236),char(1),char(102), +char(2),char(8),char(255),char(174),char(1),char(102),char(2),char(12),char(255),char(174), +char(1),char(102),char(2),char(84),char(255),char(236),char(1),char(104),char(1),char(102), +char(255),char(215),char(1),char(104),char(1),char(109),char(255),char(215),char(1),char(104), +char(1),char(115),char(255),char(195),char(1),char(104),char(1),char(141),char(255),char(236), +char(1),char(104),char(1),char(145),char(255),char(236),char(1),char(105),char(0),char(5), +char(255),char(113),char(1),char(105),char(0),char(10),char(255),char(113),char(1),char(105), +char(1),char(102),char(255),char(215),char(1),char(105),char(1),char(109),char(255),char(215), +char(1),char(105),char(1),char(113),char(255),char(113),char(1),char(105),char(1),char(114), +char(255),char(133),char(1),char(105),char(1),char(115),char(255),char(215),char(1),char(105), +char(1),char(117),char(255),char(174),char(1),char(105),char(1),char(120),char(255),char(133), +char(1),char(105),char(2),char(7),char(255),char(113),char(1),char(105),char(2),char(11), +char(255),char(113),char(1),char(105),char(2),char(84),char(255),char(133),char(1),char(109), +char(0),char(15),char(255),char(174),char(1),char(109),char(0),char(17),char(255),char(174), +char(1),char(109),char(1),char(86),char(255),char(215),char(1),char(109),char(1),char(95), +char(255),char(215),char(1),char(109),char(1),char(98),char(255),char(215),char(1),char(109), +char(1),char(100),char(255),char(236),char(1),char(109),char(1),char(105),char(255),char(215), +char(1),char(109),char(1),char(112),char(255),char(236),char(1),char(109),char(1),char(113), +char(255),char(195),char(1),char(109),char(1),char(114),char(255),char(236),char(1),char(109), +char(1),char(116),char(255),char(215),char(1),char(109),char(1),char(117),char(255),char(236), +char(1),char(109),char(1),char(120),char(255),char(236),char(1),char(109),char(1),char(136), +char(255),char(236),char(1),char(109),char(2),char(8),char(255),char(174),char(1),char(109), +char(2),char(12),char(255),char(174),char(1),char(109),char(2),char(84),char(255),char(236), +char(1),char(111),char(0),char(15),char(254),char(246),char(1),char(111),char(0),char(17), +char(254),char(246),char(1),char(111),char(1),char(86),char(255),char(154),char(1),char(111), +char(1),char(95),char(255),char(154),char(1),char(111),char(1),char(98),char(255),char(154), +char(1),char(111),char(1),char(100),char(255),char(236),char(1),char(111),char(1),char(105), +char(255),char(154),char(1),char(111),char(1),char(116),char(255),char(215),char(1),char(111), +char(1),char(136),char(255),char(215),char(1),char(111),char(2),char(8),char(254),char(246), +char(1),char(111),char(2),char(12),char(254),char(246),char(1),char(113),char(0),char(15), +char(255),char(133),char(1),char(113),char(0),char(16),char(255),char(174),char(1),char(113), +char(0),char(17),char(255),char(133),char(1),char(113),char(1),char(86),char(255),char(92), +char(1),char(113),char(1),char(95),char(255),char(92),char(1),char(113),char(1),char(98), +char(255),char(92),char(1),char(113),char(1),char(102),char(255),char(195),char(1),char(113), +char(1),char(105),char(255),char(92),char(1),char(113),char(1),char(109),char(255),char(195), +char(1),char(113),char(1),char(115),char(255),char(154),char(1),char(113),char(1),char(118), +char(255),char(195),char(1),char(113),char(1),char(121),char(255),char(113),char(1),char(113), +char(1),char(122),char(255),char(154),char(1),char(113),char(1),char(123),char(255),char(154), +char(1),char(113),char(1),char(124),char(255),char(174),char(1),char(113),char(1),char(125), +char(255),char(154),char(1),char(113),char(1),char(126),char(255),char(113),char(1),char(113), +char(1),char(128),char(255),char(215),char(1),char(113),char(1),char(129),char(255),char(195), +char(1),char(113),char(1),char(130),char(255),char(154),char(1),char(113),char(1),char(132), +char(255),char(154),char(1),char(113),char(1),char(134),char(255),char(174),char(1),char(113), +char(1),char(135),char(255),char(154),char(1),char(113),char(1),char(137),char(255),char(154), +char(1),char(113),char(1),char(138),char(255),char(215),char(1),char(113),char(1),char(140), +char(255),char(113),char(1),char(113),char(1),char(142),char(255),char(154),char(1),char(113), +char(1),char(143),char(255),char(113),char(1),char(113),char(1),char(144),char(255),char(113), +char(1),char(113),char(1),char(146),char(255),char(154),char(1),char(113),char(1),char(147), +char(255),char(113),char(1),char(113),char(1),char(148),char(255),char(215),char(1),char(113), +char(1),char(149),char(255),char(154),char(1),char(113),char(1),char(150),char(255),char(154), +char(1),char(113),char(1),char(152),char(255),char(154),char(1),char(113),char(1),char(153), +char(255),char(113),char(1),char(113),char(1),char(154),char(255),char(154),char(1),char(113), +char(1),char(155),char(255),char(154),char(1),char(113),char(2),char(2),char(255),char(174), +char(1),char(113),char(2),char(3),char(255),char(174),char(1),char(113),char(2),char(4), +char(255),char(174),char(1),char(113),char(2),char(8),char(255),char(133),char(1),char(113), +char(2),char(12),char(255),char(133),char(1),char(113),char(2),char(33),char(255),char(195), +char(1),char(113),char(2),char(83),char(255),char(215),char(1),char(114),char(0),char(15), +char(255),char(133),char(1),char(114),char(0),char(17),char(255),char(133),char(1),char(114), +char(1),char(86),char(255),char(133),char(1),char(114),char(1),char(95),char(255),char(133), +char(1),char(114),char(1),char(98),char(255),char(133),char(1),char(114),char(1),char(102), +char(255),char(215),char(1),char(114),char(1),char(105),char(255),char(133),char(1),char(114), +char(1),char(109),char(255),char(215),char(1),char(114),char(1),char(115),char(255),char(195), +char(1),char(114),char(1),char(118),char(255),char(236),char(1),char(114),char(1),char(121), +char(255),char(154),char(1),char(114),char(1),char(122),char(255),char(174),char(1),char(114), +char(1),char(123),char(255),char(195),char(1),char(114),char(1),char(124),char(255),char(195), +char(1),char(114),char(1),char(125),char(255),char(195),char(1),char(114),char(1),char(126), +char(255),char(154),char(1),char(114),char(1),char(129),char(255),char(195),char(1),char(114), +char(1),char(130),char(255),char(174),char(1),char(114),char(1),char(132),char(255),char(195), +char(1),char(114),char(1),char(134),char(255),char(195),char(1),char(114),char(1),char(135), +char(255),char(195),char(1),char(114),char(1),char(137),char(255),char(195),char(1),char(114), +char(1),char(140),char(255),char(154),char(1),char(114),char(1),char(142),char(255),char(154), +char(1),char(114),char(1),char(143),char(255),char(154),char(1),char(114),char(1),char(144), +char(255),char(154),char(1),char(114),char(1),char(146),char(255),char(195),char(1),char(114), +char(1),char(147),char(255),char(154),char(1),char(114),char(1),char(149),char(255),char(195), +char(1),char(114),char(1),char(150),char(255),char(195),char(1),char(114),char(1),char(152), +char(255),char(195),char(1),char(114),char(1),char(153),char(255),char(154),char(1),char(114), +char(1),char(154),char(255),char(195),char(1),char(114),char(1),char(155),char(255),char(195), +char(1),char(114),char(2),char(8),char(255),char(133),char(1),char(114),char(2),char(12), +char(255),char(133),char(1),char(114),char(2),char(33),char(255),char(236),char(1),char(115), +char(0),char(15),char(255),char(154),char(1),char(115),char(0),char(17),char(255),char(154), +char(1),char(115),char(1),char(86),char(255),char(215),char(1),char(115),char(1),char(95), +char(255),char(215),char(1),char(115),char(1),char(98),char(255),char(215),char(1),char(115), +char(1),char(100),char(255),char(195),char(1),char(115),char(1),char(105),char(255),char(215), +char(1),char(115),char(1),char(112),char(255),char(236),char(1),char(115),char(1),char(113), +char(255),char(174),char(1),char(115),char(1),char(114),char(255),char(195),char(1),char(115), +char(1),char(116),char(255),char(236),char(1),char(115),char(1),char(120),char(255),char(195), +char(1),char(115),char(1),char(136),char(255),char(236),char(1),char(115),char(2),char(8), +char(255),char(154),char(1),char(115),char(2),char(12),char(255),char(154),char(1),char(115), +char(2),char(84),char(255),char(195),char(1),char(116),char(1),char(102),char(255),char(215), +char(1),char(116),char(1),char(109),char(255),char(215),char(1),char(116),char(1),char(115), +char(255),char(195),char(1),char(116),char(1),char(141),char(255),char(236),char(1),char(116), +char(1),char(145),char(255),char(236),char(1),char(117),char(0),char(15),char(255),char(133), +char(1),char(117),char(0),char(17),char(255),char(133),char(1),char(117),char(1),char(86), +char(255),char(174),char(1),char(117),char(1),char(95),char(255),char(174),char(1),char(117), +char(1),char(98),char(255),char(174),char(1),char(117),char(1),char(102),char(255),char(236), +char(1),char(117),char(1),char(105),char(255),char(174),char(1),char(117),char(1),char(109), +char(255),char(236),char(1),char(117),char(2),char(8),char(255),char(133),char(1),char(117), +char(2),char(12),char(255),char(133),char(1),char(118),char(1),char(113),char(255),char(215), +char(1),char(118),char(1),char(114),char(255),char(236),char(1),char(118),char(1),char(120), +char(255),char(236),char(1),char(118),char(2),char(84),char(255),char(236),char(1),char(120), +char(0),char(15),char(255),char(133),char(1),char(120),char(0),char(17),char(255),char(133), +char(1),char(120),char(1),char(86),char(255),char(133),char(1),char(120),char(1),char(95), +char(255),char(133),char(1),char(120),char(1),char(98),char(255),char(133),char(1),char(120), +char(1),char(102),char(255),char(215),char(1),char(120),char(1),char(105),char(255),char(133), +char(1),char(120),char(1),char(109),char(255),char(215),char(1),char(120),char(1),char(115), +char(255),char(195),char(1),char(120),char(1),char(118),char(255),char(236),char(1),char(120), +char(1),char(121),char(255),char(154),char(1),char(120),char(1),char(122),char(255),char(174), +char(1),char(120),char(1),char(123),char(255),char(195),char(1),char(120),char(1),char(124), +char(255),char(195),char(1),char(120),char(1),char(125),char(255),char(195),char(1),char(120), +char(1),char(126),char(255),char(154),char(1),char(120),char(1),char(129),char(255),char(195), +char(1),char(120),char(1),char(130),char(255),char(174),char(1),char(120),char(1),char(132), +char(255),char(195),char(1),char(120),char(1),char(134),char(255),char(195),char(1),char(120), +char(1),char(135),char(255),char(195),char(1),char(120),char(1),char(137),char(255),char(195), +char(1),char(120),char(1),char(140),char(255),char(154),char(1),char(120),char(1),char(142), +char(255),char(154),char(1),char(120),char(1),char(143),char(255),char(154),char(1),char(120), +char(1),char(144),char(255),char(154),char(1),char(120),char(1),char(146),char(255),char(195), +char(1),char(120),char(1),char(147),char(255),char(154),char(1),char(120),char(1),char(149), +char(255),char(195),char(1),char(120),char(1),char(150),char(255),char(195),char(1),char(120), +char(1),char(152),char(255),char(195),char(1),char(120),char(1),char(153),char(255),char(154), +char(1),char(120),char(1),char(154),char(255),char(195),char(1),char(120),char(1),char(155), +char(255),char(195),char(1),char(120),char(2),char(8),char(255),char(133),char(1),char(120), +char(2),char(12),char(255),char(133),char(1),char(120),char(2),char(33),char(255),char(236), +char(1),char(121),char(1),char(136),char(0),char(41),char(1),char(123),char(0),char(5), +char(255),char(236),char(1),char(123),char(0),char(10),char(255),char(236),char(1),char(123), +char(2),char(7),char(255),char(236),char(1),char(123),char(2),char(11),char(255),char(236), +char(1),char(124),char(0),char(5),char(255),char(174),char(1),char(124),char(0),char(10), +char(255),char(174),char(1),char(124),char(1),char(141),char(255),char(236),char(1),char(124), +char(1),char(145),char(255),char(236),char(1),char(124),char(2),char(7),char(255),char(174), +char(1),char(124),char(2),char(11),char(255),char(174),char(1),char(126),char(1),char(136), +char(0),char(41),char(1),char(128),char(0),char(15),char(255),char(174),char(1),char(128), +char(0),char(17),char(255),char(174),char(1),char(128),char(1),char(136),char(255),char(236), +char(1),char(128),char(2),char(8),char(255),char(174),char(1),char(128),char(2),char(12), +char(255),char(174),char(1),char(131),char(0),char(16),char(255),char(154),char(1),char(131), +char(1),char(121),char(255),char(215),char(1),char(131),char(1),char(126),char(255),char(215), +char(1),char(131),char(1),char(129),char(255),char(215),char(1),char(131),char(1),char(140), +char(255),char(215),char(1),char(131),char(1),char(141),char(255),char(215),char(1),char(131), +char(1),char(143),char(255),char(215),char(1),char(131),char(1),char(144),char(255),char(215), +char(1),char(131),char(1),char(145),char(255),char(215),char(1),char(131),char(1),char(147), +char(255),char(215),char(1),char(131),char(1),char(153),char(255),char(215),char(1),char(131), +char(2),char(2),char(255),char(154),char(1),char(131),char(2),char(3),char(255),char(154), +char(1),char(131),char(2),char(4),char(255),char(154),char(1),char(132),char(0),char(5), +char(255),char(236),char(1),char(132),char(0),char(10),char(255),char(236),char(1),char(132), +char(2),char(7),char(255),char(236),char(1),char(132),char(2),char(11),char(255),char(236), +char(1),char(133),char(0),char(15),char(255),char(215),char(1),char(133),char(0),char(17), +char(255),char(215),char(1),char(133),char(2),char(8),char(255),char(215),char(1),char(133), +char(2),char(12),char(255),char(215),char(1),char(134),char(0),char(5),char(255),char(174), +char(1),char(134),char(0),char(10),char(255),char(174),char(1),char(134),char(1),char(141), +char(255),char(236),char(1),char(134),char(1),char(145),char(255),char(236),char(1),char(134), +char(2),char(7),char(255),char(174),char(1),char(134),char(2),char(11),char(255),char(174), +char(1),char(135),char(1),char(121),char(255),char(215),char(1),char(135),char(1),char(126), +char(255),char(215),char(1),char(135),char(1),char(140),char(255),char(215),char(1),char(135), +char(1),char(143),char(255),char(215),char(1),char(135),char(1),char(144),char(255),char(215), +char(1),char(135),char(1),char(147),char(255),char(215),char(1),char(135),char(1),char(153), +char(255),char(215),char(1),char(136),char(0),char(5),char(255),char(133),char(1),char(136), +char(0),char(10),char(255),char(133),char(1),char(136),char(1),char(121),char(255),char(236), +char(1),char(136),char(1),char(126),char(255),char(236),char(1),char(136),char(1),char(128), +char(255),char(215),char(1),char(136),char(1),char(138),char(255),char(215),char(1),char(136), +char(1),char(140),char(255),char(236),char(1),char(136),char(1),char(141),char(255),char(215), +char(1),char(136),char(1),char(143),char(255),char(236),char(1),char(136),char(1),char(144), +char(255),char(236),char(1),char(136),char(1),char(145),char(255),char(215),char(1),char(136), +char(1),char(147),char(255),char(236),char(1),char(136),char(1),char(153),char(255),char(236), +char(1),char(136),char(2),char(7),char(255),char(133),char(1),char(136),char(2),char(11), +char(255),char(133),char(1),char(138),char(0),char(15),char(255),char(174),char(1),char(138), +char(0),char(17),char(255),char(174),char(1),char(138),char(1),char(136),char(255),char(236), +char(1),char(138),char(2),char(8),char(255),char(174),char(1),char(138),char(2),char(12), +char(255),char(174),char(1),char(140),char(0),char(5),char(255),char(236),char(1),char(140), +char(0),char(10),char(255),char(236),char(1),char(140),char(1),char(128),char(255),char(215), +char(1),char(140),char(1),char(138),char(255),char(215),char(1),char(140),char(2),char(7), +char(255),char(236),char(1),char(140),char(2),char(11),char(255),char(236),char(1),char(142), +char(0),char(5),char(255),char(236),char(1),char(142),char(0),char(10),char(255),char(236), +char(1),char(142),char(1),char(128),char(255),char(215),char(1),char(142),char(1),char(138), +char(255),char(215),char(1),char(142),char(2),char(7),char(255),char(236),char(1),char(142), +char(2),char(11),char(255),char(236),char(1),char(144),char(0),char(15),char(255),char(236), +char(1),char(144),char(0),char(17),char(255),char(236),char(1),char(144),char(2),char(8), +char(255),char(236),char(1),char(144),char(2),char(12),char(255),char(236),char(1),char(147), +char(0),char(5),char(255),char(236),char(1),char(147),char(0),char(10),char(255),char(236), +char(1),char(147),char(1),char(128),char(255),char(215),char(1),char(147),char(1),char(138), +char(255),char(215),char(1),char(147),char(2),char(7),char(255),char(236),char(1),char(147), +char(2),char(11),char(255),char(236),char(1),char(148),char(0),char(15),char(255),char(195), +char(1),char(148),char(0),char(16),char(255),char(215),char(1),char(148),char(0),char(17), +char(255),char(195),char(1),char(148),char(1),char(121),char(255),char(215),char(1),char(148), +char(1),char(126),char(255),char(215),char(1),char(148),char(1),char(129),char(255),char(215), +char(1),char(148),char(1),char(140),char(255),char(215),char(1),char(148),char(1),char(143), +char(255),char(215),char(1),char(148),char(1),char(144),char(255),char(215),char(1),char(148), +char(1),char(147),char(255),char(215),char(1),char(148),char(1),char(153),char(255),char(215), +char(1),char(148),char(2),char(2),char(255),char(215),char(1),char(148),char(2),char(3), +char(255),char(215),char(1),char(148),char(2),char(4),char(255),char(215),char(1),char(148), +char(2),char(8),char(255),char(195),char(1),char(148),char(2),char(12),char(255),char(195), +char(1),char(151),char(0),char(5),char(255),char(215),char(1),char(151),char(0),char(10), +char(255),char(215),char(1),char(151),char(2),char(7),char(255),char(215),char(1),char(151), +char(2),char(11),char(255),char(215),char(1),char(153),char(0),char(5),char(255),char(236), +char(1),char(153),char(0),char(10),char(255),char(236),char(1),char(153),char(1),char(128), +char(255),char(215),char(1),char(153),char(1),char(138),char(255),char(215),char(1),char(153), +char(2),char(7),char(255),char(236),char(1),char(153),char(2),char(11),char(255),char(236), +char(1),char(157),char(0),char(5),char(255),char(174),char(1),char(157),char(0),char(10), +char(255),char(174),char(1),char(157),char(1),char(157),char(255),char(133),char(1),char(157), +char(1),char(166),char(255),char(133),char(1),char(157),char(1),char(168),char(255),char(215), +char(1),char(157),char(1),char(188),char(255),char(154),char(1),char(157),char(1),char(189), +char(255),char(215),char(1),char(157),char(1),char(193),char(255),char(154),char(1),char(157), +char(1),char(196),char(255),char(133),char(1),char(157),char(1),char(220),char(255),char(215), +char(1),char(157),char(1),char(221),char(255),char(215),char(1),char(157),char(1),char(225), +char(255),char(215),char(1),char(157),char(1),char(228),char(255),char(215),char(1),char(157), +char(1),char(246),char(255),char(215),char(1),char(157),char(2),char(7),char(255),char(174), +char(1),char(157),char(2),char(11),char(255),char(174),char(1),char(157),char(2),char(110), +char(255),char(174),char(1),char(157),char(2),char(124),char(255),char(154),char(1),char(157), +char(2),char(128),char(255),char(174),char(1),char(157),char(2),char(130),char(255),char(174), +char(1),char(157),char(2),char(151),char(255),char(174),char(1),char(157),char(2),char(155), +char(255),char(174),char(1),char(157),char(2),char(167),char(255),char(174),char(1),char(157), +char(2),char(169),char(255),char(133),char(1),char(157),char(2),char(170),char(255),char(215), +char(1),char(157),char(2),char(181),char(255),char(154),char(1),char(157),char(2),char(182), +char(255),char(215),char(1),char(157),char(2),char(183),char(255),char(154),char(1),char(157), +char(2),char(184),char(255),char(215),char(1),char(157),char(2),char(185),char(255),char(154), +char(1),char(157),char(2),char(186),char(255),char(215),char(1),char(157),char(2),char(189), +char(255),char(133),char(1),char(157),char(2),char(190),char(255),char(215),char(1),char(157), +char(2),char(191),char(255),char(154),char(1),char(157),char(2),char(192),char(255),char(215), +char(1),char(157),char(2),char(193),char(255),char(154),char(1),char(157),char(2),char(194), +char(255),char(215),char(1),char(157),char(2),char(212),char(255),char(154),char(1),char(157), +char(2),char(213),char(255),char(215),char(1),char(157),char(2),char(247),char(255),char(215), +char(1),char(157),char(2),char(248),char(255),char(215),char(1),char(157),char(2),char(249), +char(255),char(215),char(1),char(157),char(2),char(250),char(255),char(215),char(1),char(157), +char(2),char(251),char(255),char(215),char(1),char(157),char(2),char(252),char(255),char(215), +char(1),char(157),char(2),char(253),char(255),char(154),char(1),char(157),char(2),char(254), +char(255),char(215),char(1),char(157),char(3),char(3),char(255),char(174),char(1),char(157), +char(3),char(13),char(255),char(154),char(1),char(157),char(3),char(14),char(255),char(195), +char(1),char(157),char(3),char(15),char(255),char(154),char(1),char(157),char(3),char(16), +char(255),char(195),char(1),char(157),char(3),char(23),char(255),char(133),char(1),char(157), +char(3),char(24),char(255),char(215),char(1),char(158),char(0),char(15),char(255),char(133), +char(1),char(158),char(0),char(16),char(255),char(174),char(1),char(158),char(0),char(17), +char(255),char(133),char(1),char(158),char(1),char(159),char(255),char(215),char(1),char(158), +char(1),char(164),char(255),char(154),char(1),char(158),char(1),char(170),char(255),char(113), +char(1),char(158),char(1),char(174),char(255),char(154),char(1),char(158),char(1),char(181), +char(255),char(154),char(1),char(158),char(1),char(184),char(255),char(215),char(1),char(158), +char(1),char(187),char(255),char(215),char(1),char(158),char(1),char(188),char(0),char(41), +char(1),char(158),char(1),char(190),char(255),char(174),char(1),char(158),char(1),char(204), +char(255),char(154),char(1),char(158),char(1),char(205),char(255),char(154),char(1),char(158), +char(1),char(206),char(255),char(133),char(1),char(158),char(1),char(207),char(255),char(113), +char(1),char(158),char(1),char(208),char(255),char(215),char(1),char(158),char(1),char(209), +char(255),char(215),char(1),char(158),char(1),char(210),char(255),char(154),char(1),char(158), +char(1),char(211),char(255),char(154),char(1),char(158),char(1),char(212),char(255),char(154), +char(1),char(158),char(1),char(213),char(255),char(133),char(1),char(158),char(1),char(214), +char(255),char(154),char(1),char(158),char(1),char(215),char(255),char(154),char(1),char(158), +char(1),char(216),char(255),char(113),char(1),char(158),char(1),char(217),char(255),char(154), +char(1),char(158),char(1),char(218),char(255),char(154),char(1),char(158),char(1),char(219), +char(255),char(113),char(1),char(158),char(1),char(220),char(255),char(174),char(1),char(158), +char(1),char(221),char(255),char(174),char(1),char(158),char(1),char(222),char(255),char(113), +char(1),char(158),char(1),char(223),char(255),char(215),char(1),char(158),char(1),char(224), +char(255),char(154),char(1),char(158),char(1),char(225),char(255),char(154),char(1),char(158), +char(1),char(226),char(255),char(154),char(1),char(158),char(1),char(227),char(255),char(154), +char(1),char(158),char(1),char(228),char(255),char(174),char(1),char(158),char(1),char(229), +char(255),char(154),char(1),char(158),char(1),char(230),char(255),char(154),char(1),char(158), +char(1),char(231),char(255),char(215),char(1),char(158),char(1),char(232),char(255),char(154), +char(1),char(158),char(1),char(233),char(255),char(195),char(1),char(158),char(1),char(234), +char(255),char(113),char(1),char(158),char(1),char(236),char(255),char(154),char(1),char(158), +char(1),char(237),char(255),char(113),char(1),char(158),char(1),char(238),char(255),char(133), +char(1),char(158),char(1),char(242),char(255),char(133),char(1),char(158),char(1),char(243), +char(255),char(154),char(1),char(158),char(1),char(245),char(255),char(154),char(1),char(158), +char(1),char(246),char(255),char(174),char(1),char(158),char(1),char(247),char(255),char(154), +char(1),char(158),char(1),char(249),char(255),char(154),char(1),char(158),char(2),char(2), +char(255),char(174),char(1),char(158),char(2),char(3),char(255),char(174),char(1),char(158), +char(2),char(4),char(255),char(174),char(1),char(158),char(2),char(8),char(255),char(133), +char(1),char(158),char(2),char(12),char(255),char(133),char(1),char(158),char(2),char(106), +char(255),char(113),char(1),char(158),char(2),char(107),char(255),char(154),char(1),char(158), +char(2),char(108),char(255),char(215),char(1),char(158),char(2),char(109),char(255),char(215), +char(1),char(158),char(2),char(113),char(255),char(154),char(1),char(158),char(2),char(114), +char(255),char(113),char(1),char(158),char(2),char(115),char(255),char(133),char(1),char(158), +char(2),char(117),char(255),char(154),char(1),char(158),char(2),char(119),char(255),char(154), +char(1),char(158),char(2),char(121),char(255),char(154),char(1),char(158),char(2),char(125), +char(255),char(154),char(1),char(158),char(2),char(126),char(255),char(215),char(1),char(158), +char(2),char(127),char(255),char(113),char(1),char(158),char(2),char(129),char(255),char(215), +char(1),char(158),char(2),char(131),char(255),char(215),char(1),char(158),char(2),char(132), +char(255),char(215),char(1),char(158),char(2),char(133),char(255),char(113),char(1),char(158), +char(2),char(134),char(255),char(215),char(1),char(158),char(2),char(135),char(255),char(113), +char(1),char(158),char(2),char(136),char(255),char(215),char(1),char(158),char(2),char(137), +char(255),char(113),char(1),char(158),char(2),char(138),char(255),char(215),char(1),char(158), +char(2),char(139),char(255),char(215),char(1),char(158),char(2),char(140),char(255),char(215), +char(1),char(158),char(2),char(141),char(255),char(113),char(1),char(158),char(2),char(150), +char(255),char(154),char(1),char(158),char(2),char(154),char(255),char(154),char(1),char(158), +char(2),char(158),char(255),char(154),char(1),char(158),char(2),char(160),char(255),char(215), +char(1),char(158),char(2),char(162),char(255),char(215),char(1),char(158),char(2),char(164), +char(255),char(154),char(1),char(158),char(2),char(166),char(255),char(154),char(1),char(158), +char(2),char(170),char(255),char(174),char(1),char(158),char(2),char(172),char(255),char(154), +char(1),char(158),char(2),char(174),char(255),char(154),char(1),char(158),char(2),char(176), +char(255),char(154),char(1),char(158),char(2),char(177),char(255),char(215),char(1),char(158), +char(2),char(178),char(255),char(113),char(1),char(158),char(2),char(179),char(255),char(215), +char(1),char(158),char(2),char(180),char(255),char(113),char(1),char(158),char(2),char(181), +char(0),char(41),char(1),char(158),char(2),char(182),char(255),char(174),char(1),char(158), +char(2),char(184),char(255),char(174),char(1),char(158),char(2),char(186),char(255),char(174), +char(1),char(158),char(2),char(188),char(255),char(215),char(1),char(158),char(2),char(190), +char(255),char(174),char(1),char(158),char(2),char(192),char(255),char(154),char(1),char(158), +char(2),char(194),char(255),char(154),char(1),char(158),char(2),char(196),char(255),char(154), +char(1),char(158),char(2),char(197),char(255),char(154),char(1),char(158),char(2),char(198), +char(255),char(113),char(1),char(158),char(2),char(199),char(255),char(154),char(1),char(158), +char(2),char(200),char(255),char(113),char(1),char(158),char(2),char(203),char(255),char(215), +char(1),char(158),char(2),char(205),char(255),char(154),char(1),char(158),char(2),char(206), +char(255),char(154),char(1),char(158),char(2),char(207),char(255),char(133),char(1),char(158), +char(2),char(209),char(255),char(154),char(1),char(158),char(2),char(211),char(255),char(154), +char(1),char(158),char(2),char(213),char(255),char(154),char(1),char(158),char(2),char(215), +char(255),char(154),char(1),char(158),char(2),char(217),char(255),char(113),char(1),char(158), +char(2),char(219),char(255),char(113),char(1),char(158),char(2),char(221),char(255),char(113), +char(1),char(158),char(2),char(224),char(255),char(113),char(1),char(158),char(2),char(230), +char(255),char(215),char(1),char(158),char(2),char(232),char(255),char(215),char(1),char(158), +char(2),char(234),char(255),char(195),char(1),char(158),char(2),char(236),char(255),char(154), +char(1),char(158),char(2),char(238),char(255),char(154),char(1),char(158),char(2),char(239), +char(255),char(215),char(1),char(158),char(2),char(240),char(255),char(113),char(1),char(158), +char(2),char(241),char(255),char(215),char(1),char(158),char(2),char(242),char(255),char(113), +char(1),char(158),char(2),char(243),char(255),char(215),char(1),char(158),char(2),char(244), +char(255),char(113),char(1),char(158),char(2),char(246),char(255),char(215),char(1),char(158), +char(2),char(248),char(255),char(174),char(1),char(158),char(2),char(250),char(255),char(174), +char(1),char(158),char(2),char(252),char(255),char(174),char(1),char(158),char(2),char(254), +char(255),char(154),char(1),char(158),char(3),char(0),char(255),char(154),char(1),char(158), +char(3),char(2),char(255),char(154),char(1),char(158),char(3),char(6),char(255),char(215), +char(1),char(158),char(3),char(8),char(255),char(215),char(1),char(158),char(3),char(9), +char(255),char(113),char(1),char(158),char(3),char(10),char(255),char(113),char(1),char(158), +char(3),char(11),char(255),char(113),char(1),char(158),char(3),char(12),char(255),char(113), +char(1),char(158),char(3),char(14),char(255),char(154),char(1),char(158),char(3),char(16), +char(255),char(154),char(1),char(158),char(3),char(17),char(255),char(154),char(1),char(158), +char(3),char(18),char(255),char(133),char(1),char(158),char(3),char(20),char(255),char(154), +char(1),char(158),char(3),char(21),char(255),char(215),char(1),char(158),char(3),char(22), +char(255),char(113),char(1),char(158),char(3),char(24),char(255),char(174),char(1),char(158), +char(3),char(26),char(255),char(113),char(1),char(158),char(3),char(27),char(255),char(154), +char(1),char(158),char(3),char(28),char(255),char(133),char(1),char(159),char(1),char(159), +char(255),char(215),char(1),char(159),char(1),char(184),char(255),char(215),char(1),char(159), +char(1),char(187),char(255),char(215),char(1),char(159),char(1),char(190),char(255),char(215), +char(1),char(159),char(1),char(225),char(255),char(215),char(1),char(159),char(2),char(108), +char(255),char(215),char(1),char(159),char(2),char(126),char(255),char(215),char(1),char(159), +char(2),char(132),char(255),char(215),char(1),char(159),char(2),char(134),char(255),char(215), +char(1),char(159),char(2),char(136),char(255),char(215),char(1),char(159),char(2),char(138), +char(255),char(215),char(1),char(159),char(2),char(140),char(255),char(215),char(1),char(159), +char(2),char(177),char(255),char(215),char(1),char(159),char(2),char(179),char(255),char(215), +char(1),char(159),char(2),char(192),char(255),char(215),char(1),char(159),char(2),char(194), +char(255),char(215),char(1),char(159),char(2),char(197),char(255),char(215),char(1),char(159), +char(2),char(199),char(255),char(215),char(1),char(159),char(2),char(213),char(255),char(215), +char(1),char(159),char(2),char(239),char(255),char(215),char(1),char(159),char(2),char(241), +char(255),char(215),char(1),char(159),char(2),char(243),char(255),char(215),char(1),char(159), +char(2),char(254),char(255),char(215),char(1),char(159),char(3),char(9),char(255),char(215), +char(1),char(159),char(3),char(11),char(255),char(215),char(1),char(159),char(3),char(14), +char(255),char(215),char(1),char(159),char(3),char(16),char(255),char(215),char(1),char(159), +char(3),char(21),char(255),char(215),char(1),char(160),char(3),char(14),char(255),char(215), +char(1),char(160),char(3),char(16),char(255),char(215),char(1),char(164),char(0),char(5), +char(255),char(174),char(1),char(164),char(0),char(10),char(255),char(174),char(1),char(164), +char(1),char(157),char(255),char(133),char(1),char(164),char(1),char(166),char(255),char(133), +char(1),char(164),char(1),char(168),char(255),char(215),char(1),char(164),char(1),char(188), +char(255),char(154),char(1),char(164),char(1),char(189),char(255),char(215),char(1),char(164), +char(1),char(193),char(255),char(154),char(1),char(164),char(1),char(196),char(255),char(133), +char(1),char(164),char(1),char(220),char(255),char(215),char(1),char(164),char(1),char(221), +char(255),char(215),char(1),char(164),char(1),char(225),char(255),char(215),char(1),char(164), +char(1),char(228),char(255),char(215),char(1),char(164),char(1),char(246),char(255),char(215), +char(1),char(164),char(2),char(7),char(255),char(174),char(1),char(164),char(2),char(11), +char(255),char(174),char(1),char(164),char(2),char(110),char(255),char(174),char(1),char(164), +char(2),char(124),char(255),char(154),char(1),char(164),char(2),char(128),char(255),char(174), +char(1),char(164),char(2),char(130),char(255),char(174),char(1),char(164),char(2),char(151), +char(255),char(174),char(1),char(164),char(2),char(155),char(255),char(174),char(1),char(164), +char(2),char(167),char(255),char(174),char(1),char(164),char(2),char(169),char(255),char(133), +char(1),char(164),char(2),char(170),char(255),char(215),char(1),char(164),char(2),char(181), +char(255),char(154),char(1),char(164),char(2),char(182),char(255),char(215),char(1),char(164), +char(2),char(183),char(255),char(154),char(1),char(164),char(2),char(184),char(255),char(215), +char(1),char(164),char(2),char(185),char(255),char(154),char(1),char(164),char(2),char(186), +char(255),char(215),char(1),char(164),char(2),char(189),char(255),char(133),char(1),char(164), +char(2),char(190),char(255),char(215),char(1),char(164),char(2),char(191),char(255),char(154), +char(1),char(164),char(2),char(192),char(255),char(215),char(1),char(164),char(2),char(193), +char(255),char(154),char(1),char(164),char(2),char(194),char(255),char(215),char(1),char(164), +char(2),char(212),char(255),char(154),char(1),char(164),char(2),char(213),char(255),char(215), +char(1),char(164),char(2),char(247),char(255),char(215),char(1),char(164),char(2),char(248), +char(255),char(215),char(1),char(164),char(2),char(249),char(255),char(215),char(1),char(164), +char(2),char(250),char(255),char(215),char(1),char(164),char(2),char(251),char(255),char(215), +char(1),char(164),char(2),char(252),char(255),char(215),char(1),char(164),char(2),char(253), +char(255),char(154),char(1),char(164),char(2),char(254),char(255),char(215),char(1),char(164), +char(3),char(3),char(255),char(174),char(1),char(164),char(3),char(13),char(255),char(154), +char(1),char(164),char(3),char(14),char(255),char(195),char(1),char(164),char(3),char(15), +char(255),char(154),char(1),char(164),char(3),char(16),char(255),char(195),char(1),char(164), +char(3),char(23),char(255),char(133),char(1),char(164),char(3),char(24),char(255),char(215), +char(1),char(165),char(0),char(5),char(255),char(174),char(1),char(165),char(0),char(10), +char(255),char(174),char(1),char(165),char(1),char(157),char(255),char(133),char(1),char(165), +char(1),char(166),char(255),char(133),char(1),char(165),char(1),char(168),char(255),char(215), +char(1),char(165),char(1),char(188),char(255),char(154),char(1),char(165),char(1),char(189), +char(255),char(215),char(1),char(165),char(1),char(193),char(255),char(154),char(1),char(165), +char(1),char(196),char(255),char(133),char(1),char(165),char(1),char(220),char(255),char(215), +char(1),char(165),char(1),char(221),char(255),char(215),char(1),char(165),char(1),char(225), +char(255),char(215),char(1),char(165),char(1),char(228),char(255),char(215),char(1),char(165), +char(1),char(246),char(255),char(215),char(1),char(165),char(2),char(7),char(255),char(174), +char(1),char(165),char(2),char(11),char(255),char(174),char(1),char(165),char(2),char(110), +char(255),char(174),char(1),char(165),char(2),char(124),char(255),char(154),char(1),char(165), +char(2),char(128),char(255),char(174),char(1),char(165),char(2),char(130),char(255),char(174), +char(1),char(165),char(2),char(151),char(255),char(174),char(1),char(165),char(2),char(155), +char(255),char(174),char(1),char(165),char(2),char(167),char(255),char(174),char(1),char(165), +char(2),char(169),char(255),char(133),char(1),char(165),char(2),char(170),char(255),char(215), +char(1),char(165),char(2),char(181),char(255),char(154),char(1),char(165),char(2),char(182), +char(255),char(215),char(1),char(165),char(2),char(183),char(255),char(154),char(1),char(165), +char(2),char(184),char(255),char(215),char(1),char(165),char(2),char(185),char(255),char(154), +char(1),char(165),char(2),char(186),char(255),char(215),char(1),char(165),char(2),char(189), +char(255),char(133),char(1),char(165),char(2),char(190),char(255),char(215),char(1),char(165), +char(2),char(191),char(255),char(154),char(1),char(165),char(2),char(192),char(255),char(215), +char(1),char(165),char(2),char(193),char(255),char(154),char(1),char(165),char(2),char(194), +char(255),char(215),char(1),char(165),char(2),char(212),char(255),char(154),char(1),char(165), +char(2),char(213),char(255),char(215),char(1),char(165),char(2),char(247),char(255),char(215), +char(1),char(165),char(2),char(248),char(255),char(215),char(1),char(165),char(2),char(249), +char(255),char(215),char(1),char(165),char(2),char(250),char(255),char(215),char(1),char(165), +char(2),char(251),char(255),char(215),char(1),char(165),char(2),char(252),char(255),char(215), +char(1),char(165),char(2),char(253),char(255),char(154),char(1),char(165),char(2),char(254), +char(255),char(215),char(1),char(165),char(3),char(3),char(255),char(174),char(1),char(165), +char(3),char(13),char(255),char(154),char(1),char(165),char(3),char(14),char(255),char(195), +char(1),char(165),char(3),char(15),char(255),char(154),char(1),char(165),char(3),char(16), +char(255),char(195),char(1),char(165),char(3),char(23),char(255),char(133),char(1),char(165), +char(3),char(24),char(255),char(215),char(1),char(166),char(0),char(5),char(255),char(174), +char(1),char(166),char(0),char(10),char(255),char(174),char(1),char(166),char(1),char(157), +char(255),char(133),char(1),char(166),char(1),char(166),char(255),char(133),char(1),char(166), +char(1),char(168),char(255),char(215),char(1),char(166),char(1),char(188),char(255),char(154), +char(1),char(166),char(1),char(189),char(255),char(215),char(1),char(166),char(1),char(193), +char(255),char(154),char(1),char(166),char(1),char(196),char(255),char(133),char(1),char(166), +char(1),char(220),char(255),char(215),char(1),char(166),char(1),char(221),char(255),char(215), +char(1),char(166),char(1),char(225),char(255),char(215),char(1),char(166),char(1),char(228), +char(255),char(215),char(1),char(166),char(1),char(246),char(255),char(215),char(1),char(166), +char(2),char(7),char(255),char(174),char(1),char(166),char(2),char(11),char(255),char(174), +char(1),char(166),char(2),char(110),char(255),char(174),char(1),char(166),char(2),char(124), +char(255),char(154),char(1),char(166),char(2),char(128),char(255),char(174),char(1),char(166), +char(2),char(130),char(255),char(174),char(1),char(166),char(2),char(151),char(255),char(174), +char(1),char(166),char(2),char(155),char(255),char(174),char(1),char(166),char(2),char(167), +char(255),char(174),char(1),char(166),char(2),char(169),char(255),char(133),char(1),char(166), +char(2),char(170),char(255),char(215),char(1),char(166),char(2),char(181),char(255),char(154), +char(1),char(166),char(2),char(182),char(255),char(215),char(1),char(166),char(2),char(183), +char(255),char(154),char(1),char(166),char(2),char(184),char(255),char(215),char(1),char(166), +char(2),char(185),char(255),char(154),char(1),char(166),char(2),char(186),char(255),char(215), +char(1),char(166),char(2),char(189),char(255),char(133),char(1),char(166),char(2),char(190), +char(255),char(215),char(1),char(166),char(2),char(191),char(255),char(154),char(1),char(166), +char(2),char(192),char(255),char(215),char(1),char(166),char(2),char(193),char(255),char(154), +char(1),char(166),char(2),char(194),char(255),char(215),char(1),char(166),char(2),char(212), +char(255),char(154),char(1),char(166),char(2),char(213),char(255),char(215),char(1),char(166), +char(2),char(247),char(255),char(215),char(1),char(166),char(2),char(248),char(255),char(215), +char(1),char(166),char(2),char(249),char(255),char(215),char(1),char(166),char(2),char(250), +char(255),char(215),char(1),char(166),char(2),char(251),char(255),char(215),char(1),char(166), +char(2),char(252),char(255),char(215),char(1),char(166),char(2),char(253),char(255),char(154), +char(1),char(166),char(2),char(254),char(255),char(215),char(1),char(166),char(3),char(3), +char(255),char(174),char(1),char(166),char(3),char(13),char(255),char(154),char(1),char(166), +char(3),char(14),char(255),char(195),char(1),char(166),char(3),char(15),char(255),char(154), +char(1),char(166),char(3),char(16),char(255),char(195),char(1),char(166),char(3),char(23), +char(255),char(133),char(1),char(166),char(3),char(24),char(255),char(215),char(1),char(167), +char(1),char(159),char(255),char(215),char(1),char(167),char(1),char(184),char(255),char(215), +char(1),char(167),char(1),char(187),char(255),char(215),char(1),char(167),char(1),char(190), +char(255),char(215),char(1),char(167),char(1),char(193),char(255),char(215),char(1),char(167), +char(1),char(225),char(255),char(215),char(1),char(167),char(2),char(108),char(255),char(215), +char(1),char(167),char(2),char(124),char(255),char(215),char(1),char(167),char(2),char(126), +char(255),char(215),char(1),char(167),char(2),char(132),char(255),char(215),char(1),char(167), +char(2),char(134),char(255),char(215),char(1),char(167),char(2),char(136),char(255),char(215), +char(1),char(167),char(2),char(138),char(255),char(215),char(1),char(167),char(2),char(140), +char(255),char(215),char(1),char(167),char(2),char(177),char(255),char(215),char(1),char(167), +char(2),char(179),char(255),char(215),char(1),char(167),char(2),char(191),char(255),char(215), +char(1),char(167),char(2),char(192),char(255),char(215),char(1),char(167),char(2),char(193), +char(255),char(215),char(1),char(167),char(2),char(194),char(255),char(215),char(1),char(167), +char(2),char(197),char(255),char(154),char(1),char(167),char(2),char(199),char(255),char(154), +char(1),char(167),char(2),char(212),char(255),char(215),char(1),char(167),char(2),char(213), +char(255),char(215),char(1),char(167),char(2),char(239),char(255),char(215),char(1),char(167), +char(2),char(241),char(255),char(215),char(1),char(167),char(2),char(243),char(255),char(215), +char(1),char(167),char(2),char(253),char(255),char(215),char(1),char(167),char(2),char(254), +char(255),char(215),char(1),char(167),char(3),char(9),char(255),char(215),char(1),char(167), +char(3),char(11),char(255),char(215),char(1),char(167),char(3),char(14),char(255),char(215), +char(1),char(167),char(3),char(16),char(255),char(215),char(1),char(167),char(3),char(21), +char(255),char(215),char(1),char(167),char(3),char(25),char(255),char(236),char(1),char(168), +char(0),char(15),char(255),char(133),char(1),char(168),char(0),char(17),char(255),char(133), +char(1),char(168),char(1),char(159),char(255),char(236),char(1),char(168),char(1),char(164), +char(255),char(154),char(1),char(168),char(1),char(170),char(255),char(113),char(1),char(168), +char(1),char(174),char(255),char(154),char(1),char(168),char(1),char(181),char(255),char(154), +char(1),char(168),char(1),char(184),char(255),char(236),char(1),char(168),char(1),char(187), +char(255),char(236),char(1),char(168),char(1),char(190),char(255),char(195),char(1),char(168), +char(1),char(201),char(255),char(236),char(1),char(168),char(1),char(206),char(255),char(174), +char(1),char(168),char(1),char(207),char(255),char(215),char(1),char(168),char(1),char(213), +char(255),char(174),char(1),char(168),char(1),char(216),char(255),char(215),char(1),char(168), +char(1),char(219),char(255),char(215),char(1),char(168),char(1),char(222),char(255),char(215), +char(1),char(168),char(1),char(225),char(255),char(215),char(1),char(168),char(1),char(234), +char(255),char(215),char(1),char(168),char(1),char(235),char(0),char(102),char(1),char(168), +char(1),char(237),char(255),char(215),char(1),char(168),char(1),char(238),char(255),char(236), +char(1),char(168),char(1),char(242),char(255),char(174),char(1),char(168),char(1),char(244), +char(0),char(102),char(1),char(168),char(2),char(8),char(255),char(133),char(1),char(168), +char(2),char(12),char(255),char(133),char(1),char(168),char(2),char(106),char(255),char(215), +char(1),char(168),char(2),char(108),char(255),char(236),char(1),char(168),char(2),char(114), +char(255),char(113),char(1),char(168),char(2),char(115),char(255),char(174),char(1),char(168), +char(2),char(126),char(255),char(236),char(1),char(168),char(2),char(127),char(255),char(215), +char(1),char(168),char(2),char(132),char(255),char(236),char(1),char(168),char(2),char(133), +char(255),char(215),char(1),char(168),char(2),char(134),char(255),char(236),char(1),char(168), +char(2),char(135),char(255),char(215),char(1),char(168),char(2),char(136),char(255),char(236), +char(1),char(168),char(2),char(137),char(255),char(215),char(1),char(168),char(2),char(138), +char(255),char(236),char(1),char(168),char(2),char(140),char(255),char(236),char(1),char(168), +char(2),char(141),char(255),char(215),char(1),char(168),char(2),char(152),char(0),char(102), +char(1),char(168),char(2),char(168),char(0),char(102),char(1),char(168),char(2),char(177), +char(255),char(236),char(1),char(168),char(2),char(178),char(255),char(215),char(1),char(168), +char(2),char(179),char(255),char(236),char(1),char(168),char(2),char(180),char(255),char(215), +char(1),char(168),char(2),char(192),char(255),char(215),char(1),char(168),char(2),char(194), +char(255),char(215),char(1),char(168),char(2),char(197),char(255),char(215),char(1),char(168), +char(2),char(198),char(255),char(195),char(1),char(168),char(2),char(199),char(255),char(215), +char(1),char(168),char(2),char(200),char(255),char(195),char(1),char(168),char(2),char(206), +char(255),char(154),char(1),char(168),char(2),char(207),char(255),char(174),char(1),char(168), +char(2),char(213),char(255),char(215),char(1),char(168),char(2),char(217),char(255),char(113), +char(1),char(168),char(2),char(219),char(255),char(113),char(1),char(168),char(2),char(221), +char(255),char(113),char(1),char(168),char(2),char(224),char(255),char(215),char(1),char(168), +char(2),char(239),char(255),char(236),char(1),char(168),char(2),char(240),char(255),char(215), +char(1),char(168),char(2),char(241),char(255),char(236),char(1),char(168),char(2),char(242), +char(255),char(215),char(1),char(168),char(2),char(243),char(255),char(236),char(1),char(168), +char(2),char(244),char(255),char(215),char(1),char(168),char(2),char(254),char(255),char(215), +char(1),char(168),char(3),char(9),char(255),char(113),char(1),char(168),char(3),char(10), +char(255),char(215),char(1),char(168),char(3),char(11),char(255),char(113),char(1),char(168), +char(3),char(12),char(255),char(215),char(1),char(168),char(3),char(17),char(255),char(154), +char(1),char(168),char(3),char(18),char(255),char(174),char(1),char(168),char(3),char(21), +char(255),char(236),char(1),char(168),char(3),char(22),char(255),char(215),char(1),char(168), +char(3),char(26),char(255),char(215),char(1),char(168),char(3),char(27),char(255),char(154), +char(1),char(168),char(3),char(28),char(255),char(174),char(1),char(170),char(0),char(5), +char(255),char(113),char(1),char(170),char(0),char(10),char(255),char(113),char(1),char(170), +char(1),char(157),char(255),char(154),char(1),char(170),char(1),char(166),char(255),char(154), +char(1),char(170),char(1),char(188),char(255),char(113),char(1),char(170),char(1),char(190), +char(255),char(215),char(1),char(170),char(1),char(193),char(255),char(154),char(1),char(170), +char(1),char(196),char(255),char(154),char(1),char(170),char(1),char(220),char(255),char(215), +char(1),char(170),char(1),char(225),char(255),char(215),char(1),char(170),char(1),char(228), +char(255),char(215),char(1),char(170),char(2),char(7),char(255),char(113),char(1),char(170), +char(2),char(11),char(255),char(113),char(1),char(170),char(2),char(110),char(255),char(215), +char(1),char(170),char(2),char(124),char(255),char(154),char(1),char(170),char(2),char(128), +char(255),char(174),char(1),char(170),char(2),char(130),char(255),char(174),char(1),char(170), +char(2),char(151),char(255),char(215),char(1),char(170),char(2),char(155),char(255),char(215), +char(1),char(170),char(2),char(167),char(255),char(215),char(1),char(170),char(2),char(169), +char(255),char(154),char(1),char(170),char(2),char(170),char(255),char(215),char(1),char(170), +char(2),char(181),char(255),char(113),char(1),char(170),char(2),char(182),char(255),char(215), +char(1),char(170),char(2),char(183),char(255),char(133),char(1),char(170),char(2),char(185), +char(255),char(133),char(1),char(170),char(2),char(189),char(255),char(154),char(1),char(170), +char(2),char(190),char(255),char(215),char(1),char(170),char(2),char(191),char(255),char(154), +char(1),char(170),char(2),char(192),char(255),char(215),char(1),char(170),char(2),char(193), +char(255),char(154),char(1),char(170),char(2),char(194),char(255),char(215),char(1),char(170), +char(2),char(197),char(255),char(154),char(1),char(170),char(2),char(199),char(255),char(154), +char(1),char(170),char(2),char(212),char(255),char(154),char(1),char(170),char(2),char(213), +char(255),char(215),char(1),char(170),char(2),char(225),char(255),char(215),char(1),char(170), +char(2),char(227),char(255),char(215),char(1),char(170),char(2),char(253),char(255),char(154), +char(1),char(170),char(2),char(254),char(255),char(215),char(1),char(170),char(3),char(3), +char(255),char(215),char(1),char(170),char(3),char(13),char(255),char(113),char(1),char(170), +char(3),char(14),char(255),char(215),char(1),char(170),char(3),char(15),char(255),char(113), +char(1),char(170),char(3),char(16),char(255),char(215),char(1),char(170),char(3),char(23), +char(255),char(154),char(1),char(170),char(3),char(24),char(255),char(215),char(1),char(171), +char(0),char(5),char(255),char(215),char(1),char(171),char(0),char(10),char(255),char(215), +char(1),char(171),char(1),char(170),char(255),char(236),char(1),char(171),char(1),char(193), +char(255),char(215),char(1),char(171),char(2),char(7),char(255),char(215),char(1),char(171), +char(2),char(11),char(255),char(215),char(1),char(171),char(2),char(114),char(255),char(236), +char(1),char(171),char(2),char(124),char(255),char(215),char(1),char(171),char(2),char(191), +char(255),char(215),char(1),char(171),char(2),char(193),char(255),char(215),char(1),char(171), +char(2),char(197),char(255),char(215),char(1),char(171),char(2),char(199),char(255),char(215), +char(1),char(171),char(2),char(212),char(255),char(215),char(1),char(171),char(2),char(217), +char(255),char(236),char(1),char(171),char(2),char(219),char(255),char(236),char(1),char(171), +char(2),char(221),char(255),char(236),char(1),char(171),char(2),char(253),char(255),char(215), +char(1),char(172),char(0),char(15),char(255),char(174),char(1),char(172),char(0),char(17), +char(255),char(174),char(1),char(172),char(2),char(8),char(255),char(174),char(1),char(172), +char(2),char(12),char(255),char(174),char(1),char(172),char(2),char(128),char(255),char(236), +char(1),char(172),char(2),char(130),char(255),char(236),char(1),char(172),char(2),char(183), +char(255),char(236),char(1),char(172),char(2),char(185),char(255),char(236),char(1),char(172), +char(3),char(13),char(255),char(215),char(1),char(172),char(3),char(15),char(255),char(215), +char(1),char(173),char(0),char(15),char(255),char(133),char(1),char(173),char(0),char(16), +char(255),char(174),char(1),char(173),char(0),char(17),char(255),char(133),char(1),char(173), +char(1),char(159),char(255),char(215),char(1),char(173),char(1),char(164),char(255),char(154), +char(1),char(173),char(1),char(170),char(255),char(113),char(1),char(173),char(1),char(174), +char(255),char(154),char(1),char(173),char(1),char(181),char(255),char(154),char(1),char(173), +char(1),char(184),char(255),char(215),char(1),char(173),char(1),char(187),char(255),char(215), +char(1),char(173),char(1),char(188),char(0),char(41),char(1),char(173),char(1),char(190), +char(255),char(174),char(1),char(173),char(1),char(204),char(255),char(154),char(1),char(173), +char(1),char(205),char(255),char(154),char(1),char(173),char(1),char(206),char(255),char(133), +char(1),char(173),char(1),char(207),char(255),char(113),char(1),char(173),char(1),char(208), +char(255),char(215),char(1),char(173),char(1),char(209),char(255),char(215),char(1),char(173), +char(1),char(210),char(255),char(154),char(1),char(173),char(1),char(211),char(255),char(154), +char(1),char(173),char(1),char(212),char(255),char(154),char(1),char(173),char(1),char(213), +char(255),char(133),char(1),char(173),char(1),char(214),char(255),char(154),char(1),char(173), +char(1),char(215),char(255),char(154),char(1),char(173),char(1),char(216),char(255),char(113), +char(1),char(173),char(1),char(217),char(255),char(154),char(1),char(173),char(1),char(218), +char(255),char(154),char(1),char(173),char(1),char(219),char(255),char(113),char(1),char(173), +char(1),char(220),char(255),char(174),char(1),char(173),char(1),char(221),char(255),char(174), +char(1),char(173),char(1),char(222),char(255),char(113),char(1),char(173),char(1),char(223), +char(255),char(215),char(1),char(173),char(1),char(224),char(255),char(154),char(1),char(173), +char(1),char(225),char(255),char(154),char(1),char(173),char(1),char(226),char(255),char(154), +char(1),char(173),char(1),char(227),char(255),char(154),char(1),char(173),char(1),char(228), +char(255),char(174),char(1),char(173),char(1),char(229),char(255),char(154),char(1),char(173), +char(1),char(230),char(255),char(154),char(1),char(173),char(1),char(231),char(255),char(215), +char(1),char(173),char(1),char(232),char(255),char(154),char(1),char(173),char(1),char(233), +char(255),char(195),char(1),char(173),char(1),char(234),char(255),char(113),char(1),char(173), +char(1),char(236),char(255),char(154),char(1),char(173),char(1),char(237),char(255),char(113), +char(1),char(173),char(1),char(238),char(255),char(133),char(1),char(173),char(1),char(242), +char(255),char(133),char(1),char(173),char(1),char(243),char(255),char(154),char(1),char(173), +char(1),char(245),char(255),char(154),char(1),char(173),char(1),char(246),char(255),char(174), +char(1),char(173),char(1),char(247),char(255),char(154),char(1),char(173),char(1),char(249), +char(255),char(154),char(1),char(173),char(2),char(2),char(255),char(174),char(1),char(173), +char(2),char(3),char(255),char(174),char(1),char(173),char(2),char(4),char(255),char(174), +char(1),char(173),char(2),char(8),char(255),char(133),char(1),char(173),char(2),char(12), +char(255),char(133),char(1),char(173),char(2),char(106),char(255),char(113),char(1),char(173), +char(2),char(107),char(255),char(154),char(1),char(173),char(2),char(108),char(255),char(215), +char(1),char(173),char(2),char(109),char(255),char(215),char(1),char(173),char(2),char(113), +char(255),char(154),char(1),char(173),char(2),char(114),char(255),char(113),char(1),char(173), +char(2),char(115),char(255),char(133),char(1),char(173),char(2),char(117),char(255),char(154), +char(1),char(173),char(2),char(119),char(255),char(154),char(1),char(173),char(2),char(121), +char(255),char(154),char(1),char(173),char(2),char(125),char(255),char(154),char(1),char(173), +char(2),char(126),char(255),char(215),char(1),char(173),char(2),char(127),char(255),char(113), +char(1),char(173),char(2),char(129),char(255),char(215),char(1),char(173),char(2),char(131), +char(255),char(215),char(1),char(173),char(2),char(132),char(255),char(215),char(1),char(173), +char(2),char(133),char(255),char(113),char(1),char(173),char(2),char(134),char(255),char(215), +char(1),char(173),char(2),char(135),char(255),char(113),char(1),char(173),char(2),char(136), +char(255),char(215),char(1),char(173),char(2),char(137),char(255),char(113),char(1),char(173), +char(2),char(138),char(255),char(215),char(1),char(173),char(2),char(139),char(255),char(215), +char(1),char(173),char(2),char(140),char(255),char(215),char(1),char(173),char(2),char(141), +char(255),char(113),char(1),char(173),char(2),char(150),char(255),char(154),char(1),char(173), +char(2),char(154),char(255),char(154),char(1),char(173),char(2),char(158),char(255),char(154), +char(1),char(173),char(2),char(160),char(255),char(215),char(1),char(173),char(2),char(162), +char(255),char(215),char(1),char(173),char(2),char(164),char(255),char(154),char(1),char(173), +char(2),char(166),char(255),char(154),char(1),char(173),char(2),char(170),char(255),char(174), +char(1),char(173),char(2),char(172),char(255),char(154),char(1),char(173),char(2),char(174), +char(255),char(154),char(1),char(173),char(2),char(176),char(255),char(154),char(1),char(173), +char(2),char(177),char(255),char(215),char(1),char(173),char(2),char(178),char(255),char(113), +char(1),char(173),char(2),char(179),char(255),char(215),char(1),char(173),char(2),char(180), +char(255),char(113),char(1),char(173),char(2),char(181),char(0),char(41),char(1),char(173), +char(2),char(182),char(255),char(174),char(1),char(173),char(2),char(184),char(255),char(174), +char(1),char(173),char(2),char(186),char(255),char(174),char(1),char(173),char(2),char(188), +char(255),char(215),char(1),char(173),char(2),char(190),char(255),char(174),char(1),char(173), +char(2),char(192),char(255),char(154),char(1),char(173),char(2),char(194),char(255),char(154), +char(1),char(173),char(2),char(196),char(255),char(154),char(1),char(173),char(2),char(197), +char(255),char(154),char(1),char(173),char(2),char(198),char(255),char(113),char(1),char(173), +char(2),char(199),char(255),char(154),char(1),char(173),char(2),char(200),char(255),char(113), +char(1),char(173),char(2),char(203),char(255),char(215),char(1),char(173),char(2),char(205), +char(255),char(154),char(1),char(173),char(2),char(206),char(255),char(154),char(1),char(173), +char(2),char(207),char(255),char(133),char(1),char(173),char(2),char(209),char(255),char(154), +char(1),char(173),char(2),char(211),char(255),char(154),char(1),char(173),char(2),char(213), +char(255),char(154),char(1),char(173),char(2),char(215),char(255),char(154),char(1),char(173), +char(2),char(217),char(255),char(113),char(1),char(173),char(2),char(219),char(255),char(113), +char(1),char(173),char(2),char(221),char(255),char(113),char(1),char(173),char(2),char(224), +char(255),char(113),char(1),char(173),char(2),char(230),char(255),char(215),char(1),char(173), +char(2),char(232),char(255),char(215),char(1),char(173),char(2),char(234),char(255),char(195), +char(1),char(173),char(2),char(236),char(255),char(154),char(1),char(173),char(2),char(238), +char(255),char(154),char(1),char(173),char(2),char(239),char(255),char(215),char(1),char(173), +char(2),char(240),char(255),char(113),char(1),char(173),char(2),char(241),char(255),char(215), +char(1),char(173),char(2),char(242),char(255),char(113),char(1),char(173),char(2),char(243), +char(255),char(215),char(1),char(173),char(2),char(244),char(255),char(113),char(1),char(173), +char(2),char(246),char(255),char(215),char(1),char(173),char(2),char(248),char(255),char(174), +char(1),char(173),char(2),char(250),char(255),char(174),char(1),char(173),char(2),char(252), +char(255),char(174),char(1),char(173),char(2),char(254),char(255),char(154),char(1),char(173), +char(3),char(0),char(255),char(154),char(1),char(173),char(3),char(2),char(255),char(154), +char(1),char(173),char(3),char(6),char(255),char(215),char(1),char(173),char(3),char(8), +char(255),char(215),char(1),char(173),char(3),char(9),char(255),char(113),char(1),char(173), +char(3),char(10),char(255),char(113),char(1),char(173),char(3),char(11),char(255),char(113), +char(1),char(173),char(3),char(12),char(255),char(113),char(1),char(173),char(3),char(14), +char(255),char(154),char(1),char(173),char(3),char(16),char(255),char(154),char(1),char(173), +char(3),char(17),char(255),char(154),char(1),char(173),char(3),char(18),char(255),char(133), +char(1),char(173),char(3),char(20),char(255),char(154),char(1),char(173),char(3),char(21), +char(255),char(215),char(1),char(173),char(3),char(22),char(255),char(113),char(1),char(173), +char(3),char(24),char(255),char(174),char(1),char(173),char(3),char(26),char(255),char(113), +char(1),char(173),char(3),char(27),char(255),char(154),char(1),char(173),char(3),char(28), +char(255),char(133),char(1),char(174),char(1),char(163),char(0),char(225),char(1),char(174), +char(2),char(234),char(0),char(41),char(1),char(174),char(3),char(14),char(255),char(215), +char(1),char(174),char(3),char(16),char(255),char(215),char(1),char(176),char(1),char(159), +char(255),char(215),char(1),char(176),char(1),char(184),char(255),char(215),char(1),char(176), +char(1),char(187),char(255),char(215),char(1),char(176),char(1),char(190),char(255),char(215), +char(1),char(176),char(1),char(193),char(255),char(215),char(1),char(176),char(1),char(225), +char(255),char(215),char(1),char(176),char(2),char(108),char(255),char(215),char(1),char(176), +char(2),char(124),char(255),char(215),char(1),char(176),char(2),char(126),char(255),char(215), +char(1),char(176),char(2),char(132),char(255),char(215),char(1),char(176),char(2),char(134), +char(255),char(215),char(1),char(176),char(2),char(136),char(255),char(215),char(1),char(176), +char(2),char(138),char(255),char(215),char(1),char(176),char(2),char(140),char(255),char(215), +char(1),char(176),char(2),char(177),char(255),char(215),char(1),char(176),char(2),char(179), +char(255),char(215),char(1),char(176),char(2),char(191),char(255),char(215),char(1),char(176), +char(2),char(192),char(255),char(215),char(1),char(176),char(2),char(193),char(255),char(215), +char(1),char(176),char(2),char(194),char(255),char(215),char(1),char(176),char(2),char(197), +char(255),char(154),char(1),char(176),char(2),char(199),char(255),char(154),char(1),char(176), +char(2),char(212),char(255),char(215),char(1),char(176),char(2),char(213),char(255),char(215), +char(1),char(176),char(2),char(239),char(255),char(215),char(1),char(176),char(2),char(241), +char(255),char(215),char(1),char(176),char(2),char(243),char(255),char(215),char(1),char(176), +char(2),char(253),char(255),char(215),char(1),char(176),char(2),char(254),char(255),char(215), +char(1),char(176),char(3),char(9),char(255),char(215),char(1),char(176),char(3),char(11), +char(255),char(215),char(1),char(176),char(3),char(14),char(255),char(215),char(1),char(176), +char(3),char(16),char(255),char(215),char(1),char(176),char(3),char(21),char(255),char(215), +char(1),char(176),char(3),char(25),char(255),char(236),char(1),char(177),char(0),char(15), +char(255),char(174),char(1),char(177),char(0),char(17),char(255),char(174),char(1),char(177), +char(2),char(8),char(255),char(174),char(1),char(177),char(2),char(12),char(255),char(174), +char(1),char(177),char(2),char(128),char(255),char(236),char(1),char(177),char(2),char(130), +char(255),char(236),char(1),char(177),char(2),char(183),char(255),char(236),char(1),char(177), +char(2),char(185),char(255),char(236),char(1),char(177),char(3),char(13),char(255),char(215), +char(1),char(177),char(3),char(15),char(255),char(215),char(1),char(180),char(1),char(159), +char(255),char(215),char(1),char(180),char(1),char(184),char(255),char(215),char(1),char(180), +char(1),char(187),char(255),char(215),char(1),char(180),char(1),char(190),char(255),char(215), +char(1),char(180),char(1),char(193),char(255),char(215),char(1),char(180),char(1),char(225), +char(255),char(215),char(1),char(180),char(2),char(108),char(255),char(215),char(1),char(180), +char(2),char(124),char(255),char(215),char(1),char(180),char(2),char(126),char(255),char(215), +char(1),char(180),char(2),char(132),char(255),char(215),char(1),char(180),char(2),char(134), +char(255),char(215),char(1),char(180),char(2),char(136),char(255),char(215),char(1),char(180), +char(2),char(138),char(255),char(215),char(1),char(180),char(2),char(140),char(255),char(215), +char(1),char(180),char(2),char(177),char(255),char(215),char(1),char(180),char(2),char(179), +char(255),char(215),char(1),char(180),char(2),char(191),char(255),char(215),char(1),char(180), +char(2),char(192),char(255),char(215),char(1),char(180),char(2),char(193),char(255),char(215), +char(1),char(180),char(2),char(194),char(255),char(215),char(1),char(180),char(2),char(197), +char(255),char(154),char(1),char(180),char(2),char(199),char(255),char(154),char(1),char(180), +char(2),char(212),char(255),char(215),char(1),char(180),char(2),char(213),char(255),char(215), +char(1),char(180),char(2),char(239),char(255),char(215),char(1),char(180),char(2),char(241), +char(255),char(215),char(1),char(180),char(2),char(243),char(255),char(215),char(1),char(180), +char(2),char(253),char(255),char(215),char(1),char(180),char(2),char(254),char(255),char(215), +char(1),char(180),char(3),char(9),char(255),char(215),char(1),char(180),char(3),char(11), +char(255),char(215),char(1),char(180),char(3),char(14),char(255),char(215),char(1),char(180), +char(3),char(16),char(255),char(215),char(1),char(180),char(3),char(21),char(255),char(215), +char(1),char(180),char(3),char(25),char(255),char(236),char(1),char(184),char(0),char(15), +char(255),char(174),char(1),char(184),char(0),char(17),char(255),char(174),char(1),char(184), +char(1),char(157),char(255),char(236),char(1),char(184),char(1),char(164),char(255),char(215), +char(1),char(184),char(1),char(166),char(255),char(236),char(1),char(184),char(1),char(168), +char(255),char(215),char(1),char(184),char(1),char(170),char(255),char(215),char(1),char(184), +char(1),char(174),char(255),char(215),char(1),char(184),char(1),char(176),char(255),char(215), +char(1),char(184),char(1),char(177),char(255),char(236),char(1),char(184),char(1),char(181), +char(255),char(215),char(1),char(184),char(1),char(188),char(255),char(195),char(1),char(184), +char(1),char(189),char(255),char(215),char(1),char(184),char(1),char(191),char(255),char(215), +char(1),char(184),char(1),char(193),char(255),char(215),char(1),char(184),char(1),char(196), +char(255),char(236),char(1),char(184),char(1),char(199),char(255),char(236),char(1),char(184), +char(1),char(206),char(255),char(236),char(1),char(184),char(1),char(213),char(255),char(236), +char(1),char(184),char(1),char(242),char(255),char(236),char(1),char(184),char(2),char(8), +char(255),char(174),char(1),char(184),char(2),char(12),char(255),char(174),char(1),char(184), +char(2),char(114),char(255),char(215),char(1),char(184),char(2),char(115),char(255),char(236), +char(1),char(184),char(2),char(122),char(255),char(236),char(1),char(184),char(2),char(124), +char(255),char(215),char(1),char(184),char(2),char(128),char(255),char(236),char(1),char(184), +char(2),char(130),char(255),char(236),char(1),char(184),char(2),char(159),char(255),char(215), +char(1),char(184),char(2),char(161),char(255),char(236),char(1),char(184),char(2),char(169), +char(255),char(236),char(1),char(184),char(2),char(181),char(255),char(195),char(1),char(184), +char(2),char(183),char(255),char(236),char(1),char(184),char(2),char(185),char(255),char(236), +char(1),char(184),char(2),char(187),char(255),char(215),char(1),char(184),char(2),char(189), +char(255),char(236),char(1),char(184),char(2),char(191),char(255),char(215),char(1),char(184), +char(2),char(193),char(255),char(215),char(1),char(184),char(2),char(202),char(255),char(215), +char(1),char(184),char(2),char(206),char(255),char(215),char(1),char(184),char(2),char(207), +char(255),char(236),char(1),char(184),char(2),char(212),char(255),char(215),char(1),char(184), +char(2),char(217),char(255),char(215),char(1),char(184),char(2),char(219),char(255),char(215), +char(1),char(184),char(2),char(221),char(255),char(215),char(1),char(184),char(2),char(229), +char(255),char(215),char(1),char(184),char(2),char(231),char(255),char(236),char(1),char(184), +char(2),char(245),char(255),char(236),char(1),char(184),char(2),char(247),char(255),char(215), +char(1),char(184),char(2),char(249),char(255),char(215),char(1),char(184),char(2),char(251), +char(255),char(215),char(1),char(184),char(2),char(253),char(255),char(215),char(1),char(184), +char(3),char(5),char(255),char(215),char(1),char(184),char(3),char(7),char(255),char(215), +char(1),char(184),char(3),char(13),char(255),char(215),char(1),char(184),char(3),char(15), +char(255),char(215),char(1),char(184),char(3),char(17),char(255),char(215),char(1),char(184), +char(3),char(18),char(255),char(236),char(1),char(184),char(3),char(23),char(255),char(236), +char(1),char(184),char(3),char(27),char(255),char(215),char(1),char(184),char(3),char(28), +char(255),char(236),char(1),char(186),char(0),char(15),char(254),char(246),char(1),char(186), +char(0),char(17),char(254),char(246),char(1),char(186),char(1),char(164),char(255),char(133), +char(1),char(186),char(1),char(170),char(255),char(154),char(1),char(186),char(1),char(174), +char(255),char(133),char(1),char(186),char(1),char(176),char(255),char(215),char(1),char(186), +char(1),char(181),char(255),char(133),char(1),char(186),char(1),char(191),char(255),char(215), +char(1),char(186),char(1),char(206),char(255),char(154),char(1),char(186),char(1),char(213), +char(255),char(154),char(1),char(186),char(1),char(242),char(255),char(154),char(1),char(186), +char(2),char(8),char(254),char(246),char(1),char(186),char(2),char(12),char(254),char(246), +char(1),char(186),char(2),char(114),char(255),char(154),char(1),char(186),char(2),char(115), +char(255),char(154),char(1),char(186),char(2),char(118),char(255),char(236),char(1),char(186), +char(2),char(159),char(255),char(215),char(1),char(186),char(2),char(187),char(255),char(215), +char(1),char(186),char(2),char(202),char(255),char(215),char(1),char(186),char(2),char(206), +char(255),char(133),char(1),char(186),char(2),char(207),char(255),char(154),char(1),char(186), +char(2),char(217),char(255),char(154),char(1),char(186),char(2),char(219),char(255),char(154), +char(1),char(186),char(2),char(221),char(255),char(154),char(1),char(186),char(2),char(229), +char(255),char(215),char(1),char(186),char(3),char(5),char(255),char(215),char(1),char(186), +char(3),char(7),char(255),char(215),char(1),char(186),char(3),char(9),char(255),char(174), +char(1),char(186),char(3),char(11),char(255),char(174),char(1),char(186),char(3),char(17), +char(255),char(133),char(1),char(186),char(3),char(18),char(255),char(154),char(1),char(186), +char(3),char(27),char(255),char(133),char(1),char(186),char(3),char(28),char(255),char(154), +char(1),char(187),char(1),char(159),char(255),char(215),char(1),char(187),char(1),char(184), +char(255),char(215),char(1),char(187),char(1),char(187),char(255),char(215),char(1),char(187), +char(1),char(190),char(255),char(215),char(1),char(187),char(1),char(225),char(255),char(215), +char(1),char(187),char(2),char(108),char(255),char(215),char(1),char(187),char(2),char(126), +char(255),char(215),char(1),char(187),char(2),char(132),char(255),char(215),char(1),char(187), +char(2),char(134),char(255),char(215),char(1),char(187),char(2),char(136),char(255),char(215), +char(1),char(187),char(2),char(138),char(255),char(215),char(1),char(187),char(2),char(140), +char(255),char(215),char(1),char(187),char(2),char(177),char(255),char(215),char(1),char(187), +char(2),char(179),char(255),char(215),char(1),char(187),char(2),char(192),char(255),char(215), +char(1),char(187),char(2),char(194),char(255),char(215),char(1),char(187),char(2),char(197), +char(255),char(215),char(1),char(187),char(2),char(199),char(255),char(215),char(1),char(187), +char(2),char(213),char(255),char(215),char(1),char(187),char(2),char(239),char(255),char(215), +char(1),char(187),char(2),char(241),char(255),char(215),char(1),char(187),char(2),char(243), +char(255),char(215),char(1),char(187),char(2),char(254),char(255),char(215),char(1),char(187), +char(3),char(9),char(255),char(215),char(1),char(187),char(3),char(11),char(255),char(215), +char(1),char(187),char(3),char(14),char(255),char(215),char(1),char(187),char(3),char(16), +char(255),char(215),char(1),char(187),char(3),char(21),char(255),char(215),char(1),char(188), +char(0),char(15),char(255),char(133),char(1),char(188),char(0),char(16),char(255),char(174), +char(1),char(188),char(0),char(17),char(255),char(133),char(1),char(188),char(1),char(159), +char(255),char(215),char(1),char(188),char(1),char(164),char(255),char(154),char(1),char(188), +char(1),char(170),char(255),char(113),char(1),char(188),char(1),char(174),char(255),char(154), +char(1),char(188),char(1),char(181),char(255),char(154),char(1),char(188),char(1),char(184), +char(255),char(215),char(1),char(188),char(1),char(187),char(255),char(215),char(1),char(188), +char(1),char(188),char(0),char(41),char(1),char(188),char(1),char(190),char(255),char(174), +char(1),char(188),char(1),char(204),char(255),char(154),char(1),char(188),char(1),char(205), +char(255),char(154),char(1),char(188),char(1),char(206),char(255),char(133),char(1),char(188), +char(1),char(207),char(255),char(113),char(1),char(188),char(1),char(208),char(255),char(215), +char(1),char(188),char(1),char(209),char(255),char(215),char(1),char(188),char(1),char(210), +char(255),char(154),char(1),char(188),char(1),char(211),char(255),char(154),char(1),char(188), +char(1),char(212),char(255),char(154),char(1),char(188),char(1),char(213),char(255),char(133), +char(1),char(188),char(1),char(214),char(255),char(154),char(1),char(188),char(1),char(215), +char(255),char(154),char(1),char(188),char(1),char(216),char(255),char(113),char(1),char(188), +char(1),char(217),char(255),char(154),char(1),char(188),char(1),char(218),char(255),char(154), +char(1),char(188),char(1),char(219),char(255),char(113),char(1),char(188),char(1),char(220), +char(255),char(174),char(1),char(188),char(1),char(221),char(255),char(174),char(1),char(188), +char(1),char(222),char(255),char(113),char(1),char(188),char(1),char(223),char(255),char(215), +char(1),char(188),char(1),char(224),char(255),char(154),char(1),char(188),char(1),char(225), +char(255),char(154),char(1),char(188),char(1),char(226),char(255),char(154),char(1),char(188), +char(1),char(227),char(255),char(154),char(1),char(188),char(1),char(228),char(255),char(174), +char(1),char(188),char(1),char(229),char(255),char(154),char(1),char(188),char(1),char(230), +char(255),char(154),char(1),char(188),char(1),char(231),char(255),char(215),char(1),char(188), +char(1),char(232),char(255),char(154),char(1),char(188),char(1),char(233),char(255),char(195), +char(1),char(188),char(1),char(234),char(255),char(113),char(1),char(188),char(1),char(236), +char(255),char(154),char(1),char(188),char(1),char(237),char(255),char(113),char(1),char(188), +char(1),char(238),char(255),char(133),char(1),char(188),char(1),char(242),char(255),char(133), +char(1),char(188),char(1),char(243),char(255),char(154),char(1),char(188),char(1),char(245), +char(255),char(154),char(1),char(188),char(1),char(246),char(255),char(174),char(1),char(188), +char(1),char(247),char(255),char(154),char(1),char(188),char(1),char(249),char(255),char(154), +char(1),char(188),char(2),char(2),char(255),char(174),char(1),char(188),char(2),char(3), +char(255),char(174),char(1),char(188),char(2),char(4),char(255),char(174),char(1),char(188), +char(2),char(8),char(255),char(133),char(1),char(188),char(2),char(12),char(255),char(133), +char(1),char(188),char(2),char(106),char(255),char(113),char(1),char(188),char(2),char(107), +char(255),char(154),char(1),char(188),char(2),char(108),char(255),char(215),char(1),char(188), +char(2),char(109),char(255),char(215),char(1),char(188),char(2),char(113),char(255),char(154), +char(1),char(188),char(2),char(114),char(255),char(113),char(1),char(188),char(2),char(115), +char(255),char(133),char(1),char(188),char(2),char(117),char(255),char(154),char(1),char(188), +char(2),char(119),char(255),char(154),char(1),char(188),char(2),char(121),char(255),char(154), +char(1),char(188),char(2),char(125),char(255),char(154),char(1),char(188),char(2),char(126), +char(255),char(215),char(1),char(188),char(2),char(127),char(255),char(113),char(1),char(188), +char(2),char(129),char(255),char(215),char(1),char(188),char(2),char(131),char(255),char(215), +char(1),char(188),char(2),char(132),char(255),char(215),char(1),char(188),char(2),char(133), +char(255),char(113),char(1),char(188),char(2),char(134),char(255),char(215),char(1),char(188), +char(2),char(135),char(255),char(113),char(1),char(188),char(2),char(136),char(255),char(215), +char(1),char(188),char(2),char(137),char(255),char(113),char(1),char(188),char(2),char(138), +char(255),char(215),char(1),char(188),char(2),char(139),char(255),char(215),char(1),char(188), +char(2),char(140),char(255),char(215),char(1),char(188),char(2),char(141),char(255),char(113), +char(1),char(188),char(2),char(150),char(255),char(154),char(1),char(188),char(2),char(154), +char(255),char(154),char(1),char(188),char(2),char(158),char(255),char(154),char(1),char(188), +char(2),char(160),char(255),char(215),char(1),char(188),char(2),char(162),char(255),char(215), +char(1),char(188),char(2),char(164),char(255),char(154),char(1),char(188),char(2),char(166), +char(255),char(154),char(1),char(188),char(2),char(170),char(255),char(174),char(1),char(188), +char(2),char(172),char(255),char(154),char(1),char(188),char(2),char(174),char(255),char(154), +char(1),char(188),char(2),char(176),char(255),char(154),char(1),char(188),char(2),char(177), +char(255),char(215),char(1),char(188),char(2),char(178),char(255),char(113),char(1),char(188), +char(2),char(179),char(255),char(215),char(1),char(188),char(2),char(180),char(255),char(113), +char(1),char(188),char(2),char(181),char(0),char(41),char(1),char(188),char(2),char(182), +char(255),char(174),char(1),char(188),char(2),char(184),char(255),char(174),char(1),char(188), +char(2),char(186),char(255),char(174),char(1),char(188),char(2),char(188),char(255),char(215), +char(1),char(188),char(2),char(190),char(255),char(174),char(1),char(188),char(2),char(192), +char(255),char(154),char(1),char(188),char(2),char(194),char(255),char(154),char(1),char(188), +char(2),char(196),char(255),char(154),char(1),char(188),char(2),char(197),char(255),char(154), +char(1),char(188),char(2),char(198),char(255),char(113),char(1),char(188),char(2),char(199), +char(255),char(154),char(1),char(188),char(2),char(200),char(255),char(113),char(1),char(188), +char(2),char(203),char(255),char(215),char(1),char(188),char(2),char(205),char(255),char(154), +char(1),char(188),char(2),char(206),char(255),char(154),char(1),char(188),char(2),char(207), +char(255),char(133),char(1),char(188),char(2),char(209),char(255),char(154),char(1),char(188), +char(2),char(211),char(255),char(154),char(1),char(188),char(2),char(213),char(255),char(154), +char(1),char(188),char(2),char(215),char(255),char(154),char(1),char(188),char(2),char(217), +char(255),char(113),char(1),char(188),char(2),char(219),char(255),char(113),char(1),char(188), +char(2),char(221),char(255),char(113),char(1),char(188),char(2),char(224),char(255),char(113), +char(1),char(188),char(2),char(230),char(255),char(215),char(1),char(188),char(2),char(232), +char(255),char(215),char(1),char(188),char(2),char(234),char(255),char(195),char(1),char(188), +char(2),char(236),char(255),char(154),char(1),char(188),char(2),char(238),char(255),char(154), +char(1),char(188),char(2),char(239),char(255),char(215),char(1),char(188),char(2),char(240), +char(255),char(113),char(1),char(188),char(2),char(241),char(255),char(215),char(1),char(188), +char(2),char(242),char(255),char(113),char(1),char(188),char(2),char(243),char(255),char(215), +char(1),char(188),char(2),char(244),char(255),char(113),char(1),char(188),char(2),char(246), +char(255),char(215),char(1),char(188),char(2),char(248),char(255),char(174),char(1),char(188), +char(2),char(250),char(255),char(174),char(1),char(188),char(2),char(252),char(255),char(174), +char(1),char(188),char(2),char(254),char(255),char(154),char(1),char(188),char(3),char(0), +char(255),char(154),char(1),char(188),char(3),char(2),char(255),char(154),char(1),char(188), +char(3),char(6),char(255),char(215),char(1),char(188),char(3),char(8),char(255),char(215), +char(1),char(188),char(3),char(9),char(255),char(113),char(1),char(188),char(3),char(10), +char(255),char(113),char(1),char(188),char(3),char(11),char(255),char(113),char(1),char(188), +char(3),char(12),char(255),char(113),char(1),char(188),char(3),char(14),char(255),char(154), +char(1),char(188),char(3),char(16),char(255),char(154),char(1),char(188),char(3),char(17), +char(255),char(154),char(1),char(188),char(3),char(18),char(255),char(133),char(1),char(188), +char(3),char(20),char(255),char(154),char(1),char(188),char(3),char(21),char(255),char(215), +char(1),char(188),char(3),char(22),char(255),char(113),char(1),char(188),char(3),char(24), +char(255),char(174),char(1),char(188),char(3),char(26),char(255),char(113),char(1),char(188), +char(3),char(27),char(255),char(154),char(1),char(188),char(3),char(28),char(255),char(133), +char(1),char(189),char(0),char(15),char(255),char(133),char(1),char(189),char(0),char(17), +char(255),char(133),char(1),char(189),char(1),char(159),char(255),char(236),char(1),char(189), +char(1),char(164),char(255),char(154),char(1),char(189),char(1),char(170),char(255),char(113), +char(1),char(189),char(1),char(174),char(255),char(154),char(1),char(189),char(1),char(181), +char(255),char(154),char(1),char(189),char(1),char(184),char(255),char(236),char(1),char(189), +char(1),char(187),char(255),char(236),char(1),char(189),char(1),char(190),char(255),char(195), +char(1),char(189),char(1),char(201),char(255),char(236),char(1),char(189),char(1),char(206), +char(255),char(174),char(1),char(189),char(1),char(207),char(255),char(215),char(1),char(189), +char(1),char(213),char(255),char(174),char(1),char(189),char(1),char(216),char(255),char(215), +char(1),char(189),char(1),char(219),char(255),char(215),char(1),char(189),char(1),char(222), +char(255),char(215),char(1),char(189),char(1),char(225),char(255),char(215),char(1),char(189), +char(1),char(234),char(255),char(215),char(1),char(189),char(1),char(235),char(0),char(102), +char(1),char(189),char(1),char(237),char(255),char(215),char(1),char(189),char(1),char(238), +char(255),char(236),char(1),char(189),char(1),char(242),char(255),char(174),char(1),char(189), +char(1),char(244),char(0),char(102),char(1),char(189),char(2),char(8),char(255),char(133), +char(1),char(189),char(2),char(12),char(255),char(133),char(1),char(189),char(2),char(106), +char(255),char(215),char(1),char(189),char(2),char(108),char(255),char(236),char(1),char(189), +char(2),char(114),char(255),char(113),char(1),char(189),char(2),char(115),char(255),char(174), +char(1),char(189),char(2),char(126),char(255),char(236),char(1),char(189),char(2),char(127), +char(255),char(215),char(1),char(189),char(2),char(132),char(255),char(236),char(1),char(189), +char(2),char(133),char(255),char(215),char(1),char(189),char(2),char(134),char(255),char(236), +char(1),char(189),char(2),char(135),char(255),char(215),char(1),char(189),char(2),char(136), +char(255),char(236),char(1),char(189),char(2),char(137),char(255),char(215),char(1),char(189), +char(2),char(138),char(255),char(236),char(1),char(189),char(2),char(140),char(255),char(236), +char(1),char(189),char(2),char(141),char(255),char(215),char(1),char(189),char(2),char(152), +char(0),char(102),char(1),char(189),char(2),char(168),char(0),char(102),char(1),char(189), +char(2),char(177),char(255),char(236),char(1),char(189),char(2),char(178),char(255),char(215), +char(1),char(189),char(2),char(179),char(255),char(236),char(1),char(189),char(2),char(180), +char(255),char(215),char(1),char(189),char(2),char(192),char(255),char(215),char(1),char(189), +char(2),char(194),char(255),char(215),char(1),char(189),char(2),char(197),char(255),char(215), +char(1),char(189),char(2),char(198),char(255),char(195),char(1),char(189),char(2),char(199), +char(255),char(215),char(1),char(189),char(2),char(200),char(255),char(195),char(1),char(189), +char(2),char(206),char(255),char(154),char(1),char(189),char(2),char(207),char(255),char(174), +char(1),char(189),char(2),char(213),char(255),char(215),char(1),char(189),char(2),char(217), +char(255),char(113),char(1),char(189),char(2),char(219),char(255),char(113),char(1),char(189), +char(2),char(221),char(255),char(113),char(1),char(189),char(2),char(224),char(255),char(215), +char(1),char(189),char(2),char(239),char(255),char(236),char(1),char(189),char(2),char(240), +char(255),char(215),char(1),char(189),char(2),char(241),char(255),char(236),char(1),char(189), +char(2),char(242),char(255),char(215),char(1),char(189),char(2),char(243),char(255),char(236), +char(1),char(189),char(2),char(244),char(255),char(215),char(1),char(189),char(2),char(254), +char(255),char(215),char(1),char(189),char(3),char(9),char(255),char(113),char(1),char(189), +char(3),char(10),char(255),char(215),char(1),char(189),char(3),char(11),char(255),char(113), +char(1),char(189),char(3),char(12),char(255),char(215),char(1),char(189),char(3),char(17), +char(255),char(154),char(1),char(189),char(3),char(18),char(255),char(174),char(1),char(189), +char(3),char(21),char(255),char(236),char(1),char(189),char(3),char(22),char(255),char(215), +char(1),char(189),char(3),char(26),char(255),char(215),char(1),char(189),char(3),char(27), +char(255),char(154),char(1),char(189),char(3),char(28),char(255),char(174),char(1),char(190), +char(0),char(15),char(255),char(174),char(1),char(190),char(0),char(17),char(255),char(174), +char(1),char(190),char(1),char(157),char(255),char(215),char(1),char(190),char(1),char(164), +char(255),char(215),char(1),char(190),char(1),char(166),char(255),char(215),char(1),char(190), +char(1),char(168),char(255),char(195),char(1),char(190),char(1),char(170),char(255),char(215), +char(1),char(190),char(1),char(174),char(255),char(215),char(1),char(190),char(1),char(176), +char(255),char(215),char(1),char(190),char(1),char(177),char(255),char(215),char(1),char(190), +char(1),char(181),char(255),char(215),char(1),char(190),char(1),char(188),char(255),char(195), +char(1),char(190),char(1),char(189),char(255),char(195),char(1),char(190),char(1),char(191), +char(255),char(215),char(1),char(190),char(1),char(196),char(255),char(215),char(1),char(190), +char(1),char(199),char(255),char(215),char(1),char(190),char(1),char(206),char(255),char(236), +char(1),char(190),char(1),char(213),char(255),char(236),char(1),char(190),char(1),char(242), +char(255),char(236),char(1),char(190),char(2),char(8),char(255),char(174),char(1),char(190), +char(2),char(12),char(255),char(174),char(1),char(190),char(2),char(114),char(255),char(215), +char(1),char(190),char(2),char(115),char(255),char(236),char(1),char(190),char(2),char(122), +char(255),char(215),char(1),char(190),char(2),char(128),char(255),char(236),char(1),char(190), +char(2),char(130),char(255),char(236),char(1),char(190),char(2),char(159),char(255),char(215), +char(1),char(190),char(2),char(161),char(255),char(215),char(1),char(190),char(2),char(169), +char(255),char(215),char(1),char(190),char(2),char(181),char(255),char(195),char(1),char(190), +char(2),char(183),char(255),char(195),char(1),char(190),char(2),char(185),char(255),char(195), +char(1),char(190),char(2),char(187),char(255),char(215),char(1),char(190),char(2),char(189), +char(255),char(215),char(1),char(190),char(2),char(202),char(255),char(215),char(1),char(190), +char(2),char(206),char(255),char(215),char(1),char(190),char(2),char(207),char(255),char(236), +char(1),char(190),char(2),char(217),char(255),char(215),char(1),char(190),char(2),char(219), +char(255),char(215),char(1),char(190),char(2),char(221),char(255),char(215),char(1),char(190), +char(2),char(229),char(255),char(215),char(1),char(190),char(2),char(231),char(255),char(215), +char(1),char(190),char(2),char(245),char(255),char(215),char(1),char(190),char(2),char(247), +char(255),char(195),char(1),char(190),char(2),char(249),char(255),char(195),char(1),char(190), +char(2),char(251),char(255),char(195),char(1),char(190),char(3),char(5),char(255),char(215), +char(1),char(190),char(3),char(7),char(255),char(215),char(1),char(190),char(3),char(13), +char(255),char(215),char(1),char(190),char(3),char(15),char(255),char(215),char(1),char(190), +char(3),char(17),char(255),char(215),char(1),char(190),char(3),char(18),char(255),char(236), +char(1),char(190),char(3),char(23),char(255),char(215),char(1),char(190),char(3),char(27), +char(255),char(215),char(1),char(190),char(3),char(28),char(255),char(236),char(1),char(191), +char(1),char(159),char(255),char(215),char(1),char(191),char(1),char(184),char(255),char(215), +char(1),char(191),char(1),char(187),char(255),char(215),char(1),char(191),char(1),char(190), +char(255),char(215),char(1),char(191),char(1),char(193),char(255),char(215),char(1),char(191), +char(1),char(225),char(255),char(215),char(1),char(191),char(2),char(108),char(255),char(215), +char(1),char(191),char(2),char(124),char(255),char(215),char(1),char(191),char(2),char(126), +char(255),char(215),char(1),char(191),char(2),char(132),char(255),char(215),char(1),char(191), +char(2),char(134),char(255),char(215),char(1),char(191),char(2),char(136),char(255),char(215), +char(1),char(191),char(2),char(138),char(255),char(215),char(1),char(191),char(2),char(140), +char(255),char(215),char(1),char(191),char(2),char(177),char(255),char(215),char(1),char(191), +char(2),char(179),char(255),char(215),char(1),char(191),char(2),char(191),char(255),char(215), +char(1),char(191),char(2),char(192),char(255),char(215),char(1),char(191),char(2),char(193), +char(255),char(215),char(1),char(191),char(2),char(194),char(255),char(215),char(1),char(191), +char(2),char(197),char(255),char(154),char(1),char(191),char(2),char(199),char(255),char(154), +char(1),char(191),char(2),char(212),char(255),char(215),char(1),char(191),char(2),char(213), +char(255),char(215),char(1),char(191),char(2),char(239),char(255),char(215),char(1),char(191), +char(2),char(241),char(255),char(215),char(1),char(191),char(2),char(243),char(255),char(215), +char(1),char(191),char(2),char(253),char(255),char(215),char(1),char(191),char(2),char(254), +char(255),char(215),char(1),char(191),char(3),char(9),char(255),char(215),char(1),char(191), +char(3),char(11),char(255),char(215),char(1),char(191),char(3),char(14),char(255),char(215), +char(1),char(191),char(3),char(16),char(255),char(215),char(1),char(191),char(3),char(21), +char(255),char(215),char(1),char(191),char(3),char(25),char(255),char(236),char(1),char(192), +char(1),char(163),char(0),char(225),char(1),char(192),char(2),char(234),char(0),char(41), +char(1),char(192),char(3),char(14),char(255),char(215),char(1),char(192),char(3),char(16), +char(255),char(215),char(1),char(195),char(1),char(163),char(0),char(225),char(1),char(195), +char(2),char(234),char(0),char(41),char(1),char(195),char(3),char(14),char(255),char(215), +char(1),char(195),char(3),char(16),char(255),char(215),char(1),char(196),char(0),char(5), +char(255),char(174),char(1),char(196),char(0),char(10),char(255),char(174),char(1),char(196), +char(1),char(157),char(255),char(133),char(1),char(196),char(1),char(166),char(255),char(133), +char(1),char(196),char(1),char(168),char(255),char(215),char(1),char(196),char(1),char(188), +char(255),char(154),char(1),char(196),char(1),char(189),char(255),char(215),char(1),char(196), +char(1),char(193),char(255),char(154),char(1),char(196),char(1),char(196),char(255),char(133), +char(1),char(196),char(1),char(220),char(255),char(215),char(1),char(196),char(1),char(221), +char(255),char(215),char(1),char(196),char(1),char(225),char(255),char(215),char(1),char(196), +char(1),char(228),char(255),char(215),char(1),char(196),char(1),char(246),char(255),char(215), +char(1),char(196),char(2),char(7),char(255),char(174),char(1),char(196),char(2),char(11), +char(255),char(174),char(1),char(196),char(2),char(110),char(255),char(174),char(1),char(196), +char(2),char(124),char(255),char(154),char(1),char(196),char(2),char(128),char(255),char(174), +char(1),char(196),char(2),char(130),char(255),char(174),char(1),char(196),char(2),char(151), +char(255),char(174),char(1),char(196),char(2),char(155),char(255),char(174),char(1),char(196), +char(2),char(167),char(255),char(174),char(1),char(196),char(2),char(169),char(255),char(133), +char(1),char(196),char(2),char(170),char(255),char(215),char(1),char(196),char(2),char(181), +char(255),char(154),char(1),char(196),char(2),char(182),char(255),char(215),char(1),char(196), +char(2),char(183),char(255),char(154),char(1),char(196),char(2),char(184),char(255),char(215), +char(1),char(196),char(2),char(185),char(255),char(154),char(1),char(196),char(2),char(186), +char(255),char(215),char(1),char(196),char(2),char(189),char(255),char(133),char(1),char(196), +char(2),char(190),char(255),char(215),char(1),char(196),char(2),char(191),char(255),char(154), +char(1),char(196),char(2),char(192),char(255),char(215),char(1),char(196),char(2),char(193), +char(255),char(154),char(1),char(196),char(2),char(194),char(255),char(215),char(1),char(196), +char(2),char(212),char(255),char(154),char(1),char(196),char(2),char(213),char(255),char(215), +char(1),char(196),char(2),char(247),char(255),char(215),char(1),char(196),char(2),char(248), +char(255),char(215),char(1),char(196),char(2),char(249),char(255),char(215),char(1),char(196), +char(2),char(250),char(255),char(215),char(1),char(196),char(2),char(251),char(255),char(215), +char(1),char(196),char(2),char(252),char(255),char(215),char(1),char(196),char(2),char(253), +char(255),char(154),char(1),char(196),char(2),char(254),char(255),char(215),char(1),char(196), +char(3),char(3),char(255),char(174),char(1),char(196),char(3),char(13),char(255),char(154), +char(1),char(196),char(3),char(14),char(255),char(195),char(1),char(196),char(3),char(15), +char(255),char(154),char(1),char(196),char(3),char(16),char(255),char(195),char(1),char(196), +char(3),char(23),char(255),char(133),char(1),char(196),char(3),char(24),char(255),char(215), +char(1),char(198),char(0),char(5),char(255),char(174),char(1),char(198),char(0),char(10), +char(255),char(174),char(1),char(198),char(1),char(157),char(255),char(133),char(1),char(198), +char(1),char(166),char(255),char(133),char(1),char(198),char(1),char(168),char(255),char(215), +char(1),char(198),char(1),char(188),char(255),char(154),char(1),char(198),char(1),char(189), +char(255),char(215),char(1),char(198),char(1),char(193),char(255),char(154),char(1),char(198), +char(1),char(196),char(255),char(133),char(1),char(198),char(1),char(220),char(255),char(215), +char(1),char(198),char(1),char(221),char(255),char(215),char(1),char(198),char(1),char(225), +char(255),char(215),char(1),char(198),char(1),char(228),char(255),char(215),char(1),char(198), +char(1),char(246),char(255),char(215),char(1),char(198),char(2),char(7),char(255),char(174), +char(1),char(198),char(2),char(11),char(255),char(174),char(1),char(198),char(2),char(110), +char(255),char(174),char(1),char(198),char(2),char(124),char(255),char(154),char(1),char(198), +char(2),char(128),char(255),char(174),char(1),char(198),char(2),char(130),char(255),char(174), +char(1),char(198),char(2),char(151),char(255),char(174),char(1),char(198),char(2),char(155), +char(255),char(174),char(1),char(198),char(2),char(167),char(255),char(174),char(1),char(198), +char(2),char(169),char(255),char(133),char(1),char(198),char(2),char(170),char(255),char(215), +char(1),char(198),char(2),char(181),char(255),char(154),char(1),char(198),char(2),char(182), +char(255),char(215),char(1),char(198),char(2),char(183),char(255),char(154),char(1),char(198), +char(2),char(184),char(255),char(215),char(1),char(198),char(2),char(185),char(255),char(154), +char(1),char(198),char(2),char(186),char(255),char(215),char(1),char(198),char(2),char(189), +char(255),char(133),char(1),char(198),char(2),char(190),char(255),char(215),char(1),char(198), +char(2),char(191),char(255),char(154),char(1),char(198),char(2),char(192),char(255),char(215), +char(1),char(198),char(2),char(193),char(255),char(154),char(1),char(198),char(2),char(194), +char(255),char(215),char(1),char(198),char(2),char(212),char(255),char(154),char(1),char(198), +char(2),char(213),char(255),char(215),char(1),char(198),char(2),char(247),char(255),char(215), +char(1),char(198),char(2),char(248),char(255),char(215),char(1),char(198),char(2),char(249), +char(255),char(215),char(1),char(198),char(2),char(250),char(255),char(215),char(1),char(198), +char(2),char(251),char(255),char(215),char(1),char(198),char(2),char(252),char(255),char(215), +char(1),char(198),char(2),char(253),char(255),char(154),char(1),char(198),char(2),char(254), +char(255),char(215),char(1),char(198),char(3),char(3),char(255),char(174),char(1),char(198), +char(3),char(13),char(255),char(154),char(1),char(198),char(3),char(14),char(255),char(195), +char(1),char(198),char(3),char(15),char(255),char(154),char(1),char(198),char(3),char(16), +char(255),char(195),char(1),char(198),char(3),char(23),char(255),char(133),char(1),char(198), +char(3),char(24),char(255),char(215),char(1),char(199),char(0),char(15),char(255),char(174), +char(1),char(199),char(0),char(17),char(255),char(174),char(1),char(199),char(1),char(157), +char(255),char(236),char(1),char(199),char(1),char(164),char(255),char(215),char(1),char(199), +char(1),char(166),char(255),char(236),char(1),char(199),char(1),char(168),char(255),char(215), +char(1),char(199),char(1),char(170),char(255),char(215),char(1),char(199),char(1),char(174), +char(255),char(215),char(1),char(199),char(1),char(176),char(255),char(215),char(1),char(199), +char(1),char(177),char(255),char(236),char(1),char(199),char(1),char(181),char(255),char(215), +char(1),char(199),char(1),char(188),char(255),char(195),char(1),char(199),char(1),char(189), +char(255),char(215),char(1),char(199),char(1),char(191),char(255),char(215),char(1),char(199), +char(1),char(193),char(255),char(215),char(1),char(199),char(1),char(196),char(255),char(236), +char(1),char(199),char(1),char(199),char(255),char(236),char(1),char(199),char(1),char(206), +char(255),char(236),char(1),char(199),char(1),char(213),char(255),char(236),char(1),char(199), +char(1),char(242),char(255),char(236),char(1),char(199),char(2),char(8),char(255),char(174), +char(1),char(199),char(2),char(12),char(255),char(174),char(1),char(199),char(2),char(114), +char(255),char(215),char(1),char(199),char(2),char(115),char(255),char(236),char(1),char(199), +char(2),char(122),char(255),char(236),char(1),char(199),char(2),char(124),char(255),char(215), +char(1),char(199),char(2),char(128),char(255),char(236),char(1),char(199),char(2),char(130), +char(255),char(236),char(1),char(199),char(2),char(159),char(255),char(215),char(1),char(199), +char(2),char(161),char(255),char(236),char(1),char(199),char(2),char(169),char(255),char(236), +char(1),char(199),char(2),char(181),char(255),char(195),char(1),char(199),char(2),char(183), +char(255),char(236),char(1),char(199),char(2),char(185),char(255),char(236),char(1),char(199), +char(2),char(187),char(255),char(215),char(1),char(199),char(2),char(189),char(255),char(236), +char(1),char(199),char(2),char(191),char(255),char(215),char(1),char(199),char(2),char(193), +char(255),char(215),char(1),char(199),char(2),char(202),char(255),char(215),char(1),char(199), +char(2),char(206),char(255),char(215),char(1),char(199),char(2),char(207),char(255),char(236), +char(1),char(199),char(2),char(212),char(255),char(215),char(1),char(199),char(2),char(217), +char(255),char(215),char(1),char(199),char(2),char(219),char(255),char(215),char(1),char(199), +char(2),char(221),char(255),char(215),char(1),char(199),char(2),char(229),char(255),char(215), +char(1),char(199),char(2),char(231),char(255),char(236),char(1),char(199),char(2),char(245), +char(255),char(236),char(1),char(199),char(2),char(247),char(255),char(215),char(1),char(199), +char(2),char(249),char(255),char(215),char(1),char(199),char(2),char(251),char(255),char(215), +char(1),char(199),char(2),char(253),char(255),char(215),char(1),char(199),char(3),char(5), +char(255),char(215),char(1),char(199),char(3),char(7),char(255),char(215),char(1),char(199), +char(3),char(13),char(255),char(215),char(1),char(199),char(3),char(15),char(255),char(215), +char(1),char(199),char(3),char(17),char(255),char(215),char(1),char(199),char(3),char(18), +char(255),char(236),char(1),char(199),char(3),char(23),char(255),char(236),char(1),char(199), +char(3),char(27),char(255),char(215),char(1),char(199),char(3),char(28),char(255),char(236), +char(1),char(200),char(0),char(15),char(255),char(174),char(1),char(200),char(0),char(17), +char(255),char(174),char(1),char(200),char(1),char(157),char(255),char(236),char(1),char(200), +char(1),char(164),char(255),char(215),char(1),char(200),char(1),char(166),char(255),char(236), +char(1),char(200),char(1),char(168),char(255),char(215),char(1),char(200),char(1),char(170), +char(255),char(215),char(1),char(200),char(1),char(174),char(255),char(215),char(1),char(200), +char(1),char(176),char(255),char(215),char(1),char(200),char(1),char(177),char(255),char(236), +char(1),char(200),char(1),char(181),char(255),char(215),char(1),char(200),char(1),char(188), +char(255),char(195),char(1),char(200),char(1),char(189),char(255),char(215),char(1),char(200), +char(1),char(191),char(255),char(215),char(1),char(200),char(1),char(193),char(255),char(215), +char(1),char(200),char(1),char(196),char(255),char(236),char(1),char(200),char(1),char(199), +char(255),char(236),char(1),char(200),char(1),char(206),char(255),char(236),char(1),char(200), +char(1),char(213),char(255),char(236),char(1),char(200),char(1),char(242),char(255),char(236), +char(1),char(200),char(2),char(8),char(255),char(174),char(1),char(200),char(2),char(12), +char(255),char(174),char(1),char(200),char(2),char(114),char(255),char(215),char(1),char(200), +char(2),char(115),char(255),char(236),char(1),char(200),char(2),char(122),char(255),char(236), +char(1),char(200),char(2),char(124),char(255),char(215),char(1),char(200),char(2),char(128), +char(255),char(236),char(1),char(200),char(2),char(130),char(255),char(236),char(1),char(200), +char(2),char(159),char(255),char(215),char(1),char(200),char(2),char(161),char(255),char(236), +char(1),char(200),char(2),char(169),char(255),char(236),char(1),char(200),char(2),char(181), +char(255),char(195),char(1),char(200),char(2),char(183),char(255),char(236),char(1),char(200), +char(2),char(185),char(255),char(236),char(1),char(200),char(2),char(187),char(255),char(215), +char(1),char(200),char(2),char(189),char(255),char(236),char(1),char(200),char(2),char(191), +char(255),char(215),char(1),char(200),char(2),char(193),char(255),char(215),char(1),char(200), +char(2),char(202),char(255),char(215),char(1),char(200),char(2),char(206),char(255),char(215), +char(1),char(200),char(2),char(207),char(255),char(236),char(1),char(200),char(2),char(212), +char(255),char(215),char(1),char(200),char(2),char(217),char(255),char(215),char(1),char(200), +char(2),char(219),char(255),char(215),char(1),char(200),char(2),char(221),char(255),char(215), +char(1),char(200),char(2),char(229),char(255),char(215),char(1),char(200),char(2),char(231), +char(255),char(236),char(1),char(200),char(2),char(245),char(255),char(236),char(1),char(200), +char(2),char(247),char(255),char(215),char(1),char(200),char(2),char(249),char(255),char(215), +char(1),char(200),char(2),char(251),char(255),char(215),char(1),char(200),char(2),char(253), +char(255),char(215),char(1),char(200),char(3),char(5),char(255),char(215),char(1),char(200), +char(3),char(7),char(255),char(215),char(1),char(200),char(3),char(13),char(255),char(215), +char(1),char(200),char(3),char(15),char(255),char(215),char(1),char(200),char(3),char(17), +char(255),char(215),char(1),char(200),char(3),char(18),char(255),char(236),char(1),char(200), +char(3),char(23),char(255),char(236),char(1),char(200),char(3),char(27),char(255),char(215), +char(1),char(200),char(3),char(28),char(255),char(236),char(1),char(202),char(0),char(5), +char(255),char(236),char(1),char(202),char(0),char(10),char(255),char(236),char(1),char(202), +char(2),char(7),char(255),char(236),char(1),char(202),char(2),char(11),char(255),char(236), +char(1),char(204),char(1),char(233),char(0),char(41),char(1),char(205),char(0),char(15), +char(255),char(154),char(1),char(205),char(0),char(16),char(255),char(215),char(1),char(205), +char(0),char(17),char(255),char(154),char(1),char(205),char(1),char(206),char(255),char(195), +char(1),char(205),char(1),char(207),char(255),char(236),char(1),char(205),char(1),char(213), +char(255),char(195),char(1),char(205),char(1),char(216),char(255),char(236),char(1),char(205), +char(1),char(219),char(255),char(236),char(1),char(205),char(1),char(222),char(255),char(236), +char(1),char(205),char(1),char(234),char(255),char(236),char(1),char(205),char(1),char(237), +char(255),char(236),char(1),char(205),char(1),char(242),char(255),char(195),char(1),char(205), +char(2),char(2),char(255),char(215),char(1),char(205),char(2),char(3),char(255),char(215), +char(1),char(205),char(2),char(4),char(255),char(215),char(1),char(205),char(2),char(8), +char(255),char(154),char(1),char(205),char(2),char(12),char(255),char(154),char(1),char(205), +char(2),char(106),char(255),char(236),char(1),char(205),char(2),char(115),char(255),char(195), +char(1),char(205),char(2),char(127),char(255),char(236),char(1),char(205),char(2),char(133), +char(255),char(236),char(1),char(205),char(2),char(135),char(255),char(236),char(1),char(205), +char(2),char(137),char(255),char(236),char(1),char(205),char(2),char(141),char(255),char(236), +char(1),char(205),char(2),char(178),char(255),char(236),char(1),char(205),char(2),char(180), +char(255),char(236),char(1),char(205),char(2),char(207),char(255),char(195),char(1),char(205), +char(2),char(224),char(255),char(236),char(1),char(205),char(2),char(240),char(255),char(236), +char(1),char(205),char(2),char(242),char(255),char(236),char(1),char(205),char(2),char(244), +char(255),char(236),char(1),char(205),char(3),char(10),char(255),char(236),char(1),char(205), +char(3),char(12),char(255),char(236),char(1),char(205),char(3),char(18),char(255),char(195), +char(1),char(205),char(3),char(22),char(255),char(236),char(1),char(205),char(3),char(26), +char(255),char(236),char(1),char(205),char(3),char(28),char(255),char(195),char(1),char(206), +char(0),char(5),char(255),char(236),char(1),char(206),char(0),char(10),char(255),char(236), +char(1),char(206),char(2),char(7),char(255),char(236),char(1),char(206),char(2),char(11), +char(255),char(236),char(1),char(207),char(0),char(5),char(255),char(236),char(1),char(207), +char(0),char(10),char(255),char(236),char(1),char(207),char(2),char(7),char(255),char(236), +char(1),char(207),char(2),char(11),char(255),char(236),char(1),char(208),char(1),char(207), +char(255),char(215),char(1),char(208),char(1),char(216),char(255),char(215),char(1),char(208), +char(1),char(219),char(255),char(215),char(1),char(208),char(1),char(222),char(255),char(215), +char(1),char(208),char(1),char(225),char(255),char(215),char(1),char(208),char(1),char(234), +char(255),char(215),char(1),char(208),char(1),char(237),char(255),char(215),char(1),char(208), +char(2),char(106),char(255),char(215),char(1),char(208),char(2),char(127),char(255),char(215), +char(1),char(208),char(2),char(133),char(255),char(215),char(1),char(208),char(2),char(135), +char(255),char(215),char(1),char(208),char(2),char(137),char(255),char(215),char(1),char(208), +char(2),char(141),char(255),char(215),char(1),char(208),char(2),char(178),char(255),char(215), +char(1),char(208),char(2),char(180),char(255),char(215),char(1),char(208),char(2),char(192), +char(255),char(215),char(1),char(208),char(2),char(194),char(255),char(215),char(1),char(208), +char(2),char(198),char(255),char(215),char(1),char(208),char(2),char(200),char(255),char(215), +char(1),char(208),char(2),char(213),char(255),char(215),char(1),char(208),char(2),char(224), +char(255),char(215),char(1),char(208),char(2),char(240),char(255),char(215),char(1),char(208), +char(2),char(242),char(255),char(215),char(1),char(208),char(2),char(244),char(255),char(215), +char(1),char(208),char(2),char(254),char(255),char(215),char(1),char(208),char(3),char(10), +char(255),char(215),char(1),char(208),char(3),char(12),char(255),char(215),char(1),char(208), +char(3),char(22),char(255),char(215),char(1),char(208),char(3),char(26),char(255),char(215), +char(1),char(209),char(1),char(233),char(0),char(41),char(1),char(212),char(1),char(207), +char(255),char(215),char(1),char(212),char(1),char(216),char(255),char(215),char(1),char(212), +char(1),char(219),char(255),char(215),char(1),char(212),char(1),char(222),char(255),char(215), +char(1),char(212),char(1),char(225),char(255),char(215),char(1),char(212),char(1),char(234), +char(255),char(215),char(1),char(212),char(1),char(237),char(255),char(215),char(1),char(212), +char(2),char(106),char(255),char(215),char(1),char(212),char(2),char(127),char(255),char(215), +char(1),char(212),char(2),char(133),char(255),char(215),char(1),char(212),char(2),char(135), +char(255),char(215),char(1),char(212),char(2),char(137),char(255),char(215),char(1),char(212), +char(2),char(141),char(255),char(215),char(1),char(212),char(2),char(178),char(255),char(215), +char(1),char(212),char(2),char(180),char(255),char(215),char(1),char(212),char(2),char(192), +char(255),char(215),char(1),char(212),char(2),char(194),char(255),char(215),char(1),char(212), +char(2),char(198),char(255),char(215),char(1),char(212),char(2),char(200),char(255),char(215), +char(1),char(212),char(2),char(213),char(255),char(215),char(1),char(212),char(2),char(224), +char(255),char(215),char(1),char(212),char(2),char(240),char(255),char(215),char(1),char(212), +char(2),char(242),char(255),char(215),char(1),char(212),char(2),char(244),char(255),char(215), +char(1),char(212),char(2),char(254),char(255),char(215),char(1),char(212),char(3),char(10), +char(255),char(215),char(1),char(212),char(3),char(12),char(255),char(215),char(1),char(212), +char(3),char(22),char(255),char(215),char(1),char(212),char(3),char(26),char(255),char(215), +char(1),char(216),char(0),char(5),char(255),char(236),char(1),char(216),char(0),char(10), +char(255),char(236),char(1),char(216),char(1),char(208),char(255),char(215),char(1),char(216), +char(1),char(220),char(255),char(236),char(1),char(216),char(1),char(221),char(255),char(236), +char(1),char(216),char(1),char(223),char(255),char(215),char(1),char(216),char(1),char(225), +char(255),char(236),char(1),char(216),char(1),char(228),char(255),char(236),char(1),char(216), +char(1),char(246),char(255),char(236),char(1),char(216),char(2),char(7),char(255),char(236), +char(1),char(216),char(2),char(11),char(255),char(236),char(1),char(216),char(2),char(160), +char(255),char(215),char(1),char(216),char(2),char(170),char(255),char(236),char(1),char(216), +char(2),char(182),char(255),char(236),char(1),char(216),char(2),char(188),char(255),char(215), +char(1),char(216),char(2),char(190),char(255),char(236),char(1),char(216),char(2),char(192), +char(255),char(236),char(1),char(216),char(2),char(194),char(255),char(236),char(1),char(216), +char(2),char(203),char(255),char(215),char(1),char(216),char(2),char(213),char(255),char(236), +char(1),char(216),char(2),char(230),char(255),char(215),char(1),char(216),char(2),char(248), +char(255),char(236),char(1),char(216),char(2),char(250),char(255),char(236),char(1),char(216), +char(2),char(252),char(255),char(236),char(1),char(216),char(2),char(254),char(255),char(236), +char(1),char(216),char(3),char(6),char(255),char(215),char(1),char(216),char(3),char(8), +char(255),char(215),char(1),char(216),char(3),char(14),char(255),char(236),char(1),char(216), +char(3),char(16),char(255),char(236),char(1),char(216),char(3),char(24),char(255),char(236), +char(1),char(218),char(0),char(5),char(255),char(236),char(1),char(218),char(0),char(10), +char(255),char(236),char(1),char(218),char(1),char(208),char(255),char(215),char(1),char(218), +char(1),char(220),char(255),char(236),char(1),char(218),char(1),char(221),char(255),char(236), +char(1),char(218),char(1),char(223),char(255),char(215),char(1),char(218),char(1),char(225), +char(255),char(236),char(1),char(218),char(1),char(228),char(255),char(236),char(1),char(218), +char(1),char(246),char(255),char(236),char(1),char(218),char(2),char(7),char(255),char(236), +char(1),char(218),char(2),char(11),char(255),char(236),char(1),char(218),char(2),char(160), +char(255),char(215),char(1),char(218),char(2),char(170),char(255),char(236),char(1),char(218), +char(2),char(182),char(255),char(236),char(1),char(218),char(2),char(188),char(255),char(215), +char(1),char(218),char(2),char(190),char(255),char(236),char(1),char(218),char(2),char(192), +char(255),char(236),char(1),char(218),char(2),char(194),char(255),char(236),char(1),char(218), +char(2),char(203),char(255),char(215),char(1),char(218),char(2),char(213),char(255),char(236), +char(1),char(218),char(2),char(230),char(255),char(215),char(1),char(218),char(2),char(248), +char(255),char(236),char(1),char(218),char(2),char(250),char(255),char(236),char(1),char(218), +char(2),char(252),char(255),char(236),char(1),char(218),char(2),char(254),char(255),char(236), +char(1),char(218),char(3),char(6),char(255),char(215),char(1),char(218),char(3),char(8), +char(255),char(215),char(1),char(218),char(3),char(14),char(255),char(236),char(1),char(218), +char(3),char(16),char(255),char(236),char(1),char(218),char(3),char(24),char(255),char(236), +char(1),char(220),char(0),char(15),char(255),char(154),char(1),char(220),char(0),char(16), +char(255),char(215),char(1),char(220),char(0),char(17),char(255),char(154),char(1),char(220), +char(1),char(206),char(255),char(195),char(1),char(220),char(1),char(207),char(255),char(236), +char(1),char(220),char(1),char(213),char(255),char(195),char(1),char(220),char(1),char(216), +char(255),char(236),char(1),char(220),char(1),char(219),char(255),char(236),char(1),char(220), +char(1),char(222),char(255),char(236),char(1),char(220),char(1),char(234),char(255),char(236), +char(1),char(220),char(1),char(237),char(255),char(236),char(1),char(220),char(1),char(242), +char(255),char(195),char(1),char(220),char(2),char(2),char(255),char(215),char(1),char(220), +char(2),char(3),char(255),char(215),char(1),char(220),char(2),char(4),char(255),char(215), +char(1),char(220),char(2),char(8),char(255),char(154),char(1),char(220),char(2),char(12), +char(255),char(154),char(1),char(220),char(2),char(106),char(255),char(236),char(1),char(220), +char(2),char(115),char(255),char(195),char(1),char(220),char(2),char(127),char(255),char(236), +char(1),char(220),char(2),char(133),char(255),char(236),char(1),char(220),char(2),char(135), +char(255),char(236),char(1),char(220),char(2),char(137),char(255),char(236),char(1),char(220), +char(2),char(141),char(255),char(236),char(1),char(220),char(2),char(178),char(255),char(236), +char(1),char(220),char(2),char(180),char(255),char(236),char(1),char(220),char(2),char(207), +char(255),char(195),char(1),char(220),char(2),char(224),char(255),char(236),char(1),char(220), +char(2),char(240),char(255),char(236),char(1),char(220),char(2),char(242),char(255),char(236), +char(1),char(220),char(2),char(244),char(255),char(236),char(1),char(220),char(3),char(10), +char(255),char(236),char(1),char(220),char(3),char(12),char(255),char(236),char(1),char(220), +char(3),char(18),char(255),char(195),char(1),char(220),char(3),char(22),char(255),char(236), +char(1),char(220),char(3),char(26),char(255),char(236),char(1),char(220),char(3),char(28), +char(255),char(195),char(1),char(221),char(0),char(15),char(255),char(174),char(1),char(221), +char(0),char(17),char(255),char(174),char(1),char(221),char(1),char(206),char(255),char(215), +char(1),char(221),char(1),char(213),char(255),char(215),char(1),char(221),char(1),char(242), +char(255),char(215),char(1),char(221),char(2),char(8),char(255),char(174),char(1),char(221), +char(2),char(12),char(255),char(174),char(1),char(221),char(2),char(115),char(255),char(215), +char(1),char(221),char(2),char(207),char(255),char(215),char(1),char(221),char(3),char(18), +char(255),char(215),char(1),char(221),char(3),char(28),char(255),char(215),char(1),char(222), +char(0),char(5),char(255),char(236),char(1),char(222),char(0),char(10),char(255),char(236), +char(1),char(222),char(1),char(208),char(255),char(215),char(1),char(222),char(1),char(220), +char(255),char(236),char(1),char(222),char(1),char(221),char(255),char(236),char(1),char(222), +char(1),char(223),char(255),char(215),char(1),char(222),char(1),char(225),char(255),char(236), +char(1),char(222),char(1),char(228),char(255),char(236),char(1),char(222),char(1),char(246), +char(255),char(236),char(1),char(222),char(2),char(7),char(255),char(236),char(1),char(222), +char(2),char(11),char(255),char(236),char(1),char(222),char(2),char(160),char(255),char(215), +char(1),char(222),char(2),char(170),char(255),char(236),char(1),char(222),char(2),char(182), +char(255),char(236),char(1),char(222),char(2),char(188),char(255),char(215),char(1),char(222), +char(2),char(190),char(255),char(236),char(1),char(222),char(2),char(192),char(255),char(236), +char(1),char(222),char(2),char(194),char(255),char(236),char(1),char(222),char(2),char(203), +char(255),char(215),char(1),char(222),char(2),char(213),char(255),char(236),char(1),char(222), +char(2),char(230),char(255),char(215),char(1),char(222),char(2),char(248),char(255),char(236), +char(1),char(222),char(2),char(250),char(255),char(236),char(1),char(222),char(2),char(252), +char(255),char(236),char(1),char(222),char(2),char(254),char(255),char(236),char(1),char(222), +char(3),char(6),char(255),char(215),char(1),char(222),char(3),char(8),char(255),char(215), +char(1),char(222),char(3),char(14),char(255),char(236),char(1),char(222),char(3),char(16), +char(255),char(236),char(1),char(222),char(3),char(24),char(255),char(236),char(1),char(223), +char(1),char(207),char(255),char(215),char(1),char(223),char(1),char(216),char(255),char(215), +char(1),char(223),char(1),char(219),char(255),char(215),char(1),char(223),char(1),char(222), +char(255),char(215),char(1),char(223),char(1),char(225),char(255),char(215),char(1),char(223), +char(1),char(234),char(255),char(215),char(1),char(223),char(1),char(237),char(255),char(215), +char(1),char(223),char(2),char(106),char(255),char(215),char(1),char(223),char(2),char(127), +char(255),char(215),char(1),char(223),char(2),char(133),char(255),char(215),char(1),char(223), +char(2),char(135),char(255),char(215),char(1),char(223),char(2),char(137),char(255),char(215), +char(1),char(223),char(2),char(141),char(255),char(215),char(1),char(223),char(2),char(178), +char(255),char(215),char(1),char(223),char(2),char(180),char(255),char(215),char(1),char(223), +char(2),char(192),char(255),char(215),char(1),char(223),char(2),char(194),char(255),char(215), +char(1),char(223),char(2),char(198),char(255),char(215),char(1),char(223),char(2),char(200), +char(255),char(215),char(1),char(223),char(2),char(213),char(255),char(215),char(1),char(223), +char(2),char(224),char(255),char(215),char(1),char(223),char(2),char(240),char(255),char(215), +char(1),char(223),char(2),char(242),char(255),char(215),char(1),char(223),char(2),char(244), +char(255),char(215),char(1),char(223),char(2),char(254),char(255),char(215),char(1),char(223), +char(3),char(10),char(255),char(215),char(1),char(223),char(3),char(12),char(255),char(215), +char(1),char(223),char(3),char(22),char(255),char(215),char(1),char(223),char(3),char(26), +char(255),char(215),char(1),char(224),char(0),char(5),char(255),char(236),char(1),char(224), +char(0),char(10),char(255),char(236),char(1),char(224),char(2),char(7),char(255),char(236), +char(1),char(224),char(2),char(11),char(255),char(236),char(1),char(227),char(0),char(5), +char(255),char(236),char(1),char(227),char(0),char(10),char(255),char(236),char(1),char(227), +char(2),char(7),char(255),char(236),char(1),char(227),char(2),char(11),char(255),char(236), +char(1),char(228),char(0),char(5),char(255),char(133),char(1),char(228),char(0),char(10), +char(255),char(133),char(1),char(228),char(1),char(208),char(255),char(215),char(1),char(228), +char(1),char(220),char(255),char(154),char(1),char(228),char(1),char(221),char(255),char(195), +char(1),char(228),char(1),char(223),char(255),char(215),char(1),char(228),char(1),char(225), +char(255),char(174),char(1),char(228),char(1),char(228),char(255),char(154),char(1),char(228), +char(1),char(246),char(255),char(195),char(1),char(228),char(2),char(7),char(255),char(133), +char(1),char(228),char(2),char(11),char(255),char(133),char(1),char(228),char(2),char(109), +char(255),char(215),char(1),char(228),char(2),char(129),char(255),char(215),char(1),char(228), +char(2),char(131),char(255),char(215),char(1),char(228),char(2),char(139),char(255),char(215), +char(1),char(228),char(2),char(160),char(255),char(215),char(1),char(228),char(2),char(170), +char(255),char(154),char(1),char(228),char(2),char(182),char(255),char(154),char(1),char(228), +char(2),char(184),char(255),char(195),char(1),char(228),char(2),char(186),char(255),char(195), +char(1),char(228),char(2),char(188),char(255),char(215),char(1),char(228),char(2),char(190), +char(255),char(154),char(1),char(228),char(2),char(192),char(255),char(174),char(1),char(228), +char(2),char(194),char(255),char(174),char(1),char(228),char(2),char(198),char(255),char(215), +char(1),char(228),char(2),char(200),char(255),char(215),char(1),char(228),char(2),char(203), +char(255),char(215),char(1),char(228),char(2),char(213),char(255),char(174),char(1),char(228), +char(2),char(230),char(255),char(215),char(1),char(228),char(2),char(234),char(255),char(215), +char(1),char(228),char(2),char(248),char(255),char(195),char(1),char(228),char(2),char(250), +char(255),char(195),char(1),char(228),char(2),char(252),char(255),char(195),char(1),char(228), +char(2),char(254),char(255),char(174),char(1),char(228),char(3),char(6),char(255),char(215), +char(1),char(228),char(3),char(8),char(255),char(215),char(1),char(228),char(3),char(14), +char(255),char(154),char(1),char(228),char(3),char(16),char(255),char(154),char(1),char(228), +char(3),char(24),char(255),char(154),char(1),char(230),char(0),char(5),char(255),char(133), +char(1),char(230),char(0),char(10),char(255),char(133),char(1),char(230),char(1),char(208), +char(255),char(215),char(1),char(230),char(1),char(220),char(255),char(154),char(1),char(230), +char(1),char(221),char(255),char(195),char(1),char(230),char(1),char(223),char(255),char(215), +char(1),char(230),char(1),char(225),char(255),char(174),char(1),char(230),char(1),char(228), +char(255),char(154),char(1),char(230),char(1),char(246),char(255),char(195),char(1),char(230), +char(2),char(7),char(255),char(133),char(1),char(230),char(2),char(11),char(255),char(133), +char(1),char(230),char(2),char(109),char(255),char(215),char(1),char(230),char(2),char(129), +char(255),char(215),char(1),char(230),char(2),char(131),char(255),char(215),char(1),char(230), +char(2),char(139),char(255),char(215),char(1),char(230),char(2),char(160),char(255),char(215), +char(1),char(230),char(2),char(170),char(255),char(154),char(1),char(230),char(2),char(182), +char(255),char(154),char(1),char(230),char(2),char(184),char(255),char(195),char(1),char(230), +char(2),char(186),char(255),char(195),char(1),char(230),char(2),char(188),char(255),char(215), +char(1),char(230),char(2),char(190),char(255),char(154),char(1),char(230),char(2),char(192), +char(255),char(174),char(1),char(230),char(2),char(194),char(255),char(174),char(1),char(230), +char(2),char(198),char(255),char(215),char(1),char(230),char(2),char(200),char(255),char(215), +char(1),char(230),char(2),char(203),char(255),char(215),char(1),char(230),char(2),char(213), +char(255),char(174),char(1),char(230),char(2),char(230),char(255),char(215),char(1),char(230), +char(2),char(234),char(255),char(215),char(1),char(230),char(2),char(248),char(255),char(195), +char(1),char(230),char(2),char(250),char(255),char(195),char(1),char(230),char(2),char(252), +char(255),char(195),char(1),char(230),char(2),char(254),char(255),char(174),char(1),char(230), +char(3),char(6),char(255),char(215),char(1),char(230),char(3),char(8),char(255),char(215), +char(1),char(230),char(3),char(14),char(255),char(154),char(1),char(230),char(3),char(16), +char(255),char(154),char(1),char(230),char(3),char(24),char(255),char(154),char(1),char(231), +char(0),char(5),char(255),char(236),char(1),char(231),char(0),char(10),char(255),char(236), +char(1),char(231),char(1),char(208),char(255),char(215),char(1),char(231),char(1),char(220), +char(255),char(236),char(1),char(231),char(1),char(221),char(255),char(236),char(1),char(231), +char(1),char(223),char(255),char(215),char(1),char(231),char(1),char(225),char(255),char(236), +char(1),char(231),char(1),char(228),char(255),char(236),char(1),char(231),char(1),char(246), +char(255),char(236),char(1),char(231),char(2),char(7),char(255),char(236),char(1),char(231), +char(2),char(11),char(255),char(236),char(1),char(231),char(2),char(160),char(255),char(215), +char(1),char(231),char(2),char(170),char(255),char(236),char(1),char(231),char(2),char(182), +char(255),char(236),char(1),char(231),char(2),char(188),char(255),char(215),char(1),char(231), +char(2),char(190),char(255),char(236),char(1),char(231),char(2),char(192),char(255),char(236), +char(1),char(231),char(2),char(194),char(255),char(236),char(1),char(231),char(2),char(203), +char(255),char(215),char(1),char(231),char(2),char(213),char(255),char(236),char(1),char(231), +char(2),char(230),char(255),char(215),char(1),char(231),char(2),char(248),char(255),char(236), +char(1),char(231),char(2),char(250),char(255),char(236),char(1),char(231),char(2),char(252), +char(255),char(236),char(1),char(231),char(2),char(254),char(255),char(236),char(1),char(231), +char(3),char(6),char(255),char(215),char(1),char(231),char(3),char(8),char(255),char(215), +char(1),char(231),char(3),char(14),char(255),char(236),char(1),char(231),char(3),char(16), +char(255),char(236),char(1),char(231),char(3),char(24),char(255),char(236),char(1),char(232), +char(0),char(5),char(255),char(236),char(1),char(232),char(0),char(10),char(255),char(236), +char(1),char(232),char(1),char(208),char(255),char(215),char(1),char(232),char(1),char(220), +char(255),char(236),char(1),char(232),char(1),char(221),char(255),char(236),char(1),char(232), +char(1),char(223),char(255),char(215),char(1),char(232),char(1),char(225),char(255),char(236), +char(1),char(232),char(1),char(228),char(255),char(236),char(1),char(232),char(1),char(246), +char(255),char(236),char(1),char(232),char(2),char(7),char(255),char(236),char(1),char(232), +char(2),char(11),char(255),char(236),char(1),char(232),char(2),char(160),char(255),char(215), +char(1),char(232),char(2),char(170),char(255),char(236),char(1),char(232),char(2),char(182), +char(255),char(236),char(1),char(232),char(2),char(188),char(255),char(215),char(1),char(232), +char(2),char(190),char(255),char(236),char(1),char(232),char(2),char(192),char(255),char(236), +char(1),char(232),char(2),char(194),char(255),char(236),char(1),char(232),char(2),char(203), +char(255),char(215),char(1),char(232),char(2),char(213),char(255),char(236),char(1),char(232), +char(2),char(230),char(255),char(215),char(1),char(232),char(2),char(248),char(255),char(236), +char(1),char(232),char(2),char(250),char(255),char(236),char(1),char(232),char(2),char(252), +char(255),char(236),char(1),char(232),char(2),char(254),char(255),char(236),char(1),char(232), +char(3),char(6),char(255),char(215),char(1),char(232),char(3),char(8),char(255),char(215), +char(1),char(232),char(3),char(14),char(255),char(236),char(1),char(232),char(3),char(16), +char(255),char(236),char(1),char(232),char(3),char(24),char(255),char(236),char(1),char(234), +char(0),char(5),char(255),char(236),char(1),char(234),char(0),char(10),char(255),char(236), +char(1),char(234),char(2),char(7),char(255),char(236),char(1),char(234),char(2),char(11), +char(255),char(236),char(1),char(235),char(0),char(5),char(255),char(236),char(1),char(235), +char(0),char(10),char(255),char(236),char(1),char(235),char(2),char(7),char(255),char(236), +char(1),char(235),char(2),char(11),char(255),char(236),char(1),char(235),char(3),char(14), +char(255),char(215),char(1),char(235),char(3),char(16),char(255),char(215),char(1),char(236), +char(0),char(15),char(255),char(154),char(1),char(236),char(0),char(16),char(255),char(215), +char(1),char(236),char(0),char(17),char(255),char(154),char(1),char(236),char(1),char(206), +char(255),char(195),char(1),char(236),char(1),char(207),char(255),char(236),char(1),char(236), +char(1),char(213),char(255),char(195),char(1),char(236),char(1),char(216),char(255),char(236), +char(1),char(236),char(1),char(219),char(255),char(236),char(1),char(236),char(1),char(222), +char(255),char(236),char(1),char(236),char(1),char(234),char(255),char(236),char(1),char(236), +char(1),char(237),char(255),char(236),char(1),char(236),char(1),char(242),char(255),char(195), +char(1),char(236),char(2),char(2),char(255),char(215),char(1),char(236),char(2),char(3), +char(255),char(215),char(1),char(236),char(2),char(4),char(255),char(215),char(1),char(236), +char(2),char(8),char(255),char(154),char(1),char(236),char(2),char(12),char(255),char(154), +char(1),char(236),char(2),char(106),char(255),char(236),char(1),char(236),char(2),char(115), +char(255),char(195),char(1),char(236),char(2),char(127),char(255),char(236),char(1),char(236), +char(2),char(133),char(255),char(236),char(1),char(236),char(2),char(135),char(255),char(236), +char(1),char(236),char(2),char(137),char(255),char(236),char(1),char(236),char(2),char(141), +char(255),char(236),char(1),char(236),char(2),char(178),char(255),char(236),char(1),char(236), +char(2),char(180),char(255),char(236),char(1),char(236),char(2),char(207),char(255),char(195), +char(1),char(236),char(2),char(224),char(255),char(236),char(1),char(236),char(2),char(240), +char(255),char(236),char(1),char(236),char(2),char(242),char(255),char(236),char(1),char(236), +char(2),char(244),char(255),char(236),char(1),char(236),char(3),char(10),char(255),char(236), +char(1),char(236),char(3),char(12),char(255),char(236),char(1),char(236),char(3),char(18), +char(255),char(195),char(1),char(236),char(3),char(22),char(255),char(236),char(1),char(236), +char(3),char(26),char(255),char(236),char(1),char(236),char(3),char(28),char(255),char(195), +char(1),char(242),char(0),char(5),char(255),char(133),char(1),char(242),char(0),char(10), +char(255),char(133),char(1),char(242),char(1),char(208),char(255),char(215),char(1),char(242), +char(1),char(220),char(255),char(154),char(1),char(242),char(1),char(221),char(255),char(195), +char(1),char(242),char(1),char(223),char(255),char(215),char(1),char(242),char(1),char(225), +char(255),char(174),char(1),char(242),char(1),char(228),char(255),char(154),char(1),char(242), +char(1),char(246),char(255),char(195),char(1),char(242),char(2),char(7),char(255),char(133), +char(1),char(242),char(2),char(11),char(255),char(133),char(1),char(242),char(2),char(109), +char(255),char(215),char(1),char(242),char(2),char(129),char(255),char(215),char(1),char(242), +char(2),char(131),char(255),char(215),char(1),char(242),char(2),char(139),char(255),char(215), +char(1),char(242),char(2),char(160),char(255),char(215),char(1),char(242),char(2),char(170), +char(255),char(154),char(1),char(242),char(2),char(182),char(255),char(154),char(1),char(242), +char(2),char(184),char(255),char(195),char(1),char(242),char(2),char(186),char(255),char(195), +char(1),char(242),char(2),char(188),char(255),char(215),char(1),char(242),char(2),char(190), +char(255),char(154),char(1),char(242),char(2),char(192),char(255),char(174),char(1),char(242), +char(2),char(194),char(255),char(174),char(1),char(242),char(2),char(198),char(255),char(215), +char(1),char(242),char(2),char(200),char(255),char(215),char(1),char(242),char(2),char(203), +char(255),char(215),char(1),char(242),char(2),char(213),char(255),char(174),char(1),char(242), +char(2),char(230),char(255),char(215),char(1),char(242),char(2),char(234),char(255),char(215), +char(1),char(242),char(2),char(248),char(255),char(195),char(1),char(242),char(2),char(250), +char(255),char(195),char(1),char(242),char(2),char(252),char(255),char(195),char(1),char(242), +char(2),char(254),char(255),char(174),char(1),char(242),char(3),char(6),char(255),char(215), +char(1),char(242),char(3),char(8),char(255),char(215),char(1),char(242),char(3),char(14), +char(255),char(154),char(1),char(242),char(3),char(16),char(255),char(154),char(1),char(242), +char(3),char(24),char(255),char(154),char(1),char(243),char(0),char(5),char(255),char(133), +char(1),char(243),char(0),char(10),char(255),char(133),char(1),char(243),char(1),char(208), +char(255),char(215),char(1),char(243),char(1),char(220),char(255),char(154),char(1),char(243), +char(1),char(221),char(255),char(195),char(1),char(243),char(1),char(223),char(255),char(215), +char(1),char(243),char(1),char(225),char(255),char(174),char(1),char(243),char(1),char(228), +char(255),char(154),char(1),char(243),char(1),char(246),char(255),char(195),char(1),char(243), +char(2),char(7),char(255),char(133),char(1),char(243),char(2),char(11),char(255),char(133), +char(1),char(243),char(2),char(109),char(255),char(215),char(1),char(243),char(2),char(129), +char(255),char(215),char(1),char(243),char(2),char(131),char(255),char(215),char(1),char(243), +char(2),char(139),char(255),char(215),char(1),char(243),char(2),char(160),char(255),char(215), +char(1),char(243),char(2),char(170),char(255),char(154),char(1),char(243),char(2),char(182), +char(255),char(154),char(1),char(243),char(2),char(184),char(255),char(195),char(1),char(243), +char(2),char(186),char(255),char(195),char(1),char(243),char(2),char(188),char(255),char(215), +char(1),char(243),char(2),char(190),char(255),char(154),char(1),char(243),char(2),char(192), +char(255),char(174),char(1),char(243),char(2),char(194),char(255),char(174),char(1),char(243), +char(2),char(198),char(255),char(215),char(1),char(243),char(2),char(200),char(255),char(215), +char(1),char(243),char(2),char(203),char(255),char(215),char(1),char(243),char(2),char(213), +char(255),char(174),char(1),char(243),char(2),char(230),char(255),char(215),char(1),char(243), +char(2),char(234),char(255),char(215),char(1),char(243),char(2),char(248),char(255),char(195), +char(1),char(243),char(2),char(250),char(255),char(195),char(1),char(243),char(2),char(252), +char(255),char(195),char(1),char(243),char(2),char(254),char(255),char(174),char(1),char(243), +char(3),char(6),char(255),char(215),char(1),char(243),char(3),char(8),char(255),char(215), +char(1),char(243),char(3),char(14),char(255),char(154),char(1),char(243),char(3),char(16), +char(255),char(154),char(1),char(243),char(3),char(24),char(255),char(154),char(1),char(244), +char(0),char(5),char(255),char(236),char(1),char(244),char(0),char(10),char(255),char(236), +char(1),char(244),char(2),char(7),char(255),char(236),char(1),char(244),char(2),char(11), +char(255),char(236),char(1),char(244),char(3),char(14),char(255),char(215),char(1),char(244), +char(3),char(16),char(255),char(215),char(1),char(245),char(1),char(207),char(255),char(215), +char(1),char(245),char(1),char(216),char(255),char(215),char(1),char(245),char(1),char(219), +char(255),char(215),char(1),char(245),char(1),char(222),char(255),char(215),char(1),char(245), +char(1),char(225),char(255),char(215),char(1),char(245),char(1),char(234),char(255),char(215), +char(1),char(245),char(1),char(237),char(255),char(215),char(1),char(245),char(2),char(106), +char(255),char(215),char(1),char(245),char(2),char(127),char(255),char(215),char(1),char(245), +char(2),char(133),char(255),char(215),char(1),char(245),char(2),char(135),char(255),char(215), +char(1),char(245),char(2),char(137),char(255),char(215),char(1),char(245),char(2),char(141), +char(255),char(215),char(1),char(245),char(2),char(178),char(255),char(215),char(1),char(245), +char(2),char(180),char(255),char(215),char(1),char(245),char(2),char(192),char(255),char(215), +char(1),char(245),char(2),char(194),char(255),char(215),char(1),char(245),char(2),char(198), +char(255),char(215),char(1),char(245),char(2),char(200),char(255),char(215),char(1),char(245), +char(2),char(213),char(255),char(215),char(1),char(245),char(2),char(224),char(255),char(215), +char(1),char(245),char(2),char(240),char(255),char(215),char(1),char(245),char(2),char(242), +char(255),char(215),char(1),char(245),char(2),char(244),char(255),char(215),char(1),char(245), +char(2),char(254),char(255),char(215),char(1),char(245),char(3),char(10),char(255),char(215), +char(1),char(245),char(3),char(12),char(255),char(215),char(1),char(245),char(3),char(22), +char(255),char(215),char(1),char(245),char(3),char(26),char(255),char(215),char(1),char(246), +char(0),char(15),char(255),char(174),char(1),char(246),char(0),char(17),char(255),char(174), +char(1),char(246),char(1),char(206),char(255),char(215),char(1),char(246),char(1),char(213), +char(255),char(215),char(1),char(246),char(1),char(242),char(255),char(215),char(1),char(246), +char(2),char(8),char(255),char(174),char(1),char(246),char(2),char(12),char(255),char(174), +char(1),char(246),char(2),char(115),char(255),char(215),char(1),char(246),char(2),char(207), +char(255),char(215),char(1),char(246),char(3),char(18),char(255),char(215),char(1),char(246), +char(3),char(28),char(255),char(215),char(1),char(248),char(0),char(15),char(255),char(133), +char(1),char(248),char(0),char(16),char(255),char(174),char(1),char(248),char(0),char(17), +char(255),char(133),char(1),char(248),char(1),char(159),char(255),char(215),char(1),char(248), +char(1),char(164),char(255),char(154),char(1),char(248),char(1),char(170),char(255),char(113), +char(1),char(248),char(1),char(174),char(255),char(154),char(1),char(248),char(1),char(181), +char(255),char(154),char(1),char(248),char(1),char(184),char(255),char(215),char(1),char(248), +char(1),char(187),char(255),char(215),char(1),char(248),char(1),char(188),char(0),char(41), +char(1),char(248),char(1),char(190),char(255),char(174),char(1),char(248),char(1),char(204), +char(255),char(154),char(1),char(248),char(1),char(205),char(255),char(154),char(1),char(248), +char(1),char(206),char(255),char(133),char(1),char(248),char(1),char(207),char(255),char(113), +char(1),char(248),char(1),char(208),char(255),char(215),char(1),char(248),char(1),char(209), +char(255),char(215),char(1),char(248),char(1),char(210),char(255),char(154),char(1),char(248), +char(1),char(211),char(255),char(154),char(1),char(248),char(1),char(212),char(255),char(154), +char(1),char(248),char(1),char(213),char(255),char(133),char(1),char(248),char(1),char(214), +char(255),char(154),char(1),char(248),char(1),char(215),char(255),char(154),char(1),char(248), +char(1),char(216),char(255),char(113),char(1),char(248),char(1),char(217),char(255),char(154), +char(1),char(248),char(1),char(218),char(255),char(154),char(1),char(248),char(1),char(219), +char(255),char(113),char(1),char(248),char(1),char(220),char(255),char(174),char(1),char(248), +char(1),char(221),char(255),char(174),char(1),char(248),char(1),char(222),char(255),char(113), +char(1),char(248),char(1),char(223),char(255),char(215),char(1),char(248),char(1),char(224), +char(255),char(154),char(1),char(248),char(1),char(225),char(255),char(154),char(1),char(248), +char(1),char(226),char(255),char(154),char(1),char(248),char(1),char(227),char(255),char(154), +char(1),char(248),char(1),char(228),char(255),char(174),char(1),char(248),char(1),char(229), +char(255),char(154),char(1),char(248),char(1),char(230),char(255),char(154),char(1),char(248), +char(1),char(231),char(255),char(215),char(1),char(248),char(1),char(232),char(255),char(154), +char(1),char(248),char(1),char(233),char(255),char(195),char(1),char(248),char(1),char(234), +char(255),char(113),char(1),char(248),char(1),char(236),char(255),char(154),char(1),char(248), +char(1),char(237),char(255),char(113),char(1),char(248),char(1),char(238),char(255),char(133), +char(1),char(248),char(1),char(242),char(255),char(133),char(1),char(248),char(1),char(243), +char(255),char(154),char(1),char(248),char(1),char(245),char(255),char(154),char(1),char(248), +char(1),char(246),char(255),char(174),char(1),char(248),char(1),char(247),char(255),char(154), +char(1),char(248),char(1),char(249),char(255),char(154),char(1),char(248),char(2),char(2), +char(255),char(174),char(1),char(248),char(2),char(3),char(255),char(174),char(1),char(248), +char(2),char(4),char(255),char(174),char(1),char(248),char(2),char(8),char(255),char(133), +char(1),char(248),char(2),char(12),char(255),char(133),char(1),char(248),char(2),char(106), +char(255),char(113),char(1),char(248),char(2),char(107),char(255),char(154),char(1),char(248), +char(2),char(108),char(255),char(215),char(1),char(248),char(2),char(109),char(255),char(215), +char(1),char(248),char(2),char(113),char(255),char(154),char(1),char(248),char(2),char(114), +char(255),char(113),char(1),char(248),char(2),char(115),char(255),char(133),char(1),char(248), +char(2),char(117),char(255),char(154),char(1),char(248),char(2),char(119),char(255),char(154), +char(1),char(248),char(2),char(121),char(255),char(154),char(1),char(248),char(2),char(125), +char(255),char(154),char(1),char(248),char(2),char(126),char(255),char(215),char(1),char(248), +char(2),char(127),char(255),char(113),char(1),char(248),char(2),char(129),char(255),char(215), +char(1),char(248),char(2),char(131),char(255),char(215),char(1),char(248),char(2),char(132), +char(255),char(215),char(1),char(248),char(2),char(133),char(255),char(113),char(1),char(248), +char(2),char(134),char(255),char(215),char(1),char(248),char(2),char(135),char(255),char(113), +char(1),char(248),char(2),char(136),char(255),char(215),char(1),char(248),char(2),char(137), +char(255),char(113),char(1),char(248),char(2),char(138),char(255),char(215),char(1),char(248), +char(2),char(139),char(255),char(215),char(1),char(248),char(2),char(140),char(255),char(215), +char(1),char(248),char(2),char(141),char(255),char(113),char(1),char(248),char(2),char(150), +char(255),char(154),char(1),char(248),char(2),char(154),char(255),char(154),char(1),char(248), +char(2),char(158),char(255),char(154),char(1),char(248),char(2),char(160),char(255),char(215), +char(1),char(248),char(2),char(162),char(255),char(215),char(1),char(248),char(2),char(164), +char(255),char(154),char(1),char(248),char(2),char(166),char(255),char(154),char(1),char(248), +char(2),char(170),char(255),char(174),char(1),char(248),char(2),char(172),char(255),char(154), +char(1),char(248),char(2),char(174),char(255),char(154),char(1),char(248),char(2),char(176), +char(255),char(154),char(1),char(248),char(2),char(177),char(255),char(215),char(1),char(248), +char(2),char(178),char(255),char(113),char(1),char(248),char(2),char(179),char(255),char(215), +char(1),char(248),char(2),char(180),char(255),char(113),char(1),char(248),char(2),char(181), +char(0),char(41),char(1),char(248),char(2),char(182),char(255),char(174),char(1),char(248), +char(2),char(184),char(255),char(174),char(1),char(248),char(2),char(186),char(255),char(174), +char(1),char(248),char(2),char(188),char(255),char(215),char(1),char(248),char(2),char(190), +char(255),char(174),char(1),char(248),char(2),char(192),char(255),char(154),char(1),char(248), +char(2),char(194),char(255),char(154),char(1),char(248),char(2),char(196),char(255),char(154), +char(1),char(248),char(2),char(197),char(255),char(154),char(1),char(248),char(2),char(198), +char(255),char(113),char(1),char(248),char(2),char(199),char(255),char(154),char(1),char(248), +char(2),char(200),char(255),char(113),char(1),char(248),char(2),char(203),char(255),char(215), +char(1),char(248),char(2),char(205),char(255),char(154),char(1),char(248),char(2),char(206), +char(255),char(154),char(1),char(248),char(2),char(207),char(255),char(133),char(1),char(248), +char(2),char(209),char(255),char(154),char(1),char(248),char(2),char(211),char(255),char(154), +char(1),char(248),char(2),char(213),char(255),char(154),char(1),char(248),char(2),char(215), +char(255),char(154),char(1),char(248),char(2),char(217),char(255),char(113),char(1),char(248), +char(2),char(219),char(255),char(113),char(1),char(248),char(2),char(221),char(255),char(113), +char(1),char(248),char(2),char(224),char(255),char(113),char(1),char(248),char(2),char(230), +char(255),char(215),char(1),char(248),char(2),char(232),char(255),char(215),char(1),char(248), +char(2),char(234),char(255),char(195),char(1),char(248),char(2),char(236),char(255),char(154), +char(1),char(248),char(2),char(238),char(255),char(154),char(1),char(248),char(2),char(239), +char(255),char(215),char(1),char(248),char(2),char(240),char(255),char(113),char(1),char(248), +char(2),char(241),char(255),char(215),char(1),char(248),char(2),char(242),char(255),char(113), +char(1),char(248),char(2),char(243),char(255),char(215),char(1),char(248),char(2),char(244), +char(255),char(113),char(1),char(248),char(2),char(246),char(255),char(215),char(1),char(248), +char(2),char(248),char(255),char(174),char(1),char(248),char(2),char(250),char(255),char(174), +char(1),char(248),char(2),char(252),char(255),char(174),char(1),char(248),char(2),char(254), +char(255),char(154),char(1),char(248),char(3),char(0),char(255),char(154),char(1),char(248), +char(3),char(2),char(255),char(154),char(1),char(248),char(3),char(6),char(255),char(215), +char(1),char(248),char(3),char(8),char(255),char(215),char(1),char(248),char(3),char(9), +char(255),char(113),char(1),char(248),char(3),char(10),char(255),char(113),char(1),char(248), +char(3),char(11),char(255),char(113),char(1),char(248),char(3),char(12),char(255),char(113), +char(1),char(248),char(3),char(14),char(255),char(154),char(1),char(248),char(3),char(16), +char(255),char(154),char(1),char(248),char(3),char(17),char(255),char(154),char(1),char(248), +char(3),char(18),char(255),char(133),char(1),char(248),char(3),char(20),char(255),char(154), +char(1),char(248),char(3),char(21),char(255),char(215),char(1),char(248),char(3),char(22), +char(255),char(113),char(1),char(248),char(3),char(24),char(255),char(174),char(1),char(248), +char(3),char(26),char(255),char(113),char(1),char(248),char(3),char(27),char(255),char(154), +char(1),char(248),char(3),char(28),char(255),char(133),char(1),char(249),char(0),char(15), +char(255),char(154),char(1),char(249),char(0),char(16),char(255),char(215),char(1),char(249), +char(0),char(17),char(255),char(154),char(1),char(249),char(1),char(206),char(255),char(195), +char(1),char(249),char(1),char(207),char(255),char(236),char(1),char(249),char(1),char(213), +char(255),char(195),char(1),char(249),char(1),char(216),char(255),char(236),char(1),char(249), +char(1),char(219),char(255),char(236),char(1),char(249),char(1),char(222),char(255),char(236), +char(1),char(249),char(1),char(234),char(255),char(236),char(1),char(249),char(1),char(237), +char(255),char(236),char(1),char(249),char(1),char(242),char(255),char(195),char(1),char(249), +char(2),char(2),char(255),char(215),char(1),char(249),char(2),char(3),char(255),char(215), +char(1),char(249),char(2),char(4),char(255),char(215),char(1),char(249),char(2),char(8), +char(255),char(154),char(1),char(249),char(2),char(12),char(255),char(154),char(1),char(249), +char(2),char(106),char(255),char(236),char(1),char(249),char(2),char(115),char(255),char(195), +char(1),char(249),char(2),char(127),char(255),char(236),char(1),char(249),char(2),char(133), +char(255),char(236),char(1),char(249),char(2),char(135),char(255),char(236),char(1),char(249), +char(2),char(137),char(255),char(236),char(1),char(249),char(2),char(141),char(255),char(236), +char(1),char(249),char(2),char(178),char(255),char(236),char(1),char(249),char(2),char(180), +char(255),char(236),char(1),char(249),char(2),char(207),char(255),char(195),char(1),char(249), +char(2),char(224),char(255),char(236),char(1),char(249),char(2),char(240),char(255),char(236), +char(1),char(249),char(2),char(242),char(255),char(236),char(1),char(249),char(2),char(244), +char(255),char(236),char(1),char(249),char(3),char(10),char(255),char(236),char(1),char(249), +char(3),char(12),char(255),char(236),char(1),char(249),char(3),char(18),char(255),char(195), +char(1),char(249),char(3),char(22),char(255),char(236),char(1),char(249),char(3),char(26), +char(255),char(236),char(1),char(249),char(3),char(28),char(255),char(195),char(1),char(250), +char(0),char(15),char(255),char(154),char(1),char(250),char(0),char(17),char(255),char(154), +char(1),char(250),char(0),char(34),char(0),char(41),char(1),char(250),char(0),char(36), +char(255),char(174),char(1),char(250),char(0),char(38),char(255),char(236),char(1),char(250), +char(0),char(42),char(255),char(236),char(1),char(250),char(0),char(50),char(255),char(236), +char(1),char(250),char(0),char(52),char(255),char(236),char(1),char(250),char(0),char(68), +char(255),char(215),char(1),char(250),char(0),char(70),char(255),char(215),char(1),char(250), +char(0),char(71),char(255),char(215),char(1),char(250),char(0),char(72),char(255),char(215), +char(1),char(250),char(0),char(74),char(255),char(236),char(1),char(250),char(0),char(80), +char(255),char(236),char(1),char(250),char(0),char(81),char(255),char(236),char(1),char(250), +char(0),char(82),char(255),char(215),char(1),char(250),char(0),char(83),char(255),char(236), +char(1),char(250),char(0),char(84),char(255),char(215),char(1),char(250),char(0),char(85), +char(255),char(236),char(1),char(250),char(0),char(86),char(255),char(236),char(1),char(250), +char(0),char(88),char(255),char(236),char(1),char(250),char(0),char(130),char(255),char(174), +char(1),char(250),char(0),char(131),char(255),char(174),char(1),char(250),char(0),char(132), +char(255),char(174),char(1),char(250),char(0),char(133),char(255),char(174),char(1),char(250), +char(0),char(134),char(255),char(174),char(1),char(250),char(0),char(135),char(255),char(174), +char(1),char(250),char(0),char(137),char(255),char(236),char(1),char(250),char(0),char(148), +char(255),char(236),char(1),char(250),char(0),char(149),char(255),char(236),char(1),char(250), +char(0),char(150),char(255),char(236),char(1),char(250),char(0),char(151),char(255),char(236), +char(1),char(250),char(0),char(152),char(255),char(236),char(1),char(250),char(0),char(154), +char(255),char(236),char(1),char(250),char(0),char(162),char(255),char(215),char(1),char(250), +char(0),char(163),char(255),char(215),char(1),char(250),char(0),char(164),char(255),char(215), +char(1),char(250),char(0),char(165),char(255),char(215),char(1),char(250),char(0),char(166), +char(255),char(215),char(1),char(250),char(0),char(167),char(255),char(215),char(1),char(250), +char(0),char(168),char(255),char(215),char(1),char(250),char(0),char(169),char(255),char(215), +char(1),char(250),char(0),char(170),char(255),char(215),char(1),char(250),char(0),char(171), +char(255),char(215),char(1),char(250),char(0),char(172),char(255),char(215),char(1),char(250), +char(0),char(173),char(255),char(215),char(1),char(250),char(0),char(180),char(255),char(215), +char(1),char(250),char(0),char(181),char(255),char(215),char(1),char(250),char(0),char(182), +char(255),char(215),char(1),char(250),char(0),char(183),char(255),char(215),char(1),char(250), +char(0),char(184),char(255),char(215),char(1),char(250),char(0),char(186),char(255),char(215), +char(1),char(250),char(0),char(187),char(255),char(236),char(1),char(250),char(0),char(188), +char(255),char(236),char(1),char(250),char(0),char(189),char(255),char(236),char(1),char(250), +char(0),char(190),char(255),char(236),char(1),char(250),char(0),char(194),char(255),char(174), +char(1),char(250),char(0),char(195),char(255),char(215),char(1),char(250),char(0),char(196), +char(255),char(174),char(1),char(250),char(0),char(197),char(255),char(215),char(1),char(250), +char(0),char(198),char(255),char(174),char(1),char(250),char(0),char(199),char(255),char(215), +char(1),char(250),char(0),char(200),char(255),char(236),char(1),char(250),char(0),char(201), +char(255),char(215),char(1),char(250),char(0),char(202),char(255),char(236),char(1),char(250), +char(0),char(203),char(255),char(215),char(1),char(250),char(0),char(204),char(255),char(236), +char(1),char(250),char(0),char(205),char(255),char(215),char(1),char(250),char(0),char(206), +char(255),char(236),char(1),char(250),char(0),char(207),char(255),char(215),char(1),char(250), +char(0),char(209),char(255),char(215),char(1),char(250),char(0),char(211),char(255),char(215), +char(1),char(250),char(0),char(213),char(255),char(215),char(1),char(250),char(0),char(215), +char(255),char(215),char(1),char(250),char(0),char(217),char(255),char(215),char(1),char(250), +char(0),char(219),char(255),char(215),char(1),char(250),char(0),char(221),char(255),char(215), +char(1),char(250),char(0),char(222),char(255),char(236),char(1),char(250),char(0),char(223), +char(255),char(236),char(1),char(250),char(0),char(224),char(255),char(236),char(1),char(250), +char(0),char(225),char(255),char(236),char(1),char(250),char(0),char(226),char(255),char(236), +char(1),char(250),char(0),char(227),char(255),char(236),char(1),char(250),char(0),char(228), +char(255),char(236),char(1),char(250),char(0),char(229),char(255),char(236),char(1),char(250), +char(0),char(250),char(255),char(236),char(1),char(250),char(1),char(6),char(255),char(236), +char(1),char(250),char(1),char(8),char(255),char(236),char(1),char(250),char(1),char(13), +char(255),char(236),char(1),char(250),char(1),char(14),char(255),char(236),char(1),char(250), +char(1),char(15),char(255),char(215),char(1),char(250),char(1),char(16),char(255),char(236), +char(1),char(250),char(1),char(17),char(255),char(215),char(1),char(250),char(1),char(18), +char(255),char(236),char(1),char(250),char(1),char(19),char(255),char(215),char(1),char(250), +char(1),char(20),char(255),char(236),char(1),char(250),char(1),char(21),char(255),char(215), +char(1),char(250),char(1),char(23),char(255),char(236),char(1),char(250),char(1),char(25), +char(255),char(236),char(1),char(250),char(1),char(29),char(255),char(236),char(1),char(250), +char(1),char(33),char(255),char(236),char(1),char(250),char(1),char(43),char(255),char(236), +char(1),char(250),char(1),char(45),char(255),char(236),char(1),char(250),char(1),char(47), +char(255),char(236),char(1),char(250),char(1),char(49),char(255),char(236),char(1),char(250), +char(1),char(51),char(255),char(236),char(1),char(250),char(1),char(53),char(255),char(236), +char(1),char(250),char(1),char(67),char(255),char(174),char(1),char(250),char(1),char(68), +char(255),char(215),char(1),char(250),char(1),char(70),char(255),char(215),char(1),char(250), +char(1),char(71),char(255),char(236),char(1),char(250),char(1),char(72),char(255),char(215), +char(1),char(250),char(1),char(74),char(255),char(236),char(1),char(250),char(2),char(8), +char(255),char(154),char(1),char(250),char(2),char(12),char(255),char(154),char(1),char(250), +char(2),char(87),char(255),char(236),char(1),char(250),char(2),char(88),char(255),char(174), +char(1),char(250),char(2),char(89),char(255),char(215),char(1),char(250),char(2),char(95), +char(255),char(236),char(1),char(250),char(2),char(96),char(255),char(215),char(1),char(250), +char(2),char(98),char(255),char(236),char(1),char(250),char(3),char(29),char(255),char(174), +char(1),char(250),char(3),char(30),char(255),char(215),char(1),char(250),char(3),char(31), +char(255),char(174),char(1),char(250),char(3),char(32),char(255),char(215),char(1),char(250), +char(3),char(33),char(255),char(174),char(1),char(250),char(3),char(34),char(255),char(215), +char(1),char(250),char(3),char(35),char(255),char(174),char(1),char(250),char(3),char(37), +char(255),char(174),char(1),char(250),char(3),char(38),char(255),char(215),char(1),char(250), +char(3),char(39),char(255),char(174),char(1),char(250),char(3),char(40),char(255),char(215), +char(1),char(250),char(3),char(41),char(255),char(174),char(1),char(250),char(3),char(42), +char(255),char(215),char(1),char(250),char(3),char(43),char(255),char(174),char(1),char(250), +char(3),char(44),char(255),char(215),char(1),char(250),char(3),char(45),char(255),char(174), +char(1),char(250),char(3),char(46),char(255),char(215),char(1),char(250),char(3),char(47), +char(255),char(174),char(1),char(250),char(3),char(48),char(255),char(215),char(1),char(250), +char(3),char(49),char(255),char(174),char(1),char(250),char(3),char(50),char(255),char(215), +char(1),char(250),char(3),char(51),char(255),char(174),char(1),char(250),char(3),char(52), +char(255),char(215),char(1),char(250),char(3),char(54),char(255),char(215),char(1),char(250), +char(3),char(56),char(255),char(215),char(1),char(250),char(3),char(58),char(255),char(215), +char(1),char(250),char(3),char(60),char(255),char(215),char(1),char(250),char(3),char(64), +char(255),char(215),char(1),char(250),char(3),char(66),char(255),char(215),char(1),char(250), +char(3),char(68),char(255),char(215),char(1),char(250),char(3),char(73),char(255),char(236), +char(1),char(250),char(3),char(74),char(255),char(215),char(1),char(250),char(3),char(75), +char(255),char(236),char(1),char(250),char(3),char(76),char(255),char(215),char(1),char(250), +char(3),char(77),char(255),char(236),char(1),char(250),char(3),char(78),char(255),char(215), +char(1),char(250),char(3),char(79),char(255),char(236),char(1),char(250),char(3),char(81), +char(255),char(236),char(1),char(250),char(3),char(82),char(255),char(215),char(1),char(250), +char(3),char(83),char(255),char(236),char(1),char(250),char(3),char(84),char(255),char(215), +char(1),char(250),char(3),char(85),char(255),char(236),char(1),char(250),char(3),char(86), +char(255),char(215),char(1),char(250),char(3),char(87),char(255),char(236),char(1),char(250), +char(3),char(88),char(255),char(215),char(1),char(250),char(3),char(89),char(255),char(236), +char(1),char(250),char(3),char(90),char(255),char(215),char(1),char(250),char(3),char(91), +char(255),char(236),char(1),char(250),char(3),char(92),char(255),char(215),char(1),char(250), +char(3),char(93),char(255),char(236),char(1),char(250),char(3),char(94),char(255),char(215), +char(1),char(250),char(3),char(95),char(255),char(236),char(1),char(250),char(3),char(96), +char(255),char(215),char(1),char(250),char(3),char(98),char(255),char(236),char(1),char(250), +char(3),char(100),char(255),char(236),char(1),char(250),char(3),char(102),char(255),char(236), +char(1),char(250),char(3),char(104),char(255),char(236),char(1),char(250),char(3),char(106), +char(255),char(236),char(1),char(250),char(3),char(108),char(255),char(236),char(1),char(250), +char(3),char(110),char(255),char(236),char(1),char(251),char(0),char(5),char(0),char(82), +char(1),char(251),char(0),char(10),char(0),char(82),char(1),char(251),char(0),char(15), +char(255),char(174),char(1),char(251),char(0),char(17),char(255),char(174),char(1),char(251), +char(0),char(34),char(0),char(41),char(1),char(251),char(2),char(7),char(0),char(82), +char(1),char(251),char(2),char(8),char(255),char(174),char(1),char(251),char(2),char(11), +char(0),char(82),char(1),char(251),char(2),char(12),char(255),char(174),char(1),char(252), +char(0),char(15),char(255),char(154),char(1),char(252),char(0),char(17),char(255),char(154), +char(1),char(252),char(0),char(34),char(0),char(41),char(1),char(252),char(0),char(36), +char(255),char(174),char(1),char(252),char(0),char(38),char(255),char(236),char(1),char(252), +char(0),char(42),char(255),char(236),char(1),char(252),char(0),char(50),char(255),char(236), +char(1),char(252),char(0),char(52),char(255),char(236),char(1),char(252),char(0),char(68), +char(255),char(215),char(1),char(252),char(0),char(70),char(255),char(215),char(1),char(252), +char(0),char(71),char(255),char(215),char(1),char(252),char(0),char(72),char(255),char(215), +char(1),char(252),char(0),char(74),char(255),char(236),char(1),char(252),char(0),char(80), +char(255),char(236),char(1),char(252),char(0),char(81),char(255),char(236),char(1),char(252), +char(0),char(82),char(255),char(215),char(1),char(252),char(0),char(83),char(255),char(236), +char(1),char(252),char(0),char(84),char(255),char(215),char(1),char(252),char(0),char(85), +char(255),char(236),char(1),char(252),char(0),char(86),char(255),char(236),char(1),char(252), +char(0),char(88),char(255),char(236),char(1),char(252),char(0),char(130),char(255),char(174), +char(1),char(252),char(0),char(131),char(255),char(174),char(1),char(252),char(0),char(132), +char(255),char(174),char(1),char(252),char(0),char(133),char(255),char(174),char(1),char(252), +char(0),char(134),char(255),char(174),char(1),char(252),char(0),char(135),char(255),char(174), +char(1),char(252),char(0),char(137),char(255),char(236),char(1),char(252),char(0),char(148), +char(255),char(236),char(1),char(252),char(0),char(149),char(255),char(236),char(1),char(252), +char(0),char(150),char(255),char(236),char(1),char(252),char(0),char(151),char(255),char(236), +char(1),char(252),char(0),char(152),char(255),char(236),char(1),char(252),char(0),char(154), +char(255),char(236),char(1),char(252),char(0),char(162),char(255),char(215),char(1),char(252), +char(0),char(163),char(255),char(215),char(1),char(252),char(0),char(164),char(255),char(215), +char(1),char(252),char(0),char(165),char(255),char(215),char(1),char(252),char(0),char(166), +char(255),char(215),char(1),char(252),char(0),char(167),char(255),char(215),char(1),char(252), +char(0),char(168),char(255),char(215),char(1),char(252),char(0),char(169),char(255),char(215), +char(1),char(252),char(0),char(170),char(255),char(215),char(1),char(252),char(0),char(171), +char(255),char(215),char(1),char(252),char(0),char(172),char(255),char(215),char(1),char(252), +char(0),char(173),char(255),char(215),char(1),char(252),char(0),char(180),char(255),char(215), +char(1),char(252),char(0),char(181),char(255),char(215),char(1),char(252),char(0),char(182), +char(255),char(215),char(1),char(252),char(0),char(183),char(255),char(215),char(1),char(252), +char(0),char(184),char(255),char(215),char(1),char(252),char(0),char(186),char(255),char(215), +char(1),char(252),char(0),char(187),char(255),char(236),char(1),char(252),char(0),char(188), +char(255),char(236),char(1),char(252),char(0),char(189),char(255),char(236),char(1),char(252), +char(0),char(190),char(255),char(236),char(1),char(252),char(0),char(194),char(255),char(174), +char(1),char(252),char(0),char(195),char(255),char(215),char(1),char(252),char(0),char(196), +char(255),char(174),char(1),char(252),char(0),char(197),char(255),char(215),char(1),char(252), +char(0),char(198),char(255),char(174),char(1),char(252),char(0),char(199),char(255),char(215), +char(1),char(252),char(0),char(200),char(255),char(236),char(1),char(252),char(0),char(201), +char(255),char(215),char(1),char(252),char(0),char(202),char(255),char(236),char(1),char(252), +char(0),char(203),char(255),char(215),char(1),char(252),char(0),char(204),char(255),char(236), +char(1),char(252),char(0),char(205),char(255),char(215),char(1),char(252),char(0),char(206), +char(255),char(236),char(1),char(252),char(0),char(207),char(255),char(215),char(1),char(252), +char(0),char(209),char(255),char(215),char(1),char(252),char(0),char(211),char(255),char(215), +char(1),char(252),char(0),char(213),char(255),char(215),char(1),char(252),char(0),char(215), +char(255),char(215),char(1),char(252),char(0),char(217),char(255),char(215),char(1),char(252), +char(0),char(219),char(255),char(215),char(1),char(252),char(0),char(221),char(255),char(215), +char(1),char(252),char(0),char(222),char(255),char(236),char(1),char(252),char(0),char(223), +char(255),char(236),char(1),char(252),char(0),char(224),char(255),char(236),char(1),char(252), +char(0),char(225),char(255),char(236),char(1),char(252),char(0),char(226),char(255),char(236), +char(1),char(252),char(0),char(227),char(255),char(236),char(1),char(252),char(0),char(228), +char(255),char(236),char(1),char(252),char(0),char(229),char(255),char(236),char(1),char(252), +char(0),char(250),char(255),char(236),char(1),char(252),char(1),char(6),char(255),char(236), +char(1),char(252),char(1),char(8),char(255),char(236),char(1),char(252),char(1),char(13), +char(255),char(236),char(1),char(252),char(1),char(14),char(255),char(236),char(1),char(252), +char(1),char(15),char(255),char(215),char(1),char(252),char(1),char(16),char(255),char(236), +char(1),char(252),char(1),char(17),char(255),char(215),char(1),char(252),char(1),char(18), +char(255),char(236),char(1),char(252),char(1),char(19),char(255),char(215),char(1),char(252), +char(1),char(20),char(255),char(236),char(1),char(252),char(1),char(21),char(255),char(215), +char(1),char(252),char(1),char(23),char(255),char(236),char(1),char(252),char(1),char(25), +char(255),char(236),char(1),char(252),char(1),char(29),char(255),char(236),char(1),char(252), +char(1),char(33),char(255),char(236),char(1),char(252),char(1),char(43),char(255),char(236), +char(1),char(252),char(1),char(45),char(255),char(236),char(1),char(252),char(1),char(47), +char(255),char(236),char(1),char(252),char(1),char(49),char(255),char(236),char(1),char(252), +char(1),char(51),char(255),char(236),char(1),char(252),char(1),char(53),char(255),char(236), +char(1),char(252),char(1),char(67),char(255),char(174),char(1),char(252),char(1),char(68), +char(255),char(215),char(1),char(252),char(1),char(70),char(255),char(215),char(1),char(252), +char(1),char(71),char(255),char(236),char(1),char(252),char(1),char(72),char(255),char(215), +char(1),char(252),char(1),char(74),char(255),char(236),char(1),char(252),char(2),char(8), +char(255),char(154),char(1),char(252),char(2),char(12),char(255),char(154),char(1),char(252), +char(2),char(87),char(255),char(236),char(1),char(252),char(2),char(88),char(255),char(174), +char(1),char(252),char(2),char(89),char(255),char(215),char(1),char(252),char(2),char(95), +char(255),char(236),char(1),char(252),char(2),char(96),char(255),char(215),char(1),char(252), +char(2),char(98),char(255),char(236),char(1),char(252),char(3),char(29),char(255),char(174), +char(1),char(252),char(3),char(30),char(255),char(215),char(1),char(252),char(3),char(31), +char(255),char(174),char(1),char(252),char(3),char(32),char(255),char(215),char(1),char(252), +char(3),char(33),char(255),char(174),char(1),char(252),char(3),char(34),char(255),char(215), +char(1),char(252),char(3),char(35),char(255),char(174),char(1),char(252),char(3),char(37), +char(255),char(174),char(1),char(252),char(3),char(38),char(255),char(215),char(1),char(252), +char(3),char(39),char(255),char(174),char(1),char(252),char(3),char(40),char(255),char(215), +char(1),char(252),char(3),char(41),char(255),char(174),char(1),char(252),char(3),char(42), +char(255),char(215),char(1),char(252),char(3),char(43),char(255),char(174),char(1),char(252), +char(3),char(44),char(255),char(215),char(1),char(252),char(3),char(45),char(255),char(174), +char(1),char(252),char(3),char(46),char(255),char(215),char(1),char(252),char(3),char(47), +char(255),char(174),char(1),char(252),char(3),char(48),char(255),char(215),char(1),char(252), +char(3),char(49),char(255),char(174),char(1),char(252),char(3),char(50),char(255),char(215), +char(1),char(252),char(3),char(51),char(255),char(174),char(1),char(252),char(3),char(52), +char(255),char(215),char(1),char(252),char(3),char(54),char(255),char(215),char(1),char(252), +char(3),char(56),char(255),char(215),char(1),char(252),char(3),char(58),char(255),char(215), +char(1),char(252),char(3),char(60),char(255),char(215),char(1),char(252),char(3),char(64), +char(255),char(215),char(1),char(252),char(3),char(66),char(255),char(215),char(1),char(252), +char(3),char(68),char(255),char(215),char(1),char(252),char(3),char(73),char(255),char(236), +char(1),char(252),char(3),char(74),char(255),char(215),char(1),char(252),char(3),char(75), +char(255),char(236),char(1),char(252),char(3),char(76),char(255),char(215),char(1),char(252), +char(3),char(77),char(255),char(236),char(1),char(252),char(3),char(78),char(255),char(215), +char(1),char(252),char(3),char(79),char(255),char(236),char(1),char(252),char(3),char(81), +char(255),char(236),char(1),char(252),char(3),char(82),char(255),char(215),char(1),char(252), +char(3),char(83),char(255),char(236),char(1),char(252),char(3),char(84),char(255),char(215), +char(1),char(252),char(3),char(85),char(255),char(236),char(1),char(252),char(3),char(86), +char(255),char(215),char(1),char(252),char(3),char(87),char(255),char(236),char(1),char(252), +char(3),char(88),char(255),char(215),char(1),char(252),char(3),char(89),char(255),char(236), +char(1),char(252),char(3),char(90),char(255),char(215),char(1),char(252),char(3),char(91), +char(255),char(236),char(1),char(252),char(3),char(92),char(255),char(215),char(1),char(252), +char(3),char(93),char(255),char(236),char(1),char(252),char(3),char(94),char(255),char(215), +char(1),char(252),char(3),char(95),char(255),char(236),char(1),char(252),char(3),char(96), +char(255),char(215),char(1),char(252),char(3),char(98),char(255),char(236),char(1),char(252), +char(3),char(100),char(255),char(236),char(1),char(252),char(3),char(102),char(255),char(236), +char(1),char(252),char(3),char(104),char(255),char(236),char(1),char(252),char(3),char(106), +char(255),char(236),char(1),char(252),char(3),char(108),char(255),char(236),char(1),char(252), +char(3),char(110),char(255),char(236),char(1),char(253),char(0),char(5),char(0),char(82), +char(1),char(253),char(0),char(10),char(0),char(82),char(1),char(253),char(0),char(15), +char(255),char(174),char(1),char(253),char(0),char(17),char(255),char(174),char(1),char(253), +char(0),char(34),char(0),char(41),char(1),char(253),char(2),char(7),char(0),char(82), +char(1),char(253),char(2),char(8),char(255),char(174),char(1),char(253),char(2),char(11), +char(0),char(82),char(1),char(253),char(2),char(12),char(255),char(174),char(1),char(254), +char(0),char(15),char(255),char(154),char(1),char(254),char(0),char(17),char(255),char(154), +char(1),char(254),char(0),char(34),char(0),char(41),char(1),char(254),char(0),char(36), +char(255),char(174),char(1),char(254),char(0),char(38),char(255),char(236),char(1),char(254), +char(0),char(42),char(255),char(236),char(1),char(254),char(0),char(50),char(255),char(236), +char(1),char(254),char(0),char(52),char(255),char(236),char(1),char(254),char(0),char(68), +char(255),char(215),char(1),char(254),char(0),char(70),char(255),char(215),char(1),char(254), +char(0),char(71),char(255),char(215),char(1),char(254),char(0),char(72),char(255),char(215), +char(1),char(254),char(0),char(74),char(255),char(236),char(1),char(254),char(0),char(80), +char(255),char(236),char(1),char(254),char(0),char(81),char(255),char(236),char(1),char(254), +char(0),char(82),char(255),char(215),char(1),char(254),char(0),char(83),char(255),char(236), +char(1),char(254),char(0),char(84),char(255),char(215),char(1),char(254),char(0),char(85), +char(255),char(236),char(1),char(254),char(0),char(86),char(255),char(236),char(1),char(254), +char(0),char(88),char(255),char(236),char(1),char(254),char(0),char(130),char(255),char(174), +char(1),char(254),char(0),char(131),char(255),char(174),char(1),char(254),char(0),char(132), +char(255),char(174),char(1),char(254),char(0),char(133),char(255),char(174),char(1),char(254), +char(0),char(134),char(255),char(174),char(1),char(254),char(0),char(135),char(255),char(174), +char(1),char(254),char(0),char(137),char(255),char(236),char(1),char(254),char(0),char(148), +char(255),char(236),char(1),char(254),char(0),char(149),char(255),char(236),char(1),char(254), +char(0),char(150),char(255),char(236),char(1),char(254),char(0),char(151),char(255),char(236), +char(1),char(254),char(0),char(152),char(255),char(236),char(1),char(254),char(0),char(154), +char(255),char(236),char(1),char(254),char(0),char(162),char(255),char(215),char(1),char(254), +char(0),char(163),char(255),char(215),char(1),char(254),char(0),char(164),char(255),char(215), +char(1),char(254),char(0),char(165),char(255),char(215),char(1),char(254),char(0),char(166), +char(255),char(215),char(1),char(254),char(0),char(167),char(255),char(215),char(1),char(254), +char(0),char(168),char(255),char(215),char(1),char(254),char(0),char(169),char(255),char(215), +char(1),char(254),char(0),char(170),char(255),char(215),char(1),char(254),char(0),char(171), +char(255),char(215),char(1),char(254),char(0),char(172),char(255),char(215),char(1),char(254), +char(0),char(173),char(255),char(215),char(1),char(254),char(0),char(180),char(255),char(215), +char(1),char(254),char(0),char(181),char(255),char(215),char(1),char(254),char(0),char(182), +char(255),char(215),char(1),char(254),char(0),char(183),char(255),char(215),char(1),char(254), +char(0),char(184),char(255),char(215),char(1),char(254),char(0),char(186),char(255),char(215), +char(1),char(254),char(0),char(187),char(255),char(236),char(1),char(254),char(0),char(188), +char(255),char(236),char(1),char(254),char(0),char(189),char(255),char(236),char(1),char(254), +char(0),char(190),char(255),char(236),char(1),char(254),char(0),char(194),char(255),char(174), +char(1),char(254),char(0),char(195),char(255),char(215),char(1),char(254),char(0),char(196), +char(255),char(174),char(1),char(254),char(0),char(197),char(255),char(215),char(1),char(254), +char(0),char(198),char(255),char(174),char(1),char(254),char(0),char(199),char(255),char(215), +char(1),char(254),char(0),char(200),char(255),char(236),char(1),char(254),char(0),char(201), +char(255),char(215),char(1),char(254),char(0),char(202),char(255),char(236),char(1),char(254), +char(0),char(203),char(255),char(215),char(1),char(254),char(0),char(204),char(255),char(236), +char(1),char(254),char(0),char(205),char(255),char(215),char(1),char(254),char(0),char(206), +char(255),char(236),char(1),char(254),char(0),char(207),char(255),char(215),char(1),char(254), +char(0),char(209),char(255),char(215),char(1),char(254),char(0),char(211),char(255),char(215), +char(1),char(254),char(0),char(213),char(255),char(215),char(1),char(254),char(0),char(215), +char(255),char(215),char(1),char(254),char(0),char(217),char(255),char(215),char(1),char(254), +char(0),char(219),char(255),char(215),char(1),char(254),char(0),char(221),char(255),char(215), +char(1),char(254),char(0),char(222),char(255),char(236),char(1),char(254),char(0),char(223), +char(255),char(236),char(1),char(254),char(0),char(224),char(255),char(236),char(1),char(254), +char(0),char(225),char(255),char(236),char(1),char(254),char(0),char(226),char(255),char(236), +char(1),char(254),char(0),char(227),char(255),char(236),char(1),char(254),char(0),char(228), +char(255),char(236),char(1),char(254),char(0),char(229),char(255),char(236),char(1),char(254), +char(0),char(250),char(255),char(236),char(1),char(254),char(1),char(6),char(255),char(236), +char(1),char(254),char(1),char(8),char(255),char(236),char(1),char(254),char(1),char(13), +char(255),char(236),char(1),char(254),char(1),char(14),char(255),char(236),char(1),char(254), +char(1),char(15),char(255),char(215),char(1),char(254),char(1),char(16),char(255),char(236), +char(1),char(254),char(1),char(17),char(255),char(215),char(1),char(254),char(1),char(18), +char(255),char(236),char(1),char(254),char(1),char(19),char(255),char(215),char(1),char(254), +char(1),char(20),char(255),char(236),char(1),char(254),char(1),char(21),char(255),char(215), +char(1),char(254),char(1),char(23),char(255),char(236),char(1),char(254),char(1),char(25), +char(255),char(236),char(1),char(254),char(1),char(29),char(255),char(236),char(1),char(254), +char(1),char(33),char(255),char(236),char(1),char(254),char(1),char(43),char(255),char(236), +char(1),char(254),char(1),char(45),char(255),char(236),char(1),char(254),char(1),char(47), +char(255),char(236),char(1),char(254),char(1),char(49),char(255),char(236),char(1),char(254), +char(1),char(51),char(255),char(236),char(1),char(254),char(1),char(53),char(255),char(236), +char(1),char(254),char(1),char(67),char(255),char(174),char(1),char(254),char(1),char(68), +char(255),char(215),char(1),char(254),char(1),char(70),char(255),char(215),char(1),char(254), +char(1),char(71),char(255),char(236),char(1),char(254),char(1),char(72),char(255),char(215), +char(1),char(254),char(1),char(74),char(255),char(236),char(1),char(254),char(2),char(8), +char(255),char(154),char(1),char(254),char(2),char(12),char(255),char(154),char(1),char(254), +char(2),char(87),char(255),char(236),char(1),char(254),char(2),char(88),char(255),char(174), +char(1),char(254),char(2),char(89),char(255),char(215),char(1),char(254),char(2),char(95), +char(255),char(236),char(1),char(254),char(2),char(96),char(255),char(215),char(1),char(254), +char(2),char(98),char(255),char(236),char(1),char(254),char(3),char(29),char(255),char(174), +char(1),char(254),char(3),char(30),char(255),char(215),char(1),char(254),char(3),char(31), +char(255),char(174),char(1),char(254),char(3),char(32),char(255),char(215),char(1),char(254), +char(3),char(33),char(255),char(174),char(1),char(254),char(3),char(34),char(255),char(215), +char(1),char(254),char(3),char(35),char(255),char(174),char(1),char(254),char(3),char(37), +char(255),char(174),char(1),char(254),char(3),char(38),char(255),char(215),char(1),char(254), +char(3),char(39),char(255),char(174),char(1),char(254),char(3),char(40),char(255),char(215), +char(1),char(254),char(3),char(41),char(255),char(174),char(1),char(254),char(3),char(42), +char(255),char(215),char(1),char(254),char(3),char(43),char(255),char(174),char(1),char(254), +char(3),char(44),char(255),char(215),char(1),char(254),char(3),char(45),char(255),char(174), +char(1),char(254),char(3),char(46),char(255),char(215),char(1),char(254),char(3),char(47), +char(255),char(174),char(1),char(254),char(3),char(48),char(255),char(215),char(1),char(254), +char(3),char(49),char(255),char(174),char(1),char(254),char(3),char(50),char(255),char(215), +char(1),char(254),char(3),char(51),char(255),char(174),char(1),char(254),char(3),char(52), +char(255),char(215),char(1),char(254),char(3),char(54),char(255),char(215),char(1),char(254), +char(3),char(56),char(255),char(215),char(1),char(254),char(3),char(58),char(255),char(215), +char(1),char(254),char(3),char(60),char(255),char(215),char(1),char(254),char(3),char(64), +char(255),char(215),char(1),char(254),char(3),char(66),char(255),char(215),char(1),char(254), +char(3),char(68),char(255),char(215),char(1),char(254),char(3),char(73),char(255),char(236), +char(1),char(254),char(3),char(74),char(255),char(215),char(1),char(254),char(3),char(75), +char(255),char(236),char(1),char(254),char(3),char(76),char(255),char(215),char(1),char(254), +char(3),char(77),char(255),char(236),char(1),char(254),char(3),char(78),char(255),char(215), +char(1),char(254),char(3),char(79),char(255),char(236),char(1),char(254),char(3),char(81), +char(255),char(236),char(1),char(254),char(3),char(82),char(255),char(215),char(1),char(254), +char(3),char(83),char(255),char(236),char(1),char(254),char(3),char(84),char(255),char(215), +char(1),char(254),char(3),char(85),char(255),char(236),char(1),char(254),char(3),char(86), +char(255),char(215),char(1),char(254),char(3),char(87),char(255),char(236),char(1),char(254), +char(3),char(88),char(255),char(215),char(1),char(254),char(3),char(89),char(255),char(236), +char(1),char(254),char(3),char(90),char(255),char(215),char(1),char(254),char(3),char(91), +char(255),char(236),char(1),char(254),char(3),char(92),char(255),char(215),char(1),char(254), +char(3),char(93),char(255),char(236),char(1),char(254),char(3),char(94),char(255),char(215), +char(1),char(254),char(3),char(95),char(255),char(236),char(1),char(254),char(3),char(96), +char(255),char(215),char(1),char(254),char(3),char(98),char(255),char(236),char(1),char(254), +char(3),char(100),char(255),char(236),char(1),char(254),char(3),char(102),char(255),char(236), +char(1),char(254),char(3),char(104),char(255),char(236),char(1),char(254),char(3),char(106), +char(255),char(236),char(1),char(254),char(3),char(108),char(255),char(236),char(1),char(254), +char(3),char(110),char(255),char(236),char(1),char(255),char(0),char(5),char(0),char(82), +char(1),char(255),char(0),char(10),char(0),char(82),char(1),char(255),char(0),char(15), +char(255),char(174),char(1),char(255),char(0),char(17),char(255),char(174),char(1),char(255), +char(0),char(34),char(0),char(41),char(1),char(255),char(2),char(7),char(0),char(82), +char(1),char(255),char(2),char(8),char(255),char(174),char(1),char(255),char(2),char(11), +char(0),char(82),char(1),char(255),char(2),char(12),char(255),char(174),char(2),char(0), +char(0),char(15),char(255),char(133),char(2),char(0),char(0),char(17),char(255),char(133), +char(2),char(0),char(0),char(34),char(0),char(41),char(2),char(0),char(0),char(36), +char(255),char(133),char(2),char(0),char(0),char(38),char(255),char(215),char(2),char(0), +char(0),char(42),char(255),char(215),char(2),char(0),char(0),char(50),char(255),char(215), +char(2),char(0),char(0),char(52),char(255),char(215),char(2),char(0),char(0),char(68), +char(255),char(154),char(2),char(0),char(0),char(70),char(255),char(154),char(2),char(0), +char(0),char(71),char(255),char(154),char(2),char(0),char(0),char(72),char(255),char(154), +char(2),char(0),char(0),char(74),char(255),char(215),char(2),char(0),char(0),char(80), +char(255),char(195),char(2),char(0),char(0),char(81),char(255),char(195),char(2),char(0), +char(0),char(82),char(255),char(154),char(2),char(0),char(0),char(83),char(255),char(195), +char(2),char(0),char(0),char(84),char(255),char(154),char(2),char(0),char(0),char(85), +char(255),char(195),char(2),char(0),char(0),char(86),char(255),char(174),char(2),char(0), +char(0),char(88),char(255),char(195),char(2),char(0),char(0),char(93),char(255),char(215), +char(2),char(0),char(0),char(130),char(255),char(133),char(2),char(0),char(0),char(131), +char(255),char(133),char(2),char(0),char(0),char(132),char(255),char(133),char(2),char(0), +char(0),char(133),char(255),char(133),char(2),char(0),char(0),char(134),char(255),char(133), +char(2),char(0),char(0),char(135),char(255),char(133),char(2),char(0),char(0),char(137), +char(255),char(215),char(2),char(0),char(0),char(148),char(255),char(215),char(2),char(0), +char(0),char(149),char(255),char(215),char(2),char(0),char(0),char(150),char(255),char(215), +char(2),char(0),char(0),char(151),char(255),char(215),char(2),char(0),char(0),char(152), +char(255),char(215),char(2),char(0),char(0),char(154),char(255),char(215),char(2),char(0), +char(0),char(162),char(255),char(154),char(2),char(0),char(0),char(163),char(255),char(154), +char(2),char(0),char(0),char(164),char(255),char(154),char(2),char(0),char(0),char(165), +char(255),char(154),char(2),char(0),char(0),char(166),char(255),char(154),char(2),char(0), +char(0),char(167),char(255),char(154),char(2),char(0),char(0),char(168),char(255),char(154), +char(2),char(0),char(0),char(169),char(255),char(154),char(2),char(0),char(0),char(170), +char(255),char(154),char(2),char(0),char(0),char(171),char(255),char(154),char(2),char(0), +char(0),char(172),char(255),char(154),char(2),char(0),char(0),char(173),char(255),char(154), +char(2),char(0),char(0),char(180),char(255),char(154),char(2),char(0),char(0),char(181), +char(255),char(154),char(2),char(0),char(0),char(182),char(255),char(154),char(2),char(0), +char(0),char(183),char(255),char(154),char(2),char(0),char(0),char(184),char(255),char(154), +char(2),char(0),char(0),char(186),char(255),char(154),char(2),char(0),char(0),char(187), +char(255),char(195),char(2),char(0),char(0),char(188),char(255),char(195),char(2),char(0), +char(0),char(189),char(255),char(195),char(2),char(0),char(0),char(190),char(255),char(195), +char(2),char(0),char(0),char(194),char(255),char(133),char(2),char(0),char(0),char(195), +char(255),char(154),char(2),char(0),char(0),char(196),char(255),char(133),char(2),char(0), +char(0),char(197),char(255),char(154),char(2),char(0),char(0),char(198),char(255),char(133), +char(2),char(0),char(0),char(199),char(255),char(154),char(2),char(0),char(0),char(200), +char(255),char(215),char(2),char(0),char(0),char(201),char(255),char(154),char(2),char(0), +char(0),char(202),char(255),char(215),char(2),char(0),char(0),char(203),char(255),char(154), +char(2),char(0),char(0),char(204),char(255),char(215),char(2),char(0),char(0),char(205), +char(255),char(154),char(2),char(0),char(0),char(206),char(255),char(215),char(2),char(0), +char(0),char(207),char(255),char(154),char(2),char(0),char(0),char(209),char(255),char(154), +char(2),char(0),char(0),char(211),char(255),char(154),char(2),char(0),char(0),char(213), +char(255),char(154),char(2),char(0),char(0),char(215),char(255),char(154),char(2),char(0), +char(0),char(217),char(255),char(154),char(2),char(0),char(0),char(219),char(255),char(154), +char(2),char(0),char(0),char(221),char(255),char(154),char(2),char(0),char(0),char(222), +char(255),char(215),char(2),char(0),char(0),char(223),char(255),char(215),char(2),char(0), +char(0),char(224),char(255),char(215),char(2),char(0),char(0),char(225),char(255),char(215), +char(2),char(0),char(0),char(226),char(255),char(215),char(2),char(0),char(0),char(227), +char(255),char(215),char(2),char(0),char(0),char(228),char(255),char(215),char(2),char(0), +char(0),char(229),char(255),char(215),char(2),char(0),char(0),char(250),char(255),char(195), +char(2),char(0),char(1),char(6),char(255),char(195),char(2),char(0),char(1),char(8), +char(255),char(195),char(2),char(0),char(1),char(13),char(255),char(195),char(2),char(0), +char(1),char(14),char(255),char(215),char(2),char(0),char(1),char(15),char(255),char(154), +char(2),char(0),char(1),char(16),char(255),char(215),char(2),char(0),char(1),char(17), +char(255),char(154),char(2),char(0),char(1),char(18),char(255),char(215),char(2),char(0), +char(1),char(19),char(255),char(154),char(2),char(0),char(1),char(20),char(255),char(215), +char(2),char(0),char(1),char(21),char(255),char(154),char(2),char(0),char(1),char(23), +char(255),char(195),char(2),char(0),char(1),char(25),char(255),char(195),char(2),char(0), +char(1),char(29),char(255),char(174),char(2),char(0),char(1),char(33),char(255),char(174), +char(2),char(0),char(1),char(43),char(255),char(195),char(2),char(0),char(1),char(45), +char(255),char(195),char(2),char(0),char(1),char(47),char(255),char(195),char(2),char(0), +char(1),char(49),char(255),char(195),char(2),char(0),char(1),char(51),char(255),char(195), +char(2),char(0),char(1),char(53),char(255),char(195),char(2),char(0),char(1),char(60), +char(255),char(215),char(2),char(0),char(1),char(62),char(255),char(215),char(2),char(0), +char(1),char(64),char(255),char(215),char(2),char(0),char(1),char(67),char(255),char(133), +char(2),char(0),char(1),char(68),char(255),char(154),char(2),char(0),char(1),char(70), +char(255),char(154),char(2),char(0),char(1),char(71),char(255),char(215),char(2),char(0), +char(1),char(72),char(255),char(154),char(2),char(0),char(1),char(74),char(255),char(174), +char(2),char(0),char(2),char(8),char(255),char(133),char(2),char(0),char(2),char(12), +char(255),char(133),char(2),char(0),char(2),char(87),char(255),char(195),char(2),char(0), +char(2),char(88),char(255),char(133),char(2),char(0),char(2),char(89),char(255),char(154), +char(2),char(0),char(2),char(95),char(255),char(215),char(2),char(0),char(2),char(96), +char(255),char(154),char(2),char(0),char(2),char(98),char(255),char(195),char(2),char(0), +char(3),char(29),char(255),char(133),char(2),char(0),char(3),char(30),char(255),char(154), +char(2),char(0),char(3),char(31),char(255),char(133),char(2),char(0),char(3),char(32), +char(255),char(154),char(2),char(0),char(3),char(33),char(255),char(133),char(2),char(0), +char(3),char(34),char(255),char(154),char(2),char(0),char(3),char(35),char(255),char(133), +char(2),char(0),char(3),char(37),char(255),char(133),char(2),char(0),char(3),char(38), +char(255),char(154),char(2),char(0),char(3),char(39),char(255),char(133),char(2),char(0), +char(3),char(40),char(255),char(154),char(2),char(0),char(3),char(41),char(255),char(133), +char(2),char(0),char(3),char(42),char(255),char(154),char(2),char(0),char(3),char(43), +char(255),char(133),char(2),char(0),char(3),char(44),char(255),char(154),char(2),char(0), +char(3),char(45),char(255),char(133),char(2),char(0),char(3),char(46),char(255),char(154), +char(2),char(0),char(3),char(47),char(255),char(133),char(2),char(0),char(3),char(48), +char(255),char(154),char(2),char(0),char(3),char(49),char(255),char(133),char(2),char(0), +char(3),char(50),char(255),char(154),char(2),char(0),char(3),char(51),char(255),char(133), +char(2),char(0),char(3),char(52),char(255),char(154),char(2),char(0),char(3),char(54), +char(255),char(154),char(2),char(0),char(3),char(56),char(255),char(154),char(2),char(0), +char(3),char(58),char(255),char(154),char(2),char(0),char(3),char(60),char(255),char(154), +char(2),char(0),char(3),char(64),char(255),char(154),char(2),char(0),char(3),char(66), +char(255),char(154),char(2),char(0),char(3),char(68),char(255),char(154),char(2),char(0), +char(3),char(73),char(255),char(215),char(2),char(0),char(3),char(74),char(255),char(154), +char(2),char(0),char(3),char(75),char(255),char(215),char(2),char(0),char(3),char(76), +char(255),char(154),char(2),char(0),char(3),char(77),char(255),char(215),char(2),char(0), +char(3),char(78),char(255),char(154),char(2),char(0),char(3),char(79),char(255),char(215), +char(2),char(0),char(3),char(81),char(255),char(215),char(2),char(0),char(3),char(82), +char(255),char(154),char(2),char(0),char(3),char(83),char(255),char(215),char(2),char(0), +char(3),char(84),char(255),char(154),char(2),char(0),char(3),char(85),char(255),char(215), +char(2),char(0),char(3),char(86),char(255),char(154),char(2),char(0),char(3),char(87), +char(255),char(215),char(2),char(0),char(3),char(88),char(255),char(154),char(2),char(0), +char(3),char(89),char(255),char(215),char(2),char(0),char(3),char(90),char(255),char(154), +char(2),char(0),char(3),char(91),char(255),char(215),char(2),char(0),char(3),char(92), +char(255),char(154),char(2),char(0),char(3),char(93),char(255),char(215),char(2),char(0), +char(3),char(94),char(255),char(154),char(2),char(0),char(3),char(95),char(255),char(215), +char(2),char(0),char(3),char(96),char(255),char(154),char(2),char(0),char(3),char(98), +char(255),char(195),char(2),char(0),char(3),char(100),char(255),char(195),char(2),char(0), +char(3),char(102),char(255),char(195),char(2),char(0),char(3),char(104),char(255),char(195), +char(2),char(0),char(3),char(106),char(255),char(195),char(2),char(0),char(3),char(108), +char(255),char(195),char(2),char(0),char(3),char(110),char(255),char(195),char(2),char(1), +char(0),char(5),char(0),char(82),char(2),char(1),char(0),char(10),char(0),char(82), +char(2),char(1),char(0),char(15),char(255),char(174),char(2),char(1),char(0),char(17), +char(255),char(174),char(2),char(1),char(0),char(34),char(0),char(41),char(2),char(1), +char(2),char(7),char(0),char(82),char(2),char(1),char(2),char(8),char(255),char(174), +char(2),char(1),char(2),char(11),char(0),char(82),char(2),char(1),char(2),char(12), +char(255),char(174),char(2),char(2),char(0),char(55),char(255),char(174),char(2),char(2), +char(1),char(36),char(255),char(174),char(2),char(2),char(1),char(38),char(255),char(174), +char(2),char(2),char(1),char(113),char(255),char(174),char(2),char(2),char(1),char(157), +char(255),char(174),char(2),char(2),char(1),char(166),char(255),char(174),char(2),char(2), +char(1),char(188),char(255),char(174),char(2),char(2),char(1),char(196),char(255),char(174), +char(2),char(2),char(1),char(220),char(255),char(215),char(2),char(2),char(1),char(228), +char(255),char(215),char(2),char(2),char(2),char(169),char(255),char(174),char(2),char(2), +char(2),char(170),char(255),char(215),char(2),char(2),char(2),char(181),char(255),char(174), +char(2),char(2),char(2),char(182),char(255),char(215),char(2),char(2),char(2),char(189), +char(255),char(174),char(2),char(2),char(2),char(190),char(255),char(215),char(2),char(2), +char(3),char(23),char(255),char(174),char(2),char(2),char(3),char(24),char(255),char(215), +char(2),char(2),char(3),char(143),char(255),char(174),char(2),char(3),char(0),char(55), +char(255),char(174),char(2),char(3),char(1),char(36),char(255),char(174),char(2),char(3), +char(1),char(38),char(255),char(174),char(2),char(3),char(1),char(113),char(255),char(174), +char(2),char(3),char(1),char(157),char(255),char(174),char(2),char(3),char(1),char(166), +char(255),char(174),char(2),char(3),char(1),char(188),char(255),char(174),char(2),char(3), +char(1),char(196),char(255),char(174),char(2),char(3),char(1),char(220),char(255),char(215), +char(2),char(3),char(1),char(228),char(255),char(215),char(2),char(3),char(2),char(169), +char(255),char(174),char(2),char(3),char(2),char(170),char(255),char(215),char(2),char(3), +char(2),char(181),char(255),char(174),char(2),char(3),char(2),char(182),char(255),char(215), +char(2),char(3),char(2),char(189),char(255),char(174),char(2),char(3),char(2),char(190), +char(255),char(215),char(2),char(3),char(3),char(23),char(255),char(174),char(2),char(3), +char(3),char(24),char(255),char(215),char(2),char(3),char(3),char(143),char(255),char(174), +char(2),char(4),char(0),char(55),char(255),char(174),char(2),char(4),char(1),char(36), +char(255),char(174),char(2),char(4),char(1),char(38),char(255),char(174),char(2),char(4), +char(1),char(113),char(255),char(174),char(2),char(4),char(1),char(157),char(255),char(174), +char(2),char(4),char(1),char(166),char(255),char(174),char(2),char(4),char(1),char(188), +char(255),char(174),char(2),char(4),char(1),char(196),char(255),char(174),char(2),char(4), +char(1),char(220),char(255),char(215),char(2),char(4),char(1),char(228),char(255),char(215), +char(2),char(4),char(2),char(169),char(255),char(174),char(2),char(4),char(2),char(170), +char(255),char(215),char(2),char(4),char(2),char(181),char(255),char(174),char(2),char(4), +char(2),char(182),char(255),char(215),char(2),char(4),char(2),char(189),char(255),char(174), +char(2),char(4),char(2),char(190),char(255),char(215),char(2),char(4),char(3),char(23), +char(255),char(174),char(2),char(4),char(3),char(24),char(255),char(215),char(2),char(4), +char(3),char(143),char(255),char(174),char(2),char(6),char(0),char(36),char(255),char(113), +char(2),char(6),char(0),char(55),char(0),char(41),char(2),char(6),char(0),char(57), +char(0),char(41),char(2),char(6),char(0),char(58),char(0),char(41),char(2),char(6), +char(0),char(60),char(0),char(20),char(2),char(6),char(0),char(68),char(255),char(174), +char(2),char(6),char(0),char(70),char(255),char(133),char(2),char(6),char(0),char(71), +char(255),char(133),char(2),char(6),char(0),char(72),char(255),char(133),char(2),char(6), +char(0),char(74),char(255),char(195),char(2),char(6),char(0),char(80),char(255),char(195), +char(2),char(6),char(0),char(81),char(255),char(195),char(2),char(6),char(0),char(82), +char(255),char(133),char(2),char(6),char(0),char(83),char(255),char(195),char(2),char(6), +char(0),char(84),char(255),char(133),char(2),char(6),char(0),char(85),char(255),char(195), +char(2),char(6),char(0),char(86),char(255),char(195),char(2),char(6),char(0),char(88), +char(255),char(195),char(2),char(6),char(0),char(130),char(255),char(113),char(2),char(6), +char(0),char(131),char(255),char(113),char(2),char(6),char(0),char(132),char(255),char(113), +char(2),char(6),char(0),char(133),char(255),char(113),char(2),char(6),char(0),char(134), +char(255),char(113),char(2),char(6),char(0),char(135),char(255),char(113),char(2),char(6), +char(0),char(159),char(0),char(20),char(2),char(6),char(0),char(162),char(255),char(133), +char(2),char(6),char(0),char(163),char(255),char(174),char(2),char(6),char(0),char(164), +char(255),char(174),char(2),char(6),char(0),char(165),char(255),char(174),char(2),char(6), +char(0),char(166),char(255),char(174),char(2),char(6),char(0),char(167),char(255),char(174), +char(2),char(6),char(0),char(168),char(255),char(174),char(2),char(6),char(0),char(169), +char(255),char(133),char(2),char(6),char(0),char(170),char(255),char(133),char(2),char(6), +char(0),char(171),char(255),char(133),char(2),char(6),char(0),char(172),char(255),char(133), +char(2),char(6),char(0),char(173),char(255),char(133),char(2),char(6),char(0),char(180), +char(255),char(133),char(2),char(6),char(0),char(181),char(255),char(133),char(2),char(6), +char(0),char(182),char(255),char(133),char(2),char(6),char(0),char(183),char(255),char(133), +char(2),char(6),char(0),char(184),char(255),char(133),char(2),char(6),char(0),char(186), +char(255),char(133),char(2),char(6),char(0),char(187),char(255),char(195),char(2),char(6), +char(0),char(188),char(255),char(195),char(2),char(6),char(0),char(189),char(255),char(195), +char(2),char(6),char(0),char(190),char(255),char(195),char(2),char(6),char(0),char(194), +char(255),char(113),char(2),char(6),char(0),char(195),char(255),char(174),char(2),char(6), +char(0),char(196),char(255),char(113),char(2),char(6),char(0),char(197),char(255),char(174), +char(2),char(6),char(0),char(198),char(255),char(113),char(2),char(6),char(0),char(199), +char(255),char(174),char(2),char(6),char(0),char(201),char(255),char(133),char(2),char(6), +char(0),char(203),char(255),char(133),char(2),char(6),char(0),char(205),char(255),char(133), +char(2),char(6),char(0),char(207),char(255),char(133),char(2),char(6),char(0),char(209), +char(255),char(133),char(2),char(6),char(0),char(211),char(255),char(133),char(2),char(6), +char(0),char(213),char(255),char(133),char(2),char(6),char(0),char(215),char(255),char(133), +char(2),char(6),char(0),char(217),char(255),char(133),char(2),char(6),char(0),char(219), +char(255),char(133),char(2),char(6),char(0),char(221),char(255),char(133),char(2),char(6), +char(0),char(223),char(255),char(195),char(2),char(6),char(0),char(225),char(255),char(195), +char(2),char(6),char(0),char(227),char(255),char(195),char(2),char(6),char(0),char(229), +char(255),char(195),char(2),char(6),char(0),char(250),char(255),char(195),char(2),char(6), +char(1),char(6),char(255),char(195),char(2),char(6),char(1),char(8),char(255),char(195), +char(2),char(6),char(1),char(13),char(255),char(195),char(2),char(6),char(1),char(15), +char(255),char(133),char(2),char(6),char(1),char(17),char(255),char(133),char(2),char(6), +char(1),char(19),char(255),char(133),char(2),char(6),char(1),char(21),char(255),char(133), +char(2),char(6),char(1),char(23),char(255),char(195),char(2),char(6),char(1),char(25), +char(255),char(195),char(2),char(6),char(1),char(29),char(255),char(195),char(2),char(6), +char(1),char(33),char(255),char(195),char(2),char(6),char(1),char(36),char(0),char(41), +char(2),char(6),char(1),char(38),char(0),char(41),char(2),char(6),char(1),char(43), +char(255),char(195),char(2),char(6),char(1),char(45),char(255),char(195),char(2),char(6), +char(1),char(47),char(255),char(195),char(2),char(6),char(1),char(49),char(255),char(195), +char(2),char(6),char(1),char(51),char(255),char(195),char(2),char(6),char(1),char(53), +char(255),char(195),char(2),char(6),char(1),char(54),char(0),char(41),char(2),char(6), +char(1),char(56),char(0),char(20),char(2),char(6),char(1),char(58),char(0),char(20), +char(2),char(6),char(1),char(67),char(255),char(113),char(2),char(6),char(1),char(68), +char(255),char(174),char(2),char(6),char(1),char(70),char(255),char(174),char(2),char(6), +char(1),char(72),char(255),char(133),char(2),char(6),char(1),char(74),char(255),char(195), +char(2),char(6),char(1),char(86),char(255),char(113),char(2),char(6),char(1),char(95), +char(255),char(113),char(2),char(6),char(1),char(98),char(255),char(113),char(2),char(6), +char(1),char(105),char(255),char(113),char(2),char(6),char(1),char(121),char(255),char(174), +char(2),char(6),char(1),char(122),char(255),char(215),char(2),char(6),char(1),char(123), +char(255),char(215),char(2),char(6),char(1),char(126),char(255),char(174),char(2),char(6), +char(1),char(129),char(255),char(195),char(2),char(6),char(1),char(130),char(255),char(215), +char(2),char(6),char(1),char(131),char(255),char(215),char(2),char(6),char(1),char(132), +char(255),char(215),char(2),char(6),char(1),char(135),char(255),char(215),char(2),char(6), +char(1),char(137),char(255),char(215),char(2),char(6),char(1),char(140),char(255),char(174), +char(2),char(6),char(1),char(142),char(255),char(195),char(2),char(6),char(1),char(143), +char(255),char(174),char(2),char(6),char(1),char(144),char(255),char(174),char(2),char(6), +char(1),char(147),char(255),char(174),char(2),char(6),char(1),char(153),char(255),char(174), +char(2),char(6),char(1),char(164),char(255),char(133),char(2),char(6),char(1),char(170), +char(255),char(113),char(2),char(6),char(1),char(174),char(255),char(133),char(2),char(6), +char(1),char(181),char(255),char(133),char(2),char(6),char(1),char(202),char(255),char(215), +char(2),char(6),char(1),char(206),char(255),char(113),char(2),char(6),char(1),char(207), +char(255),char(133),char(2),char(6),char(1),char(213),char(255),char(113),char(2),char(6), +char(1),char(216),char(255),char(133),char(2),char(6),char(1),char(219),char(255),char(133), +char(2),char(6),char(1),char(222),char(255),char(133),char(2),char(6),char(1),char(234), +char(255),char(133),char(2),char(6),char(1),char(237),char(255),char(133),char(2),char(6), +char(1),char(238),char(255),char(195),char(2),char(6),char(1),char(242),char(255),char(113), +char(2),char(6),char(1),char(250),char(0),char(41),char(2),char(6),char(1),char(252), +char(0),char(41),char(2),char(6),char(1),char(254),char(0),char(41),char(2),char(6), +char(2),char(0),char(0),char(20),char(2),char(6),char(2),char(87),char(255),char(195), +char(2),char(6),char(2),char(88),char(255),char(113),char(2),char(6),char(2),char(89), +char(255),char(174),char(2),char(6),char(2),char(96),char(255),char(133),char(2),char(6), +char(2),char(98),char(255),char(195),char(2),char(6),char(2),char(106),char(255),char(133), +char(2),char(6),char(2),char(114),char(255),char(113),char(2),char(6),char(2),char(115), +char(255),char(113),char(2),char(6),char(2),char(125),char(255),char(236),char(2),char(6), +char(2),char(127),char(255),char(133),char(2),char(6),char(2),char(133),char(255),char(133), +char(2),char(6),char(2),char(135),char(255),char(133),char(2),char(6),char(2),char(137), +char(255),char(133),char(2),char(6),char(2),char(141),char(255),char(133),char(2),char(6), +char(2),char(178),char(255),char(133),char(2),char(6),char(2),char(180),char(255),char(133), +char(2),char(6),char(2),char(206),char(255),char(133),char(2),char(6),char(2),char(207), +char(255),char(113),char(2),char(6),char(2),char(217),char(255),char(113),char(2),char(6), +char(2),char(218),char(255),char(215),char(2),char(6),char(2),char(219),char(255),char(113), +char(2),char(6),char(2),char(220),char(255),char(215),char(2),char(6),char(2),char(221), +char(255),char(113),char(2),char(6),char(2),char(222),char(255),char(215),char(2),char(6), +char(2),char(224),char(255),char(133),char(2),char(6),char(2),char(226),char(255),char(215), +char(2),char(6),char(2),char(228),char(255),char(215),char(2),char(6),char(2),char(240), +char(255),char(133),char(2),char(6),char(2),char(242),char(255),char(133),char(2),char(6), +char(2),char(244),char(255),char(133),char(2),char(6),char(3),char(9),char(255),char(113), +char(2),char(6),char(3),char(10),char(255),char(133),char(2),char(6),char(3),char(11), +char(255),char(113),char(2),char(6),char(3),char(12),char(255),char(133),char(2),char(6), +char(3),char(17),char(255),char(133),char(2),char(6),char(3),char(18),char(255),char(113), +char(2),char(6),char(3),char(22),char(255),char(133),char(2),char(6),char(3),char(26), +char(255),char(133),char(2),char(6),char(3),char(27),char(255),char(133),char(2),char(6), +char(3),char(28),char(255),char(113),char(2),char(6),char(3),char(29),char(255),char(113), +char(2),char(6),char(3),char(30),char(255),char(174),char(2),char(6),char(3),char(31), +char(255),char(113),char(2),char(6),char(3),char(32),char(255),char(174),char(2),char(6), +char(3),char(33),char(255),char(113),char(2),char(6),char(3),char(34),char(255),char(174), +char(2),char(6),char(3),char(35),char(255),char(113),char(2),char(6),char(3),char(37), +char(255),char(113),char(2),char(6),char(3),char(38),char(255),char(174),char(2),char(6), +char(3),char(39),char(255),char(113),char(2),char(6),char(3),char(40),char(255),char(174), +char(2),char(6),char(3),char(41),char(255),char(113),char(2),char(6),char(3),char(42), +char(255),char(174),char(2),char(6),char(3),char(43),char(255),char(113),char(2),char(6), +char(3),char(44),char(255),char(174),char(2),char(6),char(3),char(45),char(255),char(113), +char(2),char(6),char(3),char(46),char(255),char(174),char(2),char(6),char(3),char(47), +char(255),char(113),char(2),char(6),char(3),char(48),char(255),char(174),char(2),char(6), +char(3),char(49),char(255),char(113),char(2),char(6),char(3),char(50),char(255),char(174), +char(2),char(6),char(3),char(51),char(255),char(113),char(2),char(6),char(3),char(52), +char(255),char(174),char(2),char(6),char(3),char(54),char(255),char(133),char(2),char(6), +char(3),char(56),char(255),char(133),char(2),char(6),char(3),char(58),char(255),char(133), +char(2),char(6),char(3),char(60),char(255),char(133),char(2),char(6),char(3),char(64), +char(255),char(133),char(2),char(6),char(3),char(66),char(255),char(133),char(2),char(6), +char(3),char(68),char(255),char(133),char(2),char(6),char(3),char(74),char(255),char(133), +char(2),char(6),char(3),char(76),char(255),char(133),char(2),char(6),char(3),char(78), +char(255),char(133),char(2),char(6),char(3),char(82),char(255),char(133),char(2),char(6), +char(3),char(84),char(255),char(133),char(2),char(6),char(3),char(86),char(255),char(133), +char(2),char(6),char(3),char(88),char(255),char(133),char(2),char(6),char(3),char(90), +char(255),char(133),char(2),char(6),char(3),char(92),char(255),char(133),char(2),char(6), +char(3),char(94),char(255),char(133),char(2),char(6),char(3),char(96),char(255),char(133), +char(2),char(6),char(3),char(98),char(255),char(195),char(2),char(6),char(3),char(100), +char(255),char(195),char(2),char(6),char(3),char(102),char(255),char(195),char(2),char(6), +char(3),char(104),char(255),char(195),char(2),char(6),char(3),char(106),char(255),char(195), +char(2),char(6),char(3),char(108),char(255),char(195),char(2),char(6),char(3),char(110), +char(255),char(195),char(2),char(6),char(3),char(111),char(0),char(20),char(2),char(6), +char(3),char(113),char(0),char(20),char(2),char(6),char(3),char(115),char(0),char(20), +char(2),char(6),char(3),char(143),char(0),char(41),char(2),char(7),char(0),char(36), +char(255),char(113),char(2),char(7),char(0),char(55),char(0),char(41),char(2),char(7), +char(0),char(57),char(0),char(41),char(2),char(7),char(0),char(58),char(0),char(41), +char(2),char(7),char(0),char(60),char(0),char(20),char(2),char(7),char(0),char(68), +char(255),char(174),char(2),char(7),char(0),char(70),char(255),char(133),char(2),char(7), +char(0),char(71),char(255),char(133),char(2),char(7),char(0),char(72),char(255),char(133), +char(2),char(7),char(0),char(74),char(255),char(195),char(2),char(7),char(0),char(80), +char(255),char(195),char(2),char(7),char(0),char(81),char(255),char(195),char(2),char(7), +char(0),char(82),char(255),char(133),char(2),char(7),char(0),char(83),char(255),char(195), +char(2),char(7),char(0),char(84),char(255),char(133),char(2),char(7),char(0),char(85), +char(255),char(195),char(2),char(7),char(0),char(86),char(255),char(195),char(2),char(7), +char(0),char(88),char(255),char(195),char(2),char(7),char(0),char(130),char(255),char(113), +char(2),char(7),char(0),char(131),char(255),char(113),char(2),char(7),char(0),char(132), +char(255),char(113),char(2),char(7),char(0),char(133),char(255),char(113),char(2),char(7), +char(0),char(134),char(255),char(113),char(2),char(7),char(0),char(135),char(255),char(113), +char(2),char(7),char(0),char(159),char(0),char(20),char(2),char(7),char(0),char(162), +char(255),char(133),char(2),char(7),char(0),char(163),char(255),char(174),char(2),char(7), +char(0),char(164),char(255),char(174),char(2),char(7),char(0),char(165),char(255),char(174), +char(2),char(7),char(0),char(166),char(255),char(174),char(2),char(7),char(0),char(167), +char(255),char(174),char(2),char(7),char(0),char(168),char(255),char(174),char(2),char(7), +char(0),char(169),char(255),char(133),char(2),char(7),char(0),char(170),char(255),char(133), +char(2),char(7),char(0),char(171),char(255),char(133),char(2),char(7),char(0),char(172), +char(255),char(133),char(2),char(7),char(0),char(173),char(255),char(133),char(2),char(7), +char(0),char(180),char(255),char(133),char(2),char(7),char(0),char(181),char(255),char(133), +char(2),char(7),char(0),char(182),char(255),char(133),char(2),char(7),char(0),char(183), +char(255),char(133),char(2),char(7),char(0),char(184),char(255),char(133),char(2),char(7), +char(0),char(186),char(255),char(133),char(2),char(7),char(0),char(187),char(255),char(195), +char(2),char(7),char(0),char(188),char(255),char(195),char(2),char(7),char(0),char(189), +char(255),char(195),char(2),char(7),char(0),char(190),char(255),char(195),char(2),char(7), +char(0),char(194),char(255),char(113),char(2),char(7),char(0),char(195),char(255),char(174), +char(2),char(7),char(0),char(196),char(255),char(113),char(2),char(7),char(0),char(197), +char(255),char(174),char(2),char(7),char(0),char(198),char(255),char(113),char(2),char(7), +char(0),char(199),char(255),char(174),char(2),char(7),char(0),char(201),char(255),char(133), +char(2),char(7),char(0),char(203),char(255),char(133),char(2),char(7),char(0),char(205), +char(255),char(133),char(2),char(7),char(0),char(207),char(255),char(133),char(2),char(7), +char(0),char(209),char(255),char(133),char(2),char(7),char(0),char(211),char(255),char(133), +char(2),char(7),char(0),char(213),char(255),char(133),char(2),char(7),char(0),char(215), +char(255),char(133),char(2),char(7),char(0),char(217),char(255),char(133),char(2),char(7), +char(0),char(219),char(255),char(133),char(2),char(7),char(0),char(221),char(255),char(133), +char(2),char(7),char(0),char(223),char(255),char(195),char(2),char(7),char(0),char(225), +char(255),char(195),char(2),char(7),char(0),char(227),char(255),char(195),char(2),char(7), +char(0),char(229),char(255),char(195),char(2),char(7),char(0),char(250),char(255),char(195), +char(2),char(7),char(1),char(6),char(255),char(195),char(2),char(7),char(1),char(8), +char(255),char(195),char(2),char(7),char(1),char(13),char(255),char(195),char(2),char(7), +char(1),char(15),char(255),char(133),char(2),char(7),char(1),char(17),char(255),char(133), +char(2),char(7),char(1),char(19),char(255),char(133),char(2),char(7),char(1),char(21), +char(255),char(133),char(2),char(7),char(1),char(23),char(255),char(195),char(2),char(7), +char(1),char(25),char(255),char(195),char(2),char(7),char(1),char(29),char(255),char(195), +char(2),char(7),char(1),char(33),char(255),char(195),char(2),char(7),char(1),char(36), +char(0),char(41),char(2),char(7),char(1),char(38),char(0),char(41),char(2),char(7), +char(1),char(43),char(255),char(195),char(2),char(7),char(1),char(45),char(255),char(195), +char(2),char(7),char(1),char(47),char(255),char(195),char(2),char(7),char(1),char(49), +char(255),char(195),char(2),char(7),char(1),char(51),char(255),char(195),char(2),char(7), +char(1),char(53),char(255),char(195),char(2),char(7),char(1),char(54),char(0),char(41), +char(2),char(7),char(1),char(56),char(0),char(20),char(2),char(7),char(1),char(58), +char(0),char(20),char(2),char(7),char(1),char(67),char(255),char(113),char(2),char(7), +char(1),char(68),char(255),char(174),char(2),char(7),char(1),char(70),char(255),char(174), +char(2),char(7),char(1),char(72),char(255),char(133),char(2),char(7),char(1),char(74), +char(255),char(195),char(2),char(7),char(1),char(86),char(255),char(113),char(2),char(7), +char(1),char(95),char(255),char(113),char(2),char(7),char(1),char(98),char(255),char(113), +char(2),char(7),char(1),char(105),char(255),char(113),char(2),char(7),char(1),char(121), +char(255),char(174),char(2),char(7),char(1),char(122),char(255),char(215),char(2),char(7), +char(1),char(123),char(255),char(215),char(2),char(7),char(1),char(126),char(255),char(174), +char(2),char(7),char(1),char(129),char(255),char(195),char(2),char(7),char(1),char(130), +char(255),char(215),char(2),char(7),char(1),char(131),char(255),char(215),char(2),char(7), +char(1),char(132),char(255),char(215),char(2),char(7),char(1),char(135),char(255),char(215), +char(2),char(7),char(1),char(137),char(255),char(215),char(2),char(7),char(1),char(140), +char(255),char(174),char(2),char(7),char(1),char(142),char(255),char(195),char(2),char(7), +char(1),char(143),char(255),char(174),char(2),char(7),char(1),char(144),char(255),char(174), +char(2),char(7),char(1),char(147),char(255),char(174),char(2),char(7),char(1),char(153), +char(255),char(174),char(2),char(7),char(1),char(164),char(255),char(133),char(2),char(7), +char(1),char(170),char(255),char(113),char(2),char(7),char(1),char(174),char(255),char(133), +char(2),char(7),char(1),char(181),char(255),char(133),char(2),char(7),char(1),char(202), +char(255),char(215),char(2),char(7),char(1),char(206),char(255),char(113),char(2),char(7), +char(1),char(207),char(255),char(133),char(2),char(7),char(1),char(213),char(255),char(113), +char(2),char(7),char(1),char(216),char(255),char(133),char(2),char(7),char(1),char(219), +char(255),char(133),char(2),char(7),char(1),char(222),char(255),char(133),char(2),char(7), +char(1),char(234),char(255),char(133),char(2),char(7),char(1),char(237),char(255),char(133), +char(2),char(7),char(1),char(238),char(255),char(195),char(2),char(7),char(1),char(242), +char(255),char(113),char(2),char(7),char(1),char(250),char(0),char(41),char(2),char(7), +char(1),char(252),char(0),char(41),char(2),char(7),char(1),char(254),char(0),char(41), +char(2),char(7),char(2),char(0),char(0),char(20),char(2),char(7),char(2),char(87), +char(255),char(195),char(2),char(7),char(2),char(88),char(255),char(113),char(2),char(7), +char(2),char(89),char(255),char(174),char(2),char(7),char(2),char(96),char(255),char(133), +char(2),char(7),char(2),char(98),char(255),char(195),char(2),char(7),char(2),char(106), +char(255),char(133),char(2),char(7),char(2),char(114),char(255),char(113),char(2),char(7), +char(2),char(115),char(255),char(113),char(2),char(7),char(2),char(125),char(255),char(236), +char(2),char(7),char(2),char(127),char(255),char(133),char(2),char(7),char(2),char(133), +char(255),char(133),char(2),char(7),char(2),char(135),char(255),char(133),char(2),char(7), +char(2),char(137),char(255),char(133),char(2),char(7),char(2),char(141),char(255),char(133), +char(2),char(7),char(2),char(178),char(255),char(133),char(2),char(7),char(2),char(180), +char(255),char(133),char(2),char(7),char(2),char(206),char(255),char(133),char(2),char(7), +char(2),char(207),char(255),char(113),char(2),char(7),char(2),char(217),char(255),char(113), +char(2),char(7),char(2),char(218),char(255),char(215),char(2),char(7),char(2),char(219), +char(255),char(113),char(2),char(7),char(2),char(220),char(255),char(215),char(2),char(7), +char(2),char(221),char(255),char(113),char(2),char(7),char(2),char(222),char(255),char(215), +char(2),char(7),char(2),char(224),char(255),char(133),char(2),char(7),char(2),char(226), +char(255),char(215),char(2),char(7),char(2),char(228),char(255),char(215),char(2),char(7), +char(2),char(240),char(255),char(133),char(2),char(7),char(2),char(242),char(255),char(133), +char(2),char(7),char(2),char(244),char(255),char(133),char(2),char(7),char(3),char(9), +char(255),char(113),char(2),char(7),char(3),char(10),char(255),char(133),char(2),char(7), +char(3),char(11),char(255),char(113),char(2),char(7),char(3),char(12),char(255),char(133), +char(2),char(7),char(3),char(17),char(255),char(133),char(2),char(7),char(3),char(18), +char(255),char(113),char(2),char(7),char(3),char(22),char(255),char(133),char(2),char(7), +char(3),char(26),char(255),char(133),char(2),char(7),char(3),char(27),char(255),char(133), +char(2),char(7),char(3),char(28),char(255),char(113),char(2),char(7),char(3),char(29), +char(255),char(113),char(2),char(7),char(3),char(30),char(255),char(174),char(2),char(7), +char(3),char(31),char(255),char(113),char(2),char(7),char(3),char(32),char(255),char(174), +char(2),char(7),char(3),char(33),char(255),char(113),char(2),char(7),char(3),char(34), +char(255),char(174),char(2),char(7),char(3),char(35),char(255),char(113),char(2),char(7), +char(3),char(37),char(255),char(113),char(2),char(7),char(3),char(38),char(255),char(174), +char(2),char(7),char(3),char(39),char(255),char(113),char(2),char(7),char(3),char(40), +char(255),char(174),char(2),char(7),char(3),char(41),char(255),char(113),char(2),char(7), +char(3),char(42),char(255),char(174),char(2),char(7),char(3),char(43),char(255),char(113), +char(2),char(7),char(3),char(44),char(255),char(174),char(2),char(7),char(3),char(45), +char(255),char(113),char(2),char(7),char(3),char(46),char(255),char(174),char(2),char(7), +char(3),char(47),char(255),char(113),char(2),char(7),char(3),char(48),char(255),char(174), +char(2),char(7),char(3),char(49),char(255),char(113),char(2),char(7),char(3),char(50), +char(255),char(174),char(2),char(7),char(3),char(51),char(255),char(113),char(2),char(7), +char(3),char(52),char(255),char(174),char(2),char(7),char(3),char(54),char(255),char(133), +char(2),char(7),char(3),char(56),char(255),char(133),char(2),char(7),char(3),char(58), +char(255),char(133),char(2),char(7),char(3),char(60),char(255),char(133),char(2),char(7), +char(3),char(64),char(255),char(133),char(2),char(7),char(3),char(66),char(255),char(133), +char(2),char(7),char(3),char(68),char(255),char(133),char(2),char(7),char(3),char(74), +char(255),char(133),char(2),char(7),char(3),char(76),char(255),char(133),char(2),char(7), +char(3),char(78),char(255),char(133),char(2),char(7),char(3),char(82),char(255),char(133), +char(2),char(7),char(3),char(84),char(255),char(133),char(2),char(7),char(3),char(86), +char(255),char(133),char(2),char(7),char(3),char(88),char(255),char(133),char(2),char(7), +char(3),char(90),char(255),char(133),char(2),char(7),char(3),char(92),char(255),char(133), +char(2),char(7),char(3),char(94),char(255),char(133),char(2),char(7),char(3),char(96), +char(255),char(133),char(2),char(7),char(3),char(98),char(255),char(195),char(2),char(7), +char(3),char(100),char(255),char(195),char(2),char(7),char(3),char(102),char(255),char(195), +char(2),char(7),char(3),char(104),char(255),char(195),char(2),char(7),char(3),char(106), +char(255),char(195),char(2),char(7),char(3),char(108),char(255),char(195),char(2),char(7), +char(3),char(110),char(255),char(195),char(2),char(7),char(3),char(111),char(0),char(20), +char(2),char(7),char(3),char(113),char(0),char(20),char(2),char(7),char(3),char(115), +char(0),char(20),char(2),char(7),char(3),char(143),char(0),char(41),char(2),char(8), +char(0),char(38),char(255),char(154),char(2),char(8),char(0),char(42),char(255),char(154), +char(2),char(8),char(0),char(50),char(255),char(154),char(2),char(8),char(0),char(52), +char(255),char(154),char(2),char(8),char(0),char(55),char(255),char(113),char(2),char(8), +char(0),char(56),char(255),char(215),char(2),char(8),char(0),char(57),char(255),char(133), +char(2),char(8),char(0),char(58),char(255),char(133),char(2),char(8),char(0),char(60), +char(255),char(133),char(2),char(8),char(0),char(137),char(255),char(154),char(2),char(8), +char(0),char(148),char(255),char(154),char(2),char(8),char(0),char(149),char(255),char(154), +char(2),char(8),char(0),char(150),char(255),char(154),char(2),char(8),char(0),char(151), +char(255),char(154),char(2),char(8),char(0),char(152),char(255),char(154),char(2),char(8), +char(0),char(154),char(255),char(154),char(2),char(8),char(0),char(155),char(255),char(215), +char(2),char(8),char(0),char(156),char(255),char(215),char(2),char(8),char(0),char(157), +char(255),char(215),char(2),char(8),char(0),char(158),char(255),char(215),char(2),char(8), +char(0),char(159),char(255),char(133),char(2),char(8),char(0),char(200),char(255),char(154), +char(2),char(8),char(0),char(202),char(255),char(154),char(2),char(8),char(0),char(204), +char(255),char(154),char(2),char(8),char(0),char(206),char(255),char(154),char(2),char(8), +char(0),char(222),char(255),char(154),char(2),char(8),char(0),char(224),char(255),char(154), +char(2),char(8),char(0),char(226),char(255),char(154),char(2),char(8),char(0),char(228), +char(255),char(154),char(2),char(8),char(1),char(14),char(255),char(154),char(2),char(8), +char(1),char(16),char(255),char(154),char(2),char(8),char(1),char(18),char(255),char(154), +char(2),char(8),char(1),char(20),char(255),char(154),char(2),char(8),char(1),char(36), +char(255),char(113),char(2),char(8),char(1),char(38),char(255),char(113),char(2),char(8), +char(1),char(42),char(255),char(215),char(2),char(8),char(1),char(44),char(255),char(215), +char(2),char(8),char(1),char(46),char(255),char(215),char(2),char(8),char(1),char(48), +char(255),char(215),char(2),char(8),char(1),char(50),char(255),char(215),char(2),char(8), +char(1),char(52),char(255),char(215),char(2),char(8),char(1),char(54),char(255),char(133), +char(2),char(8),char(1),char(56),char(255),char(133),char(2),char(8),char(1),char(58), +char(255),char(133),char(2),char(8),char(1),char(71),char(255),char(154),char(2),char(8), +char(1),char(102),char(255),char(174),char(2),char(8),char(1),char(109),char(255),char(174), +char(2),char(8),char(1),char(113),char(255),char(113),char(2),char(8),char(1),char(114), +char(255),char(133),char(2),char(8),char(1),char(115),char(255),char(154),char(2),char(8), +char(1),char(117),char(255),char(133),char(2),char(8),char(1),char(120),char(255),char(133), +char(2),char(8),char(1),char(133),char(255),char(215),char(2),char(8),char(1),char(157), +char(255),char(113),char(2),char(8),char(1),char(159),char(255),char(154),char(2),char(8), +char(1),char(166),char(255),char(113),char(2),char(8),char(1),char(184),char(255),char(154), +char(2),char(8),char(1),char(187),char(255),char(154),char(2),char(8),char(1),char(188), +char(255),char(113),char(2),char(8),char(1),char(190),char(255),char(174),char(2),char(8), +char(1),char(193),char(255),char(92),char(2),char(8),char(1),char(196),char(255),char(113), +char(2),char(8),char(1),char(220),char(255),char(154),char(2),char(8),char(1),char(225), +char(255),char(133),char(2),char(8),char(1),char(228),char(255),char(154),char(2),char(8), +char(1),char(250),char(255),char(133),char(2),char(8),char(1),char(252),char(255),char(133), +char(2),char(8),char(1),char(254),char(255),char(133),char(2),char(8),char(2),char(0), +char(255),char(133),char(2),char(8),char(2),char(84),char(255),char(133),char(2),char(8), +char(2),char(95),char(255),char(154),char(2),char(8),char(2),char(97),char(255),char(215), +char(2),char(8),char(2),char(108),char(255),char(154),char(2),char(8),char(2),char(124), +char(255),char(92),char(2),char(8),char(2),char(126),char(255),char(154),char(2),char(8), +char(2),char(128),char(255),char(133),char(2),char(8),char(2),char(130),char(255),char(133), +char(2),char(8),char(2),char(132),char(255),char(154),char(2),char(8),char(2),char(134), +char(255),char(154),char(2),char(8),char(2),char(136),char(255),char(154),char(2),char(8), +char(2),char(138),char(255),char(154),char(2),char(8),char(2),char(140),char(255),char(154), +char(2),char(8),char(2),char(169),char(255),char(113),char(2),char(8),char(2),char(170), +char(255),char(154),char(2),char(8),char(2),char(177),char(255),char(154),char(2),char(8), +char(2),char(179),char(255),char(154),char(2),char(8),char(2),char(181),char(255),char(113), +char(2),char(8),char(2),char(182),char(255),char(154),char(2),char(8),char(2),char(183), +char(255),char(133),char(2),char(8),char(2),char(185),char(255),char(133),char(2),char(8), +char(2),char(189),char(255),char(113),char(2),char(8),char(2),char(190),char(255),char(154), +char(2),char(8),char(2),char(191),char(255),char(92),char(2),char(8),char(2),char(192), +char(255),char(133),char(2),char(8),char(2),char(193),char(255),char(92),char(2),char(8), +char(2),char(194),char(255),char(133),char(2),char(8),char(2),char(197),char(255),char(133), +char(2),char(8),char(2),char(199),char(255),char(133),char(2),char(8),char(2),char(212), +char(255),char(92),char(2),char(8),char(2),char(213),char(255),char(133),char(2),char(8), +char(2),char(239),char(255),char(154),char(2),char(8),char(2),char(241),char(255),char(154), +char(2),char(8),char(2),char(243),char(255),char(154),char(2),char(8),char(2),char(253), +char(255),char(92),char(2),char(8),char(2),char(254),char(255),char(133),char(2),char(8), +char(3),char(13),char(255),char(133),char(2),char(8),char(3),char(14),char(255),char(154), +char(2),char(8),char(3),char(15),char(255),char(133),char(2),char(8),char(3),char(16), +char(255),char(154),char(2),char(8),char(3),char(21),char(255),char(154),char(2),char(8), +char(3),char(23),char(255),char(113),char(2),char(8),char(3),char(24),char(255),char(154), +char(2),char(8),char(3),char(73),char(255),char(154),char(2),char(8),char(3),char(75), +char(255),char(154),char(2),char(8),char(3),char(77),char(255),char(154),char(2),char(8), +char(3),char(79),char(255),char(154),char(2),char(8),char(3),char(81),char(255),char(154), +char(2),char(8),char(3),char(83),char(255),char(154),char(2),char(8),char(3),char(85), +char(255),char(154),char(2),char(8),char(3),char(87),char(255),char(154),char(2),char(8), +char(3),char(89),char(255),char(154),char(2),char(8),char(3),char(91),char(255),char(154), +char(2),char(8),char(3),char(93),char(255),char(154),char(2),char(8),char(3),char(95), +char(255),char(154),char(2),char(8),char(3),char(97),char(255),char(215),char(2),char(8), +char(3),char(99),char(255),char(215),char(2),char(8),char(3),char(101),char(255),char(215), +char(2),char(8),char(3),char(103),char(255),char(215),char(2),char(8),char(3),char(105), +char(255),char(215),char(2),char(8),char(3),char(107),char(255),char(215),char(2),char(8), +char(3),char(109),char(255),char(215),char(2),char(8),char(3),char(111),char(255),char(133), +char(2),char(8),char(3),char(113),char(255),char(133),char(2),char(8),char(3),char(115), +char(255),char(133),char(2),char(8),char(3),char(143),char(255),char(113),char(2),char(10), +char(0),char(36),char(255),char(113),char(2),char(10),char(0),char(55),char(0),char(41), +char(2),char(10),char(0),char(57),char(0),char(41),char(2),char(10),char(0),char(58), +char(0),char(41),char(2),char(10),char(0),char(60),char(0),char(20),char(2),char(10), +char(0),char(68),char(255),char(174),char(2),char(10),char(0),char(70),char(255),char(133), +char(2),char(10),char(0),char(71),char(255),char(133),char(2),char(10),char(0),char(72), +char(255),char(133),char(2),char(10),char(0),char(74),char(255),char(195),char(2),char(10), +char(0),char(80),char(255),char(195),char(2),char(10),char(0),char(81),char(255),char(195), +char(2),char(10),char(0),char(82),char(255),char(133),char(2),char(10),char(0),char(83), +char(255),char(195),char(2),char(10),char(0),char(84),char(255),char(133),char(2),char(10), +char(0),char(85),char(255),char(195),char(2),char(10),char(0),char(86),char(255),char(195), +char(2),char(10),char(0),char(88),char(255),char(195),char(2),char(10),char(0),char(130), +char(255),char(113),char(2),char(10),char(0),char(131),char(255),char(113),char(2),char(10), +char(0),char(132),char(255),char(113),char(2),char(10),char(0),char(133),char(255),char(113), +char(2),char(10),char(0),char(134),char(255),char(113),char(2),char(10),char(0),char(135), +char(255),char(113),char(2),char(10),char(0),char(159),char(0),char(20),char(2),char(10), +char(0),char(162),char(255),char(133),char(2),char(10),char(0),char(163),char(255),char(174), +char(2),char(10),char(0),char(164),char(255),char(174),char(2),char(10),char(0),char(165), +char(255),char(174),char(2),char(10),char(0),char(166),char(255),char(174),char(2),char(10), +char(0),char(167),char(255),char(174),char(2),char(10),char(0),char(168),char(255),char(174), +char(2),char(10),char(0),char(169),char(255),char(133),char(2),char(10),char(0),char(170), +char(255),char(133),char(2),char(10),char(0),char(171),char(255),char(133),char(2),char(10), +char(0),char(172),char(255),char(133),char(2),char(10),char(0),char(173),char(255),char(133), +char(2),char(10),char(0),char(180),char(255),char(133),char(2),char(10),char(0),char(181), +char(255),char(133),char(2),char(10),char(0),char(182),char(255),char(133),char(2),char(10), +char(0),char(183),char(255),char(133),char(2),char(10),char(0),char(184),char(255),char(133), +char(2),char(10),char(0),char(186),char(255),char(133),char(2),char(10),char(0),char(187), +char(255),char(195),char(2),char(10),char(0),char(188),char(255),char(195),char(2),char(10), +char(0),char(189),char(255),char(195),char(2),char(10),char(0),char(190),char(255),char(195), +char(2),char(10),char(0),char(194),char(255),char(113),char(2),char(10),char(0),char(195), +char(255),char(174),char(2),char(10),char(0),char(196),char(255),char(113),char(2),char(10), +char(0),char(197),char(255),char(174),char(2),char(10),char(0),char(198),char(255),char(113), +char(2),char(10),char(0),char(199),char(255),char(174),char(2),char(10),char(0),char(201), +char(255),char(133),char(2),char(10),char(0),char(203),char(255),char(133),char(2),char(10), +char(0),char(205),char(255),char(133),char(2),char(10),char(0),char(207),char(255),char(133), +char(2),char(10),char(0),char(209),char(255),char(133),char(2),char(10),char(0),char(211), +char(255),char(133),char(2),char(10),char(0),char(213),char(255),char(133),char(2),char(10), +char(0),char(215),char(255),char(133),char(2),char(10),char(0),char(217),char(255),char(133), +char(2),char(10),char(0),char(219),char(255),char(133),char(2),char(10),char(0),char(221), +char(255),char(133),char(2),char(10),char(0),char(223),char(255),char(195),char(2),char(10), +char(0),char(225),char(255),char(195),char(2),char(10),char(0),char(227),char(255),char(195), +char(2),char(10),char(0),char(229),char(255),char(195),char(2),char(10),char(0),char(250), +char(255),char(195),char(2),char(10),char(1),char(6),char(255),char(195),char(2),char(10), +char(1),char(8),char(255),char(195),char(2),char(10),char(1),char(13),char(255),char(195), +char(2),char(10),char(1),char(15),char(255),char(133),char(2),char(10),char(1),char(17), +char(255),char(133),char(2),char(10),char(1),char(19),char(255),char(133),char(2),char(10), +char(1),char(21),char(255),char(133),char(2),char(10),char(1),char(23),char(255),char(195), +char(2),char(10),char(1),char(25),char(255),char(195),char(2),char(10),char(1),char(29), +char(255),char(195),char(2),char(10),char(1),char(33),char(255),char(195),char(2),char(10), +char(1),char(36),char(0),char(41),char(2),char(10),char(1),char(38),char(0),char(41), +char(2),char(10),char(1),char(43),char(255),char(195),char(2),char(10),char(1),char(45), +char(255),char(195),char(2),char(10),char(1),char(47),char(255),char(195),char(2),char(10), +char(1),char(49),char(255),char(195),char(2),char(10),char(1),char(51),char(255),char(195), +char(2),char(10),char(1),char(53),char(255),char(195),char(2),char(10),char(1),char(54), +char(0),char(41),char(2),char(10),char(1),char(56),char(0),char(20),char(2),char(10), +char(1),char(58),char(0),char(20),char(2),char(10),char(1),char(67),char(255),char(113), +char(2),char(10),char(1),char(68),char(255),char(174),char(2),char(10),char(1),char(70), +char(255),char(174),char(2),char(10),char(1),char(72),char(255),char(133),char(2),char(10), +char(1),char(74),char(255),char(195),char(2),char(10),char(1),char(86),char(255),char(113), +char(2),char(10),char(1),char(95),char(255),char(113),char(2),char(10),char(1),char(98), +char(255),char(113),char(2),char(10),char(1),char(105),char(255),char(113),char(2),char(10), +char(1),char(121),char(255),char(174),char(2),char(10),char(1),char(122),char(255),char(215), +char(2),char(10),char(1),char(123),char(255),char(215),char(2),char(10),char(1),char(126), +char(255),char(174),char(2),char(10),char(1),char(129),char(255),char(195),char(2),char(10), +char(1),char(130),char(255),char(215),char(2),char(10),char(1),char(131),char(255),char(215), +char(2),char(10),char(1),char(132),char(255),char(215),char(2),char(10),char(1),char(135), +char(255),char(215),char(2),char(10),char(1),char(137),char(255),char(215),char(2),char(10), +char(1),char(140),char(255),char(174),char(2),char(10),char(1),char(142),char(255),char(195), +char(2),char(10),char(1),char(143),char(255),char(174),char(2),char(10),char(1),char(144), +char(255),char(174),char(2),char(10),char(1),char(147),char(255),char(174),char(2),char(10), +char(1),char(153),char(255),char(174),char(2),char(10),char(1),char(164),char(255),char(133), +char(2),char(10),char(1),char(170),char(255),char(113),char(2),char(10),char(1),char(174), +char(255),char(133),char(2),char(10),char(1),char(181),char(255),char(133),char(2),char(10), +char(1),char(202),char(255),char(215),char(2),char(10),char(1),char(206),char(255),char(113), +char(2),char(10),char(1),char(207),char(255),char(133),char(2),char(10),char(1),char(213), +char(255),char(113),char(2),char(10),char(1),char(216),char(255),char(133),char(2),char(10), +char(1),char(219),char(255),char(133),char(2),char(10),char(1),char(222),char(255),char(133), +char(2),char(10),char(1),char(234),char(255),char(133),char(2),char(10),char(1),char(237), +char(255),char(133),char(2),char(10),char(1),char(238),char(255),char(195),char(2),char(10), +char(1),char(242),char(255),char(113),char(2),char(10),char(1),char(250),char(0),char(41), +char(2),char(10),char(1),char(252),char(0),char(41),char(2),char(10),char(1),char(254), +char(0),char(41),char(2),char(10),char(2),char(0),char(0),char(20),char(2),char(10), +char(2),char(87),char(255),char(195),char(2),char(10),char(2),char(88),char(255),char(113), +char(2),char(10),char(2),char(89),char(255),char(174),char(2),char(10),char(2),char(96), +char(255),char(133),char(2),char(10),char(2),char(98),char(255),char(195),char(2),char(10), +char(2),char(106),char(255),char(133),char(2),char(10),char(2),char(114),char(255),char(113), +char(2),char(10),char(2),char(115),char(255),char(113),char(2),char(10),char(2),char(125), +char(255),char(236),char(2),char(10),char(2),char(127),char(255),char(133),char(2),char(10), +char(2),char(133),char(255),char(133),char(2),char(10),char(2),char(135),char(255),char(133), +char(2),char(10),char(2),char(137),char(255),char(133),char(2),char(10),char(2),char(141), +char(255),char(133),char(2),char(10),char(2),char(178),char(255),char(133),char(2),char(10), +char(2),char(180),char(255),char(133),char(2),char(10),char(2),char(206),char(255),char(133), +char(2),char(10),char(2),char(207),char(255),char(113),char(2),char(10),char(2),char(217), +char(255),char(113),char(2),char(10),char(2),char(218),char(255),char(215),char(2),char(10), +char(2),char(219),char(255),char(113),char(2),char(10),char(2),char(220),char(255),char(215), +char(2),char(10),char(2),char(221),char(255),char(113),char(2),char(10),char(2),char(222), +char(255),char(215),char(2),char(10),char(2),char(224),char(255),char(133),char(2),char(10), +char(2),char(226),char(255),char(215),char(2),char(10),char(2),char(228),char(255),char(215), +char(2),char(10),char(2),char(240),char(255),char(133),char(2),char(10),char(2),char(242), +char(255),char(133),char(2),char(10),char(2),char(244),char(255),char(133),char(2),char(10), +char(3),char(9),char(255),char(113),char(2),char(10),char(3),char(10),char(255),char(133), +char(2),char(10),char(3),char(11),char(255),char(113),char(2),char(10),char(3),char(12), +char(255),char(133),char(2),char(10),char(3),char(17),char(255),char(133),char(2),char(10), +char(3),char(18),char(255),char(113),char(2),char(10),char(3),char(22),char(255),char(133), +char(2),char(10),char(3),char(26),char(255),char(133),char(2),char(10),char(3),char(27), +char(255),char(133),char(2),char(10),char(3),char(28),char(255),char(113),char(2),char(10), +char(3),char(29),char(255),char(113),char(2),char(10),char(3),char(30),char(255),char(174), +char(2),char(10),char(3),char(31),char(255),char(113),char(2),char(10),char(3),char(32), +char(255),char(174),char(2),char(10),char(3),char(33),char(255),char(113),char(2),char(10), +char(3),char(34),char(255),char(174),char(2),char(10),char(3),char(35),char(255),char(113), +char(2),char(10),char(3),char(37),char(255),char(113),char(2),char(10),char(3),char(38), +char(255),char(174),char(2),char(10),char(3),char(39),char(255),char(113),char(2),char(10), +char(3),char(40),char(255),char(174),char(2),char(10),char(3),char(41),char(255),char(113), +char(2),char(10),char(3),char(42),char(255),char(174),char(2),char(10),char(3),char(43), +char(255),char(113),char(2),char(10),char(3),char(44),char(255),char(174),char(2),char(10), +char(3),char(45),char(255),char(113),char(2),char(10),char(3),char(46),char(255),char(174), +char(2),char(10),char(3),char(47),char(255),char(113),char(2),char(10),char(3),char(48), +char(255),char(174),char(2),char(10),char(3),char(49),char(255),char(113),char(2),char(10), +char(3),char(50),char(255),char(174),char(2),char(10),char(3),char(51),char(255),char(113), +char(2),char(10),char(3),char(52),char(255),char(174),char(2),char(10),char(3),char(54), +char(255),char(133),char(2),char(10),char(3),char(56),char(255),char(133),char(2),char(10), +char(3),char(58),char(255),char(133),char(2),char(10),char(3),char(60),char(255),char(133), +char(2),char(10),char(3),char(64),char(255),char(133),char(2),char(10),char(3),char(66), +char(255),char(133),char(2),char(10),char(3),char(68),char(255),char(133),char(2),char(10), +char(3),char(74),char(255),char(133),char(2),char(10),char(3),char(76),char(255),char(133), +char(2),char(10),char(3),char(78),char(255),char(133),char(2),char(10),char(3),char(82), +char(255),char(133),char(2),char(10),char(3),char(84),char(255),char(133),char(2),char(10), +char(3),char(86),char(255),char(133),char(2),char(10),char(3),char(88),char(255),char(133), +char(2),char(10),char(3),char(90),char(255),char(133),char(2),char(10),char(3),char(92), +char(255),char(133),char(2),char(10),char(3),char(94),char(255),char(133),char(2),char(10), +char(3),char(96),char(255),char(133),char(2),char(10),char(3),char(98),char(255),char(195), +char(2),char(10),char(3),char(100),char(255),char(195),char(2),char(10),char(3),char(102), +char(255),char(195),char(2),char(10),char(3),char(104),char(255),char(195),char(2),char(10), +char(3),char(106),char(255),char(195),char(2),char(10),char(3),char(108),char(255),char(195), +char(2),char(10),char(3),char(110),char(255),char(195),char(2),char(10),char(3),char(111), +char(0),char(20),char(2),char(10),char(3),char(113),char(0),char(20),char(2),char(10), +char(3),char(115),char(0),char(20),char(2),char(10),char(3),char(143),char(0),char(41), +char(2),char(12),char(0),char(38),char(255),char(154),char(2),char(12),char(0),char(42), +char(255),char(154),char(2),char(12),char(0),char(50),char(255),char(154),char(2),char(12), +char(0),char(52),char(255),char(154),char(2),char(12),char(0),char(55),char(255),char(113), +char(2),char(12),char(0),char(56),char(255),char(215),char(2),char(12),char(0),char(57), +char(255),char(133),char(2),char(12),char(0),char(58),char(255),char(133),char(2),char(12), +char(0),char(60),char(255),char(133),char(2),char(12),char(0),char(137),char(255),char(154), +char(2),char(12),char(0),char(148),char(255),char(154),char(2),char(12),char(0),char(149), +char(255),char(154),char(2),char(12),char(0),char(150),char(255),char(154),char(2),char(12), +char(0),char(151),char(255),char(154),char(2),char(12),char(0),char(152),char(255),char(154), +char(2),char(12),char(0),char(154),char(255),char(154),char(2),char(12),char(0),char(155), +char(255),char(215),char(2),char(12),char(0),char(156),char(255),char(215),char(2),char(12), +char(0),char(157),char(255),char(215),char(2),char(12),char(0),char(158),char(255),char(215), +char(2),char(12),char(0),char(159),char(255),char(133),char(2),char(12),char(0),char(200), +char(255),char(154),char(2),char(12),char(0),char(202),char(255),char(154),char(2),char(12), +char(0),char(204),char(255),char(154),char(2),char(12),char(0),char(206),char(255),char(154), +char(2),char(12),char(0),char(222),char(255),char(154),char(2),char(12),char(0),char(224), +char(255),char(154),char(2),char(12),char(0),char(226),char(255),char(154),char(2),char(12), +char(0),char(228),char(255),char(154),char(2),char(12),char(1),char(14),char(255),char(154), +char(2),char(12),char(1),char(16),char(255),char(154),char(2),char(12),char(1),char(18), +char(255),char(154),char(2),char(12),char(1),char(20),char(255),char(154),char(2),char(12), +char(1),char(36),char(255),char(113),char(2),char(12),char(1),char(38),char(255),char(113), +char(2),char(12),char(1),char(42),char(255),char(215),char(2),char(12),char(1),char(44), +char(255),char(215),char(2),char(12),char(1),char(46),char(255),char(215),char(2),char(12), +char(1),char(48),char(255),char(215),char(2),char(12),char(1),char(50),char(255),char(215), +char(2),char(12),char(1),char(52),char(255),char(215),char(2),char(12),char(1),char(54), +char(255),char(133),char(2),char(12),char(1),char(56),char(255),char(133),char(2),char(12), +char(1),char(58),char(255),char(133),char(2),char(12),char(1),char(71),char(255),char(154), +char(2),char(12),char(1),char(102),char(255),char(174),char(2),char(12),char(1),char(109), +char(255),char(174),char(2),char(12),char(1),char(113),char(255),char(113),char(2),char(12), +char(1),char(114),char(255),char(133),char(2),char(12),char(1),char(115),char(255),char(154), +char(2),char(12),char(1),char(117),char(255),char(133),char(2),char(12),char(1),char(120), +char(255),char(133),char(2),char(12),char(1),char(133),char(255),char(215),char(2),char(12), +char(1),char(157),char(255),char(113),char(2),char(12),char(1),char(159),char(255),char(154), +char(2),char(12),char(1),char(166),char(255),char(113),char(2),char(12),char(1),char(184), +char(255),char(154),char(2),char(12),char(1),char(187),char(255),char(154),char(2),char(12), +char(1),char(188),char(255),char(113),char(2),char(12),char(1),char(190),char(255),char(174), +char(2),char(12),char(1),char(193),char(255),char(92),char(2),char(12),char(1),char(196), +char(255),char(113),char(2),char(12),char(1),char(220),char(255),char(154),char(2),char(12), +char(1),char(225),char(255),char(133),char(2),char(12),char(1),char(228),char(255),char(154), +char(2),char(12),char(1),char(250),char(255),char(133),char(2),char(12),char(1),char(252), +char(255),char(133),char(2),char(12),char(1),char(254),char(255),char(133),char(2),char(12), +char(2),char(0),char(255),char(133),char(2),char(12),char(2),char(84),char(255),char(133), +char(2),char(12),char(2),char(95),char(255),char(154),char(2),char(12),char(2),char(97), +char(255),char(215),char(2),char(12),char(2),char(108),char(255),char(154),char(2),char(12), +char(2),char(124),char(255),char(92),char(2),char(12),char(2),char(126),char(255),char(154), +char(2),char(12),char(2),char(128),char(255),char(133),char(2),char(12),char(2),char(130), +char(255),char(133),char(2),char(12),char(2),char(132),char(255),char(154),char(2),char(12), +char(2),char(134),char(255),char(154),char(2),char(12),char(2),char(136),char(255),char(154), +char(2),char(12),char(2),char(138),char(255),char(154),char(2),char(12),char(2),char(140), +char(255),char(154),char(2),char(12),char(2),char(169),char(255),char(113),char(2),char(12), +char(2),char(170),char(255),char(154),char(2),char(12),char(2),char(177),char(255),char(154), +char(2),char(12),char(2),char(179),char(255),char(154),char(2),char(12),char(2),char(181), +char(255),char(113),char(2),char(12),char(2),char(182),char(255),char(154),char(2),char(12), +char(2),char(183),char(255),char(133),char(2),char(12),char(2),char(185),char(255),char(133), +char(2),char(12),char(2),char(189),char(255),char(113),char(2),char(12),char(2),char(190), +char(255),char(154),char(2),char(12),char(2),char(191),char(255),char(92),char(2),char(12), +char(2),char(192),char(255),char(133),char(2),char(12),char(2),char(193),char(255),char(92), +char(2),char(12),char(2),char(194),char(255),char(133),char(2),char(12),char(2),char(197), +char(255),char(133),char(2),char(12),char(2),char(199),char(255),char(133),char(2),char(12), +char(2),char(212),char(255),char(92),char(2),char(12),char(2),char(213),char(255),char(133), +char(2),char(12),char(2),char(239),char(255),char(154),char(2),char(12),char(2),char(241), +char(255),char(154),char(2),char(12),char(2),char(243),char(255),char(154),char(2),char(12), +char(2),char(253),char(255),char(92),char(2),char(12),char(2),char(254),char(255),char(133), +char(2),char(12),char(3),char(13),char(255),char(133),char(2),char(12),char(3),char(14), +char(255),char(154),char(2),char(12),char(3),char(15),char(255),char(133),char(2),char(12), +char(3),char(16),char(255),char(154),char(2),char(12),char(3),char(21),char(255),char(154), +char(2),char(12),char(3),char(23),char(255),char(113),char(2),char(12),char(3),char(24), +char(255),char(154),char(2),char(12),char(3),char(73),char(255),char(154),char(2),char(12), +char(3),char(75),char(255),char(154),char(2),char(12),char(3),char(77),char(255),char(154), +char(2),char(12),char(3),char(79),char(255),char(154),char(2),char(12),char(3),char(81), +char(255),char(154),char(2),char(12),char(3),char(83),char(255),char(154),char(2),char(12), +char(3),char(85),char(255),char(154),char(2),char(12),char(3),char(87),char(255),char(154), +char(2),char(12),char(3),char(89),char(255),char(154),char(2),char(12),char(3),char(91), +char(255),char(154),char(2),char(12),char(3),char(93),char(255),char(154),char(2),char(12), +char(3),char(95),char(255),char(154),char(2),char(12),char(3),char(97),char(255),char(215), +char(2),char(12),char(3),char(99),char(255),char(215),char(2),char(12),char(3),char(101), +char(255),char(215),char(2),char(12),char(3),char(103),char(255),char(215),char(2),char(12), +char(3),char(105),char(255),char(215),char(2),char(12),char(3),char(107),char(255),char(215), +char(2),char(12),char(3),char(109),char(255),char(215),char(2),char(12),char(3),char(111), +char(255),char(133),char(2),char(12),char(3),char(113),char(255),char(133),char(2),char(12), +char(3),char(115),char(255),char(133),char(2),char(12),char(3),char(143),char(255),char(113), +char(2),char(33),char(1),char(113),char(255),char(215),char(2),char(33),char(1),char(114), +char(255),char(236),char(2),char(33),char(1),char(120),char(255),char(236),char(2),char(33), +char(2),char(84),char(255),char(236),char(2),char(83),char(0),char(15),char(255),char(195), +char(2),char(83),char(0),char(17),char(255),char(195),char(2),char(83),char(2),char(8), +char(255),char(195),char(2),char(83),char(2),char(12),char(255),char(195),char(2),char(84), +char(0),char(15),char(255),char(133),char(2),char(84),char(0),char(17),char(255),char(133), +char(2),char(84),char(1),char(86),char(255),char(133),char(2),char(84),char(1),char(95), +char(255),char(133),char(2),char(84),char(1),char(98),char(255),char(133),char(2),char(84), +char(1),char(102),char(255),char(215),char(2),char(84),char(1),char(105),char(255),char(133), +char(2),char(84),char(1),char(109),char(255),char(215),char(2),char(84),char(1),char(115), +char(255),char(195),char(2),char(84),char(1),char(118),char(255),char(236),char(2),char(84), +char(1),char(121),char(255),char(154),char(2),char(84),char(1),char(122),char(255),char(174), +char(2),char(84),char(1),char(123),char(255),char(195),char(2),char(84),char(1),char(124), +char(255),char(195),char(2),char(84),char(1),char(125),char(255),char(195),char(2),char(84), +char(1),char(126),char(255),char(154),char(2),char(84),char(1),char(129),char(255),char(195), +char(2),char(84),char(1),char(130),char(255),char(174),char(2),char(84),char(1),char(132), +char(255),char(195),char(2),char(84),char(1),char(134),char(255),char(195),char(2),char(84), +char(1),char(135),char(255),char(195),char(2),char(84),char(1),char(137),char(255),char(195), +char(2),char(84),char(1),char(140),char(255),char(154),char(2),char(84),char(1),char(142), +char(255),char(154),char(2),char(84),char(1),char(143),char(255),char(154),char(2),char(84), +char(1),char(144),char(255),char(154),char(2),char(84),char(1),char(146),char(255),char(195), +char(2),char(84),char(1),char(147),char(255),char(154),char(2),char(84),char(1),char(149), +char(255),char(195),char(2),char(84),char(1),char(150),char(255),char(195),char(2),char(84), +char(1),char(152),char(255),char(195),char(2),char(84),char(1),char(153),char(255),char(154), +char(2),char(84),char(1),char(154),char(255),char(195),char(2),char(84),char(1),char(155), +char(255),char(195),char(2),char(84),char(2),char(8),char(255),char(133),char(2),char(84), +char(2),char(12),char(255),char(133),char(2),char(84),char(2),char(33),char(255),char(236), +char(2),char(88),char(0),char(5),char(255),char(113),char(2),char(88),char(0),char(10), +char(255),char(113),char(2),char(88),char(0),char(38),char(255),char(215),char(2),char(88), +char(0),char(42),char(255),char(215),char(2),char(88),char(0),char(45),char(1),char(10), +char(2),char(88),char(0),char(50),char(255),char(215),char(2),char(88),char(0),char(52), +char(255),char(215),char(2),char(88),char(0),char(55),char(255),char(113),char(2),char(88), +char(0),char(57),char(255),char(174),char(2),char(88),char(0),char(58),char(255),char(174), +char(2),char(88),char(0),char(60),char(255),char(133),char(2),char(88),char(0),char(137), +char(255),char(215),char(2),char(88),char(0),char(148),char(255),char(215),char(2),char(88), +char(0),char(149),char(255),char(215),char(2),char(88),char(0),char(150),char(255),char(215), +char(2),char(88),char(0),char(151),char(255),char(215),char(2),char(88),char(0),char(152), +char(255),char(215),char(2),char(88),char(0),char(154),char(255),char(215),char(2),char(88), +char(0),char(159),char(255),char(133),char(2),char(88),char(0),char(200),char(255),char(215), +char(2),char(88),char(0),char(202),char(255),char(215),char(2),char(88),char(0),char(204), +char(255),char(215),char(2),char(88),char(0),char(206),char(255),char(215),char(2),char(88), +char(0),char(222),char(255),char(215),char(2),char(88),char(0),char(224),char(255),char(215), +char(2),char(88),char(0),char(226),char(255),char(215),char(2),char(88),char(0),char(228), +char(255),char(215),char(2),char(88),char(1),char(14),char(255),char(215),char(2),char(88), +char(1),char(16),char(255),char(215),char(2),char(88),char(1),char(18),char(255),char(215), +char(2),char(88),char(1),char(20),char(255),char(215),char(2),char(88),char(1),char(36), +char(255),char(113),char(2),char(88),char(1),char(38),char(255),char(113),char(2),char(88), +char(1),char(54),char(255),char(174),char(2),char(88),char(1),char(56),char(255),char(133), +char(2),char(88),char(1),char(58),char(255),char(133),char(2),char(88),char(1),char(71), +char(255),char(215),char(2),char(88),char(1),char(250),char(255),char(174),char(2),char(88), +char(1),char(252),char(255),char(174),char(2),char(88),char(1),char(254),char(255),char(174), +char(2),char(88),char(2),char(0),char(255),char(133),char(2),char(88),char(2),char(7), +char(255),char(113),char(2),char(88),char(2),char(11),char(255),char(113),char(2),char(88), +char(2),char(95),char(255),char(215),char(2),char(88),char(3),char(73),char(255),char(215), +char(2),char(88),char(3),char(75),char(255),char(215),char(2),char(88),char(3),char(77), +char(255),char(215),char(2),char(88),char(3),char(79),char(255),char(215),char(2),char(88), +char(3),char(81),char(255),char(215),char(2),char(88),char(3),char(83),char(255),char(215), +char(2),char(88),char(3),char(85),char(255),char(215),char(2),char(88),char(3),char(87), +char(255),char(215),char(2),char(88),char(3),char(89),char(255),char(215),char(2),char(88), +char(3),char(91),char(255),char(215),char(2),char(88),char(3),char(93),char(255),char(215), +char(2),char(88),char(3),char(95),char(255),char(215),char(2),char(88),char(3),char(111), +char(255),char(133),char(2),char(88),char(3),char(113),char(255),char(133),char(2),char(88), +char(3),char(115),char(255),char(133),char(2),char(88),char(3),char(143),char(255),char(113), +char(2),char(89),char(0),char(5),char(255),char(236),char(2),char(89),char(0),char(10), +char(255),char(236),char(2),char(89),char(2),char(7),char(255),char(236),char(2),char(89), +char(2),char(11),char(255),char(236),char(2),char(90),char(0),char(15),char(255),char(174), +char(2),char(90),char(0),char(17),char(255),char(174),char(2),char(90),char(1),char(86), +char(255),char(215),char(2),char(90),char(1),char(95),char(255),char(215),char(2),char(90), +char(1),char(98),char(255),char(215),char(2),char(90),char(1),char(100),char(255),char(236), +char(2),char(90),char(1),char(105),char(255),char(215),char(2),char(90),char(1),char(112), +char(255),char(236),char(2),char(90),char(1),char(113),char(255),char(195),char(2),char(90), +char(1),char(114),char(255),char(236),char(2),char(90),char(1),char(116),char(255),char(215), +char(2),char(90),char(1),char(117),char(255),char(236),char(2),char(90),char(1),char(120), +char(255),char(236),char(2),char(90),char(1),char(136),char(255),char(236),char(2),char(90), +char(2),char(8),char(255),char(174),char(2),char(90),char(2),char(12),char(255),char(174), +char(2),char(90),char(2),char(84),char(255),char(236),char(2),char(96),char(0),char(73), +char(0),char(82),char(2),char(96),char(0),char(87),char(0),char(82),char(2),char(96), +char(0),char(89),char(0),char(102),char(2),char(96),char(0),char(90),char(0),char(102), +char(2),char(96),char(0),char(91),char(0),char(102),char(2),char(96),char(0),char(92), +char(0),char(102),char(2),char(96),char(0),char(191),char(0),char(102),char(2),char(96), +char(1),char(37),char(0),char(82),char(2),char(96),char(1),char(39),char(0),char(82), +char(2),char(96),char(1),char(55),char(0),char(102),char(2),char(96),char(1),char(251), +char(0),char(102),char(2),char(96),char(1),char(253),char(0),char(102),char(2),char(96), +char(2),char(52),char(0),char(82),char(2),char(96),char(2),char(53),char(0),char(82), +char(2),char(96),char(2),char(93),char(0),char(82),char(2),char(96),char(2),char(94), +char(0),char(82),char(2),char(96),char(3),char(112),char(0),char(102),char(2),char(96), +char(3),char(141),char(0),char(82),char(2),char(96),char(3),char(144),char(0),char(82), +char(2),char(98),char(0),char(73),char(0),char(102),char(2),char(98),char(0),char(87), +char(0),char(102),char(2),char(98),char(0),char(89),char(0),char(102),char(2),char(98), +char(0),char(90),char(0),char(102),char(2),char(98),char(0),char(91),char(0),char(102), +char(2),char(98),char(0),char(92),char(0),char(102),char(2),char(98),char(0),char(191), +char(0),char(102),char(2),char(98),char(1),char(37),char(0),char(102),char(2),char(98), +char(1),char(39),char(0),char(102),char(2),char(98),char(1),char(55),char(0),char(102), +char(2),char(98),char(1),char(251),char(0),char(102),char(2),char(98),char(1),char(253), +char(0),char(102),char(2),char(98),char(2),char(52),char(0),char(102),char(2),char(98), +char(2),char(53),char(0),char(102),char(2),char(98),char(2),char(93),char(0),char(102), +char(2),char(98),char(2),char(94),char(0),char(102),char(2),char(98),char(3),char(112), +char(0),char(102),char(2),char(98),char(3),char(141),char(0),char(102),char(2),char(98), +char(3),char(144),char(0),char(102),char(2),char(106),char(0),char(5),char(255),char(236), +char(2),char(106),char(0),char(10),char(255),char(236),char(2),char(106),char(2),char(7), +char(255),char(236),char(2),char(106),char(2),char(11),char(255),char(236),char(2),char(108), +char(0),char(15),char(255),char(174),char(2),char(108),char(0),char(17),char(255),char(174), +char(2),char(108),char(1),char(157),char(255),char(236),char(2),char(108),char(1),char(164), +char(255),char(215),char(2),char(108),char(1),char(166),char(255),char(236),char(2),char(108), +char(1),char(168),char(255),char(215),char(2),char(108),char(1),char(170),char(255),char(215), +char(2),char(108),char(1),char(174),char(255),char(215),char(2),char(108),char(1),char(176), +char(255),char(215),char(2),char(108),char(1),char(177),char(255),char(236),char(2),char(108), +char(1),char(181),char(255),char(215),char(2),char(108),char(1),char(188),char(255),char(195), +char(2),char(108),char(1),char(189),char(255),char(215),char(2),char(108),char(1),char(191), +char(255),char(215),char(2),char(108),char(1),char(193),char(255),char(215),char(2),char(108), +char(1),char(196),char(255),char(236),char(2),char(108),char(1),char(199),char(255),char(236), +char(2),char(108),char(1),char(206),char(255),char(236),char(2),char(108),char(1),char(213), +char(255),char(236),char(2),char(108),char(1),char(242),char(255),char(236),char(2),char(108), +char(2),char(8),char(255),char(174),char(2),char(108),char(2),char(12),char(255),char(174), +char(2),char(108),char(2),char(114),char(255),char(215),char(2),char(108),char(2),char(115), +char(255),char(236),char(2),char(108),char(2),char(122),char(255),char(236),char(2),char(108), +char(2),char(124),char(255),char(215),char(2),char(108),char(2),char(128),char(255),char(236), +char(2),char(108),char(2),char(130),char(255),char(236),char(2),char(108),char(2),char(159), +char(255),char(215),char(2),char(108),char(2),char(161),char(255),char(236),char(2),char(108), +char(2),char(169),char(255),char(236),char(2),char(108),char(2),char(181),char(255),char(195), +char(2),char(108),char(2),char(183),char(255),char(236),char(2),char(108),char(2),char(185), +char(255),char(236),char(2),char(108),char(2),char(187),char(255),char(215),char(2),char(108), +char(2),char(189),char(255),char(236),char(2),char(108),char(2),char(191),char(255),char(215), +char(2),char(108),char(2),char(193),char(255),char(215),char(2),char(108),char(2),char(202), +char(255),char(215),char(2),char(108),char(2),char(206),char(255),char(215),char(2),char(108), +char(2),char(207),char(255),char(236),char(2),char(108),char(2),char(212),char(255),char(215), +char(2),char(108),char(2),char(217),char(255),char(215),char(2),char(108),char(2),char(219), +char(255),char(215),char(2),char(108),char(2),char(221),char(255),char(215),char(2),char(108), +char(2),char(229),char(255),char(215),char(2),char(108),char(2),char(231),char(255),char(236), +char(2),char(108),char(2),char(245),char(255),char(236),char(2),char(108),char(2),char(247), +char(255),char(215),char(2),char(108),char(2),char(249),char(255),char(215),char(2),char(108), +char(2),char(251),char(255),char(215),char(2),char(108),char(2),char(253),char(255),char(215), +char(2),char(108),char(3),char(5),char(255),char(215),char(2),char(108),char(3),char(7), +char(255),char(215),char(2),char(108),char(3),char(13),char(255),char(215),char(2),char(108), +char(3),char(15),char(255),char(215),char(2),char(108),char(3),char(17),char(255),char(215), +char(2),char(108),char(3),char(18),char(255),char(236),char(2),char(108),char(3),char(23), +char(255),char(236),char(2),char(108),char(3),char(27),char(255),char(215),char(2),char(108), +char(3),char(28),char(255),char(236),char(2),char(109),char(0),char(15),char(255),char(174), +char(2),char(109),char(0),char(17),char(255),char(174),char(2),char(109),char(1),char(206), +char(255),char(215),char(2),char(109),char(1),char(213),char(255),char(215),char(2),char(109), +char(1),char(242),char(255),char(215),char(2),char(109),char(2),char(8),char(255),char(174), +char(2),char(109),char(2),char(12),char(255),char(174),char(2),char(109),char(2),char(115), +char(255),char(215),char(2),char(109),char(2),char(207),char(255),char(215),char(2),char(109), +char(3),char(18),char(255),char(215),char(2),char(109),char(3),char(28),char(255),char(215), +char(2),char(110),char(0),char(5),char(255),char(174),char(2),char(110),char(0),char(10), +char(255),char(174),char(2),char(110),char(1),char(157),char(255),char(215),char(2),char(110), +char(1),char(166),char(255),char(215),char(2),char(110),char(1),char(188),char(255),char(174), +char(2),char(110),char(1),char(193),char(255),char(174),char(2),char(110),char(1),char(196), +char(255),char(215),char(2),char(110),char(1),char(220),char(255),char(215),char(2),char(110), +char(1),char(228),char(255),char(215),char(2),char(110),char(2),char(7),char(255),char(174), +char(2),char(110),char(2),char(11),char(255),char(174),char(2),char(110),char(2),char(124), +char(255),char(174),char(2),char(110),char(2),char(128),char(255),char(195),char(2),char(110), +char(2),char(130),char(255),char(195),char(2),char(110),char(2),char(169),char(255),char(215), +char(2),char(110),char(2),char(170),char(255),char(215),char(2),char(110),char(2),char(181), +char(255),char(174),char(2),char(110),char(2),char(182),char(255),char(215),char(2),char(110), +char(2),char(183),char(255),char(195),char(2),char(110),char(2),char(185),char(255),char(195), +char(2),char(110),char(2),char(189),char(255),char(215),char(2),char(110),char(2),char(190), +char(255),char(215),char(2),char(110),char(2),char(191),char(255),char(174),char(2),char(110), +char(2),char(193),char(255),char(174),char(2),char(110),char(2),char(212),char(255),char(174), +char(2),char(110),char(2),char(253),char(255),char(174),char(2),char(110),char(3),char(13), +char(255),char(154),char(2),char(110),char(3),char(15),char(255),char(154),char(2),char(110), +char(3),char(23),char(255),char(215),char(2),char(110),char(3),char(24),char(255),char(215), +char(2),char(111),char(0),char(5),char(255),char(133),char(2),char(111),char(0),char(10), +char(255),char(133),char(2),char(111),char(1),char(208),char(255),char(215),char(2),char(111), +char(1),char(220),char(255),char(154),char(2),char(111),char(1),char(221),char(255),char(195), +char(2),char(111),char(1),char(223),char(255),char(215),char(2),char(111),char(1),char(225), +char(255),char(174),char(2),char(111),char(1),char(228),char(255),char(154),char(2),char(111), +char(1),char(246),char(255),char(195),char(2),char(111),char(2),char(7),char(255),char(133), +char(2),char(111),char(2),char(11),char(255),char(133),char(2),char(111),char(2),char(109), +char(255),char(215),char(2),char(111),char(2),char(129),char(255),char(215),char(2),char(111), +char(2),char(131),char(255),char(215),char(2),char(111),char(2),char(139),char(255),char(215), +char(2),char(111),char(2),char(160),char(255),char(215),char(2),char(111),char(2),char(170), +char(255),char(154),char(2),char(111),char(2),char(182),char(255),char(154),char(2),char(111), +char(2),char(184),char(255),char(195),char(2),char(111),char(2),char(186),char(255),char(195), +char(2),char(111),char(2),char(188),char(255),char(215),char(2),char(111),char(2),char(190), +char(255),char(154),char(2),char(111),char(2),char(192),char(255),char(174),char(2),char(111), +char(2),char(194),char(255),char(174),char(2),char(111),char(2),char(198),char(255),char(215), +char(2),char(111),char(2),char(200),char(255),char(215),char(2),char(111),char(2),char(203), +char(255),char(215),char(2),char(111),char(2),char(213),char(255),char(174),char(2),char(111), +char(2),char(230),char(255),char(215),char(2),char(111),char(2),char(234),char(255),char(215), +char(2),char(111),char(2),char(248),char(255),char(195),char(2),char(111),char(2),char(250), +char(255),char(195),char(2),char(111),char(2),char(252),char(255),char(195),char(2),char(111), +char(2),char(254),char(255),char(174),char(2),char(111),char(3),char(6),char(255),char(215), +char(2),char(111),char(3),char(8),char(255),char(215),char(2),char(111),char(3),char(14), +char(255),char(154),char(2),char(111),char(3),char(16),char(255),char(154),char(2),char(111), +char(3),char(24),char(255),char(154),char(2),char(112),char(1),char(159),char(255),char(215), +char(2),char(112),char(1),char(184),char(255),char(215),char(2),char(112),char(1),char(187), +char(255),char(215),char(2),char(112),char(1),char(190),char(255),char(215),char(2),char(112), +char(1),char(225),char(255),char(215),char(2),char(112),char(2),char(108),char(255),char(215), +char(2),char(112),char(2),char(126),char(255),char(215),char(2),char(112),char(2),char(132), +char(255),char(215),char(2),char(112),char(2),char(134),char(255),char(215),char(2),char(112), +char(2),char(136),char(255),char(215),char(2),char(112),char(2),char(138),char(255),char(215), +char(2),char(112),char(2),char(140),char(255),char(215),char(2),char(112),char(2),char(177), +char(255),char(215),char(2),char(112),char(2),char(179),char(255),char(215),char(2),char(112), +char(2),char(192),char(255),char(215),char(2),char(112),char(2),char(194),char(255),char(215), +char(2),char(112),char(2),char(197),char(255),char(215),char(2),char(112),char(2),char(199), +char(255),char(215),char(2),char(112),char(2),char(213),char(255),char(215),char(2),char(112), +char(2),char(239),char(255),char(215),char(2),char(112),char(2),char(241),char(255),char(215), +char(2),char(112),char(2),char(243),char(255),char(215),char(2),char(112),char(2),char(254), +char(255),char(215),char(2),char(112),char(3),char(9),char(255),char(215),char(2),char(112), +char(3),char(11),char(255),char(215),char(2),char(112),char(3),char(14),char(255),char(215), +char(2),char(112),char(3),char(16),char(255),char(215),char(2),char(112),char(3),char(21), +char(255),char(215),char(2),char(114),char(0),char(5),char(255),char(113),char(2),char(114), +char(0),char(10),char(255),char(113),char(2),char(114),char(1),char(157),char(255),char(154), +char(2),char(114),char(1),char(166),char(255),char(154),char(2),char(114),char(1),char(188), +char(255),char(113),char(2),char(114),char(1),char(190),char(255),char(215),char(2),char(114), +char(1),char(193),char(255),char(154),char(2),char(114),char(1),char(196),char(255),char(154), +char(2),char(114),char(1),char(220),char(255),char(215),char(2),char(114),char(1),char(225), +char(255),char(215),char(2),char(114),char(1),char(228),char(255),char(215),char(2),char(114), +char(2),char(7),char(255),char(113),char(2),char(114),char(2),char(11),char(255),char(113), +char(2),char(114),char(2),char(110),char(255),char(215),char(2),char(114),char(2),char(124), +char(255),char(154),char(2),char(114),char(2),char(128),char(255),char(174),char(2),char(114), +char(2),char(130),char(255),char(174),char(2),char(114),char(2),char(151),char(255),char(215), +char(2),char(114),char(2),char(155),char(255),char(215),char(2),char(114),char(2),char(167), +char(255),char(215),char(2),char(114),char(2),char(169),char(255),char(154),char(2),char(114), +char(2),char(170),char(255),char(215),char(2),char(114),char(2),char(181),char(255),char(113), +char(2),char(114),char(2),char(182),char(255),char(215),char(2),char(114),char(2),char(183), +char(255),char(133),char(2),char(114),char(2),char(185),char(255),char(133),char(2),char(114), +char(2),char(189),char(255),char(154),char(2),char(114),char(2),char(190),char(255),char(215), +char(2),char(114),char(2),char(191),char(255),char(154),char(2),char(114),char(2),char(192), +char(255),char(215),char(2),char(114),char(2),char(193),char(255),char(154),char(2),char(114), +char(2),char(194),char(255),char(215),char(2),char(114),char(2),char(197),char(255),char(154), +char(2),char(114),char(2),char(199),char(255),char(154),char(2),char(114),char(2),char(212), +char(255),char(154),char(2),char(114),char(2),char(213),char(255),char(215),char(2),char(114), +char(2),char(225),char(255),char(215),char(2),char(114),char(2),char(227),char(255),char(215), +char(2),char(114),char(2),char(253),char(255),char(154),char(2),char(114),char(2),char(254), +char(255),char(215),char(2),char(114),char(3),char(3),char(255),char(215),char(2),char(114), +char(3),char(13),char(255),char(113),char(2),char(114),char(3),char(14),char(255),char(215), +char(2),char(114),char(3),char(15),char(255),char(113),char(2),char(114),char(3),char(16), +char(255),char(215),char(2),char(114),char(3),char(23),char(255),char(154),char(2),char(114), +char(3),char(24),char(255),char(215),char(2),char(115),char(0),char(5),char(255),char(113), +char(2),char(115),char(0),char(10),char(255),char(113),char(2),char(115),char(1),char(207), +char(255),char(215),char(2),char(115),char(1),char(216),char(255),char(215),char(2),char(115), +char(1),char(219),char(255),char(215),char(2),char(115),char(1),char(220),char(255),char(154), +char(2),char(115),char(1),char(221),char(255),char(195),char(2),char(115),char(1),char(222), +char(255),char(215),char(2),char(115),char(1),char(225),char(255),char(195),char(2),char(115), +char(1),char(228),char(255),char(154),char(2),char(115),char(1),char(234),char(255),char(215), +char(2),char(115),char(1),char(237),char(255),char(215),char(2),char(115),char(1),char(246), +char(255),char(195),char(2),char(115),char(2),char(7),char(255),char(113),char(2),char(115), +char(2),char(11),char(255),char(113),char(2),char(115),char(2),char(106),char(255),char(215), +char(2),char(115),char(2),char(109),char(255),char(215),char(2),char(115),char(2),char(125), +char(255),char(236),char(2),char(115),char(2),char(127),char(255),char(215),char(2),char(115), +char(2),char(129),char(255),char(215),char(2),char(115),char(2),char(131),char(255),char(215), +char(2),char(115),char(2),char(133),char(255),char(215),char(2),char(115),char(2),char(135), +char(255),char(215),char(2),char(115),char(2),char(137),char(255),char(215),char(2),char(115), +char(2),char(139),char(255),char(215),char(2),char(115),char(2),char(141),char(255),char(215), +char(2),char(115),char(2),char(170),char(255),char(154),char(2),char(115),char(2),char(178), +char(255),char(215),char(2),char(115),char(2),char(180),char(255),char(215),char(2),char(115), +char(2),char(182),char(255),char(154),char(2),char(115),char(2),char(184),char(255),char(215), +char(2),char(115),char(2),char(186),char(255),char(215),char(2),char(115),char(2),char(190), +char(255),char(154),char(2),char(115),char(2),char(192),char(255),char(195),char(2),char(115), +char(2),char(194),char(255),char(195),char(2),char(115),char(2),char(198),char(255),char(215), +char(2),char(115),char(2),char(200),char(255),char(215),char(2),char(115),char(2),char(213), +char(255),char(195),char(2),char(115),char(2),char(224),char(255),char(215),char(2),char(115), +char(2),char(240),char(255),char(215),char(2),char(115),char(2),char(242),char(255),char(215), +char(2),char(115),char(2),char(244),char(255),char(215),char(2),char(115),char(2),char(248), +char(255),char(195),char(2),char(115),char(2),char(250),char(255),char(195),char(2),char(115), +char(2),char(252),char(255),char(195),char(2),char(115),char(2),char(254),char(255),char(195), +char(2),char(115),char(3),char(10),char(255),char(215),char(2),char(115),char(3),char(12), +char(255),char(215),char(2),char(115),char(3),char(14),char(255),char(133),char(2),char(115), +char(3),char(16),char(255),char(133),char(2),char(115),char(3),char(22),char(255),char(215), +char(2),char(115),char(3),char(24),char(255),char(154),char(2),char(115),char(3),char(26), +char(255),char(215),char(2),char(116),char(0),char(5),char(255),char(113),char(2),char(116), +char(0),char(10),char(255),char(113),char(2),char(116),char(1),char(157),char(255),char(154), +char(2),char(116),char(1),char(166),char(255),char(154),char(2),char(116),char(1),char(188), +char(255),char(113),char(2),char(116),char(1),char(190),char(255),char(215),char(2),char(116), +char(1),char(193),char(255),char(154),char(2),char(116),char(1),char(196),char(255),char(154), +char(2),char(116),char(1),char(220),char(255),char(215),char(2),char(116),char(1),char(225), +char(255),char(215),char(2),char(116),char(1),char(228),char(255),char(215),char(2),char(116), +char(2),char(7),char(255),char(113),char(2),char(116),char(2),char(11),char(255),char(113), +char(2),char(116),char(2),char(110),char(255),char(215),char(2),char(116),char(2),char(124), +char(255),char(154),char(2),char(116),char(2),char(128),char(255),char(174),char(2),char(116), +char(2),char(130),char(255),char(174),char(2),char(116),char(2),char(151),char(255),char(215), +char(2),char(116),char(2),char(155),char(255),char(215),char(2),char(116),char(2),char(167), +char(255),char(215),char(2),char(116),char(2),char(169),char(255),char(154),char(2),char(116), +char(2),char(170),char(255),char(215),char(2),char(116),char(2),char(181),char(255),char(113), +char(2),char(116),char(2),char(182),char(255),char(215),char(2),char(116),char(2),char(183), +char(255),char(133),char(2),char(116),char(2),char(185),char(255),char(133),char(2),char(116), +char(2),char(189),char(255),char(154),char(2),char(116),char(2),char(190),char(255),char(215), +char(2),char(116),char(2),char(191),char(255),char(154),char(2),char(116),char(2),char(192), +char(255),char(215),char(2),char(116),char(2),char(193),char(255),char(154),char(2),char(116), +char(2),char(194),char(255),char(215),char(2),char(116),char(2),char(197),char(255),char(154), +char(2),char(116),char(2),char(199),char(255),char(154),char(2),char(116),char(2),char(212), +char(255),char(154),char(2),char(116),char(2),char(213),char(255),char(215),char(2),char(116), +char(2),char(225),char(255),char(215),char(2),char(116),char(2),char(227),char(255),char(215), +char(2),char(116),char(2),char(253),char(255),char(154),char(2),char(116),char(2),char(254), +char(255),char(215),char(2),char(116),char(3),char(3),char(255),char(215),char(2),char(116), +char(3),char(13),char(255),char(113),char(2),char(116),char(3),char(14),char(255),char(215), +char(2),char(116),char(3),char(15),char(255),char(113),char(2),char(116),char(3),char(16), +char(255),char(215),char(2),char(116),char(3),char(23),char(255),char(154),char(2),char(116), +char(3),char(24),char(255),char(215),char(2),char(117),char(0),char(5),char(255),char(113), +char(2),char(117),char(0),char(10),char(255),char(113),char(2),char(117),char(1),char(207), +char(255),char(215),char(2),char(117),char(1),char(216),char(255),char(215),char(2),char(117), +char(1),char(219),char(255),char(215),char(2),char(117),char(1),char(220),char(255),char(154), +char(2),char(117),char(1),char(221),char(255),char(195),char(2),char(117),char(1),char(222), +char(255),char(215),char(2),char(117),char(1),char(225),char(255),char(195),char(2),char(117), +char(1),char(228),char(255),char(154),char(2),char(117),char(1),char(234),char(255),char(215), +char(2),char(117),char(1),char(237),char(255),char(215),char(2),char(117),char(1),char(246), +char(255),char(195),char(2),char(117),char(2),char(7),char(255),char(113),char(2),char(117), +char(2),char(11),char(255),char(113),char(2),char(117),char(2),char(106),char(255),char(215), +char(2),char(117),char(2),char(109),char(255),char(215),char(2),char(117),char(2),char(125), +char(255),char(236),char(2),char(117),char(2),char(127),char(255),char(215),char(2),char(117), +char(2),char(129),char(255),char(215),char(2),char(117),char(2),char(131),char(255),char(215), +char(2),char(117),char(2),char(133),char(255),char(215),char(2),char(117),char(2),char(135), +char(255),char(215),char(2),char(117),char(2),char(137),char(255),char(215),char(2),char(117), +char(2),char(139),char(255),char(215),char(2),char(117),char(2),char(141),char(255),char(215), +char(2),char(117),char(2),char(170),char(255),char(154),char(2),char(117),char(2),char(178), +char(255),char(215),char(2),char(117),char(2),char(180),char(255),char(215),char(2),char(117), +char(2),char(182),char(255),char(154),char(2),char(117),char(2),char(184),char(255),char(215), +char(2),char(117),char(2),char(186),char(255),char(215),char(2),char(117),char(2),char(190), +char(255),char(154),char(2),char(117),char(2),char(192),char(255),char(195),char(2),char(117), +char(2),char(194),char(255),char(195),char(2),char(117),char(2),char(198),char(255),char(215), +char(2),char(117),char(2),char(200),char(255),char(215),char(2),char(117),char(2),char(213), +char(255),char(195),char(2),char(117),char(2),char(224),char(255),char(215),char(2),char(117), +char(2),char(240),char(255),char(215),char(2),char(117),char(2),char(242),char(255),char(215), +char(2),char(117),char(2),char(244),char(255),char(215),char(2),char(117),char(2),char(248), +char(255),char(195),char(2),char(117),char(2),char(250),char(255),char(195),char(2),char(117), +char(2),char(252),char(255),char(195),char(2),char(117),char(2),char(254),char(255),char(195), +char(2),char(117),char(3),char(10),char(255),char(215),char(2),char(117),char(3),char(12), +char(255),char(215),char(2),char(117),char(3),char(14),char(255),char(133),char(2),char(117), +char(3),char(16),char(255),char(133),char(2),char(117),char(3),char(22),char(255),char(215), +char(2),char(117),char(3),char(24),char(255),char(154),char(2),char(117),char(3),char(26), +char(255),char(215),char(2),char(118),char(3),char(13),char(255),char(236),char(2),char(118), +char(3),char(15),char(255),char(236),char(2),char(120),char(3),char(13),char(255),char(236), +char(2),char(120),char(3),char(15),char(255),char(236),char(2),char(122),char(0),char(15), +char(255),char(174),char(2),char(122),char(0),char(17),char(255),char(174),char(2),char(122), +char(2),char(8),char(255),char(174),char(2),char(122),char(2),char(12),char(255),char(174), +char(2),char(122),char(2),char(128),char(255),char(236),char(2),char(122),char(2),char(130), +char(255),char(236),char(2),char(122),char(2),char(183),char(255),char(236),char(2),char(122), +char(2),char(185),char(255),char(236),char(2),char(122),char(3),char(13),char(255),char(215), +char(2),char(122),char(3),char(15),char(255),char(215),char(2),char(124),char(0),char(15), +char(255),char(113),char(2),char(124),char(0),char(17),char(255),char(113),char(2),char(124), +char(1),char(164),char(255),char(195),char(2),char(124),char(1),char(170),char(255),char(174), +char(2),char(124),char(1),char(174),char(255),char(195),char(2),char(124),char(1),char(181), +char(255),char(195),char(2),char(124),char(1),char(206),char(255),char(215),char(2),char(124), +char(1),char(213),char(255),char(215),char(2),char(124),char(1),char(242),char(255),char(215), +char(2),char(124),char(2),char(8),char(255),char(113),char(2),char(124),char(2),char(12), +char(255),char(113),char(2),char(124),char(2),char(114),char(255),char(174),char(2),char(124), +char(2),char(115),char(255),char(215),char(2),char(124),char(2),char(206),char(255),char(195), +char(2),char(124),char(2),char(207),char(255),char(215),char(2),char(124),char(2),char(217), +char(255),char(174),char(2),char(124),char(2),char(219),char(255),char(174),char(2),char(124), +char(2),char(221),char(255),char(174),char(2),char(124),char(3),char(9),char(255),char(174), +char(2),char(124),char(3),char(11),char(255),char(174),char(2),char(124),char(3),char(17), +char(255),char(195),char(2),char(124),char(3),char(18),char(255),char(215),char(2),char(124), +char(3),char(27),char(255),char(195),char(2),char(124),char(3),char(28),char(255),char(215), +char(2),char(125),char(0),char(5),char(255),char(236),char(2),char(125),char(0),char(10), +char(255),char(236),char(2),char(125),char(1),char(208),char(255),char(215),char(2),char(125), +char(1),char(220),char(255),char(236),char(2),char(125),char(1),char(221),char(255),char(236), +char(2),char(125),char(1),char(223),char(255),char(215),char(2),char(125),char(1),char(225), +char(255),char(236),char(2),char(125),char(1),char(228),char(255),char(236),char(2),char(125), +char(1),char(246),char(255),char(236),char(2),char(125),char(2),char(7),char(255),char(236), +char(2),char(125),char(2),char(11),char(255),char(236),char(2),char(125),char(2),char(160), +char(255),char(215),char(2),char(125),char(2),char(170),char(255),char(236),char(2),char(125), +char(2),char(182),char(255),char(236),char(2),char(125),char(2),char(188),char(255),char(215), +char(2),char(125),char(2),char(190),char(255),char(236),char(2),char(125),char(2),char(192), +char(255),char(236),char(2),char(125),char(2),char(194),char(255),char(236),char(2),char(125), +char(2),char(203),char(255),char(215),char(2),char(125),char(2),char(213),char(255),char(236), +char(2),char(125),char(2),char(230),char(255),char(215),char(2),char(125),char(2),char(248), +char(255),char(236),char(2),char(125),char(2),char(250),char(255),char(236),char(2),char(125), +char(2),char(252),char(255),char(236),char(2),char(125),char(2),char(254),char(255),char(236), +char(2),char(125),char(3),char(6),char(255),char(215),char(2),char(125),char(3),char(8), +char(255),char(215),char(2),char(125),char(3),char(14),char(255),char(236),char(2),char(125), +char(3),char(16),char(255),char(236),char(2),char(125),char(3),char(24),char(255),char(236), +char(2),char(126),char(0),char(15),char(255),char(174),char(2),char(126),char(0),char(17), +char(255),char(174),char(2),char(126),char(1),char(157),char(255),char(236),char(2),char(126), +char(1),char(164),char(255),char(215),char(2),char(126),char(1),char(166),char(255),char(236), +char(2),char(126),char(1),char(168),char(255),char(215),char(2),char(126),char(1),char(170), +char(255),char(215),char(2),char(126),char(1),char(174),char(255),char(215),char(2),char(126), +char(1),char(176),char(255),char(215),char(2),char(126),char(1),char(177),char(255),char(236), +char(2),char(126),char(1),char(181),char(255),char(215),char(2),char(126),char(1),char(188), +char(255),char(195),char(2),char(126),char(1),char(189),char(255),char(215),char(2),char(126), +char(1),char(191),char(255),char(215),char(2),char(126),char(1),char(193),char(255),char(215), +char(2),char(126),char(1),char(196),char(255),char(236),char(2),char(126),char(1),char(199), +char(255),char(236),char(2),char(126),char(1),char(206),char(255),char(236),char(2),char(126), +char(1),char(213),char(255),char(236),char(2),char(126),char(1),char(242),char(255),char(236), +char(2),char(126),char(2),char(8),char(255),char(174),char(2),char(126),char(2),char(12), +char(255),char(174),char(2),char(126),char(2),char(114),char(255),char(215),char(2),char(126), +char(2),char(115),char(255),char(236),char(2),char(126),char(2),char(122),char(255),char(236), +char(2),char(126),char(2),char(124),char(255),char(215),char(2),char(126),char(2),char(128), +char(255),char(236),char(2),char(126),char(2),char(130),char(255),char(236),char(2),char(126), +char(2),char(159),char(255),char(215),char(2),char(126),char(2),char(161),char(255),char(236), +char(2),char(126),char(2),char(169),char(255),char(236),char(2),char(126),char(2),char(181), +char(255),char(195),char(2),char(126),char(2),char(183),char(255),char(236),char(2),char(126), +char(2),char(185),char(255),char(236),char(2),char(126),char(2),char(187),char(255),char(215), +char(2),char(126),char(2),char(189),char(255),char(236),char(2),char(126),char(2),char(191), +char(255),char(215),char(2),char(126),char(2),char(193),char(255),char(215),char(2),char(126), +char(2),char(202),char(255),char(215),char(2),char(126),char(2),char(206),char(255),char(215), +char(2),char(126),char(2),char(207),char(255),char(236),char(2),char(126),char(2),char(212), +char(255),char(215),char(2),char(126),char(2),char(217),char(255),char(215),char(2),char(126), +char(2),char(219),char(255),char(215),char(2),char(126),char(2),char(221),char(255),char(215), +char(2),char(126),char(2),char(229),char(255),char(215),char(2),char(126),char(2),char(231), +char(255),char(236),char(2),char(126),char(2),char(245),char(255),char(236),char(2),char(126), +char(2),char(247),char(255),char(215),char(2),char(126),char(2),char(249),char(255),char(215), +char(2),char(126),char(2),char(251),char(255),char(215),char(2),char(126),char(2),char(253), +char(255),char(215),char(2),char(126),char(3),char(5),char(255),char(215),char(2),char(126), +char(3),char(7),char(255),char(215),char(2),char(126),char(3),char(13),char(255),char(215), +char(2),char(126),char(3),char(15),char(255),char(215),char(2),char(126),char(3),char(17), +char(255),char(215),char(2),char(126),char(3),char(18),char(255),char(236),char(2),char(126), +char(3),char(23),char(255),char(236),char(2),char(126),char(3),char(27),char(255),char(215), +char(2),char(126),char(3),char(28),char(255),char(236),char(2),char(127),char(0),char(5), +char(255),char(236),char(2),char(127),char(0),char(10),char(255),char(236),char(2),char(127), +char(1),char(208),char(255),char(215),char(2),char(127),char(1),char(220),char(255),char(236), +char(2),char(127),char(1),char(221),char(255),char(236),char(2),char(127),char(1),char(223), +char(255),char(215),char(2),char(127),char(1),char(225),char(255),char(236),char(2),char(127), +char(1),char(228),char(255),char(236),char(2),char(127),char(1),char(246),char(255),char(236), +char(2),char(127),char(2),char(7),char(255),char(236),char(2),char(127),char(2),char(11), +char(255),char(236),char(2),char(127),char(2),char(160),char(255),char(215),char(2),char(127), +char(2),char(170),char(255),char(236),char(2),char(127),char(2),char(182),char(255),char(236), +char(2),char(127),char(2),char(188),char(255),char(215),char(2),char(127),char(2),char(190), +char(255),char(236),char(2),char(127),char(2),char(192),char(255),char(236),char(2),char(127), +char(2),char(194),char(255),char(236),char(2),char(127),char(2),char(203),char(255),char(215), +char(2),char(127),char(2),char(213),char(255),char(236),char(2),char(127),char(2),char(230), +char(255),char(215),char(2),char(127),char(2),char(248),char(255),char(236),char(2),char(127), +char(2),char(250),char(255),char(236),char(2),char(127),char(2),char(252),char(255),char(236), +char(2),char(127),char(2),char(254),char(255),char(236),char(2),char(127),char(3),char(6), +char(255),char(215),char(2),char(127),char(3),char(8),char(255),char(215),char(2),char(127), +char(3),char(14),char(255),char(236),char(2),char(127),char(3),char(16),char(255),char(236), +char(2),char(127),char(3),char(24),char(255),char(236),char(2),char(128),char(0),char(15), +char(255),char(133),char(2),char(128),char(0),char(17),char(255),char(133),char(2),char(128), +char(1),char(159),char(255),char(236),char(2),char(128),char(1),char(164),char(255),char(154), +char(2),char(128),char(1),char(170),char(255),char(113),char(2),char(128),char(1),char(174), +char(255),char(154),char(2),char(128),char(1),char(181),char(255),char(154),char(2),char(128), +char(1),char(184),char(255),char(236),char(2),char(128),char(1),char(187),char(255),char(236), +char(2),char(128),char(1),char(190),char(255),char(195),char(2),char(128),char(1),char(201), +char(255),char(236),char(2),char(128),char(1),char(206),char(255),char(174),char(2),char(128), +char(1),char(207),char(255),char(215),char(2),char(128),char(1),char(213),char(255),char(174), +char(2),char(128),char(1),char(216),char(255),char(215),char(2),char(128),char(1),char(219), +char(255),char(215),char(2),char(128),char(1),char(222),char(255),char(215),char(2),char(128), +char(1),char(225),char(255),char(215),char(2),char(128),char(1),char(234),char(255),char(215), +char(2),char(128),char(1),char(235),char(0),char(102),char(2),char(128),char(1),char(237), +char(255),char(215),char(2),char(128),char(1),char(238),char(255),char(236),char(2),char(128), +char(1),char(242),char(255),char(174),char(2),char(128),char(1),char(244),char(0),char(102), +char(2),char(128),char(2),char(8),char(255),char(133),char(2),char(128),char(2),char(12), +char(255),char(133),char(2),char(128),char(2),char(106),char(255),char(215),char(2),char(128), +char(2),char(108),char(255),char(236),char(2),char(128),char(2),char(114),char(255),char(113), +char(2),char(128),char(2),char(115),char(255),char(174),char(2),char(128),char(2),char(126), +char(255),char(236),char(2),char(128),char(2),char(127),char(255),char(215),char(2),char(128), +char(2),char(132),char(255),char(236),char(2),char(128),char(2),char(133),char(255),char(215), +char(2),char(128),char(2),char(134),char(255),char(236),char(2),char(128),char(2),char(135), +char(255),char(215),char(2),char(128),char(2),char(136),char(255),char(236),char(2),char(128), +char(2),char(137),char(255),char(215),char(2),char(128),char(2),char(138),char(255),char(236), +char(2),char(128),char(2),char(140),char(255),char(236),char(2),char(128),char(2),char(141), +char(255),char(215),char(2),char(128),char(2),char(152),char(0),char(102),char(2),char(128), +char(2),char(168),char(0),char(102),char(2),char(128),char(2),char(177),char(255),char(236), +char(2),char(128),char(2),char(178),char(255),char(215),char(2),char(128),char(2),char(179), +char(255),char(236),char(2),char(128),char(2),char(180),char(255),char(215),char(2),char(128), +char(2),char(192),char(255),char(215),char(2),char(128),char(2),char(194),char(255),char(215), +char(2),char(128),char(2),char(197),char(255),char(215),char(2),char(128),char(2),char(198), +char(255),char(195),char(2),char(128),char(2),char(199),char(255),char(215),char(2),char(128), +char(2),char(200),char(255),char(195),char(2),char(128),char(2),char(206),char(255),char(154), +char(2),char(128),char(2),char(207),char(255),char(174),char(2),char(128),char(2),char(213), +char(255),char(215),char(2),char(128),char(2),char(217),char(255),char(113),char(2),char(128), +char(2),char(219),char(255),char(113),char(2),char(128),char(2),char(221),char(255),char(113), +char(2),char(128),char(2),char(224),char(255),char(215),char(2),char(128),char(2),char(239), +char(255),char(236),char(2),char(128),char(2),char(240),char(255),char(215),char(2),char(128), +char(2),char(241),char(255),char(236),char(2),char(128),char(2),char(242),char(255),char(215), +char(2),char(128),char(2),char(243),char(255),char(236),char(2),char(128),char(2),char(244), +char(255),char(215),char(2),char(128),char(2),char(254),char(255),char(215),char(2),char(128), +char(3),char(9),char(255),char(113),char(2),char(128),char(3),char(10),char(255),char(215), +char(2),char(128),char(3),char(11),char(255),char(113),char(2),char(128),char(3),char(12), +char(255),char(215),char(2),char(128),char(3),char(17),char(255),char(154),char(2),char(128), +char(3),char(18),char(255),char(174),char(2),char(128),char(3),char(21),char(255),char(236), +char(2),char(128),char(3),char(22),char(255),char(215),char(2),char(128),char(3),char(26), +char(255),char(215),char(2),char(128),char(3),char(27),char(255),char(154),char(2),char(128), +char(3),char(28),char(255),char(174),char(2),char(129),char(0),char(15),char(255),char(174), +char(2),char(129),char(0),char(17),char(255),char(174),char(2),char(129),char(1),char(206), +char(255),char(215),char(2),char(129),char(1),char(213),char(255),char(215),char(2),char(129), +char(1),char(242),char(255),char(215),char(2),char(129),char(2),char(8),char(255),char(174), +char(2),char(129),char(2),char(12),char(255),char(174),char(2),char(129),char(2),char(115), +char(255),char(215),char(2),char(129),char(2),char(207),char(255),char(215),char(2),char(129), +char(3),char(18),char(255),char(215),char(2),char(129),char(3),char(28),char(255),char(215), +char(2),char(130),char(0),char(15),char(255),char(133),char(2),char(130),char(0),char(17), +char(255),char(133),char(2),char(130),char(1),char(159),char(255),char(236),char(2),char(130), +char(1),char(164),char(255),char(154),char(2),char(130),char(1),char(170),char(255),char(113), +char(2),char(130),char(1),char(174),char(255),char(154),char(2),char(130),char(1),char(181), +char(255),char(154),char(2),char(130),char(1),char(184),char(255),char(236),char(2),char(130), +char(1),char(187),char(255),char(236),char(2),char(130),char(1),char(190),char(255),char(195), +char(2),char(130),char(1),char(201),char(255),char(236),char(2),char(130),char(1),char(206), +char(255),char(174),char(2),char(130),char(1),char(207),char(255),char(215),char(2),char(130), +char(1),char(213),char(255),char(174),char(2),char(130),char(1),char(216),char(255),char(215), +char(2),char(130),char(1),char(219),char(255),char(215),char(2),char(130),char(1),char(222), +char(255),char(215),char(2),char(130),char(1),char(225),char(255),char(215),char(2),char(130), +char(1),char(234),char(255),char(215),char(2),char(130),char(1),char(235),char(0),char(102), +char(2),char(130),char(1),char(237),char(255),char(215),char(2),char(130),char(1),char(238), +char(255),char(236),char(2),char(130),char(1),char(242),char(255),char(174),char(2),char(130), +char(1),char(244),char(0),char(102),char(2),char(130),char(2),char(8),char(255),char(133), +char(2),char(130),char(2),char(12),char(255),char(133),char(2),char(130),char(2),char(106), +char(255),char(215),char(2),char(130),char(2),char(108),char(255),char(236),char(2),char(130), +char(2),char(114),char(255),char(113),char(2),char(130),char(2),char(115),char(255),char(174), +char(2),char(130),char(2),char(126),char(255),char(236),char(2),char(130),char(2),char(127), +char(255),char(215),char(2),char(130),char(2),char(132),char(255),char(236),char(2),char(130), +char(2),char(133),char(255),char(215),char(2),char(130),char(2),char(134),char(255),char(236), +char(2),char(130),char(2),char(135),char(255),char(215),char(2),char(130),char(2),char(136), +char(255),char(236),char(2),char(130),char(2),char(137),char(255),char(215),char(2),char(130), +char(2),char(138),char(255),char(236),char(2),char(130),char(2),char(140),char(255),char(236), +char(2),char(130),char(2),char(141),char(255),char(215),char(2),char(130),char(2),char(152), +char(0),char(102),char(2),char(130),char(2),char(168),char(0),char(102),char(2),char(130), +char(2),char(177),char(255),char(236),char(2),char(130),char(2),char(178),char(255),char(215), +char(2),char(130),char(2),char(179),char(255),char(236),char(2),char(130),char(2),char(180), +char(255),char(215),char(2),char(130),char(2),char(192),char(255),char(215),char(2),char(130), +char(2),char(194),char(255),char(215),char(2),char(130),char(2),char(197),char(255),char(215), +char(2),char(130),char(2),char(198),char(255),char(195),char(2),char(130),char(2),char(199), +char(255),char(215),char(2),char(130),char(2),char(200),char(255),char(195),char(2),char(130), +char(2),char(206),char(255),char(154),char(2),char(130),char(2),char(207),char(255),char(174), +char(2),char(130),char(2),char(213),char(255),char(215),char(2),char(130),char(2),char(217), +char(255),char(113),char(2),char(130),char(2),char(219),char(255),char(113),char(2),char(130), +char(2),char(221),char(255),char(113),char(2),char(130),char(2),char(224),char(255),char(215), +char(2),char(130),char(2),char(239),char(255),char(236),char(2),char(130),char(2),char(240), +char(255),char(215),char(2),char(130),char(2),char(241),char(255),char(236),char(2),char(130), +char(2),char(242),char(255),char(215),char(2),char(130),char(2),char(243),char(255),char(236), +char(2),char(130),char(2),char(244),char(255),char(215),char(2),char(130),char(2),char(254), +char(255),char(215),char(2),char(130),char(3),char(9),char(255),char(113),char(2),char(130), +char(3),char(10),char(255),char(215),char(2),char(130),char(3),char(11),char(255),char(113), +char(2),char(130),char(3),char(12),char(255),char(215),char(2),char(130),char(3),char(17), +char(255),char(154),char(2),char(130),char(3),char(18),char(255),char(174),char(2),char(130), +char(3),char(21),char(255),char(236),char(2),char(130),char(3),char(22),char(255),char(215), +char(2),char(130),char(3),char(26),char(255),char(215),char(2),char(130),char(3),char(27), +char(255),char(154),char(2),char(130),char(3),char(28),char(255),char(174),char(2),char(131), +char(0),char(15),char(255),char(174),char(2),char(131),char(0),char(17),char(255),char(174), +char(2),char(131),char(1),char(206),char(255),char(215),char(2),char(131),char(1),char(213), +char(255),char(215),char(2),char(131),char(1),char(242),char(255),char(215),char(2),char(131), +char(2),char(8),char(255),char(174),char(2),char(131),char(2),char(12),char(255),char(174), +char(2),char(131),char(2),char(115),char(255),char(215),char(2),char(131),char(2),char(207), +char(255),char(215),char(2),char(131),char(3),char(18),char(255),char(215),char(2),char(131), +char(3),char(28),char(255),char(215),char(2),char(132),char(0),char(15),char(255),char(174), +char(2),char(132),char(0),char(17),char(255),char(174),char(2),char(132),char(1),char(206), +char(255),char(215),char(2),char(132),char(1),char(213),char(255),char(215),char(2),char(132), +char(1),char(242),char(255),char(215),char(2),char(132),char(2),char(8),char(255),char(174), +char(2),char(132),char(2),char(12),char(255),char(174),char(2),char(132),char(2),char(115), +char(255),char(215),char(2),char(132),char(2),char(207),char(255),char(215),char(2),char(132), +char(3),char(18),char(255),char(215),char(2),char(132),char(3),char(28),char(255),char(215), +char(2),char(133),char(0),char(15),char(255),char(174),char(2),char(133),char(0),char(17), +char(255),char(174),char(2),char(133),char(1),char(206),char(255),char(215),char(2),char(133), +char(1),char(213),char(255),char(215),char(2),char(133),char(1),char(242),char(255),char(215), +char(2),char(133),char(2),char(8),char(255),char(174),char(2),char(133),char(2),char(12), +char(255),char(174),char(2),char(133),char(2),char(115),char(255),char(215),char(2),char(133), +char(2),char(207),char(255),char(215),char(2),char(133),char(3),char(18),char(255),char(215), +char(2),char(133),char(3),char(28),char(255),char(215),char(2),char(134),char(0),char(15), +char(255),char(174),char(2),char(134),char(0),char(17),char(255),char(174),char(2),char(134), +char(1),char(157),char(255),char(236),char(2),char(134),char(1),char(164),char(255),char(215), +char(2),char(134),char(1),char(166),char(255),char(236),char(2),char(134),char(1),char(168), +char(255),char(215),char(2),char(134),char(1),char(170),char(255),char(215),char(2),char(134), +char(1),char(174),char(255),char(215),char(2),char(134),char(1),char(176),char(255),char(215), +char(2),char(134),char(1),char(177),char(255),char(236),char(2),char(134),char(1),char(181), +char(255),char(215),char(2),char(134),char(1),char(188),char(255),char(195),char(2),char(134), +char(1),char(189),char(255),char(215),char(2),char(134),char(1),char(191),char(255),char(215), +char(2),char(134),char(1),char(193),char(255),char(215),char(2),char(134),char(1),char(196), +char(255),char(236),char(2),char(134),char(1),char(199),char(255),char(236),char(2),char(134), +char(1),char(206),char(255),char(236),char(2),char(134),char(1),char(213),char(255),char(236), +char(2),char(134),char(1),char(242),char(255),char(236),char(2),char(134),char(2),char(8), +char(255),char(174),char(2),char(134),char(2),char(12),char(255),char(174),char(2),char(134), +char(2),char(114),char(255),char(215),char(2),char(134),char(2),char(115),char(255),char(236), +char(2),char(134),char(2),char(122),char(255),char(236),char(2),char(134),char(2),char(124), +char(255),char(215),char(2),char(134),char(2),char(128),char(255),char(236),char(2),char(134), +char(2),char(130),char(255),char(236),char(2),char(134),char(2),char(159),char(255),char(215), +char(2),char(134),char(2),char(161),char(255),char(236),char(2),char(134),char(2),char(169), +char(255),char(236),char(2),char(134),char(2),char(181),char(255),char(195),char(2),char(134), +char(2),char(183),char(255),char(236),char(2),char(134),char(2),char(185),char(255),char(236), +char(2),char(134),char(2),char(187),char(255),char(215),char(2),char(134),char(2),char(189), +char(255),char(236),char(2),char(134),char(2),char(191),char(255),char(215),char(2),char(134), +char(2),char(193),char(255),char(215),char(2),char(134),char(2),char(202),char(255),char(215), +char(2),char(134),char(2),char(206),char(255),char(215),char(2),char(134),char(2),char(207), +char(255),char(236),char(2),char(134),char(2),char(212),char(255),char(215),char(2),char(134), +char(2),char(217),char(255),char(215),char(2),char(134),char(2),char(219),char(255),char(215), +char(2),char(134),char(2),char(221),char(255),char(215),char(2),char(134),char(2),char(229), +char(255),char(215),char(2),char(134),char(2),char(231),char(255),char(236),char(2),char(134), +char(2),char(245),char(255),char(236),char(2),char(134),char(2),char(247),char(255),char(215), +char(2),char(134),char(2),char(249),char(255),char(215),char(2),char(134),char(2),char(251), +char(255),char(215),char(2),char(134),char(2),char(253),char(255),char(215),char(2),char(134), +char(3),char(5),char(255),char(215),char(2),char(134),char(3),char(7),char(255),char(215), +char(2),char(134),char(3),char(13),char(255),char(215),char(2),char(134),char(3),char(15), +char(255),char(215),char(2),char(134),char(3),char(17),char(255),char(215),char(2),char(134), +char(3),char(18),char(255),char(236),char(2),char(134),char(3),char(23),char(255),char(236), +char(2),char(134),char(3),char(27),char(255),char(215),char(2),char(134),char(3),char(28), +char(255),char(236),char(2),char(135),char(0),char(5),char(255),char(236),char(2),char(135), +char(0),char(10),char(255),char(236),char(2),char(135),char(1),char(208),char(255),char(215), +char(2),char(135),char(1),char(220),char(255),char(236),char(2),char(135),char(1),char(221), +char(255),char(236),char(2),char(135),char(1),char(223),char(255),char(215),char(2),char(135), +char(1),char(225),char(255),char(236),char(2),char(135),char(1),char(228),char(255),char(236), +char(2),char(135),char(1),char(246),char(255),char(236),char(2),char(135),char(2),char(7), +char(255),char(236),char(2),char(135),char(2),char(11),char(255),char(236),char(2),char(135), +char(2),char(160),char(255),char(215),char(2),char(135),char(2),char(170),char(255),char(236), +char(2),char(135),char(2),char(182),char(255),char(236),char(2),char(135),char(2),char(188), +char(255),char(215),char(2),char(135),char(2),char(190),char(255),char(236),char(2),char(135), +char(2),char(192),char(255),char(236),char(2),char(135),char(2),char(194),char(255),char(236), +char(2),char(135),char(2),char(203),char(255),char(215),char(2),char(135),char(2),char(213), +char(255),char(236),char(2),char(135),char(2),char(230),char(255),char(215),char(2),char(135), +char(2),char(248),char(255),char(236),char(2),char(135),char(2),char(250),char(255),char(236), +char(2),char(135),char(2),char(252),char(255),char(236),char(2),char(135),char(2),char(254), +char(255),char(236),char(2),char(135),char(3),char(6),char(255),char(215),char(2),char(135), +char(3),char(8),char(255),char(215),char(2),char(135),char(3),char(14),char(255),char(236), +char(2),char(135),char(3),char(16),char(255),char(236),char(2),char(135),char(3),char(24), +char(255),char(236),char(2),char(136),char(0),char(15),char(255),char(174),char(2),char(136), +char(0),char(17),char(255),char(174),char(2),char(136),char(1),char(157),char(255),char(236), +char(2),char(136),char(1),char(164),char(255),char(215),char(2),char(136),char(1),char(166), +char(255),char(236),char(2),char(136),char(1),char(168),char(255),char(215),char(2),char(136), +char(1),char(170),char(255),char(215),char(2),char(136),char(1),char(174),char(255),char(215), +char(2),char(136),char(1),char(176),char(255),char(215),char(2),char(136),char(1),char(177), +char(255),char(236),char(2),char(136),char(1),char(181),char(255),char(215),char(2),char(136), +char(1),char(188),char(255),char(195),char(2),char(136),char(1),char(189),char(255),char(215), +char(2),char(136),char(1),char(191),char(255),char(215),char(2),char(136),char(1),char(193), +char(255),char(215),char(2),char(136),char(1),char(196),char(255),char(236),char(2),char(136), +char(1),char(199),char(255),char(236),char(2),char(136),char(1),char(206),char(255),char(236), +char(2),char(136),char(1),char(213),char(255),char(236),char(2),char(136),char(1),char(242), +char(255),char(236),char(2),char(136),char(2),char(8),char(255),char(174),char(2),char(136), +char(2),char(12),char(255),char(174),char(2),char(136),char(2),char(114),char(255),char(215), +char(2),char(136),char(2),char(115),char(255),char(236),char(2),char(136),char(2),char(122), +char(255),char(236),char(2),char(136),char(2),char(124),char(255),char(215),char(2),char(136), +char(2),char(128),char(255),char(236),char(2),char(136),char(2),char(130),char(255),char(236), +char(2),char(136),char(2),char(159),char(255),char(215),char(2),char(136),char(2),char(161), +char(255),char(236),char(2),char(136),char(2),char(169),char(255),char(236),char(2),char(136), +char(2),char(181),char(255),char(195),char(2),char(136),char(2),char(183),char(255),char(236), +char(2),char(136),char(2),char(185),char(255),char(236),char(2),char(136),char(2),char(187), +char(255),char(215),char(2),char(136),char(2),char(189),char(255),char(236),char(2),char(136), +char(2),char(191),char(255),char(215),char(2),char(136),char(2),char(193),char(255),char(215), +char(2),char(136),char(2),char(202),char(255),char(215),char(2),char(136),char(2),char(206), +char(255),char(215),char(2),char(136),char(2),char(207),char(255),char(236),char(2),char(136), +char(2),char(212),char(255),char(215),char(2),char(136),char(2),char(217),char(255),char(215), +char(2),char(136),char(2),char(219),char(255),char(215),char(2),char(136),char(2),char(221), +char(255),char(215),char(2),char(136),char(2),char(229),char(255),char(215),char(2),char(136), +char(2),char(231),char(255),char(236),char(2),char(136),char(2),char(245),char(255),char(236), +char(2),char(136),char(2),char(247),char(255),char(215),char(2),char(136),char(2),char(249), +char(255),char(215),char(2),char(136),char(2),char(251),char(255),char(215),char(2),char(136), +char(2),char(253),char(255),char(215),char(2),char(136),char(3),char(5),char(255),char(215), +char(2),char(136),char(3),char(7),char(255),char(215),char(2),char(136),char(3),char(13), +char(255),char(215),char(2),char(136),char(3),char(15),char(255),char(215),char(2),char(136), +char(3),char(17),char(255),char(215),char(2),char(136),char(3),char(18),char(255),char(236), +char(2),char(136),char(3),char(23),char(255),char(236),char(2),char(136),char(3),char(27), +char(255),char(215),char(2),char(136),char(3),char(28),char(255),char(236),char(2),char(137), +char(0),char(5),char(255),char(236),char(2),char(137),char(0),char(10),char(255),char(236), +char(2),char(137),char(1),char(208),char(255),char(215),char(2),char(137),char(1),char(220), +char(255),char(236),char(2),char(137),char(1),char(221),char(255),char(236),char(2),char(137), +char(1),char(223),char(255),char(215),char(2),char(137),char(1),char(225),char(255),char(236), +char(2),char(137),char(1),char(228),char(255),char(236),char(2),char(137),char(1),char(246), +char(255),char(236),char(2),char(137),char(2),char(7),char(255),char(236),char(2),char(137), +char(2),char(11),char(255),char(236),char(2),char(137),char(2),char(160),char(255),char(215), +char(2),char(137),char(2),char(170),char(255),char(236),char(2),char(137),char(2),char(182), +char(255),char(236),char(2),char(137),char(2),char(188),char(255),char(215),char(2),char(137), +char(2),char(190),char(255),char(236),char(2),char(137),char(2),char(192),char(255),char(236), +char(2),char(137),char(2),char(194),char(255),char(236),char(2),char(137),char(2),char(203), +char(255),char(215),char(2),char(137),char(2),char(213),char(255),char(236),char(2),char(137), +char(2),char(230),char(255),char(215),char(2),char(137),char(2),char(248),char(255),char(236), +char(2),char(137),char(2),char(250),char(255),char(236),char(2),char(137),char(2),char(252), +char(255),char(236),char(2),char(137),char(2),char(254),char(255),char(236),char(2),char(137), +char(3),char(6),char(255),char(215),char(2),char(137),char(3),char(8),char(255),char(215), +char(2),char(137),char(3),char(14),char(255),char(236),char(2),char(137),char(3),char(16), +char(255),char(236),char(2),char(137),char(3),char(24),char(255),char(236),char(2),char(138), +char(0),char(15),char(255),char(174),char(2),char(138),char(0),char(17),char(255),char(174), +char(2),char(138),char(1),char(157),char(255),char(236),char(2),char(138),char(1),char(164), +char(255),char(215),char(2),char(138),char(1),char(166),char(255),char(236),char(2),char(138), +char(1),char(168),char(255),char(215),char(2),char(138),char(1),char(170),char(255),char(215), +char(2),char(138),char(1),char(174),char(255),char(215),char(2),char(138),char(1),char(176), +char(255),char(215),char(2),char(138),char(1),char(177),char(255),char(236),char(2),char(138), +char(1),char(181),char(255),char(215),char(2),char(138),char(1),char(188),char(255),char(195), +char(2),char(138),char(1),char(189),char(255),char(215),char(2),char(138),char(1),char(191), +char(255),char(215),char(2),char(138),char(1),char(193),char(255),char(215),char(2),char(138), +char(1),char(196),char(255),char(236),char(2),char(138),char(1),char(199),char(255),char(236), +char(2),char(138),char(1),char(206),char(255),char(236),char(2),char(138),char(1),char(213), +char(255),char(236),char(2),char(138),char(1),char(242),char(255),char(236),char(2),char(138), +char(2),char(8),char(255),char(174),char(2),char(138),char(2),char(12),char(255),char(174), +char(2),char(138),char(2),char(114),char(255),char(215),char(2),char(138),char(2),char(115), +char(255),char(236),char(2),char(138),char(2),char(122),char(255),char(236),char(2),char(138), +char(2),char(124),char(255),char(215),char(2),char(138),char(2),char(128),char(255),char(236), +char(2),char(138),char(2),char(130),char(255),char(236),char(2),char(138),char(2),char(159), +char(255),char(215),char(2),char(138),char(2),char(161),char(255),char(236),char(2),char(138), +char(2),char(169),char(255),char(236),char(2),char(138),char(2),char(181),char(255),char(195), +char(2),char(138),char(2),char(183),char(255),char(236),char(2),char(138),char(2),char(185), +char(255),char(236),char(2),char(138),char(2),char(187),char(255),char(215),char(2),char(138), +char(2),char(189),char(255),char(236),char(2),char(138),char(2),char(191),char(255),char(215), +char(2),char(138),char(2),char(193),char(255),char(215),char(2),char(138),char(2),char(202), +char(255),char(215),char(2),char(138),char(2),char(206),char(255),char(215),char(2),char(138), +char(2),char(207),char(255),char(236),char(2),char(138),char(2),char(212),char(255),char(215), +char(2),char(138),char(2),char(217),char(255),char(215),char(2),char(138),char(2),char(219), +char(255),char(215),char(2),char(138),char(2),char(221),char(255),char(215),char(2),char(138), +char(2),char(229),char(255),char(215),char(2),char(138),char(2),char(231),char(255),char(236), +char(2),char(138),char(2),char(245),char(255),char(236),char(2),char(138),char(2),char(247), +char(255),char(215),char(2),char(138),char(2),char(249),char(255),char(215),char(2),char(138), +char(2),char(251),char(255),char(215),char(2),char(138),char(2),char(253),char(255),char(215), +char(2),char(138),char(3),char(5),char(255),char(215),char(2),char(138),char(3),char(7), +char(255),char(215),char(2),char(138),char(3),char(13),char(255),char(215),char(2),char(138), +char(3),char(15),char(255),char(215),char(2),char(138),char(3),char(17),char(255),char(215), +char(2),char(138),char(3),char(18),char(255),char(236),char(2),char(138),char(3),char(23), +char(255),char(236),char(2),char(138),char(3),char(27),char(255),char(215),char(2),char(138), +char(3),char(28),char(255),char(236),char(2),char(139),char(0),char(15),char(255),char(174), +char(2),char(139),char(0),char(17),char(255),char(174),char(2),char(139),char(1),char(206), +char(255),char(215),char(2),char(139),char(1),char(213),char(255),char(215),char(2),char(139), +char(1),char(242),char(255),char(215),char(2),char(139),char(2),char(8),char(255),char(174), +char(2),char(139),char(2),char(12),char(255),char(174),char(2),char(139),char(2),char(115), +char(255),char(215),char(2),char(139),char(2),char(207),char(255),char(215),char(2),char(139), +char(3),char(18),char(255),char(215),char(2),char(139),char(3),char(28),char(255),char(215), +char(2),char(140),char(1),char(159),char(255),char(215),char(2),char(140),char(1),char(184), +char(255),char(215),char(2),char(140),char(1),char(187),char(255),char(215),char(2),char(140), +char(1),char(190),char(255),char(215),char(2),char(140),char(1),char(225),char(255),char(215), +char(2),char(140),char(2),char(108),char(255),char(215),char(2),char(140),char(2),char(126), +char(255),char(215),char(2),char(140),char(2),char(132),char(255),char(215),char(2),char(140), +char(2),char(134),char(255),char(215),char(2),char(140),char(2),char(136),char(255),char(215), +char(2),char(140),char(2),char(138),char(255),char(215),char(2),char(140),char(2),char(140), +char(255),char(215),char(2),char(140),char(2),char(177),char(255),char(215),char(2),char(140), +char(2),char(179),char(255),char(215),char(2),char(140),char(2),char(192),char(255),char(215), +char(2),char(140),char(2),char(194),char(255),char(215),char(2),char(140),char(2),char(197), +char(255),char(215),char(2),char(140),char(2),char(199),char(255),char(215),char(2),char(140), +char(2),char(213),char(255),char(215),char(2),char(140),char(2),char(239),char(255),char(215), +char(2),char(140),char(2),char(241),char(255),char(215),char(2),char(140),char(2),char(243), +char(255),char(215),char(2),char(140),char(2),char(254),char(255),char(215),char(2),char(140), +char(3),char(9),char(255),char(215),char(2),char(140),char(3),char(11),char(255),char(215), +char(2),char(140),char(3),char(14),char(255),char(215),char(2),char(140),char(3),char(16), +char(255),char(215),char(2),char(140),char(3),char(21),char(255),char(215),char(2),char(149), +char(1),char(163),char(0),char(225),char(2),char(149),char(2),char(234),char(0),char(41), +char(2),char(149),char(3),char(14),char(255),char(215),char(2),char(149),char(3),char(16), +char(255),char(215),char(2),char(150),char(0),char(5),char(255),char(236),char(2),char(150), +char(0),char(10),char(255),char(236),char(2),char(150),char(2),char(7),char(255),char(236), +char(2),char(150),char(2),char(11),char(255),char(236),char(2),char(151),char(0),char(5), +char(255),char(174),char(2),char(151),char(0),char(10),char(255),char(174),char(2),char(151), +char(1),char(157),char(255),char(215),char(2),char(151),char(1),char(166),char(255),char(215), +char(2),char(151),char(1),char(188),char(255),char(174),char(2),char(151),char(1),char(193), +char(255),char(174),char(2),char(151),char(1),char(196),char(255),char(215),char(2),char(151), +char(1),char(220),char(255),char(215),char(2),char(151),char(1),char(228),char(255),char(215), +char(2),char(151),char(2),char(7),char(255),char(174),char(2),char(151),char(2),char(11), +char(255),char(174),char(2),char(151),char(2),char(124),char(255),char(174),char(2),char(151), +char(2),char(128),char(255),char(195),char(2),char(151),char(2),char(130),char(255),char(195), +char(2),char(151),char(2),char(169),char(255),char(215),char(2),char(151),char(2),char(170), +char(255),char(215),char(2),char(151),char(2),char(181),char(255),char(174),char(2),char(151), +char(2),char(182),char(255),char(215),char(2),char(151),char(2),char(183),char(255),char(195), +char(2),char(151),char(2),char(185),char(255),char(195),char(2),char(151),char(2),char(189), +char(255),char(215),char(2),char(151),char(2),char(190),char(255),char(215),char(2),char(151), +char(2),char(191),char(255),char(174),char(2),char(151),char(2),char(193),char(255),char(174), +char(2),char(151),char(2),char(212),char(255),char(174),char(2),char(151),char(2),char(253), +char(255),char(174),char(2),char(151),char(3),char(13),char(255),char(154),char(2),char(151), +char(3),char(15),char(255),char(154),char(2),char(151),char(3),char(23),char(255),char(215), +char(2),char(151),char(3),char(24),char(255),char(215),char(2),char(152),char(0),char(5), +char(255),char(133),char(2),char(152),char(0),char(10),char(255),char(133),char(2),char(152), +char(1),char(208),char(255),char(215),char(2),char(152),char(1),char(220),char(255),char(154), +char(2),char(152),char(1),char(221),char(255),char(195),char(2),char(152),char(1),char(223), +char(255),char(215),char(2),char(152),char(1),char(225),char(255),char(174),char(2),char(152), +char(1),char(228),char(255),char(154),char(2),char(152),char(1),char(246),char(255),char(195), +char(2),char(152),char(2),char(7),char(255),char(133),char(2),char(152),char(2),char(11), +char(255),char(133),char(2),char(152),char(2),char(109),char(255),char(215),char(2),char(152), +char(2),char(129),char(255),char(215),char(2),char(152),char(2),char(131),char(255),char(215), +char(2),char(152),char(2),char(139),char(255),char(215),char(2),char(152),char(2),char(160), +char(255),char(215),char(2),char(152),char(2),char(170),char(255),char(154),char(2),char(152), +char(2),char(182),char(255),char(154),char(2),char(152),char(2),char(184),char(255),char(195), +char(2),char(152),char(2),char(186),char(255),char(195),char(2),char(152),char(2),char(188), +char(255),char(215),char(2),char(152),char(2),char(190),char(255),char(154),char(2),char(152), +char(2),char(192),char(255),char(174),char(2),char(152),char(2),char(194),char(255),char(174), +char(2),char(152),char(2),char(198),char(255),char(215),char(2),char(152),char(2),char(200), +char(255),char(215),char(2),char(152),char(2),char(203),char(255),char(215),char(2),char(152), +char(2),char(213),char(255),char(174),char(2),char(152),char(2),char(230),char(255),char(215), +char(2),char(152),char(2),char(234),char(255),char(215),char(2),char(152),char(2),char(248), +char(255),char(195),char(2),char(152),char(2),char(250),char(255),char(195),char(2),char(152), +char(2),char(252),char(255),char(195),char(2),char(152),char(2),char(254),char(255),char(174), +char(2),char(152),char(3),char(6),char(255),char(215),char(2),char(152),char(3),char(8), +char(255),char(215),char(2),char(152),char(3),char(14),char(255),char(154),char(2),char(152), +char(3),char(16),char(255),char(154),char(2),char(152),char(3),char(24),char(255),char(154), +char(2),char(153),char(0),char(15),char(254),char(246),char(2),char(153),char(0),char(17), +char(254),char(246),char(2),char(153),char(1),char(164),char(255),char(133),char(2),char(153), +char(1),char(170),char(255),char(154),char(2),char(153),char(1),char(174),char(255),char(133), +char(2),char(153),char(1),char(176),char(255),char(215),char(2),char(153),char(1),char(181), +char(255),char(133),char(2),char(153),char(1),char(191),char(255),char(215),char(2),char(153), +char(1),char(206),char(255),char(154),char(2),char(153),char(1),char(213),char(255),char(154), +char(2),char(153),char(1),char(242),char(255),char(154),char(2),char(153),char(2),char(8), +char(254),char(246),char(2),char(153),char(2),char(12),char(254),char(246),char(2),char(153), +char(2),char(114),char(255),char(154),char(2),char(153),char(2),char(115),char(255),char(154), +char(2),char(153),char(2),char(118),char(255),char(236),char(2),char(153),char(2),char(159), +char(255),char(215),char(2),char(153),char(2),char(187),char(255),char(215),char(2),char(153), +char(2),char(202),char(255),char(215),char(2),char(153),char(2),char(206),char(255),char(133), +char(2),char(153),char(2),char(207),char(255),char(154),char(2),char(153),char(2),char(217), +char(255),char(154),char(2),char(153),char(2),char(219),char(255),char(154),char(2),char(153), +char(2),char(221),char(255),char(154),char(2),char(153),char(2),char(229),char(255),char(215), +char(2),char(153),char(3),char(5),char(255),char(215),char(2),char(153),char(3),char(7), +char(255),char(215),char(2),char(153),char(3),char(9),char(255),char(174),char(2),char(153), +char(3),char(11),char(255),char(174),char(2),char(153),char(3),char(17),char(255),char(133), +char(2),char(153),char(3),char(18),char(255),char(154),char(2),char(153),char(3),char(27), +char(255),char(133),char(2),char(153),char(3),char(28),char(255),char(154),char(2),char(154), +char(0),char(5),char(255),char(236),char(2),char(154),char(0),char(10),char(255),char(236), +char(2),char(154),char(1),char(208),char(255),char(215),char(2),char(154),char(1),char(220), +char(255),char(236),char(2),char(154),char(1),char(221),char(255),char(236),char(2),char(154), +char(1),char(223),char(255),char(215),char(2),char(154),char(1),char(225),char(255),char(236), +char(2),char(154),char(1),char(228),char(255),char(236),char(2),char(154),char(1),char(246), +char(255),char(236),char(2),char(154),char(2),char(7),char(255),char(236),char(2),char(154), +char(2),char(11),char(255),char(236),char(2),char(154),char(2),char(160),char(255),char(215), +char(2),char(154),char(2),char(170),char(255),char(236),char(2),char(154),char(2),char(182), +char(255),char(236),char(2),char(154),char(2),char(188),char(255),char(215),char(2),char(154), +char(2),char(190),char(255),char(236),char(2),char(154),char(2),char(192),char(255),char(236), +char(2),char(154),char(2),char(194),char(255),char(236),char(2),char(154),char(2),char(203), +char(255),char(215),char(2),char(154),char(2),char(213),char(255),char(236),char(2),char(154), +char(2),char(230),char(255),char(215),char(2),char(154),char(2),char(248),char(255),char(236), +char(2),char(154),char(2),char(250),char(255),char(236),char(2),char(154),char(2),char(252), +char(255),char(236),char(2),char(154),char(2),char(254),char(255),char(236),char(2),char(154), +char(3),char(6),char(255),char(215),char(2),char(154),char(3),char(8),char(255),char(215), +char(2),char(154),char(3),char(14),char(255),char(236),char(2),char(154),char(3),char(16), +char(255),char(236),char(2),char(154),char(3),char(24),char(255),char(236),char(2),char(155), +char(0),char(15),char(255),char(154),char(2),char(155),char(0),char(16),char(255),char(215), +char(2),char(155),char(0),char(17),char(255),char(154),char(2),char(155),char(1),char(157), +char(0),char(41),char(2),char(155),char(1),char(159),char(255),char(215),char(2),char(155), +char(1),char(164),char(255),char(174),char(2),char(155),char(1),char(166),char(0),char(41), +char(2),char(155),char(1),char(170),char(255),char(133),char(2),char(155),char(1),char(174), +char(255),char(174),char(2),char(155),char(1),char(181),char(255),char(174),char(2),char(155), +char(1),char(184),char(255),char(215),char(2),char(155),char(1),char(187),char(255),char(215), +char(2),char(155),char(1),char(188),char(0),char(41),char(2),char(155),char(1),char(190), +char(255),char(195),char(2),char(155),char(1),char(196),char(0),char(41),char(2),char(155), +char(1),char(204),char(255),char(195),char(2),char(155),char(1),char(205),char(255),char(195), +char(2),char(155),char(1),char(206),char(255),char(154),char(2),char(155),char(1),char(207), +char(255),char(174),char(2),char(155),char(1),char(208),char(255),char(215),char(2),char(155), +char(1),char(209),char(255),char(215),char(2),char(155),char(1),char(210),char(255),char(195), +char(2),char(155),char(1),char(211),char(255),char(195),char(2),char(155),char(1),char(212), +char(255),char(195),char(2),char(155),char(1),char(213),char(255),char(154),char(2),char(155), +char(1),char(214),char(255),char(195),char(2),char(155),char(1),char(215),char(255),char(195), +char(2),char(155),char(1),char(216),char(255),char(174),char(2),char(155),char(1),char(217), +char(255),char(195),char(2),char(155),char(1),char(218),char(255),char(195),char(2),char(155), +char(1),char(219),char(255),char(174),char(2),char(155),char(1),char(222),char(255),char(174), +char(2),char(155),char(1),char(223),char(255),char(215),char(2),char(155),char(1),char(224), +char(255),char(195),char(2),char(155),char(1),char(225),char(255),char(154),char(2),char(155), +char(1),char(226),char(255),char(195),char(2),char(155),char(1),char(227),char(255),char(195), +char(2),char(155),char(1),char(229),char(255),char(195),char(2),char(155),char(1),char(230), +char(255),char(195),char(2),char(155),char(1),char(231),char(255),char(215),char(2),char(155), +char(1),char(232),char(255),char(195),char(2),char(155),char(1),char(234),char(255),char(174), +char(2),char(155),char(1),char(235),char(0),char(41),char(2),char(155),char(1),char(236), +char(255),char(195),char(2),char(155),char(1),char(237),char(255),char(174),char(2),char(155), +char(1),char(238),char(255),char(195),char(2),char(155),char(1),char(242),char(255),char(154), +char(2),char(155),char(1),char(243),char(255),char(195),char(2),char(155),char(1),char(244), +char(0),char(41),char(2),char(155),char(1),char(245),char(255),char(195),char(2),char(155), +char(1),char(247),char(255),char(195),char(2),char(155),char(1),char(249),char(255),char(195), +char(2),char(155),char(2),char(2),char(255),char(215),char(2),char(155),char(2),char(3), +char(255),char(215),char(2),char(155),char(2),char(4),char(255),char(215),char(2),char(155), +char(2),char(8),char(255),char(154),char(2),char(155),char(2),char(12),char(255),char(154), +char(2),char(155),char(2),char(106),char(255),char(174),char(2),char(155),char(2),char(107), +char(255),char(195),char(2),char(155),char(2),char(108),char(255),char(215),char(2),char(155), +char(2),char(113),char(255),char(195),char(2),char(155),char(2),char(114),char(255),char(133), +char(2),char(155),char(2),char(115),char(255),char(154),char(2),char(155),char(2),char(117), +char(255),char(195),char(2),char(155),char(2),char(119),char(255),char(215),char(2),char(155), +char(2),char(121),char(255),char(195),char(2),char(155),char(2),char(125),char(255),char(195), +char(2),char(155),char(2),char(126),char(255),char(215),char(2),char(155),char(2),char(127), +char(255),char(174),char(2),char(155),char(2),char(132),char(255),char(215),char(2),char(155), +char(2),char(133),char(255),char(174),char(2),char(155),char(2),char(134),char(255),char(215), +char(2),char(155),char(2),char(135),char(255),char(174),char(2),char(155),char(2),char(136), +char(255),char(215),char(2),char(155),char(2),char(137),char(255),char(174),char(2),char(155), +char(2),char(138),char(255),char(215),char(2),char(155),char(2),char(140),char(255),char(215), +char(2),char(155),char(2),char(141),char(255),char(174),char(2),char(155),char(2),char(150), +char(255),char(195),char(2),char(155),char(2),char(152),char(0),char(41),char(2),char(155), +char(2),char(154),char(255),char(195),char(2),char(155),char(2),char(158),char(255),char(195), +char(2),char(155),char(2),char(160),char(255),char(215),char(2),char(155),char(2),char(162), +char(255),char(215),char(2),char(155),char(2),char(164),char(255),char(195),char(2),char(155), +char(2),char(166),char(255),char(195),char(2),char(155),char(2),char(168),char(0),char(41), +char(2),char(155),char(2),char(169),char(0),char(41),char(2),char(155),char(2),char(172), +char(255),char(195),char(2),char(155),char(2),char(174),char(255),char(195),char(2),char(155), +char(2),char(176),char(255),char(195),char(2),char(155),char(2),char(177),char(255),char(215), +char(2),char(155),char(2),char(178),char(255),char(174),char(2),char(155),char(2),char(179), +char(255),char(215),char(2),char(155),char(2),char(180),char(255),char(174),char(2),char(155), +char(2),char(181),char(0),char(41),char(2),char(155),char(2),char(188),char(255),char(215), +char(2),char(155),char(2),char(189),char(0),char(41),char(2),char(155),char(2),char(192), +char(255),char(154),char(2),char(155),char(2),char(194),char(255),char(154),char(2),char(155), +char(2),char(196),char(255),char(195),char(2),char(155),char(2),char(197),char(255),char(215), +char(2),char(155),char(2),char(198),char(255),char(195),char(2),char(155),char(2),char(199), +char(255),char(215),char(2),char(155),char(2),char(200),char(255),char(195),char(2),char(155), +char(2),char(203),char(255),char(215),char(2),char(155),char(2),char(205),char(255),char(195), +char(2),char(155),char(2),char(206),char(255),char(174),char(2),char(155),char(2),char(207), +char(255),char(154),char(2),char(155),char(2),char(209),char(255),char(195),char(2),char(155), +char(2),char(211),char(255),char(195),char(2),char(155),char(2),char(213),char(255),char(154), +char(2),char(155),char(2),char(215),char(255),char(195),char(2),char(155),char(2),char(217), +char(255),char(133),char(2),char(155),char(2),char(219),char(255),char(133),char(2),char(155), +char(2),char(221),char(255),char(133),char(2),char(155),char(2),char(224),char(255),char(174), +char(2),char(155),char(2),char(230),char(255),char(215),char(2),char(155),char(2),char(232), +char(255),char(215),char(2),char(155),char(2),char(236),char(255),char(195),char(2),char(155), +char(2),char(238),char(255),char(195),char(2),char(155),char(2),char(239),char(255),char(215), +char(2),char(155),char(2),char(240),char(255),char(174),char(2),char(155),char(2),char(241), +char(255),char(215),char(2),char(155),char(2),char(242),char(255),char(174),char(2),char(155), +char(2),char(243),char(255),char(215),char(2),char(155),char(2),char(244),char(255),char(174), +char(2),char(155),char(2),char(246),char(255),char(215),char(2),char(155),char(2),char(254), +char(255),char(154),char(2),char(155),char(3),char(0),char(255),char(195),char(2),char(155), +char(3),char(2),char(255),char(195),char(2),char(155),char(3),char(6),char(255),char(215), +char(2),char(155),char(3),char(8),char(255),char(215),char(2),char(155),char(3),char(9), +char(255),char(154),char(2),char(155),char(3),char(10),char(255),char(174),char(2),char(155), +char(3),char(11),char(255),char(154),char(2),char(155),char(3),char(12),char(255),char(174), +char(2),char(155),char(3),char(14),char(255),char(215),char(2),char(155),char(3),char(16), +char(255),char(215),char(2),char(155),char(3),char(17),char(255),char(174),char(2),char(155), +char(3),char(18),char(255),char(154),char(2),char(155),char(3),char(20),char(255),char(195), +char(2),char(155),char(3),char(21),char(255),char(215),char(2),char(155),char(3),char(22), +char(255),char(174),char(2),char(155),char(3),char(23),char(0),char(41),char(2),char(155), +char(3),char(26),char(255),char(174),char(2),char(155),char(3),char(27),char(255),char(174), +char(2),char(155),char(3),char(28),char(255),char(154),char(2),char(156),char(0),char(15), +char(255),char(195),char(2),char(156),char(0),char(17),char(255),char(195),char(2),char(156), +char(1),char(206),char(255),char(195),char(2),char(156),char(1),char(207),char(255),char(215), +char(2),char(156),char(1),char(213),char(255),char(195),char(2),char(156),char(1),char(216), +char(255),char(215),char(2),char(156),char(1),char(219),char(255),char(215),char(2),char(156), +char(1),char(222),char(255),char(215),char(2),char(156),char(1),char(234),char(255),char(215), +char(2),char(156),char(1),char(237),char(255),char(215),char(2),char(156),char(1),char(242), +char(255),char(195),char(2),char(156),char(2),char(8),char(255),char(195),char(2),char(156), +char(2),char(12),char(255),char(195),char(2),char(156),char(2),char(106),char(255),char(215), +char(2),char(156),char(2),char(115),char(255),char(195),char(2),char(156),char(2),char(127), +char(255),char(215),char(2),char(156),char(2),char(133),char(255),char(215),char(2),char(156), +char(2),char(135),char(255),char(215),char(2),char(156),char(2),char(137),char(255),char(215), +char(2),char(156),char(2),char(141),char(255),char(215),char(2),char(156),char(2),char(178), +char(255),char(215),char(2),char(156),char(2),char(180),char(255),char(215),char(2),char(156), +char(2),char(207),char(255),char(195),char(2),char(156),char(2),char(224),char(255),char(215), +char(2),char(156),char(2),char(240),char(255),char(215),char(2),char(156),char(2),char(242), +char(255),char(215),char(2),char(156),char(2),char(244),char(255),char(215),char(2),char(156), +char(3),char(10),char(255),char(215),char(2),char(156),char(3),char(12),char(255),char(215), +char(2),char(156),char(3),char(18),char(255),char(195),char(2),char(156),char(3),char(22), +char(255),char(215),char(2),char(156),char(3),char(26),char(255),char(215),char(2),char(156), +char(3),char(28),char(255),char(195),char(2),char(157),char(0),char(5),char(255),char(195), +char(2),char(157),char(0),char(10),char(255),char(195),char(2),char(157),char(1),char(157), +char(255),char(195),char(2),char(157),char(1),char(163),char(0),char(102),char(2),char(157), +char(1),char(166),char(255),char(195),char(2),char(157),char(1),char(188),char(255),char(195), +char(2),char(157),char(1),char(193),char(255),char(174),char(2),char(157),char(1),char(196), +char(255),char(195),char(2),char(157),char(1),char(220),char(255),char(215),char(2),char(157), +char(1),char(225),char(255),char(215),char(2),char(157),char(1),char(228),char(255),char(215), +char(2),char(157),char(2),char(7),char(255),char(195),char(2),char(157),char(2),char(11), +char(255),char(195),char(2),char(157),char(2),char(124),char(255),char(174),char(2),char(157), +char(2),char(128),char(255),char(195),char(2),char(157),char(2),char(130),char(255),char(195), +char(2),char(157),char(2),char(169),char(255),char(195),char(2),char(157),char(2),char(170), +char(255),char(215),char(2),char(157),char(2),char(181),char(255),char(195),char(2),char(157), +char(2),char(182),char(255),char(215),char(2),char(157),char(2),char(183),char(255),char(215), +char(2),char(157),char(2),char(185),char(255),char(215),char(2),char(157),char(2),char(189), +char(255),char(195),char(2),char(157),char(2),char(190),char(255),char(215),char(2),char(157), +char(2),char(191),char(255),char(174),char(2),char(157),char(2),char(192),char(255),char(215), +char(2),char(157),char(2),char(193),char(255),char(174),char(2),char(157),char(2),char(194), +char(255),char(215),char(2),char(157),char(2),char(212),char(255),char(174),char(2),char(157), +char(2),char(213),char(255),char(215),char(2),char(157),char(2),char(253),char(255),char(174), +char(2),char(157),char(2),char(254),char(255),char(215),char(2),char(157),char(3),char(13), +char(255),char(215),char(2),char(157),char(3),char(14),char(255),char(195),char(2),char(157), +char(3),char(15),char(255),char(215),char(2),char(157),char(3),char(16),char(255),char(195), +char(2),char(157),char(3),char(23),char(255),char(195),char(2),char(157),char(3),char(24), +char(255),char(215),char(2),char(158),char(0),char(5),char(255),char(195),char(2),char(158), +char(0),char(10),char(255),char(195),char(2),char(158),char(2),char(7),char(255),char(195), +char(2),char(158),char(2),char(11),char(255),char(195),char(2),char(158),char(3),char(14), +char(255),char(215),char(2),char(158),char(3),char(16),char(255),char(215),char(2),char(159), +char(1),char(159),char(255),char(215),char(2),char(159),char(1),char(163),char(0),char(225), +char(2),char(159),char(1),char(184),char(255),char(215),char(2),char(159),char(1),char(187), +char(255),char(215),char(2),char(159),char(1),char(190),char(255),char(195),char(2),char(159), +char(1),char(220),char(255),char(215),char(2),char(159),char(1),char(225),char(255),char(174), +char(2),char(159),char(1),char(228),char(255),char(215),char(2),char(159),char(2),char(108), +char(255),char(215),char(2),char(159),char(2),char(123),char(0),char(61),char(2),char(159), +char(2),char(125),char(255),char(236),char(2),char(159),char(2),char(126),char(255),char(215), +char(2),char(159),char(2),char(132),char(255),char(215),char(2),char(159),char(2),char(134), +char(255),char(215),char(2),char(159),char(2),char(136),char(255),char(215),char(2),char(159), +char(2),char(138),char(255),char(215),char(2),char(159),char(2),char(140),char(255),char(215), +char(2),char(159),char(2),char(170),char(255),char(215),char(2),char(159),char(2),char(177), +char(255),char(215),char(2),char(159),char(2),char(179),char(255),char(215),char(2),char(159), +char(2),char(182),char(255),char(215),char(2),char(159),char(2),char(190),char(255),char(215), +char(2),char(159),char(2),char(192),char(255),char(174),char(2),char(159),char(2),char(194), +char(255),char(174),char(2),char(159),char(2),char(197),char(255),char(195),char(2),char(159), +char(2),char(198),char(255),char(215),char(2),char(159),char(2),char(199),char(255),char(195), +char(2),char(159),char(2),char(200),char(255),char(215),char(2),char(159),char(2),char(213), +char(255),char(174),char(2),char(159),char(2),char(239),char(255),char(215),char(2),char(159), +char(2),char(241),char(255),char(215),char(2),char(159),char(2),char(243),char(255),char(215), +char(2),char(159),char(2),char(254),char(255),char(174),char(2),char(159),char(3),char(14), +char(255),char(215),char(2),char(159),char(3),char(16),char(255),char(215),char(2),char(159), +char(3),char(21),char(255),char(215),char(2),char(159),char(3),char(24),char(255),char(215), +char(2),char(160),char(1),char(207),char(255),char(236),char(2),char(160),char(1),char(216), +char(255),char(236),char(2),char(160),char(1),char(219),char(255),char(236),char(2),char(160), +char(1),char(222),char(255),char(236),char(2),char(160),char(1),char(225),char(255),char(236), +char(2),char(160),char(1),char(234),char(255),char(236),char(2),char(160),char(1),char(237), +char(255),char(236),char(2),char(160),char(2),char(106),char(255),char(236),char(2),char(160), +char(2),char(127),char(255),char(236),char(2),char(160),char(2),char(133),char(255),char(236), +char(2),char(160),char(2),char(135),char(255),char(236),char(2),char(160),char(2),char(137), +char(255),char(236),char(2),char(160),char(2),char(141),char(255),char(236),char(2),char(160), +char(2),char(178),char(255),char(236),char(2),char(160),char(2),char(180),char(255),char(236), +char(2),char(160),char(2),char(192),char(255),char(236),char(2),char(160),char(2),char(194), +char(255),char(236),char(2),char(160),char(2),char(213),char(255),char(236),char(2),char(160), +char(2),char(224),char(255),char(236),char(2),char(160),char(2),char(240),char(255),char(236), +char(2),char(160),char(2),char(242),char(255),char(236),char(2),char(160),char(2),char(244), +char(255),char(236),char(2),char(160),char(2),char(254),char(255),char(236),char(2),char(160), +char(3),char(10),char(255),char(236),char(2),char(160),char(3),char(12),char(255),char(236), +char(2),char(160),char(3),char(14),char(255),char(215),char(2),char(160),char(3),char(16), +char(255),char(215),char(2),char(160),char(3),char(22),char(255),char(236),char(2),char(160), +char(3),char(26),char(255),char(236),char(2),char(161),char(0),char(15),char(255),char(174), +char(2),char(161),char(0),char(17),char(255),char(174),char(2),char(161),char(2),char(8), +char(255),char(174),char(2),char(161),char(2),char(12),char(255),char(174),char(2),char(161), +char(2),char(128),char(255),char(236),char(2),char(161),char(2),char(130),char(255),char(236), +char(2),char(161),char(2),char(183),char(255),char(236),char(2),char(161),char(2),char(185), +char(255),char(236),char(2),char(161),char(3),char(13),char(255),char(215),char(2),char(161), +char(3),char(15),char(255),char(215),char(2),char(162),char(1),char(233),char(0),char(41), +char(2),char(163),char(1),char(159),char(255),char(215),char(2),char(163),char(1),char(163), +char(0),char(225),char(2),char(163),char(1),char(184),char(255),char(215),char(2),char(163), +char(1),char(187),char(255),char(215),char(2),char(163),char(1),char(190),char(255),char(195), +char(2),char(163),char(1),char(220),char(255),char(215),char(2),char(163),char(1),char(225), +char(255),char(174),char(2),char(163),char(1),char(228),char(255),char(215),char(2),char(163), +char(2),char(108),char(255),char(215),char(2),char(163),char(2),char(123),char(0),char(61), +char(2),char(163),char(2),char(125),char(255),char(236),char(2),char(163),char(2),char(126), +char(255),char(215),char(2),char(163),char(2),char(132),char(255),char(215),char(2),char(163), +char(2),char(134),char(255),char(215),char(2),char(163),char(2),char(136),char(255),char(215), +char(2),char(163),char(2),char(138),char(255),char(215),char(2),char(163),char(2),char(140), +char(255),char(215),char(2),char(163),char(2),char(170),char(255),char(215),char(2),char(163), +char(2),char(177),char(255),char(215),char(2),char(163),char(2),char(179),char(255),char(215), +char(2),char(163),char(2),char(182),char(255),char(215),char(2),char(163),char(2),char(190), +char(255),char(215),char(2),char(163),char(2),char(192),char(255),char(174),char(2),char(163), +char(2),char(194),char(255),char(174),char(2),char(163),char(2),char(197),char(255),char(195), +char(2),char(163),char(2),char(198),char(255),char(215),char(2),char(163),char(2),char(199), +char(255),char(195),char(2),char(163),char(2),char(200),char(255),char(215),char(2),char(163), +char(2),char(213),char(255),char(174),char(2),char(163),char(2),char(239),char(255),char(215), +char(2),char(163),char(2),char(241),char(255),char(215),char(2),char(163),char(2),char(243), +char(255),char(215),char(2),char(163),char(2),char(254),char(255),char(174),char(2),char(163), +char(3),char(14),char(255),char(215),char(2),char(163),char(3),char(16),char(255),char(215), +char(2),char(163),char(3),char(21),char(255),char(215),char(2),char(163),char(3),char(24), +char(255),char(215),char(2),char(164),char(1),char(207),char(255),char(236),char(2),char(164), +char(1),char(216),char(255),char(236),char(2),char(164),char(1),char(219),char(255),char(236), +char(2),char(164),char(1),char(222),char(255),char(236),char(2),char(164),char(1),char(225), +char(255),char(236),char(2),char(164),char(1),char(234),char(255),char(236),char(2),char(164), +char(1),char(237),char(255),char(236),char(2),char(164),char(2),char(106),char(255),char(236), +char(2),char(164),char(2),char(127),char(255),char(236),char(2),char(164),char(2),char(133), +char(255),char(236),char(2),char(164),char(2),char(135),char(255),char(236),char(2),char(164), +char(2),char(137),char(255),char(236),char(2),char(164),char(2),char(141),char(255),char(236), +char(2),char(164),char(2),char(178),char(255),char(236),char(2),char(164),char(2),char(180), +char(255),char(236),char(2),char(164),char(2),char(192),char(255),char(236),char(2),char(164), +char(2),char(194),char(255),char(236),char(2),char(164),char(2),char(213),char(255),char(236), +char(2),char(164),char(2),char(224),char(255),char(236),char(2),char(164),char(2),char(240), +char(255),char(236),char(2),char(164),char(2),char(242),char(255),char(236),char(2),char(164), +char(2),char(244),char(255),char(236),char(2),char(164),char(2),char(254),char(255),char(236), +char(2),char(164),char(3),char(10),char(255),char(236),char(2),char(164),char(3),char(12), +char(255),char(236),char(2),char(164),char(3),char(14),char(255),char(215),char(2),char(164), +char(3),char(16),char(255),char(215),char(2),char(164),char(3),char(22),char(255),char(236), +char(2),char(164),char(3),char(26),char(255),char(236),char(2),char(165),char(1),char(159), +char(255),char(215),char(2),char(165),char(1),char(184),char(255),char(215),char(2),char(165), +char(1),char(187),char(255),char(215),char(2),char(165),char(1),char(190),char(255),char(215), +char(2),char(165),char(1),char(193),char(255),char(215),char(2),char(165),char(1),char(225), +char(255),char(215),char(2),char(165),char(2),char(108),char(255),char(215),char(2),char(165), +char(2),char(124),char(255),char(215),char(2),char(165),char(2),char(126),char(255),char(215), +char(2),char(165),char(2),char(132),char(255),char(215),char(2),char(165),char(2),char(134), +char(255),char(215),char(2),char(165),char(2),char(136),char(255),char(215),char(2),char(165), +char(2),char(138),char(255),char(215),char(2),char(165),char(2),char(140),char(255),char(215), +char(2),char(165),char(2),char(177),char(255),char(215),char(2),char(165),char(2),char(179), +char(255),char(215),char(2),char(165),char(2),char(191),char(255),char(215),char(2),char(165), +char(2),char(192),char(255),char(215),char(2),char(165),char(2),char(193),char(255),char(215), +char(2),char(165),char(2),char(194),char(255),char(215),char(2),char(165),char(2),char(197), +char(255),char(154),char(2),char(165),char(2),char(199),char(255),char(154),char(2),char(165), +char(2),char(212),char(255),char(215),char(2),char(165),char(2),char(213),char(255),char(215), +char(2),char(165),char(2),char(239),char(255),char(215),char(2),char(165),char(2),char(241), +char(255),char(215),char(2),char(165),char(2),char(243),char(255),char(215),char(2),char(165), +char(2),char(253),char(255),char(215),char(2),char(165),char(2),char(254),char(255),char(215), +char(2),char(165),char(3),char(9),char(255),char(215),char(2),char(165),char(3),char(11), +char(255),char(215),char(2),char(165),char(3),char(14),char(255),char(215),char(2),char(165), +char(3),char(16),char(255),char(215),char(2),char(165),char(3),char(21),char(255),char(215), +char(2),char(165),char(3),char(25),char(255),char(236),char(2),char(166),char(1),char(207), +char(255),char(215),char(2),char(166),char(1),char(216),char(255),char(215),char(2),char(166), +char(1),char(219),char(255),char(215),char(2),char(166),char(1),char(222),char(255),char(215), +char(2),char(166),char(1),char(225),char(255),char(215),char(2),char(166),char(1),char(234), +char(255),char(215),char(2),char(166),char(1),char(237),char(255),char(215),char(2),char(166), +char(2),char(106),char(255),char(215),char(2),char(166),char(2),char(127),char(255),char(215), +char(2),char(166),char(2),char(133),char(255),char(215),char(2),char(166),char(2),char(135), +char(255),char(215),char(2),char(166),char(2),char(137),char(255),char(215),char(2),char(166), +char(2),char(141),char(255),char(215),char(2),char(166),char(2),char(178),char(255),char(215), +char(2),char(166),char(2),char(180),char(255),char(215),char(2),char(166),char(2),char(192), +char(255),char(215),char(2),char(166),char(2),char(194),char(255),char(215),char(2),char(166), +char(2),char(198),char(255),char(215),char(2),char(166),char(2),char(200),char(255),char(215), +char(2),char(166),char(2),char(213),char(255),char(215),char(2),char(166),char(2),char(224), +char(255),char(215),char(2),char(166),char(2),char(240),char(255),char(215),char(2),char(166), +char(2),char(242),char(255),char(215),char(2),char(166),char(2),char(244),char(255),char(215), +char(2),char(166),char(2),char(254),char(255),char(215),char(2),char(166),char(3),char(10), +char(255),char(215),char(2),char(166),char(3),char(12),char(255),char(215),char(2),char(166), +char(3),char(22),char(255),char(215),char(2),char(166),char(3),char(26),char(255),char(215), +char(2),char(167),char(1),char(159),char(255),char(215),char(2),char(167),char(1),char(184), +char(255),char(215),char(2),char(167),char(1),char(187),char(255),char(215),char(2),char(167), +char(1),char(190),char(255),char(215),char(2),char(167),char(1),char(193),char(255),char(215), +char(2),char(167),char(1),char(225),char(255),char(215),char(2),char(167),char(2),char(108), +char(255),char(215),char(2),char(167),char(2),char(124),char(255),char(215),char(2),char(167), +char(2),char(126),char(255),char(215),char(2),char(167),char(2),char(132),char(255),char(215), +char(2),char(167),char(2),char(134),char(255),char(215),char(2),char(167),char(2),char(136), +char(255),char(215),char(2),char(167),char(2),char(138),char(255),char(215),char(2),char(167), +char(2),char(140),char(255),char(215),char(2),char(167),char(2),char(177),char(255),char(215), +char(2),char(167),char(2),char(179),char(255),char(215),char(2),char(167),char(2),char(191), +char(255),char(215),char(2),char(167),char(2),char(192),char(255),char(215),char(2),char(167), +char(2),char(193),char(255),char(215),char(2),char(167),char(2),char(194),char(255),char(215), +char(2),char(167),char(2),char(197),char(255),char(154),char(2),char(167),char(2),char(199), +char(255),char(154),char(2),char(167),char(2),char(212),char(255),char(215),char(2),char(167), +char(2),char(213),char(255),char(215),char(2),char(167),char(2),char(239),char(255),char(215), +char(2),char(167),char(2),char(241),char(255),char(215),char(2),char(167),char(2),char(243), +char(255),char(215),char(2),char(167),char(2),char(253),char(255),char(215),char(2),char(167), +char(2),char(254),char(255),char(215),char(2),char(167),char(3),char(9),char(255),char(215), +char(2),char(167),char(3),char(11),char(255),char(215),char(2),char(167),char(3),char(14), +char(255),char(215),char(2),char(167),char(3),char(16),char(255),char(215),char(2),char(167), +char(3),char(21),char(255),char(215),char(2),char(167),char(3),char(25),char(255),char(236), +char(2),char(168),char(1),char(207),char(255),char(215),char(2),char(168),char(1),char(216), +char(255),char(215),char(2),char(168),char(1),char(219),char(255),char(215),char(2),char(168), +char(1),char(222),char(255),char(215),char(2),char(168),char(1),char(225),char(255),char(215), +char(2),char(168),char(1),char(234),char(255),char(215),char(2),char(168),char(1),char(237), +char(255),char(215),char(2),char(168),char(2),char(106),char(255),char(215),char(2),char(168), +char(2),char(127),char(255),char(215),char(2),char(168),char(2),char(133),char(255),char(215), +char(2),char(168),char(2),char(135),char(255),char(215),char(2),char(168),char(2),char(137), +char(255),char(215),char(2),char(168),char(2),char(141),char(255),char(215),char(2),char(168), +char(2),char(178),char(255),char(215),char(2),char(168),char(2),char(180),char(255),char(215), +char(2),char(168),char(2),char(192),char(255),char(215),char(2),char(168),char(2),char(194), +char(255),char(215),char(2),char(168),char(2),char(198),char(255),char(215),char(2),char(168), +char(2),char(200),char(255),char(215),char(2),char(168),char(2),char(213),char(255),char(215), +char(2),char(168),char(2),char(224),char(255),char(215),char(2),char(168),char(2),char(240), +char(255),char(215),char(2),char(168),char(2),char(242),char(255),char(215),char(2),char(168), +char(2),char(244),char(255),char(215),char(2),char(168),char(2),char(254),char(255),char(215), +char(2),char(168),char(3),char(10),char(255),char(215),char(2),char(168),char(3),char(12), +char(255),char(215),char(2),char(168),char(3),char(22),char(255),char(215),char(2),char(168), +char(3),char(26),char(255),char(215),char(2),char(169),char(1),char(159),char(255),char(215), +char(2),char(169),char(1),char(184),char(255),char(215),char(2),char(169),char(1),char(187), +char(255),char(215),char(2),char(169),char(1),char(190),char(255),char(215),char(2),char(169), +char(1),char(193),char(255),char(215),char(2),char(169),char(1),char(225),char(255),char(215), +char(2),char(169),char(2),char(108),char(255),char(215),char(2),char(169),char(2),char(124), +char(255),char(215),char(2),char(169),char(2),char(126),char(255),char(215),char(2),char(169), +char(2),char(132),char(255),char(215),char(2),char(169),char(2),char(134),char(255),char(215), +char(2),char(169),char(2),char(136),char(255),char(215),char(2),char(169),char(2),char(138), +char(255),char(215),char(2),char(169),char(2),char(140),char(255),char(215),char(2),char(169), +char(2),char(177),char(255),char(215),char(2),char(169),char(2),char(179),char(255),char(215), +char(2),char(169),char(2),char(191),char(255),char(215),char(2),char(169),char(2),char(192), +char(255),char(215),char(2),char(169),char(2),char(193),char(255),char(215),char(2),char(169), +char(2),char(194),char(255),char(215),char(2),char(169),char(2),char(197),char(255),char(154), +char(2),char(169),char(2),char(199),char(255),char(154),char(2),char(169),char(2),char(212), +char(255),char(215),char(2),char(169),char(2),char(213),char(255),char(215),char(2),char(169), +char(2),char(239),char(255),char(215),char(2),char(169),char(2),char(241),char(255),char(215), +char(2),char(169),char(2),char(243),char(255),char(215),char(2),char(169),char(2),char(253), +char(255),char(215),char(2),char(169),char(2),char(254),char(255),char(215),char(2),char(169), +char(3),char(9),char(255),char(215),char(2),char(169),char(3),char(11),char(255),char(215), +char(2),char(169),char(3),char(14),char(255),char(215),char(2),char(169),char(3),char(16), +char(255),char(215),char(2),char(169),char(3),char(21),char(255),char(215),char(2),char(169), +char(3),char(25),char(255),char(236),char(2),char(170),char(1),char(207),char(255),char(215), +char(2),char(170),char(1),char(216),char(255),char(215),char(2),char(170),char(1),char(219), +char(255),char(215),char(2),char(170),char(1),char(222),char(255),char(215),char(2),char(170), +char(1),char(225),char(255),char(215),char(2),char(170),char(1),char(234),char(255),char(215), +char(2),char(170),char(1),char(237),char(255),char(215),char(2),char(170),char(2),char(106), +char(255),char(215),char(2),char(170),char(2),char(127),char(255),char(215),char(2),char(170), +char(2),char(133),char(255),char(215),char(2),char(170),char(2),char(135),char(255),char(215), +char(2),char(170),char(2),char(137),char(255),char(215),char(2),char(170),char(2),char(141), +char(255),char(215),char(2),char(170),char(2),char(178),char(255),char(215),char(2),char(170), +char(2),char(180),char(255),char(215),char(2),char(170),char(2),char(192),char(255),char(215), +char(2),char(170),char(2),char(194),char(255),char(215),char(2),char(170),char(2),char(198), +char(255),char(215),char(2),char(170),char(2),char(200),char(255),char(215),char(2),char(170), +char(2),char(213),char(255),char(215),char(2),char(170),char(2),char(224),char(255),char(215), +char(2),char(170),char(2),char(240),char(255),char(215),char(2),char(170),char(2),char(242), +char(255),char(215),char(2),char(170),char(2),char(244),char(255),char(215),char(2),char(170), +char(2),char(254),char(255),char(215),char(2),char(170),char(3),char(10),char(255),char(215), +char(2),char(170),char(3),char(12),char(255),char(215),char(2),char(170),char(3),char(22), +char(255),char(215),char(2),char(170),char(3),char(26),char(255),char(215),char(2),char(171), +char(1),char(163),char(0),char(225),char(2),char(171),char(2),char(234),char(0),char(41), +char(2),char(171),char(3),char(14),char(255),char(215),char(2),char(171),char(3),char(16), +char(255),char(215),char(2),char(172),char(0),char(5),char(255),char(236),char(2),char(172), +char(0),char(10),char(255),char(236),char(2),char(172),char(2),char(7),char(255),char(236), +char(2),char(172),char(2),char(11),char(255),char(236),char(2),char(173),char(0),char(15), +char(255),char(154),char(2),char(173),char(0),char(16),char(255),char(215),char(2),char(173), +char(0),char(17),char(255),char(154),char(2),char(173),char(1),char(157),char(0),char(41), +char(2),char(173),char(1),char(159),char(255),char(215),char(2),char(173),char(1),char(164), +char(255),char(174),char(2),char(173),char(1),char(166),char(0),char(41),char(2),char(173), +char(1),char(170),char(255),char(133),char(2),char(173),char(1),char(174),char(255),char(174), +char(2),char(173),char(1),char(181),char(255),char(174),char(2),char(173),char(1),char(184), +char(255),char(215),char(2),char(173),char(1),char(187),char(255),char(215),char(2),char(173), +char(1),char(188),char(0),char(41),char(2),char(173),char(1),char(190),char(255),char(195), +char(2),char(173),char(1),char(196),char(0),char(41),char(2),char(173),char(1),char(204), +char(255),char(195),char(2),char(173),char(1),char(205),char(255),char(195),char(2),char(173), +char(1),char(206),char(255),char(154),char(2),char(173),char(1),char(207),char(255),char(174), +char(2),char(173),char(1),char(208),char(255),char(215),char(2),char(173),char(1),char(209), +char(255),char(215),char(2),char(173),char(1),char(210),char(255),char(195),char(2),char(173), +char(1),char(211),char(255),char(195),char(2),char(173),char(1),char(212),char(255),char(195), +char(2),char(173),char(1),char(213),char(255),char(154),char(2),char(173),char(1),char(214), +char(255),char(195),char(2),char(173),char(1),char(215),char(255),char(195),char(2),char(173), +char(1),char(216),char(255),char(174),char(2),char(173),char(1),char(217),char(255),char(195), +char(2),char(173),char(1),char(218),char(255),char(195),char(2),char(173),char(1),char(219), +char(255),char(174),char(2),char(173),char(1),char(222),char(255),char(174),char(2),char(173), +char(1),char(223),char(255),char(215),char(2),char(173),char(1),char(224),char(255),char(195), +char(2),char(173),char(1),char(225),char(255),char(154),char(2),char(173),char(1),char(226), +char(255),char(195),char(2),char(173),char(1),char(227),char(255),char(195),char(2),char(173), +char(1),char(229),char(255),char(195),char(2),char(173),char(1),char(230),char(255),char(195), +char(2),char(173),char(1),char(231),char(255),char(215),char(2),char(173),char(1),char(232), +char(255),char(195),char(2),char(173),char(1),char(234),char(255),char(174),char(2),char(173), +char(1),char(235),char(0),char(41),char(2),char(173),char(1),char(236),char(255),char(195), +char(2),char(173),char(1),char(237),char(255),char(174),char(2),char(173),char(1),char(238), +char(255),char(195),char(2),char(173),char(1),char(242),char(255),char(154),char(2),char(173), +char(1),char(243),char(255),char(195),char(2),char(173),char(1),char(244),char(0),char(41), +char(2),char(173),char(1),char(245),char(255),char(195),char(2),char(173),char(1),char(247), +char(255),char(195),char(2),char(173),char(1),char(249),char(255),char(195),char(2),char(173), +char(2),char(2),char(255),char(215),char(2),char(173),char(2),char(3),char(255),char(215), +char(2),char(173),char(2),char(4),char(255),char(215),char(2),char(173),char(2),char(8), +char(255),char(154),char(2),char(173),char(2),char(12),char(255),char(154),char(2),char(173), +char(2),char(106),char(255),char(174),char(2),char(173),char(2),char(107),char(255),char(195), +char(2),char(173),char(2),char(108),char(255),char(215),char(2),char(173),char(2),char(113), +char(255),char(195),char(2),char(173),char(2),char(114),char(255),char(133),char(2),char(173), +char(2),char(115),char(255),char(154),char(2),char(173),char(2),char(117),char(255),char(195), +char(2),char(173),char(2),char(119),char(255),char(215),char(2),char(173),char(2),char(121), +char(255),char(195),char(2),char(173),char(2),char(125),char(255),char(195),char(2),char(173), +char(2),char(126),char(255),char(215),char(2),char(173),char(2),char(127),char(255),char(174), +char(2),char(173),char(2),char(132),char(255),char(215),char(2),char(173),char(2),char(133), +char(255),char(174),char(2),char(173),char(2),char(134),char(255),char(215),char(2),char(173), +char(2),char(135),char(255),char(174),char(2),char(173),char(2),char(136),char(255),char(215), +char(2),char(173),char(2),char(137),char(255),char(174),char(2),char(173),char(2),char(138), +char(255),char(215),char(2),char(173),char(2),char(140),char(255),char(215),char(2),char(173), +char(2),char(141),char(255),char(174),char(2),char(173),char(2),char(150),char(255),char(195), +char(2),char(173),char(2),char(152),char(0),char(41),char(2),char(173),char(2),char(154), +char(255),char(195),char(2),char(173),char(2),char(158),char(255),char(195),char(2),char(173), +char(2),char(160),char(255),char(215),char(2),char(173),char(2),char(162),char(255),char(215), +char(2),char(173),char(2),char(164),char(255),char(195),char(2),char(173),char(2),char(166), +char(255),char(195),char(2),char(173),char(2),char(168),char(0),char(41),char(2),char(173), +char(2),char(169),char(0),char(41),char(2),char(173),char(2),char(172),char(255),char(195), +char(2),char(173),char(2),char(174),char(255),char(195),char(2),char(173),char(2),char(176), +char(255),char(195),char(2),char(173),char(2),char(177),char(255),char(215),char(2),char(173), +char(2),char(178),char(255),char(174),char(2),char(173),char(2),char(179),char(255),char(215), +char(2),char(173),char(2),char(180),char(255),char(174),char(2),char(173),char(2),char(181), +char(0),char(41),char(2),char(173),char(2),char(188),char(255),char(215),char(2),char(173), +char(2),char(189),char(0),char(41),char(2),char(173),char(2),char(192),char(255),char(154), +char(2),char(173),char(2),char(194),char(255),char(154),char(2),char(173),char(2),char(196), +char(255),char(195),char(2),char(173),char(2),char(197),char(255),char(215),char(2),char(173), +char(2),char(198),char(255),char(195),char(2),char(173),char(2),char(199),char(255),char(215), +char(2),char(173),char(2),char(200),char(255),char(195),char(2),char(173),char(2),char(203), +char(255),char(215),char(2),char(173),char(2),char(205),char(255),char(195),char(2),char(173), +char(2),char(206),char(255),char(174),char(2),char(173),char(2),char(207),char(255),char(154), +char(2),char(173),char(2),char(209),char(255),char(195),char(2),char(173),char(2),char(211), +char(255),char(195),char(2),char(173),char(2),char(213),char(255),char(154),char(2),char(173), +char(2),char(215),char(255),char(195),char(2),char(173),char(2),char(217),char(255),char(133), +char(2),char(173),char(2),char(219),char(255),char(133),char(2),char(173),char(2),char(221), +char(255),char(133),char(2),char(173),char(2),char(224),char(255),char(174),char(2),char(173), +char(2),char(230),char(255),char(215),char(2),char(173),char(2),char(232),char(255),char(215), +char(2),char(173),char(2),char(236),char(255),char(195),char(2),char(173),char(2),char(238), +char(255),char(195),char(2),char(173),char(2),char(239),char(255),char(215),char(2),char(173), +char(2),char(240),char(255),char(174),char(2),char(173),char(2),char(241),char(255),char(215), +char(2),char(173),char(2),char(242),char(255),char(174),char(2),char(173),char(2),char(243), +char(255),char(215),char(2),char(173),char(2),char(244),char(255),char(174),char(2),char(173), +char(2),char(246),char(255),char(215),char(2),char(173),char(2),char(254),char(255),char(154), +char(2),char(173),char(3),char(0),char(255),char(195),char(2),char(173),char(3),char(2), +char(255),char(195),char(2),char(173),char(3),char(6),char(255),char(215),char(2),char(173), +char(3),char(8),char(255),char(215),char(2),char(173),char(3),char(9),char(255),char(154), +char(2),char(173),char(3),char(10),char(255),char(174),char(2),char(173),char(3),char(11), +char(255),char(154),char(2),char(173),char(3),char(12),char(255),char(174),char(2),char(173), +char(3),char(14),char(255),char(215),char(2),char(173),char(3),char(16),char(255),char(215), +char(2),char(173),char(3),char(17),char(255),char(174),char(2),char(173),char(3),char(18), +char(255),char(154),char(2),char(173),char(3),char(20),char(255),char(195),char(2),char(173), +char(3),char(21),char(255),char(215),char(2),char(173),char(3),char(22),char(255),char(174), +char(2),char(173),char(3),char(23),char(0),char(41),char(2),char(173),char(3),char(26), +char(255),char(174),char(2),char(173),char(3),char(27),char(255),char(174),char(2),char(173), +char(3),char(28),char(255),char(154),char(2),char(174),char(0),char(15),char(255),char(154), +char(2),char(174),char(0),char(16),char(255),char(215),char(2),char(174),char(0),char(17), +char(255),char(154),char(2),char(174),char(1),char(206),char(255),char(195),char(2),char(174), +char(1),char(207),char(255),char(236),char(2),char(174),char(1),char(213),char(255),char(195), +char(2),char(174),char(1),char(216),char(255),char(236),char(2),char(174),char(1),char(219), +char(255),char(236),char(2),char(174),char(1),char(222),char(255),char(236),char(2),char(174), +char(1),char(234),char(255),char(236),char(2),char(174),char(1),char(237),char(255),char(236), +char(2),char(174),char(1),char(242),char(255),char(195),char(2),char(174),char(2),char(2), +char(255),char(215),char(2),char(174),char(2),char(3),char(255),char(215),char(2),char(174), +char(2),char(4),char(255),char(215),char(2),char(174),char(2),char(8),char(255),char(154), +char(2),char(174),char(2),char(12),char(255),char(154),char(2),char(174),char(2),char(106), +char(255),char(236),char(2),char(174),char(2),char(115),char(255),char(195),char(2),char(174), +char(2),char(127),char(255),char(236),char(2),char(174),char(2),char(133),char(255),char(236), +char(2),char(174),char(2),char(135),char(255),char(236),char(2),char(174),char(2),char(137), +char(255),char(236),char(2),char(174),char(2),char(141),char(255),char(236),char(2),char(174), +char(2),char(178),char(255),char(236),char(2),char(174),char(2),char(180),char(255),char(236), +char(2),char(174),char(2),char(207),char(255),char(195),char(2),char(174),char(2),char(224), +char(255),char(236),char(2),char(174),char(2),char(240),char(255),char(236),char(2),char(174), +char(2),char(242),char(255),char(236),char(2),char(174),char(2),char(244),char(255),char(236), +char(2),char(174),char(3),char(10),char(255),char(236),char(2),char(174),char(3),char(12), +char(255),char(236),char(2),char(174),char(3),char(18),char(255),char(195),char(2),char(174), +char(3),char(22),char(255),char(236),char(2),char(174),char(3),char(26),char(255),char(236), +char(2),char(174),char(3),char(28),char(255),char(195),char(2),char(175),char(0),char(5), +char(255),char(92),char(2),char(175),char(0),char(10),char(255),char(92),char(2),char(175), +char(1),char(157),char(255),char(154),char(2),char(175),char(1),char(163),char(0),char(102), +char(2),char(175),char(1),char(166),char(255),char(154),char(2),char(175),char(1),char(188), +char(255),char(72),char(2),char(175),char(1),char(193),char(255),char(133),char(2),char(175), +char(1),char(196),char(255),char(154),char(2),char(175),char(1),char(220),char(255),char(174), +char(2),char(175),char(1),char(225),char(255),char(215),char(2),char(175),char(1),char(228), +char(255),char(174),char(2),char(175),char(2),char(7),char(255),char(92),char(2),char(175), +char(2),char(11),char(255),char(92),char(2),char(175),char(2),char(124),char(255),char(133), +char(2),char(175),char(2),char(128),char(255),char(113),char(2),char(175),char(2),char(130), +char(255),char(113),char(2),char(175),char(2),char(169),char(255),char(154),char(2),char(175), +char(2),char(170),char(255),char(174),char(2),char(175),char(2),char(181),char(255),char(72), +char(2),char(175),char(2),char(182),char(255),char(174),char(2),char(175),char(2),char(183), +char(255),char(154),char(2),char(175),char(2),char(185),char(255),char(154),char(2),char(175), +char(2),char(189),char(255),char(154),char(2),char(175),char(2),char(190),char(255),char(174), +char(2),char(175),char(2),char(191),char(255),char(133),char(2),char(175),char(2),char(192), +char(255),char(215),char(2),char(175),char(2),char(193),char(255),char(133),char(2),char(175), +char(2),char(194),char(255),char(215),char(2),char(175),char(2),char(197),char(255),char(195), +char(2),char(175),char(2),char(198),char(255),char(215),char(2),char(175),char(2),char(199), +char(255),char(195),char(2),char(175),char(2),char(200),char(255),char(215),char(2),char(175), +char(2),char(212),char(255),char(133),char(2),char(175),char(2),char(213),char(255),char(215), +char(2),char(175),char(2),char(253),char(255),char(133),char(2),char(175),char(2),char(254), +char(255),char(215),char(2),char(175),char(3),char(13),char(255),char(72),char(2),char(175), +char(3),char(14),char(255),char(174),char(2),char(175),char(3),char(15),char(255),char(72), +char(2),char(175),char(3),char(16),char(255),char(174),char(2),char(175),char(3),char(23), +char(255),char(154),char(2),char(175),char(3),char(24),char(255),char(174),char(2),char(176), +char(0),char(5),char(255),char(113),char(2),char(176),char(0),char(10),char(255),char(113), +char(2),char(176),char(1),char(220),char(255),char(154),char(2),char(176),char(1),char(225), +char(255),char(215),char(2),char(176),char(1),char(228),char(255),char(154),char(2),char(176), +char(2),char(7),char(255),char(113),char(2),char(176),char(2),char(11),char(255),char(113), +char(2),char(176),char(2),char(109),char(255),char(215),char(2),char(176),char(2),char(129), +char(255),char(215),char(2),char(176),char(2),char(131),char(255),char(215),char(2),char(176), +char(2),char(139),char(255),char(215),char(2),char(176),char(2),char(170),char(255),char(154), +char(2),char(176),char(2),char(182),char(255),char(154),char(2),char(176),char(2),char(184), +char(255),char(215),char(2),char(176),char(2),char(186),char(255),char(215),char(2),char(176), +char(2),char(190),char(255),char(154),char(2),char(176),char(2),char(192),char(255),char(215), +char(2),char(176),char(2),char(194),char(255),char(215),char(2),char(176),char(2),char(198), +char(255),char(215),char(2),char(176),char(2),char(200),char(255),char(215),char(2),char(176), +char(2),char(213),char(255),char(215),char(2),char(176),char(2),char(254),char(255),char(215), +char(2),char(176),char(3),char(14),char(255),char(113),char(2),char(176),char(3),char(16), +char(255),char(113),char(2),char(176),char(3),char(24),char(255),char(154),char(2),char(177), +char(1),char(157),char(255),char(215),char(2),char(177),char(1),char(166),char(255),char(215), +char(2),char(177),char(1),char(188),char(255),char(195),char(2),char(177),char(1),char(196), +char(255),char(215),char(2),char(177),char(2),char(128),char(255),char(236),char(2),char(177), +char(2),char(130),char(255),char(236),char(2),char(177),char(2),char(169),char(255),char(215), +char(2),char(177),char(2),char(181),char(255),char(195),char(2),char(177),char(2),char(183), +char(255),char(236),char(2),char(177),char(2),char(185),char(255),char(236),char(2),char(177), +char(2),char(189),char(255),char(215),char(2),char(177),char(3),char(13),char(255),char(215), +char(2),char(177),char(3),char(15),char(255),char(215),char(2),char(177),char(3),char(23), +char(255),char(215),char(2),char(178),char(0),char(5),char(255),char(236),char(2),char(178), +char(0),char(10),char(255),char(236),char(2),char(178),char(1),char(208),char(255),char(215), +char(2),char(178),char(1),char(220),char(255),char(236),char(2),char(178),char(1),char(221), +char(255),char(236),char(2),char(178),char(1),char(223),char(255),char(215),char(2),char(178), +char(1),char(225),char(255),char(236),char(2),char(178),char(1),char(228),char(255),char(236), +char(2),char(178),char(1),char(246),char(255),char(236),char(2),char(178),char(2),char(7), +char(255),char(236),char(2),char(178),char(2),char(11),char(255),char(236),char(2),char(178), +char(2),char(160),char(255),char(215),char(2),char(178),char(2),char(170),char(255),char(236), +char(2),char(178),char(2),char(182),char(255),char(236),char(2),char(178),char(2),char(188), +char(255),char(215),char(2),char(178),char(2),char(190),char(255),char(236),char(2),char(178), +char(2),char(192),char(255),char(236),char(2),char(178),char(2),char(194),char(255),char(236), +char(2),char(178),char(2),char(203),char(255),char(215),char(2),char(178),char(2),char(213), +char(255),char(236),char(2),char(178),char(2),char(230),char(255),char(215),char(2),char(178), +char(2),char(248),char(255),char(236),char(2),char(178),char(2),char(250),char(255),char(236), +char(2),char(178),char(2),char(252),char(255),char(236),char(2),char(178),char(2),char(254), +char(255),char(236),char(2),char(178),char(3),char(6),char(255),char(215),char(2),char(178), +char(3),char(8),char(255),char(215),char(2),char(178),char(3),char(14),char(255),char(236), +char(2),char(178),char(3),char(16),char(255),char(236),char(2),char(178),char(3),char(24), +char(255),char(236),char(2),char(179),char(1),char(159),char(255),char(215),char(2),char(179), +char(1),char(184),char(255),char(215),char(2),char(179),char(1),char(187),char(255),char(215), +char(2),char(179),char(1),char(190),char(255),char(215),char(2),char(179),char(1),char(225), +char(255),char(215),char(2),char(179),char(2),char(108),char(255),char(215),char(2),char(179), +char(2),char(126),char(255),char(215),char(2),char(179),char(2),char(132),char(255),char(215), +char(2),char(179),char(2),char(134),char(255),char(215),char(2),char(179),char(2),char(136), +char(255),char(215),char(2),char(179),char(2),char(138),char(255),char(215),char(2),char(179), +char(2),char(140),char(255),char(215),char(2),char(179),char(2),char(177),char(255),char(215), +char(2),char(179),char(2),char(179),char(255),char(215),char(2),char(179),char(2),char(192), +char(255),char(215),char(2),char(179),char(2),char(194),char(255),char(215),char(2),char(179), +char(2),char(197),char(255),char(215),char(2),char(179),char(2),char(199),char(255),char(215), +char(2),char(179),char(2),char(213),char(255),char(215),char(2),char(179),char(2),char(239), +char(255),char(215),char(2),char(179),char(2),char(241),char(255),char(215),char(2),char(179), +char(2),char(243),char(255),char(215),char(2),char(179),char(2),char(254),char(255),char(215), +char(2),char(179),char(3),char(9),char(255),char(215),char(2),char(179),char(3),char(11), +char(255),char(215),char(2),char(179),char(3),char(14),char(255),char(215),char(2),char(179), +char(3),char(16),char(255),char(215),char(2),char(179),char(3),char(21),char(255),char(215), +char(2),char(181),char(0),char(15),char(255),char(133),char(2),char(181),char(0),char(16), +char(255),char(174),char(2),char(181),char(0),char(17),char(255),char(133),char(2),char(181), +char(1),char(159),char(255),char(215),char(2),char(181),char(1),char(164),char(255),char(154), +char(2),char(181),char(1),char(170),char(255),char(113),char(2),char(181),char(1),char(174), +char(255),char(154),char(2),char(181),char(1),char(181),char(255),char(154),char(2),char(181), +char(1),char(184),char(255),char(215),char(2),char(181),char(1),char(187),char(255),char(215), +char(2),char(181),char(1),char(188),char(0),char(41),char(2),char(181),char(1),char(190), +char(255),char(174),char(2),char(181),char(1),char(204),char(255),char(154),char(2),char(181), +char(1),char(205),char(255),char(154),char(2),char(181),char(1),char(206),char(255),char(133), +char(2),char(181),char(1),char(207),char(255),char(113),char(2),char(181),char(1),char(208), +char(255),char(215),char(2),char(181),char(1),char(209),char(255),char(215),char(2),char(181), +char(1),char(210),char(255),char(154),char(2),char(181),char(1),char(211),char(255),char(154), +char(2),char(181),char(1),char(212),char(255),char(154),char(2),char(181),char(1),char(213), +char(255),char(133),char(2),char(181),char(1),char(214),char(255),char(154),char(2),char(181), +char(1),char(215),char(255),char(154),char(2),char(181),char(1),char(216),char(255),char(113), +char(2),char(181),char(1),char(217),char(255),char(154),char(2),char(181),char(1),char(218), +char(255),char(154),char(2),char(181),char(1),char(219),char(255),char(113),char(2),char(181), +char(1),char(220),char(255),char(174),char(2),char(181),char(1),char(221),char(255),char(174), +char(2),char(181),char(1),char(222),char(255),char(113),char(2),char(181),char(1),char(223), +char(255),char(215),char(2),char(181),char(1),char(224),char(255),char(154),char(2),char(181), +char(1),char(225),char(255),char(154),char(2),char(181),char(1),char(226),char(255),char(154), +char(2),char(181),char(1),char(227),char(255),char(154),char(2),char(181),char(1),char(228), +char(255),char(174),char(2),char(181),char(1),char(229),char(255),char(154),char(2),char(181), +char(1),char(230),char(255),char(154),char(2),char(181),char(1),char(231),char(255),char(215), +char(2),char(181),char(1),char(232),char(255),char(154),char(2),char(181),char(1),char(233), +char(255),char(195),char(2),char(181),char(1),char(234),char(255),char(113),char(2),char(181), +char(1),char(236),char(255),char(154),char(2),char(181),char(1),char(237),char(255),char(113), +char(2),char(181),char(1),char(238),char(255),char(133),char(2),char(181),char(1),char(242), +char(255),char(133),char(2),char(181),char(1),char(243),char(255),char(154),char(2),char(181), +char(1),char(245),char(255),char(154),char(2),char(181),char(1),char(246),char(255),char(174), +char(2),char(181),char(1),char(247),char(255),char(154),char(2),char(181),char(1),char(249), +char(255),char(154),char(2),char(181),char(2),char(2),char(255),char(174),char(2),char(181), +char(2),char(3),char(255),char(174),char(2),char(181),char(2),char(4),char(255),char(174), +char(2),char(181),char(2),char(8),char(255),char(133),char(2),char(181),char(2),char(12), +char(255),char(133),char(2),char(181),char(2),char(106),char(255),char(113),char(2),char(181), +char(2),char(107),char(255),char(154),char(2),char(181),char(2),char(108),char(255),char(215), +char(2),char(181),char(2),char(109),char(255),char(215),char(2),char(181),char(2),char(113), +char(255),char(154),char(2),char(181),char(2),char(114),char(255),char(113),char(2),char(181), +char(2),char(115),char(255),char(133),char(2),char(181),char(2),char(117),char(255),char(154), +char(2),char(181),char(2),char(119),char(255),char(154),char(2),char(181),char(2),char(121), +char(255),char(154),char(2),char(181),char(2),char(125),char(255),char(154),char(2),char(181), +char(2),char(126),char(255),char(215),char(2),char(181),char(2),char(127),char(255),char(113), +char(2),char(181),char(2),char(129),char(255),char(215),char(2),char(181),char(2),char(131), +char(255),char(215),char(2),char(181),char(2),char(132),char(255),char(215),char(2),char(181), +char(2),char(133),char(255),char(113),char(2),char(181),char(2),char(134),char(255),char(215), +char(2),char(181),char(2),char(135),char(255),char(113),char(2),char(181),char(2),char(136), +char(255),char(215),char(2),char(181),char(2),char(137),char(255),char(113),char(2),char(181), +char(2),char(138),char(255),char(215),char(2),char(181),char(2),char(139),char(255),char(215), +char(2),char(181),char(2),char(140),char(255),char(215),char(2),char(181),char(2),char(141), +char(255),char(113),char(2),char(181),char(2),char(150),char(255),char(154),char(2),char(181), +char(2),char(154),char(255),char(154),char(2),char(181),char(2),char(158),char(255),char(154), +char(2),char(181),char(2),char(160),char(255),char(215),char(2),char(181),char(2),char(162), +char(255),char(215),char(2),char(181),char(2),char(164),char(255),char(154),char(2),char(181), +char(2),char(166),char(255),char(154),char(2),char(181),char(2),char(170),char(255),char(174), +char(2),char(181),char(2),char(172),char(255),char(154),char(2),char(181),char(2),char(174), +char(255),char(154),char(2),char(181),char(2),char(176),char(255),char(154),char(2),char(181), +char(2),char(177),char(255),char(215),char(2),char(181),char(2),char(178),char(255),char(113), +char(2),char(181),char(2),char(179),char(255),char(215),char(2),char(181),char(2),char(180), +char(255),char(113),char(2),char(181),char(2),char(181),char(0),char(41),char(2),char(181), +char(2),char(182),char(255),char(174),char(2),char(181),char(2),char(184),char(255),char(174), +char(2),char(181),char(2),char(186),char(255),char(174),char(2),char(181),char(2),char(188), +char(255),char(215),char(2),char(181),char(2),char(190),char(255),char(174),char(2),char(181), +char(2),char(192),char(255),char(154),char(2),char(181),char(2),char(194),char(255),char(154), +char(2),char(181),char(2),char(196),char(255),char(154),char(2),char(181),char(2),char(197), +char(255),char(154),char(2),char(181),char(2),char(198),char(255),char(113),char(2),char(181), +char(2),char(199),char(255),char(154),char(2),char(181),char(2),char(200),char(255),char(113), +char(2),char(181),char(2),char(203),char(255),char(215),char(2),char(181),char(2),char(205), +char(255),char(154),char(2),char(181),char(2),char(206),char(255),char(154),char(2),char(181), +char(2),char(207),char(255),char(133),char(2),char(181),char(2),char(209),char(255),char(154), +char(2),char(181),char(2),char(211),char(255),char(154),char(2),char(181),char(2),char(213), +char(255),char(154),char(2),char(181),char(2),char(215),char(255),char(154),char(2),char(181), +char(2),char(217),char(255),char(113),char(2),char(181),char(2),char(219),char(255),char(113), +char(2),char(181),char(2),char(221),char(255),char(113),char(2),char(181),char(2),char(224), +char(255),char(113),char(2),char(181),char(2),char(230),char(255),char(215),char(2),char(181), +char(2),char(232),char(255),char(215),char(2),char(181),char(2),char(234),char(255),char(195), +char(2),char(181),char(2),char(236),char(255),char(154),char(2),char(181),char(2),char(238), +char(255),char(154),char(2),char(181),char(2),char(239),char(255),char(215),char(2),char(181), +char(2),char(240),char(255),char(113),char(2),char(181),char(2),char(241),char(255),char(215), +char(2),char(181),char(2),char(242),char(255),char(113),char(2),char(181),char(2),char(243), +char(255),char(215),char(2),char(181),char(2),char(244),char(255),char(113),char(2),char(181), +char(2),char(246),char(255),char(215),char(2),char(181),char(2),char(248),char(255),char(174), +char(2),char(181),char(2),char(250),char(255),char(174),char(2),char(181),char(2),char(252), +char(255),char(174),char(2),char(181),char(2),char(254),char(255),char(154),char(2),char(181), +char(3),char(0),char(255),char(154),char(2),char(181),char(3),char(2),char(255),char(154), +char(2),char(181),char(3),char(6),char(255),char(215),char(2),char(181),char(3),char(8), +char(255),char(215),char(2),char(181),char(3),char(9),char(255),char(113),char(2),char(181), +char(3),char(10),char(255),char(113),char(2),char(181),char(3),char(11),char(255),char(113), +char(2),char(181),char(3),char(12),char(255),char(113),char(2),char(181),char(3),char(14), +char(255),char(154),char(2),char(181),char(3),char(16),char(255),char(154),char(2),char(181), +char(3),char(17),char(255),char(154),char(2),char(181),char(3),char(18),char(255),char(133), +char(2),char(181),char(3),char(20),char(255),char(154),char(2),char(181),char(3),char(21), +char(255),char(215),char(2),char(181),char(3),char(22),char(255),char(113),char(2),char(181), +char(3),char(24),char(255),char(174),char(2),char(181),char(3),char(26),char(255),char(113), +char(2),char(181),char(3),char(27),char(255),char(154),char(2),char(181),char(3),char(28), +char(255),char(133),char(2),char(182),char(0),char(15),char(255),char(154),char(2),char(182), +char(0),char(16),char(255),char(215),char(2),char(182),char(0),char(17),char(255),char(154), +char(2),char(182),char(1),char(206),char(255),char(195),char(2),char(182),char(1),char(207), +char(255),char(236),char(2),char(182),char(1),char(213),char(255),char(195),char(2),char(182), +char(1),char(216),char(255),char(236),char(2),char(182),char(1),char(219),char(255),char(236), +char(2),char(182),char(1),char(222),char(255),char(236),char(2),char(182),char(1),char(234), +char(255),char(236),char(2),char(182),char(1),char(237),char(255),char(236),char(2),char(182), +char(1),char(242),char(255),char(195),char(2),char(182),char(2),char(2),char(255),char(215), +char(2),char(182),char(2),char(3),char(255),char(215),char(2),char(182),char(2),char(4), +char(255),char(215),char(2),char(182),char(2),char(8),char(255),char(154),char(2),char(182), +char(2),char(12),char(255),char(154),char(2),char(182),char(2),char(106),char(255),char(236), +char(2),char(182),char(2),char(115),char(255),char(195),char(2),char(182),char(2),char(127), +char(255),char(236),char(2),char(182),char(2),char(133),char(255),char(236),char(2),char(182), +char(2),char(135),char(255),char(236),char(2),char(182),char(2),char(137),char(255),char(236), +char(2),char(182),char(2),char(141),char(255),char(236),char(2),char(182),char(2),char(178), +char(255),char(236),char(2),char(182),char(2),char(180),char(255),char(236),char(2),char(182), +char(2),char(207),char(255),char(195),char(2),char(182),char(2),char(224),char(255),char(236), +char(2),char(182),char(2),char(240),char(255),char(236),char(2),char(182),char(2),char(242), +char(255),char(236),char(2),char(182),char(2),char(244),char(255),char(236),char(2),char(182), +char(3),char(10),char(255),char(236),char(2),char(182),char(3),char(12),char(255),char(236), +char(2),char(182),char(3),char(18),char(255),char(195),char(2),char(182),char(3),char(22), +char(255),char(236),char(2),char(182),char(3),char(26),char(255),char(236),char(2),char(182), +char(3),char(28),char(255),char(195),char(2),char(183),char(0),char(15),char(255),char(133), +char(2),char(183),char(0),char(17),char(255),char(133),char(2),char(183),char(1),char(159), +char(255),char(215),char(2),char(183),char(1),char(164),char(255),char(174),char(2),char(183), +char(1),char(170),char(255),char(133),char(2),char(183),char(1),char(174),char(255),char(174), +char(2),char(183),char(1),char(181),char(255),char(174),char(2),char(183),char(1),char(184), +char(255),char(215),char(2),char(183),char(1),char(187),char(255),char(215),char(2),char(183), +char(1),char(190),char(255),char(195),char(2),char(183),char(1),char(202),char(255),char(174), +char(2),char(183),char(1),char(204),char(255),char(195),char(2),char(183),char(1),char(205), +char(255),char(195),char(2),char(183),char(1),char(206),char(255),char(154),char(2),char(183), +char(1),char(207),char(255),char(154),char(2),char(183),char(1),char(210),char(255),char(195), +char(2),char(183),char(1),char(211),char(255),char(195),char(2),char(183),char(1),char(212), +char(255),char(195),char(2),char(183),char(1),char(213),char(255),char(154),char(2),char(183), +char(1),char(214),char(255),char(195),char(2),char(183),char(1),char(215),char(255),char(195), +char(2),char(183),char(1),char(216),char(255),char(154),char(2),char(183),char(1),char(217), +char(255),char(195),char(2),char(183),char(1),char(218),char(255),char(195),char(2),char(183), +char(1),char(219),char(255),char(154),char(2),char(183),char(1),char(222),char(255),char(154), +char(2),char(183),char(1),char(224),char(255),char(195),char(2),char(183),char(1),char(225), +char(255),char(174),char(2),char(183),char(1),char(226),char(255),char(195),char(2),char(183), +char(1),char(227),char(255),char(195),char(2),char(183),char(1),char(229),char(255),char(195), +char(2),char(183),char(1),char(230),char(255),char(195),char(2),char(183),char(1),char(232), +char(255),char(195),char(2),char(183),char(1),char(233),char(255),char(215),char(2),char(183), +char(1),char(234),char(255),char(154),char(2),char(183),char(1),char(235),char(0),char(41), +char(2),char(183),char(1),char(236),char(255),char(195),char(2),char(183),char(1),char(237), +char(255),char(154),char(2),char(183),char(1),char(238),char(255),char(174),char(2),char(183), +char(1),char(242),char(255),char(154),char(2),char(183),char(1),char(243),char(255),char(195), +char(2),char(183),char(1),char(244),char(0),char(41),char(2),char(183),char(1),char(245), +char(255),char(195),char(2),char(183),char(1),char(247),char(255),char(195),char(2),char(183), +char(1),char(249),char(255),char(195),char(2),char(183),char(2),char(8),char(255),char(133), +char(2),char(183),char(2),char(12),char(255),char(133),char(2),char(183),char(2),char(106), +char(255),char(154),char(2),char(183),char(2),char(107),char(255),char(195),char(2),char(183), +char(2),char(108),char(255),char(215),char(2),char(183),char(2),char(113),char(255),char(195), +char(2),char(183),char(2),char(114),char(255),char(133),char(2),char(183),char(2),char(115), +char(255),char(154),char(2),char(183),char(2),char(117),char(255),char(195),char(2),char(183), +char(2),char(119),char(255),char(215),char(2),char(183),char(2),char(121),char(255),char(195), +char(2),char(183),char(2),char(125),char(255),char(215),char(2),char(183),char(2),char(126), +char(255),char(215),char(2),char(183),char(2),char(127),char(255),char(154),char(2),char(183), +char(2),char(132),char(255),char(215),char(2),char(183),char(2),char(133),char(255),char(154), +char(2),char(183),char(2),char(134),char(255),char(215),char(2),char(183),char(2),char(135), +char(255),char(154),char(2),char(183),char(2),char(136),char(255),char(215),char(2),char(183), +char(2),char(137),char(255),char(154),char(2),char(183),char(2),char(138),char(255),char(215), +char(2),char(183),char(2),char(140),char(255),char(215),char(2),char(183),char(2),char(141), +char(255),char(154),char(2),char(183),char(2),char(150),char(255),char(195),char(2),char(183), +char(2),char(152),char(0),char(41),char(2),char(183),char(2),char(154),char(255),char(195), +char(2),char(183),char(2),char(158),char(255),char(195),char(2),char(183),char(2),char(164), +char(255),char(195),char(2),char(183),char(2),char(166),char(255),char(195),char(2),char(183), +char(2),char(168),char(0),char(41),char(2),char(183),char(2),char(172),char(255),char(195), +char(2),char(183),char(2),char(174),char(255),char(195),char(2),char(183),char(2),char(176), +char(255),char(195),char(2),char(183),char(2),char(177),char(255),char(215),char(2),char(183), +char(2),char(178),char(255),char(154),char(2),char(183),char(2),char(179),char(255),char(215), +char(2),char(183),char(2),char(180),char(255),char(154),char(2),char(183),char(2),char(192), +char(255),char(174),char(2),char(183),char(2),char(194),char(255),char(174),char(2),char(183), +char(2),char(196),char(255),char(195),char(2),char(183),char(2),char(198),char(255),char(174), +char(2),char(183),char(2),char(200),char(255),char(174),char(2),char(183),char(2),char(205), +char(255),char(195),char(2),char(183),char(2),char(206),char(255),char(174),char(2),char(183), +char(2),char(207),char(255),char(154),char(2),char(183),char(2),char(209),char(255),char(195), +char(2),char(183),char(2),char(211),char(255),char(195),char(2),char(183),char(2),char(213), +char(255),char(174),char(2),char(183),char(2),char(215),char(255),char(195),char(2),char(183), +char(2),char(217),char(255),char(133),char(2),char(183),char(2),char(218),char(255),char(174), +char(2),char(183),char(2),char(219),char(255),char(133),char(2),char(183),char(2),char(220), +char(255),char(174),char(2),char(183),char(2),char(221),char(255),char(133),char(2),char(183), +char(2),char(222),char(255),char(174),char(2),char(183),char(2),char(224),char(255),char(154), +char(2),char(183),char(2),char(225),char(255),char(236),char(2),char(183),char(2),char(226), +char(255),char(174),char(2),char(183),char(2),char(227),char(255),char(236),char(2),char(183), +char(2),char(228),char(255),char(174),char(2),char(183),char(2),char(236),char(255),char(195), +char(2),char(183),char(2),char(238),char(255),char(195),char(2),char(183),char(2),char(239), +char(255),char(215),char(2),char(183),char(2),char(240),char(255),char(154),char(2),char(183), +char(2),char(241),char(255),char(215),char(2),char(183),char(2),char(242),char(255),char(154), +char(2),char(183),char(2),char(243),char(255),char(215),char(2),char(183),char(2),char(244), +char(255),char(154),char(2),char(183),char(2),char(254),char(255),char(174),char(2),char(183), +char(3),char(0),char(255),char(195),char(2),char(183),char(3),char(2),char(255),char(195), +char(2),char(183),char(3),char(9),char(255),char(174),char(2),char(183),char(3),char(10), +char(255),char(154),char(2),char(183),char(3),char(11),char(255),char(174),char(2),char(183), +char(3),char(12),char(255),char(154),char(2),char(183),char(3),char(14),char(255),char(215), +char(2),char(183),char(3),char(16),char(255),char(215),char(2),char(183),char(3),char(17), +char(255),char(174),char(2),char(183),char(3),char(18),char(255),char(154),char(2),char(183), +char(3),char(20),char(255),char(195),char(2),char(183),char(3),char(21),char(255),char(215), +char(2),char(183),char(3),char(22),char(255),char(154),char(2),char(183),char(3),char(25), +char(255),char(236),char(2),char(183),char(3),char(26),char(255),char(154),char(2),char(183), +char(3),char(27),char(255),char(174),char(2),char(183),char(3),char(28),char(255),char(154), +char(2),char(184),char(0),char(15),char(255),char(174),char(2),char(184),char(0),char(17), +char(255),char(174),char(2),char(184),char(1),char(206),char(255),char(236),char(2),char(184), +char(1),char(213),char(255),char(236),char(2),char(184),char(1),char(242),char(255),char(236), +char(2),char(184),char(2),char(8),char(255),char(174),char(2),char(184),char(2),char(12), +char(255),char(174),char(2),char(184),char(2),char(115),char(255),char(236),char(2),char(184), +char(2),char(207),char(255),char(236),char(2),char(184),char(3),char(18),char(255),char(236), +char(2),char(184),char(3),char(28),char(255),char(236),char(2),char(185),char(0),char(15), +char(255),char(133),char(2),char(185),char(0),char(17),char(255),char(133),char(2),char(185), +char(1),char(159),char(255),char(215),char(2),char(185),char(1),char(164),char(255),char(174), +char(2),char(185),char(1),char(170),char(255),char(133),char(2),char(185),char(1),char(174), +char(255),char(174),char(2),char(185),char(1),char(181),char(255),char(174),char(2),char(185), +char(1),char(184),char(255),char(215),char(2),char(185),char(1),char(187),char(255),char(215), +char(2),char(185),char(1),char(190),char(255),char(195),char(2),char(185),char(1),char(202), +char(255),char(174),char(2),char(185),char(1),char(204),char(255),char(195),char(2),char(185), +char(1),char(205),char(255),char(195),char(2),char(185),char(1),char(206),char(255),char(154), +char(2),char(185),char(1),char(207),char(255),char(154),char(2),char(185),char(1),char(210), +char(255),char(195),char(2),char(185),char(1),char(211),char(255),char(195),char(2),char(185), +char(1),char(212),char(255),char(195),char(2),char(185),char(1),char(213),char(255),char(154), +char(2),char(185),char(1),char(214),char(255),char(195),char(2),char(185),char(1),char(215), +char(255),char(195),char(2),char(185),char(1),char(216),char(255),char(154),char(2),char(185), +char(1),char(217),char(255),char(195),char(2),char(185),char(1),char(218),char(255),char(195), +char(2),char(185),char(1),char(219),char(255),char(154),char(2),char(185),char(1),char(222), +char(255),char(154),char(2),char(185),char(1),char(224),char(255),char(195),char(2),char(185), +char(1),char(225),char(255),char(174),char(2),char(185),char(1),char(226),char(255),char(195), +char(2),char(185),char(1),char(227),char(255),char(195),char(2),char(185),char(1),char(229), +char(255),char(195),char(2),char(185),char(1),char(230),char(255),char(195),char(2),char(185), +char(1),char(232),char(255),char(195),char(2),char(185),char(1),char(233),char(255),char(215), +char(2),char(185),char(1),char(234),char(255),char(154),char(2),char(185),char(1),char(235), +char(0),char(41),char(2),char(185),char(1),char(236),char(255),char(195),char(2),char(185), +char(1),char(237),char(255),char(154),char(2),char(185),char(1),char(238),char(255),char(174), +char(2),char(185),char(1),char(242),char(255),char(154),char(2),char(185),char(1),char(243), +char(255),char(195),char(2),char(185),char(1),char(244),char(0),char(41),char(2),char(185), +char(1),char(245),char(255),char(195),char(2),char(185),char(1),char(247),char(255),char(195), +char(2),char(185),char(1),char(249),char(255),char(195),char(2),char(185),char(2),char(8), +char(255),char(133),char(2),char(185),char(2),char(12),char(255),char(133),char(2),char(185), +char(2),char(106),char(255),char(154),char(2),char(185),char(2),char(107),char(255),char(195), +char(2),char(185),char(2),char(108),char(255),char(215),char(2),char(185),char(2),char(113), +char(255),char(195),char(2),char(185),char(2),char(114),char(255),char(133),char(2),char(185), +char(2),char(115),char(255),char(154),char(2),char(185),char(2),char(117),char(255),char(195), +char(2),char(185),char(2),char(119),char(255),char(215),char(2),char(185),char(2),char(121), +char(255),char(195),char(2),char(185),char(2),char(125),char(255),char(215),char(2),char(185), +char(2),char(126),char(255),char(215),char(2),char(185),char(2),char(127),char(255),char(154), +char(2),char(185),char(2),char(132),char(255),char(215),char(2),char(185),char(2),char(133), +char(255),char(154),char(2),char(185),char(2),char(134),char(255),char(215),char(2),char(185), +char(2),char(135),char(255),char(154),char(2),char(185),char(2),char(136),char(255),char(215), +char(2),char(185),char(2),char(137),char(255),char(154),char(2),char(185),char(2),char(138), +char(255),char(215),char(2),char(185),char(2),char(140),char(255),char(215),char(2),char(185), +char(2),char(141),char(255),char(154),char(2),char(185),char(2),char(150),char(255),char(195), +char(2),char(185),char(2),char(152),char(0),char(41),char(2),char(185),char(2),char(154), +char(255),char(195),char(2),char(185),char(2),char(158),char(255),char(195),char(2),char(185), +char(2),char(164),char(255),char(195),char(2),char(185),char(2),char(166),char(255),char(195), +char(2),char(185),char(2),char(168),char(0),char(41),char(2),char(185),char(2),char(172), +char(255),char(195),char(2),char(185),char(2),char(174),char(255),char(195),char(2),char(185), +char(2),char(176),char(255),char(195),char(2),char(185),char(2),char(177),char(255),char(215), +char(2),char(185),char(2),char(178),char(255),char(154),char(2),char(185),char(2),char(179), +char(255),char(215),char(2),char(185),char(2),char(180),char(255),char(154),char(2),char(185), +char(2),char(192),char(255),char(174),char(2),char(185),char(2),char(194),char(255),char(174), +char(2),char(185),char(2),char(196),char(255),char(195),char(2),char(185),char(2),char(198), +char(255),char(174),char(2),char(185),char(2),char(200),char(255),char(174),char(2),char(185), +char(2),char(205),char(255),char(195),char(2),char(185),char(2),char(206),char(255),char(174), +char(2),char(185),char(2),char(207),char(255),char(154),char(2),char(185),char(2),char(209), +char(255),char(195),char(2),char(185),char(2),char(211),char(255),char(195),char(2),char(185), +char(2),char(213),char(255),char(174),char(2),char(185),char(2),char(215),char(255),char(195), +char(2),char(185),char(2),char(217),char(255),char(133),char(2),char(185),char(2),char(218), +char(255),char(174),char(2),char(185),char(2),char(219),char(255),char(133),char(2),char(185), +char(2),char(220),char(255),char(174),char(2),char(185),char(2),char(221),char(255),char(133), +char(2),char(185),char(2),char(222),char(255),char(174),char(2),char(185),char(2),char(224), +char(255),char(154),char(2),char(185),char(2),char(225),char(255),char(236),char(2),char(185), +char(2),char(226),char(255),char(174),char(2),char(185),char(2),char(227),char(255),char(236), +char(2),char(185),char(2),char(228),char(255),char(174),char(2),char(185),char(2),char(236), +char(255),char(195),char(2),char(185),char(2),char(238),char(255),char(195),char(2),char(185), +char(2),char(239),char(255),char(215),char(2),char(185),char(2),char(240),char(255),char(154), +char(2),char(185),char(2),char(241),char(255),char(215),char(2),char(185),char(2),char(242), +char(255),char(154),char(2),char(185),char(2),char(243),char(255),char(215),char(2),char(185), +char(2),char(244),char(255),char(154),char(2),char(185),char(2),char(254),char(255),char(174), +char(2),char(185),char(3),char(0),char(255),char(195),char(2),char(185),char(3),char(2), +char(255),char(195),char(2),char(185),char(3),char(9),char(255),char(174),char(2),char(185), +char(3),char(10),char(255),char(154),char(2),char(185),char(3),char(11),char(255),char(174), +char(2),char(185),char(3),char(12),char(255),char(154),char(2),char(185),char(3),char(14), +char(255),char(215),char(2),char(185),char(3),char(16),char(255),char(215),char(2),char(185), +char(3),char(17),char(255),char(174),char(2),char(185),char(3),char(18),char(255),char(154), +char(2),char(185),char(3),char(20),char(255),char(195),char(2),char(185),char(3),char(21), +char(255),char(215),char(2),char(185),char(3),char(22),char(255),char(154),char(2),char(185), +char(3),char(25),char(255),char(236),char(2),char(185),char(3),char(26),char(255),char(154), +char(2),char(185),char(3),char(27),char(255),char(174),char(2),char(185),char(3),char(28), +char(255),char(154),char(2),char(186),char(0),char(15),char(255),char(174),char(2),char(186), +char(0),char(17),char(255),char(174),char(2),char(186),char(1),char(206),char(255),char(236), +char(2),char(186),char(1),char(213),char(255),char(236),char(2),char(186),char(1),char(242), +char(255),char(236),char(2),char(186),char(2),char(8),char(255),char(174),char(2),char(186), +char(2),char(12),char(255),char(174),char(2),char(186),char(2),char(115),char(255),char(236), +char(2),char(186),char(2),char(207),char(255),char(236),char(2),char(186),char(3),char(18), +char(255),char(236),char(2),char(186),char(3),char(28),char(255),char(236),char(2),char(187), +char(1),char(159),char(255),char(215),char(2),char(187),char(1),char(163),char(0),char(225), +char(2),char(187),char(1),char(184),char(255),char(215),char(2),char(187),char(1),char(187), +char(255),char(215),char(2),char(187),char(1),char(190),char(255),char(195),char(2),char(187), +char(1),char(220),char(255),char(215),char(2),char(187),char(1),char(225),char(255),char(174), +char(2),char(187),char(1),char(228),char(255),char(215),char(2),char(187),char(2),char(108), +char(255),char(215),char(2),char(187),char(2),char(123),char(0),char(61),char(2),char(187), +char(2),char(125),char(255),char(236),char(2),char(187),char(2),char(126),char(255),char(215), +char(2),char(187),char(2),char(132),char(255),char(215),char(2),char(187),char(2),char(134), +char(255),char(215),char(2),char(187),char(2),char(136),char(255),char(215),char(2),char(187), +char(2),char(138),char(255),char(215),char(2),char(187),char(2),char(140),char(255),char(215), +char(2),char(187),char(2),char(170),char(255),char(215),char(2),char(187),char(2),char(177), +char(255),char(215),char(2),char(187),char(2),char(179),char(255),char(215),char(2),char(187), +char(2),char(182),char(255),char(215),char(2),char(187),char(2),char(190),char(255),char(215), +char(2),char(187),char(2),char(192),char(255),char(174),char(2),char(187),char(2),char(194), +char(255),char(174),char(2),char(187),char(2),char(197),char(255),char(195),char(2),char(187), +char(2),char(198),char(255),char(215),char(2),char(187),char(2),char(199),char(255),char(195), +char(2),char(187),char(2),char(200),char(255),char(215),char(2),char(187),char(2),char(213), +char(255),char(174),char(2),char(187),char(2),char(239),char(255),char(215),char(2),char(187), +char(2),char(241),char(255),char(215),char(2),char(187),char(2),char(243),char(255),char(215), +char(2),char(187),char(2),char(254),char(255),char(174),char(2),char(187),char(3),char(14), +char(255),char(215),char(2),char(187),char(3),char(16),char(255),char(215),char(2),char(187), +char(3),char(21),char(255),char(215),char(2),char(187),char(3),char(24),char(255),char(215), +char(2),char(188),char(1),char(207),char(255),char(236),char(2),char(188),char(1),char(216), +char(255),char(236),char(2),char(188),char(1),char(219),char(255),char(236),char(2),char(188), +char(1),char(222),char(255),char(236),char(2),char(188),char(1),char(225),char(255),char(236), +char(2),char(188),char(1),char(234),char(255),char(236),char(2),char(188),char(1),char(237), +char(255),char(236),char(2),char(188),char(2),char(106),char(255),char(236),char(2),char(188), +char(2),char(127),char(255),char(236),char(2),char(188),char(2),char(133),char(255),char(236), +char(2),char(188),char(2),char(135),char(255),char(236),char(2),char(188),char(2),char(137), +char(255),char(236),char(2),char(188),char(2),char(141),char(255),char(236),char(2),char(188), +char(2),char(178),char(255),char(236),char(2),char(188),char(2),char(180),char(255),char(236), +char(2),char(188),char(2),char(192),char(255),char(236),char(2),char(188),char(2),char(194), +char(255),char(236),char(2),char(188),char(2),char(213),char(255),char(236),char(2),char(188), +char(2),char(224),char(255),char(236),char(2),char(188),char(2),char(240),char(255),char(236), +char(2),char(188),char(2),char(242),char(255),char(236),char(2),char(188),char(2),char(244), +char(255),char(236),char(2),char(188),char(2),char(254),char(255),char(236),char(2),char(188), +char(3),char(10),char(255),char(236),char(2),char(188),char(3),char(12),char(255),char(236), +char(2),char(188),char(3),char(14),char(255),char(215),char(2),char(188),char(3),char(16), +char(255),char(215),char(2),char(188),char(3),char(22),char(255),char(236),char(2),char(188), +char(3),char(26),char(255),char(236),char(2),char(189),char(1),char(163),char(0),char(225), +char(2),char(189),char(2),char(234),char(0),char(41),char(2),char(189),char(3),char(14), +char(255),char(215),char(2),char(189),char(3),char(16),char(255),char(215),char(2),char(190), +char(0),char(5),char(255),char(236),char(2),char(190),char(0),char(10),char(255),char(236), +char(2),char(190),char(2),char(7),char(255),char(236),char(2),char(190),char(2),char(11), +char(255),char(236),char(2),char(191),char(1),char(163),char(0),char(225),char(2),char(191), +char(2),char(234),char(0),char(41),char(2),char(191),char(3),char(14),char(255),char(215), +char(2),char(191),char(3),char(16),char(255),char(215),char(2),char(192),char(0),char(5), +char(255),char(236),char(2),char(192),char(0),char(10),char(255),char(236),char(2),char(192), +char(2),char(7),char(255),char(236),char(2),char(192),char(2),char(11),char(255),char(236), +char(2),char(195),char(0),char(5),char(255),char(195),char(2),char(195),char(0),char(10), +char(255),char(195),char(2),char(195),char(1),char(157),char(255),char(215),char(2),char(195), +char(1),char(166),char(255),char(215),char(2),char(195),char(1),char(188),char(255),char(133), +char(2),char(195),char(1),char(193),char(255),char(174),char(2),char(195),char(1),char(196), +char(255),char(215),char(2),char(195),char(1),char(220),char(255),char(215),char(2),char(195), +char(1),char(221),char(255),char(236),char(2),char(195),char(1),char(225),char(255),char(236), +char(2),char(195),char(1),char(228),char(255),char(215),char(2),char(195),char(1),char(246), +char(255),char(236),char(2),char(195),char(2),char(7),char(255),char(195),char(2),char(195), +char(2),char(11),char(255),char(195),char(2),char(195),char(2),char(124),char(255),char(174), +char(2),char(195),char(2),char(128),char(255),char(195),char(2),char(195),char(2),char(130), +char(255),char(195),char(2),char(195),char(2),char(169),char(255),char(215),char(2),char(195), +char(2),char(170),char(255),char(215),char(2),char(195),char(2),char(181),char(255),char(133), +char(2),char(195),char(2),char(182),char(255),char(215),char(2),char(195),char(2),char(183), +char(255),char(154),char(2),char(195),char(2),char(185),char(255),char(154),char(2),char(195), +char(2),char(189),char(255),char(215),char(2),char(195),char(2),char(190),char(255),char(215), +char(2),char(195),char(2),char(191),char(255),char(174),char(2),char(195),char(2),char(192), +char(255),char(236),char(2),char(195),char(2),char(193),char(255),char(174),char(2),char(195), +char(2),char(194),char(255),char(236),char(2),char(195),char(2),char(212),char(255),char(174), +char(2),char(195),char(2),char(213),char(255),char(236),char(2),char(195),char(2),char(248), +char(255),char(236),char(2),char(195),char(2),char(250),char(255),char(236),char(2),char(195), +char(2),char(252),char(255),char(236),char(2),char(195),char(2),char(253),char(255),char(174), +char(2),char(195),char(2),char(254),char(255),char(236),char(2),char(195),char(3),char(13), +char(255),char(174),char(2),char(195),char(3),char(14),char(255),char(215),char(2),char(195), +char(3),char(15),char(255),char(174),char(2),char(195),char(3),char(16),char(255),char(215), +char(2),char(195),char(3),char(23),char(255),char(215),char(2),char(195),char(3),char(24), +char(255),char(215),char(2),char(196),char(0),char(5),char(255),char(154),char(2),char(196), +char(0),char(10),char(255),char(154),char(2),char(196),char(1),char(220),char(255),char(215), +char(2),char(196),char(1),char(221),char(255),char(215),char(2),char(196),char(1),char(228), +char(255),char(215),char(2),char(196),char(1),char(246),char(255),char(215),char(2),char(196), +char(2),char(7),char(255),char(154),char(2),char(196),char(2),char(11),char(255),char(154), +char(2),char(196),char(2),char(170),char(255),char(215),char(2),char(196),char(2),char(182), +char(255),char(215),char(2),char(196),char(2),char(184),char(255),char(215),char(2),char(196), +char(2),char(186),char(255),char(215),char(2),char(196),char(2),char(190),char(255),char(215), +char(2),char(196),char(2),char(248),char(255),char(215),char(2),char(196),char(2),char(250), +char(255),char(215),char(2),char(196),char(2),char(252),char(255),char(215),char(2),char(196), +char(3),char(14),char(255),char(174),char(2),char(196),char(3),char(16),char(255),char(174), +char(2),char(196),char(3),char(24),char(255),char(215),char(2),char(197),char(1),char(188), +char(255),char(215),char(2),char(197),char(2),char(128),char(255),char(236),char(2),char(197), +char(2),char(130),char(255),char(236),char(2),char(197),char(2),char(181),char(255),char(215), +char(2),char(197),char(2),char(183),char(255),char(236),char(2),char(197),char(2),char(185), +char(255),char(236),char(2),char(197),char(3),char(13),char(255),char(236),char(2),char(197), +char(3),char(15),char(255),char(236),char(2),char(198),char(0),char(5),char(255),char(236), +char(2),char(198),char(0),char(10),char(255),char(236),char(2),char(198),char(2),char(7), +char(255),char(236),char(2),char(198),char(2),char(11),char(255),char(236),char(2),char(199), +char(1),char(188),char(255),char(215),char(2),char(199),char(2),char(128),char(255),char(236), +char(2),char(199),char(2),char(130),char(255),char(236),char(2),char(199),char(2),char(181), +char(255),char(215),char(2),char(199),char(2),char(183),char(255),char(236),char(2),char(199), +char(2),char(185),char(255),char(236),char(2),char(199),char(3),char(13),char(255),char(236), +char(2),char(199),char(3),char(15),char(255),char(236),char(2),char(200),char(0),char(5), +char(255),char(236),char(2),char(200),char(0),char(10),char(255),char(236),char(2),char(200), +char(2),char(7),char(255),char(236),char(2),char(200),char(2),char(11),char(255),char(236), +char(2),char(202),char(1),char(159),char(255),char(215),char(2),char(202),char(1),char(184), +char(255),char(215),char(2),char(202),char(1),char(187),char(255),char(215),char(2),char(202), +char(1),char(190),char(255),char(215),char(2),char(202),char(1),char(193),char(255),char(215), +char(2),char(202),char(1),char(225),char(255),char(215),char(2),char(202),char(2),char(108), +char(255),char(215),char(2),char(202),char(2),char(124),char(255),char(215),char(2),char(202), +char(2),char(126),char(255),char(215),char(2),char(202),char(2),char(132),char(255),char(215), +char(2),char(202),char(2),char(134),char(255),char(215),char(2),char(202),char(2),char(136), +char(255),char(215),char(2),char(202),char(2),char(138),char(255),char(215),char(2),char(202), +char(2),char(140),char(255),char(215),char(2),char(202),char(2),char(177),char(255),char(215), +char(2),char(202),char(2),char(179),char(255),char(215),char(2),char(202),char(2),char(191), +char(255),char(215),char(2),char(202),char(2),char(192),char(255),char(215),char(2),char(202), +char(2),char(193),char(255),char(215),char(2),char(202),char(2),char(194),char(255),char(215), +char(2),char(202),char(2),char(197),char(255),char(154),char(2),char(202),char(2),char(199), +char(255),char(154),char(2),char(202),char(2),char(212),char(255),char(215),char(2),char(202), +char(2),char(213),char(255),char(215),char(2),char(202),char(2),char(239),char(255),char(215), +char(2),char(202),char(2),char(241),char(255),char(215),char(2),char(202),char(2),char(243), +char(255),char(215),char(2),char(202),char(2),char(253),char(255),char(215),char(2),char(202), +char(2),char(254),char(255),char(215),char(2),char(202),char(3),char(9),char(255),char(215), +char(2),char(202),char(3),char(11),char(255),char(215),char(2),char(202),char(3),char(14), +char(255),char(215),char(2),char(202),char(3),char(16),char(255),char(215),char(2),char(202), +char(3),char(21),char(255),char(215),char(2),char(202),char(3),char(25),char(255),char(236), +char(2),char(203),char(1),char(207),char(255),char(215),char(2),char(203),char(1),char(216), +char(255),char(215),char(2),char(203),char(1),char(219),char(255),char(215),char(2),char(203), +char(1),char(222),char(255),char(215),char(2),char(203),char(1),char(225),char(255),char(215), +char(2),char(203),char(1),char(234),char(255),char(215),char(2),char(203),char(1),char(237), +char(255),char(215),char(2),char(203),char(2),char(106),char(255),char(215),char(2),char(203), +char(2),char(127),char(255),char(215),char(2),char(203),char(2),char(133),char(255),char(215), +char(2),char(203),char(2),char(135),char(255),char(215),char(2),char(203),char(2),char(137), +char(255),char(215),char(2),char(203),char(2),char(141),char(255),char(215),char(2),char(203), +char(2),char(178),char(255),char(215),char(2),char(203),char(2),char(180),char(255),char(215), +char(2),char(203),char(2),char(192),char(255),char(215),char(2),char(203),char(2),char(194), +char(255),char(215),char(2),char(203),char(2),char(198),char(255),char(215),char(2),char(203), +char(2),char(200),char(255),char(215),char(2),char(203),char(2),char(213),char(255),char(215), +char(2),char(203),char(2),char(224),char(255),char(215),char(2),char(203),char(2),char(240), +char(255),char(215),char(2),char(203),char(2),char(242),char(255),char(215),char(2),char(203), +char(2),char(244),char(255),char(215),char(2),char(203),char(2),char(254),char(255),char(215), +char(2),char(203),char(3),char(10),char(255),char(215),char(2),char(203),char(3),char(12), +char(255),char(215),char(2),char(203),char(3),char(22),char(255),char(215),char(2),char(203), +char(3),char(26),char(255),char(215),char(2),char(204),char(0),char(5),char(255),char(195), +char(2),char(204),char(0),char(10),char(255),char(195),char(2),char(204),char(1),char(163), +char(0),char(102),char(2),char(204),char(1),char(188),char(255),char(215),char(2),char(204), +char(1),char(190),char(255),char(215),char(2),char(204),char(1),char(193),char(255),char(174), +char(2),char(204),char(1),char(220),char(255),char(195),char(2),char(204),char(1),char(225), +char(255),char(215),char(2),char(204),char(1),char(228),char(255),char(195),char(2),char(204), +char(2),char(7),char(255),char(195),char(2),char(204),char(2),char(11),char(255),char(195), +char(2),char(204),char(2),char(109),char(255),char(236),char(2),char(204),char(2),char(124), +char(255),char(174),char(2),char(204),char(2),char(128),char(255),char(215),char(2),char(204), +char(2),char(129),char(255),char(236),char(2),char(204),char(2),char(130),char(255),char(215), +char(2),char(204),char(2),char(131),char(255),char(236),char(2),char(204),char(2),char(139), +char(255),char(236),char(2),char(204),char(2),char(170),char(255),char(195),char(2),char(204), +char(2),char(181),char(255),char(215),char(2),char(204),char(2),char(182),char(255),char(195), +char(2),char(204),char(2),char(183),char(255),char(215),char(2),char(204),char(2),char(184), +char(255),char(236),char(2),char(204),char(2),char(185),char(255),char(215),char(2),char(204), +char(2),char(186),char(255),char(236),char(2),char(204),char(2),char(190),char(255),char(195), +char(2),char(204),char(2),char(191),char(255),char(174),char(2),char(204),char(2),char(192), +char(255),char(215),char(2),char(204),char(2),char(193),char(255),char(174),char(2),char(204), +char(2),char(194),char(255),char(215),char(2),char(204),char(2),char(197),char(255),char(195), +char(2),char(204),char(2),char(198),char(255),char(215),char(2),char(204),char(2),char(199), +char(255),char(195),char(2),char(204),char(2),char(200),char(255),char(215),char(2),char(204), +char(2),char(212),char(255),char(174),char(2),char(204),char(2),char(213),char(255),char(215), +char(2),char(204),char(2),char(253),char(255),char(174),char(2),char(204),char(2),char(254), +char(255),char(215),char(2),char(204),char(3),char(13),char(255),char(215),char(2),char(204), +char(3),char(14),char(255),char(195),char(2),char(204),char(3),char(15),char(255),char(215), +char(2),char(204),char(3),char(16),char(255),char(195),char(2),char(204),char(3),char(24), +char(255),char(195),char(2),char(205),char(1),char(225),char(255),char(215),char(2),char(205), +char(2),char(192),char(255),char(215),char(2),char(205),char(2),char(194),char(255),char(215), +char(2),char(205),char(2),char(213),char(255),char(215),char(2),char(205),char(2),char(254), +char(255),char(215),char(2),char(206),char(1),char(163),char(0),char(225),char(2),char(206), +char(2),char(234),char(0),char(41),char(2),char(206),char(3),char(14),char(255),char(215), +char(2),char(206),char(3),char(16),char(255),char(215),char(2),char(207),char(0),char(5), +char(255),char(236),char(2),char(207),char(0),char(10),char(255),char(236),char(2),char(207), +char(2),char(7),char(255),char(236),char(2),char(207),char(2),char(11),char(255),char(236), +char(2),char(210),char(1),char(163),char(0),char(225),char(2),char(210),char(2),char(234), +char(0),char(41),char(2),char(210),char(3),char(14),char(255),char(215),char(2),char(210), +char(3),char(16),char(255),char(215),char(2),char(211),char(0),char(5),char(255),char(236), +char(2),char(211),char(0),char(10),char(255),char(236),char(2),char(211),char(2),char(7), +char(255),char(236),char(2),char(211),char(2),char(11),char(255),char(236),char(2),char(214), +char(1),char(163),char(0),char(225),char(2),char(214),char(2),char(234),char(0),char(41), +char(2),char(214),char(3),char(14),char(255),char(215),char(2),char(214),char(3),char(16), +char(255),char(215),char(2),char(215),char(0),char(5),char(255),char(236),char(2),char(215), +char(0),char(10),char(255),char(236),char(2),char(215),char(2),char(7),char(255),char(236), +char(2),char(215),char(2),char(11),char(255),char(236),char(2),char(217),char(0),char(5), +char(255),char(113),char(2),char(217),char(0),char(10),char(255),char(113),char(2),char(217), +char(1),char(157),char(255),char(154),char(2),char(217),char(1),char(166),char(255),char(154), +char(2),char(217),char(1),char(188),char(255),char(113),char(2),char(217),char(1),char(190), +char(255),char(215),char(2),char(217),char(1),char(193),char(255),char(154),char(2),char(217), +char(1),char(196),char(255),char(154),char(2),char(217),char(1),char(220),char(255),char(215), +char(2),char(217),char(1),char(225),char(255),char(215),char(2),char(217),char(1),char(228), +char(255),char(215),char(2),char(217),char(2),char(7),char(255),char(113),char(2),char(217), +char(2),char(11),char(255),char(113),char(2),char(217),char(2),char(110),char(255),char(215), +char(2),char(217),char(2),char(124),char(255),char(154),char(2),char(217),char(2),char(128), +char(255),char(174),char(2),char(217),char(2),char(130),char(255),char(174),char(2),char(217), +char(2),char(151),char(255),char(215),char(2),char(217),char(2),char(155),char(255),char(215), +char(2),char(217),char(2),char(167),char(255),char(215),char(2),char(217),char(2),char(169), +char(255),char(154),char(2),char(217),char(2),char(170),char(255),char(215),char(2),char(217), +char(2),char(181),char(255),char(113),char(2),char(217),char(2),char(182),char(255),char(215), +char(2),char(217),char(2),char(183),char(255),char(133),char(2),char(217),char(2),char(185), +char(255),char(133),char(2),char(217),char(2),char(189),char(255),char(154),char(2),char(217), +char(2),char(190),char(255),char(215),char(2),char(217),char(2),char(191),char(255),char(154), +char(2),char(217),char(2),char(192),char(255),char(215),char(2),char(217),char(2),char(193), +char(255),char(154),char(2),char(217),char(2),char(194),char(255),char(215),char(2),char(217), +char(2),char(197),char(255),char(154),char(2),char(217),char(2),char(199),char(255),char(154), +char(2),char(217),char(2),char(212),char(255),char(154),char(2),char(217),char(2),char(213), +char(255),char(215),char(2),char(217),char(2),char(225),char(255),char(215),char(2),char(217), +char(2),char(227),char(255),char(215),char(2),char(217),char(2),char(253),char(255),char(154), +char(2),char(217),char(2),char(254),char(255),char(215),char(2),char(217),char(3),char(3), +char(255),char(215),char(2),char(217),char(3),char(13),char(255),char(113),char(2),char(217), +char(3),char(14),char(255),char(215),char(2),char(217),char(3),char(15),char(255),char(113), +char(2),char(217),char(3),char(16),char(255),char(215),char(2),char(217),char(3),char(23), +char(255),char(154),char(2),char(217),char(3),char(24),char(255),char(215),char(2),char(218), +char(0),char(5),char(255),char(236),char(2),char(218),char(0),char(10),char(255),char(236), +char(2),char(218),char(2),char(7),char(255),char(236),char(2),char(218),char(2),char(11), +char(255),char(236),char(2),char(219),char(0),char(5),char(255),char(113),char(2),char(219), +char(0),char(10),char(255),char(113),char(2),char(219),char(1),char(157),char(255),char(154), +char(2),char(219),char(1),char(166),char(255),char(154),char(2),char(219),char(1),char(188), +char(255),char(113),char(2),char(219),char(1),char(190),char(255),char(215),char(2),char(219), +char(1),char(193),char(255),char(154),char(2),char(219),char(1),char(196),char(255),char(154), +char(2),char(219),char(1),char(220),char(255),char(215),char(2),char(219),char(1),char(225), +char(255),char(215),char(2),char(219),char(1),char(228),char(255),char(215),char(2),char(219), +char(2),char(7),char(255),char(113),char(2),char(219),char(2),char(11),char(255),char(113), +char(2),char(219),char(2),char(110),char(255),char(215),char(2),char(219),char(2),char(124), +char(255),char(154),char(2),char(219),char(2),char(128),char(255),char(174),char(2),char(219), +char(2),char(130),char(255),char(174),char(2),char(219),char(2),char(151),char(255),char(215), +char(2),char(219),char(2),char(155),char(255),char(215),char(2),char(219),char(2),char(167), +char(255),char(215),char(2),char(219),char(2),char(169),char(255),char(154),char(2),char(219), +char(2),char(170),char(255),char(215),char(2),char(219),char(2),char(181),char(255),char(113), +char(2),char(219),char(2),char(182),char(255),char(215),char(2),char(219),char(2),char(183), +char(255),char(133),char(2),char(219),char(2),char(185),char(255),char(133),char(2),char(219), +char(2),char(189),char(255),char(154),char(2),char(219),char(2),char(190),char(255),char(215), +char(2),char(219),char(2),char(191),char(255),char(154),char(2),char(219),char(2),char(192), +char(255),char(215),char(2),char(219),char(2),char(193),char(255),char(154),char(2),char(219), +char(2),char(194),char(255),char(215),char(2),char(219),char(2),char(197),char(255),char(154), +char(2),char(219),char(2),char(199),char(255),char(154),char(2),char(219),char(2),char(212), +char(255),char(154),char(2),char(219),char(2),char(213),char(255),char(215),char(2),char(219), +char(2),char(225),char(255),char(215),char(2),char(219),char(2),char(227),char(255),char(215), +char(2),char(219),char(2),char(253),char(255),char(154),char(2),char(219),char(2),char(254), +char(255),char(215),char(2),char(219),char(3),char(3),char(255),char(215),char(2),char(219), +char(3),char(13),char(255),char(113),char(2),char(219),char(3),char(14),char(255),char(215), +char(2),char(219),char(3),char(15),char(255),char(113),char(2),char(219),char(3),char(16), +char(255),char(215),char(2),char(219),char(3),char(23),char(255),char(154),char(2),char(219), +char(3),char(24),char(255),char(215),char(2),char(220),char(0),char(5),char(255),char(236), +char(2),char(220),char(0),char(10),char(255),char(236),char(2),char(220),char(2),char(7), +char(255),char(236),char(2),char(220),char(2),char(11),char(255),char(236),char(2),char(222), +char(0),char(5),char(255),char(236),char(2),char(222),char(0),char(10),char(255),char(236), +char(2),char(222),char(2),char(7),char(255),char(236),char(2),char(222),char(2),char(11), +char(255),char(236),char(2),char(224),char(0),char(5),char(255),char(236),char(2),char(224), +char(0),char(10),char(255),char(236),char(2),char(224),char(2),char(7),char(255),char(236), +char(2),char(224),char(2),char(11),char(255),char(236),char(2),char(225),char(0),char(15), +char(255),char(174),char(2),char(225),char(0),char(17),char(255),char(174),char(2),char(225), +char(1),char(157),char(255),char(236),char(2),char(225),char(1),char(164),char(255),char(215), +char(2),char(225),char(1),char(166),char(255),char(236),char(2),char(225),char(1),char(168), +char(255),char(215),char(2),char(225),char(1),char(170),char(255),char(215),char(2),char(225), +char(1),char(174),char(255),char(215),char(2),char(225),char(1),char(176),char(255),char(215), +char(2),char(225),char(1),char(177),char(255),char(236),char(2),char(225),char(1),char(181), +char(255),char(215),char(2),char(225),char(1),char(188),char(255),char(195),char(2),char(225), +char(1),char(189),char(255),char(215),char(2),char(225),char(1),char(191),char(255),char(215), +char(2),char(225),char(1),char(193),char(255),char(215),char(2),char(225),char(1),char(196), +char(255),char(236),char(2),char(225),char(1),char(199),char(255),char(236),char(2),char(225), +char(1),char(206),char(255),char(236),char(2),char(225),char(1),char(213),char(255),char(236), +char(2),char(225),char(1),char(242),char(255),char(236),char(2),char(225),char(2),char(8), +char(255),char(174),char(2),char(225),char(2),char(12),char(255),char(174),char(2),char(225), +char(2),char(114),char(255),char(215),char(2),char(225),char(2),char(115),char(255),char(236), +char(2),char(225),char(2),char(122),char(255),char(236),char(2),char(225),char(2),char(124), +char(255),char(215),char(2),char(225),char(2),char(128),char(255),char(236),char(2),char(225), +char(2),char(130),char(255),char(236),char(2),char(225),char(2),char(159),char(255),char(215), +char(2),char(225),char(2),char(161),char(255),char(236),char(2),char(225),char(2),char(169), +char(255),char(236),char(2),char(225),char(2),char(181),char(255),char(195),char(2),char(225), +char(2),char(183),char(255),char(236),char(2),char(225),char(2),char(185),char(255),char(236), +char(2),char(225),char(2),char(187),char(255),char(215),char(2),char(225),char(2),char(189), +char(255),char(236),char(2),char(225),char(2),char(191),char(255),char(215),char(2),char(225), +char(2),char(193),char(255),char(215),char(2),char(225),char(2),char(202),char(255),char(215), +char(2),char(225),char(2),char(206),char(255),char(215),char(2),char(225),char(2),char(207), +char(255),char(236),char(2),char(225),char(2),char(212),char(255),char(215),char(2),char(225), +char(2),char(217),char(255),char(215),char(2),char(225),char(2),char(219),char(255),char(215), +char(2),char(225),char(2),char(221),char(255),char(215),char(2),char(225),char(2),char(229), +char(255),char(215),char(2),char(225),char(2),char(231),char(255),char(236),char(2),char(225), +char(2),char(245),char(255),char(236),char(2),char(225),char(2),char(247),char(255),char(215), +char(2),char(225),char(2),char(249),char(255),char(215),char(2),char(225),char(2),char(251), +char(255),char(215),char(2),char(225),char(2),char(253),char(255),char(215),char(2),char(225), +char(3),char(5),char(255),char(215),char(2),char(225),char(3),char(7),char(255),char(215), +char(2),char(225),char(3),char(13),char(255),char(215),char(2),char(225),char(3),char(15), +char(255),char(215),char(2),char(225),char(3),char(17),char(255),char(215),char(2),char(225), +char(3),char(18),char(255),char(236),char(2),char(225),char(3),char(23),char(255),char(236), +char(2),char(225),char(3),char(27),char(255),char(215),char(2),char(225),char(3),char(28), +char(255),char(236),char(2),char(226),char(0),char(5),char(255),char(236),char(2),char(226), +char(0),char(10),char(255),char(236),char(2),char(226),char(1),char(208),char(255),char(215), +char(2),char(226),char(1),char(220),char(255),char(236),char(2),char(226),char(1),char(221), +char(255),char(236),char(2),char(226),char(1),char(223),char(255),char(215),char(2),char(226), +char(1),char(225),char(255),char(236),char(2),char(226),char(1),char(228),char(255),char(236), +char(2),char(226),char(1),char(246),char(255),char(236),char(2),char(226),char(2),char(7), +char(255),char(236),char(2),char(226),char(2),char(11),char(255),char(236),char(2),char(226), +char(2),char(160),char(255),char(215),char(2),char(226),char(2),char(170),char(255),char(236), +char(2),char(226),char(2),char(182),char(255),char(236),char(2),char(226),char(2),char(188), +char(255),char(215),char(2),char(226),char(2),char(190),char(255),char(236),char(2),char(226), +char(2),char(192),char(255),char(236),char(2),char(226),char(2),char(194),char(255),char(236), +char(2),char(226),char(2),char(203),char(255),char(215),char(2),char(226),char(2),char(213), +char(255),char(236),char(2),char(226),char(2),char(230),char(255),char(215),char(2),char(226), +char(2),char(248),char(255),char(236),char(2),char(226),char(2),char(250),char(255),char(236), +char(2),char(226),char(2),char(252),char(255),char(236),char(2),char(226),char(2),char(254), +char(255),char(236),char(2),char(226),char(3),char(6),char(255),char(215),char(2),char(226), +char(3),char(8),char(255),char(215),char(2),char(226),char(3),char(14),char(255),char(236), +char(2),char(226),char(3),char(16),char(255),char(236),char(2),char(226),char(3),char(24), +char(255),char(236),char(2),char(227),char(0),char(15),char(255),char(174),char(2),char(227), +char(0),char(17),char(255),char(174),char(2),char(227),char(1),char(157),char(255),char(236), +char(2),char(227),char(1),char(164),char(255),char(215),char(2),char(227),char(1),char(166), +char(255),char(236),char(2),char(227),char(1),char(168),char(255),char(215),char(2),char(227), +char(1),char(170),char(255),char(215),char(2),char(227),char(1),char(174),char(255),char(215), +char(2),char(227),char(1),char(176),char(255),char(215),char(2),char(227),char(1),char(177), +char(255),char(236),char(2),char(227),char(1),char(181),char(255),char(215),char(2),char(227), +char(1),char(188),char(255),char(195),char(2),char(227),char(1),char(189),char(255),char(215), +char(2),char(227),char(1),char(191),char(255),char(215),char(2),char(227),char(1),char(193), +char(255),char(215),char(2),char(227),char(1),char(196),char(255),char(236),char(2),char(227), +char(1),char(199),char(255),char(236),char(2),char(227),char(1),char(206),char(255),char(236), +char(2),char(227),char(1),char(213),char(255),char(236),char(2),char(227),char(1),char(242), +char(255),char(236),char(2),char(227),char(2),char(8),char(255),char(174),char(2),char(227), +char(2),char(12),char(255),char(174),char(2),char(227),char(2),char(114),char(255),char(215), +char(2),char(227),char(2),char(115),char(255),char(236),char(2),char(227),char(2),char(122), +char(255),char(236),char(2),char(227),char(2),char(124),char(255),char(215),char(2),char(227), +char(2),char(128),char(255),char(236),char(2),char(227),char(2),char(130),char(255),char(236), +char(2),char(227),char(2),char(159),char(255),char(215),char(2),char(227),char(2),char(161), +char(255),char(236),char(2),char(227),char(2),char(169),char(255),char(236),char(2),char(227), +char(2),char(181),char(255),char(195),char(2),char(227),char(2),char(183),char(255),char(236), +char(2),char(227),char(2),char(185),char(255),char(236),char(2),char(227),char(2),char(187), +char(255),char(215),char(2),char(227),char(2),char(189),char(255),char(236),char(2),char(227), +char(2),char(191),char(255),char(215),char(2),char(227),char(2),char(193),char(255),char(215), +char(2),char(227),char(2),char(202),char(255),char(215),char(2),char(227),char(2),char(206), +char(255),char(215),char(2),char(227),char(2),char(207),char(255),char(236),char(2),char(227), +char(2),char(212),char(255),char(215),char(2),char(227),char(2),char(217),char(255),char(215), +char(2),char(227),char(2),char(219),char(255),char(215),char(2),char(227),char(2),char(221), +char(255),char(215),char(2),char(227),char(2),char(229),char(255),char(215),char(2),char(227), +char(2),char(231),char(255),char(236),char(2),char(227),char(2),char(245),char(255),char(236), +char(2),char(227),char(2),char(247),char(255),char(215),char(2),char(227),char(2),char(249), +char(255),char(215),char(2),char(227),char(2),char(251),char(255),char(215),char(2),char(227), +char(2),char(253),char(255),char(215),char(2),char(227),char(3),char(5),char(255),char(215), +char(2),char(227),char(3),char(7),char(255),char(215),char(2),char(227),char(3),char(13), +char(255),char(215),char(2),char(227),char(3),char(15),char(255),char(215),char(2),char(227), +char(3),char(17),char(255),char(215),char(2),char(227),char(3),char(18),char(255),char(236), +char(2),char(227),char(3),char(23),char(255),char(236),char(2),char(227),char(3),char(27), +char(255),char(215),char(2),char(227),char(3),char(28),char(255),char(236),char(2),char(228), +char(0),char(5),char(255),char(236),char(2),char(228),char(0),char(10),char(255),char(236), +char(2),char(228),char(1),char(208),char(255),char(215),char(2),char(228),char(1),char(220), +char(255),char(236),char(2),char(228),char(1),char(221),char(255),char(236),char(2),char(228), +char(1),char(223),char(255),char(215),char(2),char(228),char(1),char(225),char(255),char(236), +char(2),char(228),char(1),char(228),char(255),char(236),char(2),char(228),char(1),char(246), +char(255),char(236),char(2),char(228),char(2),char(7),char(255),char(236),char(2),char(228), +char(2),char(11),char(255),char(236),char(2),char(228),char(2),char(160),char(255),char(215), +char(2),char(228),char(2),char(170),char(255),char(236),char(2),char(228),char(2),char(182), +char(255),char(236),char(2),char(228),char(2),char(188),char(255),char(215),char(2),char(228), +char(2),char(190),char(255),char(236),char(2),char(228),char(2),char(192),char(255),char(236), +char(2),char(228),char(2),char(194),char(255),char(236),char(2),char(228),char(2),char(203), +char(255),char(215),char(2),char(228),char(2),char(213),char(255),char(236),char(2),char(228), +char(2),char(230),char(255),char(215),char(2),char(228),char(2),char(248),char(255),char(236), +char(2),char(228),char(2),char(250),char(255),char(236),char(2),char(228),char(2),char(252), +char(255),char(236),char(2),char(228),char(2),char(254),char(255),char(236),char(2),char(228), +char(3),char(6),char(255),char(215),char(2),char(228),char(3),char(8),char(255),char(215), +char(2),char(228),char(3),char(14),char(255),char(236),char(2),char(228),char(3),char(16), +char(255),char(236),char(2),char(228),char(3),char(24),char(255),char(236),char(2),char(229), +char(1),char(159),char(255),char(215),char(2),char(229),char(1),char(184),char(255),char(215), +char(2),char(229),char(1),char(187),char(255),char(215),char(2),char(229),char(1),char(190), +char(255),char(215),char(2),char(229),char(1),char(193),char(255),char(215),char(2),char(229), +char(1),char(225),char(255),char(215),char(2),char(229),char(2),char(108),char(255),char(215), +char(2),char(229),char(2),char(124),char(255),char(215),char(2),char(229),char(2),char(126), +char(255),char(215),char(2),char(229),char(2),char(132),char(255),char(215),char(2),char(229), +char(2),char(134),char(255),char(215),char(2),char(229),char(2),char(136),char(255),char(215), +char(2),char(229),char(2),char(138),char(255),char(215),char(2),char(229),char(2),char(140), +char(255),char(215),char(2),char(229),char(2),char(177),char(255),char(215),char(2),char(229), +char(2),char(179),char(255),char(215),char(2),char(229),char(2),char(191),char(255),char(215), +char(2),char(229),char(2),char(192),char(255),char(215),char(2),char(229),char(2),char(193), +char(255),char(215),char(2),char(229),char(2),char(194),char(255),char(215),char(2),char(229), +char(2),char(197),char(255),char(154),char(2),char(229),char(2),char(199),char(255),char(154), +char(2),char(229),char(2),char(212),char(255),char(215),char(2),char(229),char(2),char(213), +char(255),char(215),char(2),char(229),char(2),char(239),char(255),char(215),char(2),char(229), +char(2),char(241),char(255),char(215),char(2),char(229),char(2),char(243),char(255),char(215), +char(2),char(229),char(2),char(253),char(255),char(215),char(2),char(229),char(2),char(254), +char(255),char(215),char(2),char(229),char(3),char(9),char(255),char(215),char(2),char(229), +char(3),char(11),char(255),char(215),char(2),char(229),char(3),char(14),char(255),char(215), +char(2),char(229),char(3),char(16),char(255),char(215),char(2),char(229),char(3),char(21), +char(255),char(215),char(2),char(229),char(3),char(25),char(255),char(236),char(2),char(230), +char(1),char(207),char(255),char(215),char(2),char(230),char(1),char(216),char(255),char(215), +char(2),char(230),char(1),char(219),char(255),char(215),char(2),char(230),char(1),char(222), +char(255),char(215),char(2),char(230),char(1),char(225),char(255),char(215),char(2),char(230), +char(1),char(234),char(255),char(215),char(2),char(230),char(1),char(237),char(255),char(215), +char(2),char(230),char(2),char(106),char(255),char(215),char(2),char(230),char(2),char(127), +char(255),char(215),char(2),char(230),char(2),char(133),char(255),char(215),char(2),char(230), +char(2),char(135),char(255),char(215),char(2),char(230),char(2),char(137),char(255),char(215), +char(2),char(230),char(2),char(141),char(255),char(215),char(2),char(230),char(2),char(178), +char(255),char(215),char(2),char(230),char(2),char(180),char(255),char(215),char(2),char(230), +char(2),char(192),char(255),char(215),char(2),char(230),char(2),char(194),char(255),char(215), +char(2),char(230),char(2),char(198),char(255),char(215),char(2),char(230),char(2),char(200), +char(255),char(215),char(2),char(230),char(2),char(213),char(255),char(215),char(2),char(230), +char(2),char(224),char(255),char(215),char(2),char(230),char(2),char(240),char(255),char(215), +char(2),char(230),char(2),char(242),char(255),char(215),char(2),char(230),char(2),char(244), +char(255),char(215),char(2),char(230),char(2),char(254),char(255),char(215),char(2),char(230), +char(3),char(10),char(255),char(215),char(2),char(230),char(3),char(12),char(255),char(215), +char(2),char(230),char(3),char(22),char(255),char(215),char(2),char(230),char(3),char(26), +char(255),char(215),char(2),char(231),char(0),char(15),char(255),char(174),char(2),char(231), +char(0),char(17),char(255),char(174),char(2),char(231),char(2),char(8),char(255),char(174), +char(2),char(231),char(2),char(12),char(255),char(174),char(2),char(231),char(2),char(128), +char(255),char(236),char(2),char(231),char(2),char(130),char(255),char(236),char(2),char(231), +char(2),char(183),char(255),char(236),char(2),char(231),char(2),char(185),char(255),char(236), +char(2),char(231),char(3),char(13),char(255),char(215),char(2),char(231),char(3),char(15), +char(255),char(215),char(2),char(232),char(1),char(233),char(0),char(41),char(2),char(233), +char(0),char(5),char(255),char(236),char(2),char(233),char(0),char(10),char(255),char(236), +char(2),char(233),char(2),char(7),char(255),char(236),char(2),char(233),char(2),char(11), +char(255),char(236),char(2),char(233),char(3),char(14),char(255),char(215),char(2),char(233), +char(3),char(16),char(255),char(215),char(2),char(239),char(0),char(15),char(255),char(174), +char(2),char(239),char(0),char(17),char(255),char(174),char(2),char(239),char(1),char(157), +char(255),char(236),char(2),char(239),char(1),char(164),char(255),char(215),char(2),char(239), +char(1),char(166),char(255),char(236),char(2),char(239),char(1),char(168),char(255),char(215), +char(2),char(239),char(1),char(170),char(255),char(215),char(2),char(239),char(1),char(174), +char(255),char(215),char(2),char(239),char(1),char(176),char(255),char(215),char(2),char(239), +char(1),char(177),char(255),char(236),char(2),char(239),char(1),char(181),char(255),char(215), +char(2),char(239),char(1),char(188),char(255),char(195),char(2),char(239),char(1),char(189), +char(255),char(215),char(2),char(239),char(1),char(191),char(255),char(215),char(2),char(239), +char(1),char(193),char(255),char(215),char(2),char(239),char(1),char(196),char(255),char(236), +char(2),char(239),char(1),char(199),char(255),char(236),char(2),char(239),char(1),char(206), +char(255),char(236),char(2),char(239),char(1),char(213),char(255),char(236),char(2),char(239), +char(1),char(242),char(255),char(236),char(2),char(239),char(2),char(8),char(255),char(174), +char(2),char(239),char(2),char(12),char(255),char(174),char(2),char(239),char(2),char(114), +char(255),char(215),char(2),char(239),char(2),char(115),char(255),char(236),char(2),char(239), +char(2),char(122),char(255),char(236),char(2),char(239),char(2),char(124),char(255),char(215), +char(2),char(239),char(2),char(128),char(255),char(236),char(2),char(239),char(2),char(130), +char(255),char(236),char(2),char(239),char(2),char(159),char(255),char(215),char(2),char(239), +char(2),char(161),char(255),char(236),char(2),char(239),char(2),char(169),char(255),char(236), +char(2),char(239),char(2),char(181),char(255),char(195),char(2),char(239),char(2),char(183), +char(255),char(236),char(2),char(239),char(2),char(185),char(255),char(236),char(2),char(239), +char(2),char(187),char(255),char(215),char(2),char(239),char(2),char(189),char(255),char(236), +char(2),char(239),char(2),char(191),char(255),char(215),char(2),char(239),char(2),char(193), +char(255),char(215),char(2),char(239),char(2),char(202),char(255),char(215),char(2),char(239), +char(2),char(206),char(255),char(215),char(2),char(239),char(2),char(207),char(255),char(236), +char(2),char(239),char(2),char(212),char(255),char(215),char(2),char(239),char(2),char(217), +char(255),char(215),char(2),char(239),char(2),char(219),char(255),char(215),char(2),char(239), +char(2),char(221),char(255),char(215),char(2),char(239),char(2),char(229),char(255),char(215), +char(2),char(239),char(2),char(231),char(255),char(236),char(2),char(239),char(2),char(245), +char(255),char(236),char(2),char(239),char(2),char(247),char(255),char(215),char(2),char(239), +char(2),char(249),char(255),char(215),char(2),char(239),char(2),char(251),char(255),char(215), +char(2),char(239),char(2),char(253),char(255),char(215),char(2),char(239),char(3),char(5), +char(255),char(215),char(2),char(239),char(3),char(7),char(255),char(215),char(2),char(239), +char(3),char(13),char(255),char(215),char(2),char(239),char(3),char(15),char(255),char(215), +char(2),char(239),char(3),char(17),char(255),char(215),char(2),char(239),char(3),char(18), +char(255),char(236),char(2),char(239),char(3),char(23),char(255),char(236),char(2),char(239), +char(3),char(27),char(255),char(215),char(2),char(239),char(3),char(28),char(255),char(236), +char(2),char(240),char(0),char(5),char(255),char(236),char(2),char(240),char(0),char(10), +char(255),char(236),char(2),char(240),char(1),char(208),char(255),char(215),char(2),char(240), +char(1),char(220),char(255),char(236),char(2),char(240),char(1),char(221),char(255),char(236), +char(2),char(240),char(1),char(223),char(255),char(215),char(2),char(240),char(1),char(225), +char(255),char(236),char(2),char(240),char(1),char(228),char(255),char(236),char(2),char(240), +char(1),char(246),char(255),char(236),char(2),char(240),char(2),char(7),char(255),char(236), +char(2),char(240),char(2),char(11),char(255),char(236),char(2),char(240),char(2),char(160), +char(255),char(215),char(2),char(240),char(2),char(170),char(255),char(236),char(2),char(240), +char(2),char(182),char(255),char(236),char(2),char(240),char(2),char(188),char(255),char(215), +char(2),char(240),char(2),char(190),char(255),char(236),char(2),char(240),char(2),char(192), +char(255),char(236),char(2),char(240),char(2),char(194),char(255),char(236),char(2),char(240), +char(2),char(203),char(255),char(215),char(2),char(240),char(2),char(213),char(255),char(236), +char(2),char(240),char(2),char(230),char(255),char(215),char(2),char(240),char(2),char(248), +char(255),char(236),char(2),char(240),char(2),char(250),char(255),char(236),char(2),char(240), +char(2),char(252),char(255),char(236),char(2),char(240),char(2),char(254),char(255),char(236), +char(2),char(240),char(3),char(6),char(255),char(215),char(2),char(240),char(3),char(8), +char(255),char(215),char(2),char(240),char(3),char(14),char(255),char(236),char(2),char(240), +char(3),char(16),char(255),char(236),char(2),char(240),char(3),char(24),char(255),char(236), +char(2),char(241),char(0),char(15),char(255),char(174),char(2),char(241),char(0),char(17), +char(255),char(174),char(2),char(241),char(1),char(157),char(255),char(236),char(2),char(241), +char(1),char(164),char(255),char(215),char(2),char(241),char(1),char(166),char(255),char(236), +char(2),char(241),char(1),char(168),char(255),char(215),char(2),char(241),char(1),char(170), +char(255),char(215),char(2),char(241),char(1),char(174),char(255),char(215),char(2),char(241), +char(1),char(176),char(255),char(215),char(2),char(241),char(1),char(177),char(255),char(236), +char(2),char(241),char(1),char(181),char(255),char(215),char(2),char(241),char(1),char(188), +char(255),char(195),char(2),char(241),char(1),char(189),char(255),char(215),char(2),char(241), +char(1),char(191),char(255),char(215),char(2),char(241),char(1),char(193),char(255),char(215), +char(2),char(241),char(1),char(196),char(255),char(236),char(2),char(241),char(1),char(199), +char(255),char(236),char(2),char(241),char(1),char(206),char(255),char(236),char(2),char(241), +char(1),char(213),char(255),char(236),char(2),char(241),char(1),char(242),char(255),char(236), +char(2),char(241),char(2),char(8),char(255),char(174),char(2),char(241),char(2),char(12), +char(255),char(174),char(2),char(241),char(2),char(114),char(255),char(215),char(2),char(241), +char(2),char(115),char(255),char(236),char(2),char(241),char(2),char(122),char(255),char(236), +char(2),char(241),char(2),char(124),char(255),char(215),char(2),char(241),char(2),char(128), +char(255),char(236),char(2),char(241),char(2),char(130),char(255),char(236),char(2),char(241), +char(2),char(159),char(255),char(215),char(2),char(241),char(2),char(161),char(255),char(236), +char(2),char(241),char(2),char(169),char(255),char(236),char(2),char(241),char(2),char(181), +char(255),char(195),char(2),char(241),char(2),char(183),char(255),char(236),char(2),char(241), +char(2),char(185),char(255),char(236),char(2),char(241),char(2),char(187),char(255),char(215), +char(2),char(241),char(2),char(189),char(255),char(236),char(2),char(241),char(2),char(191), +char(255),char(215),char(2),char(241),char(2),char(193),char(255),char(215),char(2),char(241), +char(2),char(202),char(255),char(215),char(2),char(241),char(2),char(206),char(255),char(215), +char(2),char(241),char(2),char(207),char(255),char(236),char(2),char(241),char(2),char(212), +char(255),char(215),char(2),char(241),char(2),char(217),char(255),char(215),char(2),char(241), +char(2),char(219),char(255),char(215),char(2),char(241),char(2),char(221),char(255),char(215), +char(2),char(241),char(2),char(229),char(255),char(215),char(2),char(241),char(2),char(231), +char(255),char(236),char(2),char(241),char(2),char(245),char(255),char(236),char(2),char(241), +char(2),char(247),char(255),char(215),char(2),char(241),char(2),char(249),char(255),char(215), +char(2),char(241),char(2),char(251),char(255),char(215),char(2),char(241),char(2),char(253), +char(255),char(215),char(2),char(241),char(3),char(5),char(255),char(215),char(2),char(241), +char(3),char(7),char(255),char(215),char(2),char(241),char(3),char(13),char(255),char(215), +char(2),char(241),char(3),char(15),char(255),char(215),char(2),char(241),char(3),char(17), +char(255),char(215),char(2),char(241),char(3),char(18),char(255),char(236),char(2),char(241), +char(3),char(23),char(255),char(236),char(2),char(241),char(3),char(27),char(255),char(215), +char(2),char(241),char(3),char(28),char(255),char(236),char(2),char(242),char(0),char(5), +char(255),char(236),char(2),char(242),char(0),char(10),char(255),char(236),char(2),char(242), +char(1),char(208),char(255),char(215),char(2),char(242),char(1),char(220),char(255),char(236), +char(2),char(242),char(1),char(221),char(255),char(236),char(2),char(242),char(1),char(223), +char(255),char(215),char(2),char(242),char(1),char(225),char(255),char(236),char(2),char(242), +char(1),char(228),char(255),char(236),char(2),char(242),char(1),char(246),char(255),char(236), +char(2),char(242),char(2),char(7),char(255),char(236),char(2),char(242),char(2),char(11), +char(255),char(236),char(2),char(242),char(2),char(160),char(255),char(215),char(2),char(242), +char(2),char(170),char(255),char(236),char(2),char(242),char(2),char(182),char(255),char(236), +char(2),char(242),char(2),char(188),char(255),char(215),char(2),char(242),char(2),char(190), +char(255),char(236),char(2),char(242),char(2),char(192),char(255),char(236),char(2),char(242), +char(2),char(194),char(255),char(236),char(2),char(242),char(2),char(203),char(255),char(215), +char(2),char(242),char(2),char(213),char(255),char(236),char(2),char(242),char(2),char(230), +char(255),char(215),char(2),char(242),char(2),char(248),char(255),char(236),char(2),char(242), +char(2),char(250),char(255),char(236),char(2),char(242),char(2),char(252),char(255),char(236), +char(2),char(242),char(2),char(254),char(255),char(236),char(2),char(242),char(3),char(6), +char(255),char(215),char(2),char(242),char(3),char(8),char(255),char(215),char(2),char(242), +char(3),char(14),char(255),char(236),char(2),char(242),char(3),char(16),char(255),char(236), +char(2),char(242),char(3),char(24),char(255),char(236),char(2),char(243),char(0),char(15), +char(255),char(174),char(2),char(243),char(0),char(17),char(255),char(174),char(2),char(243), +char(1),char(157),char(255),char(236),char(2),char(243),char(1),char(164),char(255),char(215), +char(2),char(243),char(1),char(166),char(255),char(236),char(2),char(243),char(1),char(168), +char(255),char(215),char(2),char(243),char(1),char(170),char(255),char(215),char(2),char(243), +char(1),char(174),char(255),char(215),char(2),char(243),char(1),char(176),char(255),char(215), +char(2),char(243),char(1),char(177),char(255),char(236),char(2),char(243),char(1),char(181), +char(255),char(215),char(2),char(243),char(1),char(188),char(255),char(195),char(2),char(243), +char(1),char(189),char(255),char(215),char(2),char(243),char(1),char(191),char(255),char(215), +char(2),char(243),char(1),char(193),char(255),char(215),char(2),char(243),char(1),char(196), +char(255),char(236),char(2),char(243),char(1),char(199),char(255),char(236),char(2),char(243), +char(1),char(206),char(255),char(236),char(2),char(243),char(1),char(213),char(255),char(236), +char(2),char(243),char(1),char(242),char(255),char(236),char(2),char(243),char(2),char(8), +char(255),char(174),char(2),char(243),char(2),char(12),char(255),char(174),char(2),char(243), +char(2),char(114),char(255),char(215),char(2),char(243),char(2),char(115),char(255),char(236), +char(2),char(243),char(2),char(122),char(255),char(236),char(2),char(243),char(2),char(124), +char(255),char(215),char(2),char(243),char(2),char(128),char(255),char(236),char(2),char(243), +char(2),char(130),char(255),char(236),char(2),char(243),char(2),char(159),char(255),char(215), +char(2),char(243),char(2),char(161),char(255),char(236),char(2),char(243),char(2),char(169), +char(255),char(236),char(2),char(243),char(2),char(181),char(255),char(195),char(2),char(243), +char(2),char(183),char(255),char(236),char(2),char(243),char(2),char(185),char(255),char(236), +char(2),char(243),char(2),char(187),char(255),char(215),char(2),char(243),char(2),char(189), +char(255),char(236),char(2),char(243),char(2),char(191),char(255),char(215),char(2),char(243), +char(2),char(193),char(255),char(215),char(2),char(243),char(2),char(202),char(255),char(215), +char(2),char(243),char(2),char(206),char(255),char(215),char(2),char(243),char(2),char(207), +char(255),char(236),char(2),char(243),char(2),char(212),char(255),char(215),char(2),char(243), +char(2),char(217),char(255),char(215),char(2),char(243),char(2),char(219),char(255),char(215), +char(2),char(243),char(2),char(221),char(255),char(215),char(2),char(243),char(2),char(229), +char(255),char(215),char(2),char(243),char(2),char(231),char(255),char(236),char(2),char(243), +char(2),char(245),char(255),char(236),char(2),char(243),char(2),char(247),char(255),char(215), +char(2),char(243),char(2),char(249),char(255),char(215),char(2),char(243),char(2),char(251), +char(255),char(215),char(2),char(243),char(2),char(253),char(255),char(215),char(2),char(243), +char(3),char(5),char(255),char(215),char(2),char(243),char(3),char(7),char(255),char(215), +char(2),char(243),char(3),char(13),char(255),char(215),char(2),char(243),char(3),char(15), +char(255),char(215),char(2),char(243),char(3),char(17),char(255),char(215),char(2),char(243), +char(3),char(18),char(255),char(236),char(2),char(243),char(3),char(23),char(255),char(236), +char(2),char(243),char(3),char(27),char(255),char(215),char(2),char(243),char(3),char(28), +char(255),char(236),char(2),char(244),char(0),char(5),char(255),char(236),char(2),char(244), +char(0),char(10),char(255),char(236),char(2),char(244),char(1),char(208),char(255),char(215), +char(2),char(244),char(1),char(220),char(255),char(236),char(2),char(244),char(1),char(221), +char(255),char(236),char(2),char(244),char(1),char(223),char(255),char(215),char(2),char(244), +char(1),char(225),char(255),char(236),char(2),char(244),char(1),char(228),char(255),char(236), +char(2),char(244),char(1),char(246),char(255),char(236),char(2),char(244),char(2),char(7), +char(255),char(236),char(2),char(244),char(2),char(11),char(255),char(236),char(2),char(244), +char(2),char(160),char(255),char(215),char(2),char(244),char(2),char(170),char(255),char(236), +char(2),char(244),char(2),char(182),char(255),char(236),char(2),char(244),char(2),char(188), +char(255),char(215),char(2),char(244),char(2),char(190),char(255),char(236),char(2),char(244), +char(2),char(192),char(255),char(236),char(2),char(244),char(2),char(194),char(255),char(236), +char(2),char(244),char(2),char(203),char(255),char(215),char(2),char(244),char(2),char(213), +char(255),char(236),char(2),char(244),char(2),char(230),char(255),char(215),char(2),char(244), +char(2),char(248),char(255),char(236),char(2),char(244),char(2),char(250),char(255),char(236), +char(2),char(244),char(2),char(252),char(255),char(236),char(2),char(244),char(2),char(254), +char(255),char(236),char(2),char(244),char(3),char(6),char(255),char(215),char(2),char(244), +char(3),char(8),char(255),char(215),char(2),char(244),char(3),char(14),char(255),char(236), +char(2),char(244),char(3),char(16),char(255),char(236),char(2),char(244),char(3),char(24), +char(255),char(236),char(2),char(245),char(0),char(15),char(255),char(174),char(2),char(245), +char(0),char(17),char(255),char(174),char(2),char(245),char(1),char(157),char(255),char(236), +char(2),char(245),char(1),char(164),char(255),char(215),char(2),char(245),char(1),char(166), +char(255),char(236),char(2),char(245),char(1),char(168),char(255),char(215),char(2),char(245), +char(1),char(170),char(255),char(215),char(2),char(245),char(1),char(174),char(255),char(215), +char(2),char(245),char(1),char(176),char(255),char(215),char(2),char(245),char(1),char(177), +char(255),char(236),char(2),char(245),char(1),char(181),char(255),char(215),char(2),char(245), +char(1),char(188),char(255),char(195),char(2),char(245),char(1),char(189),char(255),char(215), +char(2),char(245),char(1),char(191),char(255),char(215),char(2),char(245),char(1),char(193), +char(255),char(215),char(2),char(245),char(1),char(196),char(255),char(236),char(2),char(245), +char(1),char(199),char(255),char(236),char(2),char(245),char(1),char(206),char(255),char(236), +char(2),char(245),char(1),char(213),char(255),char(236),char(2),char(245),char(1),char(242), +char(255),char(236),char(2),char(245),char(2),char(8),char(255),char(174),char(2),char(245), +char(2),char(12),char(255),char(174),char(2),char(245),char(2),char(114),char(255),char(215), +char(2),char(245),char(2),char(115),char(255),char(236),char(2),char(245),char(2),char(122), +char(255),char(236),char(2),char(245),char(2),char(124),char(255),char(215),char(2),char(245), +char(2),char(128),char(255),char(236),char(2),char(245),char(2),char(130),char(255),char(236), +char(2),char(245),char(2),char(159),char(255),char(215),char(2),char(245),char(2),char(161), +char(255),char(236),char(2),char(245),char(2),char(169),char(255),char(236),char(2),char(245), +char(2),char(181),char(255),char(195),char(2),char(245),char(2),char(183),char(255),char(236), +char(2),char(245),char(2),char(185),char(255),char(236),char(2),char(245),char(2),char(187), +char(255),char(215),char(2),char(245),char(2),char(189),char(255),char(236),char(2),char(245), +char(2),char(191),char(255),char(215),char(2),char(245),char(2),char(193),char(255),char(215), +char(2),char(245),char(2),char(202),char(255),char(215),char(2),char(245),char(2),char(206), +char(255),char(215),char(2),char(245),char(2),char(207),char(255),char(236),char(2),char(245), +char(2),char(212),char(255),char(215),char(2),char(245),char(2),char(217),char(255),char(215), +char(2),char(245),char(2),char(219),char(255),char(215),char(2),char(245),char(2),char(221), +char(255),char(215),char(2),char(245),char(2),char(229),char(255),char(215),char(2),char(245), +char(2),char(231),char(255),char(236),char(2),char(245),char(2),char(245),char(255),char(236), +char(2),char(245),char(2),char(247),char(255),char(215),char(2),char(245),char(2),char(249), +char(255),char(215),char(2),char(245),char(2),char(251),char(255),char(215),char(2),char(245), +char(2),char(253),char(255),char(215),char(2),char(245),char(3),char(5),char(255),char(215), +char(2),char(245),char(3),char(7),char(255),char(215),char(2),char(245),char(3),char(13), +char(255),char(215),char(2),char(245),char(3),char(15),char(255),char(215),char(2),char(245), +char(3),char(17),char(255),char(215),char(2),char(245),char(3),char(18),char(255),char(236), +char(2),char(245),char(3),char(23),char(255),char(236),char(2),char(245),char(3),char(27), +char(255),char(215),char(2),char(245),char(3),char(28),char(255),char(236),char(2),char(246), +char(0),char(5),char(255),char(236),char(2),char(246),char(0),char(10),char(255),char(236), +char(2),char(246),char(1),char(208),char(255),char(215),char(2),char(246),char(1),char(220), +char(255),char(236),char(2),char(246),char(1),char(221),char(255),char(236),char(2),char(246), +char(1),char(223),char(255),char(215),char(2),char(246),char(1),char(225),char(255),char(236), +char(2),char(246),char(1),char(228),char(255),char(236),char(2),char(246),char(1),char(246), +char(255),char(236),char(2),char(246),char(2),char(7),char(255),char(236),char(2),char(246), +char(2),char(11),char(255),char(236),char(2),char(246),char(2),char(160),char(255),char(215), +char(2),char(246),char(2),char(170),char(255),char(236),char(2),char(246),char(2),char(182), +char(255),char(236),char(2),char(246),char(2),char(188),char(255),char(215),char(2),char(246), +char(2),char(190),char(255),char(236),char(2),char(246),char(2),char(192),char(255),char(236), +char(2),char(246),char(2),char(194),char(255),char(236),char(2),char(246),char(2),char(203), +char(255),char(215),char(2),char(246),char(2),char(213),char(255),char(236),char(2),char(246), +char(2),char(230),char(255),char(215),char(2),char(246),char(2),char(248),char(255),char(236), +char(2),char(246),char(2),char(250),char(255),char(236),char(2),char(246),char(2),char(252), +char(255),char(236),char(2),char(246),char(2),char(254),char(255),char(236),char(2),char(246), +char(3),char(6),char(255),char(215),char(2),char(246),char(3),char(8),char(255),char(215), +char(2),char(246),char(3),char(14),char(255),char(236),char(2),char(246),char(3),char(16), +char(255),char(236),char(2),char(246),char(3),char(24),char(255),char(236),char(2),char(247), +char(0),char(15),char(255),char(133),char(2),char(247),char(0),char(17),char(255),char(133), +char(2),char(247),char(1),char(159),char(255),char(236),char(2),char(247),char(1),char(164), +char(255),char(154),char(2),char(247),char(1),char(170),char(255),char(113),char(2),char(247), +char(1),char(174),char(255),char(154),char(2),char(247),char(1),char(181),char(255),char(154), +char(2),char(247),char(1),char(184),char(255),char(236),char(2),char(247),char(1),char(187), +char(255),char(236),char(2),char(247),char(1),char(190),char(255),char(195),char(2),char(247), +char(1),char(201),char(255),char(236),char(2),char(247),char(1),char(206),char(255),char(174), +char(2),char(247),char(1),char(207),char(255),char(215),char(2),char(247),char(1),char(213), +char(255),char(174),char(2),char(247),char(1),char(216),char(255),char(215),char(2),char(247), +char(1),char(219),char(255),char(215),char(2),char(247),char(1),char(222),char(255),char(215), +char(2),char(247),char(1),char(225),char(255),char(215),char(2),char(247),char(1),char(234), +char(255),char(215),char(2),char(247),char(1),char(235),char(0),char(102),char(2),char(247), +char(1),char(237),char(255),char(215),char(2),char(247),char(1),char(238),char(255),char(236), +char(2),char(247),char(1),char(242),char(255),char(174),char(2),char(247),char(1),char(244), +char(0),char(102),char(2),char(247),char(2),char(8),char(255),char(133),char(2),char(247), +char(2),char(12),char(255),char(133),char(2),char(247),char(2),char(106),char(255),char(215), +char(2),char(247),char(2),char(108),char(255),char(236),char(2),char(247),char(2),char(114), +char(255),char(113),char(2),char(247),char(2),char(115),char(255),char(174),char(2),char(247), +char(2),char(126),char(255),char(236),char(2),char(247),char(2),char(127),char(255),char(215), +char(2),char(247),char(2),char(132),char(255),char(236),char(2),char(247),char(2),char(133), +char(255),char(215),char(2),char(247),char(2),char(134),char(255),char(236),char(2),char(247), +char(2),char(135),char(255),char(215),char(2),char(247),char(2),char(136),char(255),char(236), +char(2),char(247),char(2),char(137),char(255),char(215),char(2),char(247),char(2),char(138), +char(255),char(236),char(2),char(247),char(2),char(140),char(255),char(236),char(2),char(247), +char(2),char(141),char(255),char(215),char(2),char(247),char(2),char(152),char(0),char(102), +char(2),char(247),char(2),char(168),char(0),char(102),char(2),char(247),char(2),char(177), +char(255),char(236),char(2),char(247),char(2),char(178),char(255),char(215),char(2),char(247), +char(2),char(179),char(255),char(236),char(2),char(247),char(2),char(180),char(255),char(215), +char(2),char(247),char(2),char(192),char(255),char(215),char(2),char(247),char(2),char(194), +char(255),char(215),char(2),char(247),char(2),char(197),char(255),char(215),char(2),char(247), +char(2),char(198),char(255),char(195),char(2),char(247),char(2),char(199),char(255),char(215), +char(2),char(247),char(2),char(200),char(255),char(195),char(2),char(247),char(2),char(206), +char(255),char(154),char(2),char(247),char(2),char(207),char(255),char(174),char(2),char(247), +char(2),char(213),char(255),char(215),char(2),char(247),char(2),char(217),char(255),char(113), +char(2),char(247),char(2),char(219),char(255),char(113),char(2),char(247),char(2),char(221), +char(255),char(113),char(2),char(247),char(2),char(224),char(255),char(215),char(2),char(247), +char(2),char(239),char(255),char(236),char(2),char(247),char(2),char(240),char(255),char(215), +char(2),char(247),char(2),char(241),char(255),char(236),char(2),char(247),char(2),char(242), +char(255),char(215),char(2),char(247),char(2),char(243),char(255),char(236),char(2),char(247), +char(2),char(244),char(255),char(215),char(2),char(247),char(2),char(254),char(255),char(215), +char(2),char(247),char(3),char(9),char(255),char(113),char(2),char(247),char(3),char(10), +char(255),char(215),char(2),char(247),char(3),char(11),char(255),char(113),char(2),char(247), +char(3),char(12),char(255),char(215),char(2),char(247),char(3),char(17),char(255),char(154), +char(2),char(247),char(3),char(18),char(255),char(174),char(2),char(247),char(3),char(21), +char(255),char(236),char(2),char(247),char(3),char(22),char(255),char(215),char(2),char(247), +char(3),char(26),char(255),char(215),char(2),char(247),char(3),char(27),char(255),char(154), +char(2),char(247),char(3),char(28),char(255),char(174),char(2),char(248),char(0),char(15), +char(255),char(174),char(2),char(248),char(0),char(17),char(255),char(174),char(2),char(248), +char(1),char(206),char(255),char(215),char(2),char(248),char(1),char(213),char(255),char(215), +char(2),char(248),char(1),char(242),char(255),char(215),char(2),char(248),char(2),char(8), +char(255),char(174),char(2),char(248),char(2),char(12),char(255),char(174),char(2),char(248), +char(2),char(115),char(255),char(215),char(2),char(248),char(2),char(207),char(255),char(215), +char(2),char(248),char(3),char(18),char(255),char(215),char(2),char(248),char(3),char(28), +char(255),char(215),char(2),char(249),char(0),char(15),char(255),char(133),char(2),char(249), +char(0),char(17),char(255),char(133),char(2),char(249),char(1),char(159),char(255),char(236), +char(2),char(249),char(1),char(164),char(255),char(154),char(2),char(249),char(1),char(170), +char(255),char(113),char(2),char(249),char(1),char(174),char(255),char(154),char(2),char(249), +char(1),char(181),char(255),char(154),char(2),char(249),char(1),char(184),char(255),char(236), +char(2),char(249),char(1),char(187),char(255),char(236),char(2),char(249),char(1),char(190), +char(255),char(195),char(2),char(249),char(1),char(201),char(255),char(236),char(2),char(249), +char(1),char(206),char(255),char(174),char(2),char(249),char(1),char(207),char(255),char(215), +char(2),char(249),char(1),char(213),char(255),char(174),char(2),char(249),char(1),char(216), +char(255),char(215),char(2),char(249),char(1),char(219),char(255),char(215),char(2),char(249), +char(1),char(222),char(255),char(215),char(2),char(249),char(1),char(225),char(255),char(215), +char(2),char(249),char(1),char(234),char(255),char(215),char(2),char(249),char(1),char(235), +char(0),char(102),char(2),char(249),char(1),char(237),char(255),char(215),char(2),char(249), +char(1),char(238),char(255),char(236),char(2),char(249),char(1),char(242),char(255),char(174), +char(2),char(249),char(1),char(244),char(0),char(102),char(2),char(249),char(2),char(8), +char(255),char(133),char(2),char(249),char(2),char(12),char(255),char(133),char(2),char(249), +char(2),char(106),char(255),char(215),char(2),char(249),char(2),char(108),char(255),char(236), +char(2),char(249),char(2),char(114),char(255),char(113),char(2),char(249),char(2),char(115), +char(255),char(174),char(2),char(249),char(2),char(126),char(255),char(236),char(2),char(249), +char(2),char(127),char(255),char(215),char(2),char(249),char(2),char(132),char(255),char(236), +char(2),char(249),char(2),char(133),char(255),char(215),char(2),char(249),char(2),char(134), +char(255),char(236),char(2),char(249),char(2),char(135),char(255),char(215),char(2),char(249), +char(2),char(136),char(255),char(236),char(2),char(249),char(2),char(137),char(255),char(215), +char(2),char(249),char(2),char(138),char(255),char(236),char(2),char(249),char(2),char(140), +char(255),char(236),char(2),char(249),char(2),char(141),char(255),char(215),char(2),char(249), +char(2),char(152),char(0),char(102),char(2),char(249),char(2),char(168),char(0),char(102), +char(2),char(249),char(2),char(177),char(255),char(236),char(2),char(249),char(2),char(178), +char(255),char(215),char(2),char(249),char(2),char(179),char(255),char(236),char(2),char(249), +char(2),char(180),char(255),char(215),char(2),char(249),char(2),char(192),char(255),char(215), +char(2),char(249),char(2),char(194),char(255),char(215),char(2),char(249),char(2),char(197), +char(255),char(215),char(2),char(249),char(2),char(198),char(255),char(195),char(2),char(249), +char(2),char(199),char(255),char(215),char(2),char(249),char(2),char(200),char(255),char(195), +char(2),char(249),char(2),char(206),char(255),char(154),char(2),char(249),char(2),char(207), +char(255),char(174),char(2),char(249),char(2),char(213),char(255),char(215),char(2),char(249), +char(2),char(217),char(255),char(113),char(2),char(249),char(2),char(219),char(255),char(113), +char(2),char(249),char(2),char(221),char(255),char(113),char(2),char(249),char(2),char(224), +char(255),char(215),char(2),char(249),char(2),char(239),char(255),char(236),char(2),char(249), +char(2),char(240),char(255),char(215),char(2),char(249),char(2),char(241),char(255),char(236), +char(2),char(249),char(2),char(242),char(255),char(215),char(2),char(249),char(2),char(243), +char(255),char(236),char(2),char(249),char(2),char(244),char(255),char(215),char(2),char(249), +char(2),char(254),char(255),char(215),char(2),char(249),char(3),char(9),char(255),char(113), +char(2),char(249),char(3),char(10),char(255),char(215),char(2),char(249),char(3),char(11), +char(255),char(113),char(2),char(249),char(3),char(12),char(255),char(215),char(2),char(249), +char(3),char(17),char(255),char(154),char(2),char(249),char(3),char(18),char(255),char(174), +char(2),char(249),char(3),char(21),char(255),char(236),char(2),char(249),char(3),char(22), +char(255),char(215),char(2),char(249),char(3),char(26),char(255),char(215),char(2),char(249), +char(3),char(27),char(255),char(154),char(2),char(249),char(3),char(28),char(255),char(174), +char(2),char(250),char(0),char(15),char(255),char(174),char(2),char(250),char(0),char(17), +char(255),char(174),char(2),char(250),char(1),char(206),char(255),char(215),char(2),char(250), +char(1),char(213),char(255),char(215),char(2),char(250),char(1),char(242),char(255),char(215), +char(2),char(250),char(2),char(8),char(255),char(174),char(2),char(250),char(2),char(12), +char(255),char(174),char(2),char(250),char(2),char(115),char(255),char(215),char(2),char(250), +char(2),char(207),char(255),char(215),char(2),char(250),char(3),char(18),char(255),char(215), +char(2),char(250),char(3),char(28),char(255),char(215),char(2),char(251),char(0),char(15), +char(255),char(133),char(2),char(251),char(0),char(17),char(255),char(133),char(2),char(251), +char(1),char(159),char(255),char(236),char(2),char(251),char(1),char(164),char(255),char(154), +char(2),char(251),char(1),char(170),char(255),char(113),char(2),char(251),char(1),char(174), +char(255),char(154),char(2),char(251),char(1),char(181),char(255),char(154),char(2),char(251), +char(1),char(184),char(255),char(236),char(2),char(251),char(1),char(187),char(255),char(236), +char(2),char(251),char(1),char(190),char(255),char(195),char(2),char(251),char(1),char(201), +char(255),char(236),char(2),char(251),char(1),char(206),char(255),char(174),char(2),char(251), +char(1),char(207),char(255),char(215),char(2),char(251),char(1),char(213),char(255),char(174), +char(2),char(251),char(1),char(216),char(255),char(215),char(2),char(251),char(1),char(219), +char(255),char(215),char(2),char(251),char(1),char(222),char(255),char(215),char(2),char(251), +char(1),char(225),char(255),char(215),char(2),char(251),char(1),char(234),char(255),char(215), +char(2),char(251),char(1),char(235),char(0),char(102),char(2),char(251),char(1),char(237), +char(255),char(215),char(2),char(251),char(1),char(238),char(255),char(236),char(2),char(251), +char(1),char(242),char(255),char(174),char(2),char(251),char(1),char(244),char(0),char(102), +char(2),char(251),char(2),char(8),char(255),char(133),char(2),char(251),char(2),char(12), +char(255),char(133),char(2),char(251),char(2),char(106),char(255),char(215),char(2),char(251), +char(2),char(108),char(255),char(236),char(2),char(251),char(2),char(114),char(255),char(113), +char(2),char(251),char(2),char(115),char(255),char(174),char(2),char(251),char(2),char(126), +char(255),char(236),char(2),char(251),char(2),char(127),char(255),char(215),char(2),char(251), +char(2),char(132),char(255),char(236),char(2),char(251),char(2),char(133),char(255),char(215), +char(2),char(251),char(2),char(134),char(255),char(236),char(2),char(251),char(2),char(135), +char(255),char(215),char(2),char(251),char(2),char(136),char(255),char(236),char(2),char(251), +char(2),char(137),char(255),char(215),char(2),char(251),char(2),char(138),char(255),char(236), +char(2),char(251),char(2),char(140),char(255),char(236),char(2),char(251),char(2),char(141), +char(255),char(215),char(2),char(251),char(2),char(152),char(0),char(102),char(2),char(251), +char(2),char(168),char(0),char(102),char(2),char(251),char(2),char(177),char(255),char(236), +char(2),char(251),char(2),char(178),char(255),char(215),char(2),char(251),char(2),char(179), +char(255),char(236),char(2),char(251),char(2),char(180),char(255),char(215),char(2),char(251), +char(2),char(192),char(255),char(215),char(2),char(251),char(2),char(194),char(255),char(215), +char(2),char(251),char(2),char(197),char(255),char(215),char(2),char(251),char(2),char(198), +char(255),char(195),char(2),char(251),char(2),char(199),char(255),char(215),char(2),char(251), +char(2),char(200),char(255),char(195),char(2),char(251),char(2),char(206),char(255),char(154), +char(2),char(251),char(2),char(207),char(255),char(174),char(2),char(251),char(2),char(213), +char(255),char(215),char(2),char(251),char(2),char(217),char(255),char(113),char(2),char(251), +char(2),char(219),char(255),char(113),char(2),char(251),char(2),char(221),char(255),char(113), +char(2),char(251),char(2),char(224),char(255),char(215),char(2),char(251),char(2),char(239), +char(255),char(236),char(2),char(251),char(2),char(240),char(255),char(215),char(2),char(251), +char(2),char(241),char(255),char(236),char(2),char(251),char(2),char(242),char(255),char(215), +char(2),char(251),char(2),char(243),char(255),char(236),char(2),char(251),char(2),char(244), +char(255),char(215),char(2),char(251),char(2),char(254),char(255),char(215),char(2),char(251), +char(3),char(9),char(255),char(113),char(2),char(251),char(3),char(10),char(255),char(215), +char(2),char(251),char(3),char(11),char(255),char(113),char(2),char(251),char(3),char(12), +char(255),char(215),char(2),char(251),char(3),char(17),char(255),char(154),char(2),char(251), +char(3),char(18),char(255),char(174),char(2),char(251),char(3),char(21),char(255),char(236), +char(2),char(251),char(3),char(22),char(255),char(215),char(2),char(251),char(3),char(26), +char(255),char(215),char(2),char(251),char(3),char(27),char(255),char(154),char(2),char(251), +char(3),char(28),char(255),char(174),char(2),char(252),char(0),char(15),char(255),char(174), +char(2),char(252),char(0),char(17),char(255),char(174),char(2),char(252),char(1),char(206), +char(255),char(215),char(2),char(252),char(1),char(213),char(255),char(215),char(2),char(252), +char(1),char(242),char(255),char(215),char(2),char(252),char(2),char(8),char(255),char(174), +char(2),char(252),char(2),char(12),char(255),char(174),char(2),char(252),char(2),char(115), +char(255),char(215),char(2),char(252),char(2),char(207),char(255),char(215),char(2),char(252), +char(3),char(18),char(255),char(215),char(2),char(252),char(3),char(28),char(255),char(215), +char(2),char(255),char(0),char(15),char(255),char(133),char(2),char(255),char(0),char(16), +char(255),char(174),char(2),char(255),char(0),char(17),char(255),char(133),char(2),char(255), +char(1),char(159),char(255),char(215),char(2),char(255),char(1),char(164),char(255),char(154), +char(2),char(255),char(1),char(170),char(255),char(113),char(2),char(255),char(1),char(174), +char(255),char(154),char(2),char(255),char(1),char(181),char(255),char(154),char(2),char(255), +char(1),char(184),char(255),char(215),char(2),char(255),char(1),char(187),char(255),char(215), +char(2),char(255),char(1),char(188),char(0),char(41),char(2),char(255),char(1),char(190), +char(255),char(174),char(2),char(255),char(1),char(204),char(255),char(154),char(2),char(255), +char(1),char(205),char(255),char(154),char(2),char(255),char(1),char(206),char(255),char(133), +char(2),char(255),char(1),char(207),char(255),char(113),char(2),char(255),char(1),char(208), +char(255),char(215),char(2),char(255),char(1),char(209),char(255),char(215),char(2),char(255), +char(1),char(210),char(255),char(154),char(2),char(255),char(1),char(211),char(255),char(154), +char(2),char(255),char(1),char(212),char(255),char(154),char(2),char(255),char(1),char(213), +char(255),char(133),char(2),char(255),char(1),char(214),char(255),char(154),char(2),char(255), +char(1),char(215),char(255),char(154),char(2),char(255),char(1),char(216),char(255),char(113), +char(2),char(255),char(1),char(217),char(255),char(154),char(2),char(255),char(1),char(218), +char(255),char(154),char(2),char(255),char(1),char(219),char(255),char(113),char(2),char(255), +char(1),char(220),char(255),char(174),char(2),char(255),char(1),char(221),char(255),char(174), +char(2),char(255),char(1),char(222),char(255),char(113),char(2),char(255),char(1),char(223), +char(255),char(215),char(2),char(255),char(1),char(224),char(255),char(154),char(2),char(255), +char(1),char(225),char(255),char(154),char(2),char(255),char(1),char(226),char(255),char(154), +char(2),char(255),char(1),char(227),char(255),char(154),char(2),char(255),char(1),char(228), +char(255),char(174),char(2),char(255),char(1),char(229),char(255),char(154),char(2),char(255), +char(1),char(230),char(255),char(154),char(2),char(255),char(1),char(231),char(255),char(215), +char(2),char(255),char(1),char(232),char(255),char(154),char(2),char(255),char(1),char(233), +char(255),char(195),char(2),char(255),char(1),char(234),char(255),char(113),char(2),char(255), +char(1),char(236),char(255),char(154),char(2),char(255),char(1),char(237),char(255),char(113), +char(2),char(255),char(1),char(238),char(255),char(133),char(2),char(255),char(1),char(242), +char(255),char(133),char(2),char(255),char(1),char(243),char(255),char(154),char(2),char(255), +char(1),char(245),char(255),char(154),char(2),char(255),char(1),char(246),char(255),char(174), +char(2),char(255),char(1),char(247),char(255),char(154),char(2),char(255),char(1),char(249), +char(255),char(154),char(2),char(255),char(2),char(2),char(255),char(174),char(2),char(255), +char(2),char(3),char(255),char(174),char(2),char(255),char(2),char(4),char(255),char(174), +char(2),char(255),char(2),char(8),char(255),char(133),char(2),char(255),char(2),char(12), +char(255),char(133),char(2),char(255),char(2),char(106),char(255),char(113),char(2),char(255), +char(2),char(107),char(255),char(154),char(2),char(255),char(2),char(108),char(255),char(215), +char(2),char(255),char(2),char(109),char(255),char(215),char(2),char(255),char(2),char(113), +char(255),char(154),char(2),char(255),char(2),char(114),char(255),char(113),char(2),char(255), +char(2),char(115),char(255),char(133),char(2),char(255),char(2),char(117),char(255),char(154), +char(2),char(255),char(2),char(119),char(255),char(154),char(2),char(255),char(2),char(121), +char(255),char(154),char(2),char(255),char(2),char(125),char(255),char(154),char(2),char(255), +char(2),char(126),char(255),char(215),char(2),char(255),char(2),char(127),char(255),char(113), +char(2),char(255),char(2),char(129),char(255),char(215),char(2),char(255),char(2),char(131), +char(255),char(215),char(2),char(255),char(2),char(132),char(255),char(215),char(2),char(255), +char(2),char(133),char(255),char(113),char(2),char(255),char(2),char(134),char(255),char(215), +char(2),char(255),char(2),char(135),char(255),char(113),char(2),char(255),char(2),char(136), +char(255),char(215),char(2),char(255),char(2),char(137),char(255),char(113),char(2),char(255), +char(2),char(138),char(255),char(215),char(2),char(255),char(2),char(139),char(255),char(215), +char(2),char(255),char(2),char(140),char(255),char(215),char(2),char(255),char(2),char(141), +char(255),char(113),char(2),char(255),char(2),char(150),char(255),char(154),char(2),char(255), +char(2),char(154),char(255),char(154),char(2),char(255),char(2),char(158),char(255),char(154), +char(2),char(255),char(2),char(160),char(255),char(215),char(2),char(255),char(2),char(162), +char(255),char(215),char(2),char(255),char(2),char(164),char(255),char(154),char(2),char(255), +char(2),char(166),char(255),char(154),char(2),char(255),char(2),char(170),char(255),char(174), +char(2),char(255),char(2),char(172),char(255),char(154),char(2),char(255),char(2),char(174), +char(255),char(154),char(2),char(255),char(2),char(176),char(255),char(154),char(2),char(255), +char(2),char(177),char(255),char(215),char(2),char(255),char(2),char(178),char(255),char(113), +char(2),char(255),char(2),char(179),char(255),char(215),char(2),char(255),char(2),char(180), +char(255),char(113),char(2),char(255),char(2),char(181),char(0),char(41),char(2),char(255), +char(2),char(182),char(255),char(174),char(2),char(255),char(2),char(184),char(255),char(174), +char(2),char(255),char(2),char(186),char(255),char(174),char(2),char(255),char(2),char(188), +char(255),char(215),char(2),char(255),char(2),char(190),char(255),char(174),char(2),char(255), +char(2),char(192),char(255),char(154),char(2),char(255),char(2),char(194),char(255),char(154), +char(2),char(255),char(2),char(196),char(255),char(154),char(2),char(255),char(2),char(197), +char(255),char(154),char(2),char(255),char(2),char(198),char(255),char(113),char(2),char(255), +char(2),char(199),char(255),char(154),char(2),char(255),char(2),char(200),char(255),char(113), +char(2),char(255),char(2),char(203),char(255),char(215),char(2),char(255),char(2),char(205), +char(255),char(154),char(2),char(255),char(2),char(206),char(255),char(154),char(2),char(255), +char(2),char(207),char(255),char(133),char(2),char(255),char(2),char(209),char(255),char(154), +char(2),char(255),char(2),char(211),char(255),char(154),char(2),char(255),char(2),char(213), +char(255),char(154),char(2),char(255),char(2),char(215),char(255),char(154),char(2),char(255), +char(2),char(217),char(255),char(113),char(2),char(255),char(2),char(219),char(255),char(113), +char(2),char(255),char(2),char(221),char(255),char(113),char(2),char(255),char(2),char(224), +char(255),char(113),char(2),char(255),char(2),char(230),char(255),char(215),char(2),char(255), +char(2),char(232),char(255),char(215),char(2),char(255),char(2),char(234),char(255),char(195), +char(2),char(255),char(2),char(236),char(255),char(154),char(2),char(255),char(2),char(238), +char(255),char(154),char(2),char(255),char(2),char(239),char(255),char(215),char(2),char(255), +char(2),char(240),char(255),char(113),char(2),char(255),char(2),char(241),char(255),char(215), +char(2),char(255),char(2),char(242),char(255),char(113),char(2),char(255),char(2),char(243), +char(255),char(215),char(2),char(255),char(2),char(244),char(255),char(113),char(2),char(255), +char(2),char(246),char(255),char(215),char(2),char(255),char(2),char(248),char(255),char(174), +char(2),char(255),char(2),char(250),char(255),char(174),char(2),char(255),char(2),char(252), +char(255),char(174),char(2),char(255),char(2),char(254),char(255),char(154),char(2),char(255), +char(3),char(0),char(255),char(154),char(2),char(255),char(3),char(2),char(255),char(154), +char(2),char(255),char(3),char(6),char(255),char(215),char(2),char(255),char(3),char(8), +char(255),char(215),char(2),char(255),char(3),char(9),char(255),char(113),char(2),char(255), +char(3),char(10),char(255),char(113),char(2),char(255),char(3),char(11),char(255),char(113), +char(2),char(255),char(3),char(12),char(255),char(113),char(2),char(255),char(3),char(14), +char(255),char(154),char(2),char(255),char(3),char(16),char(255),char(154),char(2),char(255), +char(3),char(17),char(255),char(154),char(2),char(255),char(3),char(18),char(255),char(133), +char(2),char(255),char(3),char(20),char(255),char(154),char(2),char(255),char(3),char(21), +char(255),char(215),char(2),char(255),char(3),char(22),char(255),char(113),char(2),char(255), +char(3),char(24),char(255),char(174),char(2),char(255),char(3),char(26),char(255),char(113), +char(2),char(255),char(3),char(27),char(255),char(154),char(2),char(255),char(3),char(28), +char(255),char(133),char(3),char(0),char(0),char(15),char(255),char(154),char(3),char(0), +char(0),char(16),char(255),char(215),char(3),char(0),char(0),char(17),char(255),char(154), +char(3),char(0),char(1),char(206),char(255),char(195),char(3),char(0),char(1),char(207), +char(255),char(236),char(3),char(0),char(1),char(213),char(255),char(195),char(3),char(0), +char(1),char(216),char(255),char(236),char(3),char(0),char(1),char(219),char(255),char(236), +char(3),char(0),char(1),char(222),char(255),char(236),char(3),char(0),char(1),char(234), +char(255),char(236),char(3),char(0),char(1),char(237),char(255),char(236),char(3),char(0), +char(1),char(242),char(255),char(195),char(3),char(0),char(2),char(2),char(255),char(215), +char(3),char(0),char(2),char(3),char(255),char(215),char(3),char(0),char(2),char(4), +char(255),char(215),char(3),char(0),char(2),char(8),char(255),char(154),char(3),char(0), +char(2),char(12),char(255),char(154),char(3),char(0),char(2),char(106),char(255),char(236), +char(3),char(0),char(2),char(115),char(255),char(195),char(3),char(0),char(2),char(127), +char(255),char(236),char(3),char(0),char(2),char(133),char(255),char(236),char(3),char(0), +char(2),char(135),char(255),char(236),char(3),char(0),char(2),char(137),char(255),char(236), +char(3),char(0),char(2),char(141),char(255),char(236),char(3),char(0),char(2),char(178), +char(255),char(236),char(3),char(0),char(2),char(180),char(255),char(236),char(3),char(0), +char(2),char(207),char(255),char(195),char(3),char(0),char(2),char(224),char(255),char(236), +char(3),char(0),char(2),char(240),char(255),char(236),char(3),char(0),char(2),char(242), +char(255),char(236),char(3),char(0),char(2),char(244),char(255),char(236),char(3),char(0), +char(3),char(10),char(255),char(236),char(3),char(0),char(3),char(12),char(255),char(236), +char(3),char(0),char(3),char(18),char(255),char(195),char(3),char(0),char(3),char(22), +char(255),char(236),char(3),char(0),char(3),char(26),char(255),char(236),char(3),char(0), +char(3),char(28),char(255),char(195),char(3),char(3),char(0),char(15),char(255),char(154), +char(3),char(3),char(0),char(16),char(255),char(215),char(3),char(3),char(0),char(17), +char(255),char(154),char(3),char(3),char(1),char(157),char(0),char(41),char(3),char(3), +char(1),char(159),char(255),char(215),char(3),char(3),char(1),char(164),char(255),char(174), +char(3),char(3),char(1),char(166),char(0),char(41),char(3),char(3),char(1),char(170), +char(255),char(133),char(3),char(3),char(1),char(174),char(255),char(174),char(3),char(3), +char(1),char(181),char(255),char(174),char(3),char(3),char(1),char(184),char(255),char(215), +char(3),char(3),char(1),char(187),char(255),char(215),char(3),char(3),char(1),char(188), +char(0),char(41),char(3),char(3),char(1),char(190),char(255),char(195),char(3),char(3), +char(1),char(196),char(0),char(41),char(3),char(3),char(1),char(204),char(255),char(195), +char(3),char(3),char(1),char(205),char(255),char(195),char(3),char(3),char(1),char(206), +char(255),char(154),char(3),char(3),char(1),char(207),char(255),char(174),char(3),char(3), +char(1),char(208),char(255),char(215),char(3),char(3),char(1),char(209),char(255),char(215), +char(3),char(3),char(1),char(210),char(255),char(195),char(3),char(3),char(1),char(211), +char(255),char(195),char(3),char(3),char(1),char(212),char(255),char(195),char(3),char(3), +char(1),char(213),char(255),char(154),char(3),char(3),char(1),char(214),char(255),char(195), +char(3),char(3),char(1),char(215),char(255),char(195),char(3),char(3),char(1),char(216), +char(255),char(174),char(3),char(3),char(1),char(217),char(255),char(195),char(3),char(3), +char(1),char(218),char(255),char(195),char(3),char(3),char(1),char(219),char(255),char(174), +char(3),char(3),char(1),char(222),char(255),char(174),char(3),char(3),char(1),char(223), +char(255),char(215),char(3),char(3),char(1),char(224),char(255),char(195),char(3),char(3), +char(1),char(225),char(255),char(154),char(3),char(3),char(1),char(226),char(255),char(195), +char(3),char(3),char(1),char(227),char(255),char(195),char(3),char(3),char(1),char(229), +char(255),char(195),char(3),char(3),char(1),char(230),char(255),char(195),char(3),char(3), +char(1),char(231),char(255),char(215),char(3),char(3),char(1),char(232),char(255),char(195), +char(3),char(3),char(1),char(234),char(255),char(174),char(3),char(3),char(1),char(235), +char(0),char(41),char(3),char(3),char(1),char(236),char(255),char(195),char(3),char(3), +char(1),char(237),char(255),char(174),char(3),char(3),char(1),char(238),char(255),char(195), +char(3),char(3),char(1),char(242),char(255),char(154),char(3),char(3),char(1),char(243), +char(255),char(195),char(3),char(3),char(1),char(244),char(0),char(41),char(3),char(3), +char(1),char(245),char(255),char(195),char(3),char(3),char(1),char(247),char(255),char(195), +char(3),char(3),char(1),char(249),char(255),char(195),char(3),char(3),char(2),char(2), +char(255),char(215),char(3),char(3),char(2),char(3),char(255),char(215),char(3),char(3), +char(2),char(4),char(255),char(215),char(3),char(3),char(2),char(8),char(255),char(154), +char(3),char(3),char(2),char(12),char(255),char(154),char(3),char(3),char(2),char(106), +char(255),char(174),char(3),char(3),char(2),char(107),char(255),char(195),char(3),char(3), +char(2),char(108),char(255),char(215),char(3),char(3),char(2),char(113),char(255),char(195), +char(3),char(3),char(2),char(114),char(255),char(133),char(3),char(3),char(2),char(115), +char(255),char(154),char(3),char(3),char(2),char(117),char(255),char(195),char(3),char(3), +char(2),char(119),char(255),char(215),char(3),char(3),char(2),char(121),char(255),char(195), +char(3),char(3),char(2),char(125),char(255),char(195),char(3),char(3),char(2),char(126), +char(255),char(215),char(3),char(3),char(2),char(127),char(255),char(174),char(3),char(3), +char(2),char(132),char(255),char(215),char(3),char(3),char(2),char(133),char(255),char(174), +char(3),char(3),char(2),char(134),char(255),char(215),char(3),char(3),char(2),char(135), +char(255),char(174),char(3),char(3),char(2),char(136),char(255),char(215),char(3),char(3), +char(2),char(137),char(255),char(174),char(3),char(3),char(2),char(138),char(255),char(215), +char(3),char(3),char(2),char(140),char(255),char(215),char(3),char(3),char(2),char(141), +char(255),char(174),char(3),char(3),char(2),char(150),char(255),char(195),char(3),char(3), +char(2),char(152),char(0),char(41),char(3),char(3),char(2),char(154),char(255),char(195), +char(3),char(3),char(2),char(158),char(255),char(195),char(3),char(3),char(2),char(160), +char(255),char(215),char(3),char(3),char(2),char(162),char(255),char(215),char(3),char(3), +char(2),char(164),char(255),char(195),char(3),char(3),char(2),char(166),char(255),char(195), +char(3),char(3),char(2),char(168),char(0),char(41),char(3),char(3),char(2),char(169), +char(0),char(41),char(3),char(3),char(2),char(172),char(255),char(195),char(3),char(3), +char(2),char(174),char(255),char(195),char(3),char(3),char(2),char(176),char(255),char(195), +char(3),char(3),char(2),char(177),char(255),char(215),char(3),char(3),char(2),char(178), +char(255),char(174),char(3),char(3),char(2),char(179),char(255),char(215),char(3),char(3), +char(2),char(180),char(255),char(174),char(3),char(3),char(2),char(181),char(0),char(41), +char(3),char(3),char(2),char(188),char(255),char(215),char(3),char(3),char(2),char(189), +char(0),char(41),char(3),char(3),char(2),char(192),char(255),char(154),char(3),char(3), +char(2),char(194),char(255),char(154),char(3),char(3),char(2),char(196),char(255),char(195), +char(3),char(3),char(2),char(197),char(255),char(215),char(3),char(3),char(2),char(198), +char(255),char(195),char(3),char(3),char(2),char(199),char(255),char(215),char(3),char(3), +char(2),char(200),char(255),char(195),char(3),char(3),char(2),char(203),char(255),char(215), +char(3),char(3),char(2),char(205),char(255),char(195),char(3),char(3),char(2),char(206), +char(255),char(174),char(3),char(3),char(2),char(207),char(255),char(154),char(3),char(3), +char(2),char(209),char(255),char(195),char(3),char(3),char(2),char(211),char(255),char(195), +char(3),char(3),char(2),char(213),char(255),char(154),char(3),char(3),char(2),char(215), +char(255),char(195),char(3),char(3),char(2),char(217),char(255),char(133),char(3),char(3), +char(2),char(219),char(255),char(133),char(3),char(3),char(2),char(221),char(255),char(133), +char(3),char(3),char(2),char(224),char(255),char(174),char(3),char(3),char(2),char(230), +char(255),char(215),char(3),char(3),char(2),char(232),char(255),char(215),char(3),char(3), +char(2),char(236),char(255),char(195),char(3),char(3),char(2),char(238),char(255),char(195), +char(3),char(3),char(2),char(239),char(255),char(215),char(3),char(3),char(2),char(240), +char(255),char(174),char(3),char(3),char(2),char(241),char(255),char(215),char(3),char(3), +char(2),char(242),char(255),char(174),char(3),char(3),char(2),char(243),char(255),char(215), +char(3),char(3),char(2),char(244),char(255),char(174),char(3),char(3),char(2),char(246), +char(255),char(215),char(3),char(3),char(2),char(254),char(255),char(154),char(3),char(3), +char(3),char(0),char(255),char(195),char(3),char(3),char(3),char(2),char(255),char(195), +char(3),char(3),char(3),char(6),char(255),char(215),char(3),char(3),char(3),char(8), +char(255),char(215),char(3),char(3),char(3),char(9),char(255),char(154),char(3),char(3), +char(3),char(10),char(255),char(174),char(3),char(3),char(3),char(11),char(255),char(154), +char(3),char(3),char(3),char(12),char(255),char(174),char(3),char(3),char(3),char(14), +char(255),char(215),char(3),char(3),char(3),char(16),char(255),char(215),char(3),char(3), +char(3),char(17),char(255),char(174),char(3),char(3),char(3),char(18),char(255),char(154), +char(3),char(3),char(3),char(20),char(255),char(195),char(3),char(3),char(3),char(21), +char(255),char(215),char(3),char(3),char(3),char(22),char(255),char(174),char(3),char(3), +char(3),char(23),char(0),char(41),char(3),char(3),char(3),char(26),char(255),char(174), +char(3),char(3),char(3),char(27),char(255),char(174),char(3),char(3),char(3),char(28), +char(255),char(154),char(3),char(4),char(0),char(15),char(255),char(195),char(3),char(4), +char(0),char(17),char(255),char(195),char(3),char(4),char(1),char(206),char(255),char(195), +char(3),char(4),char(1),char(207),char(255),char(215),char(3),char(4),char(1),char(213), +char(255),char(195),char(3),char(4),char(1),char(216),char(255),char(215),char(3),char(4), +char(1),char(219),char(255),char(215),char(3),char(4),char(1),char(222),char(255),char(215), +char(3),char(4),char(1),char(234),char(255),char(215),char(3),char(4),char(1),char(237), +char(255),char(215),char(3),char(4),char(1),char(242),char(255),char(195),char(3),char(4), +char(2),char(8),char(255),char(195),char(3),char(4),char(2),char(12),char(255),char(195), +char(3),char(4),char(2),char(106),char(255),char(215),char(3),char(4),char(2),char(115), +char(255),char(195),char(3),char(4),char(2),char(127),char(255),char(215),char(3),char(4), +char(2),char(133),char(255),char(215),char(3),char(4),char(2),char(135),char(255),char(215), +char(3),char(4),char(2),char(137),char(255),char(215),char(3),char(4),char(2),char(141), +char(255),char(215),char(3),char(4),char(2),char(178),char(255),char(215),char(3),char(4), +char(2),char(180),char(255),char(215),char(3),char(4),char(2),char(207),char(255),char(195), +char(3),char(4),char(2),char(224),char(255),char(215),char(3),char(4),char(2),char(240), +char(255),char(215),char(3),char(4),char(2),char(242),char(255),char(215),char(3),char(4), +char(2),char(244),char(255),char(215),char(3),char(4),char(3),char(10),char(255),char(215), +char(3),char(4),char(3),char(12),char(255),char(215),char(3),char(4),char(3),char(18), +char(255),char(195),char(3),char(4),char(3),char(22),char(255),char(215),char(3),char(4), +char(3),char(26),char(255),char(215),char(3),char(4),char(3),char(28),char(255),char(195), +char(3),char(5),char(1),char(159),char(255),char(215),char(3),char(5),char(1),char(163), +char(0),char(225),char(3),char(5),char(1),char(184),char(255),char(215),char(3),char(5), +char(1),char(187),char(255),char(215),char(3),char(5),char(1),char(190),char(255),char(195), +char(3),char(5),char(1),char(220),char(255),char(215),char(3),char(5),char(1),char(225), +char(255),char(174),char(3),char(5),char(1),char(228),char(255),char(215),char(3),char(5), +char(2),char(108),char(255),char(215),char(3),char(5),char(2),char(123),char(0),char(61), +char(3),char(5),char(2),char(125),char(255),char(236),char(3),char(5),char(2),char(126), +char(255),char(215),char(3),char(5),char(2),char(132),char(255),char(215),char(3),char(5), +char(2),char(134),char(255),char(215),char(3),char(5),char(2),char(136),char(255),char(215), +char(3),char(5),char(2),char(138),char(255),char(215),char(3),char(5),char(2),char(140), +char(255),char(215),char(3),char(5),char(2),char(170),char(255),char(215),char(3),char(5), +char(2),char(177),char(255),char(215),char(3),char(5),char(2),char(179),char(255),char(215), +char(3),char(5),char(2),char(182),char(255),char(215),char(3),char(5),char(2),char(190), +char(255),char(215),char(3),char(5),char(2),char(192),char(255),char(174),char(3),char(5), +char(2),char(194),char(255),char(174),char(3),char(5),char(2),char(197),char(255),char(195), +char(3),char(5),char(2),char(198),char(255),char(215),char(3),char(5),char(2),char(199), +char(255),char(195),char(3),char(5),char(2),char(200),char(255),char(215),char(3),char(5), +char(2),char(213),char(255),char(174),char(3),char(5),char(2),char(239),char(255),char(215), +char(3),char(5),char(2),char(241),char(255),char(215),char(3),char(5),char(2),char(243), +char(255),char(215),char(3),char(5),char(2),char(254),char(255),char(174),char(3),char(5), +char(3),char(14),char(255),char(215),char(3),char(5),char(3),char(16),char(255),char(215), +char(3),char(5),char(3),char(21),char(255),char(215),char(3),char(5),char(3),char(24), +char(255),char(215),char(3),char(6),char(1),char(207),char(255),char(236),char(3),char(6), +char(1),char(216),char(255),char(236),char(3),char(6),char(1),char(219),char(255),char(236), +char(3),char(6),char(1),char(222),char(255),char(236),char(3),char(6),char(1),char(225), +char(255),char(236),char(3),char(6),char(1),char(234),char(255),char(236),char(3),char(6), +char(1),char(237),char(255),char(236),char(3),char(6),char(2),char(106),char(255),char(236), +char(3),char(6),char(2),char(127),char(255),char(236),char(3),char(6),char(2),char(133), +char(255),char(236),char(3),char(6),char(2),char(135),char(255),char(236),char(3),char(6), +char(2),char(137),char(255),char(236),char(3),char(6),char(2),char(141),char(255),char(236), +char(3),char(6),char(2),char(178),char(255),char(236),char(3),char(6),char(2),char(180), +char(255),char(236),char(3),char(6),char(2),char(192),char(255),char(236),char(3),char(6), +char(2),char(194),char(255),char(236),char(3),char(6),char(2),char(213),char(255),char(236), +char(3),char(6),char(2),char(224),char(255),char(236),char(3),char(6),char(2),char(240), +char(255),char(236),char(3),char(6),char(2),char(242),char(255),char(236),char(3),char(6), +char(2),char(244),char(255),char(236),char(3),char(6),char(2),char(254),char(255),char(236), +char(3),char(6),char(3),char(10),char(255),char(236),char(3),char(6),char(3),char(12), +char(255),char(236),char(3),char(6),char(3),char(14),char(255),char(215),char(3),char(6), +char(3),char(16),char(255),char(215),char(3),char(6),char(3),char(22),char(255),char(236), +char(3),char(6),char(3),char(26),char(255),char(236),char(3),char(7),char(1),char(159), +char(255),char(215),char(3),char(7),char(1),char(184),char(255),char(215),char(3),char(7), +char(1),char(187),char(255),char(215),char(3),char(7),char(1),char(190),char(255),char(215), +char(3),char(7),char(1),char(193),char(255),char(215),char(3),char(7),char(1),char(225), +char(255),char(215),char(3),char(7),char(2),char(108),char(255),char(215),char(3),char(7), +char(2),char(124),char(255),char(215),char(3),char(7),char(2),char(126),char(255),char(215), +char(3),char(7),char(2),char(132),char(255),char(215),char(3),char(7),char(2),char(134), +char(255),char(215),char(3),char(7),char(2),char(136),char(255),char(215),char(3),char(7), +char(2),char(138),char(255),char(215),char(3),char(7),char(2),char(140),char(255),char(215), +char(3),char(7),char(2),char(177),char(255),char(215),char(3),char(7),char(2),char(179), +char(255),char(215),char(3),char(7),char(2),char(191),char(255),char(215),char(3),char(7), +char(2),char(192),char(255),char(215),char(3),char(7),char(2),char(193),char(255),char(215), +char(3),char(7),char(2),char(194),char(255),char(215),char(3),char(7),char(2),char(197), +char(255),char(154),char(3),char(7),char(2),char(199),char(255),char(154),char(3),char(7), +char(2),char(212),char(255),char(215),char(3),char(7),char(2),char(213),char(255),char(215), +char(3),char(7),char(2),char(239),char(255),char(215),char(3),char(7),char(2),char(241), +char(255),char(215),char(3),char(7),char(2),char(243),char(255),char(215),char(3),char(7), +char(2),char(253),char(255),char(215),char(3),char(7),char(2),char(254),char(255),char(215), +char(3),char(7),char(3),char(9),char(255),char(215),char(3),char(7),char(3),char(11), +char(255),char(215),char(3),char(7),char(3),char(14),char(255),char(215),char(3),char(7), +char(3),char(16),char(255),char(215),char(3),char(7),char(3),char(21),char(255),char(215), +char(3),char(7),char(3),char(25),char(255),char(236),char(3),char(8),char(1),char(207), +char(255),char(236),char(3),char(8),char(1),char(216),char(255),char(236),char(3),char(8), +char(1),char(219),char(255),char(236),char(3),char(8),char(1),char(222),char(255),char(236), +char(3),char(8),char(1),char(225),char(255),char(236),char(3),char(8),char(1),char(234), +char(255),char(236),char(3),char(8),char(1),char(237),char(255),char(236),char(3),char(8), +char(2),char(106),char(255),char(236),char(3),char(8),char(2),char(127),char(255),char(236), +char(3),char(8),char(2),char(133),char(255),char(236),char(3),char(8),char(2),char(135), +char(255),char(236),char(3),char(8),char(2),char(137),char(255),char(236),char(3),char(8), +char(2),char(141),char(255),char(236),char(3),char(8),char(2),char(178),char(255),char(236), +char(3),char(8),char(2),char(180),char(255),char(236),char(3),char(8),char(2),char(192), +char(255),char(236),char(3),char(8),char(2),char(194),char(255),char(236),char(3),char(8), +char(2),char(213),char(255),char(236),char(3),char(8),char(2),char(224),char(255),char(236), +char(3),char(8),char(2),char(240),char(255),char(236),char(3),char(8),char(2),char(242), +char(255),char(236),char(3),char(8),char(2),char(244),char(255),char(236),char(3),char(8), +char(2),char(254),char(255),char(236),char(3),char(8),char(3),char(10),char(255),char(236), +char(3),char(8),char(3),char(12),char(255),char(236),char(3),char(8),char(3),char(14), +char(255),char(215),char(3),char(8),char(3),char(16),char(255),char(215),char(3),char(8), +char(3),char(22),char(255),char(236),char(3),char(8),char(3),char(26),char(255),char(236), +char(3),char(11),char(0),char(5),char(255),char(154),char(3),char(11),char(0),char(10), +char(255),char(154),char(3),char(11),char(1),char(157),char(255),char(174),char(3),char(11), +char(1),char(166),char(255),char(174),char(3),char(11),char(1),char(168),char(255),char(195), +char(3),char(11),char(1),char(170),char(255),char(195),char(3),char(11),char(1),char(176), +char(255),char(195),char(3),char(11),char(1),char(188),char(255),char(113),char(3),char(11), +char(1),char(189),char(255),char(195),char(3),char(11),char(1),char(191),char(255),char(195), +char(3),char(11),char(1),char(193),char(255),char(195),char(3),char(11),char(1),char(196), +char(255),char(174),char(3),char(11),char(1),char(208),char(255),char(215),char(3),char(11), +char(1),char(220),char(255),char(195),char(3),char(11),char(1),char(223),char(255),char(215), +char(3),char(11),char(1),char(225),char(255),char(215),char(3),char(11),char(1),char(228), +char(255),char(195),char(3),char(11),char(2),char(7),char(255),char(154),char(3),char(11), +char(2),char(11),char(255),char(154),char(3),char(11),char(2),char(114),char(255),char(195), +char(3),char(11),char(2),char(118),char(255),char(215),char(3),char(11),char(2),char(124), +char(255),char(195),char(3),char(11),char(2),char(128),char(255),char(195),char(3),char(11), +char(2),char(130),char(255),char(195),char(3),char(11),char(2),char(159),char(255),char(195), +char(3),char(11),char(2),char(160),char(255),char(215),char(3),char(11),char(2),char(169), +char(255),char(174),char(3),char(11),char(2),char(170),char(255),char(195),char(3),char(11), +char(2),char(181),char(255),char(113),char(3),char(11),char(2),char(182),char(255),char(195), +char(3),char(11),char(2),char(183),char(255),char(195),char(3),char(11),char(2),char(185), +char(255),char(195),char(3),char(11),char(2),char(187),char(255),char(195),char(3),char(11), +char(2),char(188),char(255),char(215),char(3),char(11),char(2),char(189),char(255),char(174), +char(3),char(11),char(2),char(190),char(255),char(195),char(3),char(11),char(2),char(191), +char(255),char(195),char(3),char(11),char(2),char(192),char(255),char(215),char(3),char(11), +char(2),char(193),char(255),char(195),char(3),char(11),char(2),char(194),char(255),char(215), +char(3),char(11),char(2),char(202),char(255),char(195),char(3),char(11),char(2),char(203), +char(255),char(215),char(3),char(11),char(2),char(212),char(255),char(195),char(3),char(11), +char(2),char(213),char(255),char(215),char(3),char(11),char(2),char(217),char(255),char(195), +char(3),char(11),char(2),char(219),char(255),char(195),char(3),char(11),char(2),char(221), +char(255),char(195),char(3),char(11),char(2),char(229),char(255),char(195),char(3),char(11), +char(2),char(230),char(255),char(215),char(3),char(11),char(2),char(247),char(255),char(195), +char(3),char(11),char(2),char(249),char(255),char(195),char(3),char(11),char(2),char(251), +char(255),char(195),char(3),char(11),char(2),char(253),char(255),char(195),char(3),char(11), +char(2),char(254),char(255),char(215),char(3),char(11),char(3),char(5),char(255),char(195), +char(3),char(11),char(3),char(6),char(255),char(215),char(3),char(11),char(3),char(7), +char(255),char(195),char(3),char(11),char(3),char(8),char(255),char(215),char(3),char(11), +char(3),char(13),char(255),char(215),char(3),char(11),char(3),char(14),char(255),char(215), +char(3),char(11),char(3),char(15),char(255),char(215),char(3),char(11),char(3),char(16), +char(255),char(215),char(3),char(11),char(3),char(23),char(255),char(174),char(3),char(11), +char(3),char(24),char(255),char(195),char(3),char(12),char(0),char(5),char(255),char(154), +char(3),char(12),char(0),char(10),char(255),char(154),char(3),char(12),char(1),char(208), +char(255),char(215),char(3),char(12),char(1),char(220),char(255),char(195),char(3),char(12), +char(1),char(221),char(255),char(215),char(3),char(12),char(1),char(223),char(255),char(215), +char(3),char(12),char(1),char(225),char(255),char(215),char(3),char(12),char(1),char(228), +char(255),char(195),char(3),char(12),char(1),char(246),char(255),char(215),char(3),char(12), +char(2),char(7),char(255),char(154),char(3),char(12),char(2),char(11),char(255),char(154), +char(3),char(12),char(2),char(160),char(255),char(215),char(3),char(12),char(2),char(170), +char(255),char(195),char(3),char(12),char(2),char(182),char(255),char(195),char(3),char(12), +char(2),char(188),char(255),char(215),char(3),char(12),char(2),char(190),char(255),char(195), +char(3),char(12),char(2),char(192),char(255),char(215),char(3),char(12),char(2),char(194), +char(255),char(215),char(3),char(12),char(2),char(203),char(255),char(215),char(3),char(12), +char(2),char(213),char(255),char(215),char(3),char(12),char(2),char(230),char(255),char(215), +char(3),char(12),char(2),char(248),char(255),char(215),char(3),char(12),char(2),char(250), +char(255),char(215),char(3),char(12),char(2),char(252),char(255),char(215),char(3),char(12), +char(2),char(254),char(255),char(215),char(3),char(12),char(3),char(6),char(255),char(215), +char(3),char(12),char(3),char(8),char(255),char(215),char(3),char(12),char(3),char(14), +char(255),char(154),char(3),char(12),char(3),char(16),char(255),char(154),char(3),char(12), +char(3),char(24),char(255),char(195),char(3),char(13),char(0),char(5),char(255),char(154), +char(3),char(13),char(0),char(10),char(255),char(154),char(3),char(13),char(1),char(157), +char(255),char(174),char(3),char(13),char(1),char(166),char(255),char(174),char(3),char(13), +char(1),char(168),char(255),char(195),char(3),char(13),char(1),char(170),char(255),char(195), +char(3),char(13),char(1),char(176),char(255),char(195),char(3),char(13),char(1),char(188), +char(255),char(113),char(3),char(13),char(1),char(189),char(255),char(195),char(3),char(13), +char(1),char(191),char(255),char(195),char(3),char(13),char(1),char(193),char(255),char(195), +char(3),char(13),char(1),char(196),char(255),char(174),char(3),char(13),char(1),char(208), +char(255),char(215),char(3),char(13),char(1),char(220),char(255),char(195),char(3),char(13), +char(1),char(223),char(255),char(215),char(3),char(13),char(1),char(225),char(255),char(215), +char(3),char(13),char(1),char(228),char(255),char(195),char(3),char(13),char(2),char(7), +char(255),char(154),char(3),char(13),char(2),char(11),char(255),char(154),char(3),char(13), +char(2),char(114),char(255),char(195),char(3),char(13),char(2),char(118),char(255),char(215), +char(3),char(13),char(2),char(124),char(255),char(195),char(3),char(13),char(2),char(128), +char(255),char(195),char(3),char(13),char(2),char(130),char(255),char(195),char(3),char(13), +char(2),char(159),char(255),char(195),char(3),char(13),char(2),char(160),char(255),char(215), +char(3),char(13),char(2),char(169),char(255),char(174),char(3),char(13),char(2),char(170), +char(255),char(195),char(3),char(13),char(2),char(181),char(255),char(113),char(3),char(13), +char(2),char(182),char(255),char(195),char(3),char(13),char(2),char(183),char(255),char(195), +char(3),char(13),char(2),char(185),char(255),char(195),char(3),char(13),char(2),char(187), +char(255),char(195),char(3),char(13),char(2),char(188),char(255),char(215),char(3),char(13), +char(2),char(189),char(255),char(174),char(3),char(13),char(2),char(190),char(255),char(195), +char(3),char(13),char(2),char(191),char(255),char(195),char(3),char(13),char(2),char(192), +char(255),char(215),char(3),char(13),char(2),char(193),char(255),char(195),char(3),char(13), +char(2),char(194),char(255),char(215),char(3),char(13),char(2),char(202),char(255),char(195), +char(3),char(13),char(2),char(203),char(255),char(215),char(3),char(13),char(2),char(212), +char(255),char(195),char(3),char(13),char(2),char(213),char(255),char(215),char(3),char(13), +char(2),char(217),char(255),char(195),char(3),char(13),char(2),char(219),char(255),char(195), +char(3),char(13),char(2),char(221),char(255),char(195),char(3),char(13),char(2),char(229), +char(255),char(195),char(3),char(13),char(2),char(230),char(255),char(215),char(3),char(13), +char(2),char(247),char(255),char(195),char(3),char(13),char(2),char(249),char(255),char(195), +char(3),char(13),char(2),char(251),char(255),char(195),char(3),char(13),char(2),char(253), +char(255),char(195),char(3),char(13),char(2),char(254),char(255),char(215),char(3),char(13), +char(3),char(5),char(255),char(195),char(3),char(13),char(3),char(6),char(255),char(215), +char(3),char(13),char(3),char(7),char(255),char(195),char(3),char(13),char(3),char(8), +char(255),char(215),char(3),char(13),char(3),char(13),char(255),char(215),char(3),char(13), +char(3),char(14),char(255),char(215),char(3),char(13),char(3),char(15),char(255),char(215), +char(3),char(13),char(3),char(16),char(255),char(215),char(3),char(13),char(3),char(23), +char(255),char(174),char(3),char(13),char(3),char(24),char(255),char(195),char(3),char(14), +char(0),char(5),char(255),char(154),char(3),char(14),char(0),char(10),char(255),char(154), +char(3),char(14),char(1),char(208),char(255),char(215),char(3),char(14),char(1),char(220), +char(255),char(195),char(3),char(14),char(1),char(221),char(255),char(215),char(3),char(14), +char(1),char(223),char(255),char(215),char(3),char(14),char(1),char(225),char(255),char(215), +char(3),char(14),char(1),char(228),char(255),char(195),char(3),char(14),char(1),char(246), +char(255),char(215),char(3),char(14),char(2),char(7),char(255),char(154),char(3),char(14), +char(2),char(11),char(255),char(154),char(3),char(14),char(2),char(160),char(255),char(215), +char(3),char(14),char(2),char(170),char(255),char(195),char(3),char(14),char(2),char(182), +char(255),char(195),char(3),char(14),char(2),char(188),char(255),char(215),char(3),char(14), +char(2),char(190),char(255),char(195),char(3),char(14),char(2),char(192),char(255),char(215), +char(3),char(14),char(2),char(194),char(255),char(215),char(3),char(14),char(2),char(203), +char(255),char(215),char(3),char(14),char(2),char(213),char(255),char(215),char(3),char(14), +char(2),char(230),char(255),char(215),char(3),char(14),char(2),char(248),char(255),char(215), +char(3),char(14),char(2),char(250),char(255),char(215),char(3),char(14),char(2),char(252), +char(255),char(215),char(3),char(14),char(2),char(254),char(255),char(215),char(3),char(14), +char(3),char(6),char(255),char(215),char(3),char(14),char(3),char(8),char(255),char(215), +char(3),char(14),char(3),char(14),char(255),char(154),char(3),char(14),char(3),char(16), +char(255),char(154),char(3),char(14),char(3),char(24),char(255),char(195),char(3),char(15), +char(1),char(163),char(0),char(225),char(3),char(15),char(2),char(234),char(0),char(41), +char(3),char(15),char(3),char(14),char(255),char(215),char(3),char(15),char(3),char(16), +char(255),char(215),char(3),char(16),char(0),char(5),char(255),char(236),char(3),char(16), +char(0),char(10),char(255),char(236),char(3),char(16),char(2),char(7),char(255),char(236), +char(3),char(16),char(2),char(11),char(255),char(236),char(3),char(17),char(0),char(5), +char(255),char(154),char(3),char(17),char(0),char(10),char(255),char(154),char(3),char(17), +char(1),char(157),char(255),char(174),char(3),char(17),char(1),char(166),char(255),char(174), +char(3),char(17),char(1),char(168),char(255),char(195),char(3),char(17),char(1),char(170), +char(255),char(195),char(3),char(17),char(1),char(176),char(255),char(195),char(3),char(17), +char(1),char(188),char(255),char(113),char(3),char(17),char(1),char(189),char(255),char(195), +char(3),char(17),char(1),char(191),char(255),char(195),char(3),char(17),char(1),char(193), +char(255),char(195),char(3),char(17),char(1),char(196),char(255),char(174),char(3),char(17), +char(1),char(208),char(255),char(215),char(3),char(17),char(1),char(220),char(255),char(195), +char(3),char(17),char(1),char(223),char(255),char(215),char(3),char(17),char(1),char(225), +char(255),char(215),char(3),char(17),char(1),char(228),char(255),char(195),char(3),char(17), +char(2),char(7),char(255),char(154),char(3),char(17),char(2),char(11),char(255),char(154), +char(3),char(17),char(2),char(114),char(255),char(195),char(3),char(17),char(2),char(118), +char(255),char(215),char(3),char(17),char(2),char(124),char(255),char(195),char(3),char(17), +char(2),char(128),char(255),char(195),char(3),char(17),char(2),char(130),char(255),char(195), +char(3),char(17),char(2),char(159),char(255),char(195),char(3),char(17),char(2),char(160), +char(255),char(215),char(3),char(17),char(2),char(169),char(255),char(174),char(3),char(17), +char(2),char(170),char(255),char(195),char(3),char(17),char(2),char(181),char(255),char(113), +char(3),char(17),char(2),char(182),char(255),char(195),char(3),char(17),char(2),char(183), +char(255),char(195),char(3),char(17),char(2),char(185),char(255),char(195),char(3),char(17), +char(2),char(187),char(255),char(195),char(3),char(17),char(2),char(188),char(255),char(215), +char(3),char(17),char(2),char(189),char(255),char(174),char(3),char(17),char(2),char(190), +char(255),char(195),char(3),char(17),char(2),char(191),char(255),char(195),char(3),char(17), +char(2),char(192),char(255),char(215),char(3),char(17),char(2),char(193),char(255),char(195), +char(3),char(17),char(2),char(194),char(255),char(215),char(3),char(17),char(2),char(202), +char(255),char(195),char(3),char(17),char(2),char(203),char(255),char(215),char(3),char(17), +char(2),char(212),char(255),char(195),char(3),char(17),char(2),char(213),char(255),char(215), +char(3),char(17),char(2),char(217),char(255),char(195),char(3),char(17),char(2),char(219), +char(255),char(195),char(3),char(17),char(2),char(221),char(255),char(195),char(3),char(17), +char(2),char(229),char(255),char(195),char(3),char(17),char(2),char(230),char(255),char(215), +char(3),char(17),char(2),char(247),char(255),char(195),char(3),char(17),char(2),char(249), +char(255),char(195),char(3),char(17),char(2),char(251),char(255),char(195),char(3),char(17), +char(2),char(253),char(255),char(195),char(3),char(17),char(2),char(254),char(255),char(215), +char(3),char(17),char(3),char(5),char(255),char(195),char(3),char(17),char(3),char(6), +char(255),char(215),char(3),char(17),char(3),char(7),char(255),char(195),char(3),char(17), +char(3),char(8),char(255),char(215),char(3),char(17),char(3),char(13),char(255),char(215), +char(3),char(17),char(3),char(14),char(255),char(215),char(3),char(17),char(3),char(15), +char(255),char(215),char(3),char(17),char(3),char(16),char(255),char(215),char(3),char(17), +char(3),char(23),char(255),char(174),char(3),char(17),char(3),char(24),char(255),char(195), +char(3),char(18),char(0),char(5),char(255),char(154),char(3),char(18),char(0),char(10), +char(255),char(154),char(3),char(18),char(1),char(208),char(255),char(215),char(3),char(18), +char(1),char(220),char(255),char(195),char(3),char(18),char(1),char(221),char(255),char(215), +char(3),char(18),char(1),char(223),char(255),char(215),char(3),char(18),char(1),char(225), +char(255),char(215),char(3),char(18),char(1),char(228),char(255),char(195),char(3),char(18), +char(1),char(246),char(255),char(215),char(3),char(18),char(2),char(7),char(255),char(154), +char(3),char(18),char(2),char(11),char(255),char(154),char(3),char(18),char(2),char(160), +char(255),char(215),char(3),char(18),char(2),char(170),char(255),char(195),char(3),char(18), +char(2),char(182),char(255),char(195),char(3),char(18),char(2),char(188),char(255),char(215), +char(3),char(18),char(2),char(190),char(255),char(195),char(3),char(18),char(2),char(192), +char(255),char(215),char(3),char(18),char(2),char(194),char(255),char(215),char(3),char(18), +char(2),char(203),char(255),char(215),char(3),char(18),char(2),char(213),char(255),char(215), +char(3),char(18),char(2),char(230),char(255),char(215),char(3),char(18),char(2),char(248), +char(255),char(215),char(3),char(18),char(2),char(250),char(255),char(215),char(3),char(18), +char(2),char(252),char(255),char(215),char(3),char(18),char(2),char(254),char(255),char(215), +char(3),char(18),char(3),char(6),char(255),char(215),char(3),char(18),char(3),char(8), +char(255),char(215),char(3),char(18),char(3),char(14),char(255),char(154),char(3),char(18), +char(3),char(16),char(255),char(154),char(3),char(18),char(3),char(24),char(255),char(195), +char(3),char(19),char(0),char(5),char(255),char(154),char(3),char(19),char(0),char(10), +char(255),char(154),char(3),char(19),char(1),char(157),char(255),char(174),char(3),char(19), +char(1),char(166),char(255),char(174),char(3),char(19),char(1),char(168),char(255),char(195), +char(3),char(19),char(1),char(170),char(255),char(195),char(3),char(19),char(1),char(176), +char(255),char(195),char(3),char(19),char(1),char(188),char(255),char(113),char(3),char(19), +char(1),char(189),char(255),char(195),char(3),char(19),char(1),char(191),char(255),char(195), +char(3),char(19),char(1),char(193),char(255),char(195),char(3),char(19),char(1),char(196), +char(255),char(174),char(3),char(19),char(1),char(208),char(255),char(215),char(3),char(19), +char(1),char(220),char(255),char(195),char(3),char(19),char(1),char(223),char(255),char(215), +char(3),char(19),char(1),char(225),char(255),char(215),char(3),char(19),char(1),char(228), +char(255),char(195),char(3),char(19),char(2),char(7),char(255),char(154),char(3),char(19), +char(2),char(11),char(255),char(154),char(3),char(19),char(2),char(114),char(255),char(195), +char(3),char(19),char(2),char(118),char(255),char(215),char(3),char(19),char(2),char(124), +char(255),char(195),char(3),char(19),char(2),char(128),char(255),char(195),char(3),char(19), +char(2),char(130),char(255),char(195),char(3),char(19),char(2),char(159),char(255),char(195), +char(3),char(19),char(2),char(160),char(255),char(215),char(3),char(19),char(2),char(169), +char(255),char(174),char(3),char(19),char(2),char(170),char(255),char(195),char(3),char(19), +char(2),char(181),char(255),char(113),char(3),char(19),char(2),char(182),char(255),char(195), +char(3),char(19),char(2),char(183),char(255),char(195),char(3),char(19),char(2),char(185), +char(255),char(195),char(3),char(19),char(2),char(187),char(255),char(195),char(3),char(19), +char(2),char(188),char(255),char(215),char(3),char(19),char(2),char(189),char(255),char(174), +char(3),char(19),char(2),char(190),char(255),char(195),char(3),char(19),char(2),char(191), +char(255),char(195),char(3),char(19),char(2),char(192),char(255),char(215),char(3),char(19), +char(2),char(193),char(255),char(195),char(3),char(19),char(2),char(194),char(255),char(215), +char(3),char(19),char(2),char(202),char(255),char(195),char(3),char(19),char(2),char(203), +char(255),char(215),char(3),char(19),char(2),char(212),char(255),char(195),char(3),char(19), +char(2),char(213),char(255),char(215),char(3),char(19),char(2),char(217),char(255),char(195), +char(3),char(19),char(2),char(219),char(255),char(195),char(3),char(19),char(2),char(221), +char(255),char(195),char(3),char(19),char(2),char(229),char(255),char(195),char(3),char(19), +char(2),char(230),char(255),char(215),char(3),char(19),char(2),char(247),char(255),char(195), +char(3),char(19),char(2),char(249),char(255),char(195),char(3),char(19),char(2),char(251), +char(255),char(195),char(3),char(19),char(2),char(253),char(255),char(195),char(3),char(19), +char(2),char(254),char(255),char(215),char(3),char(19),char(3),char(5),char(255),char(195), +char(3),char(19),char(3),char(6),char(255),char(215),char(3),char(19),char(3),char(7), +char(255),char(195),char(3),char(19),char(3),char(8),char(255),char(215),char(3),char(19), +char(3),char(13),char(255),char(215),char(3),char(19),char(3),char(14),char(255),char(215), +char(3),char(19),char(3),char(15),char(255),char(215),char(3),char(19),char(3),char(16), +char(255),char(215),char(3),char(19),char(3),char(23),char(255),char(174),char(3),char(19), +char(3),char(24),char(255),char(195),char(3),char(20),char(0),char(5),char(255),char(154), +char(3),char(20),char(0),char(10),char(255),char(154),char(3),char(20),char(1),char(208), +char(255),char(215),char(3),char(20),char(1),char(220),char(255),char(195),char(3),char(20), +char(1),char(221),char(255),char(215),char(3),char(20),char(1),char(223),char(255),char(215), +char(3),char(20),char(1),char(225),char(255),char(215),char(3),char(20),char(1),char(228), +char(255),char(195),char(3),char(20),char(1),char(246),char(255),char(215),char(3),char(20), +char(2),char(7),char(255),char(154),char(3),char(20),char(2),char(11),char(255),char(154), +char(3),char(20),char(2),char(160),char(255),char(215),char(3),char(20),char(2),char(170), +char(255),char(195),char(3),char(20),char(2),char(182),char(255),char(195),char(3),char(20), +char(2),char(188),char(255),char(215),char(3),char(20),char(2),char(190),char(255),char(195), +char(3),char(20),char(2),char(192),char(255),char(215),char(3),char(20),char(2),char(194), +char(255),char(215),char(3),char(20),char(2),char(203),char(255),char(215),char(3),char(20), +char(2),char(213),char(255),char(215),char(3),char(20),char(2),char(230),char(255),char(215), +char(3),char(20),char(2),char(248),char(255),char(215),char(3),char(20),char(2),char(250), +char(255),char(215),char(3),char(20),char(2),char(252),char(255),char(215),char(3),char(20), +char(2),char(254),char(255),char(215),char(3),char(20),char(3),char(6),char(255),char(215), +char(3),char(20),char(3),char(8),char(255),char(215),char(3),char(20),char(3),char(14), +char(255),char(154),char(3),char(20),char(3),char(16),char(255),char(154),char(3),char(20), +char(3),char(24),char(255),char(195),char(3),char(21),char(0),char(15),char(255),char(174), +char(3),char(21),char(0),char(17),char(255),char(174),char(3),char(21),char(1),char(170), +char(255),char(236),char(3),char(21),char(1),char(176),char(255),char(215),char(3),char(21), +char(1),char(188),char(255),char(215),char(3),char(21),char(1),char(191),char(255),char(215), +char(3),char(21),char(2),char(8),char(255),char(174),char(3),char(21),char(2),char(12), +char(255),char(174),char(3),char(21),char(2),char(114),char(255),char(236),char(3),char(21), +char(2),char(128),char(255),char(236),char(3),char(21),char(2),char(130),char(255),char(236), +char(3),char(21),char(2),char(159),char(255),char(215),char(3),char(21),char(2),char(181), +char(255),char(215),char(3),char(21),char(2),char(183),char(255),char(236),char(3),char(21), +char(2),char(185),char(255),char(236),char(3),char(21),char(2),char(187),char(255),char(215), +char(3),char(21),char(2),char(202),char(255),char(215),char(3),char(21),char(2),char(217), +char(255),char(236),char(3),char(21),char(2),char(219),char(255),char(236),char(3),char(21), +char(2),char(221),char(255),char(236),char(3),char(21),char(2),char(229),char(255),char(215), +char(3),char(21),char(3),char(5),char(255),char(215),char(3),char(21),char(3),char(7), +char(255),char(215),char(3),char(22),char(0),char(5),char(255),char(215),char(3),char(22), +char(0),char(10),char(255),char(215),char(3),char(22),char(1),char(208),char(255),char(236), +char(3),char(22),char(1),char(221),char(255),char(236),char(3),char(22),char(1),char(223), +char(255),char(236),char(3),char(22),char(1),char(246),char(255),char(236),char(3),char(22), +char(2),char(7),char(255),char(215),char(3),char(22),char(2),char(11),char(255),char(215), +char(3),char(22),char(2),char(160),char(255),char(236),char(3),char(22),char(2),char(188), +char(255),char(236),char(3),char(22),char(2),char(203),char(255),char(236),char(3),char(22), +char(2),char(230),char(255),char(236),char(3),char(22),char(2),char(248),char(255),char(236), +char(3),char(22),char(2),char(250),char(255),char(236),char(3),char(22),char(2),char(252), +char(255),char(236),char(3),char(22),char(3),char(6),char(255),char(236),char(3),char(22), +char(3),char(8),char(255),char(236),char(3),char(22),char(3),char(14),char(255),char(215), +char(3),char(22),char(3),char(16),char(255),char(215),char(3),char(23),char(0),char(5), +char(255),char(174),char(3),char(23),char(0),char(10),char(255),char(174),char(3),char(23), +char(1),char(157),char(255),char(195),char(3),char(23),char(1),char(166),char(255),char(195), +char(3),char(23),char(1),char(170),char(255),char(215),char(3),char(23),char(1),char(176), +char(255),char(215),char(3),char(23),char(1),char(188),char(255),char(195),char(3),char(23), +char(1),char(191),char(255),char(215),char(3),char(23),char(1),char(193),char(255),char(215), +char(3),char(23),char(1),char(196),char(255),char(195),char(3),char(23),char(1),char(220), +char(255),char(215),char(3),char(23),char(1),char(228),char(255),char(215),char(3),char(23), +char(2),char(7),char(255),char(174),char(3),char(23),char(2),char(11),char(255),char(174), +char(3),char(23),char(2),char(114),char(255),char(215),char(3),char(23),char(2),char(124), +char(255),char(215),char(3),char(23),char(2),char(128),char(255),char(215),char(3),char(23), +char(2),char(130),char(255),char(215),char(3),char(23),char(2),char(159),char(255),char(215), +char(3),char(23),char(2),char(169),char(255),char(195),char(3),char(23),char(2),char(170), +char(255),char(215),char(3),char(23),char(2),char(181),char(255),char(195),char(3),char(23), +char(2),char(182),char(255),char(215),char(3),char(23),char(2),char(183),char(255),char(215), +char(3),char(23),char(2),char(185),char(255),char(215),char(3),char(23),char(2),char(187), +char(255),char(215),char(3),char(23),char(2),char(189),char(255),char(195),char(3),char(23), +char(2),char(190),char(255),char(215),char(3),char(23),char(2),char(191),char(255),char(215), +char(3),char(23),char(2),char(193),char(255),char(215),char(3),char(23),char(2),char(202), +char(255),char(215),char(3),char(23),char(2),char(212),char(255),char(215),char(3),char(23), +char(2),char(217),char(255),char(215),char(3),char(23),char(2),char(219),char(255),char(215), +char(3),char(23),char(2),char(221),char(255),char(215),char(3),char(23),char(2),char(229), +char(255),char(215),char(3),char(23),char(2),char(253),char(255),char(215),char(3),char(23), +char(3),char(5),char(255),char(215),char(3),char(23),char(3),char(7),char(255),char(215), +char(3),char(23),char(3),char(13),char(255),char(215),char(3),char(23),char(3),char(15), +char(255),char(215),char(3),char(23),char(3),char(23),char(255),char(195),char(3),char(23), +char(3),char(24),char(255),char(215),char(3),char(24),char(0),char(5),char(255),char(154), +char(3),char(24),char(0),char(10),char(255),char(154),char(3),char(24),char(1),char(208), +char(255),char(215),char(3),char(24),char(1),char(220),char(255),char(195),char(3),char(24), +char(1),char(221),char(255),char(215),char(3),char(24),char(1),char(223),char(255),char(215), +char(3),char(24),char(1),char(225),char(255),char(215),char(3),char(24),char(1),char(228), +char(255),char(195),char(3),char(24),char(1),char(246),char(255),char(215),char(3),char(24), +char(2),char(7),char(255),char(154),char(3),char(24),char(2),char(11),char(255),char(154), +char(3),char(24),char(2),char(160),char(255),char(215),char(3),char(24),char(2),char(170), +char(255),char(195),char(3),char(24),char(2),char(182),char(255),char(195),char(3),char(24), +char(2),char(188),char(255),char(215),char(3),char(24),char(2),char(190),char(255),char(195), +char(3),char(24),char(2),char(192),char(255),char(215),char(3),char(24),char(2),char(194), +char(255),char(215),char(3),char(24),char(2),char(203),char(255),char(215),char(3),char(24), +char(2),char(213),char(255),char(215),char(3),char(24),char(2),char(230),char(255),char(215), +char(3),char(24),char(2),char(248),char(255),char(215),char(3),char(24),char(2),char(250), +char(255),char(215),char(3),char(24),char(2),char(252),char(255),char(215),char(3),char(24), +char(2),char(254),char(255),char(215),char(3),char(24),char(3),char(6),char(255),char(215), +char(3),char(24),char(3),char(8),char(255),char(215),char(3),char(24),char(3),char(14), +char(255),char(154),char(3),char(24),char(3),char(16),char(255),char(154),char(3),char(24), +char(3),char(24),char(255),char(195),char(3),char(25),char(1),char(225),char(255),char(215), +char(3),char(25),char(2),char(192),char(255),char(215),char(3),char(25),char(2),char(194), +char(255),char(215),char(3),char(25),char(2),char(213),char(255),char(215),char(3),char(25), +char(2),char(254),char(255),char(215),char(3),char(27),char(1),char(163),char(0),char(225), +char(3),char(27),char(2),char(234),char(0),char(41),char(3),char(27),char(3),char(14), +char(255),char(215),char(3),char(27),char(3),char(16),char(255),char(215),char(3),char(28), +char(0),char(5),char(255),char(236),char(3),char(28),char(0),char(10),char(255),char(236), +char(3),char(28),char(2),char(7),char(255),char(236),char(3),char(28),char(2),char(11), +char(255),char(236),char(3),char(29),char(0),char(5),char(255),char(113),char(3),char(29), +char(0),char(10),char(255),char(113),char(3),char(29),char(0),char(38),char(255),char(215), +char(3),char(29),char(0),char(42),char(255),char(215),char(3),char(29),char(0),char(45), +char(1),char(10),char(3),char(29),char(0),char(50),char(255),char(215),char(3),char(29), +char(0),char(52),char(255),char(215),char(3),char(29),char(0),char(55),char(255),char(113), +char(3),char(29),char(0),char(57),char(255),char(174),char(3),char(29),char(0),char(58), +char(255),char(174),char(3),char(29),char(0),char(60),char(255),char(133),char(3),char(29), +char(0),char(137),char(255),char(215),char(3),char(29),char(0),char(148),char(255),char(215), +char(3),char(29),char(0),char(149),char(255),char(215),char(3),char(29),char(0),char(150), +char(255),char(215),char(3),char(29),char(0),char(151),char(255),char(215),char(3),char(29), +char(0),char(152),char(255),char(215),char(3),char(29),char(0),char(154),char(255),char(215), +char(3),char(29),char(0),char(159),char(255),char(133),char(3),char(29),char(0),char(200), +char(255),char(215),char(3),char(29),char(0),char(202),char(255),char(215),char(3),char(29), +char(0),char(204),char(255),char(215),char(3),char(29),char(0),char(206),char(255),char(215), +char(3),char(29),char(0),char(222),char(255),char(215),char(3),char(29),char(0),char(224), +char(255),char(215),char(3),char(29),char(0),char(226),char(255),char(215),char(3),char(29), +char(0),char(228),char(255),char(215),char(3),char(29),char(1),char(14),char(255),char(215), +char(3),char(29),char(1),char(16),char(255),char(215),char(3),char(29),char(1),char(18), +char(255),char(215),char(3),char(29),char(1),char(20),char(255),char(215),char(3),char(29), +char(1),char(36),char(255),char(113),char(3),char(29),char(1),char(38),char(255),char(113), +char(3),char(29),char(1),char(54),char(255),char(174),char(3),char(29),char(1),char(56), +char(255),char(133),char(3),char(29),char(1),char(58),char(255),char(133),char(3),char(29), +char(1),char(71),char(255),char(215),char(3),char(29),char(1),char(250),char(255),char(174), +char(3),char(29),char(1),char(252),char(255),char(174),char(3),char(29),char(1),char(254), +char(255),char(174),char(3),char(29),char(2),char(0),char(255),char(133),char(3),char(29), +char(2),char(7),char(255),char(113),char(3),char(29),char(2),char(11),char(255),char(113), +char(3),char(29),char(2),char(95),char(255),char(215),char(3),char(29),char(3),char(73), +char(255),char(215),char(3),char(29),char(3),char(75),char(255),char(215),char(3),char(29), +char(3),char(77),char(255),char(215),char(3),char(29),char(3),char(79),char(255),char(215), +char(3),char(29),char(3),char(81),char(255),char(215),char(3),char(29),char(3),char(83), +char(255),char(215),char(3),char(29),char(3),char(85),char(255),char(215),char(3),char(29), +char(3),char(87),char(255),char(215),char(3),char(29),char(3),char(89),char(255),char(215), +char(3),char(29),char(3),char(91),char(255),char(215),char(3),char(29),char(3),char(93), +char(255),char(215),char(3),char(29),char(3),char(95),char(255),char(215),char(3),char(29), +char(3),char(111),char(255),char(133),char(3),char(29),char(3),char(113),char(255),char(133), +char(3),char(29),char(3),char(115),char(255),char(133),char(3),char(29),char(3),char(143), +char(255),char(113),char(3),char(30),char(0),char(5),char(255),char(236),char(3),char(30), +char(0),char(10),char(255),char(236),char(3),char(30),char(2),char(7),char(255),char(236), +char(3),char(30),char(2),char(11),char(255),char(236),char(3),char(31),char(0),char(5), +char(255),char(113),char(3),char(31),char(0),char(10),char(255),char(113),char(3),char(31), +char(0),char(38),char(255),char(215),char(3),char(31),char(0),char(42),char(255),char(215), +char(3),char(31),char(0),char(45),char(1),char(10),char(3),char(31),char(0),char(50), +char(255),char(215),char(3),char(31),char(0),char(52),char(255),char(215),char(3),char(31), +char(0),char(55),char(255),char(113),char(3),char(31),char(0),char(57),char(255),char(174), +char(3),char(31),char(0),char(58),char(255),char(174),char(3),char(31),char(0),char(60), +char(255),char(133),char(3),char(31),char(0),char(137),char(255),char(215),char(3),char(31), +char(0),char(148),char(255),char(215),char(3),char(31),char(0),char(149),char(255),char(215), +char(3),char(31),char(0),char(150),char(255),char(215),char(3),char(31),char(0),char(151), +char(255),char(215),char(3),char(31),char(0),char(152),char(255),char(215),char(3),char(31), +char(0),char(154),char(255),char(215),char(3),char(31),char(0),char(159),char(255),char(133), +char(3),char(31),char(0),char(200),char(255),char(215),char(3),char(31),char(0),char(202), +char(255),char(215),char(3),char(31),char(0),char(204),char(255),char(215),char(3),char(31), +char(0),char(206),char(255),char(215),char(3),char(31),char(0),char(222),char(255),char(215), +char(3),char(31),char(0),char(224),char(255),char(215),char(3),char(31),char(0),char(226), +char(255),char(215),char(3),char(31),char(0),char(228),char(255),char(215),char(3),char(31), +char(1),char(14),char(255),char(215),char(3),char(31),char(1),char(16),char(255),char(215), +char(3),char(31),char(1),char(18),char(255),char(215),char(3),char(31),char(1),char(20), +char(255),char(215),char(3),char(31),char(1),char(36),char(255),char(113),char(3),char(31), +char(1),char(38),char(255),char(113),char(3),char(31),char(1),char(54),char(255),char(174), +char(3),char(31),char(1),char(56),char(255),char(133),char(3),char(31),char(1),char(58), +char(255),char(133),char(3),char(31),char(1),char(71),char(255),char(215),char(3),char(31), +char(1),char(250),char(255),char(174),char(3),char(31),char(1),char(252),char(255),char(174), +char(3),char(31),char(1),char(254),char(255),char(174),char(3),char(31),char(2),char(0), +char(255),char(133),char(3),char(31),char(2),char(7),char(255),char(113),char(3),char(31), +char(2),char(11),char(255),char(113),char(3),char(31),char(2),char(95),char(255),char(215), +char(3),char(31),char(3),char(73),char(255),char(215),char(3),char(31),char(3),char(75), +char(255),char(215),char(3),char(31),char(3),char(77),char(255),char(215),char(3),char(31), +char(3),char(79),char(255),char(215),char(3),char(31),char(3),char(81),char(255),char(215), +char(3),char(31),char(3),char(83),char(255),char(215),char(3),char(31),char(3),char(85), +char(255),char(215),char(3),char(31),char(3),char(87),char(255),char(215),char(3),char(31), +char(3),char(89),char(255),char(215),char(3),char(31),char(3),char(91),char(255),char(215), +char(3),char(31),char(3),char(93),char(255),char(215),char(3),char(31),char(3),char(95), +char(255),char(215),char(3),char(31),char(3),char(111),char(255),char(133),char(3),char(31), +char(3),char(113),char(255),char(133),char(3),char(31),char(3),char(115),char(255),char(133), +char(3),char(31),char(3),char(143),char(255),char(113),char(3),char(32),char(0),char(5), +char(255),char(236),char(3),char(32),char(0),char(10),char(255),char(236),char(3),char(32), +char(2),char(7),char(255),char(236),char(3),char(32),char(2),char(11),char(255),char(236), +char(3),char(33),char(0),char(5),char(255),char(113),char(3),char(33),char(0),char(10), +char(255),char(113),char(3),char(33),char(0),char(38),char(255),char(215),char(3),char(33), +char(0),char(42),char(255),char(215),char(3),char(33),char(0),char(45),char(1),char(10), +char(3),char(33),char(0),char(50),char(255),char(215),char(3),char(33),char(0),char(52), +char(255),char(215),char(3),char(33),char(0),char(55),char(255),char(113),char(3),char(33), +char(0),char(57),char(255),char(174),char(3),char(33),char(0),char(58),char(255),char(174), +char(3),char(33),char(0),char(60),char(255),char(133),char(3),char(33),char(0),char(137), +char(255),char(215),char(3),char(33),char(0),char(148),char(255),char(215),char(3),char(33), +char(0),char(149),char(255),char(215),char(3),char(33),char(0),char(150),char(255),char(215), +char(3),char(33),char(0),char(151),char(255),char(215),char(3),char(33),char(0),char(152), +char(255),char(215),char(3),char(33),char(0),char(154),char(255),char(215),char(3),char(33), +char(0),char(159),char(255),char(133),char(3),char(33),char(0),char(200),char(255),char(215), +char(3),char(33),char(0),char(202),char(255),char(215),char(3),char(33),char(0),char(204), +char(255),char(215),char(3),char(33),char(0),char(206),char(255),char(215),char(3),char(33), +char(0),char(222),char(255),char(215),char(3),char(33),char(0),char(224),char(255),char(215), +char(3),char(33),char(0),char(226),char(255),char(215),char(3),char(33),char(0),char(228), +char(255),char(215),char(3),char(33),char(1),char(14),char(255),char(215),char(3),char(33), +char(1),char(16),char(255),char(215),char(3),char(33),char(1),char(18),char(255),char(215), +char(3),char(33),char(1),char(20),char(255),char(215),char(3),char(33),char(1),char(36), +char(255),char(113),char(3),char(33),char(1),char(38),char(255),char(113),char(3),char(33), +char(1),char(54),char(255),char(174),char(3),char(33),char(1),char(56),char(255),char(133), +char(3),char(33),char(1),char(58),char(255),char(133),char(3),char(33),char(1),char(71), +char(255),char(215),char(3),char(33),char(1),char(250),char(255),char(174),char(3),char(33), +char(1),char(252),char(255),char(174),char(3),char(33),char(1),char(254),char(255),char(174), +char(3),char(33),char(2),char(0),char(255),char(133),char(3),char(33),char(2),char(7), +char(255),char(113),char(3),char(33),char(2),char(11),char(255),char(113),char(3),char(33), +char(2),char(95),char(255),char(215),char(3),char(33),char(3),char(73),char(255),char(215), +char(3),char(33),char(3),char(75),char(255),char(215),char(3),char(33),char(3),char(77), +char(255),char(215),char(3),char(33),char(3),char(79),char(255),char(215),char(3),char(33), +char(3),char(81),char(255),char(215),char(3),char(33),char(3),char(83),char(255),char(215), +char(3),char(33),char(3),char(85),char(255),char(215),char(3),char(33),char(3),char(87), +char(255),char(215),char(3),char(33),char(3),char(89),char(255),char(215),char(3),char(33), +char(3),char(91),char(255),char(215),char(3),char(33),char(3),char(93),char(255),char(215), +char(3),char(33),char(3),char(95),char(255),char(215),char(3),char(33),char(3),char(111), +char(255),char(133),char(3),char(33),char(3),char(113),char(255),char(133),char(3),char(33), +char(3),char(115),char(255),char(133),char(3),char(33),char(3),char(143),char(255),char(113), +char(3),char(34),char(0),char(5),char(255),char(236),char(3),char(34),char(0),char(10), +char(255),char(236),char(3),char(34),char(2),char(7),char(255),char(236),char(3),char(34), +char(2),char(11),char(255),char(236),char(3),char(35),char(0),char(5),char(255),char(113), +char(3),char(35),char(0),char(10),char(255),char(113),char(3),char(35),char(0),char(38), +char(255),char(215),char(3),char(35),char(0),char(42),char(255),char(215),char(3),char(35), +char(0),char(45),char(1),char(10),char(3),char(35),char(0),char(50),char(255),char(215), +char(3),char(35),char(0),char(52),char(255),char(215),char(3),char(35),char(0),char(55), +char(255),char(113),char(3),char(35),char(0),char(57),char(255),char(174),char(3),char(35), +char(0),char(58),char(255),char(174),char(3),char(35),char(0),char(60),char(255),char(133), +char(3),char(35),char(0),char(137),char(255),char(215),char(3),char(35),char(0),char(148), +char(255),char(215),char(3),char(35),char(0),char(149),char(255),char(215),char(3),char(35), +char(0),char(150),char(255),char(215),char(3),char(35),char(0),char(151),char(255),char(215), +char(3),char(35),char(0),char(152),char(255),char(215),char(3),char(35),char(0),char(154), +char(255),char(215),char(3),char(35),char(0),char(159),char(255),char(133),char(3),char(35), +char(0),char(200),char(255),char(215),char(3),char(35),char(0),char(202),char(255),char(215), +char(3),char(35),char(0),char(204),char(255),char(215),char(3),char(35),char(0),char(206), +char(255),char(215),char(3),char(35),char(0),char(222),char(255),char(215),char(3),char(35), +char(0),char(224),char(255),char(215),char(3),char(35),char(0),char(226),char(255),char(215), +char(3),char(35),char(0),char(228),char(255),char(215),char(3),char(35),char(1),char(14), +char(255),char(215),char(3),char(35),char(1),char(16),char(255),char(215),char(3),char(35), +char(1),char(18),char(255),char(215),char(3),char(35),char(1),char(20),char(255),char(215), +char(3),char(35),char(1),char(36),char(255),char(113),char(3),char(35),char(1),char(38), +char(255),char(113),char(3),char(35),char(1),char(54),char(255),char(174),char(3),char(35), +char(1),char(56),char(255),char(133),char(3),char(35),char(1),char(58),char(255),char(133), +char(3),char(35),char(1),char(71),char(255),char(215),char(3),char(35),char(1),char(250), +char(255),char(174),char(3),char(35),char(1),char(252),char(255),char(174),char(3),char(35), +char(1),char(254),char(255),char(174),char(3),char(35),char(2),char(0),char(255),char(133), +char(3),char(35),char(2),char(7),char(255),char(113),char(3),char(35),char(2),char(11), +char(255),char(113),char(3),char(35),char(2),char(95),char(255),char(215),char(3),char(35), +char(3),char(73),char(255),char(215),char(3),char(35),char(3),char(75),char(255),char(215), +char(3),char(35),char(3),char(77),char(255),char(215),char(3),char(35),char(3),char(79), +char(255),char(215),char(3),char(35),char(3),char(81),char(255),char(215),char(3),char(35), +char(3),char(83),char(255),char(215),char(3),char(35),char(3),char(85),char(255),char(215), +char(3),char(35),char(3),char(87),char(255),char(215),char(3),char(35),char(3),char(89), +char(255),char(215),char(3),char(35),char(3),char(91),char(255),char(215),char(3),char(35), +char(3),char(93),char(255),char(215),char(3),char(35),char(3),char(95),char(255),char(215), +char(3),char(35),char(3),char(111),char(255),char(133),char(3),char(35),char(3),char(113), +char(255),char(133),char(3),char(35),char(3),char(115),char(255),char(133),char(3),char(35), +char(3),char(143),char(255),char(113),char(3),char(36),char(0),char(5),char(255),char(236), +char(3),char(36),char(0),char(10),char(255),char(236),char(3),char(36),char(2),char(7), +char(255),char(236),char(3),char(36),char(2),char(11),char(255),char(236),char(3),char(37), +char(0),char(5),char(255),char(113),char(3),char(37),char(0),char(10),char(255),char(113), +char(3),char(37),char(0),char(38),char(255),char(215),char(3),char(37),char(0),char(42), +char(255),char(215),char(3),char(37),char(0),char(45),char(1),char(10),char(3),char(37), +char(0),char(50),char(255),char(215),char(3),char(37),char(0),char(52),char(255),char(215), +char(3),char(37),char(0),char(55),char(255),char(113),char(3),char(37),char(0),char(57), +char(255),char(174),char(3),char(37),char(0),char(58),char(255),char(174),char(3),char(37), +char(0),char(60),char(255),char(133),char(3),char(37),char(0),char(137),char(255),char(215), +char(3),char(37),char(0),char(148),char(255),char(215),char(3),char(37),char(0),char(149), +char(255),char(215),char(3),char(37),char(0),char(150),char(255),char(215),char(3),char(37), +char(0),char(151),char(255),char(215),char(3),char(37),char(0),char(152),char(255),char(215), +char(3),char(37),char(0),char(154),char(255),char(215),char(3),char(37),char(0),char(159), +char(255),char(133),char(3),char(37),char(0),char(200),char(255),char(215),char(3),char(37), +char(0),char(202),char(255),char(215),char(3),char(37),char(0),char(204),char(255),char(215), +char(3),char(37),char(0),char(206),char(255),char(215),char(3),char(37),char(0),char(222), +char(255),char(215),char(3),char(37),char(0),char(224),char(255),char(215),char(3),char(37), +char(0),char(226),char(255),char(215),char(3),char(37),char(0),char(228),char(255),char(215), +char(3),char(37),char(1),char(14),char(255),char(215),char(3),char(37),char(1),char(16), +char(255),char(215),char(3),char(37),char(1),char(18),char(255),char(215),char(3),char(37), +char(1),char(20),char(255),char(215),char(3),char(37),char(1),char(36),char(255),char(113), +char(3),char(37),char(1),char(38),char(255),char(113),char(3),char(37),char(1),char(54), +char(255),char(174),char(3),char(37),char(1),char(56),char(255),char(133),char(3),char(37), +char(1),char(58),char(255),char(133),char(3),char(37),char(1),char(71),char(255),char(215), +char(3),char(37),char(1),char(250),char(255),char(174),char(3),char(37),char(1),char(252), +char(255),char(174),char(3),char(37),char(1),char(254),char(255),char(174),char(3),char(37), +char(2),char(0),char(255),char(133),char(3),char(37),char(2),char(7),char(255),char(113), +char(3),char(37),char(2),char(11),char(255),char(113),char(3),char(37),char(2),char(95), +char(255),char(215),char(3),char(37),char(3),char(73),char(255),char(215),char(3),char(37), +char(3),char(75),char(255),char(215),char(3),char(37),char(3),char(77),char(255),char(215), +char(3),char(37),char(3),char(79),char(255),char(215),char(3),char(37),char(3),char(81), +char(255),char(215),char(3),char(37),char(3),char(83),char(255),char(215),char(3),char(37), +char(3),char(85),char(255),char(215),char(3),char(37),char(3),char(87),char(255),char(215), +char(3),char(37),char(3),char(89),char(255),char(215),char(3),char(37),char(3),char(91), +char(255),char(215),char(3),char(37),char(3),char(93),char(255),char(215),char(3),char(37), +char(3),char(95),char(255),char(215),char(3),char(37),char(3),char(111),char(255),char(133), +char(3),char(37),char(3),char(113),char(255),char(133),char(3),char(37),char(3),char(115), +char(255),char(133),char(3),char(37),char(3),char(143),char(255),char(113),char(3),char(38), +char(0),char(5),char(255),char(236),char(3),char(38),char(0),char(10),char(255),char(236), +char(3),char(38),char(2),char(7),char(255),char(236),char(3),char(38),char(2),char(11), +char(255),char(236),char(3),char(39),char(0),char(5),char(255),char(113),char(3),char(39), +char(0),char(10),char(255),char(113),char(3),char(39),char(0),char(38),char(255),char(215), +char(3),char(39),char(0),char(42),char(255),char(215),char(3),char(39),char(0),char(45), +char(1),char(10),char(3),char(39),char(0),char(50),char(255),char(215),char(3),char(39), +char(0),char(52),char(255),char(215),char(3),char(39),char(0),char(55),char(255),char(113), +char(3),char(39),char(0),char(57),char(255),char(174),char(3),char(39),char(0),char(58), +char(255),char(174),char(3),char(39),char(0),char(60),char(255),char(133),char(3),char(39), +char(0),char(137),char(255),char(215),char(3),char(39),char(0),char(148),char(255),char(215), +char(3),char(39),char(0),char(149),char(255),char(215),char(3),char(39),char(0),char(150), +char(255),char(215),char(3),char(39),char(0),char(151),char(255),char(215),char(3),char(39), +char(0),char(152),char(255),char(215),char(3),char(39),char(0),char(154),char(255),char(215), +char(3),char(39),char(0),char(159),char(255),char(133),char(3),char(39),char(0),char(200), +char(255),char(215),char(3),char(39),char(0),char(202),char(255),char(215),char(3),char(39), +char(0),char(204),char(255),char(215),char(3),char(39),char(0),char(206),char(255),char(215), +char(3),char(39),char(0),char(222),char(255),char(215),char(3),char(39),char(0),char(224), +char(255),char(215),char(3),char(39),char(0),char(226),char(255),char(215),char(3),char(39), +char(0),char(228),char(255),char(215),char(3),char(39),char(1),char(14),char(255),char(215), +char(3),char(39),char(1),char(16),char(255),char(215),char(3),char(39),char(1),char(18), +char(255),char(215),char(3),char(39),char(1),char(20),char(255),char(215),char(3),char(39), +char(1),char(36),char(255),char(113),char(3),char(39),char(1),char(38),char(255),char(113), +char(3),char(39),char(1),char(54),char(255),char(174),char(3),char(39),char(1),char(56), +char(255),char(133),char(3),char(39),char(1),char(58),char(255),char(133),char(3),char(39), +char(1),char(71),char(255),char(215),char(3),char(39),char(1),char(250),char(255),char(174), +char(3),char(39),char(1),char(252),char(255),char(174),char(3),char(39),char(1),char(254), +char(255),char(174),char(3),char(39),char(2),char(0),char(255),char(133),char(3),char(39), +char(2),char(7),char(255),char(113),char(3),char(39),char(2),char(11),char(255),char(113), +char(3),char(39),char(2),char(95),char(255),char(215),char(3),char(39),char(3),char(73), +char(255),char(215),char(3),char(39),char(3),char(75),char(255),char(215),char(3),char(39), +char(3),char(77),char(255),char(215),char(3),char(39),char(3),char(79),char(255),char(215), +char(3),char(39),char(3),char(81),char(255),char(215),char(3),char(39),char(3),char(83), +char(255),char(215),char(3),char(39),char(3),char(85),char(255),char(215),char(3),char(39), +char(3),char(87),char(255),char(215),char(3),char(39),char(3),char(89),char(255),char(215), +char(3),char(39),char(3),char(91),char(255),char(215),char(3),char(39),char(3),char(93), +char(255),char(215),char(3),char(39),char(3),char(95),char(255),char(215),char(3),char(39), +char(3),char(111),char(255),char(133),char(3),char(39),char(3),char(113),char(255),char(133), +char(3),char(39),char(3),char(115),char(255),char(133),char(3),char(39),char(3),char(143), +char(255),char(113),char(3),char(40),char(0),char(5),char(255),char(236),char(3),char(40), +char(0),char(10),char(255),char(236),char(3),char(40),char(2),char(7),char(255),char(236), +char(3),char(40),char(2),char(11),char(255),char(236),char(3),char(41),char(0),char(5), +char(255),char(113),char(3),char(41),char(0),char(10),char(255),char(113),char(3),char(41), +char(0),char(38),char(255),char(215),char(3),char(41),char(0),char(42),char(255),char(215), +char(3),char(41),char(0),char(45),char(1),char(10),char(3),char(41),char(0),char(50), +char(255),char(215),char(3),char(41),char(0),char(52),char(255),char(215),char(3),char(41), +char(0),char(55),char(255),char(113),char(3),char(41),char(0),char(57),char(255),char(174), +char(3),char(41),char(0),char(58),char(255),char(174),char(3),char(41),char(0),char(60), +char(255),char(133),char(3),char(41),char(0),char(137),char(255),char(215),char(3),char(41), +char(0),char(148),char(255),char(215),char(3),char(41),char(0),char(149),char(255),char(215), +char(3),char(41),char(0),char(150),char(255),char(215),char(3),char(41),char(0),char(151), +char(255),char(215),char(3),char(41),char(0),char(152),char(255),char(215),char(3),char(41), +char(0),char(154),char(255),char(215),char(3),char(41),char(0),char(159),char(255),char(133), +char(3),char(41),char(0),char(200),char(255),char(215),char(3),char(41),char(0),char(202), +char(255),char(215),char(3),char(41),char(0),char(204),char(255),char(215),char(3),char(41), +char(0),char(206),char(255),char(215),char(3),char(41),char(0),char(222),char(255),char(215), +char(3),char(41),char(0),char(224),char(255),char(215),char(3),char(41),char(0),char(226), +char(255),char(215),char(3),char(41),char(0),char(228),char(255),char(215),char(3),char(41), +char(1),char(14),char(255),char(215),char(3),char(41),char(1),char(16),char(255),char(215), +char(3),char(41),char(1),char(18),char(255),char(215),char(3),char(41),char(1),char(20), +char(255),char(215),char(3),char(41),char(1),char(36),char(255),char(113),char(3),char(41), +char(1),char(38),char(255),char(113),char(3),char(41),char(1),char(54),char(255),char(174), +char(3),char(41),char(1),char(56),char(255),char(133),char(3),char(41),char(1),char(58), +char(255),char(133),char(3),char(41),char(1),char(71),char(255),char(215),char(3),char(41), +char(1),char(250),char(255),char(174),char(3),char(41),char(1),char(252),char(255),char(174), +char(3),char(41),char(1),char(254),char(255),char(174),char(3),char(41),char(2),char(0), +char(255),char(133),char(3),char(41),char(2),char(7),char(255),char(113),char(3),char(41), +char(2),char(11),char(255),char(113),char(3),char(41),char(2),char(95),char(255),char(215), +char(3),char(41),char(3),char(73),char(255),char(215),char(3),char(41),char(3),char(75), +char(255),char(215),char(3),char(41),char(3),char(77),char(255),char(215),char(3),char(41), +char(3),char(79),char(255),char(215),char(3),char(41),char(3),char(81),char(255),char(215), +char(3),char(41),char(3),char(83),char(255),char(215),char(3),char(41),char(3),char(85), +char(255),char(215),char(3),char(41),char(3),char(87),char(255),char(215),char(3),char(41), +char(3),char(89),char(255),char(215),char(3),char(41),char(3),char(91),char(255),char(215), +char(3),char(41),char(3),char(93),char(255),char(215),char(3),char(41),char(3),char(95), +char(255),char(215),char(3),char(41),char(3),char(111),char(255),char(133),char(3),char(41), +char(3),char(113),char(255),char(133),char(3),char(41),char(3),char(115),char(255),char(133), +char(3),char(41),char(3),char(143),char(255),char(113),char(3),char(42),char(0),char(5), +char(255),char(236),char(3),char(42),char(0),char(10),char(255),char(236),char(3),char(42), +char(2),char(7),char(255),char(236),char(3),char(42),char(2),char(11),char(255),char(236), +char(3),char(43),char(0),char(5),char(255),char(113),char(3),char(43),char(0),char(10), +char(255),char(113),char(3),char(43),char(0),char(38),char(255),char(215),char(3),char(43), +char(0),char(42),char(255),char(215),char(3),char(43),char(0),char(45),char(1),char(10), +char(3),char(43),char(0),char(50),char(255),char(215),char(3),char(43),char(0),char(52), +char(255),char(215),char(3),char(43),char(0),char(55),char(255),char(113),char(3),char(43), +char(0),char(57),char(255),char(174),char(3),char(43),char(0),char(58),char(255),char(174), +char(3),char(43),char(0),char(60),char(255),char(133),char(3),char(43),char(0),char(137), +char(255),char(215),char(3),char(43),char(0),char(148),char(255),char(215),char(3),char(43), +char(0),char(149),char(255),char(215),char(3),char(43),char(0),char(150),char(255),char(215), +char(3),char(43),char(0),char(151),char(255),char(215),char(3),char(43),char(0),char(152), +char(255),char(215),char(3),char(43),char(0),char(154),char(255),char(215),char(3),char(43), +char(0),char(159),char(255),char(133),char(3),char(43),char(0),char(200),char(255),char(215), +char(3),char(43),char(0),char(202),char(255),char(215),char(3),char(43),char(0),char(204), +char(255),char(215),char(3),char(43),char(0),char(206),char(255),char(215),char(3),char(43), +char(0),char(222),char(255),char(215),char(3),char(43),char(0),char(224),char(255),char(215), +char(3),char(43),char(0),char(226),char(255),char(215),char(3),char(43),char(0),char(228), +char(255),char(215),char(3),char(43),char(1),char(14),char(255),char(215),char(3),char(43), +char(1),char(16),char(255),char(215),char(3),char(43),char(1),char(18),char(255),char(215), +char(3),char(43),char(1),char(20),char(255),char(215),char(3),char(43),char(1),char(36), +char(255),char(113),char(3),char(43),char(1),char(38),char(255),char(113),char(3),char(43), +char(1),char(54),char(255),char(174),char(3),char(43),char(1),char(56),char(255),char(133), +char(3),char(43),char(1),char(58),char(255),char(133),char(3),char(43),char(1),char(71), +char(255),char(215),char(3),char(43),char(1),char(250),char(255),char(174),char(3),char(43), +char(1),char(252),char(255),char(174),char(3),char(43),char(1),char(254),char(255),char(174), +char(3),char(43),char(2),char(0),char(255),char(133),char(3),char(43),char(2),char(7), +char(255),char(113),char(3),char(43),char(2),char(11),char(255),char(113),char(3),char(43), +char(2),char(95),char(255),char(215),char(3),char(43),char(3),char(73),char(255),char(215), +char(3),char(43),char(3),char(75),char(255),char(215),char(3),char(43),char(3),char(77), +char(255),char(215),char(3),char(43),char(3),char(79),char(255),char(215),char(3),char(43), +char(3),char(81),char(255),char(215),char(3),char(43),char(3),char(83),char(255),char(215), +char(3),char(43),char(3),char(85),char(255),char(215),char(3),char(43),char(3),char(87), +char(255),char(215),char(3),char(43),char(3),char(89),char(255),char(215),char(3),char(43), +char(3),char(91),char(255),char(215),char(3),char(43),char(3),char(93),char(255),char(215), +char(3),char(43),char(3),char(95),char(255),char(215),char(3),char(43),char(3),char(111), +char(255),char(133),char(3),char(43),char(3),char(113),char(255),char(133),char(3),char(43), +char(3),char(115),char(255),char(133),char(3),char(43),char(3),char(143),char(255),char(113), +char(3),char(44),char(0),char(5),char(255),char(236),char(3),char(44),char(0),char(10), +char(255),char(236),char(3),char(44),char(2),char(7),char(255),char(236),char(3),char(44), +char(2),char(11),char(255),char(236),char(3),char(45),char(0),char(5),char(255),char(113), +char(3),char(45),char(0),char(10),char(255),char(113),char(3),char(45),char(0),char(38), +char(255),char(215),char(3),char(45),char(0),char(42),char(255),char(215),char(3),char(45), +char(0),char(45),char(1),char(10),char(3),char(45),char(0),char(50),char(255),char(215), +char(3),char(45),char(0),char(52),char(255),char(215),char(3),char(45),char(0),char(55), +char(255),char(113),char(3),char(45),char(0),char(57),char(255),char(174),char(3),char(45), +char(0),char(58),char(255),char(174),char(3),char(45),char(0),char(60),char(255),char(133), +char(3),char(45),char(0),char(137),char(255),char(215),char(3),char(45),char(0),char(148), +char(255),char(215),char(3),char(45),char(0),char(149),char(255),char(215),char(3),char(45), +char(0),char(150),char(255),char(215),char(3),char(45),char(0),char(151),char(255),char(215), +char(3),char(45),char(0),char(152),char(255),char(215),char(3),char(45),char(0),char(154), +char(255),char(215),char(3),char(45),char(0),char(159),char(255),char(133),char(3),char(45), +char(0),char(200),char(255),char(215),char(3),char(45),char(0),char(202),char(255),char(215), +char(3),char(45),char(0),char(204),char(255),char(215),char(3),char(45),char(0),char(206), +char(255),char(215),char(3),char(45),char(0),char(222),char(255),char(215),char(3),char(45), +char(0),char(224),char(255),char(215),char(3),char(45),char(0),char(226),char(255),char(215), +char(3),char(45),char(0),char(228),char(255),char(215),char(3),char(45),char(1),char(14), +char(255),char(215),char(3),char(45),char(1),char(16),char(255),char(215),char(3),char(45), +char(1),char(18),char(255),char(215),char(3),char(45),char(1),char(20),char(255),char(215), +char(3),char(45),char(1),char(36),char(255),char(113),char(3),char(45),char(1),char(38), +char(255),char(113),char(3),char(45),char(1),char(54),char(255),char(174),char(3),char(45), +char(1),char(56),char(255),char(133),char(3),char(45),char(1),char(58),char(255),char(133), +char(3),char(45),char(1),char(71),char(255),char(215),char(3),char(45),char(1),char(250), +char(255),char(174),char(3),char(45),char(1),char(252),char(255),char(174),char(3),char(45), +char(1),char(254),char(255),char(174),char(3),char(45),char(2),char(0),char(255),char(133), +char(3),char(45),char(2),char(7),char(255),char(113),char(3),char(45),char(2),char(11), +char(255),char(113),char(3),char(45),char(2),char(95),char(255),char(215),char(3),char(45), +char(3),char(73),char(255),char(215),char(3),char(45),char(3),char(75),char(255),char(215), +char(3),char(45),char(3),char(77),char(255),char(215),char(3),char(45),char(3),char(79), +char(255),char(215),char(3),char(45),char(3),char(81),char(255),char(215),char(3),char(45), +char(3),char(83),char(255),char(215),char(3),char(45),char(3),char(85),char(255),char(215), +char(3),char(45),char(3),char(87),char(255),char(215),char(3),char(45),char(3),char(89), +char(255),char(215),char(3),char(45),char(3),char(91),char(255),char(215),char(3),char(45), +char(3),char(93),char(255),char(215),char(3),char(45),char(3),char(95),char(255),char(215), +char(3),char(45),char(3),char(111),char(255),char(133),char(3),char(45),char(3),char(113), +char(255),char(133),char(3),char(45),char(3),char(115),char(255),char(133),char(3),char(45), +char(3),char(143),char(255),char(113),char(3),char(46),char(0),char(5),char(255),char(236), +char(3),char(46),char(0),char(10),char(255),char(236),char(3),char(46),char(2),char(7), +char(255),char(236),char(3),char(46),char(2),char(11),char(255),char(236),char(3),char(47), +char(0),char(5),char(255),char(113),char(3),char(47),char(0),char(10),char(255),char(113), +char(3),char(47),char(0),char(38),char(255),char(215),char(3),char(47),char(0),char(42), +char(255),char(215),char(3),char(47),char(0),char(45),char(1),char(10),char(3),char(47), +char(0),char(50),char(255),char(215),char(3),char(47),char(0),char(52),char(255),char(215), +char(3),char(47),char(0),char(55),char(255),char(113),char(3),char(47),char(0),char(57), +char(255),char(174),char(3),char(47),char(0),char(58),char(255),char(174),char(3),char(47), +char(0),char(60),char(255),char(133),char(3),char(47),char(0),char(137),char(255),char(215), +char(3),char(47),char(0),char(148),char(255),char(215),char(3),char(47),char(0),char(149), +char(255),char(215),char(3),char(47),char(0),char(150),char(255),char(215),char(3),char(47), +char(0),char(151),char(255),char(215),char(3),char(47),char(0),char(152),char(255),char(215), +char(3),char(47),char(0),char(154),char(255),char(215),char(3),char(47),char(0),char(159), +char(255),char(133),char(3),char(47),char(0),char(200),char(255),char(215),char(3),char(47), +char(0),char(202),char(255),char(215),char(3),char(47),char(0),char(204),char(255),char(215), +char(3),char(47),char(0),char(206),char(255),char(215),char(3),char(47),char(0),char(222), +char(255),char(215),char(3),char(47),char(0),char(224),char(255),char(215),char(3),char(47), +char(0),char(226),char(255),char(215),char(3),char(47),char(0),char(228),char(255),char(215), +char(3),char(47),char(1),char(14),char(255),char(215),char(3),char(47),char(1),char(16), +char(255),char(215),char(3),char(47),char(1),char(18),char(255),char(215),char(3),char(47), +char(1),char(20),char(255),char(215),char(3),char(47),char(1),char(36),char(255),char(113), +char(3),char(47),char(1),char(38),char(255),char(113),char(3),char(47),char(1),char(54), +char(255),char(174),char(3),char(47),char(1),char(56),char(255),char(133),char(3),char(47), +char(1),char(58),char(255),char(133),char(3),char(47),char(1),char(71),char(255),char(215), +char(3),char(47),char(1),char(250),char(255),char(174),char(3),char(47),char(1),char(252), +char(255),char(174),char(3),char(47),char(1),char(254),char(255),char(174),char(3),char(47), +char(2),char(0),char(255),char(133),char(3),char(47),char(2),char(7),char(255),char(113), +char(3),char(47),char(2),char(11),char(255),char(113),char(3),char(47),char(2),char(95), +char(255),char(215),char(3),char(47),char(3),char(73),char(255),char(215),char(3),char(47), +char(3),char(75),char(255),char(215),char(3),char(47),char(3),char(77),char(255),char(215), +char(3),char(47),char(3),char(79),char(255),char(215),char(3),char(47),char(3),char(81), +char(255),char(215),char(3),char(47),char(3),char(83),char(255),char(215),char(3),char(47), +char(3),char(85),char(255),char(215),char(3),char(47),char(3),char(87),char(255),char(215), +char(3),char(47),char(3),char(89),char(255),char(215),char(3),char(47),char(3),char(91), +char(255),char(215),char(3),char(47),char(3),char(93),char(255),char(215),char(3),char(47), +char(3),char(95),char(255),char(215),char(3),char(47),char(3),char(111),char(255),char(133), +char(3),char(47),char(3),char(113),char(255),char(133),char(3),char(47),char(3),char(115), +char(255),char(133),char(3),char(47),char(3),char(143),char(255),char(113),char(3),char(48), +char(0),char(5),char(255),char(236),char(3),char(48),char(0),char(10),char(255),char(236), +char(3),char(48),char(2),char(7),char(255),char(236),char(3),char(48),char(2),char(11), +char(255),char(236),char(3),char(49),char(0),char(5),char(255),char(113),char(3),char(49), +char(0),char(10),char(255),char(113),char(3),char(49),char(0),char(38),char(255),char(215), +char(3),char(49),char(0),char(42),char(255),char(215),char(3),char(49),char(0),char(45), +char(1),char(10),char(3),char(49),char(0),char(50),char(255),char(215),char(3),char(49), +char(0),char(52),char(255),char(215),char(3),char(49),char(0),char(55),char(255),char(113), +char(3),char(49),char(0),char(57),char(255),char(174),char(3),char(49),char(0),char(58), +char(255),char(174),char(3),char(49),char(0),char(60),char(255),char(133),char(3),char(49), +char(0),char(137),char(255),char(215),char(3),char(49),char(0),char(148),char(255),char(215), +char(3),char(49),char(0),char(149),char(255),char(215),char(3),char(49),char(0),char(150), +char(255),char(215),char(3),char(49),char(0),char(151),char(255),char(215),char(3),char(49), +char(0),char(152),char(255),char(215),char(3),char(49),char(0),char(154),char(255),char(215), +char(3),char(49),char(0),char(159),char(255),char(133),char(3),char(49),char(0),char(200), +char(255),char(215),char(3),char(49),char(0),char(202),char(255),char(215),char(3),char(49), +char(0),char(204),char(255),char(215),char(3),char(49),char(0),char(206),char(255),char(215), +char(3),char(49),char(0),char(222),char(255),char(215),char(3),char(49),char(0),char(224), +char(255),char(215),char(3),char(49),char(0),char(226),char(255),char(215),char(3),char(49), +char(0),char(228),char(255),char(215),char(3),char(49),char(1),char(14),char(255),char(215), +char(3),char(49),char(1),char(16),char(255),char(215),char(3),char(49),char(1),char(18), +char(255),char(215),char(3),char(49),char(1),char(20),char(255),char(215),char(3),char(49), +char(1),char(36),char(255),char(113),char(3),char(49),char(1),char(38),char(255),char(113), +char(3),char(49),char(1),char(54),char(255),char(174),char(3),char(49),char(1),char(56), +char(255),char(133),char(3),char(49),char(1),char(58),char(255),char(133),char(3),char(49), +char(1),char(71),char(255),char(215),char(3),char(49),char(1),char(250),char(255),char(174), +char(3),char(49),char(1),char(252),char(255),char(174),char(3),char(49),char(1),char(254), +char(255),char(174),char(3),char(49),char(2),char(0),char(255),char(133),char(3),char(49), +char(2),char(7),char(255),char(113),char(3),char(49),char(2),char(11),char(255),char(113), +char(3),char(49),char(2),char(95),char(255),char(215),char(3),char(49),char(3),char(73), +char(255),char(215),char(3),char(49),char(3),char(75),char(255),char(215),char(3),char(49), +char(3),char(77),char(255),char(215),char(3),char(49),char(3),char(79),char(255),char(215), +char(3),char(49),char(3),char(81),char(255),char(215),char(3),char(49),char(3),char(83), +char(255),char(215),char(3),char(49),char(3),char(85),char(255),char(215),char(3),char(49), +char(3),char(87),char(255),char(215),char(3),char(49),char(3),char(89),char(255),char(215), +char(3),char(49),char(3),char(91),char(255),char(215),char(3),char(49),char(3),char(93), +char(255),char(215),char(3),char(49),char(3),char(95),char(255),char(215),char(3),char(49), +char(3),char(111),char(255),char(133),char(3),char(49),char(3),char(113),char(255),char(133), +char(3),char(49),char(3),char(115),char(255),char(133),char(3),char(49),char(3),char(143), +char(255),char(113),char(3),char(50),char(0),char(5),char(255),char(236),char(3),char(50), +char(0),char(10),char(255),char(236),char(3),char(50),char(2),char(7),char(255),char(236), +char(3),char(50),char(2),char(11),char(255),char(236),char(3),char(51),char(0),char(5), +char(255),char(113),char(3),char(51),char(0),char(10),char(255),char(113),char(3),char(51), +char(0),char(38),char(255),char(215),char(3),char(51),char(0),char(42),char(255),char(215), +char(3),char(51),char(0),char(45),char(1),char(10),char(3),char(51),char(0),char(50), +char(255),char(215),char(3),char(51),char(0),char(52),char(255),char(215),char(3),char(51), +char(0),char(55),char(255),char(113),char(3),char(51),char(0),char(57),char(255),char(174), +char(3),char(51),char(0),char(58),char(255),char(174),char(3),char(51),char(0),char(60), +char(255),char(133),char(3),char(51),char(0),char(137),char(255),char(215),char(3),char(51), +char(0),char(148),char(255),char(215),char(3),char(51),char(0),char(149),char(255),char(215), +char(3),char(51),char(0),char(150),char(255),char(215),char(3),char(51),char(0),char(151), +char(255),char(215),char(3),char(51),char(0),char(152),char(255),char(215),char(3),char(51), +char(0),char(154),char(255),char(215),char(3),char(51),char(0),char(159),char(255),char(133), +char(3),char(51),char(0),char(200),char(255),char(215),char(3),char(51),char(0),char(202), +char(255),char(215),char(3),char(51),char(0),char(204),char(255),char(215),char(3),char(51), +char(0),char(206),char(255),char(215),char(3),char(51),char(0),char(222),char(255),char(215), +char(3),char(51),char(0),char(224),char(255),char(215),char(3),char(51),char(0),char(226), +char(255),char(215),char(3),char(51),char(0),char(228),char(255),char(215),char(3),char(51), +char(1),char(14),char(255),char(215),char(3),char(51),char(1),char(16),char(255),char(215), +char(3),char(51),char(1),char(18),char(255),char(215),char(3),char(51),char(1),char(20), +char(255),char(215),char(3),char(51),char(1),char(36),char(255),char(113),char(3),char(51), +char(1),char(38),char(255),char(113),char(3),char(51),char(1),char(54),char(255),char(174), +char(3),char(51),char(1),char(56),char(255),char(133),char(3),char(51),char(1),char(58), +char(255),char(133),char(3),char(51),char(1),char(71),char(255),char(215),char(3),char(51), +char(1),char(250),char(255),char(174),char(3),char(51),char(1),char(252),char(255),char(174), +char(3),char(51),char(1),char(254),char(255),char(174),char(3),char(51),char(2),char(0), +char(255),char(133),char(3),char(51),char(2),char(7),char(255),char(113),char(3),char(51), +char(2),char(11),char(255),char(113),char(3),char(51),char(2),char(95),char(255),char(215), +char(3),char(51),char(3),char(73),char(255),char(215),char(3),char(51),char(3),char(75), +char(255),char(215),char(3),char(51),char(3),char(77),char(255),char(215),char(3),char(51), +char(3),char(79),char(255),char(215),char(3),char(51),char(3),char(81),char(255),char(215), +char(3),char(51),char(3),char(83),char(255),char(215),char(3),char(51),char(3),char(85), +char(255),char(215),char(3),char(51),char(3),char(87),char(255),char(215),char(3),char(51), +char(3),char(89),char(255),char(215),char(3),char(51),char(3),char(91),char(255),char(215), +char(3),char(51),char(3),char(93),char(255),char(215),char(3),char(51),char(3),char(95), +char(255),char(215),char(3),char(51),char(3),char(111),char(255),char(133),char(3),char(51), +char(3),char(113),char(255),char(133),char(3),char(51),char(3),char(115),char(255),char(133), +char(3),char(51),char(3),char(143),char(255),char(113),char(3),char(52),char(0),char(5), +char(255),char(236),char(3),char(52),char(0),char(10),char(255),char(236),char(3),char(52), +char(2),char(7),char(255),char(236),char(3),char(52),char(2),char(11),char(255),char(236), +char(3),char(53),char(0),char(45),char(0),char(123),char(3),char(54),char(0),char(5), +char(255),char(236),char(3),char(54),char(0),char(10),char(255),char(236),char(3),char(54), +char(0),char(89),char(255),char(215),char(3),char(54),char(0),char(90),char(255),char(215), +char(3),char(54),char(0),char(91),char(255),char(215),char(3),char(54),char(0),char(92), +char(255),char(215),char(3),char(54),char(0),char(93),char(255),char(236),char(3),char(54), +char(0),char(191),char(255),char(215),char(3),char(54),char(1),char(55),char(255),char(215), +char(3),char(54),char(1),char(60),char(255),char(236),char(3),char(54),char(1),char(62), +char(255),char(236),char(3),char(54),char(1),char(64),char(255),char(236),char(3),char(54), +char(1),char(251),char(255),char(215),char(3),char(54),char(1),char(253),char(255),char(215), +char(3),char(54),char(2),char(7),char(255),char(236),char(3),char(54),char(2),char(11), +char(255),char(236),char(3),char(54),char(3),char(112),char(255),char(215),char(3),char(55), +char(0),char(45),char(0),char(123),char(3),char(56),char(0),char(5),char(255),char(236), +char(3),char(56),char(0),char(10),char(255),char(236),char(3),char(56),char(0),char(89), +char(255),char(215),char(3),char(56),char(0),char(90),char(255),char(215),char(3),char(56), +char(0),char(91),char(255),char(215),char(3),char(56),char(0),char(92),char(255),char(215), +char(3),char(56),char(0),char(93),char(255),char(236),char(3),char(56),char(0),char(191), +char(255),char(215),char(3),char(56),char(1),char(55),char(255),char(215),char(3),char(56), +char(1),char(60),char(255),char(236),char(3),char(56),char(1),char(62),char(255),char(236), +char(3),char(56),char(1),char(64),char(255),char(236),char(3),char(56),char(1),char(251), +char(255),char(215),char(3),char(56),char(1),char(253),char(255),char(215),char(3),char(56), +char(2),char(7),char(255),char(236),char(3),char(56),char(2),char(11),char(255),char(236), +char(3),char(56),char(3),char(112),char(255),char(215),char(3),char(57),char(0),char(45), +char(0),char(123),char(3),char(58),char(0),char(5),char(255),char(236),char(3),char(58), +char(0),char(10),char(255),char(236),char(3),char(58),char(0),char(89),char(255),char(215), +char(3),char(58),char(0),char(90),char(255),char(215),char(3),char(58),char(0),char(91), +char(255),char(215),char(3),char(58),char(0),char(92),char(255),char(215),char(3),char(58), +char(0),char(93),char(255),char(236),char(3),char(58),char(0),char(191),char(255),char(215), +char(3),char(58),char(1),char(55),char(255),char(215),char(3),char(58),char(1),char(60), +char(255),char(236),char(3),char(58),char(1),char(62),char(255),char(236),char(3),char(58), +char(1),char(64),char(255),char(236),char(3),char(58),char(1),char(251),char(255),char(215), +char(3),char(58),char(1),char(253),char(255),char(215),char(3),char(58),char(2),char(7), +char(255),char(236),char(3),char(58),char(2),char(11),char(255),char(236),char(3),char(58), +char(3),char(112),char(255),char(215),char(3),char(59),char(0),char(45),char(0),char(123), +char(3),char(60),char(0),char(5),char(255),char(236),char(3),char(60),char(0),char(10), +char(255),char(236),char(3),char(60),char(0),char(89),char(255),char(215),char(3),char(60), +char(0),char(90),char(255),char(215),char(3),char(60),char(0),char(91),char(255),char(215), +char(3),char(60),char(0),char(92),char(255),char(215),char(3),char(60),char(0),char(93), +char(255),char(236),char(3),char(60),char(0),char(191),char(255),char(215),char(3),char(60), +char(1),char(55),char(255),char(215),char(3),char(60),char(1),char(60),char(255),char(236), +char(3),char(60),char(1),char(62),char(255),char(236),char(3),char(60),char(1),char(64), +char(255),char(236),char(3),char(60),char(1),char(251),char(255),char(215),char(3),char(60), +char(1),char(253),char(255),char(215),char(3),char(60),char(2),char(7),char(255),char(236), +char(3),char(60),char(2),char(11),char(255),char(236),char(3),char(60),char(3),char(112), +char(255),char(215),char(3),char(61),char(0),char(45),char(0),char(123),char(3),char(62), +char(0),char(5),char(255),char(236),char(3),char(62),char(0),char(10),char(255),char(236), +char(3),char(62),char(0),char(89),char(255),char(215),char(3),char(62),char(0),char(90), +char(255),char(215),char(3),char(62),char(0),char(91),char(255),char(215),char(3),char(62), +char(0),char(92),char(255),char(215),char(3),char(62),char(0),char(93),char(255),char(236), +char(3),char(62),char(0),char(191),char(255),char(215),char(3),char(62),char(1),char(55), +char(255),char(215),char(3),char(62),char(1),char(60),char(255),char(236),char(3),char(62), +char(1),char(62),char(255),char(236),char(3),char(62),char(1),char(64),char(255),char(236), +char(3),char(62),char(1),char(251),char(255),char(215),char(3),char(62),char(1),char(253), +char(255),char(215),char(3),char(62),char(2),char(7),char(255),char(236),char(3),char(62), +char(2),char(11),char(255),char(236),char(3),char(62),char(3),char(112),char(255),char(215), +char(3),char(63),char(0),char(45),char(0),char(123),char(3),char(64),char(0),char(5), +char(255),char(236),char(3),char(64),char(0),char(10),char(255),char(236),char(3),char(64), +char(0),char(89),char(255),char(215),char(3),char(64),char(0),char(90),char(255),char(215), +char(3),char(64),char(0),char(91),char(255),char(215),char(3),char(64),char(0),char(92), +char(255),char(215),char(3),char(64),char(0),char(93),char(255),char(236),char(3),char(64), +char(0),char(191),char(255),char(215),char(3),char(64),char(1),char(55),char(255),char(215), +char(3),char(64),char(1),char(60),char(255),char(236),char(3),char(64),char(1),char(62), +char(255),char(236),char(3),char(64),char(1),char(64),char(255),char(236),char(3),char(64), +char(1),char(251),char(255),char(215),char(3),char(64),char(1),char(253),char(255),char(215), +char(3),char(64),char(2),char(7),char(255),char(236),char(3),char(64),char(2),char(11), +char(255),char(236),char(3),char(64),char(3),char(112),char(255),char(215),char(3),char(65), +char(0),char(45),char(0),char(123),char(3),char(66),char(0),char(5),char(255),char(236), +char(3),char(66),char(0),char(10),char(255),char(236),char(3),char(66),char(0),char(89), +char(255),char(215),char(3),char(66),char(0),char(90),char(255),char(215),char(3),char(66), +char(0),char(91),char(255),char(215),char(3),char(66),char(0),char(92),char(255),char(215), +char(3),char(66),char(0),char(93),char(255),char(236),char(3),char(66),char(0),char(191), +char(255),char(215),char(3),char(66),char(1),char(55),char(255),char(215),char(3),char(66), +char(1),char(60),char(255),char(236),char(3),char(66),char(1),char(62),char(255),char(236), +char(3),char(66),char(1),char(64),char(255),char(236),char(3),char(66),char(1),char(251), +char(255),char(215),char(3),char(66),char(1),char(253),char(255),char(215),char(3),char(66), +char(2),char(7),char(255),char(236),char(3),char(66),char(2),char(11),char(255),char(236), +char(3),char(66),char(3),char(112),char(255),char(215),char(3),char(67),char(0),char(45), +char(0),char(123),char(3),char(68),char(0),char(5),char(255),char(236),char(3),char(68), +char(0),char(10),char(255),char(236),char(3),char(68),char(0),char(89),char(255),char(215), +char(3),char(68),char(0),char(90),char(255),char(215),char(3),char(68),char(0),char(91), +char(255),char(215),char(3),char(68),char(0),char(92),char(255),char(215),char(3),char(68), +char(0),char(93),char(255),char(236),char(3),char(68),char(0),char(191),char(255),char(215), +char(3),char(68),char(1),char(55),char(255),char(215),char(3),char(68),char(1),char(60), +char(255),char(236),char(3),char(68),char(1),char(62),char(255),char(236),char(3),char(68), +char(1),char(64),char(255),char(236),char(3),char(68),char(1),char(251),char(255),char(215), +char(3),char(68),char(1),char(253),char(255),char(215),char(3),char(68),char(2),char(7), +char(255),char(236),char(3),char(68),char(2),char(11),char(255),char(236),char(3),char(68), +char(3),char(112),char(255),char(215),char(3),char(73),char(0),char(15),char(255),char(174), +char(3),char(73),char(0),char(17),char(255),char(174),char(3),char(73),char(0),char(36), +char(255),char(215),char(3),char(73),char(0),char(55),char(255),char(195),char(3),char(73), +char(0),char(57),char(255),char(236),char(3),char(73),char(0),char(58),char(255),char(236), +char(3),char(73),char(0),char(59),char(255),char(215),char(3),char(73),char(0),char(60), +char(255),char(236),char(3),char(73),char(0),char(61),char(255),char(236),char(3),char(73), +char(0),char(130),char(255),char(215),char(3),char(73),char(0),char(131),char(255),char(215), +char(3),char(73),char(0),char(132),char(255),char(215),char(3),char(73),char(0),char(133), +char(255),char(215),char(3),char(73),char(0),char(134),char(255),char(215),char(3),char(73), +char(0),char(135),char(255),char(215),char(3),char(73),char(0),char(159),char(255),char(236), +char(3),char(73),char(0),char(194),char(255),char(215),char(3),char(73),char(0),char(196), +char(255),char(215),char(3),char(73),char(0),char(198),char(255),char(215),char(3),char(73), +char(1),char(36),char(255),char(195),char(3),char(73),char(1),char(38),char(255),char(195), +char(3),char(73),char(1),char(54),char(255),char(236),char(3),char(73),char(1),char(56), +char(255),char(236),char(3),char(73),char(1),char(58),char(255),char(236),char(3),char(73), +char(1),char(59),char(255),char(236),char(3),char(73),char(1),char(61),char(255),char(236), +char(3),char(73),char(1),char(63),char(255),char(236),char(3),char(73),char(1),char(67), +char(255),char(215),char(3),char(73),char(1),char(160),char(255),char(236),char(3),char(73), +char(1),char(250),char(255),char(236),char(3),char(73),char(1),char(252),char(255),char(236), +char(3),char(73),char(1),char(254),char(255),char(236),char(3),char(73),char(2),char(0), +char(255),char(236),char(3),char(73),char(2),char(8),char(255),char(174),char(3),char(73), +char(2),char(12),char(255),char(174),char(3),char(73),char(2),char(88),char(255),char(215), +char(3),char(73),char(3),char(29),char(255),char(215),char(3),char(73),char(3),char(31), +char(255),char(215),char(3),char(73),char(3),char(33),char(255),char(215),char(3),char(73), +char(3),char(35),char(255),char(215),char(3),char(73),char(3),char(37),char(255),char(215), +char(3),char(73),char(3),char(39),char(255),char(215),char(3),char(73),char(3),char(41), +char(255),char(215),char(3),char(73),char(3),char(43),char(255),char(215),char(3),char(73), +char(3),char(45),char(255),char(215),char(3),char(73),char(3),char(47),char(255),char(215), +char(3),char(73),char(3),char(49),char(255),char(215),char(3),char(73),char(3),char(51), +char(255),char(215),char(3),char(73),char(3),char(111),char(255),char(236),char(3),char(73), +char(3),char(113),char(255),char(236),char(3),char(73),char(3),char(115),char(255),char(236), +char(3),char(73),char(3),char(143),char(255),char(195),char(3),char(74),char(0),char(5), +char(255),char(236),char(3),char(74),char(0),char(10),char(255),char(236),char(3),char(74), +char(0),char(89),char(255),char(215),char(3),char(74),char(0),char(90),char(255),char(215), +char(3),char(74),char(0),char(91),char(255),char(215),char(3),char(74),char(0),char(92), +char(255),char(215),char(3),char(74),char(0),char(93),char(255),char(236),char(3),char(74), +char(0),char(191),char(255),char(215),char(3),char(74),char(1),char(55),char(255),char(215), +char(3),char(74),char(1),char(60),char(255),char(236),char(3),char(74),char(1),char(62), +char(255),char(236),char(3),char(74),char(1),char(64),char(255),char(236),char(3),char(74), +char(1),char(251),char(255),char(215),char(3),char(74),char(1),char(253),char(255),char(215), +char(3),char(74),char(2),char(7),char(255),char(236),char(3),char(74),char(2),char(11), +char(255),char(236),char(3),char(74),char(3),char(112),char(255),char(215),char(3),char(75), +char(0),char(15),char(255),char(174),char(3),char(75),char(0),char(17),char(255),char(174), +char(3),char(75),char(0),char(36),char(255),char(215),char(3),char(75),char(0),char(55), +char(255),char(195),char(3),char(75),char(0),char(57),char(255),char(236),char(3),char(75), +char(0),char(58),char(255),char(236),char(3),char(75),char(0),char(59),char(255),char(215), +char(3),char(75),char(0),char(60),char(255),char(236),char(3),char(75),char(0),char(61), +char(255),char(236),char(3),char(75),char(0),char(130),char(255),char(215),char(3),char(75), +char(0),char(131),char(255),char(215),char(3),char(75),char(0),char(132),char(255),char(215), +char(3),char(75),char(0),char(133),char(255),char(215),char(3),char(75),char(0),char(134), +char(255),char(215),char(3),char(75),char(0),char(135),char(255),char(215),char(3),char(75), +char(0),char(159),char(255),char(236),char(3),char(75),char(0),char(194),char(255),char(215), +char(3),char(75),char(0),char(196),char(255),char(215),char(3),char(75),char(0),char(198), +char(255),char(215),char(3),char(75),char(1),char(36),char(255),char(195),char(3),char(75), +char(1),char(38),char(255),char(195),char(3),char(75),char(1),char(54),char(255),char(236), +char(3),char(75),char(1),char(56),char(255),char(236),char(3),char(75),char(1),char(58), +char(255),char(236),char(3),char(75),char(1),char(59),char(255),char(236),char(3),char(75), +char(1),char(61),char(255),char(236),char(3),char(75),char(1),char(63),char(255),char(236), +char(3),char(75),char(1),char(67),char(255),char(215),char(3),char(75),char(1),char(160), +char(255),char(236),char(3),char(75),char(1),char(250),char(255),char(236),char(3),char(75), +char(1),char(252),char(255),char(236),char(3),char(75),char(1),char(254),char(255),char(236), +char(3),char(75),char(2),char(0),char(255),char(236),char(3),char(75),char(2),char(8), +char(255),char(174),char(3),char(75),char(2),char(12),char(255),char(174),char(3),char(75), +char(2),char(88),char(255),char(215),char(3),char(75),char(3),char(29),char(255),char(215), +char(3),char(75),char(3),char(31),char(255),char(215),char(3),char(75),char(3),char(33), +char(255),char(215),char(3),char(75),char(3),char(35),char(255),char(215),char(3),char(75), +char(3),char(37),char(255),char(215),char(3),char(75),char(3),char(39),char(255),char(215), +char(3),char(75),char(3),char(41),char(255),char(215),char(3),char(75),char(3),char(43), +char(255),char(215),char(3),char(75),char(3),char(45),char(255),char(215),char(3),char(75), +char(3),char(47),char(255),char(215),char(3),char(75),char(3),char(49),char(255),char(215), +char(3),char(75),char(3),char(51),char(255),char(215),char(3),char(75),char(3),char(111), +char(255),char(236),char(3),char(75),char(3),char(113),char(255),char(236),char(3),char(75), +char(3),char(115),char(255),char(236),char(3),char(75),char(3),char(143),char(255),char(195), +char(3),char(76),char(0),char(5),char(255),char(236),char(3),char(76),char(0),char(10), +char(255),char(236),char(3),char(76),char(0),char(89),char(255),char(215),char(3),char(76), +char(0),char(90),char(255),char(215),char(3),char(76),char(0),char(91),char(255),char(215), +char(3),char(76),char(0),char(92),char(255),char(215),char(3),char(76),char(0),char(93), +char(255),char(236),char(3),char(76),char(0),char(191),char(255),char(215),char(3),char(76), +char(1),char(55),char(255),char(215),char(3),char(76),char(1),char(60),char(255),char(236), +char(3),char(76),char(1),char(62),char(255),char(236),char(3),char(76),char(1),char(64), +char(255),char(236),char(3),char(76),char(1),char(251),char(255),char(215),char(3),char(76), +char(1),char(253),char(255),char(215),char(3),char(76),char(2),char(7),char(255),char(236), +char(3),char(76),char(2),char(11),char(255),char(236),char(3),char(76),char(3),char(112), +char(255),char(215),char(3),char(77),char(0),char(15),char(255),char(174),char(3),char(77), +char(0),char(17),char(255),char(174),char(3),char(77),char(0),char(36),char(255),char(215), +char(3),char(77),char(0),char(55),char(255),char(195),char(3),char(77),char(0),char(57), +char(255),char(236),char(3),char(77),char(0),char(58),char(255),char(236),char(3),char(77), +char(0),char(59),char(255),char(215),char(3),char(77),char(0),char(60),char(255),char(236), +char(3),char(77),char(0),char(61),char(255),char(236),char(3),char(77),char(0),char(130), +char(255),char(215),char(3),char(77),char(0),char(131),char(255),char(215),char(3),char(77), +char(0),char(132),char(255),char(215),char(3),char(77),char(0),char(133),char(255),char(215), +char(3),char(77),char(0),char(134),char(255),char(215),char(3),char(77),char(0),char(135), +char(255),char(215),char(3),char(77),char(0),char(159),char(255),char(236),char(3),char(77), +char(0),char(194),char(255),char(215),char(3),char(77),char(0),char(196),char(255),char(215), +char(3),char(77),char(0),char(198),char(255),char(215),char(3),char(77),char(1),char(36), +char(255),char(195),char(3),char(77),char(1),char(38),char(255),char(195),char(3),char(77), +char(1),char(54),char(255),char(236),char(3),char(77),char(1),char(56),char(255),char(236), +char(3),char(77),char(1),char(58),char(255),char(236),char(3),char(77),char(1),char(59), +char(255),char(236),char(3),char(77),char(1),char(61),char(255),char(236),char(3),char(77), +char(1),char(63),char(255),char(236),char(3),char(77),char(1),char(67),char(255),char(215), +char(3),char(77),char(1),char(160),char(255),char(236),char(3),char(77),char(1),char(250), +char(255),char(236),char(3),char(77),char(1),char(252),char(255),char(236),char(3),char(77), +char(1),char(254),char(255),char(236),char(3),char(77),char(2),char(0),char(255),char(236), +char(3),char(77),char(2),char(8),char(255),char(174),char(3),char(77),char(2),char(12), +char(255),char(174),char(3),char(77),char(2),char(88),char(255),char(215),char(3),char(77), +char(3),char(29),char(255),char(215),char(3),char(77),char(3),char(31),char(255),char(215), +char(3),char(77),char(3),char(33),char(255),char(215),char(3),char(77),char(3),char(35), +char(255),char(215),char(3),char(77),char(3),char(37),char(255),char(215),char(3),char(77), +char(3),char(39),char(255),char(215),char(3),char(77),char(3),char(41),char(255),char(215), +char(3),char(77),char(3),char(43),char(255),char(215),char(3),char(77),char(3),char(45), +char(255),char(215),char(3),char(77),char(3),char(47),char(255),char(215),char(3),char(77), +char(3),char(49),char(255),char(215),char(3),char(77),char(3),char(51),char(255),char(215), +char(3),char(77),char(3),char(111),char(255),char(236),char(3),char(77),char(3),char(113), +char(255),char(236),char(3),char(77),char(3),char(115),char(255),char(236),char(3),char(77), +char(3),char(143),char(255),char(195),char(3),char(79),char(0),char(15),char(255),char(174), +char(3),char(79),char(0),char(17),char(255),char(174),char(3),char(79),char(0),char(36), +char(255),char(215),char(3),char(79),char(0),char(55),char(255),char(195),char(3),char(79), +char(0),char(57),char(255),char(236),char(3),char(79),char(0),char(58),char(255),char(236), +char(3),char(79),char(0),char(59),char(255),char(215),char(3),char(79),char(0),char(60), +char(255),char(236),char(3),char(79),char(0),char(61),char(255),char(236),char(3),char(79), +char(0),char(130),char(255),char(215),char(3),char(79),char(0),char(131),char(255),char(215), +char(3),char(79),char(0),char(132),char(255),char(215),char(3),char(79),char(0),char(133), +char(255),char(215),char(3),char(79),char(0),char(134),char(255),char(215),char(3),char(79), +char(0),char(135),char(255),char(215),char(3),char(79),char(0),char(159),char(255),char(236), +char(3),char(79),char(0),char(194),char(255),char(215),char(3),char(79),char(0),char(196), +char(255),char(215),char(3),char(79),char(0),char(198),char(255),char(215),char(3),char(79), +char(1),char(36),char(255),char(195),char(3),char(79),char(1),char(38),char(255),char(195), +char(3),char(79),char(1),char(54),char(255),char(236),char(3),char(79),char(1),char(56), +char(255),char(236),char(3),char(79),char(1),char(58),char(255),char(236),char(3),char(79), +char(1),char(59),char(255),char(236),char(3),char(79),char(1),char(61),char(255),char(236), +char(3),char(79),char(1),char(63),char(255),char(236),char(3),char(79),char(1),char(67), +char(255),char(215),char(3),char(79),char(1),char(160),char(255),char(236),char(3),char(79), +char(1),char(250),char(255),char(236),char(3),char(79),char(1),char(252),char(255),char(236), +char(3),char(79),char(1),char(254),char(255),char(236),char(3),char(79),char(2),char(0), +char(255),char(236),char(3),char(79),char(2),char(8),char(255),char(174),char(3),char(79), +char(2),char(12),char(255),char(174),char(3),char(79),char(2),char(88),char(255),char(215), +char(3),char(79),char(3),char(29),char(255),char(215),char(3),char(79),char(3),char(31), +char(255),char(215),char(3),char(79),char(3),char(33),char(255),char(215),char(3),char(79), +char(3),char(35),char(255),char(215),char(3),char(79),char(3),char(37),char(255),char(215), +char(3),char(79),char(3),char(39),char(255),char(215),char(3),char(79),char(3),char(41), +char(255),char(215),char(3),char(79),char(3),char(43),char(255),char(215),char(3),char(79), +char(3),char(45),char(255),char(215),char(3),char(79),char(3),char(47),char(255),char(215), +char(3),char(79),char(3),char(49),char(255),char(215),char(3),char(79),char(3),char(51), +char(255),char(215),char(3),char(79),char(3),char(111),char(255),char(236),char(3),char(79), +char(3),char(113),char(255),char(236),char(3),char(79),char(3),char(115),char(255),char(236), +char(3),char(79),char(3),char(143),char(255),char(195),char(3),char(81),char(0),char(15), +char(255),char(174),char(3),char(81),char(0),char(17),char(255),char(174),char(3),char(81), +char(0),char(36),char(255),char(215),char(3),char(81),char(0),char(55),char(255),char(195), +char(3),char(81),char(0),char(57),char(255),char(236),char(3),char(81),char(0),char(58), +char(255),char(236),char(3),char(81),char(0),char(59),char(255),char(215),char(3),char(81), +char(0),char(60),char(255),char(236),char(3),char(81),char(0),char(61),char(255),char(236), +char(3),char(81),char(0),char(130),char(255),char(215),char(3),char(81),char(0),char(131), +char(255),char(215),char(3),char(81),char(0),char(132),char(255),char(215),char(3),char(81), +char(0),char(133),char(255),char(215),char(3),char(81),char(0),char(134),char(255),char(215), +char(3),char(81),char(0),char(135),char(255),char(215),char(3),char(81),char(0),char(159), +char(255),char(236),char(3),char(81),char(0),char(194),char(255),char(215),char(3),char(81), +char(0),char(196),char(255),char(215),char(3),char(81),char(0),char(198),char(255),char(215), +char(3),char(81),char(1),char(36),char(255),char(195),char(3),char(81),char(1),char(38), +char(255),char(195),char(3),char(81),char(1),char(54),char(255),char(236),char(3),char(81), +char(1),char(56),char(255),char(236),char(3),char(81),char(1),char(58),char(255),char(236), +char(3),char(81),char(1),char(59),char(255),char(236),char(3),char(81),char(1),char(61), +char(255),char(236),char(3),char(81),char(1),char(63),char(255),char(236),char(3),char(81), +char(1),char(67),char(255),char(215),char(3),char(81),char(1),char(160),char(255),char(236), +char(3),char(81),char(1),char(250),char(255),char(236),char(3),char(81),char(1),char(252), +char(255),char(236),char(3),char(81),char(1),char(254),char(255),char(236),char(3),char(81), +char(2),char(0),char(255),char(236),char(3),char(81),char(2),char(8),char(255),char(174), +char(3),char(81),char(2),char(12),char(255),char(174),char(3),char(81),char(2),char(88), +char(255),char(215),char(3),char(81),char(3),char(29),char(255),char(215),char(3),char(81), +char(3),char(31),char(255),char(215),char(3),char(81),char(3),char(33),char(255),char(215), +char(3),char(81),char(3),char(35),char(255),char(215),char(3),char(81),char(3),char(37), +char(255),char(215),char(3),char(81),char(3),char(39),char(255),char(215),char(3),char(81), +char(3),char(41),char(255),char(215),char(3),char(81),char(3),char(43),char(255),char(215), +char(3),char(81),char(3),char(45),char(255),char(215),char(3),char(81),char(3),char(47), +char(255),char(215),char(3),char(81),char(3),char(49),char(255),char(215),char(3),char(81), +char(3),char(51),char(255),char(215),char(3),char(81),char(3),char(111),char(255),char(236), +char(3),char(81),char(3),char(113),char(255),char(236),char(3),char(81),char(3),char(115), +char(255),char(236),char(3),char(81),char(3),char(143),char(255),char(195),char(3),char(83), +char(0),char(15),char(255),char(174),char(3),char(83),char(0),char(17),char(255),char(174), +char(3),char(83),char(0),char(36),char(255),char(215),char(3),char(83),char(0),char(55), +char(255),char(195),char(3),char(83),char(0),char(57),char(255),char(236),char(3),char(83), +char(0),char(58),char(255),char(236),char(3),char(83),char(0),char(59),char(255),char(215), +char(3),char(83),char(0),char(60),char(255),char(236),char(3),char(83),char(0),char(61), +char(255),char(236),char(3),char(83),char(0),char(130),char(255),char(215),char(3),char(83), +char(0),char(131),char(255),char(215),char(3),char(83),char(0),char(132),char(255),char(215), +char(3),char(83),char(0),char(133),char(255),char(215),char(3),char(83),char(0),char(134), +char(255),char(215),char(3),char(83),char(0),char(135),char(255),char(215),char(3),char(83), +char(0),char(159),char(255),char(236),char(3),char(83),char(0),char(194),char(255),char(215), +char(3),char(83),char(0),char(196),char(255),char(215),char(3),char(83),char(0),char(198), +char(255),char(215),char(3),char(83),char(1),char(36),char(255),char(195),char(3),char(83), +char(1),char(38),char(255),char(195),char(3),char(83),char(1),char(54),char(255),char(236), +char(3),char(83),char(1),char(56),char(255),char(236),char(3),char(83),char(1),char(58), +char(255),char(236),char(3),char(83),char(1),char(59),char(255),char(236),char(3),char(83), +char(1),char(61),char(255),char(236),char(3),char(83),char(1),char(63),char(255),char(236), +char(3),char(83),char(1),char(67),char(255),char(215),char(3),char(83),char(1),char(160), +char(255),char(236),char(3),char(83),char(1),char(250),char(255),char(236),char(3),char(83), +char(1),char(252),char(255),char(236),char(3),char(83),char(1),char(254),char(255),char(236), +char(3),char(83),char(2),char(0),char(255),char(236),char(3),char(83),char(2),char(8), +char(255),char(174),char(3),char(83),char(2),char(12),char(255),char(174),char(3),char(83), +char(2),char(88),char(255),char(215),char(3),char(83),char(3),char(29),char(255),char(215), +char(3),char(83),char(3),char(31),char(255),char(215),char(3),char(83),char(3),char(33), +char(255),char(215),char(3),char(83),char(3),char(35),char(255),char(215),char(3),char(83), +char(3),char(37),char(255),char(215),char(3),char(83),char(3),char(39),char(255),char(215), +char(3),char(83),char(3),char(41),char(255),char(215),char(3),char(83),char(3),char(43), +char(255),char(215),char(3),char(83),char(3),char(45),char(255),char(215),char(3),char(83), +char(3),char(47),char(255),char(215),char(3),char(83),char(3),char(49),char(255),char(215), +char(3),char(83),char(3),char(51),char(255),char(215),char(3),char(83),char(3),char(111), +char(255),char(236),char(3),char(83),char(3),char(113),char(255),char(236),char(3),char(83), +char(3),char(115),char(255),char(236),char(3),char(83),char(3),char(143),char(255),char(195), +char(3),char(85),char(0),char(15),char(255),char(174),char(3),char(85),char(0),char(17), +char(255),char(174),char(3),char(85),char(0),char(36),char(255),char(215),char(3),char(85), +char(0),char(55),char(255),char(195),char(3),char(85),char(0),char(57),char(255),char(236), +char(3),char(85),char(0),char(58),char(255),char(236),char(3),char(85),char(0),char(59), +char(255),char(215),char(3),char(85),char(0),char(60),char(255),char(236),char(3),char(85), +char(0),char(61),char(255),char(236),char(3),char(85),char(0),char(130),char(255),char(215), +char(3),char(85),char(0),char(131),char(255),char(215),char(3),char(85),char(0),char(132), +char(255),char(215),char(3),char(85),char(0),char(133),char(255),char(215),char(3),char(85), +char(0),char(134),char(255),char(215),char(3),char(85),char(0),char(135),char(255),char(215), +char(3),char(85),char(0),char(159),char(255),char(236),char(3),char(85),char(0),char(194), +char(255),char(215),char(3),char(85),char(0),char(196),char(255),char(215),char(3),char(85), +char(0),char(198),char(255),char(215),char(3),char(85),char(1),char(36),char(255),char(195), +char(3),char(85),char(1),char(38),char(255),char(195),char(3),char(85),char(1),char(54), +char(255),char(236),char(3),char(85),char(1),char(56),char(255),char(236),char(3),char(85), +char(1),char(58),char(255),char(236),char(3),char(85),char(1),char(59),char(255),char(236), +char(3),char(85),char(1),char(61),char(255),char(236),char(3),char(85),char(1),char(63), +char(255),char(236),char(3),char(85),char(1),char(67),char(255),char(215),char(3),char(85), +char(1),char(160),char(255),char(236),char(3),char(85),char(1),char(250),char(255),char(236), +char(3),char(85),char(1),char(252),char(255),char(236),char(3),char(85),char(1),char(254), +char(255),char(236),char(3),char(85),char(2),char(0),char(255),char(236),char(3),char(85), +char(2),char(8),char(255),char(174),char(3),char(85),char(2),char(12),char(255),char(174), +char(3),char(85),char(2),char(88),char(255),char(215),char(3),char(85),char(3),char(29), +char(255),char(215),char(3),char(85),char(3),char(31),char(255),char(215),char(3),char(85), +char(3),char(33),char(255),char(215),char(3),char(85),char(3),char(35),char(255),char(215), +char(3),char(85),char(3),char(37),char(255),char(215),char(3),char(85),char(3),char(39), +char(255),char(215),char(3),char(85),char(3),char(41),char(255),char(215),char(3),char(85), +char(3),char(43),char(255),char(215),char(3),char(85),char(3),char(45),char(255),char(215), +char(3),char(85),char(3),char(47),char(255),char(215),char(3),char(85),char(3),char(49), +char(255),char(215),char(3),char(85),char(3),char(51),char(255),char(215),char(3),char(85), +char(3),char(111),char(255),char(236),char(3),char(85),char(3),char(113),char(255),char(236), +char(3),char(85),char(3),char(115),char(255),char(236),char(3),char(85),char(3),char(143), +char(255),char(195),char(3),char(88),char(0),char(73),char(0),char(82),char(3),char(88), +char(0),char(87),char(0),char(82),char(3),char(88),char(0),char(89),char(0),char(102), +char(3),char(88),char(0),char(90),char(0),char(102),char(3),char(88),char(0),char(91), +char(0),char(102),char(3),char(88),char(0),char(92),char(0),char(102),char(3),char(88), +char(0),char(191),char(0),char(102),char(3),char(88),char(1),char(37),char(0),char(82), +char(3),char(88),char(1),char(39),char(0),char(82),char(3),char(88),char(1),char(55), +char(0),char(102),char(3),char(88),char(1),char(251),char(0),char(102),char(3),char(88), +char(1),char(253),char(0),char(102),char(3),char(88),char(2),char(52),char(0),char(82), +char(3),char(88),char(2),char(53),char(0),char(82),char(3),char(88),char(2),char(93), +char(0),char(82),char(3),char(88),char(2),char(94),char(0),char(82),char(3),char(88), +char(3),char(112),char(0),char(102),char(3),char(88),char(3),char(141),char(0),char(82), +char(3),char(88),char(3),char(144),char(0),char(82),char(3),char(90),char(0),char(73), +char(0),char(82),char(3),char(90),char(0),char(87),char(0),char(82),char(3),char(90), +char(0),char(89),char(0),char(102),char(3),char(90),char(0),char(90),char(0),char(102), +char(3),char(90),char(0),char(91),char(0),char(102),char(3),char(90),char(0),char(92), +char(0),char(102),char(3),char(90),char(0),char(191),char(0),char(102),char(3),char(90), +char(1),char(37),char(0),char(82),char(3),char(90),char(1),char(39),char(0),char(82), +char(3),char(90),char(1),char(55),char(0),char(102),char(3),char(90),char(1),char(251), +char(0),char(102),char(3),char(90),char(1),char(253),char(0),char(102),char(3),char(90), +char(2),char(52),char(0),char(82),char(3),char(90),char(2),char(53),char(0),char(82), +char(3),char(90),char(2),char(93),char(0),char(82),char(3),char(90),char(2),char(94), +char(0),char(82),char(3),char(90),char(3),char(112),char(0),char(102),char(3),char(90), +char(3),char(141),char(0),char(82),char(3),char(90),char(3),char(144),char(0),char(82), +char(3),char(92),char(0),char(73),char(0),char(82),char(3),char(92),char(0),char(87), +char(0),char(82),char(3),char(92),char(0),char(89),char(0),char(102),char(3),char(92), +char(0),char(90),char(0),char(102),char(3),char(92),char(0),char(91),char(0),char(102), +char(3),char(92),char(0),char(92),char(0),char(102),char(3),char(92),char(0),char(191), +char(0),char(102),char(3),char(92),char(1),char(37),char(0),char(82),char(3),char(92), +char(1),char(39),char(0),char(82),char(3),char(92),char(1),char(55),char(0),char(102), +char(3),char(92),char(1),char(251),char(0),char(102),char(3),char(92),char(1),char(253), +char(0),char(102),char(3),char(92),char(2),char(52),char(0),char(82),char(3),char(92), +char(2),char(53),char(0),char(82),char(3),char(92),char(2),char(93),char(0),char(82), +char(3),char(92),char(2),char(94),char(0),char(82),char(3),char(92),char(3),char(112), +char(0),char(102),char(3),char(92),char(3),char(141),char(0),char(82),char(3),char(92), +char(3),char(144),char(0),char(82),char(3),char(94),char(0),char(73),char(0),char(82), +char(3),char(94),char(0),char(87),char(0),char(82),char(3),char(94),char(0),char(89), +char(0),char(102),char(3),char(94),char(0),char(90),char(0),char(102),char(3),char(94), +char(0),char(91),char(0),char(102),char(3),char(94),char(0),char(92),char(0),char(102), +char(3),char(94),char(0),char(191),char(0),char(102),char(3),char(94),char(1),char(37), +char(0),char(82),char(3),char(94),char(1),char(39),char(0),char(82),char(3),char(94), +char(1),char(55),char(0),char(102),char(3),char(94),char(1),char(251),char(0),char(102), +char(3),char(94),char(1),char(253),char(0),char(102),char(3),char(94),char(2),char(52), +char(0),char(82),char(3),char(94),char(2),char(53),char(0),char(82),char(3),char(94), +char(2),char(93),char(0),char(82),char(3),char(94),char(2),char(94),char(0),char(82), +char(3),char(94),char(3),char(112),char(0),char(102),char(3),char(94),char(3),char(141), +char(0),char(82),char(3),char(94),char(3),char(144),char(0),char(82),char(3),char(96), +char(0),char(73),char(0),char(82),char(3),char(96),char(0),char(87),char(0),char(82), +char(3),char(96),char(0),char(89),char(0),char(102),char(3),char(96),char(0),char(90), +char(0),char(102),char(3),char(96),char(0),char(91),char(0),char(102),char(3),char(96), +char(0),char(92),char(0),char(102),char(3),char(96),char(0),char(191),char(0),char(102), +char(3),char(96),char(1),char(37),char(0),char(82),char(3),char(96),char(1),char(39), +char(0),char(82),char(3),char(96),char(1),char(55),char(0),char(102),char(3),char(96), +char(1),char(251),char(0),char(102),char(3),char(96),char(1),char(253),char(0),char(102), +char(3),char(96),char(2),char(52),char(0),char(82),char(3),char(96),char(2),char(53), +char(0),char(82),char(3),char(96),char(2),char(93),char(0),char(82),char(3),char(96), +char(2),char(94),char(0),char(82),char(3),char(96),char(3),char(112),char(0),char(102), +char(3),char(96),char(3),char(141),char(0),char(82),char(3),char(96),char(3),char(144), +char(0),char(82),char(3),char(97),char(0),char(15),char(255),char(215),char(3),char(97), +char(0),char(17),char(255),char(215),char(3),char(97),char(0),char(36),char(255),char(236), +char(3),char(97),char(0),char(130),char(255),char(236),char(3),char(97),char(0),char(131), +char(255),char(236),char(3),char(97),char(0),char(132),char(255),char(236),char(3),char(97), +char(0),char(133),char(255),char(236),char(3),char(97),char(0),char(134),char(255),char(236), +char(3),char(97),char(0),char(135),char(255),char(236),char(3),char(97),char(0),char(194), +char(255),char(236),char(3),char(97),char(0),char(196),char(255),char(236),char(3),char(97), +char(0),char(198),char(255),char(236),char(3),char(97),char(1),char(67),char(255),char(236), +char(3),char(97),char(2),char(8),char(255),char(215),char(3),char(97),char(2),char(12), +char(255),char(215),char(3),char(97),char(2),char(88),char(255),char(236),char(3),char(97), +char(3),char(29),char(255),char(236),char(3),char(97),char(3),char(31),char(255),char(236), +char(3),char(97),char(3),char(33),char(255),char(236),char(3),char(97),char(3),char(35), +char(255),char(236),char(3),char(97),char(3),char(37),char(255),char(236),char(3),char(97), +char(3),char(39),char(255),char(236),char(3),char(97),char(3),char(41),char(255),char(236), +char(3),char(97),char(3),char(43),char(255),char(236),char(3),char(97),char(3),char(45), +char(255),char(236),char(3),char(97),char(3),char(47),char(255),char(236),char(3),char(97), +char(3),char(49),char(255),char(236),char(3),char(97),char(3),char(51),char(255),char(236), +char(3),char(102),char(0),char(73),char(0),char(102),char(3),char(102),char(0),char(87), +char(0),char(102),char(3),char(102),char(0),char(89),char(0),char(102),char(3),char(102), +char(0),char(90),char(0),char(102),char(3),char(102),char(0),char(91),char(0),char(102), +char(3),char(102),char(0),char(92),char(0),char(102),char(3),char(102),char(0),char(191), +char(0),char(102),char(3),char(102),char(1),char(37),char(0),char(102),char(3),char(102), +char(1),char(39),char(0),char(102),char(3),char(102),char(1),char(55),char(0),char(102), +char(3),char(102),char(1),char(251),char(0),char(102),char(3),char(102),char(1),char(253), +char(0),char(102),char(3),char(102),char(2),char(52),char(0),char(102),char(3),char(102), +char(2),char(53),char(0),char(102),char(3),char(102),char(2),char(93),char(0),char(102), +char(3),char(102),char(2),char(94),char(0),char(102),char(3),char(102),char(3),char(112), +char(0),char(102),char(3),char(102),char(3),char(141),char(0),char(102),char(3),char(102), +char(3),char(144),char(0),char(102),char(3),char(104),char(0),char(73),char(0),char(102), +char(3),char(104),char(0),char(87),char(0),char(102),char(3),char(104),char(0),char(89), +char(0),char(102),char(3),char(104),char(0),char(90),char(0),char(102),char(3),char(104), +char(0),char(91),char(0),char(102),char(3),char(104),char(0),char(92),char(0),char(102), +char(3),char(104),char(0),char(191),char(0),char(102),char(3),char(104),char(1),char(37), +char(0),char(102),char(3),char(104),char(1),char(39),char(0),char(102),char(3),char(104), +char(1),char(55),char(0),char(102),char(3),char(104),char(1),char(251),char(0),char(102), +char(3),char(104),char(1),char(253),char(0),char(102),char(3),char(104),char(2),char(52), +char(0),char(102),char(3),char(104),char(2),char(53),char(0),char(102),char(3),char(104), +char(2),char(93),char(0),char(102),char(3),char(104),char(2),char(94),char(0),char(102), +char(3),char(104),char(3),char(112),char(0),char(102),char(3),char(104),char(3),char(141), +char(0),char(102),char(3),char(104),char(3),char(144),char(0),char(102),char(3),char(106), +char(0),char(73),char(0),char(102),char(3),char(106),char(0),char(87),char(0),char(102), +char(3),char(106),char(0),char(89),char(0),char(102),char(3),char(106),char(0),char(90), +char(0),char(102),char(3),char(106),char(0),char(91),char(0),char(102),char(3),char(106), +char(0),char(92),char(0),char(102),char(3),char(106),char(0),char(191),char(0),char(102), +char(3),char(106),char(1),char(37),char(0),char(102),char(3),char(106),char(1),char(39), +char(0),char(102),char(3),char(106),char(1),char(55),char(0),char(102),char(3),char(106), +char(1),char(251),char(0),char(102),char(3),char(106),char(1),char(253),char(0),char(102), +char(3),char(106),char(2),char(52),char(0),char(102),char(3),char(106),char(2),char(53), +char(0),char(102),char(3),char(106),char(2),char(93),char(0),char(102),char(3),char(106), +char(2),char(94),char(0),char(102),char(3),char(106),char(3),char(112),char(0),char(102), +char(3),char(106),char(3),char(141),char(0),char(102),char(3),char(106),char(3),char(144), +char(0),char(102),char(3),char(108),char(0),char(73),char(0),char(102),char(3),char(108), +char(0),char(87),char(0),char(102),char(3),char(108),char(0),char(89),char(0),char(102), +char(3),char(108),char(0),char(90),char(0),char(102),char(3),char(108),char(0),char(91), +char(0),char(102),char(3),char(108),char(0),char(92),char(0),char(102),char(3),char(108), +char(0),char(191),char(0),char(102),char(3),char(108),char(1),char(37),char(0),char(102), +char(3),char(108),char(1),char(39),char(0),char(102),char(3),char(108),char(1),char(55), +char(0),char(102),char(3),char(108),char(1),char(251),char(0),char(102),char(3),char(108), +char(1),char(253),char(0),char(102),char(3),char(108),char(2),char(52),char(0),char(102), +char(3),char(108),char(2),char(53),char(0),char(102),char(3),char(108),char(2),char(93), +char(0),char(102),char(3),char(108),char(2),char(94),char(0),char(102),char(3),char(108), +char(3),char(112),char(0),char(102),char(3),char(108),char(3),char(141),char(0),char(102), +char(3),char(108),char(3),char(144),char(0),char(102),char(3),char(110),char(0),char(73), +char(0),char(102),char(3),char(110),char(0),char(87),char(0),char(102),char(3),char(110), +char(0),char(89),char(0),char(102),char(3),char(110),char(0),char(90),char(0),char(102), +char(3),char(110),char(0),char(91),char(0),char(102),char(3),char(110),char(0),char(92), +char(0),char(102),char(3),char(110),char(0),char(191),char(0),char(102),char(3),char(110), +char(1),char(37),char(0),char(102),char(3),char(110),char(1),char(39),char(0),char(102), +char(3),char(110),char(1),char(55),char(0),char(102),char(3),char(110),char(1),char(251), +char(0),char(102),char(3),char(110),char(1),char(253),char(0),char(102),char(3),char(110), +char(2),char(52),char(0),char(102),char(3),char(110),char(2),char(53),char(0),char(102), +char(3),char(110),char(2),char(93),char(0),char(102),char(3),char(110),char(2),char(94), +char(0),char(102),char(3),char(110),char(3),char(112),char(0),char(102),char(3),char(110), +char(3),char(141),char(0),char(102),char(3),char(110),char(3),char(144),char(0),char(102), +char(3),char(111),char(0),char(15),char(255),char(133),char(3),char(111),char(0),char(17), +char(255),char(133),char(3),char(111),char(0),char(34),char(0),char(41),char(3),char(111), +char(0),char(36),char(255),char(133),char(3),char(111),char(0),char(38),char(255),char(215), +char(3),char(111),char(0),char(42),char(255),char(215),char(3),char(111),char(0),char(50), +char(255),char(215),char(3),char(111),char(0),char(52),char(255),char(215),char(3),char(111), +char(0),char(68),char(255),char(154),char(3),char(111),char(0),char(70),char(255),char(154), +char(3),char(111),char(0),char(71),char(255),char(154),char(3),char(111),char(0),char(72), +char(255),char(154),char(3),char(111),char(0),char(74),char(255),char(215),char(3),char(111), +char(0),char(80),char(255),char(195),char(3),char(111),char(0),char(81),char(255),char(195), +char(3),char(111),char(0),char(82),char(255),char(154),char(3),char(111),char(0),char(83), +char(255),char(195),char(3),char(111),char(0),char(84),char(255),char(154),char(3),char(111), +char(0),char(85),char(255),char(195),char(3),char(111),char(0),char(86),char(255),char(174), +char(3),char(111),char(0),char(88),char(255),char(195),char(3),char(111),char(0),char(93), +char(255),char(215),char(3),char(111),char(0),char(130),char(255),char(133),char(3),char(111), +char(0),char(131),char(255),char(133),char(3),char(111),char(0),char(132),char(255),char(133), +char(3),char(111),char(0),char(133),char(255),char(133),char(3),char(111),char(0),char(134), +char(255),char(133),char(3),char(111),char(0),char(135),char(255),char(133),char(3),char(111), +char(0),char(137),char(255),char(215),char(3),char(111),char(0),char(148),char(255),char(215), +char(3),char(111),char(0),char(149),char(255),char(215),char(3),char(111),char(0),char(150), +char(255),char(215),char(3),char(111),char(0),char(151),char(255),char(215),char(3),char(111), +char(0),char(152),char(255),char(215),char(3),char(111),char(0),char(154),char(255),char(215), +char(3),char(111),char(0),char(162),char(255),char(154),char(3),char(111),char(0),char(163), +char(255),char(154),char(3),char(111),char(0),char(164),char(255),char(154),char(3),char(111), +char(0),char(165),char(255),char(154),char(3),char(111),char(0),char(166),char(255),char(154), +char(3),char(111),char(0),char(167),char(255),char(154),char(3),char(111),char(0),char(168), +char(255),char(154),char(3),char(111),char(0),char(169),char(255),char(154),char(3),char(111), +char(0),char(170),char(255),char(154),char(3),char(111),char(0),char(171),char(255),char(154), +char(3),char(111),char(0),char(172),char(255),char(154),char(3),char(111),char(0),char(173), +char(255),char(154),char(3),char(111),char(0),char(180),char(255),char(154),char(3),char(111), +char(0),char(181),char(255),char(154),char(3),char(111),char(0),char(182),char(255),char(154), +char(3),char(111),char(0),char(183),char(255),char(154),char(3),char(111),char(0),char(184), +char(255),char(154),char(3),char(111),char(0),char(186),char(255),char(154),char(3),char(111), +char(0),char(187),char(255),char(195),char(3),char(111),char(0),char(188),char(255),char(195), +char(3),char(111),char(0),char(189),char(255),char(195),char(3),char(111),char(0),char(190), +char(255),char(195),char(3),char(111),char(0),char(194),char(255),char(133),char(3),char(111), +char(0),char(195),char(255),char(154),char(3),char(111),char(0),char(196),char(255),char(133), +char(3),char(111),char(0),char(197),char(255),char(154),char(3),char(111),char(0),char(198), +char(255),char(133),char(3),char(111),char(0),char(199),char(255),char(154),char(3),char(111), +char(0),char(200),char(255),char(215),char(3),char(111),char(0),char(201),char(255),char(154), +char(3),char(111),char(0),char(202),char(255),char(215),char(3),char(111),char(0),char(203), +char(255),char(154),char(3),char(111),char(0),char(204),char(255),char(215),char(3),char(111), +char(0),char(205),char(255),char(154),char(3),char(111),char(0),char(206),char(255),char(215), +char(3),char(111),char(0),char(207),char(255),char(154),char(3),char(111),char(0),char(209), +char(255),char(154),char(3),char(111),char(0),char(211),char(255),char(154),char(3),char(111), +char(0),char(213),char(255),char(154),char(3),char(111),char(0),char(215),char(255),char(154), +char(3),char(111),char(0),char(217),char(255),char(154),char(3),char(111),char(0),char(219), +char(255),char(154),char(3),char(111),char(0),char(221),char(255),char(154),char(3),char(111), +char(0),char(222),char(255),char(215),char(3),char(111),char(0),char(223),char(255),char(215), +char(3),char(111),char(0),char(224),char(255),char(215),char(3),char(111),char(0),char(225), +char(255),char(215),char(3),char(111),char(0),char(226),char(255),char(215),char(3),char(111), +char(0),char(227),char(255),char(215),char(3),char(111),char(0),char(228),char(255),char(215), +char(3),char(111),char(0),char(229),char(255),char(215),char(3),char(111),char(0),char(250), +char(255),char(195),char(3),char(111),char(1),char(6),char(255),char(195),char(3),char(111), +char(1),char(8),char(255),char(195),char(3),char(111),char(1),char(13),char(255),char(195), +char(3),char(111),char(1),char(14),char(255),char(215),char(3),char(111),char(1),char(15), +char(255),char(154),char(3),char(111),char(1),char(16),char(255),char(215),char(3),char(111), +char(1),char(17),char(255),char(154),char(3),char(111),char(1),char(18),char(255),char(215), +char(3),char(111),char(1),char(19),char(255),char(154),char(3),char(111),char(1),char(20), +char(255),char(215),char(3),char(111),char(1),char(21),char(255),char(154),char(3),char(111), +char(1),char(23),char(255),char(195),char(3),char(111),char(1),char(25),char(255),char(195), +char(3),char(111),char(1),char(29),char(255),char(174),char(3),char(111),char(1),char(33), +char(255),char(174),char(3),char(111),char(1),char(43),char(255),char(195),char(3),char(111), +char(1),char(45),char(255),char(195),char(3),char(111),char(1),char(47),char(255),char(195), +char(3),char(111),char(1),char(49),char(255),char(195),char(3),char(111),char(1),char(51), +char(255),char(195),char(3),char(111),char(1),char(53),char(255),char(195),char(3),char(111), +char(1),char(60),char(255),char(215),char(3),char(111),char(1),char(62),char(255),char(215), +char(3),char(111),char(1),char(64),char(255),char(215),char(3),char(111),char(1),char(67), +char(255),char(133),char(3),char(111),char(1),char(68),char(255),char(154),char(3),char(111), +char(1),char(70),char(255),char(154),char(3),char(111),char(1),char(71),char(255),char(215), +char(3),char(111),char(1),char(72),char(255),char(154),char(3),char(111),char(1),char(74), +char(255),char(174),char(3),char(111),char(2),char(8),char(255),char(133),char(3),char(111), +char(2),char(12),char(255),char(133),char(3),char(111),char(2),char(87),char(255),char(195), +char(3),char(111),char(2),char(88),char(255),char(133),char(3),char(111),char(2),char(89), +char(255),char(154),char(3),char(111),char(2),char(95),char(255),char(215),char(3),char(111), +char(2),char(96),char(255),char(154),char(3),char(111),char(2),char(98),char(255),char(195), +char(3),char(111),char(3),char(29),char(255),char(133),char(3),char(111),char(3),char(30), +char(255),char(154),char(3),char(111),char(3),char(31),char(255),char(133),char(3),char(111), +char(3),char(32),char(255),char(154),char(3),char(111),char(3),char(33),char(255),char(133), +char(3),char(111),char(3),char(34),char(255),char(154),char(3),char(111),char(3),char(35), +char(255),char(133),char(3),char(111),char(3),char(37),char(255),char(133),char(3),char(111), +char(3),char(38),char(255),char(154),char(3),char(111),char(3),char(39),char(255),char(133), +char(3),char(111),char(3),char(40),char(255),char(154),char(3),char(111),char(3),char(41), +char(255),char(133),char(3),char(111),char(3),char(42),char(255),char(154),char(3),char(111), +char(3),char(43),char(255),char(133),char(3),char(111),char(3),char(44),char(255),char(154), +char(3),char(111),char(3),char(45),char(255),char(133),char(3),char(111),char(3),char(46), +char(255),char(154),char(3),char(111),char(3),char(47),char(255),char(133),char(3),char(111), +char(3),char(48),char(255),char(154),char(3),char(111),char(3),char(49),char(255),char(133), +char(3),char(111),char(3),char(50),char(255),char(154),char(3),char(111),char(3),char(51), +char(255),char(133),char(3),char(111),char(3),char(52),char(255),char(154),char(3),char(111), +char(3),char(54),char(255),char(154),char(3),char(111),char(3),char(56),char(255),char(154), +char(3),char(111),char(3),char(58),char(255),char(154),char(3),char(111),char(3),char(60), +char(255),char(154),char(3),char(111),char(3),char(64),char(255),char(154),char(3),char(111), +char(3),char(66),char(255),char(154),char(3),char(111),char(3),char(68),char(255),char(154), +char(3),char(111),char(3),char(73),char(255),char(215),char(3),char(111),char(3),char(74), +char(255),char(154),char(3),char(111),char(3),char(75),char(255),char(215),char(3),char(111), +char(3),char(76),char(255),char(154),char(3),char(111),char(3),char(77),char(255),char(215), +char(3),char(111),char(3),char(78),char(255),char(154),char(3),char(111),char(3),char(79), +char(255),char(215),char(3),char(111),char(3),char(81),char(255),char(215),char(3),char(111), +char(3),char(82),char(255),char(154),char(3),char(111),char(3),char(83),char(255),char(215), +char(3),char(111),char(3),char(84),char(255),char(154),char(3),char(111),char(3),char(85), +char(255),char(215),char(3),char(111),char(3),char(86),char(255),char(154),char(3),char(111), +char(3),char(87),char(255),char(215),char(3),char(111),char(3),char(88),char(255),char(154), +char(3),char(111),char(3),char(89),char(255),char(215),char(3),char(111),char(3),char(90), +char(255),char(154),char(3),char(111),char(3),char(91),char(255),char(215),char(3),char(111), +char(3),char(92),char(255),char(154),char(3),char(111),char(3),char(93),char(255),char(215), +char(3),char(111),char(3),char(94),char(255),char(154),char(3),char(111),char(3),char(95), +char(255),char(215),char(3),char(111),char(3),char(96),char(255),char(154),char(3),char(111), +char(3),char(98),char(255),char(195),char(3),char(111),char(3),char(100),char(255),char(195), +char(3),char(111),char(3),char(102),char(255),char(195),char(3),char(111),char(3),char(104), +char(255),char(195),char(3),char(111),char(3),char(106),char(255),char(195),char(3),char(111), +char(3),char(108),char(255),char(195),char(3),char(111),char(3),char(110),char(255),char(195), +char(3),char(112),char(0),char(5),char(0),char(82),char(3),char(112),char(0),char(10), +char(0),char(82),char(3),char(112),char(0),char(15),char(255),char(174),char(3),char(112), +char(0),char(17),char(255),char(174),char(3),char(112),char(0),char(34),char(0),char(41), +char(3),char(112),char(2),char(7),char(0),char(82),char(3),char(112),char(2),char(8), +char(255),char(174),char(3),char(112),char(2),char(11),char(0),char(82),char(3),char(112), +char(2),char(12),char(255),char(174),char(3),char(113),char(0),char(15),char(255),char(133), +char(3),char(113),char(0),char(17),char(255),char(133),char(3),char(113),char(0),char(34), +char(0),char(41),char(3),char(113),char(0),char(36),char(255),char(133),char(3),char(113), +char(0),char(38),char(255),char(215),char(3),char(113),char(0),char(42),char(255),char(215), +char(3),char(113),char(0),char(50),char(255),char(215),char(3),char(113),char(0),char(52), +char(255),char(215),char(3),char(113),char(0),char(68),char(255),char(154),char(3),char(113), +char(0),char(70),char(255),char(154),char(3),char(113),char(0),char(71),char(255),char(154), +char(3),char(113),char(0),char(72),char(255),char(154),char(3),char(113),char(0),char(74), +char(255),char(215),char(3),char(113),char(0),char(80),char(255),char(195),char(3),char(113), +char(0),char(81),char(255),char(195),char(3),char(113),char(0),char(82),char(255),char(154), +char(3),char(113),char(0),char(83),char(255),char(195),char(3),char(113),char(0),char(84), +char(255),char(154),char(3),char(113),char(0),char(85),char(255),char(195),char(3),char(113), +char(0),char(86),char(255),char(174),char(3),char(113),char(0),char(88),char(255),char(195), +char(3),char(113),char(0),char(93),char(255),char(215),char(3),char(113),char(0),char(130), +char(255),char(133),char(3),char(113),char(0),char(131),char(255),char(133),char(3),char(113), +char(0),char(132),char(255),char(133),char(3),char(113),char(0),char(133),char(255),char(133), +char(3),char(113),char(0),char(134),char(255),char(133),char(3),char(113),char(0),char(135), +char(255),char(133),char(3),char(113),char(0),char(137),char(255),char(215),char(3),char(113), +char(0),char(148),char(255),char(215),char(3),char(113),char(0),char(149),char(255),char(215), +char(3),char(113),char(0),char(150),char(255),char(215),char(3),char(113),char(0),char(151), +char(255),char(215),char(3),char(113),char(0),char(152),char(255),char(215),char(3),char(113), +char(0),char(154),char(255),char(215),char(3),char(113),char(0),char(162),char(255),char(154), +char(3),char(113),char(0),char(163),char(255),char(154),char(3),char(113),char(0),char(164), +char(255),char(154),char(3),char(113),char(0),char(165),char(255),char(154),char(3),char(113), +char(0),char(166),char(255),char(154),char(3),char(113),char(0),char(167),char(255),char(154), +char(3),char(113),char(0),char(168),char(255),char(154),char(3),char(113),char(0),char(169), +char(255),char(154),char(3),char(113),char(0),char(170),char(255),char(154),char(3),char(113), +char(0),char(171),char(255),char(154),char(3),char(113),char(0),char(172),char(255),char(154), +char(3),char(113),char(0),char(173),char(255),char(154),char(3),char(113),char(0),char(180), +char(255),char(154),char(3),char(113),char(0),char(181),char(255),char(154),char(3),char(113), +char(0),char(182),char(255),char(154),char(3),char(113),char(0),char(183),char(255),char(154), +char(3),char(113),char(0),char(184),char(255),char(154),char(3),char(113),char(0),char(186), +char(255),char(154),char(3),char(113),char(0),char(187),char(255),char(195),char(3),char(113), +char(0),char(188),char(255),char(195),char(3),char(113),char(0),char(189),char(255),char(195), +char(3),char(113),char(0),char(190),char(255),char(195),char(3),char(113),char(0),char(194), +char(255),char(133),char(3),char(113),char(0),char(195),char(255),char(154),char(3),char(113), +char(0),char(196),char(255),char(133),char(3),char(113),char(0),char(197),char(255),char(154), +char(3),char(113),char(0),char(198),char(255),char(133),char(3),char(113),char(0),char(199), +char(255),char(154),char(3),char(113),char(0),char(200),char(255),char(215),char(3),char(113), +char(0),char(201),char(255),char(154),char(3),char(113),char(0),char(202),char(255),char(215), +char(3),char(113),char(0),char(203),char(255),char(154),char(3),char(113),char(0),char(204), +char(255),char(215),char(3),char(113),char(0),char(205),char(255),char(154),char(3),char(113), +char(0),char(206),char(255),char(215),char(3),char(113),char(0),char(207),char(255),char(154), +char(3),char(113),char(0),char(209),char(255),char(154),char(3),char(113),char(0),char(211), +char(255),char(154),char(3),char(113),char(0),char(213),char(255),char(154),char(3),char(113), +char(0),char(215),char(255),char(154),char(3),char(113),char(0),char(217),char(255),char(154), +char(3),char(113),char(0),char(219),char(255),char(154),char(3),char(113),char(0),char(221), +char(255),char(154),char(3),char(113),char(0),char(222),char(255),char(215),char(3),char(113), +char(0),char(223),char(255),char(215),char(3),char(113),char(0),char(224),char(255),char(215), +char(3),char(113),char(0),char(225),char(255),char(215),char(3),char(113),char(0),char(226), +char(255),char(215),char(3),char(113),char(0),char(227),char(255),char(215),char(3),char(113), +char(0),char(228),char(255),char(215),char(3),char(113),char(0),char(229),char(255),char(215), +char(3),char(113),char(0),char(250),char(255),char(195),char(3),char(113),char(1),char(6), +char(255),char(195),char(3),char(113),char(1),char(8),char(255),char(195),char(3),char(113), +char(1),char(13),char(255),char(195),char(3),char(113),char(1),char(14),char(255),char(215), +char(3),char(113),char(1),char(15),char(255),char(154),char(3),char(113),char(1),char(16), +char(255),char(215),char(3),char(113),char(1),char(17),char(255),char(154),char(3),char(113), +char(1),char(18),char(255),char(215),char(3),char(113),char(1),char(19),char(255),char(154), +char(3),char(113),char(1),char(20),char(255),char(215),char(3),char(113),char(1),char(21), +char(255),char(154),char(3),char(113),char(1),char(23),char(255),char(195),char(3),char(113), +char(1),char(25),char(255),char(195),char(3),char(113),char(1),char(29),char(255),char(174), +char(3),char(113),char(1),char(33),char(255),char(174),char(3),char(113),char(1),char(43), +char(255),char(195),char(3),char(113),char(1),char(45),char(255),char(195),char(3),char(113), +char(1),char(47),char(255),char(195),char(3),char(113),char(1),char(49),char(255),char(195), +char(3),char(113),char(1),char(51),char(255),char(195),char(3),char(113),char(1),char(53), +char(255),char(195),char(3),char(113),char(1),char(60),char(255),char(215),char(3),char(113), +char(1),char(62),char(255),char(215),char(3),char(113),char(1),char(64),char(255),char(215), +char(3),char(113),char(1),char(67),char(255),char(133),char(3),char(113),char(1),char(68), +char(255),char(154),char(3),char(113),char(1),char(70),char(255),char(154),char(3),char(113), +char(1),char(71),char(255),char(215),char(3),char(113),char(1),char(72),char(255),char(154), +char(3),char(113),char(1),char(74),char(255),char(174),char(3),char(113),char(2),char(8), +char(255),char(133),char(3),char(113),char(2),char(12),char(255),char(133),char(3),char(113), +char(2),char(87),char(255),char(195),char(3),char(113),char(2),char(88),char(255),char(133), +char(3),char(113),char(2),char(89),char(255),char(154),char(3),char(113),char(2),char(95), +char(255),char(215),char(3),char(113),char(2),char(96),char(255),char(154),char(3),char(113), +char(2),char(98),char(255),char(195),char(3),char(113),char(3),char(29),char(255),char(133), +char(3),char(113),char(3),char(30),char(255),char(154),char(3),char(113),char(3),char(31), +char(255),char(133),char(3),char(113),char(3),char(32),char(255),char(154),char(3),char(113), +char(3),char(33),char(255),char(133),char(3),char(113),char(3),char(34),char(255),char(154), +char(3),char(113),char(3),char(35),char(255),char(133),char(3),char(113),char(3),char(37), +char(255),char(133),char(3),char(113),char(3),char(38),char(255),char(154),char(3),char(113), +char(3),char(39),char(255),char(133),char(3),char(113),char(3),char(40),char(255),char(154), +char(3),char(113),char(3),char(41),char(255),char(133),char(3),char(113),char(3),char(42), +char(255),char(154),char(3),char(113),char(3),char(43),char(255),char(133),char(3),char(113), +char(3),char(44),char(255),char(154),char(3),char(113),char(3),char(45),char(255),char(133), +char(3),char(113),char(3),char(46),char(255),char(154),char(3),char(113),char(3),char(47), +char(255),char(133),char(3),char(113),char(3),char(48),char(255),char(154),char(3),char(113), +char(3),char(49),char(255),char(133),char(3),char(113),char(3),char(50),char(255),char(154), +char(3),char(113),char(3),char(51),char(255),char(133),char(3),char(113),char(3),char(52), +char(255),char(154),char(3),char(113),char(3),char(54),char(255),char(154),char(3),char(113), +char(3),char(56),char(255),char(154),char(3),char(113),char(3),char(58),char(255),char(154), +char(3),char(113),char(3),char(60),char(255),char(154),char(3),char(113),char(3),char(64), +char(255),char(154),char(3),char(113),char(3),char(66),char(255),char(154),char(3),char(113), +char(3),char(68),char(255),char(154),char(3),char(113),char(3),char(73),char(255),char(215), +char(3),char(113),char(3),char(74),char(255),char(154),char(3),char(113),char(3),char(75), +char(255),char(215),char(3),char(113),char(3),char(76),char(255),char(154),char(3),char(113), +char(3),char(77),char(255),char(215),char(3),char(113),char(3),char(78),char(255),char(154), +char(3),char(113),char(3),char(79),char(255),char(215),char(3),char(113),char(3),char(81), +char(255),char(215),char(3),char(113),char(3),char(82),char(255),char(154),char(3),char(113), +char(3),char(83),char(255),char(215),char(3),char(113),char(3),char(84),char(255),char(154), +char(3),char(113),char(3),char(85),char(255),char(215),char(3),char(113),char(3),char(86), +char(255),char(154),char(3),char(113),char(3),char(87),char(255),char(215),char(3),char(113), +char(3),char(88),char(255),char(154),char(3),char(113),char(3),char(89),char(255),char(215), +char(3),char(113),char(3),char(90),char(255),char(154),char(3),char(113),char(3),char(91), +char(255),char(215),char(3),char(113),char(3),char(92),char(255),char(154),char(3),char(113), +char(3),char(93),char(255),char(215),char(3),char(113),char(3),char(94),char(255),char(154), +char(3),char(113),char(3),char(95),char(255),char(215),char(3),char(113),char(3),char(96), +char(255),char(154),char(3),char(113),char(3),char(98),char(255),char(195),char(3),char(113), +char(3),char(100),char(255),char(195),char(3),char(113),char(3),char(102),char(255),char(195), +char(3),char(113),char(3),char(104),char(255),char(195),char(3),char(113),char(3),char(106), +char(255),char(195),char(3),char(113),char(3),char(108),char(255),char(195),char(3),char(113), +char(3),char(110),char(255),char(195),char(3),char(114),char(0),char(5),char(0),char(82), +char(3),char(114),char(0),char(10),char(0),char(82),char(3),char(114),char(0),char(15), +char(255),char(174),char(3),char(114),char(0),char(17),char(255),char(174),char(3),char(114), +char(0),char(34),char(0),char(41),char(3),char(114),char(2),char(7),char(0),char(82), +char(3),char(114),char(2),char(8),char(255),char(174),char(3),char(114),char(2),char(11), +char(0),char(82),char(3),char(114),char(2),char(12),char(255),char(174),char(3),char(115), +char(0),char(15),char(255),char(133),char(3),char(115),char(0),char(17),char(255),char(133), +char(3),char(115),char(0),char(34),char(0),char(41),char(3),char(115),char(0),char(36), +char(255),char(133),char(3),char(115),char(0),char(38),char(255),char(215),char(3),char(115), +char(0),char(42),char(255),char(215),char(3),char(115),char(0),char(50),char(255),char(215), +char(3),char(115),char(0),char(52),char(255),char(215),char(3),char(115),char(0),char(68), +char(255),char(154),char(3),char(115),char(0),char(70),char(255),char(154),char(3),char(115), +char(0),char(71),char(255),char(154),char(3),char(115),char(0),char(72),char(255),char(154), +char(3),char(115),char(0),char(74),char(255),char(215),char(3),char(115),char(0),char(80), +char(255),char(195),char(3),char(115),char(0),char(81),char(255),char(195),char(3),char(115), +char(0),char(82),char(255),char(154),char(3),char(115),char(0),char(83),char(255),char(195), +char(3),char(115),char(0),char(84),char(255),char(154),char(3),char(115),char(0),char(85), +char(255),char(195),char(3),char(115),char(0),char(86),char(255),char(174),char(3),char(115), +char(0),char(88),char(255),char(195),char(3),char(115),char(0),char(93),char(255),char(215), +char(3),char(115),char(0),char(130),char(255),char(133),char(3),char(115),char(0),char(131), +char(255),char(133),char(3),char(115),char(0),char(132),char(255),char(133),char(3),char(115), +char(0),char(133),char(255),char(133),char(3),char(115),char(0),char(134),char(255),char(133), +char(3),char(115),char(0),char(135),char(255),char(133),char(3),char(115),char(0),char(137), +char(255),char(215),char(3),char(115),char(0),char(148),char(255),char(215),char(3),char(115), +char(0),char(149),char(255),char(215),char(3),char(115),char(0),char(150),char(255),char(215), +char(3),char(115),char(0),char(151),char(255),char(215),char(3),char(115),char(0),char(152), +char(255),char(215),char(3),char(115),char(0),char(154),char(255),char(215),char(3),char(115), +char(0),char(162),char(255),char(154),char(3),char(115),char(0),char(163),char(255),char(154), +char(3),char(115),char(0),char(164),char(255),char(154),char(3),char(115),char(0),char(165), +char(255),char(154),char(3),char(115),char(0),char(166),char(255),char(154),char(3),char(115), +char(0),char(167),char(255),char(154),char(3),char(115),char(0),char(168),char(255),char(154), +char(3),char(115),char(0),char(169),char(255),char(154),char(3),char(115),char(0),char(170), +char(255),char(154),char(3),char(115),char(0),char(171),char(255),char(154),char(3),char(115), +char(0),char(172),char(255),char(154),char(3),char(115),char(0),char(173),char(255),char(154), +char(3),char(115),char(0),char(180),char(255),char(154),char(3),char(115),char(0),char(181), +char(255),char(154),char(3),char(115),char(0),char(182),char(255),char(154),char(3),char(115), +char(0),char(183),char(255),char(154),char(3),char(115),char(0),char(184),char(255),char(154), +char(3),char(115),char(0),char(186),char(255),char(154),char(3),char(115),char(0),char(187), +char(255),char(195),char(3),char(115),char(0),char(188),char(255),char(195),char(3),char(115), +char(0),char(189),char(255),char(195),char(3),char(115),char(0),char(190),char(255),char(195), +char(3),char(115),char(0),char(194),char(255),char(133),char(3),char(115),char(0),char(195), +char(255),char(154),char(3),char(115),char(0),char(196),char(255),char(133),char(3),char(115), +char(0),char(197),char(255),char(154),char(3),char(115),char(0),char(198),char(255),char(133), +char(3),char(115),char(0),char(199),char(255),char(154),char(3),char(115),char(0),char(200), +char(255),char(215),char(3),char(115),char(0),char(201),char(255),char(154),char(3),char(115), +char(0),char(202),char(255),char(215),char(3),char(115),char(0),char(203),char(255),char(154), +char(3),char(115),char(0),char(204),char(255),char(215),char(3),char(115),char(0),char(205), +char(255),char(154),char(3),char(115),char(0),char(206),char(255),char(215),char(3),char(115), +char(0),char(207),char(255),char(154),char(3),char(115),char(0),char(209),char(255),char(154), +char(3),char(115),char(0),char(211),char(255),char(154),char(3),char(115),char(0),char(213), +char(255),char(154),char(3),char(115),char(0),char(215),char(255),char(154),char(3),char(115), +char(0),char(217),char(255),char(154),char(3),char(115),char(0),char(219),char(255),char(154), +char(3),char(115),char(0),char(221),char(255),char(154),char(3),char(115),char(0),char(222), +char(255),char(215),char(3),char(115),char(0),char(223),char(255),char(215),char(3),char(115), +char(0),char(224),char(255),char(215),char(3),char(115),char(0),char(225),char(255),char(215), +char(3),char(115),char(0),char(226),char(255),char(215),char(3),char(115),char(0),char(227), +char(255),char(215),char(3),char(115),char(0),char(228),char(255),char(215),char(3),char(115), +char(0),char(229),char(255),char(215),char(3),char(115),char(0),char(250),char(255),char(195), +char(3),char(115),char(1),char(6),char(255),char(195),char(3),char(115),char(1),char(8), +char(255),char(195),char(3),char(115),char(1),char(13),char(255),char(195),char(3),char(115), +char(1),char(14),char(255),char(215),char(3),char(115),char(1),char(15),char(255),char(154), +char(3),char(115),char(1),char(16),char(255),char(215),char(3),char(115),char(1),char(17), +char(255),char(154),char(3),char(115),char(1),char(18),char(255),char(215),char(3),char(115), +char(1),char(19),char(255),char(154),char(3),char(115),char(1),char(20),char(255),char(215), +char(3),char(115),char(1),char(21),char(255),char(154),char(3),char(115),char(1),char(23), +char(255),char(195),char(3),char(115),char(1),char(25),char(255),char(195),char(3),char(115), +char(1),char(29),char(255),char(174),char(3),char(115),char(1),char(33),char(255),char(174), +char(3),char(115),char(1),char(43),char(255),char(195),char(3),char(115),char(1),char(45), +char(255),char(195),char(3),char(115),char(1),char(47),char(255),char(195),char(3),char(115), +char(1),char(49),char(255),char(195),char(3),char(115),char(1),char(51),char(255),char(195), +char(3),char(115),char(1),char(53),char(255),char(195),char(3),char(115),char(1),char(60), +char(255),char(215),char(3),char(115),char(1),char(62),char(255),char(215),char(3),char(115), +char(1),char(64),char(255),char(215),char(3),char(115),char(1),char(67),char(255),char(133), +char(3),char(115),char(1),char(68),char(255),char(154),char(3),char(115),char(1),char(70), +char(255),char(154),char(3),char(115),char(1),char(71),char(255),char(215),char(3),char(115), +char(1),char(72),char(255),char(154),char(3),char(115),char(1),char(74),char(255),char(174), +char(3),char(115),char(2),char(8),char(255),char(133),char(3),char(115),char(2),char(12), +char(255),char(133),char(3),char(115),char(2),char(87),char(255),char(195),char(3),char(115), +char(2),char(88),char(255),char(133),char(3),char(115),char(2),char(89),char(255),char(154), +char(3),char(115),char(2),char(95),char(255),char(215),char(3),char(115),char(2),char(96), +char(255),char(154),char(3),char(115),char(2),char(98),char(255),char(195),char(3),char(115), +char(3),char(29),char(255),char(133),char(3),char(115),char(3),char(30),char(255),char(154), +char(3),char(115),char(3),char(31),char(255),char(133),char(3),char(115),char(3),char(32), +char(255),char(154),char(3),char(115),char(3),char(33),char(255),char(133),char(3),char(115), +char(3),char(34),char(255),char(154),char(3),char(115),char(3),char(35),char(255),char(133), +char(3),char(115),char(3),char(37),char(255),char(133),char(3),char(115),char(3),char(38), +char(255),char(154),char(3),char(115),char(3),char(39),char(255),char(133),char(3),char(115), +char(3),char(40),char(255),char(154),char(3),char(115),char(3),char(41),char(255),char(133), +char(3),char(115),char(3),char(42),char(255),char(154),char(3),char(115),char(3),char(43), +char(255),char(133),char(3),char(115),char(3),char(44),char(255),char(154),char(3),char(115), +char(3),char(45),char(255),char(133),char(3),char(115),char(3),char(46),char(255),char(154), +char(3),char(115),char(3),char(47),char(255),char(133),char(3),char(115),char(3),char(48), +char(255),char(154),char(3),char(115),char(3),char(49),char(255),char(133),char(3),char(115), +char(3),char(50),char(255),char(154),char(3),char(115),char(3),char(51),char(255),char(133), +char(3),char(115),char(3),char(52),char(255),char(154),char(3),char(115),char(3),char(54), +char(255),char(154),char(3),char(115),char(3),char(56),char(255),char(154),char(3),char(115), +char(3),char(58),char(255),char(154),char(3),char(115),char(3),char(60),char(255),char(154), +char(3),char(115),char(3),char(64),char(255),char(154),char(3),char(115),char(3),char(66), +char(255),char(154),char(3),char(115),char(3),char(68),char(255),char(154),char(3),char(115), +char(3),char(73),char(255),char(215),char(3),char(115),char(3),char(74),char(255),char(154), +char(3),char(115),char(3),char(75),char(255),char(215),char(3),char(115),char(3),char(76), +char(255),char(154),char(3),char(115),char(3),char(77),char(255),char(215),char(3),char(115), +char(3),char(78),char(255),char(154),char(3),char(115),char(3),char(79),char(255),char(215), +char(3),char(115),char(3),char(81),char(255),char(215),char(3),char(115),char(3),char(82), +char(255),char(154),char(3),char(115),char(3),char(83),char(255),char(215),char(3),char(115), +char(3),char(84),char(255),char(154),char(3),char(115),char(3),char(85),char(255),char(215), +char(3),char(115),char(3),char(86),char(255),char(154),char(3),char(115),char(3),char(87), +char(255),char(215),char(3),char(115),char(3),char(88),char(255),char(154),char(3),char(115), +char(3),char(89),char(255),char(215),char(3),char(115),char(3),char(90),char(255),char(154), +char(3),char(115),char(3),char(91),char(255),char(215),char(3),char(115),char(3),char(92), +char(255),char(154),char(3),char(115),char(3),char(93),char(255),char(215),char(3),char(115), +char(3),char(94),char(255),char(154),char(3),char(115),char(3),char(95),char(255),char(215), +char(3),char(115),char(3),char(96),char(255),char(154),char(3),char(115),char(3),char(98), +char(255),char(195),char(3),char(115),char(3),char(100),char(255),char(195),char(3),char(115), +char(3),char(102),char(255),char(195),char(3),char(115),char(3),char(104),char(255),char(195), +char(3),char(115),char(3),char(106),char(255),char(195),char(3),char(115),char(3),char(108), +char(255),char(195),char(3),char(115),char(3),char(110),char(255),char(195),char(3),char(116), +char(0),char(5),char(0),char(82),char(3),char(116),char(0),char(10),char(0),char(82), +char(3),char(116),char(0),char(15),char(255),char(174),char(3),char(116),char(0),char(17), +char(255),char(174),char(3),char(116),char(0),char(34),char(0),char(41),char(3),char(116), +char(2),char(7),char(0),char(82),char(3),char(116),char(2),char(8),char(255),char(174), +char(3),char(116),char(2),char(11),char(0),char(82),char(3),char(116),char(2),char(12), +char(255),char(174),char(3),char(141),char(0),char(5),char(0),char(123),char(3),char(141), +char(0),char(10),char(0),char(123),char(3),char(141),char(2),char(7),char(0),char(123), +char(3),char(141),char(2),char(11),char(0),char(123),char(3),char(143),char(0),char(15), +char(255),char(133),char(3),char(143),char(0),char(16),char(255),char(174),char(3),char(143), +char(0),char(17),char(255),char(133),char(3),char(143),char(0),char(34),char(0),char(41), +char(3),char(143),char(0),char(36),char(255),char(113),char(3),char(143),char(0),char(38), +char(255),char(215),char(3),char(143),char(0),char(42),char(255),char(215),char(3),char(143), +char(0),char(50),char(255),char(215),char(3),char(143),char(0),char(52),char(255),char(215), +char(3),char(143),char(0),char(55),char(0),char(41),char(3),char(143),char(0),char(68), +char(255),char(92),char(3),char(143),char(0),char(70),char(255),char(113),char(3),char(143), +char(0),char(71),char(255),char(113),char(3),char(143),char(0),char(72),char(255),char(113), +char(3),char(143),char(0),char(74),char(255),char(113),char(3),char(143),char(0),char(80), +char(255),char(154),char(3),char(143),char(0),char(81),char(255),char(154),char(3),char(143), +char(0),char(82),char(255),char(113),char(3),char(143),char(0),char(83),char(255),char(154), +char(3),char(143),char(0),char(84),char(255),char(113),char(3),char(143),char(0),char(85), +char(255),char(154),char(3),char(143),char(0),char(86),char(255),char(133),char(3),char(143), +char(0),char(88),char(255),char(154),char(3),char(143),char(0),char(89),char(255),char(215), +char(3),char(143),char(0),char(90),char(255),char(215),char(3),char(143),char(0),char(91), +char(255),char(215),char(3),char(143),char(0),char(92),char(255),char(215),char(3),char(143), +char(0),char(93),char(255),char(174),char(3),char(143),char(0),char(130),char(255),char(113), +char(3),char(143),char(0),char(131),char(255),char(113),char(3),char(143),char(0),char(132), +char(255),char(113),char(3),char(143),char(0),char(133),char(255),char(113),char(3),char(143), +char(0),char(134),char(255),char(113),char(3),char(143),char(0),char(135),char(255),char(113), +char(3),char(143),char(0),char(137),char(255),char(215),char(3),char(143),char(0),char(148), +char(255),char(215),char(3),char(143),char(0),char(149),char(255),char(215),char(3),char(143), +char(0),char(150),char(255),char(215),char(3),char(143),char(0),char(151),char(255),char(215), +char(3),char(143),char(0),char(152),char(255),char(215),char(3),char(143),char(0),char(154), +char(255),char(215),char(3),char(143),char(0),char(162),char(255),char(113),char(3),char(143), +char(0),char(163),char(255),char(92),char(3),char(143),char(0),char(164),char(255),char(92), +char(3),char(143),char(0),char(165),char(255),char(92),char(3),char(143),char(0),char(166), +char(255),char(92),char(3),char(143),char(0),char(167),char(255),char(92),char(3),char(143), +char(0),char(168),char(255),char(92),char(3),char(143),char(0),char(169),char(255),char(113), +char(3),char(143),char(0),char(170),char(255),char(113),char(3),char(143),char(0),char(171), +char(255),char(113),char(3),char(143),char(0),char(172),char(255),char(113),char(3),char(143), +char(0),char(173),char(255),char(113),char(3),char(143),char(0),char(180),char(255),char(113), +char(3),char(143),char(0),char(181),char(255),char(113),char(3),char(143),char(0),char(182), +char(255),char(113),char(3),char(143),char(0),char(183),char(255),char(113),char(3),char(143), +char(0),char(184),char(255),char(113),char(3),char(143),char(0),char(186),char(255),char(113), +char(3),char(143),char(0),char(187),char(255),char(154),char(3),char(143),char(0),char(188), +char(255),char(154),char(3),char(143),char(0),char(189),char(255),char(154),char(3),char(143), +char(0),char(190),char(255),char(154),char(3),char(143),char(0),char(191),char(255),char(215), +char(3),char(143),char(0),char(194),char(255),char(113),char(3),char(143),char(0),char(195), +char(255),char(92),char(3),char(143),char(0),char(196),char(255),char(113),char(3),char(143), +char(0),char(197),char(255),char(92),char(3),char(143),char(0),char(198),char(255),char(113), +char(3),char(143),char(0),char(199),char(255),char(92),char(3),char(143),char(0),char(200), +char(255),char(215),char(3),char(143),char(0),char(201),char(255),char(113),char(3),char(143), +char(0),char(202),char(255),char(215),char(3),char(143),char(0),char(203),char(255),char(113), +char(3),char(143),char(0),char(204),char(255),char(215),char(3),char(143),char(0),char(205), +char(255),char(113),char(3),char(143),char(0),char(206),char(255),char(215),char(3),char(143), +char(0),char(207),char(255),char(113),char(3),char(143),char(0),char(209),char(255),char(113), +char(3),char(143),char(0),char(211),char(255),char(113),char(3),char(143),char(0),char(213), +char(255),char(113),char(3),char(143),char(0),char(215),char(255),char(113),char(3),char(143), +char(0),char(217),char(255),char(113),char(3),char(143),char(0),char(219),char(255),char(113), +char(3),char(143),char(0),char(221),char(255),char(113),char(3),char(143),char(0),char(222), +char(255),char(215),char(3),char(143),char(0),char(223),char(255),char(113),char(3),char(143), +char(0),char(224),char(255),char(215),char(3),char(143),char(0),char(225),char(255),char(113), +char(3),char(143),char(0),char(226),char(255),char(215),char(3),char(143),char(0),char(227), +char(255),char(113),char(3),char(143),char(0),char(228),char(255),char(215),char(3),char(143), +char(0),char(229),char(255),char(113),char(3),char(143),char(0),char(250),char(255),char(154), +char(3),char(143),char(1),char(6),char(255),char(154),char(3),char(143),char(1),char(8), +char(255),char(154),char(3),char(143),char(1),char(13),char(255),char(154),char(3),char(143), +char(1),char(14),char(255),char(215),char(3),char(143),char(1),char(15),char(255),char(113), +char(3),char(143),char(1),char(16),char(255),char(215),char(3),char(143),char(1),char(17), +char(255),char(113),char(3),char(143),char(1),char(18),char(255),char(215),char(3),char(143), +char(1),char(19),char(255),char(113),char(3),char(143),char(1),char(20),char(255),char(215), +char(3),char(143),char(1),char(21),char(255),char(113),char(3),char(143),char(1),char(23), +char(255),char(154),char(3),char(143),char(1),char(25),char(255),char(154),char(3),char(143), +char(1),char(29),char(255),char(133),char(3),char(143),char(1),char(33),char(255),char(133), +char(3),char(143),char(1),char(36),char(0),char(41),char(3),char(143),char(1),char(38), +char(0),char(41),char(3),char(143),char(1),char(43),char(255),char(154),char(3),char(143), +char(1),char(45),char(255),char(154),char(3),char(143),char(1),char(47),char(255),char(154), +char(3),char(143),char(1),char(49),char(255),char(154),char(3),char(143),char(1),char(51), +char(255),char(154),char(3),char(143),char(1),char(53),char(255),char(154),char(3),char(143), +char(1),char(55),char(255),char(215),char(3),char(143),char(1),char(60),char(255),char(174), +char(3),char(143),char(1),char(62),char(255),char(174),char(3),char(143),char(1),char(64), +char(255),char(174),char(3),char(143),char(1),char(67),char(255),char(113),char(3),char(143), +char(1),char(68),char(255),char(92),char(3),char(143),char(1),char(70),char(255),char(92), +char(3),char(143),char(1),char(71),char(255),char(215),char(3),char(143),char(1),char(72), +char(255),char(113),char(3),char(143),char(1),char(74),char(255),char(133),char(3),char(143), +char(1),char(251),char(255),char(215),char(3),char(143),char(1),char(253),char(255),char(215), +char(3),char(143),char(2),char(2),char(255),char(174),char(3),char(143),char(2),char(3), +char(255),char(174),char(3),char(143),char(2),char(4),char(255),char(174),char(3),char(143), +char(2),char(8),char(255),char(133),char(3),char(143),char(2),char(12),char(255),char(133), +char(3),char(143),char(2),char(87),char(255),char(154),char(3),char(143),char(2),char(88), +char(255),char(113),char(3),char(143),char(2),char(89),char(255),char(92),char(3),char(143), +char(2),char(95),char(255),char(215),char(3),char(143),char(2),char(96),char(255),char(113), +char(3),char(143),char(2),char(98),char(255),char(154),char(3),char(143),char(3),char(29), +char(255),char(113),char(3),char(143),char(3),char(30),char(255),char(92),char(3),char(143), +char(3),char(31),char(255),char(113),char(3),char(143),char(3),char(32),char(255),char(92), +char(3),char(143),char(3),char(33),char(255),char(113),char(3),char(143),char(3),char(34), +char(255),char(92),char(3),char(143),char(3),char(35),char(255),char(113),char(3),char(143), +char(3),char(37),char(255),char(113),char(3),char(143),char(3),char(38),char(255),char(92), +char(3),char(143),char(3),char(39),char(255),char(113),char(3),char(143),char(3),char(40), +char(255),char(92),char(3),char(143),char(3),char(41),char(255),char(113),char(3),char(143), +char(3),char(42),char(255),char(92),char(3),char(143),char(3),char(43),char(255),char(113), +char(3),char(143),char(3),char(44),char(255),char(92),char(3),char(143),char(3),char(45), +char(255),char(113),char(3),char(143),char(3),char(46),char(255),char(92),char(3),char(143), +char(3),char(47),char(255),char(113),char(3),char(143),char(3),char(48),char(255),char(92), +char(3),char(143),char(3),char(49),char(255),char(113),char(3),char(143),char(3),char(50), +char(255),char(92),char(3),char(143),char(3),char(51),char(255),char(113),char(3),char(143), +char(3),char(52),char(255),char(92),char(3),char(143),char(3),char(54),char(255),char(113), +char(3),char(143),char(3),char(56),char(255),char(113),char(3),char(143),char(3),char(58), +char(255),char(113),char(3),char(143),char(3),char(60),char(255),char(113),char(3),char(143), +char(3),char(64),char(255),char(113),char(3),char(143),char(3),char(66),char(255),char(113), +char(3),char(143),char(3),char(68),char(255),char(113),char(3),char(143),char(3),char(73), +char(255),char(215),char(3),char(143),char(3),char(74),char(255),char(113),char(3),char(143), +char(3),char(75),char(255),char(215),char(3),char(143),char(3),char(76),char(255),char(113), +char(3),char(143),char(3),char(77),char(255),char(215),char(3),char(143),char(3),char(78), +char(255),char(113),char(3),char(143),char(3),char(79),char(255),char(215),char(3),char(143), +char(3),char(81),char(255),char(215),char(3),char(143),char(3),char(82),char(255),char(113), +char(3),char(143),char(3),char(83),char(255),char(215),char(3),char(143),char(3),char(84), +char(255),char(113),char(3),char(143),char(3),char(85),char(255),char(215),char(3),char(143), +char(3),char(86),char(255),char(113),char(3),char(143),char(3),char(87),char(255),char(215), +char(3),char(143),char(3),char(88),char(255),char(113),char(3),char(143),char(3),char(89), +char(255),char(215),char(3),char(143),char(3),char(90),char(255),char(113),char(3),char(143), +char(3),char(91),char(255),char(215),char(3),char(143),char(3),char(92),char(255),char(113), +char(3),char(143),char(3),char(93),char(255),char(215),char(3),char(143),char(3),char(94), +char(255),char(113),char(3),char(143),char(3),char(95),char(255),char(215),char(3),char(143), +char(3),char(96),char(255),char(113),char(3),char(143),char(3),char(98),char(255),char(154), +char(3),char(143),char(3),char(100),char(255),char(154),char(3),char(143),char(3),char(102), +char(255),char(154),char(3),char(143),char(3),char(104),char(255),char(154),char(3),char(143), +char(3),char(106),char(255),char(154),char(3),char(143),char(3),char(108),char(255),char(154), +char(3),char(143),char(3),char(110),char(255),char(154),char(3),char(143),char(3),char(112), +char(255),char(215),char(3),char(143),char(3),char(143),char(0),char(41),char(3),char(144), +char(0),char(5),char(0),char(41),char(3),char(144),char(0),char(10),char(0),char(41), +char(3),char(144),char(2),char(7),char(0),char(41),char(3),char(144),char(2),char(11), +char(0),char(41),char(0),char(0),char(0),char(0),char(0),char(26),char(1),char(62), +char(0),char(1),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(57), +char(0),char(0),char(0),char(1),char(0),char(0),char(0),char(0),char(0),char(1), +char(0),char(9),char(0),char(57),char(0),char(1),char(0),char(0),char(0),char(0), +char(0),char(2),char(0),char(7),char(0),char(66),char(0),char(1),char(0),char(0), +char(0),char(0),char(0),char(3),char(0),char(30),char(0),char(73),char(0),char(1), +char(0),char(0),char(0),char(0),char(0),char(4),char(0),char(9),char(0),char(57), +char(0),char(1),char(0),char(0),char(0),char(0),char(0),char(5),char(0),char(12), +char(0),char(103),char(0),char(1),char(0),char(0),char(0),char(0),char(0),char(6), +char(0),char(8),char(0),char(115),char(0),char(1),char(0),char(0),char(0),char(0), +char(0),char(7),char(0),char(82),char(0),char(123),char(0),char(1),char(0),char(0), +char(0),char(0),char(0),char(8),char(0),char(20),char(0),char(205),char(0),char(1), +char(0),char(0),char(0),char(0),char(0),char(11),char(0),char(28),char(0),char(225), +char(0),char(1),char(0),char(0),char(0),char(0),char(0),char(12),char(0),char(46), +char(0),char(253),char(0),char(1),char(0),char(0),char(0),char(0),char(0),char(13), +char(0),char(46),char(1),char(43),char(0),char(1),char(0),char(0),char(0),char(0), +char(0),char(14),char(0),char(42),char(1),char(89),char(0),char(3),char(0),char(1), +char(4),char(9),char(0),char(0),char(0),char(114),char(1),char(131),char(0),char(3), +char(0),char(1),char(4),char(9),char(0),char(1),char(0),char(18),char(1),char(245), +char(0),char(3),char(0),char(1),char(4),char(9),char(0),char(2),char(0),char(14), +char(2),char(7),char(0),char(3),char(0),char(1),char(4),char(9),char(0),char(3), +char(0),char(60),char(2),char(21),char(0),char(3),char(0),char(1),char(4),char(9), +char(0),char(4),char(0),char(18),char(1),char(245),char(0),char(3),char(0),char(1), +char(4),char(9),char(0),char(5),char(0),char(24),char(2),char(81),char(0),char(3), +char(0),char(1),char(4),char(9),char(0),char(6),char(0),char(16),char(2),char(105), +char(0),char(3),char(0),char(1),char(4),char(9),char(0),char(7),char(0),char(164), +char(2),char(121),char(0),char(3),char(0),char(1),char(4),char(9),char(0),char(8), +char(0),char(40),char(3),char(29),char(0),char(3),char(0),char(1),char(4),char(9), +char(0),char(11),char(0),char(56),char(3),char(69),char(0),char(3),char(0),char(1), +char(4),char(9),char(0),char(12),char(0),char(92),char(3),char(125),char(0),char(3), +char(0),char(1),char(4),char(9),char(0),char(13),char(0),char(92),char(3),char(217), +char(0),char(3),char(0),char(1),char(4),char(9),char(0),char(14),char(0),char(84), +char(4),char(53),char(68),char(105),char(103),char(105),char(116),char(105),char(122),char(101), +char(100),char(32),char(100),char(97),char(116),char(97),char(32),char(99),char(111),char(112), +char(121),char(114),char(105),char(103),char(104),char(116),char(32),char(169),char(32),char(50), +char(48),char(49),char(48),char(45),char(50),char(48),char(49),char(49),char(44),char(32), +char(71),char(111),char(111),char(103),char(108),char(101),char(32),char(67),char(111),char(114), +char(112),char(111),char(114),char(97),char(116),char(105),char(111),char(110),char(46),char(79), +char(112),char(101),char(110),char(32),char(83),char(97),char(110),char(115),char(82),char(101), +char(103),char(117),char(108),char(97),char(114),char(65),char(115),char(99),char(101),char(110), +char(100),char(101),char(114),char(32),char(45),char(32),char(79),char(112),char(101),char(110), +char(32),char(83),char(97),char(110),char(115),char(32),char(66),char(117),char(105),char(108), +char(100),char(32),char(49),char(48),char(48),char(86),char(101),char(114),char(115),char(105), +char(111),char(110),char(32),char(49),char(46),char(49),char(48),char(79),char(112),char(101), +char(110),char(83),char(97),char(110),char(115),char(79),char(112),char(101),char(110),char(32), +char(83),char(97),char(110),char(115),char(32),char(105),char(115),char(32),char(97),char(32), +char(116),char(114),char(97),char(100),char(101),char(109),char(97),char(114),char(107),char(32), +char(111),char(102),char(32),char(71),char(111),char(111),char(103),char(108),char(101),char(32), +char(97),char(110),char(100),char(32),char(109),char(97),char(121),char(32),char(98),char(101), +char(32),char(114),char(101),char(103),char(105),char(115),char(116),char(101),char(114),char(101), +char(100),char(32),char(105),char(110),char(32),char(99),char(101),char(114),char(116),char(97), +char(105),char(110),char(32),char(106),char(117),char(114),char(105),char(115),char(100),char(105), +char(99),char(116),char(105),char(111),char(110),char(115),char(46),char(65),char(115),char(99), +char(101),char(110),char(100),char(101),char(114),char(32),char(67),char(111),char(114),char(112), +char(111),char(114),char(97),char(116),char(105),char(111),char(110),char(104),char(116),char(116), +char(112),char(58),char(47),char(47),char(119),char(119),char(119),char(46),char(97),char(115), +char(99),char(101),char(110),char(100),char(101),char(114),char(99),char(111),char(114),char(112), +char(46),char(99),char(111),char(109),char(47),char(104),char(116),char(116),char(112),char(58), +char(47),char(47),char(119),char(119),char(119),char(46),char(97),char(115),char(99),char(101), +char(110),char(100),char(101),char(114),char(99),char(111),char(114),char(112),char(46),char(99), +char(111),char(109),char(47),char(116),char(121),char(112),char(101),char(100),char(101),char(115), +char(105),char(103),char(110),char(101),char(114),char(115),char(46),char(104),char(116),char(109), +char(108),char(76),char(105),char(99),char(101),char(110),char(115),char(101),char(100),char(32), +char(117),char(110),char(100),char(101),char(114),char(32),char(116),char(104),char(101),char(32), +char(65),char(112),char(97),char(99),char(104),char(101),char(32),char(76),char(105),char(99), +char(101),char(110),char(115),char(101),char(44),char(32),char(86),char(101),char(114),char(115), +char(105),char(111),char(110),char(32),char(50),char(46),char(48),char(104),char(116),char(116), +char(112),char(58),char(47),char(47),char(119),char(119),char(119),char(46),char(97),char(112), +char(97),char(99),char(104),char(101),char(46),char(111),char(114),char(103),char(47),char(108), +char(105),char(99),char(101),char(110),char(115),char(101),char(115),char(47),char(76),char(73), +char(67),char(69),char(78),char(83),char(69),char(45),char(50),char(46),char(48),char(0), +char(68),char(0),char(105),char(0),char(103),char(0),char(105),char(0),char(116),char(0), +char(105),char(0),char(122),char(0),char(101),char(0),char(100),char(0),char(32),char(0), +char(100),char(0),char(97),char(0),char(116),char(0),char(97),char(0),char(32),char(0), +char(99),char(0),char(111),char(0),char(112),char(0),char(121),char(0),char(114),char(0), +char(105),char(0),char(103),char(0),char(104),char(0),char(116),char(0),char(32),char(0), +char(169),char(0),char(32),char(0),char(50),char(0),char(48),char(0),char(49),char(0), +char(48),char(0),char(45),char(0),char(50),char(0),char(48),char(0),char(49),char(0), +char(49),char(0),char(44),char(0),char(32),char(0),char(71),char(0),char(111),char(0), +char(111),char(0),char(103),char(0),char(108),char(0),char(101),char(0),char(32),char(0), +char(67),char(0),char(111),char(0),char(114),char(0),char(112),char(0),char(111),char(0), +char(114),char(0),char(97),char(0),char(116),char(0),char(105),char(0),char(111),char(0), +char(110),char(0),char(46),char(0),char(79),char(0),char(112),char(0),char(101),char(0), +char(110),char(0),char(32),char(0),char(83),char(0),char(97),char(0),char(110),char(0), +char(115),char(0),char(82),char(0),char(101),char(0),char(103),char(0),char(117),char(0), +char(108),char(0),char(97),char(0),char(114),char(0),char(65),char(0),char(115),char(0), +char(99),char(0),char(101),char(0),char(110),char(0),char(100),char(0),char(101),char(0), +char(114),char(0),char(32),char(0),char(45),char(0),char(32),char(0),char(79),char(0), +char(112),char(0),char(101),char(0),char(110),char(0),char(32),char(0),char(83),char(0), +char(97),char(0),char(110),char(0),char(115),char(0),char(32),char(0),char(66),char(0), +char(117),char(0),char(105),char(0),char(108),char(0),char(100),char(0),char(32),char(0), +char(49),char(0),char(48),char(0),char(48),char(0),char(86),char(0),char(101),char(0), +char(114),char(0),char(115),char(0),char(105),char(0),char(111),char(0),char(110),char(0), +char(32),char(0),char(49),char(0),char(46),char(0),char(49),char(0),char(48),char(0), +char(79),char(0),char(112),char(0),char(101),char(0),char(110),char(0),char(83),char(0), +char(97),char(0),char(110),char(0),char(115),char(0),char(79),char(0),char(112),char(0), +char(101),char(0),char(110),char(0),char(32),char(0),char(83),char(0),char(97),char(0), +char(110),char(0),char(115),char(0),char(32),char(0),char(105),char(0),char(115),char(0), +char(32),char(0),char(97),char(0),char(32),char(0),char(116),char(0),char(114),char(0), +char(97),char(0),char(100),char(0),char(101),char(0),char(109),char(0),char(97),char(0), +char(114),char(0),char(107),char(0),char(32),char(0),char(111),char(0),char(102),char(0), +char(32),char(0),char(71),char(0),char(111),char(0),char(111),char(0),char(103),char(0), +char(108),char(0),char(101),char(0),char(32),char(0),char(97),char(0),char(110),char(0), +char(100),char(0),char(32),char(0),char(109),char(0),char(97),char(0),char(121),char(0), +char(32),char(0),char(98),char(0),char(101),char(0),char(32),char(0),char(114),char(0), +char(101),char(0),char(103),char(0),char(105),char(0),char(115),char(0),char(116),char(0), +char(101),char(0),char(114),char(0),char(101),char(0),char(100),char(0),char(32),char(0), +char(105),char(0),char(110),char(0),char(32),char(0),char(99),char(0),char(101),char(0), +char(114),char(0),char(116),char(0),char(97),char(0),char(105),char(0),char(110),char(0), +char(32),char(0),char(106),char(0),char(117),char(0),char(114),char(0),char(105),char(0), +char(115),char(0),char(100),char(0),char(105),char(0),char(99),char(0),char(116),char(0), +char(105),char(0),char(111),char(0),char(110),char(0),char(115),char(0),char(46),char(0), +char(65),char(0),char(115),char(0),char(99),char(0),char(101),char(0),char(110),char(0), +char(100),char(0),char(101),char(0),char(114),char(0),char(32),char(0),char(67),char(0), +char(111),char(0),char(114),char(0),char(112),char(0),char(111),char(0),char(114),char(0), +char(97),char(0),char(116),char(0),char(105),char(0),char(111),char(0),char(110),char(0), +char(104),char(0),char(116),char(0),char(116),char(0),char(112),char(0),char(58),char(0), +char(47),char(0),char(47),char(0),char(119),char(0),char(119),char(0),char(119),char(0), +char(46),char(0),char(97),char(0),char(115),char(0),char(99),char(0),char(101),char(0), +char(110),char(0),char(100),char(0),char(101),char(0),char(114),char(0),char(99),char(0), +char(111),char(0),char(114),char(0),char(112),char(0),char(46),char(0),char(99),char(0), +char(111),char(0),char(109),char(0),char(47),char(0),char(104),char(0),char(116),char(0), +char(116),char(0),char(112),char(0),char(58),char(0),char(47),char(0),char(47),char(0), +char(119),char(0),char(119),char(0),char(119),char(0),char(46),char(0),char(97),char(0), +char(115),char(0),char(99),char(0),char(101),char(0),char(110),char(0),char(100),char(0), +char(101),char(0),char(114),char(0),char(99),char(0),char(111),char(0),char(114),char(0), +char(112),char(0),char(46),char(0),char(99),char(0),char(111),char(0),char(109),char(0), +char(47),char(0),char(116),char(0),char(121),char(0),char(112),char(0),char(101),char(0), +char(100),char(0),char(101),char(0),char(115),char(0),char(105),char(0),char(103),char(0), +char(110),char(0),char(101),char(0),char(114),char(0),char(115),char(0),char(46),char(0), +char(104),char(0),char(116),char(0),char(109),char(0),char(108),char(0),char(76),char(0), +char(105),char(0),char(99),char(0),char(101),char(0),char(110),char(0),char(115),char(0), +char(101),char(0),char(100),char(0),char(32),char(0),char(117),char(0),char(110),char(0), +char(100),char(0),char(101),char(0),char(114),char(0),char(32),char(0),char(116),char(0), +char(104),char(0),char(101),char(0),char(32),char(0),char(65),char(0),char(112),char(0), +char(97),char(0),char(99),char(0),char(104),char(0),char(101),char(0),char(32),char(0), +char(76),char(0),char(105),char(0),char(99),char(0),char(101),char(0),char(110),char(0), +char(115),char(0),char(101),char(0),char(44),char(0),char(32),char(0),char(86),char(0), +char(101),char(0),char(114),char(0),char(115),char(0),char(105),char(0),char(111),char(0), +char(110),char(0),char(32),char(0),char(50),char(0),char(46),char(0),char(48),char(0), +char(104),char(0),char(116),char(0),char(116),char(0),char(112),char(0),char(58),char(0), +char(47),char(0),char(47),char(0),char(119),char(0),char(119),char(0),char(119),char(0), +char(46),char(0),char(97),char(0),char(112),char(0),char(97),char(0),char(99),char(0), +char(104),char(0),char(101),char(0),char(46),char(0),char(111),char(0),char(114),char(0), +char(103),char(0),char(47),char(0),char(108),char(0),char(105),char(0),char(99),char(0), +char(101),char(0),char(110),char(0),char(115),char(0),char(101),char(0),char(115),char(0), +char(47),char(0),char(76),char(0),char(73),char(0),char(67),char(0),char(69),char(0), +char(78),char(0),char(83),char(0),char(69),char(0),char(45),char(0),char(50),char(0), +char(46),char(0),char(48),char(0),char(0),char(2),char(0),char(0),char(0),char(0), +char(0),char(0),char(255),char(102),char(0),char(102),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(0),char(0),char(0),char(0),char(0),char(3),char(170),char(1),char(2), +char(1),char(3),char(1),char(4),char(1),char(5),char(1),char(6),char(1),char(7), +char(1),char(8),char(1),char(9),char(1),char(10),char(1),char(11),char(1),char(12), +char(1),char(13),char(1),char(14),char(1),char(15),char(1),char(16),char(1),char(17), +char(1),char(18),char(1),char(19),char(1),char(20),char(1),char(21),char(1),char(22), +char(1),char(23),char(1),char(24),char(1),char(25),char(1),char(26),char(1),char(27), +char(1),char(28),char(1),char(29),char(1),char(30),char(1),char(31),char(1),char(32), +char(1),char(33),char(1),char(34),char(1),char(35),char(1),char(36),char(1),char(37), +char(1),char(38),char(1),char(39),char(1),char(40),char(1),char(41),char(1),char(42), +char(1),char(43),char(1),char(44),char(1),char(45),char(1),char(46),char(1),char(47), +char(1),char(48),char(1),char(49),char(1),char(50),char(1),char(51),char(1),char(52), +char(1),char(53),char(1),char(54),char(1),char(55),char(1),char(56),char(1),char(57), +char(1),char(58),char(1),char(59),char(1),char(60),char(1),char(61),char(1),char(62), +char(1),char(63),char(1),char(64),char(1),char(65),char(1),char(66),char(1),char(67), +char(1),char(68),char(1),char(69),char(1),char(70),char(1),char(71),char(1),char(72), +char(1),char(73),char(1),char(74),char(1),char(75),char(1),char(76),char(1),char(77), +char(1),char(78),char(1),char(79),char(1),char(80),char(1),char(81),char(1),char(82), +char(1),char(83),char(1),char(84),char(1),char(85),char(1),char(86),char(1),char(87), +char(1),char(88),char(1),char(89),char(1),char(90),char(1),char(91),char(1),char(92), +char(1),char(93),char(1),char(94),char(1),char(95),char(1),char(96),char(1),char(97), +char(1),char(98),char(1),char(99),char(1),char(100),char(1),char(101),char(1),char(102), +char(1),char(103),char(1),char(104),char(1),char(105),char(1),char(106),char(1),char(107), +char(1),char(108),char(1),char(109),char(1),char(110),char(1),char(111),char(1),char(112), +char(1),char(113),char(1),char(114),char(1),char(115),char(1),char(116),char(1),char(117), +char(1),char(118),char(1),char(119),char(1),char(120),char(1),char(121),char(1),char(122), +char(1),char(123),char(1),char(124),char(1),char(125),char(1),char(126),char(1),char(127), +char(1),char(128),char(1),char(129),char(1),char(130),char(1),char(131),char(1),char(132), +char(1),char(133),char(1),char(134),char(1),char(135),char(1),char(136),char(1),char(137), +char(1),char(138),char(1),char(139),char(1),char(140),char(1),char(141),char(1),char(142), +char(1),char(143),char(1),char(144),char(1),char(145),char(1),char(146),char(1),char(147), +char(1),char(148),char(1),char(149),char(1),char(150),char(1),char(151),char(1),char(152), +char(1),char(153),char(1),char(154),char(1),char(155),char(1),char(156),char(1),char(157), +char(1),char(158),char(1),char(159),char(1),char(160),char(1),char(161),char(1),char(162), +char(1),char(163),char(1),char(164),char(1),char(165),char(1),char(166),char(1),char(167), +char(1),char(168),char(1),char(169),char(1),char(170),char(1),char(171),char(1),char(172), +char(1),char(173),char(1),char(174),char(1),char(175),char(1),char(176),char(1),char(177), +char(1),char(178),char(1),char(179),char(1),char(180),char(1),char(181),char(1),char(182), +char(1),char(183),char(1),char(184),char(1),char(185),char(1),char(186),char(1),char(187), +char(1),char(188),char(1),char(189),char(1),char(190),char(1),char(191),char(1),char(192), +char(1),char(193),char(1),char(194),char(1),char(195),char(1),char(196),char(1),char(197), +char(1),char(198),char(1),char(199),char(1),char(200),char(1),char(201),char(1),char(202), +char(1),char(203),char(1),char(204),char(1),char(205),char(1),char(206),char(1),char(207), +char(1),char(208),char(1),char(209),char(1),char(210),char(1),char(211),char(1),char(212), +char(1),char(213),char(1),char(214),char(1),char(215),char(1),char(216),char(1),char(217), +char(1),char(218),char(1),char(219),char(1),char(220),char(1),char(221),char(1),char(222), +char(1),char(223),char(1),char(224),char(1),char(225),char(1),char(226),char(1),char(227), +char(1),char(228),char(1),char(229),char(1),char(230),char(1),char(231),char(1),char(232), +char(1),char(233),char(1),char(234),char(1),char(235),char(1),char(236),char(1),char(237), +char(1),char(238),char(1),char(239),char(1),char(240),char(1),char(241),char(1),char(242), +char(1),char(243),char(1),char(244),char(1),char(245),char(1),char(246),char(1),char(247), +char(1),char(248),char(1),char(249),char(1),char(250),char(1),char(251),char(1),char(252), +char(1),char(253),char(1),char(254),char(1),char(255),char(2),char(0),char(2),char(1), +char(2),char(2),char(2),char(3),char(2),char(4),char(2),char(5),char(2),char(6), +char(2),char(7),char(2),char(8),char(2),char(9),char(2),char(10),char(2),char(11), +char(2),char(12),char(2),char(13),char(2),char(14),char(2),char(15),char(2),char(16), +char(2),char(17),char(2),char(18),char(2),char(19),char(2),char(20),char(2),char(21), +char(2),char(22),char(2),char(23),char(2),char(24),char(2),char(25),char(2),char(26), +char(2),char(27),char(2),char(28),char(2),char(29),char(2),char(30),char(2),char(31), +char(2),char(32),char(2),char(33),char(2),char(34),char(2),char(35),char(2),char(36), +char(2),char(37),char(2),char(38),char(2),char(39),char(2),char(40),char(2),char(41), +char(2),char(42),char(2),char(43),char(2),char(44),char(2),char(45),char(2),char(46), +char(2),char(47),char(2),char(48),char(2),char(49),char(2),char(50),char(2),char(51), +char(2),char(52),char(2),char(53),char(2),char(54),char(2),char(55),char(2),char(56), +char(2),char(57),char(2),char(58),char(2),char(59),char(2),char(60),char(2),char(61), +char(2),char(62),char(2),char(63),char(2),char(64),char(2),char(65),char(2),char(66), +char(2),char(67),char(2),char(68),char(2),char(69),char(2),char(70),char(2),char(71), +char(2),char(72),char(2),char(73),char(2),char(74),char(2),char(75),char(2),char(76), +char(2),char(77),char(2),char(78),char(2),char(79),char(2),char(80),char(2),char(81), +char(2),char(82),char(2),char(83),char(2),char(84),char(2),char(85),char(2),char(86), +char(2),char(87),char(2),char(88),char(2),char(89),char(2),char(90),char(2),char(91), +char(2),char(92),char(2),char(93),char(2),char(94),char(2),char(95),char(2),char(96), +char(2),char(97),char(2),char(98),char(2),char(99),char(2),char(100),char(2),char(101), +char(2),char(102),char(2),char(103),char(2),char(104),char(2),char(105),char(2),char(106), +char(2),char(107),char(2),char(108),char(2),char(109),char(2),char(110),char(2),char(111), +char(2),char(112),char(2),char(113),char(2),char(114),char(2),char(115),char(2),char(116), +char(2),char(117),char(2),char(118),char(2),char(119),char(2),char(120),char(2),char(121), +char(2),char(122),char(2),char(123),char(2),char(124),char(2),char(125),char(2),char(126), +char(2),char(127),char(2),char(128),char(2),char(129),char(2),char(130),char(2),char(131), +char(2),char(132),char(2),char(133),char(2),char(134),char(2),char(135),char(2),char(136), +char(2),char(137),char(2),char(138),char(2),char(139),char(2),char(140),char(2),char(141), +char(2),char(142),char(2),char(143),char(2),char(144),char(2),char(145),char(2),char(146), +char(2),char(147),char(2),char(148),char(2),char(149),char(2),char(150),char(2),char(151), +char(2),char(152),char(2),char(153),char(2),char(154),char(2),char(155),char(2),char(156), +char(2),char(157),char(2),char(158),char(2),char(159),char(2),char(160),char(2),char(161), +char(2),char(162),char(2),char(163),char(2),char(164),char(2),char(165),char(2),char(166), +char(2),char(167),char(2),char(168),char(2),char(169),char(2),char(170),char(2),char(171), +char(2),char(172),char(2),char(173),char(2),char(174),char(2),char(175),char(2),char(176), +char(2),char(177),char(2),char(178),char(2),char(179),char(2),char(180),char(2),char(181), +char(2),char(182),char(2),char(183),char(2),char(184),char(2),char(185),char(2),char(186), +char(2),char(187),char(2),char(188),char(2),char(189),char(2),char(190),char(2),char(191), +char(2),char(192),char(2),char(193),char(2),char(194),char(2),char(195),char(2),char(196), +char(2),char(197),char(2),char(198),char(2),char(199),char(2),char(200),char(2),char(201), +char(2),char(202),char(2),char(203),char(2),char(204),char(2),char(205),char(2),char(206), +char(2),char(207),char(2),char(208),char(2),char(209),char(2),char(210),char(2),char(211), +char(2),char(212),char(2),char(213),char(2),char(214),char(2),char(215),char(2),char(216), +char(2),char(217),char(2),char(218),char(2),char(219),char(2),char(220),char(2),char(221), +char(2),char(222),char(2),char(223),char(2),char(224),char(2),char(225),char(2),char(226), +char(2),char(227),char(2),char(228),char(2),char(229),char(2),char(230),char(2),char(231), +char(2),char(232),char(2),char(233),char(2),char(234),char(2),char(235),char(2),char(236), +char(2),char(237),char(2),char(238),char(2),char(239),char(2),char(240),char(2),char(241), +char(2),char(242),char(2),char(243),char(2),char(244),char(2),char(245),char(2),char(246), +char(2),char(247),char(2),char(248),char(2),char(249),char(2),char(250),char(2),char(251), +char(2),char(252),char(2),char(253),char(2),char(254),char(2),char(255),char(3),char(0), +char(3),char(1),char(3),char(2),char(3),char(3),char(3),char(4),char(3),char(5), +char(3),char(6),char(3),char(7),char(3),char(8),char(3),char(9),char(3),char(10), +char(3),char(11),char(3),char(12),char(3),char(13),char(3),char(14),char(3),char(15), +char(3),char(16),char(3),char(17),char(3),char(18),char(3),char(19),char(3),char(20), +char(3),char(21),char(3),char(22),char(3),char(23),char(3),char(24),char(3),char(25), +char(3),char(26),char(3),char(27),char(3),char(28),char(3),char(29),char(3),char(30), +char(3),char(31),char(3),char(32),char(3),char(33),char(3),char(34),char(3),char(35), +char(3),char(36),char(3),char(37),char(3),char(38),char(3),char(39),char(3),char(40), +char(3),char(41),char(3),char(42),char(3),char(43),char(3),char(44),char(3),char(45), +char(3),char(46),char(3),char(47),char(3),char(48),char(3),char(49),char(3),char(50), +char(3),char(51),char(3),char(52),char(3),char(53),char(3),char(54),char(3),char(55), +char(3),char(56),char(3),char(57),char(3),char(58),char(3),char(59),char(3),char(60), +char(3),char(61),char(3),char(62),char(3),char(63),char(3),char(64),char(3),char(65), +char(3),char(66),char(3),char(67),char(3),char(68),char(3),char(69),char(3),char(70), +char(3),char(71),char(3),char(72),char(3),char(73),char(3),char(74),char(3),char(75), +char(3),char(76),char(3),char(77),char(3),char(78),char(3),char(79),char(3),char(80), +char(3),char(81),char(3),char(82),char(3),char(83),char(3),char(84),char(3),char(85), +char(3),char(86),char(3),char(87),char(3),char(88),char(3),char(89),char(3),char(90), +char(3),char(91),char(3),char(92),char(3),char(93),char(3),char(94),char(3),char(95), +char(3),char(96),char(3),char(97),char(3),char(98),char(3),char(99),char(3),char(100), +char(3),char(101),char(3),char(102),char(3),char(103),char(3),char(104),char(3),char(105), +char(3),char(106),char(3),char(107),char(3),char(108),char(3),char(109),char(3),char(110), +char(3),char(111),char(3),char(112),char(3),char(113),char(3),char(114),char(3),char(115), +char(3),char(116),char(3),char(117),char(3),char(118),char(3),char(119),char(3),char(120), +char(3),char(121),char(3),char(122),char(3),char(123),char(3),char(124),char(3),char(125), +char(3),char(126),char(3),char(127),char(3),char(128),char(3),char(129),char(3),char(130), +char(3),char(131),char(3),char(132),char(3),char(133),char(3),char(134),char(3),char(135), +char(3),char(136),char(3),char(137),char(3),char(138),char(3),char(139),char(3),char(140), +char(3),char(141),char(3),char(142),char(3),char(143),char(3),char(144),char(3),char(145), +char(3),char(146),char(3),char(147),char(3),char(148),char(3),char(149),char(3),char(150), +char(3),char(151),char(3),char(152),char(3),char(153),char(3),char(154),char(3),char(155), +char(3),char(156),char(3),char(157),char(3),char(158),char(3),char(159),char(3),char(160), +char(3),char(161),char(3),char(162),char(3),char(163),char(3),char(164),char(3),char(165), +char(3),char(166),char(3),char(167),char(3),char(168),char(3),char(169),char(3),char(170), +char(3),char(171),char(3),char(172),char(3),char(173),char(3),char(174),char(3),char(175), +char(3),char(176),char(3),char(177),char(3),char(178),char(3),char(179),char(3),char(180), +char(3),char(181),char(3),char(182),char(3),char(183),char(3),char(184),char(3),char(185), +char(3),char(186),char(3),char(187),char(3),char(188),char(3),char(189),char(3),char(190), +char(3),char(191),char(3),char(192),char(3),char(193),char(3),char(194),char(3),char(195), +char(3),char(196),char(3),char(197),char(3),char(198),char(3),char(199),char(3),char(200), +char(3),char(201),char(3),char(202),char(3),char(203),char(3),char(204),char(3),char(205), +char(3),char(206),char(3),char(207),char(3),char(208),char(3),char(209),char(3),char(210), +char(3),char(211),char(3),char(212),char(3),char(213),char(3),char(214),char(3),char(215), +char(3),char(216),char(3),char(217),char(3),char(218),char(3),char(219),char(3),char(220), +char(3),char(221),char(3),char(222),char(3),char(223),char(3),char(224),char(3),char(225), +char(3),char(226),char(3),char(227),char(3),char(228),char(3),char(229),char(3),char(230), +char(3),char(231),char(3),char(232),char(3),char(233),char(3),char(234),char(3),char(235), +char(3),char(236),char(3),char(237),char(3),char(238),char(3),char(239),char(3),char(240), +char(3),char(241),char(3),char(242),char(3),char(243),char(3),char(244),char(3),char(245), +char(3),char(246),char(3),char(247),char(3),char(248),char(3),char(249),char(3),char(250), +char(3),char(251),char(3),char(252),char(3),char(253),char(3),char(254),char(3),char(255), +char(4),char(0),char(4),char(1),char(4),char(2),char(4),char(3),char(4),char(4), +char(4),char(5),char(4),char(6),char(4),char(7),char(4),char(8),char(4),char(9), +char(4),char(10),char(4),char(11),char(4),char(12),char(4),char(13),char(4),char(14), +char(4),char(15),char(4),char(16),char(4),char(17),char(4),char(18),char(4),char(19), +char(4),char(20),char(4),char(21),char(4),char(22),char(4),char(23),char(4),char(24), +char(4),char(25),char(4),char(26),char(4),char(27),char(4),char(28),char(4),char(29), +char(4),char(30),char(4),char(31),char(4),char(32),char(4),char(33),char(4),char(34), +char(4),char(35),char(4),char(36),char(4),char(37),char(4),char(38),char(4),char(39), +char(4),char(40),char(4),char(41),char(4),char(42),char(4),char(43),char(4),char(44), +char(4),char(45),char(4),char(46),char(4),char(47),char(4),char(48),char(4),char(49), +char(4),char(50),char(4),char(51),char(4),char(52),char(4),char(53),char(4),char(54), +char(4),char(55),char(4),char(56),char(4),char(57),char(4),char(58),char(4),char(59), +char(4),char(60),char(4),char(61),char(4),char(62),char(4),char(63),char(4),char(64), +char(4),char(65),char(4),char(66),char(4),char(67),char(4),char(68),char(4),char(69), +char(4),char(70),char(4),char(71),char(4),char(72),char(4),char(73),char(4),char(74), +char(4),char(75),char(4),char(76),char(4),char(77),char(4),char(78),char(4),char(79), +char(4),char(80),char(4),char(81),char(4),char(82),char(4),char(83),char(4),char(84), +char(4),char(85),char(4),char(86),char(4),char(87),char(4),char(88),char(4),char(89), +char(4),char(90),char(4),char(91),char(4),char(92),char(4),char(93),char(4),char(94), +char(4),char(95),char(4),char(96),char(4),char(97),char(4),char(98),char(4),char(99), +char(4),char(100),char(4),char(101),char(4),char(102),char(4),char(103),char(4),char(104), +char(4),char(105),char(4),char(106),char(4),char(107),char(4),char(108),char(4),char(109), +char(4),char(110),char(4),char(111),char(4),char(112),char(4),char(113),char(4),char(114), +char(4),char(115),char(4),char(116),char(4),char(117),char(4),char(118),char(4),char(119), +char(4),char(120),char(4),char(121),char(4),char(122),char(4),char(123),char(4),char(124), +char(4),char(125),char(4),char(126),char(4),char(127),char(4),char(128),char(4),char(129), +char(4),char(130),char(4),char(131),char(4),char(132),char(4),char(133),char(4),char(134), +char(4),char(135),char(4),char(136),char(4),char(137),char(4),char(138),char(4),char(139), +char(4),char(140),char(4),char(141),char(4),char(142),char(4),char(143),char(4),char(144), +char(4),char(145),char(4),char(146),char(4),char(147),char(4),char(148),char(4),char(149), +char(4),char(150),char(4),char(151),char(4),char(152),char(4),char(153),char(4),char(154), +char(4),char(155),char(4),char(156),char(4),char(157),char(4),char(158),char(4),char(159), +char(4),char(160),char(4),char(161),char(4),char(162),char(4),char(163),char(4),char(164), +char(4),char(165),char(4),char(166),char(4),char(167),char(4),char(168),char(4),char(169), +char(4),char(170),char(4),char(171),char(7),char(46),char(110),char(111),char(116),char(100), +char(101),char(102),char(4),char(110),char(117),char(108),char(108),char(16),char(110),char(111), +char(110),char(109),char(97),char(114),char(107),char(105),char(110),char(103),char(114),char(101), +char(116),char(117),char(114),char(110),char(5),char(115),char(112),char(97),char(99),char(101), +char(6),char(101),char(120),char(99),char(108),char(97),char(109),char(8),char(113),char(117), +char(111),char(116),char(101),char(100),char(98),char(108),char(10),char(110),char(117),char(109), +char(98),char(101),char(114),char(115),char(105),char(103),char(110),char(6),char(100),char(111), +char(108),char(108),char(97),char(114),char(7),char(112),char(101),char(114),char(99),char(101), +char(110),char(116),char(9),char(97),char(109),char(112),char(101),char(114),char(115),char(97), +char(110),char(100),char(11),char(113),char(117),char(111),char(116),char(101),char(115),char(105), +char(110),char(103),char(108),char(101),char(9),char(112),char(97),char(114),char(101),char(110), +char(108),char(101),char(102),char(116),char(10),char(112),char(97),char(114),char(101),char(110), +char(114),char(105),char(103),char(104),char(116),char(8),char(97),char(115),char(116),char(101), +char(114),char(105),char(115),char(107),char(4),char(112),char(108),char(117),char(115),char(5), +char(99),char(111),char(109),char(109),char(97),char(6),char(104),char(121),char(112),char(104), +char(101),char(110),char(6),char(112),char(101),char(114),char(105),char(111),char(100),char(5), +char(115),char(108),char(97),char(115),char(104),char(4),char(122),char(101),char(114),char(111), +char(3),char(111),char(110),char(101),char(3),char(116),char(119),char(111),char(5),char(116), +char(104),char(114),char(101),char(101),char(4),char(102),char(111),char(117),char(114),char(4), +char(102),char(105),char(118),char(101),char(3),char(115),char(105),char(120),char(5),char(115), +char(101),char(118),char(101),char(110),char(5),char(101),char(105),char(103),char(104),char(116), +char(4),char(110),char(105),char(110),char(101),char(5),char(99),char(111),char(108),char(111), +char(110),char(9),char(115),char(101),char(109),char(105),char(99),char(111),char(108),char(111), +char(110),char(4),char(108),char(101),char(115),char(115),char(5),char(101),char(113),char(117), +char(97),char(108),char(7),char(103),char(114),char(101),char(97),char(116),char(101),char(114), +char(8),char(113),char(117),char(101),char(115),char(116),char(105),char(111),char(110),char(2), +char(97),char(116),char(1),char(65),char(1),char(66),char(1),char(67),char(1),char(68), +char(1),char(69),char(1),char(70),char(1),char(71),char(1),char(72),char(5),char(73), +char(46),char(97),char(108),char(116),char(1),char(74),char(1),char(75),char(1),char(76), +char(1),char(77),char(1),char(78),char(1),char(79),char(1),char(80),char(1),char(81), +char(1),char(82),char(1),char(83),char(1),char(84),char(1),char(85),char(1),char(86), +char(1),char(87),char(1),char(88),char(1),char(89),char(1),char(90),char(11),char(98), +char(114),char(97),char(99),char(107),char(101),char(116),char(108),char(101),char(102),char(116), +char(9),char(98),char(97),char(99),char(107),char(115),char(108),char(97),char(115),char(104), +char(12),char(98),char(114),char(97),char(99),char(107),char(101),char(116),char(114),char(105), +char(103),char(104),char(116),char(11),char(97),char(115),char(99),char(105),char(105),char(99), +char(105),char(114),char(99),char(117),char(109),char(10),char(117),char(110),char(100),char(101), +char(114),char(115),char(99),char(111),char(114),char(101),char(5),char(103),char(114),char(97), +char(118),char(101),char(1),char(97),char(1),char(98),char(1),char(99),char(1),char(100), +char(1),char(101),char(1),char(102),char(1),char(103),char(1),char(104),char(1),char(105), +char(1),char(106),char(1),char(107),char(1),char(108),char(1),char(109),char(1),char(110), +char(1),char(111),char(1),char(112),char(1),char(113),char(1),char(114),char(1),char(115), +char(1),char(116),char(1),char(117),char(1),char(118),char(1),char(119),char(1),char(120), +char(1),char(121),char(1),char(122),char(9),char(98),char(114),char(97),char(99),char(101), +char(108),char(101),char(102),char(116),char(3),char(98),char(97),char(114),char(10),char(98), +char(114),char(97),char(99),char(101),char(114),char(105),char(103),char(104),char(116),char(10), +char(97),char(115),char(99),char(105),char(105),char(116),char(105),char(108),char(100),char(101), +char(16),char(110),char(111),char(110),char(98),char(114),char(101),char(97),char(107),char(105), +char(110),char(103),char(115),char(112),char(97),char(99),char(101),char(10),char(101),char(120), +char(99),char(108),char(97),char(109),char(100),char(111),char(119),char(110),char(4),char(99), +char(101),char(110),char(116),char(8),char(115),char(116),char(101),char(114),char(108),char(105), +char(110),char(103),char(8),char(99),char(117),char(114),char(114),char(101),char(110),char(99), +char(121),char(3),char(121),char(101),char(110),char(9),char(98),char(114),char(111),char(107), +char(101),char(110),char(98),char(97),char(114),char(7),char(115),char(101),char(99),char(116), +char(105),char(111),char(110),char(8),char(100),char(105),char(101),char(114),char(101),char(115), +char(105),char(115),char(9),char(99),char(111),char(112),char(121),char(114),char(105),char(103), +char(104),char(116),char(11),char(111),char(114),char(100),char(102),char(101),char(109),char(105), +char(110),char(105),char(110),char(101),char(13),char(103),char(117),char(105),char(108),char(108), +char(101),char(109),char(111),char(116),char(108),char(101),char(102),char(116),char(10),char(108), +char(111),char(103),char(105),char(99),char(97),char(108),char(110),char(111),char(116),char(7), +char(117),char(110),char(105),char(48),char(48),char(65),char(68),char(10),char(114),char(101), +char(103),char(105),char(115),char(116),char(101),char(114),char(101),char(100),char(9),char(111), +char(118),char(101),char(114),char(115),char(99),char(111),char(114),char(101),char(6),char(100), +char(101),char(103),char(114),char(101),char(101),char(9),char(112),char(108),char(117),char(115), +char(109),char(105),char(110),char(117),char(115),char(11),char(116),char(119),char(111),char(115), +char(117),char(112),char(101),char(114),char(105),char(111),char(114),char(13),char(116),char(104), +char(114),char(101),char(101),char(115),char(117),char(112),char(101),char(114),char(105),char(111), +char(114),char(5),char(97),char(99),char(117),char(116),char(101),char(2),char(109),char(117), +char(9),char(112),char(97),char(114),char(97),char(103),char(114),char(97),char(112),char(104), +char(14),char(112),char(101),char(114),char(105),char(111),char(100),char(99),char(101),char(110), +char(116),char(101),char(114),char(101),char(100),char(7),char(99),char(101),char(100),char(105), +char(108),char(108),char(97),char(11),char(111),char(110),char(101),char(115),char(117),char(112), +char(101),char(114),char(105),char(111),char(114),char(12),char(111),char(114),char(100),char(109), +char(97),char(115),char(99),char(117),char(108),char(105),char(110),char(101),char(14),char(103), +char(117),char(105),char(108),char(108),char(101),char(109),char(111),char(116),char(114),char(105), +char(103),char(104),char(116),char(10),char(111),char(110),char(101),char(113),char(117),char(97), +char(114),char(116),char(101),char(114),char(7),char(111),char(110),char(101),char(104),char(97), +char(108),char(102),char(13),char(116),char(104),char(114),char(101),char(101),char(113),char(117), +char(97),char(114),char(116),char(101),char(114),char(115),char(12),char(113),char(117),char(101), +char(115),char(116),char(105),char(111),char(110),char(100),char(111),char(119),char(110),char(6), +char(65),char(103),char(114),char(97),char(118),char(101),char(6),char(65),char(97),char(99), +char(117),char(116),char(101),char(11),char(65),char(99),char(105),char(114),char(99),char(117), +char(109),char(102),char(108),char(101),char(120),char(6),char(65),char(116),char(105),char(108), +char(100),char(101),char(9),char(65),char(100),char(105),char(101),char(114),char(101),char(115), +char(105),char(115),char(5),char(65),char(114),char(105),char(110),char(103),char(2),char(65), +char(69),char(8),char(67),char(99),char(101),char(100),char(105),char(108),char(108),char(97), +char(6),char(69),char(103),char(114),char(97),char(118),char(101),char(6),char(69),char(97), +char(99),char(117),char(116),char(101),char(11),char(69),char(99),char(105),char(114),char(99), +char(117),char(109),char(102),char(108),char(101),char(120),char(9),char(69),char(100),char(105), +char(101),char(114),char(101),char(115),char(105),char(115),char(10),char(73),char(103),char(114), +char(97),char(118),char(101),char(46),char(97),char(108),char(116),char(10),char(73),char(97), +char(99),char(117),char(116),char(101),char(46),char(97),char(108),char(116),char(15),char(73), +char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108),char(101),char(120), +char(46),char(97),char(108),char(116),char(13),char(73),char(100),char(105),char(101),char(114), +char(101),char(115),char(105),char(115),char(46),char(97),char(108),char(116),char(3),char(69), +char(116),char(104),char(6),char(78),char(116),char(105),char(108),char(100),char(101),char(6), +char(79),char(103),char(114),char(97),char(118),char(101),char(6),char(79),char(97),char(99), +char(117),char(116),char(101),char(11),char(79),char(99),char(105),char(114),char(99),char(117), +char(109),char(102),char(108),char(101),char(120),char(6),char(79),char(116),char(105),char(108), +char(100),char(101),char(9),char(79),char(100),char(105),char(101),char(114),char(101),char(115), +char(105),char(115),char(8),char(109),char(117),char(108),char(116),char(105),char(112),char(108), +char(121),char(6),char(79),char(115),char(108),char(97),char(115),char(104),char(6),char(85), +char(103),char(114),char(97),char(118),char(101),char(6),char(85),char(97),char(99),char(117), +char(116),char(101),char(11),char(85),char(99),char(105),char(114),char(99),char(117),char(109), +char(102),char(108),char(101),char(120),char(9),char(85),char(100),char(105),char(101),char(114), +char(101),char(115),char(105),char(115),char(6),char(89),char(97),char(99),char(117),char(116), +char(101),char(5),char(84),char(104),char(111),char(114),char(110),char(10),char(103),char(101), +char(114),char(109),char(97),char(110),char(100),char(98),char(108),char(115),char(6),char(97), +char(103),char(114),char(97),char(118),char(101),char(6),char(97),char(97),char(99),char(117), +char(116),char(101),char(11),char(97),char(99),char(105),char(114),char(99),char(117),char(109), +char(102),char(108),char(101),char(120),char(6),char(97),char(116),char(105),char(108),char(100), +char(101),char(9),char(97),char(100),char(105),char(101),char(114),char(101),char(115),char(105), +char(115),char(5),char(97),char(114),char(105),char(110),char(103),char(2),char(97),char(101), +char(8),char(99),char(99),char(101),char(100),char(105),char(108),char(108),char(97),char(6), +char(101),char(103),char(114),char(97),char(118),char(101),char(6),char(101),char(97),char(99), +char(117),char(116),char(101),char(11),char(101),char(99),char(105),char(114),char(99),char(117), +char(109),char(102),char(108),char(101),char(120),char(9),char(101),char(100),char(105),char(101), +char(114),char(101),char(115),char(105),char(115),char(6),char(105),char(103),char(114),char(97), +char(118),char(101),char(6),char(105),char(97),char(99),char(117),char(116),char(101),char(11), +char(105),char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108),char(101), +char(120),char(9),char(105),char(100),char(105),char(101),char(114),char(101),char(115),char(105), +char(115),char(3),char(101),char(116),char(104),char(6),char(110),char(116),char(105),char(108), +char(100),char(101),char(6),char(111),char(103),char(114),char(97),char(118),char(101),char(6), +char(111),char(97),char(99),char(117),char(116),char(101),char(11),char(111),char(99),char(105), +char(114),char(99),char(117),char(109),char(102),char(108),char(101),char(120),char(6),char(111), +char(116),char(105),char(108),char(100),char(101),char(9),char(111),char(100),char(105),char(101), +char(114),char(101),char(115),char(105),char(115),char(6),char(100),char(105),char(118),char(105), +char(100),char(101),char(6),char(111),char(115),char(108),char(97),char(115),char(104),char(6), +char(117),char(103),char(114),char(97),char(118),char(101),char(6),char(117),char(97),char(99), +char(117),char(116),char(101),char(11),char(117),char(99),char(105),char(114),char(99),char(117), +char(109),char(102),char(108),char(101),char(120),char(9),char(117),char(100),char(105),char(101), +char(114),char(101),char(115),char(105),char(115),char(6),char(121),char(97),char(99),char(117), +char(116),char(101),char(5),char(116),char(104),char(111),char(114),char(110),char(9),char(121), +char(100),char(105),char(101),char(114),char(101),char(115),char(105),char(115),char(7),char(65), +char(109),char(97),char(99),char(114),char(111),char(110),char(7),char(97),char(109),char(97), +char(99),char(114),char(111),char(110),char(6),char(65),char(98),char(114),char(101),char(118), +char(101),char(6),char(97),char(98),char(114),char(101),char(118),char(101),char(7),char(65), +char(111),char(103),char(111),char(110),char(101),char(107),char(7),char(97),char(111),char(103), +char(111),char(110),char(101),char(107),char(6),char(67),char(97),char(99),char(117),char(116), +char(101),char(6),char(99),char(97),char(99),char(117),char(116),char(101),char(11),char(67), +char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108),char(101),char(120), +char(11),char(99),char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108), +char(101),char(120),char(4),char(67),char(100),char(111),char(116),char(4),char(99),char(100), +char(111),char(116),char(6),char(67),char(99),char(97),char(114),char(111),char(110),char(6), +char(99),char(99),char(97),char(114),char(111),char(110),char(6),char(68),char(99),char(97), +char(114),char(111),char(110),char(6),char(100),char(99),char(97),char(114),char(111),char(110), +char(6),char(68),char(99),char(114),char(111),char(97),char(116),char(6),char(100),char(99), +char(114),char(111),char(97),char(116),char(7),char(69),char(109),char(97),char(99),char(114), +char(111),char(110),char(7),char(101),char(109),char(97),char(99),char(114),char(111),char(110), +char(6),char(69),char(98),char(114),char(101),char(118),char(101),char(6),char(101),char(98), +char(114),char(101),char(118),char(101),char(10),char(69),char(100),char(111),char(116),char(97), +char(99),char(99),char(101),char(110),char(116),char(10),char(101),char(100),char(111),char(116), +char(97),char(99),char(99),char(101),char(110),char(116),char(7),char(69),char(111),char(103), +char(111),char(110),char(101),char(107),char(7),char(101),char(111),char(103),char(111),char(110), +char(101),char(107),char(6),char(69),char(99),char(97),char(114),char(111),char(110),char(6), +char(101),char(99),char(97),char(114),char(111),char(110),char(11),char(71),char(99),char(105), +char(114),char(99),char(117),char(109),char(102),char(108),char(101),char(120),char(11),char(103), +char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108),char(101),char(120), +char(6),char(71),char(98),char(114),char(101),char(118),char(101),char(6),char(103),char(98), +char(114),char(101),char(118),char(101),char(4),char(71),char(100),char(111),char(116),char(4), +char(103),char(100),char(111),char(116),char(12),char(71),char(99),char(111),char(109),char(109), +char(97),char(97),char(99),char(99),char(101),char(110),char(116),char(12),char(103),char(99), +char(111),char(109),char(109),char(97),char(97),char(99),char(99),char(101),char(110),char(116), +char(11),char(72),char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108), +char(101),char(120),char(11),char(104),char(99),char(105),char(114),char(99),char(117),char(109), +char(102),char(108),char(101),char(120),char(4),char(72),char(98),char(97),char(114),char(4), +char(104),char(98),char(97),char(114),char(10),char(73),char(116),char(105),char(108),char(100), +char(101),char(46),char(97),char(108),char(116),char(6),char(105),char(116),char(105),char(108), +char(100),char(101),char(11),char(73),char(109),char(97),char(99),char(114),char(111),char(110), +char(46),char(97),char(108),char(116),char(7),char(105),char(109),char(97),char(99),char(114), +char(111),char(110),char(10),char(73),char(98),char(114),char(101),char(118),char(101),char(46), +char(97),char(108),char(116),char(6),char(105),char(98),char(114),char(101),char(118),char(101), +char(11),char(73),char(111),char(103),char(111),char(110),char(101),char(107),char(46),char(97), +char(108),char(116),char(7),char(105),char(111),char(103),char(111),char(110),char(101),char(107), +char(14),char(73),char(100),char(111),char(116),char(97),char(99),char(99),char(101),char(110), +char(116),char(46),char(97),char(108),char(116),char(8),char(100),char(111),char(116),char(108), +char(101),char(115),char(115),char(105),char(6),char(73),char(74),char(46),char(97),char(108), +char(116),char(2),char(105),char(106),char(11),char(74),char(99),char(105),char(114),char(99), +char(117),char(109),char(102),char(108),char(101),char(120),char(11),char(106),char(99),char(105), +char(114),char(99),char(117),char(109),char(102),char(108),char(101),char(120),char(12),char(75), +char(99),char(111),char(109),char(109),char(97),char(97),char(99),char(99),char(101),char(110), +char(116),char(12),char(107),char(99),char(111),char(109),char(109),char(97),char(97),char(99), +char(99),char(101),char(110),char(116),char(12),char(107),char(103),char(114),char(101),char(101), +char(110),char(108),char(97),char(110),char(100),char(105),char(99),char(6),char(76),char(97), +char(99),char(117),char(116),char(101),char(6),char(108),char(97),char(99),char(117),char(116), +char(101),char(12),char(76),char(99),char(111),char(109),char(109),char(97),char(97),char(99), +char(99),char(101),char(110),char(116),char(12),char(108),char(99),char(111),char(109),char(109), +char(97),char(97),char(99),char(99),char(101),char(110),char(116),char(6),char(76),char(99), +char(97),char(114),char(111),char(110),char(6),char(108),char(99),char(97),char(114),char(111), +char(110),char(4),char(76),char(100),char(111),char(116),char(4),char(108),char(100),char(111), +char(116),char(6),char(76),char(115),char(108),char(97),char(115),char(104),char(6),char(108), +char(115),char(108),char(97),char(115),char(104),char(6),char(78),char(97),char(99),char(117), +char(116),char(101),char(6),char(110),char(97),char(99),char(117),char(116),char(101),char(12), +char(78),char(99),char(111),char(109),char(109),char(97),char(97),char(99),char(99),char(101), +char(110),char(116),char(12),char(110),char(99),char(111),char(109),char(109),char(97),char(97), +char(99),char(99),char(101),char(110),char(116),char(6),char(78),char(99),char(97),char(114), +char(111),char(110),char(6),char(110),char(99),char(97),char(114),char(111),char(110),char(11), +char(110),char(97),char(112),char(111),char(115),char(116),char(114),char(111),char(112),char(104), +char(101),char(3),char(69),char(110),char(103),char(3),char(101),char(110),char(103),char(7), +char(79),char(109),char(97),char(99),char(114),char(111),char(110),char(7),char(111),char(109), +char(97),char(99),char(114),char(111),char(110),char(6),char(79),char(98),char(114),char(101), +char(118),char(101),char(6),char(111),char(98),char(114),char(101),char(118),char(101),char(13), +char(79),char(104),char(117),char(110),char(103),char(97),char(114),char(117),char(109),char(108), +char(97),char(117),char(116),char(13),char(111),char(104),char(117),char(110),char(103),char(97), +char(114),char(117),char(109),char(108),char(97),char(117),char(116),char(2),char(79),char(69), +char(2),char(111),char(101),char(6),char(82),char(97),char(99),char(117),char(116),char(101), +char(6),char(114),char(97),char(99),char(117),char(116),char(101),char(12),char(82),char(99), +char(111),char(109),char(109),char(97),char(97),char(99),char(99),char(101),char(110),char(116), +char(12),char(114),char(99),char(111),char(109),char(109),char(97),char(97),char(99),char(99), +char(101),char(110),char(116),char(6),char(82),char(99),char(97),char(114),char(111),char(110), +char(6),char(114),char(99),char(97),char(114),char(111),char(110),char(6),char(83),char(97), +char(99),char(117),char(116),char(101),char(6),char(115),char(97),char(99),char(117),char(116), +char(101),char(11),char(83),char(99),char(105),char(114),char(99),char(117),char(109),char(102), +char(108),char(101),char(120),char(11),char(115),char(99),char(105),char(114),char(99),char(117), +char(109),char(102),char(108),char(101),char(120),char(8),char(83),char(99),char(101),char(100), +char(105),char(108),char(108),char(97),char(8),char(115),char(99),char(101),char(100),char(105), +char(108),char(108),char(97),char(6),char(83),char(99),char(97),char(114),char(111),char(110), +char(6),char(115),char(99),char(97),char(114),char(111),char(110),char(12),char(84),char(99), +char(111),char(109),char(109),char(97),char(97),char(99),char(99),char(101),char(110),char(116), +char(12),char(116),char(99),char(111),char(109),char(109),char(97),char(97),char(99),char(99), +char(101),char(110),char(116),char(6),char(84),char(99),char(97),char(114),char(111),char(110), +char(6),char(116),char(99),char(97),char(114),char(111),char(110),char(4),char(84),char(98), +char(97),char(114),char(4),char(116),char(98),char(97),char(114),char(6),char(85),char(116), +char(105),char(108),char(100),char(101),char(6),char(117),char(116),char(105),char(108),char(100), +char(101),char(7),char(85),char(109),char(97),char(99),char(114),char(111),char(110),char(7), +char(117),char(109),char(97),char(99),char(114),char(111),char(110),char(6),char(85),char(98), +char(114),char(101),char(118),char(101),char(6),char(117),char(98),char(114),char(101),char(118), +char(101),char(5),char(85),char(114),char(105),char(110),char(103),char(5),char(117),char(114), +char(105),char(110),char(103),char(13),char(85),char(104),char(117),char(110),char(103),char(97), +char(114),char(117),char(109),char(108),char(97),char(117),char(116),char(13),char(117),char(104), +char(117),char(110),char(103),char(97),char(114),char(117),char(109),char(108),char(97),char(117), +char(116),char(7),char(85),char(111),char(103),char(111),char(110),char(101),char(107),char(7), +char(117),char(111),char(103),char(111),char(110),char(101),char(107),char(11),char(87),char(99), +char(105),char(114),char(99),char(117),char(109),char(102),char(108),char(101),char(120),char(11), +char(119),char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108),char(101), +char(120),char(11),char(89),char(99),char(105),char(114),char(99),char(117),char(109),char(102), +char(108),char(101),char(120),char(11),char(121),char(99),char(105),char(114),char(99),char(117), +char(109),char(102),char(108),char(101),char(120),char(9),char(89),char(100),char(105),char(101), +char(114),char(101),char(115),char(105),char(115),char(6),char(90),char(97),char(99),char(117), +char(116),char(101),char(6),char(122),char(97),char(99),char(117),char(116),char(101),char(10), +char(90),char(100),char(111),char(116),char(97),char(99),char(99),char(101),char(110),char(116), +char(10),char(122),char(100),char(111),char(116),char(97),char(99),char(99),char(101),char(110), +char(116),char(6),char(90),char(99),char(97),char(114),char(111),char(110),char(6),char(122), +char(99),char(97),char(114),char(111),char(110),char(5),char(108),char(111),char(110),char(103), +char(115),char(6),char(102),char(108),char(111),char(114),char(105),char(110),char(10),char(65), +char(114),char(105),char(110),char(103),char(97),char(99),char(117),char(116),char(101),char(10), +char(97),char(114),char(105),char(110),char(103),char(97),char(99),char(117),char(116),char(101), +char(7),char(65),char(69),char(97),char(99),char(117),char(116),char(101),char(7),char(97), +char(101),char(97),char(99),char(117),char(116),char(101),char(11),char(79),char(115),char(108), +char(97),char(115),char(104),char(97),char(99),char(117),char(116),char(101),char(11),char(111), +char(115),char(108),char(97),char(115),char(104),char(97),char(99),char(117),char(116),char(101), +char(12),char(83),char(99),char(111),char(109),char(109),char(97),char(97),char(99),char(99), +char(101),char(110),char(116),char(12),char(115),char(99),char(111),char(109),char(109),char(97), +char(97),char(99),char(99),char(101),char(110),char(116),char(10),char(99),char(105),char(114), +char(99),char(117),char(109),char(102),char(108),char(101),char(120),char(5),char(99),char(97), +char(114),char(111),char(110),char(6),char(109),char(97),char(99),char(114),char(111),char(110), +char(5),char(98),char(114),char(101),char(118),char(101),char(9),char(100),char(111),char(116), +char(97),char(99),char(99),char(101),char(110),char(116),char(4),char(114),char(105),char(110), +char(103),char(6),char(111),char(103),char(111),char(110),char(101),char(107),char(5),char(116), +char(105),char(108),char(100),char(101),char(12),char(104),char(117),char(110),char(103),char(97), +char(114),char(117),char(109),char(108),char(97),char(117),char(116),char(5),char(116),char(111), +char(110),char(111),char(115),char(13),char(100),char(105),char(101),char(114),char(101),char(115), +char(105),char(115),char(116),char(111),char(110),char(111),char(115),char(10),char(65),char(108), +char(112),char(104),char(97),char(116),char(111),char(110),char(111),char(115),char(9),char(97), +char(110),char(111),char(116),char(101),char(108),char(101),char(105),char(97),char(12),char(69), +char(112),char(115),char(105),char(108),char(111),char(110),char(116),char(111),char(110),char(111), +char(115),char(8),char(69),char(116),char(97),char(116),char(111),char(110),char(111),char(115), +char(13),char(73),char(111),char(116),char(97),char(116),char(111),char(110),char(111),char(115), +char(46),char(97),char(108),char(116),char(12),char(79),char(109),char(105),char(99),char(114), +char(111),char(110),char(116),char(111),char(110),char(111),char(115),char(12),char(85),char(112), +char(115),char(105),char(108),char(111),char(110),char(116),char(111),char(110),char(111),char(115), +char(10),char(79),char(109),char(101),char(103),char(97),char(116),char(111),char(110),char(111), +char(115),char(17),char(105),char(111),char(116),char(97),char(100),char(105),char(101),char(114), +char(101),char(115),char(105),char(115),char(116),char(111),char(110),char(111),char(115),char(5), +char(65),char(108),char(112),char(104),char(97),char(4),char(66),char(101),char(116),char(97), +char(5),char(71),char(97),char(109),char(109),char(97),char(7),char(117),char(110),char(105), +char(48),char(51),char(57),char(52),char(7),char(69),char(112),char(115),char(105),char(108), +char(111),char(110),char(4),char(90),char(101),char(116),char(97),char(3),char(69),char(116), +char(97),char(5),char(84),char(104),char(101),char(116),char(97),char(8),char(73),char(111), +char(116),char(97),char(46),char(97),char(108),char(116),char(5),char(75),char(97),char(112), +char(112),char(97),char(6),char(76),char(97),char(109),char(98),char(100),char(97),char(2), +char(77),char(117),char(2),char(78),char(117),char(2),char(88),char(105),char(7),char(79), +char(109),char(105),char(99),char(114),char(111),char(110),char(2),char(80),char(105),char(3), +char(82),char(104),char(111),char(5),char(83),char(105),char(103),char(109),char(97),char(3), +char(84),char(97),char(117),char(7),char(85),char(112),char(115),char(105),char(108),char(111), +char(110),char(3),char(80),char(104),char(105),char(3),char(67),char(104),char(105),char(3), +char(80),char(115),char(105),char(7),char(117),char(110),char(105),char(48),char(51),char(65), +char(57),char(16),char(73),char(111),char(116),char(97),char(100),char(105),char(101),char(114), +char(101),char(115),char(105),char(115),char(46),char(97),char(108),char(116),char(15),char(85), +char(112),char(115),char(105),char(108),char(111),char(110),char(100),char(105),char(101),char(114), +char(101),char(115),char(105),char(115),char(10),char(97),char(108),char(112),char(104),char(97), +char(116),char(111),char(110),char(111),char(115),char(12),char(101),char(112),char(115),char(105), +char(108),char(111),char(110),char(116),char(111),char(110),char(111),char(115),char(8),char(101), +char(116),char(97),char(116),char(111),char(110),char(111),char(115),char(9),char(105),char(111), +char(116),char(97),char(116),char(111),char(110),char(111),char(115),char(20),char(117),char(112), +char(115),char(105),char(108),char(111),char(110),char(100),char(105),char(101),char(114),char(101), +char(115),char(105),char(115),char(116),char(111),char(110),char(111),char(115),char(5),char(97), +char(108),char(112),char(104),char(97),char(4),char(98),char(101),char(116),char(97),char(5), +char(103),char(97),char(109),char(109),char(97),char(5),char(100),char(101),char(108),char(116), +char(97),char(7),char(101),char(112),char(115),char(105),char(108),char(111),char(110),char(4), +char(122),char(101),char(116),char(97),char(3),char(101),char(116),char(97),char(5),char(116), +char(104),char(101),char(116),char(97),char(4),char(105),char(111),char(116),char(97),char(5), +char(107),char(97),char(112),char(112),char(97),char(6),char(108),char(97),char(109),char(98), +char(100),char(97),char(7),char(117),char(110),char(105),char(48),char(51),char(66),char(67), +char(2),char(110),char(117),char(2),char(120),char(105),char(7),char(111),char(109),char(105), +char(99),char(114),char(111),char(110),char(2),char(112),char(105),char(3),char(114),char(104), +char(111),char(6),char(115),char(105),char(103),char(109),char(97),char(49),char(5),char(115), +char(105),char(103),char(109),char(97),char(3),char(116),char(97),char(117),char(7),char(117), +char(112),char(115),char(105),char(108),char(111),char(110),char(3),char(112),char(104),char(105), +char(3),char(99),char(104),char(105),char(3),char(112),char(115),char(105),char(5),char(111), +char(109),char(101),char(103),char(97),char(12),char(105),char(111),char(116),char(97),char(100), +char(105),char(101),char(114),char(101),char(115),char(105),char(115),char(15),char(117),char(112), +char(115),char(105),char(108),char(111),char(110),char(100),char(105),char(101),char(114),char(101), +char(115),char(105),char(115),char(12),char(111),char(109),char(105),char(99),char(114),char(111), +char(110),char(116),char(111),char(110),char(111),char(115),char(12),char(117),char(112),char(115), +char(105),char(108),char(111),char(110),char(116),char(111),char(110),char(111),char(115),char(10), +char(111),char(109),char(101),char(103),char(97),char(116),char(111),char(110),char(111),char(115), +char(9),char(97),char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(51), +char(9),char(97),char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(49), +char(9),char(97),char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(50), +char(9),char(97),char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(51), +char(9),char(97),char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(52), +char(13),char(97),char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(53), +char(46),char(97),char(108),char(116),char(13),char(97),char(102),char(105),char(105),char(49), +char(48),char(48),char(53),char(54),char(46),char(97),char(108),char(116),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(54),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(54),char(49),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(54),char(50),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(52),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(49),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(49),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(49),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(49),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(50),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(52),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(54),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(50),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(49),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(50),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(51),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(52),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(54),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(51),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(49),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(50),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(51),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(52),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(54),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(52),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(54),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(54),char(54),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(54),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(54),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(54),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(50),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(51),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(52),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(54),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(49),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(50),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(51),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(52),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(54),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(56),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(49),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(50),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(51),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(52),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(54),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(55),char(49),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(49),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(50),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(51),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(52),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(53),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(54),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(55),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(56),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(48),char(57),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(49),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(49),char(57),char(51),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(53),char(48),char(9),char(97), +char(102),char(105),char(105),char(49),char(48),char(48),char(57),char(56),char(6),char(87), +char(103),char(114),char(97),char(118),char(101),char(6),char(119),char(103),char(114),char(97), +char(118),char(101),char(6),char(87),char(97),char(99),char(117),char(116),char(101),char(6), +char(119),char(97),char(99),char(117),char(116),char(101),char(9),char(87),char(100),char(105), +char(101),char(114),char(101),char(115),char(105),char(115),char(9),char(119),char(100),char(105), +char(101),char(114),char(101),char(115),char(105),char(115),char(6),char(89),char(103),char(114), +char(97),char(118),char(101),char(6),char(121),char(103),char(114),char(97),char(118),char(101), +char(6),char(101),char(110),char(100),char(97),char(115),char(104),char(6),char(101),char(109), +char(100),char(97),char(115),char(104),char(9),char(97),char(102),char(105),char(105),char(48), +char(48),char(50),char(48),char(56),char(13),char(117),char(110),char(100),char(101),char(114), +char(115),char(99),char(111),char(114),char(101),char(100),char(98),char(108),char(9),char(113), +char(117),char(111),char(116),char(101),char(108),char(101),char(102),char(116),char(10),char(113), +char(117),char(111),char(116),char(101),char(114),char(105),char(103),char(104),char(116),char(14), +char(113),char(117),char(111),char(116),char(101),char(115),char(105),char(110),char(103),char(108), +char(98),char(97),char(115),char(101),char(13),char(113),char(117),char(111),char(116),char(101), +char(114),char(101),char(118),char(101),char(114),char(115),char(101),char(100),char(12),char(113), +char(117),char(111),char(116),char(101),char(100),char(98),char(108),char(108),char(101),char(102), +char(116),char(13),char(113),char(117),char(111),char(116),char(101),char(100),char(98),char(108), +char(114),char(105),char(103),char(104),char(116),char(12),char(113),char(117),char(111),char(116), +char(101),char(100),char(98),char(108),char(98),char(97),char(115),char(101),char(6),char(100), +char(97),char(103),char(103),char(101),char(114),char(9),char(100),char(97),char(103),char(103), +char(101),char(114),char(100),char(98),char(108),char(6),char(98),char(117),char(108),char(108), +char(101),char(116),char(8),char(101),char(108),char(108),char(105),char(112),char(115),char(105), +char(115),char(11),char(112),char(101),char(114),char(116),char(104),char(111),char(117),char(115), +char(97),char(110),char(100),char(6),char(109),char(105),char(110),char(117),char(116),char(101), +char(6),char(115),char(101),char(99),char(111),char(110),char(100),char(13),char(103),char(117), +char(105),char(108),char(115),char(105),char(110),char(103),char(108),char(108),char(101),char(102), +char(116),char(14),char(103),char(117),char(105),char(108),char(115),char(105),char(110),char(103), +char(108),char(114),char(105),char(103),char(104),char(116),char(9),char(101),char(120),char(99), +char(108),char(97),char(109),char(100),char(98),char(108),char(8),char(102),char(114),char(97), +char(99),char(116),char(105),char(111),char(110),char(9),char(110),char(115),char(117),char(112), +char(101),char(114),char(105),char(111),char(114),char(5),char(102),char(114),char(97),char(110), +char(99),char(9),char(97),char(102),char(105),char(105),char(48),char(56),char(57),char(52), +char(49),char(6),char(112),char(101),char(115),char(101),char(116),char(97),char(4),char(69), +char(117),char(114),char(111),char(9),char(97),char(102),char(105),char(105),char(54),char(49), +char(50),char(52),char(56),char(9),char(97),char(102),char(105),char(105),char(54),char(49), +char(50),char(56),char(57),char(9),char(97),char(102),char(105),char(105),char(54),char(49), +char(51),char(53),char(50),char(9),char(116),char(114),char(97),char(100),char(101),char(109), +char(97),char(114),char(107),char(5),char(79),char(109),char(101),char(103),char(97),char(9), +char(101),char(115),char(116),char(105),char(109),char(97),char(116),char(101),char(100),char(9), +char(111),char(110),char(101),char(101),char(105),char(103),char(104),char(116),char(104),char(12), +char(116),char(104),char(114),char(101),char(101),char(101),char(105),char(103),char(104),char(116), +char(104),char(115),char(11),char(102),char(105),char(118),char(101),char(101),char(105),char(103), +char(104),char(116),char(104),char(115),char(12),char(115),char(101),char(118),char(101),char(110), +char(101),char(105),char(103),char(104),char(116),char(104),char(115),char(11),char(112),char(97), +char(114),char(116),char(105),char(97),char(108),char(100),char(105),char(102),char(102),char(5), +char(68),char(101),char(108),char(116),char(97),char(7),char(112),char(114),char(111),char(100), +char(117),char(99),char(116),char(9),char(115),char(117),char(109),char(109),char(97),char(116), +char(105),char(111),char(110),char(5),char(109),char(105),char(110),char(117),char(115),char(7), +char(114),char(97),char(100),char(105),char(99),char(97),char(108),char(8),char(105),char(110), +char(102),char(105),char(110),char(105),char(116),char(121),char(8),char(105),char(110),char(116), +char(101),char(103),char(114),char(97),char(108),char(11),char(97),char(112),char(112),char(114), +char(111),char(120),char(101),char(113),char(117),char(97),char(108),char(8),char(110),char(111), +char(116),char(101),char(113),char(117),char(97),char(108),char(9),char(108),char(101),char(115), +char(115),char(101),char(113),char(117),char(97),char(108),char(12),char(103),char(114),char(101), +char(97),char(116),char(101),char(114),char(101),char(113),char(117),char(97),char(108),char(7), +char(108),char(111),char(122),char(101),char(110),char(103),char(101),char(7),char(117),char(110), +char(105),char(70),char(66),char(48),char(49),char(7),char(117),char(110),char(105),char(70), +char(66),char(48),char(50),char(13),char(99),char(121),char(114),char(105),char(108),char(108), +char(105),char(99),char(98),char(114),char(101),char(118),char(101),char(8),char(100),char(111), +char(116),char(108),char(101),char(115),char(115),char(106),char(16),char(99),char(97),char(114), +char(111),char(110),char(99),char(111),char(109),char(109),char(97),char(97),char(99),char(99), +char(101),char(110),char(116),char(11),char(99),char(111),char(109),char(109),char(97),char(97), +char(99),char(99),char(101),char(110),char(116),char(17),char(99),char(111),char(109),char(109), +char(97),char(97),char(99),char(99),char(101),char(110),char(116),char(114),char(111),char(116), +char(97),char(116),char(101),char(12),char(122),char(101),char(114),char(111),char(115),char(117), +char(112),char(101),char(114),char(105),char(111),char(114),char(12),char(102),char(111),char(117), +char(114),char(115),char(117),char(112),char(101),char(114),char(105),char(111),char(114),char(12), +char(102),char(105),char(118),char(101),char(115),char(117),char(112),char(101),char(114),char(105), +char(111),char(114),char(11),char(115),char(105),char(120),char(115),char(117),char(112),char(101), +char(114),char(105),char(111),char(114),char(13),char(115),char(101),char(118),char(101),char(110), +char(115),char(117),char(112),char(101),char(114),char(105),char(111),char(114),char(13),char(101), +char(105),char(103),char(104),char(116),char(115),char(117),char(112),char(101),char(114),char(105), +char(111),char(114),char(12),char(110),char(105),char(110),char(101),char(115),char(117),char(112), +char(101),char(114),char(105),char(111),char(114),char(7),char(117),char(110),char(105),char(50), +char(48),char(48),char(48),char(7),char(117),char(110),char(105),char(50),char(48),char(48), +char(49),char(7),char(117),char(110),char(105),char(50),char(48),char(48),char(50),char(7), +char(117),char(110),char(105),char(50),char(48),char(48),char(51),char(7),char(117),char(110), +char(105),char(50),char(48),char(48),char(52),char(7),char(117),char(110),char(105),char(50), +char(48),char(48),char(53),char(7),char(117),char(110),char(105),char(50),char(48),char(48), +char(54),char(7),char(117),char(110),char(105),char(50),char(48),char(48),char(55),char(7), +char(117),char(110),char(105),char(50),char(48),char(48),char(56),char(7),char(117),char(110), +char(105),char(50),char(48),char(48),char(57),char(7),char(117),char(110),char(105),char(50), +char(48),char(48),char(65),char(7),char(117),char(110),char(105),char(50),char(48),char(48), +char(66),char(7),char(117),char(110),char(105),char(70),char(69),char(70),char(70),char(7), +char(117),char(110),char(105),char(70),char(70),char(70),char(67),char(7),char(117),char(110), +char(105),char(70),char(70),char(70),char(68),char(7),char(117),char(110),char(105),char(48), +char(49),char(70),char(48),char(7),char(117),char(110),char(105),char(48),char(50),char(66), +char(67),char(7),char(117),char(110),char(105),char(48),char(51),char(68),char(49),char(7), +char(117),char(110),char(105),char(48),char(51),char(68),char(50),char(7),char(117),char(110), +char(105),char(48),char(51),char(68),char(54),char(7),char(117),char(110),char(105),char(49), +char(69),char(51),char(69),char(7),char(117),char(110),char(105),char(49),char(69),char(51), +char(70),char(7),char(117),char(110),char(105),char(49),char(69),char(48),char(48),char(7), +char(117),char(110),char(105),char(49),char(69),char(48),char(49),char(7),char(117),char(110), +char(105),char(49),char(70),char(52),char(68),char(7),char(117),char(110),char(105),char(48), +char(50),char(70),char(51),char(9),char(100),char(97),char(115),char(105),char(97),char(111), +char(120),char(105),char(97),char(7),char(117),char(110),char(105),char(70),char(66),char(48), +char(51),char(7),char(117),char(110),char(105),char(70),char(66),char(48),char(52),char(5), +char(79),char(104),char(111),char(114),char(110),char(5),char(111),char(104),char(111),char(114), +char(110),char(5),char(85),char(104),char(111),char(114),char(110),char(5),char(117),char(104), +char(111),char(114),char(110),char(7),char(117),char(110),char(105),char(48),char(51),char(48), +char(48),char(7),char(117),char(110),char(105),char(48),char(51),char(48),char(49),char(7), +char(117),char(110),char(105),char(48),char(51),char(48),char(51),char(4),char(104),char(111), +char(111),char(107),char(8),char(100),char(111),char(116),char(98),char(101),char(108),char(111), +char(119),char(7),char(117),char(110),char(105),char(48),char(52),char(48),char(48),char(7), +char(117),char(110),char(105),char(48),char(52),char(48),char(68),char(7),char(117),char(110), +char(105),char(48),char(52),char(53),char(48),char(7),char(117),char(110),char(105),char(48), +char(52),char(53),char(68),char(7),char(117),char(110),char(105),char(48),char(52),char(54), +char(48),char(7),char(117),char(110),char(105),char(48),char(52),char(54),char(49),char(7), +char(117),char(110),char(105),char(48),char(52),char(54),char(50),char(7),char(117),char(110), +char(105),char(48),char(52),char(54),char(51),char(7),char(117),char(110),char(105),char(48), +char(52),char(54),char(52),char(7),char(117),char(110),char(105),char(48),char(52),char(54), +char(53),char(7),char(117),char(110),char(105),char(48),char(52),char(54),char(54),char(7), +char(117),char(110),char(105),char(48),char(52),char(54),char(55),char(7),char(117),char(110), +char(105),char(48),char(52),char(54),char(56),char(7),char(117),char(110),char(105),char(48), +char(52),char(54),char(57),char(7),char(117),char(110),char(105),char(48),char(52),char(54), +char(65),char(7),char(117),char(110),char(105),char(48),char(52),char(54),char(66),char(7), +char(117),char(110),char(105),char(48),char(52),char(54),char(67),char(7),char(117),char(110), +char(105),char(48),char(52),char(54),char(68),char(7),char(117),char(110),char(105),char(48), +char(52),char(54),char(69),char(7),char(117),char(110),char(105),char(48),char(52),char(54), +char(70),char(7),char(117),char(110),char(105),char(48),char(52),char(55),char(48),char(7), +char(117),char(110),char(105),char(48),char(52),char(55),char(49),char(7),char(117),char(110), +char(105),char(48),char(52),char(55),char(50),char(7),char(117),char(110),char(105),char(48), +char(52),char(55),char(51),char(7),char(117),char(110),char(105),char(48),char(52),char(55), +char(52),char(7),char(117),char(110),char(105),char(48),char(52),char(55),char(53),char(7), +char(117),char(110),char(105),char(48),char(52),char(55),char(54),char(7),char(117),char(110), +char(105),char(48),char(52),char(55),char(55),char(7),char(117),char(110),char(105),char(48), +char(52),char(55),char(56),char(7),char(117),char(110),char(105),char(48),char(52),char(55), +char(57),char(7),char(117),char(110),char(105),char(48),char(52),char(55),char(65),char(7), +char(117),char(110),char(105),char(48),char(52),char(55),char(66),char(7),char(117),char(110), +char(105),char(48),char(52),char(55),char(67),char(7),char(117),char(110),char(105),char(48), +char(52),char(55),char(68),char(7),char(117),char(110),char(105),char(48),char(52),char(55), +char(69),char(7),char(117),char(110),char(105),char(48),char(52),char(55),char(70),char(7), +char(117),char(110),char(105),char(48),char(52),char(56),char(48),char(7),char(117),char(110), +char(105),char(48),char(52),char(56),char(49),char(7),char(117),char(110),char(105),char(48), +char(52),char(56),char(50),char(7),char(117),char(110),char(105),char(48),char(52),char(56), +char(51),char(7),char(117),char(110),char(105),char(48),char(52),char(56),char(52),char(7), +char(117),char(110),char(105),char(48),char(52),char(56),char(53),char(7),char(117),char(110), +char(105),char(48),char(52),char(56),char(54),char(7),char(117),char(110),char(105),char(48), +char(52),char(56),char(56),char(7),char(117),char(110),char(105),char(48),char(52),char(56), +char(57),char(7),char(117),char(110),char(105),char(48),char(52),char(56),char(65),char(7), +char(117),char(110),char(105),char(48),char(52),char(56),char(66),char(7),char(117),char(110), +char(105),char(48),char(52),char(56),char(67),char(7),char(117),char(110),char(105),char(48), +char(52),char(56),char(68),char(7),char(117),char(110),char(105),char(48),char(52),char(56), +char(69),char(7),char(117),char(110),char(105),char(48),char(52),char(56),char(70),char(7), +char(117),char(110),char(105),char(48),char(52),char(57),char(50),char(7),char(117),char(110), +char(105),char(48),char(52),char(57),char(51),char(7),char(117),char(110),char(105),char(48), +char(52),char(57),char(52),char(7),char(117),char(110),char(105),char(48),char(52),char(57), +char(53),char(7),char(117),char(110),char(105),char(48),char(52),char(57),char(54),char(7), +char(117),char(110),char(105),char(48),char(52),char(57),char(55),char(7),char(117),char(110), +char(105),char(48),char(52),char(57),char(56),char(7),char(117),char(110),char(105),char(48), +char(52),char(57),char(57),char(7),char(117),char(110),char(105),char(48),char(52),char(57), +char(65),char(7),char(117),char(110),char(105),char(48),char(52),char(57),char(66),char(7), +char(117),char(110),char(105),char(48),char(52),char(57),char(67),char(7),char(117),char(110), +char(105),char(48),char(52),char(57),char(68),char(7),char(117),char(110),char(105),char(48), +char(52),char(57),char(69),char(7),char(117),char(110),char(105),char(48),char(52),char(57), +char(70),char(7),char(117),char(110),char(105),char(48),char(52),char(65),char(48),char(7), +char(117),char(110),char(105),char(48),char(52),char(65),char(49),char(7),char(117),char(110), +char(105),char(48),char(52),char(65),char(50),char(7),char(117),char(110),char(105),char(48), +char(52),char(65),char(51),char(7),char(117),char(110),char(105),char(48),char(52),char(65), +char(52),char(7),char(117),char(110),char(105),char(48),char(52),char(65),char(53),char(7), +char(117),char(110),char(105),char(48),char(52),char(65),char(54),char(7),char(117),char(110), +char(105),char(48),char(52),char(65),char(55),char(7),char(117),char(110),char(105),char(48), +char(52),char(65),char(56),char(7),char(117),char(110),char(105),char(48),char(52),char(65), +char(57),char(7),char(117),char(110),char(105),char(48),char(52),char(65),char(65),char(7), +char(117),char(110),char(105),char(48),char(52),char(65),char(66),char(7),char(117),char(110), +char(105),char(48),char(52),char(65),char(67),char(7),char(117),char(110),char(105),char(48), +char(52),char(65),char(68),char(7),char(117),char(110),char(105),char(48),char(52),char(65), +char(69),char(7),char(117),char(110),char(105),char(48),char(52),char(65),char(70),char(7), +char(117),char(110),char(105),char(48),char(52),char(66),char(48),char(7),char(117),char(110), +char(105),char(48),char(52),char(66),char(49),char(7),char(117),char(110),char(105),char(48), +char(52),char(66),char(50),char(7),char(117),char(110),char(105),char(48),char(52),char(66), +char(51),char(7),char(117),char(110),char(105),char(48),char(52),char(66),char(52),char(7), +char(117),char(110),char(105),char(48),char(52),char(66),char(53),char(7),char(117),char(110), +char(105),char(48),char(52),char(66),char(54),char(7),char(117),char(110),char(105),char(48), +char(52),char(66),char(55),char(7),char(117),char(110),char(105),char(48),char(52),char(66), +char(56),char(7),char(117),char(110),char(105),char(48),char(52),char(66),char(57),char(7), +char(117),char(110),char(105),char(48),char(52),char(66),char(65),char(7),char(117),char(110), +char(105),char(48),char(52),char(66),char(66),char(7),char(117),char(110),char(105),char(48), +char(52),char(66),char(67),char(7),char(117),char(110),char(105),char(48),char(52),char(66), +char(68),char(7),char(117),char(110),char(105),char(48),char(52),char(66),char(69),char(7), +char(117),char(110),char(105),char(48),char(52),char(66),char(70),char(11),char(117),char(110), +char(105),char(48),char(52),char(67),char(48),char(46),char(97),char(108),char(116),char(7), +char(117),char(110),char(105),char(48),char(52),char(67),char(49),char(7),char(117),char(110), +char(105),char(48),char(52),char(67),char(50),char(7),char(117),char(110),char(105),char(48), +char(52),char(67),char(51),char(7),char(117),char(110),char(105),char(48),char(52),char(67), +char(52),char(7),char(117),char(110),char(105),char(48),char(52),char(67),char(53),char(7), +char(117),char(110),char(105),char(48),char(52),char(67),char(54),char(7),char(117),char(110), +char(105),char(48),char(52),char(67),char(55),char(7),char(117),char(110),char(105),char(48), +char(52),char(67),char(56),char(7),char(117),char(110),char(105),char(48),char(52),char(67), +char(57),char(7),char(117),char(110),char(105),char(48),char(52),char(67),char(65),char(7), +char(117),char(110),char(105),char(48),char(52),char(67),char(66),char(7),char(117),char(110), +char(105),char(48),char(52),char(67),char(67),char(7),char(117),char(110),char(105),char(48), +char(52),char(67),char(68),char(7),char(117),char(110),char(105),char(48),char(52),char(67), +char(69),char(11),char(117),char(110),char(105),char(48),char(52),char(67),char(70),char(46), +char(97),char(108),char(116),char(7),char(117),char(110),char(105),char(48),char(52),char(68), +char(48),char(7),char(117),char(110),char(105),char(48),char(52),char(68),char(49),char(7), +char(117),char(110),char(105),char(48),char(52),char(68),char(50),char(7),char(117),char(110), +char(105),char(48),char(52),char(68),char(51),char(7),char(117),char(110),char(105),char(48), +char(52),char(68),char(52),char(7),char(117),char(110),char(105),char(48),char(52),char(68), +char(53),char(7),char(117),char(110),char(105),char(48),char(52),char(68),char(54),char(7), +char(117),char(110),char(105),char(48),char(52),char(68),char(55),char(7),char(117),char(110), +char(105),char(48),char(52),char(68),char(56),char(7),char(117),char(110),char(105),char(48), +char(52),char(68),char(57),char(7),char(117),char(110),char(105),char(48),char(52),char(68), +char(65),char(7),char(117),char(110),char(105),char(48),char(52),char(68),char(66),char(7), +char(117),char(110),char(105),char(48),char(52),char(68),char(67),char(7),char(117),char(110), +char(105),char(48),char(52),char(68),char(68),char(7),char(117),char(110),char(105),char(48), +char(52),char(68),char(69),char(7),char(117),char(110),char(105),char(48),char(52),char(68), +char(70),char(7),char(117),char(110),char(105),char(48),char(52),char(69),char(48),char(7), +char(117),char(110),char(105),char(48),char(52),char(69),char(49),char(7),char(117),char(110), +char(105),char(48),char(52),char(69),char(50),char(7),char(117),char(110),char(105),char(48), +char(52),char(69),char(51),char(7),char(117),char(110),char(105),char(48),char(52),char(69), +char(52),char(7),char(117),char(110),char(105),char(48),char(52),char(69),char(53),char(7), +char(117),char(110),char(105),char(48),char(52),char(69),char(54),char(7),char(117),char(110), +char(105),char(48),char(52),char(69),char(55),char(7),char(117),char(110),char(105),char(48), +char(52),char(69),char(56),char(7),char(117),char(110),char(105),char(48),char(52),char(69), +char(57),char(7),char(117),char(110),char(105),char(48),char(52),char(69),char(65),char(7), +char(117),char(110),char(105),char(48),char(52),char(69),char(66),char(7),char(117),char(110), +char(105),char(48),char(52),char(69),char(67),char(7),char(117),char(110),char(105),char(48), +char(52),char(69),char(68),char(7),char(117),char(110),char(105),char(48),char(52),char(69), +char(69),char(7),char(117),char(110),char(105),char(48),char(52),char(69),char(70),char(7), +char(117),char(110),char(105),char(48),char(52),char(70),char(48),char(7),char(117),char(110), +char(105),char(48),char(52),char(70),char(49),char(7),char(117),char(110),char(105),char(48), +char(52),char(70),char(50),char(7),char(117),char(110),char(105),char(48),char(52),char(70), +char(51),char(7),char(117),char(110),char(105),char(48),char(52),char(70),char(52),char(7), +char(117),char(110),char(105),char(48),char(52),char(70),char(53),char(7),char(117),char(110), +char(105),char(48),char(52),char(70),char(54),char(7),char(117),char(110),char(105),char(48), +char(52),char(70),char(55),char(7),char(117),char(110),char(105),char(48),char(52),char(70), +char(56),char(7),char(117),char(110),char(105),char(48),char(52),char(70),char(57),char(7), +char(117),char(110),char(105),char(48),char(52),char(70),char(65),char(7),char(117),char(110), +char(105),char(48),char(52),char(70),char(66),char(7),char(117),char(110),char(105),char(48), +char(52),char(70),char(67),char(7),char(117),char(110),char(105),char(48),char(52),char(70), +char(68),char(7),char(117),char(110),char(105),char(48),char(52),char(70),char(69),char(7), +char(117),char(110),char(105),char(48),char(52),char(70),char(70),char(7),char(117),char(110), +char(105),char(48),char(53),char(48),char(48),char(7),char(117),char(110),char(105),char(48), +char(53),char(48),char(49),char(7),char(117),char(110),char(105),char(48),char(53),char(48), +char(50),char(7),char(117),char(110),char(105),char(48),char(53),char(48),char(51),char(7), +char(117),char(110),char(105),char(48),char(53),char(48),char(52),char(7),char(117),char(110), +char(105),char(48),char(53),char(48),char(53),char(7),char(117),char(110),char(105),char(48), +char(53),char(48),char(54),char(7),char(117),char(110),char(105),char(48),char(53),char(48), +char(55),char(7),char(117),char(110),char(105),char(48),char(53),char(48),char(56),char(7), +char(117),char(110),char(105),char(48),char(53),char(48),char(57),char(7),char(117),char(110), +char(105),char(48),char(53),char(48),char(65),char(7),char(117),char(110),char(105),char(48), +char(53),char(48),char(66),char(7),char(117),char(110),char(105),char(48),char(53),char(48), +char(67),char(7),char(117),char(110),char(105),char(48),char(53),char(48),char(68),char(7), +char(117),char(110),char(105),char(48),char(53),char(48),char(69),char(7),char(117),char(110), +char(105),char(48),char(53),char(48),char(70),char(7),char(117),char(110),char(105),char(48), +char(53),char(49),char(48),char(7),char(117),char(110),char(105),char(48),char(53),char(49), +char(49),char(7),char(117),char(110),char(105),char(48),char(53),char(49),char(50),char(7), +char(117),char(110),char(105),char(48),char(53),char(49),char(51),char(7),char(117),char(110), +char(105),char(49),char(69),char(65),char(48),char(7),char(117),char(110),char(105),char(49), +char(69),char(65),char(49),char(7),char(117),char(110),char(105),char(49),char(69),char(65), +char(50),char(7),char(117),char(110),char(105),char(49),char(69),char(65),char(51),char(7), +char(117),char(110),char(105),char(49),char(69),char(65),char(52),char(7),char(117),char(110), +char(105),char(49),char(69),char(65),char(53),char(7),char(117),char(110),char(105),char(49), +char(69),char(65),char(54),char(7),char(117),char(110),char(105),char(49),char(69),char(65), +char(55),char(7),char(117),char(110),char(105),char(49),char(69),char(65),char(56),char(7), +char(117),char(110),char(105),char(49),char(69),char(65),char(57),char(7),char(117),char(110), +char(105),char(49),char(69),char(65),char(65),char(7),char(117),char(110),char(105),char(49), +char(69),char(65),char(66),char(7),char(117),char(110),char(105),char(49),char(69),char(65), +char(67),char(7),char(117),char(110),char(105),char(49),char(69),char(65),char(68),char(7), +char(117),char(110),char(105),char(49),char(69),char(65),char(69),char(7),char(117),char(110), +char(105),char(49),char(69),char(65),char(70),char(7),char(117),char(110),char(105),char(49), +char(69),char(66),char(48),char(7),char(117),char(110),char(105),char(49),char(69),char(66), +char(49),char(7),char(117),char(110),char(105),char(49),char(69),char(66),char(50),char(7), +char(117),char(110),char(105),char(49),char(69),char(66),char(51),char(7),char(117),char(110), +char(105),char(49),char(69),char(66),char(52),char(7),char(117),char(110),char(105),char(49), +char(69),char(66),char(53),char(7),char(117),char(110),char(105),char(49),char(69),char(66), +char(54),char(7),char(117),char(110),char(105),char(49),char(69),char(66),char(55),char(7), +char(117),char(110),char(105),char(49),char(69),char(66),char(56),char(7),char(117),char(110), +char(105),char(49),char(69),char(66),char(57),char(7),char(117),char(110),char(105),char(49), +char(69),char(66),char(65),char(7),char(117),char(110),char(105),char(49),char(69),char(66), +char(66),char(7),char(117),char(110),char(105),char(49),char(69),char(66),char(67),char(7), +char(117),char(110),char(105),char(49),char(69),char(66),char(68),char(7),char(117),char(110), +char(105),char(49),char(69),char(66),char(69),char(7),char(117),char(110),char(105),char(49), +char(69),char(66),char(70),char(7),char(117),char(110),char(105),char(49),char(69),char(67), +char(48),char(7),char(117),char(110),char(105),char(49),char(69),char(67),char(49),char(7), +char(117),char(110),char(105),char(49),char(69),char(67),char(50),char(7),char(117),char(110), +char(105),char(49),char(69),char(67),char(51),char(7),char(117),char(110),char(105),char(49), +char(69),char(67),char(52),char(7),char(117),char(110),char(105),char(49),char(69),char(67), +char(53),char(7),char(117),char(110),char(105),char(49),char(69),char(67),char(54),char(7), +char(117),char(110),char(105),char(49),char(69),char(67),char(55),char(11),char(117),char(110), +char(105),char(49),char(69),char(67),char(56),char(46),char(97),char(108),char(116),char(7), +char(117),char(110),char(105),char(49),char(69),char(67),char(57),char(11),char(117),char(110), +char(105),char(49),char(69),char(67),char(65),char(46),char(97),char(108),char(116),char(7), +char(117),char(110),char(105),char(49),char(69),char(67),char(66),char(7),char(117),char(110), +char(105),char(49),char(69),char(67),char(67),char(7),char(117),char(110),char(105),char(49), +char(69),char(67),char(68),char(7),char(117),char(110),char(105),char(49),char(69),char(67), +char(69),char(7),char(117),char(110),char(105),char(49),char(69),char(67),char(70),char(7), +char(117),char(110),char(105),char(49),char(69),char(68),char(48),char(7),char(117),char(110), +char(105),char(49),char(69),char(68),char(49),char(7),char(117),char(110),char(105),char(49), +char(69),char(68),char(50),char(7),char(117),char(110),char(105),char(49),char(69),char(68), +char(51),char(7),char(117),char(110),char(105),char(49),char(69),char(68),char(52),char(7), +char(117),char(110),char(105),char(49),char(69),char(68),char(53),char(7),char(117),char(110), +char(105),char(49),char(69),char(68),char(54),char(7),char(117),char(110),char(105),char(49), +char(69),char(68),char(55),char(7),char(117),char(110),char(105),char(49),char(69),char(68), +char(56),char(7),char(117),char(110),char(105),char(49),char(69),char(68),char(57),char(7), +char(117),char(110),char(105),char(49),char(69),char(68),char(65),char(7),char(117),char(110), +char(105),char(49),char(69),char(68),char(66),char(7),char(117),char(110),char(105),char(49), +char(69),char(68),char(67),char(7),char(117),char(110),char(105),char(49),char(69),char(68), +char(68),char(7),char(117),char(110),char(105),char(49),char(69),char(68),char(69),char(7), +char(117),char(110),char(105),char(49),char(69),char(68),char(70),char(7),char(117),char(110), +char(105),char(49),char(69),char(69),char(48),char(7),char(117),char(110),char(105),char(49), +char(69),char(69),char(49),char(7),char(117),char(110),char(105),char(49),char(69),char(69), +char(50),char(7),char(117),char(110),char(105),char(49),char(69),char(69),char(51),char(7), +char(117),char(110),char(105),char(49),char(69),char(69),char(52),char(7),char(117),char(110), +char(105),char(49),char(69),char(69),char(53),char(7),char(117),char(110),char(105),char(49), +char(69),char(69),char(54),char(7),char(117),char(110),char(105),char(49),char(69),char(69), +char(55),char(7),char(117),char(110),char(105),char(49),char(69),char(69),char(56),char(7), +char(117),char(110),char(105),char(49),char(69),char(69),char(57),char(7),char(117),char(110), +char(105),char(49),char(69),char(69),char(65),char(7),char(117),char(110),char(105),char(49), +char(69),char(69),char(66),char(7),char(117),char(110),char(105),char(49),char(69),char(69), +char(67),char(7),char(117),char(110),char(105),char(49),char(69),char(69),char(68),char(7), +char(117),char(110),char(105),char(49),char(69),char(69),char(69),char(7),char(117),char(110), +char(105),char(49),char(69),char(69),char(70),char(7),char(117),char(110),char(105),char(49), +char(69),char(70),char(48),char(7),char(117),char(110),char(105),char(49),char(69),char(70), +char(49),char(7),char(117),char(110),char(105),char(49),char(69),char(70),char(52),char(7), +char(117),char(110),char(105),char(49),char(69),char(70),char(53),char(7),char(117),char(110), +char(105),char(49),char(69),char(70),char(54),char(7),char(117),char(110),char(105),char(49), +char(69),char(70),char(55),char(7),char(117),char(110),char(105),char(49),char(69),char(70), +char(56),char(7),char(117),char(110),char(105),char(49),char(69),char(70),char(57),char(7), +char(117),char(110),char(105),char(50),char(48),char(65),char(66),char(7),char(117),char(110), +char(105),char(48),char(51),char(48),char(70),char(19),char(99),char(105),char(114),char(99), +char(117),char(109),char(102),char(108),char(101),char(120),char(97),char(99),char(117),char(116), +char(101),char(99),char(111),char(109),char(98),char(19),char(99),char(105),char(114),char(99), +char(117),char(109),char(102),char(108),char(101),char(120),char(103),char(114),char(97),char(118), +char(101),char(99),char(111),char(109),char(98),char(18),char(99),char(105),char(114),char(99), +char(117),char(109),char(102),char(108),char(101),char(120),char(104),char(111),char(111),char(107), +char(99),char(111),char(109),char(98),char(19),char(99),char(105),char(114),char(99),char(117), +char(109),char(102),char(108),char(101),char(120),char(116),char(105),char(108),char(100),char(101), +char(99),char(111),char(109),char(98),char(14),char(98),char(114),char(101),char(118),char(101), +char(97),char(99),char(117),char(116),char(101),char(99),char(111),char(109),char(98),char(14), +char(98),char(114),char(101),char(118),char(101),char(103),char(114),char(97),char(118),char(101), +char(99),char(111),char(109),char(98),char(13),char(98),char(114),char(101),char(118),char(101), +char(104),char(111),char(111),char(107),char(99),char(111),char(109),char(98),char(14),char(98), +char(114),char(101),char(118),char(101),char(116),char(105),char(108),char(100),char(101),char(99), +char(111),char(109),char(98),char(16),char(99),char(121),char(114),char(105),char(108),char(108), +char(105),char(99),char(104),char(111),char(111),char(107),char(108),char(101),char(102),char(116), +char(17),char(99),char(121),char(114),char(105),char(108),char(108),char(105),char(99),char(98), +char(105),char(103),char(104),char(111),char(111),char(107),char(85),char(67),char(17),char(99), +char(121),char(114),char(105),char(108),char(108),char(105),char(99),char(98),char(105),char(103), +char(104),char(111),char(111),char(107),char(76),char(67),char(8),char(111),char(110),char(101), +char(46),char(112),char(110),char(117),char(109),char(7),char(122),char(101),char(114),char(111), +char(46),char(111),char(115),char(6),char(111),char(110),char(101),char(46),char(111),char(115), +char(6),char(116),char(119),char(111),char(46),char(111),char(115),char(8),char(116),char(104), +char(114),char(101),char(101),char(46),char(111),char(115),char(7),char(102),char(111),char(117), +char(114),char(46),char(111),char(115),char(7),char(102),char(105),char(118),char(101),char(46), +char(111),char(115),char(6),char(115),char(105),char(120),char(46),char(111),char(115),char(8), +char(115),char(101),char(118),char(101),char(110),char(46),char(111),char(115),char(8),char(101), +char(105),char(103),char(104),char(116),char(46),char(111),char(115),char(7),char(110),char(105), +char(110),char(101),char(46),char(111),char(115),char(2),char(102),char(102),char(7),char(117), +char(110),char(105),char(50),char(49),char(50),char(48),char(8),char(84),char(99),char(101), +char(100),char(105),char(108),char(108),char(97),char(8),char(116),char(99),char(101),char(100), +char(105),char(108),char(108),char(97),char(5),char(103),char(46),char(97),char(108),char(116), +char(15),char(103),char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108), +char(101),char(120),char(46),char(97),char(108),char(116),char(10),char(103),char(98),char(114), +char(101),char(118),char(101),char(46),char(97),char(108),char(116),char(8),char(103),char(100), +char(111),char(116),char(46),char(97),char(108),char(116),char(16),char(103),char(99),char(111), +char(109),char(109),char(97),char(97),char(99),char(99),char(101),char(110),char(116),char(46), +char(97),char(108),char(116),char(1),char(73),char(6),char(73),char(103),char(114),char(97), +char(118),char(101),char(6),char(73),char(97),char(99),char(117),char(116),char(101),char(11), +char(73),char(99),char(105),char(114),char(99),char(117),char(109),char(102),char(108),char(101), +char(120),char(9),char(73),char(100),char(105),char(101),char(114),char(101),char(115),char(105), +char(115),char(6),char(73),char(116),char(105),char(108),char(100),char(101),char(7),char(73), +char(109),char(97),char(99),char(114),char(111),char(110),char(6),char(73),char(98),char(114), +char(101),char(118),char(101),char(7),char(73),char(111),char(103),char(111),char(110),char(101), +char(107),char(10),char(73),char(100),char(111),char(116),char(97),char(99),char(99),char(101), +char(110),char(116),char(2),char(73),char(74),char(9),char(73),char(111),char(116),char(97), +char(116),char(111),char(110),char(111),char(115),char(4),char(73),char(111),char(116),char(97), +char(12),char(73),char(111),char(116),char(97),char(100),char(105),char(101),char(114),char(101), +char(115),char(105),char(115),char(9),char(97),char(102),char(105),char(105),char(49),char(48), +char(48),char(53),char(53),char(9),char(97),char(102),char(105),char(105),char(49),char(48), +char(48),char(53),char(54),char(7),char(117),char(110),char(105),char(48),char(52),char(67), +char(48),char(7),char(117),char(110),char(105),char(48),char(52),char(67),char(70),char(7), +char(117),char(110),char(105),char(49),char(69),char(67),char(56),char(7),char(117),char(110), +char(105),char(49),char(69),char(67),char(65),char(0),char(0),char(1),char(0),char(3), +char(0),char(8),char(0),char(10),char(0),char(13),char(0),char(7),char(255),char(255), +char(0),char(15),char(0),char(1),char(0),char(0),char(0),char(12),char(0),char(0), +char(0),char(22),char(0),char(0),char(0),char(2),char(0),char(1),char(0),char(0), +char(3),char(169),char(0),char(1),char(0),char(4),char(0),char(0),char(0),char(1), +char(0),char(0),char(0),char(0),char(0),char(1),char(0),char(0),char(0),char(10), +char(0),char(52),char(0),char(54),char(0),char(1),char(108),char(97),char(116),char(110), +char(0),char(8),char(0),char(16),char(0),char(2),char(77),char(79),char(76),char(32), +char(0),char(22),char(82),char(79),char(77),char(32),char(0),char(28),char(0),char(0), +char(255),char(255),char(0),char(0),char(0),char(0),char(255),char(255),char(0),char(0), +char(0),char(0),char(255),char(255),char(0),char(0),char(0),char(0),char(0),char(0), +char(0),char(1),char(0),char(0),char(0),char(10),char(0),char(110),char(1),char(228), +char(0),char(1),char(108),char(97),char(116),char(110),char(0),char(8),char(0),char(16), +char(0),char(2),char(77),char(79),char(76),char(32),char(0),char(40),char(82),char(79), +char(77),char(32),char(0),char(66),char(0),char(0),char(255),char(255),char(0),char(9), +char(0),char(3),char(0),char(8),char(0),char(11),char(0),char(0),char(0),char(14), +char(0),char(17),char(0),char(20),char(0),char(23),char(0),char(26),char(0),char(0), +char(255),char(255),char(0),char(10),char(0),char(4),char(0),char(6),char(0),char(9), +char(0),char(12),char(0),char(1),char(0),char(15),char(0),char(18),char(0),char(21), +char(0),char(24),char(0),char(27),char(0),char(0),char(255),char(255),char(0),char(10), +char(0),char(5),char(0),char(7),char(0),char(10),char(0),char(13),char(0),char(2), +char(0),char(16),char(0),char(19),char(0),char(22),char(0),char(25),char(0),char(28), +char(0),char(29),char(108),char(105),char(103),char(97),char(0),char(176),char(108),char(105), +char(103),char(97),char(0),char(182),char(108),char(105),char(103),char(97),char(0),char(188), +char(108),char(110),char(117),char(109),char(0),char(194),char(108),char(110),char(117),char(109), +char(0),char(200),char(108),char(110),char(117),char(109),char(0),char(206),char(108),char(111), +char(99),char(108),char(0),char(212),char(108),char(111),char(99),char(108),char(0),char(218), +char(111),char(110),char(117),char(109),char(0),char(224),char(111),char(110),char(117),char(109), +char(0),char(232),char(111),char(110),char(117),char(109),char(0),char(240),char(112),char(110), +char(117),char(109),char(0),char(248),char(112),char(110),char(117),char(109),char(0),char(254), +char(112),char(110),char(117),char(109),char(1),char(4),char(115),char(97),char(108),char(116), +char(1),char(10),char(115),char(97),char(108),char(116),char(1),char(18),char(115),char(97), +char(108),char(116),char(1),char(26),char(115),char(115),char(48),char(49),char(1),char(34), +char(115),char(115),char(48),char(49),char(1),char(42),char(115),char(115),char(48),char(49), +char(1),char(50),char(115),char(115),char(48),char(50),char(1),char(58),char(115),char(115), +char(48),char(50),char(1),char(64),char(115),char(115),char(48),char(50),char(1),char(70), +char(115),char(115),char(48),char(51),char(1),char(76),char(115),char(115),char(48),char(51), +char(1),char(82),char(115),char(115),char(48),char(51),char(1),char(88),char(116),char(110), +char(117),char(109),char(1),char(94),char(116),char(110),char(117),char(109),char(1),char(102), +char(116),char(110),char(117),char(109),char(1),char(110),char(0),char(0),char(0),char(1), +char(0),char(9),char(0),char(0),char(0),char(1),char(0),char(9),char(0),char(0), +char(0),char(1),char(0),char(9),char(0),char(0),char(0),char(1),char(0),char(7), +char(0),char(0),char(0),char(1),char(0),char(7),char(0),char(0),char(0),char(1), +char(0),char(7),char(0),char(0),char(0),char(1),char(0),char(8),char(0),char(0), +char(0),char(1),char(0),char(8),char(0),char(0),char(0),char(2),char(0),char(2), +char(0),char(3),char(0),char(0),char(0),char(2),char(0),char(2),char(0),char(3), +char(0),char(0),char(0),char(2),char(0),char(2),char(0),char(3),char(0),char(0), +char(0),char(1),char(0),char(4),char(0),char(0),char(0),char(1),char(0),char(4), +char(0),char(0),char(0),char(1),char(0),char(4),char(0),char(0),char(0),char(2), +char(0),char(0),char(0),char(1),char(0),char(0),char(0),char(2),char(0),char(0), +char(0),char(1),char(0),char(0),char(0),char(2),char(0),char(0),char(0),char(1), +char(0),char(0),char(0),char(2),char(0),char(0),char(0),char(1),char(0),char(0), +char(0),char(2),char(0),char(0),char(0),char(1),char(0),char(0),char(0),char(2), +char(0),char(0),char(0),char(1),char(0),char(0),char(0),char(1),char(0),char(0), +char(0),char(0),char(0),char(1),char(0),char(0),char(0),char(0),char(0),char(1), +char(0),char(0),char(0),char(0),char(0),char(1),char(0),char(1),char(0),char(0), +char(0),char(1),char(0),char(1),char(0),char(0),char(0),char(1),char(0),char(1), +char(0),char(0),char(0),char(2),char(0),char(5),char(0),char(6),char(0),char(0), +char(0),char(2),char(0),char(5),char(0),char(6),char(0),char(0),char(0),char(2), +char(0),char(5),char(0),char(6),char(0),char(10),char(0),char(22),char(0),char(30), +char(0),char(38),char(0),char(46),char(0),char(54),char(0),char(62),char(0),char(70), +char(0),char(78),char(0),char(86),char(0),char(94),char(0),char(1),char(0),char(0), +char(0),char(1),char(0),char(80),char(0),char(1),char(0),char(0),char(0),char(1), +char(0),char(122),char(0),char(1),char(0),char(0),char(0),char(1),char(0),char(170), +char(0),char(1),char(0),char(0),char(0),char(1),char(0),char(198),char(0),char(1), +char(0),char(0),char(0),char(1),char(0),char(238),char(0),char(1),char(0),char(0), +char(0),char(1),char(0),char(244),char(0),char(1),char(0),char(0),char(0),char(1), +char(1),char(16),char(0),char(1),char(0),char(0),char(0),char(1),char(1),char(22), +char(0),char(1),char(0),char(0),char(0),char(1),char(1),char(50),char(0),char(4), +char(0),char(0),char(0),char(1),char(1),char(72),char(0),char(2),char(0),char(16), +char(0),char(5),char(3),char(145),char(3),char(146),char(3),char(147),char(3),char(148), +char(3),char(149),char(0),char(2),char(0),char(5),char(0),char(74),char(0),char(74), +char(0),char(0),char(0),char(223),char(0),char(223),char(0),char(1),char(0),char(225), +char(0),char(225),char(0),char(2),char(0),char(227),char(0),char(227),char(0),char(3), +char(0),char(229),char(0),char(229),char(0),char(4),char(0),char(2),char(0),char(46), +char(0),char(20),char(0),char(44),char(0),char(142),char(0),char(143),char(0),char(144), +char(0),char(145),char(0),char(234),char(0),char(236),char(0),char(238),char(0),char(240), +char(0),char(242),char(0),char(244),char(1),char(90),char(1),char(103),char(1),char(119), +char(1),char(161),char(1),char(162),char(2),char(201),char(2),char(216),char(3),char(69), +char(3),char(71),char(0),char(2),char(0),char(1),char(3),char(150),char(3),char(169), +char(0),char(0),char(0),char(2),char(0),char(26),char(0),char(10),char(3),char(131), +char(3),char(132),char(3),char(133),char(3),char(134),char(3),char(135),char(3),char(136), +char(3),char(137),char(3),char(138),char(3),char(139),char(3),char(140),char(0),char(2), +char(0),char(1),char(0),char(19),char(0),char(28),char(0),char(0),char(0),char(2), +char(0),char(26),char(0),char(10),char(3),char(131),char(3),char(133),char(3),char(134), +char(3),char(135),char(3),char(136),char(3),char(137),char(3),char(138),char(3),char(139), +char(3),char(140),char(3),char(132),char(0),char(2),char(0),char(3),char(0),char(19), +char(0),char(19),char(0),char(0),char(0),char(21),char(0),char(28),char(0),char(1), +char(3),char(130),char(3),char(130),char(0),char(9),char(0),char(2),char(0),char(8), +char(0),char(1),char(3),char(130),char(0),char(1),char(0),char(1),char(0),char(20), +char(0),char(2),char(0),char(26),char(0),char(10),char(0),char(19),char(0),char(20), +char(0),char(21),char(0),char(22),char(0),char(23),char(0),char(24),char(0),char(25), +char(0),char(26),char(0),char(27),char(0),char(28),char(0),char(2),char(0),char(1), +char(3),char(131),char(3),char(140),char(0),char(0),char(0),char(2),char(0),char(8), +char(0),char(1),char(0),char(20),char(0),char(1),char(0),char(1),char(3),char(130), +char(0),char(2),char(0),char(26),char(0),char(10),char(0),char(19),char(3),char(130), +char(0),char(21),char(0),char(22),char(0),char(23),char(0),char(24),char(0),char(25), +char(0),char(26),char(0),char(27),char(0),char(28),char(0),char(2),char(0),char(1), +char(3),char(131),char(3),char(140),char(0),char(0),char(0),char(2),char(0),char(14), +char(0),char(4),char(3),char(143),char(3),char(144),char(1),char(32),char(1),char(33), +char(0),char(2),char(0),char(2),char(1),char(36),char(1),char(37),char(0),char(0), +char(1),char(73),char(1),char(74),char(0),char(2),char(0),char(1),char(0),char(54), +char(0),char(1),char(0),char(8),char(0),char(5),char(0),char(12),char(0),char(20), +char(0),char(28),char(0),char(34),char(0),char(40),char(2),char(94),char(0),char(3), +char(0),char(73),char(0),char(79),char(2),char(93),char(0),char(3),char(0),char(73), +char(0),char(76),char(3),char(141),char(0),char(2),char(0),char(73),char(2),char(53), +char(0),char(2),char(0),char(79),char(2),char(52),char(0),char(2),char(0),char(76), +char(0),char(1),char(0),char(1),char(0),char(73),char(0),char(0),char(0),char(0), +char(0),char(1),char(0),char(1),char(0),char(1),char(0),char(0),char(0),char(1), +char(0),char(0),char(21),char(94),char(0),char(0),char(0),char(20),char(0),char(0), +char(0),char(0),char(0),char(0),char(21),char(86),char(48),char(130),char(21),char(82), +char(6),char(9),char(42),char(134),char(72),char(134),char(247),char(13),char(1),char(7), +char(2),char(160),char(130),char(21),char(67),char(48),char(130),char(21),char(63),char(2), +char(1),char(1),char(49),char(11),char(48),char(9),char(6),char(5),char(43),char(14), +char(3),char(2),char(26),char(5),char(0),char(48),char(97),char(6),char(10),char(43), +char(6),char(1),char(4),char(1),char(130),char(55),char(2),char(1),char(4),char(160), +char(83),char(48),char(81),char(48),char(44),char(6),char(10),char(43),char(6),char(1), +char(4),char(1),char(130),char(55),char(2),char(1),char(28),char(162),char(30),char(128), +char(28),char(0),char(60),char(0),char(60),char(0),char(60),char(0),char(79),char(0), +char(98),char(0),char(115),char(0),char(111),char(0),char(108),char(0),char(101),char(0), +char(116),char(0),char(101),char(0),char(62),char(0),char(62),char(0),char(62),char(48), +char(33),char(48),char(9),char(6),char(5),char(43),char(14),char(3),char(2),char(26), +char(5),char(0),char(4),char(20),char(130),char(184),char(185),char(128),char(143),char(217), +char(245),char(64),char(166),char(109),char(110),char(179),char(21),char(84),char(65),char(54), +char(153),char(222),char(211),char(125),char(160),char(130),char(17),char(93),char(48),char(130), +char(3),char(122),char(48),char(130),char(2),char(98),char(160),char(3),char(2),char(1), +char(2),char(2),char(16),char(56),char(37),char(215),char(250),char(248),char(97),char(175), +char(158),char(244),char(144),char(231),char(38),char(181),char(214),char(90),char(213),char(48), +char(13),char(6),char(9),char(42),char(134),char(72),char(134),char(247),char(13),char(1), +char(1),char(5),char(5),char(0),char(48),char(83),char(49),char(11),char(48),char(9), +char(6),char(3),char(85),char(4),char(6),char(19),char(2),char(85),char(83),char(49), +char(23),char(48),char(21),char(6),char(3),char(85),char(4),char(10),char(19),char(14), +char(86),char(101),char(114),char(105),char(83),char(105),char(103),char(110),char(44),char(32), +char(73),char(110),char(99),char(46),char(49),char(43),char(48),char(41),char(6),char(3), +char(85),char(4),char(3),char(19),char(34),char(86),char(101),char(114),char(105),char(83), +char(105),char(103),char(110),char(32),char(84),char(105),char(109),char(101),char(32),char(83), +char(116),char(97),char(109),char(112),char(105),char(110),char(103),char(32),char(83),char(101), +char(114),char(118),char(105),char(99),char(101),char(115),char(32),char(67),char(65),char(48), +char(30),char(23),char(13),char(48),char(55),char(48),char(54),char(49),char(53),char(48), +char(48),char(48),char(48),char(48),char(48),char(90),char(23),char(13),char(49),char(50), +char(48),char(54),char(49),char(52),char(50),char(51),char(53),char(57),char(53),char(57), +char(90),char(48),char(92),char(49),char(11),char(48),char(9),char(6),char(3),char(85), +char(4),char(6),char(19),char(2),char(85),char(83),char(49),char(23),char(48),char(21), +char(6),char(3),char(85),char(4),char(10),char(19),char(14),char(86),char(101),char(114), +char(105),char(83),char(105),char(103),char(110),char(44),char(32),char(73),char(110),char(99), +char(46),char(49),char(52),char(48),char(50),char(6),char(3),char(85),char(4),char(3), +char(19),char(43),char(86),char(101),char(114),char(105),char(83),char(105),char(103),char(110), +char(32),char(84),char(105),char(109),char(101),char(32),char(83),char(116),char(97),char(109), +char(112),char(105),char(110),char(103),char(32),char(83),char(101),char(114),char(118),char(105), +char(99),char(101),char(115),char(32),char(83),char(105),char(103),char(110),char(101),char(114), +char(32),char(45),char(32),char(71),char(50),char(48),char(129),char(159),char(48),char(13), +char(6),char(9),char(42),char(134),char(72),char(134),char(247),char(13),char(1),char(1), +char(1),char(5),char(0),char(3),char(129),char(141),char(0),char(48),char(129),char(137), +char(2),char(129),char(129),char(0),char(196),char(181),char(242),char(82),char(21),char(188), +char(136),char(134),char(96),char(41),char(22),char(74),char(91),char(47),char(75),char(145), +char(107),char(135),char(145),char(243),char(53),char(84),char(88),char(53),char(234),char(209), +char(54),char(94),char(98),char(77),char(82),char(81),char(52),char(113),char(194),char(123), +char(102),char(29),char(137),char(200),char(221),char(42),char(196),char(106),char(10),char(246), +char(55),char(217),char(152),char(116),char(145),char(246),char(146),char(174),char(176),char(181), +char(118),char(150),char(241),char(169),char(74),char(99),char(69),char(71),char(46),char(107), +char(11),char(146),char(78),char(75),char(43),char(140),char(238),char(88),char(74),char(139), +char(212),char(7),char(228),char(26),char(44),char(248),char(130),char(170),char(88),char(217), +char(205),char(66),char(243),char(45),char(192),char(117),char(222),char(141),char(171),char(199), +char(142),char(29),char(154),char(108),char(76),char(8),char(149),char(30),char(222),char(219), +char(239),char(103),char(225),char(114),char(194),char(73),char(194),char(158),char(96),char(60), +char(225),char(226),char(190),char(22),char(163),char(99),char(120),char(105),char(20),char(123), +char(173),char(45),char(2),char(3),char(1),char(0),char(1),char(163),char(129),char(196), +char(48),char(129),char(193),char(48),char(52),char(6),char(8),char(43),char(6),char(1), +char(5),char(5),char(7),char(1),char(1),char(4),char(40),char(48),char(38),char(48), +char(36),char(6),char(8),char(43),char(6),char(1),char(5),char(5),char(7),char(48), +char(1),char(134),char(24),char(104),char(116),char(116),char(112),char(58),char(47),char(47), +char(111),char(99),char(115),char(112),char(46),char(118),char(101),char(114),char(105),char(115), +char(105),char(103),char(110),char(46),char(99),char(111),char(109),char(48),char(12),char(6), +char(3),char(85),char(29),char(19),char(1),char(1),char(255),char(4),char(2),char(48), +char(0),char(48),char(51),char(6),char(3),char(85),char(29),char(31),char(4),char(44), +char(48),char(42),char(48),char(40),char(160),char(38),char(160),char(36),char(134),char(34), +char(104),char(116),char(116),char(112),char(58),char(47),char(47),char(99),char(114),char(108), +char(46),char(118),char(101),char(114),char(105),char(115),char(105),char(103),char(110),char(46), +char(99),char(111),char(109),char(47),char(116),char(115),char(115),char(45),char(99),char(97), +char(46),char(99),char(114),char(108),char(48),char(22),char(6),char(3),char(85),char(29), +char(37),char(1),char(1),char(255),char(4),char(12),char(48),char(10),char(6),char(8), +char(43),char(6),char(1),char(5),char(5),char(7),char(3),char(8),char(48),char(14), +char(6),char(3),char(85),char(29),char(15),char(1),char(1),char(255),char(4),char(4), +char(3),char(2),char(6),char(192),char(48),char(30),char(6),char(3),char(85),char(29), +char(17),char(4),char(23),char(48),char(21),char(164),char(19),char(48),char(17),char(49), +char(15),char(48),char(13),char(6),char(3),char(85),char(4),char(3),char(19),char(6), +char(84),char(83),char(65),char(49),char(45),char(50),char(48),char(13),char(6),char(9), +char(42),char(134),char(72),char(134),char(247),char(13),char(1),char(1),char(5),char(5), +char(0),char(3),char(130),char(1),char(1),char(0),char(80),char(197),char(75),char(200), +char(36),char(128),char(223),char(228),char(13),char(36),char(194),char(222),char(26),char(177), +char(161),char(2),char(161),char(166),char(130),char(45),char(12),char(131),char(21),char(129), +char(55),char(10),char(130),char(14),char(44),char(176),char(90),char(23),char(97),char(181), +char(216),char(5),char(254),char(136),char(219),char(241),char(145),char(145),char(179),char(86), +char(26),char(64),char(166),char(235),char(146),char(190),char(56),char(57),char(176),char(117), +char(54),char(116),char(58),char(152),char(79),char(228),char(55),char(186),char(153),char(137), +char(202),char(149),char(66),char(29),char(176),char(185),char(199),char(160),char(141),char(87), +char(224),char(250),char(213),char(100),char(4),char(66),char(53),char(78),char(1),char(209), +char(51),char(162),char(23),char(200),char(77),char(170),char(39),char(199),char(242),char(225), +char(134),char(76),char(2),char(56),char(77),char(131),char(120),char(198),char(252),char(83), +char(224),char(235),char(224),char(6),char(135),char(221),char(164),char(150),char(158),char(94), +char(12),char(152),char(226),char(165),char(190),char(191),char(130),char(133),char(195),char(96), +char(225),char(223),char(173),char(40),char(216),char(199),char(165),char(75),char(100),char(218), +char(199),char(27),char(91),char(189),char(172),char(57),char(8),char(213),char(56),char(34), +char(161),char(51),char(139),char(47),char(138),char(154),char(235),char(188),char(7),char(33), +char(63),char(68),char(65),char(9),char(7),char(181),char(101),char(28),char(36),char(188), +char(72),char(211),char(68),char(128),char(235),char(161),char(207),char(201),char(2),char(180), +char(20),char(207),char(84),char(199),char(22),char(163),char(128),char(92),char(249),char(121), +char(62),char(93),char(114),char(125),char(136),char(23),char(158),char(44),char(67),char(162), +char(202),char(83),char(206),char(125),char(61),char(246),char(42),char(58),char(184),char(79), +char(148),char(0),char(165),char(109),char(10),char(131),char(93),char(249),char(94),char(83), +char(244),char(24),char(179),char(87),char(15),char(112),char(195),char(251),char(245),char(173), +char(149),char(160),char(14),char(23),char(222),char(196),char(22),char(128),char(96),char(201), +char(15),char(43),char(110),char(134),char(4),char(241),char(235),char(244),char(120),char(39), +char(209),char(5),char(197),char(238),char(52),char(91),char(94),char(185),char(73),char(50), +char(242),char(51),char(48),char(130),char(3),char(196),char(48),char(130),char(3),char(45), +char(160),char(3),char(2),char(1),char(2),char(2),char(16),char(71),char(191),char(25), +char(149),char(223),char(141),char(82),char(70),char(67),char(247),char(219),char(109),char(72), +char(13),char(49),char(164),char(48),char(13),char(6),char(9),char(42),char(134),char(72), +char(134),char(247),char(13),char(1),char(1),char(5),char(5),char(0),char(48),char(129), +char(139),char(49),char(11),char(48),char(9),char(6),char(3),char(85),char(4),char(6), +char(19),char(2),char(90),char(65),char(49),char(21),char(48),char(19),char(6),char(3), +char(85),char(4),char(8),char(19),char(12),char(87),char(101),char(115),char(116),char(101), +char(114),char(110),char(32),char(67),char(97),char(112),char(101),char(49),char(20),char(48), +char(18),char(6),char(3),char(85),char(4),char(7),char(19),char(11),char(68),char(117), +char(114),char(98),char(97),char(110),char(118),char(105),char(108),char(108),char(101),char(49), +char(15),char(48),char(13),char(6),char(3),char(85),char(4),char(10),char(19),char(6), +char(84),char(104),char(97),char(119),char(116),char(101),char(49),char(29),char(48),char(27), +char(6),char(3),char(85),char(4),char(11),char(19),char(20),char(84),char(104),char(97), +char(119),char(116),char(101),char(32),char(67),char(101),char(114),char(116),char(105),char(102), +char(105),char(99),char(97),char(116),char(105),char(111),char(110),char(49),char(31),char(48), +char(29),char(6),char(3),char(85),char(4),char(3),char(19),char(22),char(84),char(104), +char(97),char(119),char(116),char(101),char(32),char(84),char(105),char(109),char(101),char(115), +char(116),char(97),char(109),char(112),char(105),char(110),char(103),char(32),char(67),char(65), +char(48),char(30),char(23),char(13),char(48),char(51),char(49),char(50),char(48),char(52), +char(48),char(48),char(48),char(48),char(48),char(48),char(90),char(23),char(13),char(49), +char(51),char(49),char(50),char(48),char(51),char(50),char(51),char(53),char(57),char(53), +char(57),char(90),char(48),char(83),char(49),char(11),char(48),char(9),char(6),char(3), +char(85),char(4),char(6),char(19),char(2),char(85),char(83),char(49),char(23),char(48), +char(21),char(6),char(3),char(85),char(4),char(10),char(19),char(14),char(86),char(101), +char(114),char(105),char(83),char(105),char(103),char(110),char(44),char(32),char(73),char(110), +char(99),char(46),char(49),char(43),char(48),char(41),char(6),char(3),char(85),char(4), +char(3),char(19),char(34),char(86),char(101),char(114),char(105),char(83),char(105),char(103), +char(110),char(32),char(84),char(105),char(109),char(101),char(32),char(83),char(116),char(97), +char(109),char(112),char(105),char(110),char(103),char(32),char(83),char(101),char(114),char(118), +char(105),char(99),char(101),char(115),char(32),char(67),char(65),char(48),char(130),char(1), +char(34),char(48),char(13),char(6),char(9),char(42),char(134),char(72),char(134),char(247), +char(13),char(1),char(1),char(1),char(5),char(0),char(3),char(130),char(1),char(15), +char(0),char(48),char(130),char(1),char(10),char(2),char(130),char(1),char(1),char(0), +char(169),char(202),char(178),char(164),char(204),char(205),char(32),char(175),char(10),char(125), +char(137),char(172),char(135),char(117),char(240),char(180),char(78),char(241),char(223),char(193), +char(15),char(191),char(103),char(97),char(189),char(163),char(100),char(28),char(218),char(187), +char(249),char(202),char(51),char(171),char(132),char(48),char(137),char(88),char(126),char(140), +char(219),char(107),char(221),char(54),char(158),char(15),char(191),char(209),char(236),char(120), +char(242),char(119),char(166),char(126),char(111),char(60),char(191),char(147),char(175),char(13), +char(186),char(104),char(244),char(108),char(148),char(202),char(189),char(82),char(45),char(171), +char(72),char(61),char(245),char(182),char(213),char(93),char(95),char(27),char(2),char(159), +char(250),char(47),char(107),char(30),char(164),char(247),char(163),char(154),char(166),char(26), +char(200),char(2),char(225),char(127),char(76),char(82),char(227),char(14),char(96),char(236), +char(64),char(28),char(126),char(185),char(13),char(222),char(63),char(199),char(180),char(223), +char(135),char(189),char(95),char(122),char(106),char(49),char(46),char(3),char(153),char(129), +char(19),char(168),char(71),char(32),char(206),char(49),char(115),char(13),char(87),char(45), +char(205),char(120),char(52),char(51),char(149),char(18),char(153),char(18),char(185),char(222), +char(104),char(47),char(170),char(230),char(227),char(194),char(138),char(140),char(42),char(195), +char(139),char(33),char(135),char(102),char(189),char(131),char(88),char(87),char(111),char(117), +char(191),char(60),char(170),char(38),char(135),char(93),char(202),char(16),char(21),char(60), +char(159),char(132),char(234),char(84),char(193),char(10),char(110),char(196),char(254),char(197), +char(74),char(221),char(185),char(7),char(17),char(151),char(34),char(124),char(219),char(62), +char(39),char(209),char(30),char(120),char(236),char(159),char(49),char(201),char(241),char(230), +char(34),char(25),char(219),char(196),char(179),char(71),char(67),char(154),char(26),char(95), +char(160),char(30),char(144),char(228),char(94),char(245),char(238),char(124),char(241),char(125), +char(171),char(98),char(1),char(143),char(245),char(77),char(11),char(222),char(208),char(34), +char(86),char(168),char(149),char(205),char(174),char(136),char(118),char(174),char(238),char(186), +char(13),char(243),char(228),char(77),char(217),char(160),char(251),char(104),char(160),char(174), +char(20),char(59),char(179),char(135),char(193),char(187),char(2),char(3),char(1),char(0), +char(1),char(163),char(129),char(219),char(48),char(129),char(216),char(48),char(52),char(6), +char(8),char(43),char(6),char(1),char(5),char(5),char(7),char(1),char(1),char(4), +char(40),char(48),char(38),char(48),char(36),char(6),char(8),char(43),char(6),char(1), +char(5),char(5),char(7),char(48),char(1),char(134),char(24),char(104),char(116),char(116), +char(112),char(58),char(47),char(47),char(111),char(99),char(115),char(112),char(46),char(118), +char(101),char(114),char(105),char(115),char(105),char(103),char(110),char(46),char(99),char(111), +char(109),char(48),char(18),char(6),char(3),char(85),char(29),char(19),char(1),char(1), +char(255),char(4),char(8),char(48),char(6),char(1),char(1),char(255),char(2),char(1), +char(0),char(48),char(65),char(6),char(3),char(85),char(29),char(31),char(4),char(58), +char(48),char(56),char(48),char(54),char(160),char(52),char(160),char(50),char(134),char(48), +char(104),char(116),char(116),char(112),char(58),char(47),char(47),char(99),char(114),char(108), +char(46),char(118),char(101),char(114),char(105),char(115),char(105),char(103),char(110),char(46), +char(99),char(111),char(109),char(47),char(84),char(104),char(97),char(119),char(116),char(101), +char(84),char(105),char(109),char(101),char(115),char(116),char(97),char(109),char(112),char(105), +char(110),char(103),char(67),char(65),char(46),char(99),char(114),char(108),char(48),char(19), +char(6),char(3),char(85),char(29),char(37),char(4),char(12),char(48),char(10),char(6), +char(8),char(43),char(6),char(1),char(5),char(5),char(7),char(3),char(8),char(48), +char(14),char(6),char(3),char(85),char(29),char(15),char(1),char(1),char(255),char(4), +char(4),char(3),char(2),char(1),char(6),char(48),char(36),char(6),char(3),char(85), +char(29),char(17),char(4),char(29),char(48),char(27),char(164),char(25),char(48),char(23), +char(49),char(21),char(48),char(19),char(6),char(3),char(85),char(4),char(3),char(19), +char(12),char(84),char(83),char(65),char(50),char(48),char(52),char(56),char(45),char(49), +char(45),char(53),char(51),char(48),char(13),char(6),char(9),char(42),char(134),char(72), +char(134),char(247),char(13),char(1),char(1),char(5),char(5),char(0),char(3),char(129), +char(129),char(0),char(74),char(107),char(249),char(234),char(88),char(194),char(68),char(28), +char(49),char(137),char(121),char(153),char(43),char(150),char(191),char(130),char(172),char(1), +char(214),char(28),char(76),char(205),char(176),char(138),char(88),char(110),char(223),char(8), +char(41),char(163),char(94),char(200),char(202),char(147),char(19),char(231),char(4),char(82), +char(13),char(239),char(71),char(39),char(47),char(0),char(56),char(176),char(228),char(201), +char(147),char(78),char(154),char(212),char(34),char(98),char(21),char(247),char(63),char(55), +char(33),char(79),char(112),char(49),char(128),char(241),char(139),char(56),char(135),char(179), +char(232),char(232),char(151),char(0),char(254),char(207),char(85),char(150),char(78),char(36), +char(210),char(169),char(39),char(78),char(122),char(174),char(183),char(97),char(65),char(243), +char(42),char(206),char(231),char(201),char(217),char(94),char(221),char(187),char(43),char(133), +char(62),char(181),char(157),char(181),char(217),char(225),char(87),char(255),char(190),char(180), +char(197),char(126),char(245),char(207),char(12),char(158),char(240),char(151),char(254),char(43), +char(211),char(59),char(82),char(27),char(27),char(56),char(39),char(247),char(63),char(74), +char(48),char(130),char(4),char(252),char(48),char(130),char(4),char(101),char(160),char(3), +char(2),char(1),char(2),char(2),char(16),char(101),char(82),char(38),char(225),char(178), +char(46),char(24),char(225),char(89),char(15),char(41),char(133),char(172),char(34),char(231), +char(92),char(48),char(13),char(6),char(9),char(42),char(134),char(72),char(134),char(247), +char(13),char(1),char(1),char(5),char(5),char(0),char(48),char(95),char(49),char(11), +char(48),char(9),char(6),char(3),char(85),char(4),char(6),char(19),char(2),char(85), +char(83),char(49),char(23),char(48),char(21),char(6),char(3),char(85),char(4),char(10), +char(19),char(14),char(86),char(101),char(114),char(105),char(83),char(105),char(103),char(110), +char(44),char(32),char(73),char(110),char(99),char(46),char(49),char(55),char(48),char(53), +char(6),char(3),char(85),char(4),char(11),char(19),char(46),char(67),char(108),char(97), +char(115),char(115),char(32),char(51),char(32),char(80),char(117),char(98),char(108),char(105), +char(99),char(32),char(80),char(114),char(105),char(109),char(97),char(114),char(121),char(32), +char(67),char(101),char(114),char(116),char(105),char(102),char(105),char(99),char(97),char(116), +char(105),char(111),char(110),char(32),char(65),char(117),char(116),char(104),char(111),char(114), +char(105),char(116),char(121),char(48),char(30),char(23),char(13),char(48),char(57),char(48), +char(53),char(50),char(49),char(48),char(48),char(48),char(48),char(48),char(48),char(90), +char(23),char(13),char(49),char(57),char(48),char(53),char(50),char(48),char(50),char(51), +char(53),char(57),char(53),char(57),char(90),char(48),char(129),char(182),char(49),char(11), +char(48),char(9),char(6),char(3),char(85),char(4),char(6),char(19),char(2),char(85), +char(83),char(49),char(23),char(48),char(21),char(6),char(3),char(85),char(4),char(10), +char(19),char(14),char(86),char(101),char(114),char(105),char(83),char(105),char(103),char(110), +char(44),char(32),char(73),char(110),char(99),char(46),char(49),char(31),char(48),char(29), +char(6),char(3),char(85),char(4),char(11),char(19),char(22),char(86),char(101),char(114), +char(105),char(83),char(105),char(103),char(110),char(32),char(84),char(114),char(117),char(115), +char(116),char(32),char(78),char(101),char(116),char(119),char(111),char(114),char(107),char(49), +char(59),char(48),char(57),char(6),char(3),char(85),char(4),char(11),char(19),char(50), +char(84),char(101),char(114),char(109),char(115),char(32),char(111),char(102),char(32),char(117), +char(115),char(101),char(32),char(97),char(116),char(32),char(104),char(116),char(116),char(112), +char(115),char(58),char(47),char(47),char(119),char(119),char(119),char(46),char(118),char(101), +char(114),char(105),char(115),char(105),char(103),char(110),char(46),char(99),char(111),char(109), +char(47),char(114),char(112),char(97),char(32),char(40),char(99),char(41),char(48),char(57), +char(49),char(48),char(48),char(46),char(6),char(3),char(85),char(4),char(3),char(19), +char(39),char(86),char(101),char(114),char(105),char(83),char(105),char(103),char(110),char(32), +char(67),char(108),char(97),char(115),char(115),char(32),char(51),char(32),char(67),char(111), +char(100),char(101),char(32),char(83),char(105),char(103),char(110),char(105),char(110),char(103), +char(32),char(50),char(48),char(48),char(57),char(45),char(50),char(32),char(67),char(65), +char(48),char(130),char(1),char(34),char(48),char(13),char(6),char(9),char(42),char(134), +char(72),char(134),char(247),char(13),char(1),char(1),char(1),char(5),char(0),char(3), +char(130),char(1),char(15),char(0),char(48),char(130),char(1),char(10),char(2),char(130), +char(1),char(1),char(0),char(190),char(103),char(29),char(180),char(96),char(170),char(16), +char(73),char(111),char(86),char(23),char(124),char(102),char(201),char(94),char(134),char(13), +char(213),char(241),char(172),char(167),char(113),char(131),char(142),char(139),char(137),char(248), +char(136),char(4),char(137),char(21),char(6),char(186),char(45),char(132),char(33),char(149), +char(228),char(209),char(156),char(80),char(76),char(251),char(210),char(34),char(189),char(218), +char(242),char(178),char(53),char(59),char(30),char(143),char(195),char(9),char(251),char(252), +char(19),char(46),char(90),char(191),char(137),char(124),char(61),char(59),char(37),char(30), +char(246),char(243),char(88),char(123),char(156),char(244),char(1),char(181),char(198),char(10), +char(184),char(128),char(206),char(190),char(39),char(116),char(97),char(103),char(39),char(77), +char(106),char(229),char(236),char(129),char(97),char(88),char(121),char(163),char(224),char(23), +char(16),char(18),char(21),char(39),char(176),char(225),char(77),char(52),char(127),char(43), +char(71),char(32),char(68),char(185),char(222),char(102),char(36),char(102),char(138),char(205), +char(79),char(186),char(31),char(197),char(56),char(200),char(84),char(144),char(225),char(114), +char(246),char(25),char(102),char(117),char(106),char(185),char(73),char(104),char(207),char(56), +char(121),char(13),char(170),char(48),char(168),char(219),char(44),char(96),char(72),char(158), +char(215),char(170),char(20),char(1),char(169),char(131),char(215),char(56),char(145),char(48), +char(57),char(19),char(150),char(3),char(58),char(124),char(64),char(84),char(182),char(173), +char(224),char(47),char(27),char(131),char(220),char(168),char(17),char(82),char(62),char(2), +char(179),char(215),char(43),char(253),char(33),char(182),char(167),char(92),char(163),char(15), +char(11),char(169),char(166),char(16),char(80),char(14),char(52),char(46),char(77),char(167), +char(206),char(201),char(94),char(37),char(212),char(140),char(188),char(243),char(110),char(124), +char(41),char(188),char(1),char(93),char(252),char(49),char(135),char(90),char(213),char(140), +char(133),char(103),char(88),char(136),char(25),char(160),char(191),char(53),char(240),char(234), +char(43),char(163),char(33),char(231),char(144),char(246),char(131),char(229),char(168),char(237), +char(96),char(120),char(94),char(123),char(96),char(131),char(253),char(87),char(11),char(93), +char(65),char(13),char(99),char(84),char(96),char(214),char(67),char(33),char(239),char(2), +char(3),char(1),char(0),char(1),char(163),char(130),char(1),char(219),char(48),char(130), +char(1),char(215),char(48),char(18),char(6),char(3),char(85),char(29),char(19),char(1), +char(1),char(255),char(4),char(8),char(48),char(6),char(1),char(1),char(255),char(2), +char(1),char(0),char(48),char(112),char(6),char(3),char(85),char(29),char(32),char(4), +char(105),char(48),char(103),char(48),char(101),char(6),char(11),char(96),char(134),char(72), +char(1),char(134),char(248),char(69),char(1),char(7),char(23),char(3),char(48),char(86), +char(48),char(40),char(6),char(8),char(43),char(6),char(1),char(5),char(5),char(7), +char(2),char(1),char(22),char(28),char(104),char(116),char(116),char(112),char(115),char(58), +char(47),char(47),char(119),char(119),char(119),char(46),char(118),char(101),char(114),char(105), +char(115),char(105),char(103),char(110),char(46),char(99),char(111),char(109),char(47),char(99), +char(112),char(115),char(48),char(42),char(6),char(8),char(43),char(6),char(1),char(5), +char(5),char(7),char(2),char(2),char(48),char(30),char(26),char(28),char(104),char(116), +char(116),char(112),char(115),char(58),char(47),char(47),char(119),char(119),char(119),char(46), +char(118),char(101),char(114),char(105),char(115),char(105),char(103),char(110),char(46),char(99), +char(111),char(109),char(47),char(114),char(112),char(97),char(48),char(14),char(6),char(3), +char(85),char(29),char(15),char(1),char(1),char(255),char(4),char(4),char(3),char(2), +char(1),char(6),char(48),char(109),char(6),char(8),char(43),char(6),char(1),char(5), +char(5),char(7),char(1),char(12),char(4),char(97),char(48),char(95),char(161),char(93), +char(160),char(91),char(48),char(89),char(48),char(87),char(48),char(85),char(22),char(9), +char(105),char(109),char(97),char(103),char(101),char(47),char(103),char(105),char(102),char(48), +char(33),char(48),char(31),char(48),char(7),char(6),char(5),char(43),char(14),char(3), +char(2),char(26),char(4),char(20),char(143),char(229),char(211),char(26),char(134),char(172), +char(141),char(142),char(107),char(195),char(207),char(128),char(106),char(212),char(72),char(24), +char(44),char(123),char(25),char(46),char(48),char(37),char(22),char(35),char(104),char(116), +char(116),char(112),char(58),char(47),char(47),char(108),char(111),char(103),char(111),char(46), +char(118),char(101),char(114),char(105),char(115),char(105),char(103),char(110),char(46),char(99), +char(111),char(109),char(47),char(118),char(115),char(108),char(111),char(103),char(111),char(46), +char(103),char(105),char(102),char(48),char(29),char(6),char(3),char(85),char(29),char(37), +char(4),char(22),char(48),char(20),char(6),char(8),char(43),char(6),char(1),char(5), +char(5),char(7),char(3),char(2),char(6),char(8),char(43),char(6),char(1),char(5), +char(5),char(7),char(3),char(3),char(48),char(52),char(6),char(8),char(43),char(6), +char(1),char(5),char(5),char(7),char(1),char(1),char(4),char(40),char(48),char(38), +char(48),char(36),char(6),char(8),char(43),char(6),char(1),char(5),char(5),char(7), +char(48),char(1),char(134),char(24),char(104),char(116),char(116),char(112),char(58),char(47), +char(47),char(111),char(99),char(115),char(112),char(46),char(118),char(101),char(114),char(105), +char(115),char(105),char(103),char(110),char(46),char(99),char(111),char(109),char(48),char(49), +char(6),char(3),char(85),char(29),char(31),char(4),char(42),char(48),char(40),char(48), +char(38),char(160),char(36),char(160),char(34),char(134),char(32),char(104),char(116),char(116), +char(112),char(58),char(47),char(47),char(99),char(114),char(108),char(46),char(118),char(101), +char(114),char(105),char(115),char(105),char(103),char(110),char(46),char(99),char(111),char(109), +char(47),char(112),char(99),char(97),char(51),char(46),char(99),char(114),char(108),char(48), +char(41),char(6),char(3),char(85),char(29),char(17),char(4),char(34),char(48),char(32), +char(164),char(30),char(48),char(28),char(49),char(26),char(48),char(24),char(6),char(3), +char(85),char(4),char(3),char(19),char(17),char(67),char(108),char(97),char(115),char(115), +char(51),char(67),char(65),char(50),char(48),char(52),char(56),char(45),char(49),char(45), +char(53),char(53),char(48),char(29),char(6),char(3),char(85),char(29),char(14),char(4), +char(22),char(4),char(20),char(151),char(208),char(107),char(168),char(38),char(112),char(200), +char(161),char(63),char(148),char(31),char(8),char(45),char(196),char(53),char(155),char(164), +char(161),char(30),char(242),char(48),char(13),char(6),char(9),char(42),char(134),char(72), +char(134),char(247),char(13),char(1),char(1),char(5),char(5),char(0),char(3),char(129), +char(129),char(0),char(139),char(3),char(192),char(221),char(148),char(216),char(65),char(162), +char(97),char(105),char(176),char(21),char(168),char(120),char(199),char(48),char(198),char(144), +char(60),char(126),char(66),char(247),char(36),char(182),char(228),char(131),char(115),char(23), +char(4),char(127),char(4),char(16),char(156),char(161),char(226),char(250),char(129),char(47), +char(235),char(192),char(202),char(68),char(231),char(114),char(224),char(80),char(182),char(85), +char(16),char(32),char(131),char(110),char(150),char(146),char(228),char(154),char(81),char(106), +char(180),char(55),char(49),char(220),char(165),char(45),char(235),char(140),char(0),char(199), +char(29),char(79),char(231),char(77),char(50),char(186),char(133),char(248),char(78),char(190), +char(250),char(103),char(85),char(101),char(240),char(106),char(190),char(122),char(202),char(100), +char(56),char(26),char(16),char(16),char(120),char(69),char(118),char(49),char(243),char(134), +char(122),char(3),char(15),char(96),char(194),char(179),char(93),char(157),char(246),char(139), +char(102),char(118),char(130),char(27),char(89),char(225),char(131),char(229),char(189),char(73), +char(165),char(56),char(86),char(229),char(222),char(65),char(119),char(14),char(88),char(15), +char(48),char(130),char(5),char(19),char(48),char(130),char(3),char(251),char(160),char(3), +char(2),char(1),char(2),char(2),char(16),char(102),char(227),char(240),char(103),char(121), +char(202),char(21),char(22),char(109),char(80),char(83),char(111),char(136),char(25),char(26), +char(131),char(48),char(13),char(6),char(9),char(42),char(134),char(72),char(134),char(247), +char(13),char(1),char(1),char(5),char(5),char(0),char(48),char(129),char(182),char(49), +char(11),char(48),char(9),char(6),char(3),char(85),char(4),char(6),char(19),char(2), +char(85),char(83),char(49),char(23),char(48),char(21),char(6),char(3),char(85),char(4), +char(10),char(19),char(14),char(86),char(101),char(114),char(105),char(83),char(105),char(103), +char(110),char(44),char(32),char(73),char(110),char(99),char(46),char(49),char(31),char(48), +char(29),char(6),char(3),char(85),char(4),char(11),char(19),char(22),char(86),char(101), +char(114),char(105),char(83),char(105),char(103),char(110),char(32),char(84),char(114),char(117), +char(115),char(116),char(32),char(78),char(101),char(116),char(119),char(111),char(114),char(107), +char(49),char(59),char(48),char(57),char(6),char(3),char(85),char(4),char(11),char(19), +char(50),char(84),char(101),char(114),char(109),char(115),char(32),char(111),char(102),char(32), +char(117),char(115),char(101),char(32),char(97),char(116),char(32),char(104),char(116),char(116), +char(112),char(115),char(58),char(47),char(47),char(119),char(119),char(119),char(46),char(118), +char(101),char(114),char(105),char(115),char(105),char(103),char(110),char(46),char(99),char(111), +char(109),char(47),char(114),char(112),char(97),char(32),char(40),char(99),char(41),char(48), +char(57),char(49),char(48),char(48),char(46),char(6),char(3),char(85),char(4),char(3), +char(19),char(39),char(86),char(101),char(114),char(105),char(83),char(105),char(103),char(110), +char(32),char(67),char(108),char(97),char(115),char(115),char(32),char(51),char(32),char(67), +char(111),char(100),char(101),char(32),char(83),char(105),char(103),char(110),char(105),char(110), +char(103),char(32),char(50),char(48),char(48),char(57),char(45),char(50),char(32),char(67), +char(65),char(48),char(30),char(23),char(13),char(49),char(48),char(48),char(55),char(50), +char(57),char(48),char(48),char(48),char(48),char(48),char(48),char(90),char(23),char(13), +char(49),char(50),char(48),char(56),char(48),char(56),char(50),char(51),char(53),char(57), +char(53),char(57),char(90),char(48),char(129),char(208),char(49),char(11),char(48),char(9), +char(6),char(3),char(85),char(4),char(6),char(19),char(2),char(85),char(83),char(49), +char(22),char(48),char(20),char(6),char(3),char(85),char(4),char(8),char(19),char(13), +char(77),char(97),char(115),char(115),char(97),char(99),char(104),char(117),char(115),char(101), +char(116),char(116),char(115),char(49),char(15),char(48),char(13),char(6),char(3),char(85), +char(4),char(7),char(19),char(6),char(87),char(111),char(98),char(117),char(114),char(110), +char(49),char(30),char(48),char(28),char(6),char(3),char(85),char(4),char(10),char(20), +char(21),char(77),char(111),char(110),char(111),char(116),char(121),char(112),char(101),char(32), +char(73),char(109),char(97),char(103),char(105),char(110),char(103),char(32),char(73),char(110), +char(99),char(46),char(49),char(62),char(48),char(60),char(6),char(3),char(85),char(4), +char(11),char(19),char(53),char(68),char(105),char(103),char(105),char(116),char(97),char(108), +char(32),char(73),char(68),char(32),char(67),char(108),char(97),char(115),char(115),char(32), +char(51),char(32),char(45),char(32),char(77),char(105),char(99),char(114),char(111),char(115), +char(111),char(102),char(116),char(32),char(83),char(111),char(102),char(116),char(119),char(97), +char(114),char(101),char(32),char(86),char(97),char(108),char(105),char(100),char(97),char(116), +char(105),char(111),char(110),char(32),char(118),char(50),char(49),char(24),char(48),char(22), +char(6),char(3),char(85),char(4),char(11),char(20),char(15),char(84),char(121),char(112), +char(101),char(32),char(79),char(112),char(101),char(114),char(97),char(116),char(105),char(111), +char(110),char(115),char(49),char(30),char(48),char(28),char(6),char(3),char(85),char(4), +char(3),char(20),char(21),char(77),char(111),char(110),char(111),char(116),char(121),char(112), +char(101),char(32),char(73),char(109),char(97),char(103),char(105),char(110),char(103),char(32), +char(73),char(110),char(99),char(46),char(48),char(129),char(159),char(48),char(13),char(6), +char(9),char(42),char(134),char(72),char(134),char(247),char(13),char(1),char(1),char(1), +char(5),char(0),char(3),char(129),char(141),char(0),char(48),char(129),char(137),char(2), +char(129),char(129),char(0),char(148),char(68),char(160),char(149),char(105),char(124),char(85), +char(13),char(208),char(219),char(22),char(141),char(50),char(53),char(138),char(76),char(51), +char(171),char(94),char(32),char(161),char(76),char(215),char(42),char(135),char(56),char(215), +char(152),char(165),char(64),char(240),char(25),char(73),char(11),char(34),char(30),char(83), +char(79),char(194),char(67),char(166),char(202),char(139),char(169),char(86),char(239),char(110), +char(72),char(6),char(168),char(5),char(21),char(57),char(30),char(99),char(59),char(36), +char(18),char(144),char(185),char(152),char(207),char(202),char(8),char(53),char(125),char(114), +char(227),char(71),char(87),char(253),char(121),char(203),char(138),char(74),char(231),char(64), +char(112),char(45),char(53),char(99),char(127),char(174),char(128),char(207),char(196),char(175), +char(216),char(251),char(247),char(201),char(252),char(137),char(216),char(215),char(164),char(160), +char(219),char(9),char(242),char(162),char(242),char(123),char(239),char(205),char(117),char(193), +char(247),char(101),char(80),char(100),char(34),char(157),char(189),char(125),char(188),char(173), +char(184),char(75),char(204),char(88),char(69),char(14),char(77),char(209),char(89),char(76), +char(77),char(2),char(3),char(1),char(0),char(1),char(163),char(130),char(1),char(131), +char(48),char(130),char(1),char(127),char(48),char(9),char(6),char(3),char(85),char(29), +char(19),char(4),char(2),char(48),char(0),char(48),char(14),char(6),char(3),char(85), +char(29),char(15),char(1),char(1),char(255),char(4),char(4),char(3),char(2),char(7), +char(128),char(48),char(68),char(6),char(3),char(85),char(29),char(31),char(4),char(61), +char(48),char(59),char(48),char(57),char(160),char(55),char(160),char(53),char(134),char(51), +char(104),char(116),char(116),char(112),char(58),char(47),char(47),char(99),char(115),char(99), +char(51),char(45),char(50),char(48),char(48),char(57),char(45),char(50),char(45),char(99), +char(114),char(108),char(46),char(118),char(101),char(114),char(105),char(115),char(105),char(103), +char(110),char(46),char(99),char(111),char(109),char(47),char(67),char(83),char(67),char(51), +char(45),char(50),char(48),char(48),char(57),char(45),char(50),char(46),char(99),char(114), +char(108),char(48),char(68),char(6),char(3),char(85),char(29),char(32),char(4),char(61), +char(48),char(59),char(48),char(57),char(6),char(11),char(96),char(134),char(72),char(1), +char(134),char(248),char(69),char(1),char(7),char(23),char(3),char(48),char(42),char(48), +char(40),char(6),char(8),char(43),char(6),char(1),char(5),char(5),char(7),char(2), +char(1),char(22),char(28),char(104),char(116),char(116),char(112),char(115),char(58),char(47), +char(47),char(119),char(119),char(119),char(46),char(118),char(101),char(114),char(105),char(115), +char(105),char(103),char(110),char(46),char(99),char(111),char(109),char(47),char(114),char(112), +char(97),char(48),char(19),char(6),char(3),char(85),char(29),char(37),char(4),char(12), +char(48),char(10),char(6),char(8),char(43),char(6),char(1),char(5),char(5),char(7), +char(3),char(3),char(48),char(117),char(6),char(8),char(43),char(6),char(1),char(5), +char(5),char(7),char(1),char(1),char(4),char(105),char(48),char(103),char(48),char(36), +char(6),char(8),char(43),char(6),char(1),char(5),char(5),char(7),char(48),char(1), +char(134),char(24),char(104),char(116),char(116),char(112),char(58),char(47),char(47),char(111), +char(99),char(115),char(112),char(46),char(118),char(101),char(114),char(105),char(115),char(105), +char(103),char(110),char(46),char(99),char(111),char(109),char(48),char(63),char(6),char(8), +char(43),char(6),char(1),char(5),char(5),char(7),char(48),char(2),char(134),char(51), +char(104),char(116),char(116),char(112),char(58),char(47),char(47),char(99),char(115),char(99), +char(51),char(45),char(50),char(48),char(48),char(57),char(45),char(50),char(45),char(97), +char(105),char(97),char(46),char(118),char(101),char(114),char(105),char(115),char(105),char(103), +char(110),char(46),char(99),char(111),char(109),char(47),char(67),char(83),char(67),char(51), +char(45),char(50),char(48),char(48),char(57),char(45),char(50),char(46),char(99),char(101), +char(114),char(48),char(31),char(6),char(3),char(85),char(29),char(35),char(4),char(24), +char(48),char(22),char(128),char(20),char(151),char(208),char(107),char(168),char(38),char(112), +char(200),char(161),char(63),char(148),char(31),char(8),char(45),char(196),char(53),char(155), +char(164),char(161),char(30),char(242),char(48),char(17),char(6),char(9),char(96),char(134), +char(72),char(1),char(134),char(248),char(66),char(1),char(1),char(4),char(4),char(3), +char(2),char(4),char(16),char(48),char(22),char(6),char(10),char(43),char(6),char(1), +char(4),char(1),char(130),char(55),char(2),char(1),char(27),char(4),char(8),char(48), +char(6),char(1),char(1),char(0),char(1),char(1),char(255),char(48),char(13),char(6), +char(9),char(42),char(134),char(72),char(134),char(247),char(13),char(1),char(1),char(5), +char(5),char(0),char(3),char(130),char(1),char(1),char(0),char(78),char(230),char(34), +char(135),char(223),char(103),char(65),char(21),char(23),char(226),char(210),char(238),char(126), +char(14),char(206),char(194),char(153),char(214),char(99),char(189),char(240),char(181),char(147), +char(229),char(106),char(114),char(98),char(225),char(245),char(210),char(60),char(56),char(238), +char(168),char(61),char(8),char(95),char(186),char(71),char(129),char(130),char(95),char(91), +char(75),char(73),char(244),char(29),char(32),char(250),char(15),char(147),char(9),char(208), +char(29),char(25),char(86),char(68),char(23),char(162),char(136),char(243),char(251),char(141), +char(157),char(174),char(247),char(13),char(53),char(222),char(60),char(12),char(172),char(68), +char(148),char(96),char(69),char(42),char(155),char(254),char(155),char(111),char(76),char(59), +char(177),char(52),char(103),char(112),char(16),char(134),char(255),char(90),char(57),char(92), +char(90),char(227),char(108),char(130),char(171),char(53),char(124),char(101),char(75),char(253), +char(152),char(109),char(181),char(21),char(148),char(73),char(156),char(136),char(112),char(16), +char(190),char(61),char(177),char(98),char(149),char(180),char(219),char(180),char(212),char(218), +char(232),char(157),char(65),char(144),char(126),char(254),char(125),char(185),char(164),char(146), +char(235),char(110),char(242),char(34),char(138),char(198),char(119),char(54),char(77),char(138), +char(90),char(11),char(83),char(5),char(49),char(211),char(43),char(40),char(175),char(82), +char(225),char(141),char(122),char(107),char(181),char(119),char(68),char(189),char(12),char(173), +char(244),char(93),char(37),char(44),char(227),char(205),char(138),char(48),char(62),char(75), +char(3),char(156),char(121),char(202),char(166),char(78),char(174),char(11),char(194),char(204), +char(36),char(7),char(11),char(193),char(148),char(130),char(246),char(16),char(241),char(186), +char(144),char(182),char(155),char(154),char(216),char(92),char(60),char(19),char(241),char(234), +char(2),char(6),char(24),char(39),char(77),char(60),char(137),char(111),char(51),char(138), +char(211),char(134),char(222),char(233),char(88),char(51),char(117),char(61),char(235),char(147), +char(105),char(226),char(68),char(111),char(78),char(0),char(108),char(207),char(213),char(133), +char(218),char(86),char(166),char(154),char(166),char(63),char(203),char(76),char(33),char(104), +char(144),char(242),char(96),char(186),char(225),char(232),char(6),char(93),char(57),char(33), +char(19),char(50),char(237),char(49),char(130),char(3),char(103),char(48),char(130),char(3), +char(99),char(2),char(1),char(1),char(48),char(129),char(203),char(48),char(129),char(182), +char(49),char(11),char(48),char(9),char(6),char(3),char(85),char(4),char(6),char(19), +char(2),char(85),char(83),char(49),char(23),char(48),char(21),char(6),char(3),char(85), +char(4),char(10),char(19),char(14),char(86),char(101),char(114),char(105),char(83),char(105), +char(103),char(110),char(44),char(32),char(73),char(110),char(99),char(46),char(49),char(31), +char(48),char(29),char(6),char(3),char(85),char(4),char(11),char(19),char(22),char(86), +char(101),char(114),char(105),char(83),char(105),char(103),char(110),char(32),char(84),char(114), +char(117),char(115),char(116),char(32),char(78),char(101),char(116),char(119),char(111),char(114), +char(107),char(49),char(59),char(48),char(57),char(6),char(3),char(85),char(4),char(11), +char(19),char(50),char(84),char(101),char(114),char(109),char(115),char(32),char(111),char(102), +char(32),char(117),char(115),char(101),char(32),char(97),char(116),char(32),char(104),char(116), +char(116),char(112),char(115),char(58),char(47),char(47),char(119),char(119),char(119),char(46), +char(118),char(101),char(114),char(105),char(115),char(105),char(103),char(110),char(46),char(99), +char(111),char(109),char(47),char(114),char(112),char(97),char(32),char(40),char(99),char(41), +char(48),char(57),char(49),char(48),char(48),char(46),char(6),char(3),char(85),char(4), +char(3),char(19),char(39),char(86),char(101),char(114),char(105),char(83),char(105),char(103), +char(110),char(32),char(67),char(108),char(97),char(115),char(115),char(32),char(51),char(32), +char(67),char(111),char(100),char(101),char(32),char(83),char(105),char(103),char(110),char(105), +char(110),char(103),char(32),char(50),char(48),char(48),char(57),char(45),char(50),char(32), +char(67),char(65),char(2),char(16),char(102),char(227),char(240),char(103),char(121),char(202), +char(21),char(22),char(109),char(80),char(83),char(111),char(136),char(25),char(26),char(131), +char(48),char(9),char(6),char(5),char(43),char(14),char(3),char(2),char(26),char(5), +char(0),char(160),char(112),char(48),char(16),char(6),char(10),char(43),char(6),char(1), +char(4),char(1),char(130),char(55),char(2),char(1),char(12),char(49),char(2),char(48), +char(0),char(48),char(25),char(6),char(9),char(42),char(134),char(72),char(134),char(247), +char(13),char(1),char(9),char(3),char(49),char(12),char(6),char(10),char(43),char(6), +char(1),char(4),char(1),char(130),char(55),char(2),char(1),char(4),char(48),char(28), +char(6),char(10),char(43),char(6),char(1),char(4),char(1),char(130),char(55),char(2), +char(1),char(11),char(49),char(14),char(48),char(12),char(6),char(10),char(43),char(6), +char(1),char(4),char(1),char(130),char(55),char(2),char(1),char(21),char(48),char(35), +char(6),char(9),char(42),char(134),char(72),char(134),char(247),char(13),char(1),char(9), +char(4),char(49),char(22),char(4),char(20),char(72),char(227),char(234),char(219),char(23), +char(99),char(143),char(198),char(177),char(21),char(87),char(39),char(32),char(183),char(101), +char(244),char(25),char(83),char(149),char(24),char(48),char(13),char(6),char(9),char(42), +char(134),char(72),char(134),char(247),char(13),char(1),char(1),char(1),char(5),char(0), +char(4),char(129),char(128),char(69),char(59),char(188),char(212),char(186),char(239),char(218), +char(27),char(191),char(98),char(59),char(222),char(18),char(236),char(74),char(6),char(132), +char(69),char(113),char(65),char(201),char(2),char(254),char(46),char(14),char(149),char(243), +char(137),char(177),char(82),char(244),char(65),char(235),char(109),char(50),char(44),char(72), +char(191),char(41),char(145),char(188),char(178),char(47),char(93),char(100),char(36),char(52), +char(46),char(186),char(150),char(180),char(182),char(74),char(115),char(151),char(224),char(246), +char(159),char(65),char(247),char(247),char(104),char(182),char(245),char(128),char(6),char(120), +char(65),char(190),char(83),char(144),char(192),char(126),char(120),char(82),char(91),char(28), +char(170),char(14),char(33),char(66),char(220),char(190),char(9),char(156),char(51),char(211), +char(70),char(80),char(144),char(59),char(5),char(153),char(16),char(43),char(89),char(105), +char(236),char(133),char(216),char(99),char(209),char(45),char(195),char(6),char(150),char(52), +char(237),char(20),char(163),char(156),char(242),char(241),char(84),char(64),char(213),char(71), +char(23),char(160),char(11),char(0),char(31),char(140),char(102),char(239),char(222),char(62), +char(27),char(161),char(130),char(1),char(127),char(48),char(130),char(1),char(123),char(6), +char(9),char(42),char(134),char(72),char(134),char(247),char(13),char(1),char(9),char(6), +char(49),char(130),char(1),char(108),char(48),char(130),char(1),char(104),char(2),char(1), +char(1),char(48),char(103),char(48),char(83),char(49),char(11),char(48),char(9),char(6), +char(3),char(85),char(4),char(6),char(19),char(2),char(85),char(83),char(49),char(23), +char(48),char(21),char(6),char(3),char(85),char(4),char(10),char(19),char(14),char(86), +char(101),char(114),char(105),char(83),char(105),char(103),char(110),char(44),char(32),char(73), +char(110),char(99),char(46),char(49),char(43),char(48),char(41),char(6),char(3),char(85), +char(4),char(3),char(19),char(34),char(86),char(101),char(114),char(105),char(83),char(105), +char(103),char(110),char(32),char(84),char(105),char(109),char(101),char(32),char(83),char(116), +char(97),char(109),char(112),char(105),char(110),char(103),char(32),char(83),char(101),char(114), +char(118),char(105),char(99),char(101),char(115),char(32),char(67),char(65),char(2),char(16), +char(56),char(37),char(215),char(250),char(248),char(97),char(175),char(158),char(244),char(144), +char(231),char(38),char(181),char(214),char(90),char(213),char(48),char(9),char(6),char(5), +char(43),char(14),char(3),char(2),char(26),char(5),char(0),char(160),char(93),char(48), +char(24),char(6),char(9),char(42),char(134),char(72),char(134),char(247),char(13),char(1), +char(9),char(3),char(49),char(11),char(6),char(9),char(42),char(134),char(72),char(134), +char(247),char(13),char(1),char(7),char(1),char(48),char(28),char(6),char(9),char(42), +char(134),char(72),char(134),char(247),char(13),char(1),char(9),char(5),char(49),char(15), +char(23),char(13),char(49),char(49),char(48),char(53),char(48),char(53),char(49),char(54), +char(53),char(53),char(49),char(48),char(90),char(48),char(35),char(6),char(9),char(42), +char(134),char(72),char(134),char(247),char(13),char(1),char(9),char(4),char(49),char(22), +char(4),char(20),char(84),char(23),char(8),char(43),char(11),char(189),char(238),char(26), +char(39),char(14),char(31),char(141),char(252),char(83),char(147),char(244),char(56),char(86), +char(16),char(15),char(48),char(13),char(6),char(9),char(42),char(134),char(72),char(134), +char(247),char(13),char(1),char(1),char(1),char(5),char(0),char(4),char(129),char(128), +char(29),char(193),char(119),char(137),char(174),char(155),char(111),char(34),char(227),char(107), +char(229),char(69),char(218),char(78),char(145),char(64),char(240),char(159),char(239),char(59), +char(31),char(39),char(74),char(86),char(172),char(58),char(253),char(168),char(148),char(106), +char(124),char(247),char(156),char(193),char(127),char(123),char(147),char(96),char(78),char(27), +char(196),char(43),char(87),char(149),char(148),char(203),char(22),char(225),char(154),char(103), +char(51),char(209),char(43),char(41),char(19),char(200),char(236),char(190),char(188),char(89), +char(177),char(3),char(164),char(41),char(153),char(236),char(29),char(136),char(153),char(36), +char(135),char(119),char(15),char(155),char(202),char(20),char(251),char(212),char(212),char(73), +char(76),char(116),char(14),char(200),char(61),char(46),char(111),char(32),char(201),char(3), +char(205),char(232),char(229),char(15),char(208),char(33),char(57),char(179),char(86),char(25), +char(213),char(251),char(172),char(189),char(172),char(169),char(56),char(189),char(176),char(213), +char(12),char(163),char(217),char(99),char(173),char(176),char(149),char(180),char(104),char(88), +char(195),char(226),char(215),char(41),char(255),char(145),char(164),char(199),char(0),char(0), + +}; \ No newline at end of file diff --git a/btgui/FontFiles/OpenSans.ttf b/btgui/FontFiles/OpenSans.ttf new file mode 100644 index 000000000..db433349b Binary files /dev/null and b/btgui/FontFiles/OpenSans.ttf differ diff --git a/btgui/Gwen/Align.h b/btgui/Gwen/Align.h new file mode 100644 index 000000000..e2a3d1698 --- /dev/null +++ b/btgui/Gwen/Align.h @@ -0,0 +1,79 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_ALIGN_H +#define GWEN_ALIGN_H +#include "Gwen/Controls/Base.h" + +namespace Gwen +{ + namespace Align + { + inline void Center( Controls::Base* ctrl ) + { + Controls::Base* parent = ctrl->GetParent(); + if ( !parent ) return; + + ctrl->SetPos( parent->GetPadding().left + (((parent->Width()-parent->GetPadding().left-parent->GetPadding().right) - ctrl->Width()) / 2), + (parent->Height() - ctrl->Height()) / 2 ); + } + + inline void AlignLeft( Controls::Base* ctrl ) + { + Controls::Base* parent = ctrl->GetParent(); + if ( !parent ) return; + + ctrl->SetPos( parent->GetPadding().left, ctrl->Y() ); + } + + inline void CenterHorizontally( Controls::Base* ctrl ) + { + Controls::Base* parent = ctrl->GetParent(); + if ( !parent ) return; + + + ctrl->SetPos( parent->GetPadding().left + (((parent->Width()-parent->GetPadding().left-parent->GetPadding().right) - ctrl->Width()) / 2), ctrl->Y() ); + } + + inline void AlignRight( Controls::Base* ctrl ) + { + Controls::Base* parent = ctrl->GetParent(); + if ( !parent ) return; + + + ctrl->SetPos( parent->Width() - ctrl->Width() - parent->GetPadding().right, ctrl->Y() ); + } + + inline void AlignTop( Controls::Base* ctrl ) + { + ctrl->SetPos( ctrl->X(), 0 ); + } + + inline void CenterVertically( Controls::Base* ctrl ) + { + Controls::Base* parent = ctrl->GetParent(); + if ( !parent ) return; + + ctrl->SetPos( ctrl->X(), (parent->Height() - ctrl->Height()) / 2 ); + } + + inline void AlignBottom( Controls::Base* ctrl ) + { + Controls::Base* parent = ctrl->GetParent(); + if ( !parent ) return; + + ctrl->SetPos( ctrl->X(), parent->Height() - ctrl->Height() ); + } + + inline void PlaceBelow( Controls::Base* ctrl, Controls::Base* below, int iBorder = 0 ) + { + ctrl->SetPos( ctrl->X(), below->Bottom() + iBorder ); + } + + } +} +#endif diff --git a/btgui/Gwen/Anim.cpp b/btgui/Gwen/Anim.cpp new file mode 100644 index 000000000..16c8ff929 --- /dev/null +++ b/btgui/Gwen/Anim.cpp @@ -0,0 +1,142 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Anim.h" +#include "Gwen/Utility.h" +#include + +using namespace Gwen; + +#ifndef GWEN_NO_ANIMATION + +static Gwen::Anim::Animation::List g_Animations; +static Gwen::Anim::Animation::ChildList g_AnimationsListed; + +void Gwen::Anim::Add( Gwen::Controls::Base* control, Animation* animation ) +{ + animation->m_Control = control; + + g_Animations[control].push_back( animation ); +} + +void Gwen::Anim::Cancel( Gwen::Controls::Base* control ) +{ + /* cannot use std::list iterator with algoryhtmns based on pointers + struct AnimDeletePredicate + { + AnimDeletePredicate( Gwen::Controls::Base* control ) + { + this->control = control; + } + + bool operator() ( Gwen::Anim::Animation* anim ) + { + return anim->m_Control == control; + } + + Gwen::Controls::Base* control; + }; + + std::remove_if ( g_Animations.begin(), g_Animations.end(), AnimDeletePredicate( control ) ); + */ + Gwen::Anim::Animation::List::iterator iAnimations; + if ((iAnimations = g_Animations.find(control)) != g_Animations.end()) + { + Gwen::Anim::Animation::ChildList &ChildAnimationsForControl = iAnimations->second; + Gwen::Anim::Animation::ChildList::iterator iAnimationChild = ChildAnimationsForControl.begin(); + if (iAnimationChild != ChildAnimationsForControl.end()) + { + do + { + delete (*iAnimationChild); + }while(++iAnimationChild != ChildAnimationsForControl.end()); + } + g_Animations.erase(iAnimations); + } +} + +void Gwen::Anim::Think() +{ + Gwen::Anim::Animation::List::iterator it = g_Animations.begin(); + + if ( it != g_Animations.end() ) + { + Gwen::Anim::Animation::ChildList::iterator itChild; + + Gwen::Anim::Animation* anim; + + do + { + if ((itChild = it->second.begin()) != it->second.end()) + { + do + { + anim = *itChild; + + anim->Think(); + + if ( anim->Finished() ) + { + itChild = it->second.erase( itChild ); + + delete anim; + } + else + { + ++itChild; + } + + }while(itChild != it->second.end()); + } + + }while(++it != g_Animations.end()); + } + +} + +Gwen::Anim::TimedAnimation::TimedAnimation( float fLength, float fDelay, float fEase ) +{ + m_fStart = Platform::GetTimeInSeconds() + fDelay; + m_fEnd = m_fStart + fLength; + m_fEase = fEase; + m_bStarted = false; + m_bFinished = false; +} + +void Gwen::Anim::TimedAnimation::Think() +{ + if ( m_bFinished ) return; + + float fCurrent = Platform::GetTimeInSeconds(); + float fSecondsIn = fCurrent - m_fStart; + if ( fSecondsIn < 0.0f ) return; + + if ( !m_bStarted ) + { + m_bStarted = true; + OnStart(); + } + + float fDelta = fSecondsIn / ( m_fEnd - m_fStart ); + if ( fDelta < 0.0f ) fDelta = 0.0f; + if ( fDelta > 1.0f ) fDelta = 1.0f; + + Run( pow( fDelta, m_fEase ) ); + + if ( fDelta == 1.0f ) + { + m_bFinished = true; + OnFinish(); + } +} + +bool Gwen::Anim::TimedAnimation::Finished() +{ + return m_bFinished; +} + +#endif \ No newline at end of file diff --git a/btgui/Gwen/Anim.h b/btgui/Gwen/Anim.h new file mode 100644 index 000000000..ac9da16e1 --- /dev/null +++ b/btgui/Gwen/Anim.h @@ -0,0 +1,130 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_ANIM_H +#define GWEN_ANIM_H +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Platform.h" + +#ifndef GWEN_NO_ANIMATION + +namespace Gwen +{ + namespace Anim + { + class GWEN_EXPORT Animation + { + public: + + typedef std::list ChildList; + typedef std::map< Gwen::Controls::Base *, ChildList > List; + + virtual void Think() = 0; + virtual bool Finished() = 0; + + virtual ~Animation() {} + + Gwen::Controls::Base* m_Control; + }; + + GWEN_EXPORT void Add( Gwen::Controls::Base* control, Animation* animation ); + GWEN_EXPORT void Cancel( Gwen::Controls::Base* control ); + GWEN_EXPORT void Think(); + + // + // Timed animation. Provides a useful base for animations. + // + class GWEN_EXPORT TimedAnimation : public Animation + { + public: + + TimedAnimation( float fLength, float fDelay = 0.0f, float fEase = 1.0f ); + + virtual void Think(); + virtual bool Finished(); + + // + // These are the magic functions you should be overriding + // + virtual void OnStart(){} + virtual void Run( float /*delta*/ ){} + virtual void OnFinish(){} + + protected: + + bool m_bStarted; + bool m_bFinished; + float m_fStart; + float m_fEnd; + float m_fEase; + }; + + namespace Size + { + class GWEN_EXPORT Height : public TimedAnimation + { + public: + + Height( int iStartSize, int iEndSize, float fLength, bool bHide = false, float fDelay = 0.0f, float fEase = 1.0f ) : TimedAnimation( fLength, fDelay, fEase ) + { + m_iStartSize = iStartSize; + m_iDelta = iEndSize - m_iStartSize; + m_bHide = bHide; + } + + virtual void OnStart(){ m_Control->SetHeight( m_iStartSize ); } + virtual void Run( float delta ){ m_Control->SetHeight( m_iStartSize + (((float)m_iDelta) * delta) ); } + virtual void OnFinish(){ m_Control->SetHeight( m_iStartSize + m_iDelta ); m_Control->SetHidden( m_bHide ); } + + protected: + + int m_iStartSize; + int m_iDelta; + bool m_bHide; + }; + + class Width : public TimedAnimation + { + public: + + Width( int iStartSize, int iEndSize, float fLength, bool bHide = false, float fDelay = 0.0f, float fEase = 1.0f ) : TimedAnimation( fLength, fDelay, fEase ) + { + m_iStartSize = iStartSize; + m_iDelta = iEndSize - m_iStartSize; + m_bHide = bHide; + } + + virtual void OnStart(){ m_Control->SetWidth( m_iStartSize ); } + virtual void Run( float delta ){ m_Control->SetWidth( m_iStartSize + (((float)m_iDelta) * delta) ); } + virtual void OnFinish(){ m_Control->SetWidth( m_iStartSize + m_iDelta ); m_Control->SetHidden( m_bHide ); } + + protected: + + int m_iStartSize; + int m_iDelta; + bool m_bHide; + }; + } + + namespace Tools + { + class Remove : public TimedAnimation + { + public: + + Remove( float fDelay = 0.0f ) : TimedAnimation( 0.0f, fDelay ){} + virtual void OnFinish(){ m_Control->DelayedDelete(); } + }; + } + + + } +} + +#endif +#endif diff --git a/btgui/Gwen/BaseRender.cpp b/btgui/Gwen/BaseRender.cpp new file mode 100644 index 000000000..6ad4b6d25 --- /dev/null +++ b/btgui/Gwen/BaseRender.cpp @@ -0,0 +1,221 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/BaseRender.h" +#include "Gwen/Utility.h" +#include "Gwen/Platform.h" + +#include + +namespace Gwen +{ + namespace Renderer + { + + Base::Base() + { + m_RenderOffset = Gwen::Point( 0, 0 ); + m_fScale = 1.0f; + } + + Base::~Base() + { + if ( GetCTT() ) + GetCTT()->ShutDown(); + } + + void Base::RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::String& text ) + { + Gwen::UnicodeString str = Gwen::Utility::StringToUnicode( text ); + RenderText( pFont, pos, str ); + } + + Gwen::Point Base::MeasureText( Gwen::Font* pFont, const Gwen::String& text ) + { + Gwen::UnicodeString str = Gwen::Utility::StringToUnicode( text ); + return MeasureText( pFont, str ); + } + + void Base::DrawLinedRect( Gwen::Rect rect ) + { + DrawFilledRect( Gwen::Rect( rect.x, rect.y, rect.w, 1 ) ); + DrawFilledRect( Gwen::Rect( rect.x, rect.y + rect.h-1, rect.w, 1 ) ); + + DrawFilledRect( Gwen::Rect( rect.x, rect.y, 1, rect.h ) ); + DrawFilledRect( Gwen::Rect( rect.x + rect.w-1, rect.y, 1, rect.h ) ); + }; + + void Base::DrawPixel( int x, int y ) + { + DrawFilledRect( Gwen::Rect( x, y, 1, 1 ) ); + } + + void Base::DrawShavedCornerRect( Gwen::Rect rect, bool bSlight ) + { + // Draw INSIDE the w/h. + rect.w -= 1; + rect.h -= 1; + + if ( bSlight ) + { + DrawFilledRect( Gwen::Rect( rect.x+1, rect.y, rect.w-1, 1 ) ); + DrawFilledRect( Gwen::Rect( rect.x+1, rect.y + rect.h, rect.w-1, 1 ) ); + + DrawFilledRect( Gwen::Rect( rect.x, rect.y+1, 1, rect.h-1 ) ); + DrawFilledRect( Gwen::Rect( rect.x + rect.w, rect.y+1, 1, rect.h-1 ) ); + return; + } + + DrawPixel( rect.x+1, rect.y+1 ); + DrawPixel( rect.x+rect.w-1, rect.y+1 ); + + DrawPixel( rect.x+1, rect.y+rect.h-1 ); + DrawPixel( rect.x+rect.w-1, rect.y+rect.h-1 ); + + DrawFilledRect( Gwen::Rect( rect.x+2, rect.y, rect.w-3, 1 ) ); + DrawFilledRect( Gwen::Rect( rect.x+2, rect.y + rect.h, rect.w-3, 1 ) ); + + DrawFilledRect( Gwen::Rect( rect.x, rect.y+2, 1, rect.h-3 ) ); + DrawFilledRect( Gwen::Rect( rect.x + rect.w, rect.y+2, 1, rect.h-3 ) ); + } + + void Base::Translate( int& x, int& y ) + { + x += m_RenderOffset.x; + y += m_RenderOffset.y; + + x = ceil( ((float) x ) * m_fScale ); + y = ceil( ((float) y ) * m_fScale ); + } + + void Base::Translate( Gwen::Rect& rect ) + { + Translate( rect.x, rect.y ); + + rect.w = ceil(((float) rect.w ) * m_fScale); + rect.h = ceil(((float) rect.h ) * m_fScale); + } + + void Gwen::Renderer::Base::SetClipRegion( Gwen::Rect rect ) + { + m_rectClipRegion = rect; + } + + void Base::AddClipRegion( Gwen::Rect rect ) + { + rect.x = m_RenderOffset.x; + rect.y = m_RenderOffset.y; + + Gwen::Rect out = rect; + if ( rect.x < m_rectClipRegion.x ) + { + out.w -= ( m_rectClipRegion.x - out.x ); + out.x = m_rectClipRegion.x; + } + + if ( rect.y < m_rectClipRegion.y ) + { + out.h -= ( m_rectClipRegion.y - out.y ); + out.y = m_rectClipRegion.y; + } + + if ( rect.x + rect.w > m_rectClipRegion.x + m_rectClipRegion.w ) + { + out.w = (m_rectClipRegion.x + m_rectClipRegion.w) - out.x; + } + + if ( rect.y + rect.h > m_rectClipRegion.y + m_rectClipRegion.h ) + { + out.h = (m_rectClipRegion.y + m_rectClipRegion.h) - out.y; + } + + m_rectClipRegion = out; + } + + const Gwen::Rect& Base::ClipRegion() const + { + return m_rectClipRegion; + } + + bool Base::ClipRegionVisible() + { + if ( m_rectClipRegion.w <= 0 || m_rectClipRegion.h <= 0 ) + return false; + + return true; + } + + void Base::DrawMissingImage( Gwen::Rect pTargetRect ) + { + SetDrawColor( Colors::Red ); + DrawFilledRect( pTargetRect ); + } + + + /* + If they haven't defined these font functions in their renderer code + we just draw some rects where the letters would be to give them an idea. + */ + + void Base::RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::UnicodeString& text ) + { + float fSize = pFont->size * Scale(); + + for ( float i=0; i= 'a' && chr <= 'z' ) + { + r.y += fSize * 0.5f; + r.h -= fSize * 0.4f; + } + else if ( chr == '.' || chr == ',' ) + { + r.x += 2; + r.y += r.h - 2; + r.w = 2; + r.h = 2; + } + else if ( chr == '\'' || chr == '`' || chr == '"' ) + { + r.x += 3; + r.w = 2; + r.h = 2; + } + + + if ( chr == 'o' || chr == 'O' || chr == '0' ) + DrawLinedRect( r ); + else + DrawFilledRect( r ); + } + } + + Gwen::Point Base::MeasureText( Gwen::Font* pFont, const Gwen::UnicodeString& text ) + { + Gwen::Point p; + p.x = pFont->size * Scale() * (float)text.length() * 0.4; + p.y = pFont->size * Scale(); + + return p; + } + } +} \ No newline at end of file diff --git a/btgui/Gwen/BaseRender.h b/btgui/Gwen/BaseRender.h new file mode 100644 index 000000000..1932461ca --- /dev/null +++ b/btgui/Gwen/BaseRender.h @@ -0,0 +1,119 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_BASERENDER_H +#define GWEN_BASERENDER_H + +#include "Gwen/Structures.h" + +namespace Gwen +{ + struct Font; + struct Texture; + + namespace Renderer + { + class Base; + + class ICacheToTexture + { + + public: + virtual void Initialize() = 0; + virtual void ShutDown() = 0; + virtual void SetupCacheTexture( Gwen::Controls::Base* control ) = 0; + virtual void FinishCacheTexture( Gwen::Controls::Base* control ) = 0; + virtual void DrawCachedControlTexture( Gwen::Controls::Base* control ) = 0; + virtual void CreateControlCacheTexture( Gwen::Controls::Base* control ) = 0; + virtual void UpdateControlCacheTexture( Gwen::Controls::Base* control ) = 0; + virtual void SetRenderer( Gwen::Renderer::Base* renderer ) = 0; + + }; + + class GWEN_EXPORT Base + { + public: + + Base(); + virtual ~Base(); + + virtual void Begin(){}; + virtual void End(){}; + + virtual void SetDrawColor( Color color ){}; + + virtual void DrawLine( int x, int y, int a, int b ){}; + virtual void DrawFilledRect( Gwen::Rect rect ){};; + + virtual void StartClip(){}; + virtual void EndClip(){}; + + virtual void LoadTexture( Gwen::Texture* pTexture ){}; + virtual void FreeTexture( Gwen::Texture* pTexture ){}; + virtual void DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect pTargetRect, float u1=0.0f, float v1=0.0f, float u2=1.0f, float v2=1.0f ){}; + virtual void DrawMissingImage( Gwen::Rect pTargetRect ); + + virtual ICacheToTexture* GetCTT() { return NULL; } + + virtual void LoadFont( Gwen::Font* pFont ){}; + virtual void FreeFont( Gwen::Font* pFont ){}; + virtual void RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::UnicodeString& text ); + virtual Gwen::Point MeasureText( Gwen::Font* pFont, const Gwen::UnicodeString& text ); + + // + // No need to implement these functions in your derived class, but if + // you can do them faster than the default implementation it's a good idea to. + // + virtual void DrawLinedRect( Gwen::Rect rect ); + virtual void DrawPixel( int x, int y ); + virtual void DrawShavedCornerRect( Gwen::Rect rect, bool bSlight = false ); + virtual Gwen::Point MeasureText( Gwen::Font* pFont, const Gwen::String& text ); + virtual void RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::String& text ); + + public: + + // + // Translate a panel's local drawing coordinate + // into view space, taking Offset's into account. + // + void Translate( int& x, int& y ); + void Translate( Gwen::Rect& rect ); + + // + // Set the rendering offset. You shouldn't have to + // touch these, ever. + // + void SetRenderOffset( const Gwen::Point& offset ){ m_RenderOffset = offset; } + void AddRenderOffset( const Gwen::Rect& offset ){ m_RenderOffset.x += offset.x; m_RenderOffset.y += offset.y; } + const Gwen::Point& GetRenderOffset() const { return m_RenderOffset; } + + private: + + Gwen::Point m_RenderOffset; + + public: + + void SetClipRegion( Gwen::Rect rect ); + void AddClipRegion( Gwen::Rect rect ); + bool ClipRegionVisible(); + const Gwen::Rect& ClipRegion() const; + + private: + + Gwen::Rect m_rectClipRegion; + ICacheToTexture* m_RTT; + + public: + + void SetScale( float fScale ){ m_fScale = fScale; } + float Scale() const { return m_fScale; } + + float m_fScale; + }; + } +} +#endif diff --git a/btgui/Gwen/Config.h b/btgui/Gwen/Config.h new file mode 100644 index 000000000..f46ce385f --- /dev/null +++ b/btgui/Gwen/Config.h @@ -0,0 +1,16 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONFIG_H +#define GWEN_CONFIG_H + +// +// Disables animation functions. +// +//#define GWEN_NO_ANIMATION + +#endif diff --git a/btgui/Gwen/Controls.h b/btgui/Gwen/Controls.h new file mode 100644 index 000000000..8c0d8dbbd --- /dev/null +++ b/btgui/Gwen/Controls.h @@ -0,0 +1,10 @@ +#pragma once +#ifndef GWEN_CONTROLS_H +#define GWEN_CONTROLS_H + +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/TextBox.h" + +#include "Gwen/Anim.h" + +#endif diff --git a/btgui/Gwen/Controls/Base.cpp b/btgui/Gwen/Controls/Base.cpp new file mode 100644 index 000000000..dd71a4139 --- /dev/null +++ b/btgui/Gwen/Controls/Base.cpp @@ -0,0 +1,1082 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Gwen.h" +#include "Gwen/BaseRender.h" +#include "Gwen/Skin.h" +#include "Gwen/Platform.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/ToolTip.h" +#include "Gwen/Utility.h" +#include + +#ifndef GWEN_NO_ANIMATION +#include "Gwen/Anim.h" +#endif + +using namespace Gwen; +using namespace Controls; + +Base::Base( Base* pParent ) +{ + m_Parent = NULL; + m_ActualParent = NULL; + m_InnerPanel = NULL; + m_Skin = NULL; + + SetParent( pParent ); + + m_bHidden = false; + m_Bounds = Gwen::Rect(0,0,10,10); + m_Padding = Padding( 0, 0, 0, 0 ); + m_Margin = Margin( 0, 0, 0, 0 ); + + m_iDock = 0; + m_DragAndDrop_Package = NULL; + m_pUserData = NULL; + + RestrictToParent( false ); + + SetMouseInputEnabled( true ); + SetKeyboardInputEnabled( false ); + + Invalidate(); + SetCursor( Gwen::CursorType::Normal ); + SetToolTip( NULL ); + SetTabable( false ); + SetShouldDrawBackground( true ); + m_bDisabled = false; + m_bCacheTextureDirty = true; + m_bCacheToTexture = false; + +} + +Base::~Base() +{ + { + Canvas* canvas = GetCanvas(); + if ( canvas ) + canvas->PreDelete( this ); + } + + Base::List::iterator iter = Children.begin(); + while ( iter != Children.end() ) + { + Base* pChild = *iter; + iter = Children.erase( iter ); + delete pChild; + } + + for ( AccelMap::iterator accelIt = m_Accelerators.begin(); accelIt != m_Accelerators.end(); ++accelIt ) + { + delete accelIt->second; + } + m_Accelerators.clear(); + + SetParent( NULL ); + + if ( Gwen::HoveredControl == this ) Gwen::HoveredControl = NULL; + if ( Gwen::KeyboardFocus == this ) Gwen::KeyboardFocus = NULL; + if ( Gwen::MouseFocus == this ) Gwen::MouseFocus = NULL; + + DragAndDrop::ControlDeleted( this ); + ToolTip::ControlDeleted( this ); + + #ifndef GWEN_NO_ANIMATION + Anim::Cancel( this ); + #endif + + if ( m_DragAndDrop_Package ) + { + delete m_DragAndDrop_Package; + m_DragAndDrop_Package = NULL; + } +} + +void Base::Invalidate() +{ + m_bNeedsLayout = true; + m_bCacheTextureDirty = true; +} + +void Base::DelayedDelete() +{ + Canvas* canvas = GetCanvas(); + canvas->AddDelayedDelete( this ); +} + +Canvas* Base::GetCanvas() +{ + Base* pCanvas = m_Parent; + if ( !pCanvas ) return NULL; + + return pCanvas->GetCanvas(); +} + +void Base::SetParent(Base* pParent) +{ + if ( m_Parent == pParent ) return; + + if ( m_Parent ) + { + m_Parent->RemoveChild( this ); + } + + m_Parent = pParent; + m_ActualParent = NULL; + + if ( m_Parent ) + { + m_Parent->AddChild( this ); + } +} + +void Base::Dock( int iDock ) +{ + if ( m_iDock == iDock ) return; + + m_iDock = iDock; + + Invalidate(); + InvalidateParent(); +} + +int Base::GetDock() +{ + return m_iDock; +} + +bool Base::Hidden() const +{ + return m_bHidden; +} + +bool Base::Visible() const +{ + if ( Hidden() ) return false; + if ( GetParent() ) + { + return GetParent()->Visible(); + } + + return true; +} + +void Base::InvalidateChildren( bool bRecursive ) +{ + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + (*it)->Invalidate(); + + if ( bRecursive ) + (*it)->InvalidateChildren( bRecursive ); + } + + if ( m_InnerPanel ) + { + for ( Base::List::iterator it = m_InnerPanel->Children.begin(); it != m_InnerPanel->Children.end(); ++it ) + { + (*it)->Invalidate(); + + if ( bRecursive ) + (*it)->InvalidateChildren( bRecursive ); + } + } +} + +void Base::Position( int pos, int xpadding, int ypadding ) +{ + int w = GetParent()->Width(); + int h = GetParent()->Height(); + const Padding& padding = GetParent()->GetPadding(); + + int x = X(); + int y = Y(); + + if ( pos & Pos::Left ) x = padding.left + xpadding; + if ( pos & Pos::Right ) x = w - Width() - padding.right - xpadding; + if ( pos & Pos::CenterH ) x = padding.left + xpadding + (w - Width() - padding.left - padding.right) * 0.5; + + if ( pos & Pos::Top ) y = padding.top + ypadding; + if ( pos & Pos::Bottom ) y = h - Height() - padding.bottom - ypadding; + if ( pos & Pos::CenterV ) y = padding.top + ypadding + (h - Height() - padding.bottom - padding.top) * 0.5; + + SetPos( x, y ); +} + + +void Base::SendToBack() +{ + if ( !m_Parent ) return; + if ( m_Parent->Children.front() == this ) return; + + m_Parent->Children.remove( this ); + m_Parent->Children.push_front( this ); + + InvalidateParent(); +} + +void Base::BringToFront() +{ + if ( !m_Parent ) return; + if ( m_Parent->Children.back() == this ) return; + + m_Parent->Children.remove( this ); + m_Parent->Children.push_back( this ); + InvalidateParent(); +} + +Controls::Base* Base::FindChildByName( const Gwen::String& name, bool bRecursive ) +{ + Base::List::iterator iter; + for (iter = Children.begin(); iter != Children.end(); ++iter) + { + Base* pChild = *iter; + if ( pChild->GetName() == name ) + return pChild; + + if ( bRecursive ) + { + Controls::Base* pSubChild = pChild->FindChildByName( name, true ); + + if ( pSubChild ) + return pSubChild; + } + } + + return NULL; +} + +void Base::BringNextToControl( Controls::Base* pChild, bool bBehind ) +{ + if ( !m_Parent ) return; + + m_Parent->Children.remove( this ); + + Base::List::iterator it = std::find( m_Parent->Children.begin(), m_Parent->Children.end(), pChild ); + if ( it == m_Parent->Children.end() ) + return BringToFront(); + + if ( bBehind ) + { + ++it; + + if ( it == m_Parent->Children.end() ) + return BringToFront(); + } + + m_Parent->Children.insert( it, this ); + InvalidateParent(); +} + +void Base::AddChild(Base* pChild) +{ + if ( m_InnerPanel ) + { + m_InnerPanel->AddChild( pChild ); + return; + } + + Children.push_back( pChild ); + OnChildAdded(pChild); + + pChild->m_ActualParent = this; + +} +void Base::RemoveChild(Base* pChild) +{ + // If we removed our innerpanel + // remove our pointer to it + if ( m_InnerPanel == pChild ) + { + m_InnerPanel = NULL; + } + + if ( m_InnerPanel ) + { + m_InnerPanel->RemoveChild( pChild ); + } + + Children.remove( pChild ); + OnChildRemoved(pChild); +} + +void Base::RemoveAllChildren() +{ + while ( Children.size() > 0 ) + { + RemoveChild( *Children.begin() ); + } +} + +int Base::NumChildren() +{ + // Include m_InnerPanel's children here? + + return Children.size(); +} + +void Base::OnChildAdded(Base* /*pChild*/) +{ + Invalidate(); +} + +void Base::OnChildRemoved(Base* /*pChild*/) +{ + Invalidate(); +} + +Skin::Base* Base::GetSkin( void ) +{ + if ( m_Skin ) return m_Skin; + if ( m_Parent ) return m_Parent->GetSkin(); + + Debug::AssertCheck( 0, "Base::GetSkin Returning NULL!\n" ); + return NULL; +} + +void Base::MoveBy( int x, int y ) +{ + SetBounds( X() + x, Y() + y, Width(), Height() ); +} + +void Base::MoveTo( int x, int y ) +{ + if ( m_bRestrictToParent && GetParent() ) + { + Base* pParent = GetParent(); + if ( x - GetPadding().left < pParent->GetMargin().left ) x = pParent->GetMargin().left + GetPadding().left; + if ( y - GetPadding().top < pParent->GetMargin().top ) y = pParent->GetMargin().top + GetPadding().top; + if ( x + Width() + GetPadding().right > pParent->Width() - pParent->GetMargin().right ) x = pParent->Width() - pParent->GetMargin().right - Width() - GetPadding().right; + if ( y + Height() + GetPadding().bottom > pParent->Height() - pParent->GetMargin().bottom ) y = pParent->Height() - pParent->GetMargin().bottom - Height() - GetPadding().bottom; + } + + SetBounds(x, y, Width(), Height()); +} + +void Base::SetPos( int x, int y ) +{ + SetBounds( x, y, Width(), Height() ); +} + +bool Base::SetSize( int w, int h ) +{ + return SetBounds( X(), Y(), w, h ); +} + +bool Base::SetBounds( const Gwen::Rect& bounds ) +{ + return SetBounds( bounds.x, bounds.y, bounds.w, bounds.h ); +} + +bool Base::SetBounds( int x, int y, int w, int h ) +{ + if ( m_Bounds.x == x && + m_Bounds.y == y && + m_Bounds.w == w && + m_Bounds.h == h ) + return false; + + Gwen::Rect oldBounds = GetBounds(); + + m_Bounds.x = x; + m_Bounds.y = y; + + m_Bounds.w = w; + m_Bounds.h = h; + + OnBoundsChanged( oldBounds ); + + return true; +} + +void Base::OnBoundsChanged(Gwen::Rect oldBounds) +{ + //Anything that needs to update on size changes + //Iterate my children and tell them I've changed + // + if ( GetParent() ) + GetParent()->OnChildBoundsChanged( oldBounds, this ); + + + if ( m_Bounds.w != oldBounds.w || m_Bounds.h != oldBounds.h ) + { + Invalidate(); + } + + Redraw(); + UpdateRenderBounds(); +} + +void Base::OnScaleChanged() +{ + for ( Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter ) + { + (*iter)->OnScaleChanged(); + } +} + +void Base::OnChildBoundsChanged( Gwen::Rect /*oldChildBounds*/, Base* /*pChild*/ ) +{ + +} + +void Base::Render( Gwen::Skin::Base* /*skin*/ ) +{ +} + +void Base::DoCacheRender( Gwen::Skin::Base* skin, Gwen::Controls::Base* pMaster ) +{ + Gwen::Renderer::Base* render = skin->GetRender(); + Gwen::Renderer::ICacheToTexture* cache = render->GetCTT(); + + if ( !cache ) return; + + Gwen::Point pOldRenderOffset = render->GetRenderOffset(); + + Gwen::Rect rOldRegion = render->ClipRegion(); + + if ( this != pMaster ) + { + render->AddRenderOffset( GetBounds() ); + render->AddClipRegion( GetBounds() ); + } + else + { + render->SetRenderOffset( Gwen::Point( 0, 0 ) ); + render->SetClipRegion( GetBounds() ); + } + + if ( m_bCacheTextureDirty && render->ClipRegionVisible() ) + { + render->StartClip(); + + if ( ShouldCacheToTexture() ) + cache->SetupCacheTexture( this ); + + //Render myself first + Render( skin ); + + if ( !Children.empty() ) + { + //Now render my kids + for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) + { + Base* pChild = *iter; + if ( pChild->Hidden() ) continue; + + pChild->DoCacheRender( skin, pMaster ); + } + } + + if ( ShouldCacheToTexture() ) + { + cache->FinishCacheTexture( this ); + m_bCacheTextureDirty = false; + } + } + + render->SetClipRegion( rOldRegion ); + render->StartClip(); + render->SetRenderOffset( pOldRenderOffset ); + cache->DrawCachedControlTexture( this ); +} + +void Base::DoRender( Gwen::Skin::Base* skin ) +{ + // If this control has a different skin, + // then so does its children. + if ( m_Skin ) + skin = m_Skin; + + // Do think + Think(); + + Gwen::Renderer::Base* render = skin->GetRender(); + + if ( render->GetCTT() && ShouldCacheToTexture() ) + { + DoCacheRender( skin, this ); + return; + } + + Gwen::Point pOldRenderOffset = render->GetRenderOffset(); + + render->AddRenderOffset( GetBounds() ); + + RenderUnder( skin ); + + Gwen::Rect rOldRegion = render->ClipRegion(); + render->AddClipRegion( GetBounds() ); + + if ( render->ClipRegionVisible() ) + { + render->StartClip(); + + //Render myself first + Render( skin ); + + if ( !Children.empty() ) + { + //Now render my kids + for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) + { + Base* pChild = *iter; + if ( pChild->Hidden() ) continue; + + pChild->DoRender( skin ); + } + } + + render->SetClipRegion( rOldRegion ); + render->StartClip(); + + RenderOver( skin ); + } + else + { + render->SetClipRegion( rOldRegion ); + } + + RenderFocus( skin ); + + render->SetRenderOffset( pOldRenderOffset ); +} + +void Base::SetSkin( Skin::Base* skin, bool doChildren ) +{ + if ( m_Skin == skin ) return; + m_Skin = skin; + Invalidate(); + Redraw(); + OnSkinChanged( skin ); + + if ( doChildren ) + { + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + (*it)->SetSkin( skin, true); + } + } +} + +void Base::OnSkinChanged( Skin::Base* /*skin*/ ) +{ + //Do something +} + +bool Base::OnMouseWheeled( int iDelta ) +{ + if ( m_ActualParent ) + return m_ActualParent->OnMouseWheeled( iDelta ); + + return false; +} + +void Base::OnMouseMoved( int /*x*/, int /*y*/, int /*deltaX*/, int /*deltaY*/ ) +{ +} + +void Base::OnMouseEnter() +{ + onHoverEnter.Call( this ); + + if ( GetToolTip() ) + ToolTip::Enable( this ); + else if ( GetParent() && GetParent()->GetToolTip() ) + ToolTip::Enable( GetParent() ); +} + +void Base::OnMouseLeave() +{ + onHoverLeave.Call( this ); + if ( GetToolTip() ) + ToolTip::Disable( this ); +} + + +bool Base::IsHovered() +{ + return Gwen::HoveredControl == this; +} + +bool Base::ShouldDrawHover() +{ + return Gwen::MouseFocus == this || Gwen::MouseFocus == NULL; +} + +bool Base::HasFocus() +{ + return Gwen::KeyboardFocus == this; +} + +void Base::Focus() +{ + if ( Gwen::KeyboardFocus == this ) return; + + if ( Gwen::KeyboardFocus ) + Gwen::KeyboardFocus->OnLostKeyboardFocus(); + + Gwen::KeyboardFocus = this; + + OnKeyboardFocus(); + Redraw(); +} + +void Base::Blur() +{ + if ( Gwen::KeyboardFocus != this ) return; + + Gwen::KeyboardFocus = NULL; + OnLostKeyboardFocus(); + + Redraw(); +} + +bool Base::IsOnTop() +{ + Base::List::iterator iter = GetParent()->Children.begin(); + Base* pChild = *iter; + + if ( pChild == this ) + return true; + + return false; +} + + +void Base::Touch() +{ + if ( GetParent() ) + GetParent()->OnChildTouched( this ); +} + +void Base::OnChildTouched( Controls::Base* /*pChild*/ ) +{ + Touch(); +} + +Base* Base::GetControlAt( int x, int y ) +{ + if ( Hidden() ) + return NULL; + + if ( x < 0 || y < 0 || x >= Width() || y >= Height() ) + return NULL; + + Base::List::reverse_iterator iter; + for (iter = Children.rbegin(); iter != Children.rend(); ++iter) + { + Base* pChild = *iter; + Base* pFound = NULL; + pFound = pChild->GetControlAt( x - pChild->X(), y - pChild->Y() ); + if ( pFound ) return pFound; + } + + if ( !GetMouseInputEnabled() ) + return NULL; + + return this; +} + + +void Base::Layout( Skin::Base* skin ) +{ + if ( skin->GetRender()->GetCTT() && ShouldCacheToTexture() ) + skin->GetRender()->GetCTT()->CreateControlCacheTexture( this ); +} + +void Base::RecurseLayout( Skin::Base* skin ) +{ + if ( m_Skin ) skin = m_Skin; + if ( Hidden() ) return; + + if ( NeedsLayout() ) + { + m_bNeedsLayout = false; + Layout( skin ); + } + + Gwen::Rect rBounds = GetRenderBounds(); + + // Adjust bounds for padding + rBounds.x += m_Padding.left; + rBounds.w -= m_Padding.left + m_Padding.right; + rBounds.y += m_Padding.top; + rBounds.h -= m_Padding.top + m_Padding.bottom; + + for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) + { + Base* pChild = *iter; + + if ( pChild->Hidden() ) + continue; + + int iDock = pChild->GetDock(); + + if ( iDock & Pos::Fill ) + continue; + + if ( iDock & Pos::Top ) + { + const Margin& margin = pChild->GetMargin(); + + pChild->SetBounds( rBounds.x + margin.left, rBounds.y + margin.top, rBounds.w - margin.left - margin.right, pChild->Height() ); + + int iHeight = margin.top + margin.bottom + pChild->Height(); + rBounds.y += iHeight; + rBounds.h -= iHeight; + } + + if ( iDock & Pos::Left ) + { + const Margin& margin = pChild->GetMargin(); + + pChild->SetBounds( rBounds.x + margin.left, rBounds.y + margin.top, pChild->Width(), rBounds.h - margin.top - margin.bottom ); + + int iWidth = margin.left + margin.right + pChild->Width(); + rBounds.x += iWidth; + rBounds.w -= iWidth; + } + + if ( iDock & Pos::Right ) + { + // TODO: THIS MARGIN CODE MIGHT NOT BE FULLY FUNCTIONAL + const Margin& margin = pChild->GetMargin(); + + pChild->SetBounds( (rBounds.x+rBounds.w)-pChild->Width()-margin.right, rBounds.y + margin.top, pChild->Width(), rBounds.h - margin.top - margin.bottom ); + + int iWidth = margin.left + margin.right + pChild->Width(); + rBounds.w -= iWidth; + } + + if ( iDock & Pos::Bottom ) + { + // TODO: THIS MARGIN CODE MIGHT NOT BE FULLY FUNCTIONAL + const Margin& margin = pChild->GetMargin(); + + pChild->SetBounds( rBounds.x + margin.left, (rBounds.y+rBounds.h)-pChild->Height()-margin.bottom, rBounds.w - margin.left - margin.right, pChild->Height() ); + rBounds.h -= pChild->Height() + margin.bottom + margin.top; + } + + pChild->RecurseLayout( skin ); + } + + m_InnerBounds = rBounds; + + // + // Fill uses the left over space, so do that now. + // + for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) + { + Base* pChild = *iter; + int iDock = pChild->GetDock(); + + if ( !(iDock & Pos::Fill) ) + continue; + + const Margin& margin = pChild->GetMargin(); + + pChild->SetBounds( rBounds.x + margin.left, rBounds.y + margin.top, rBounds.w - margin.left - margin.right, rBounds.h - margin.top - margin.bottom ); + pChild->RecurseLayout( skin ); + } + + PostLayout( skin ); + + if ( IsTabable() ) + { + if ( !GetCanvas()->FirstTab ) GetCanvas()->FirstTab = this; + if ( !GetCanvas()->NextTab ) GetCanvas()->NextTab = this; + } + + if ( Gwen::KeyboardFocus == this ) + { + GetCanvas()->NextTab = NULL; + } +} + +bool Base::IsChild( Controls::Base* pChild ) +{ + for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) + { + if ( pChild == (*iter) ) return true; + } + + return false; +} + +Gwen::Point Base::LocalPosToCanvas( const Gwen::Point& pnt ) +{ + if ( m_Parent ) + { + int x = pnt.x + X(); + int y = pnt.y + Y(); + + // If our parent has an innerpanel and we're a child of it + // add its offset onto us. + // + if ( m_Parent->m_InnerPanel && m_Parent->m_InnerPanel->IsChild( this ) ) + { + x += m_Parent->m_InnerPanel->X(); + y += m_Parent->m_InnerPanel->Y(); + } + + return m_Parent->LocalPosToCanvas( Gwen::Point( x, y ) ); + } + + return pnt; +} + +Gwen::Point Base::CanvasPosToLocal( const Gwen::Point& pnt ) +{ + if ( m_Parent ) + { + int x = pnt.x - X(); + int y = pnt.y - Y(); + + // If our parent has an innerpanel and we're a child of it + // add its offset onto us. + // + if ( m_Parent->m_InnerPanel && m_Parent->m_InnerPanel->IsChild( this ) ) + { + x -= m_Parent->m_InnerPanel->X(); + y -= m_Parent->m_InnerPanel->Y(); + } + + + return m_Parent->CanvasPosToLocal( Gwen::Point( x, y ) ); + } + + return pnt; +} + +bool Base::IsMenuComponent() +{ + if ( !m_Parent ) return false; + return m_Parent->IsMenuComponent(); +} + +void Base::CloseMenus() +{ + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + (*it)->CloseMenus(); + } +} + +void Base::UpdateRenderBounds() +{ + m_RenderBounds.x = 0; + m_RenderBounds.x = 0; + + m_RenderBounds.w = m_Bounds.w; + m_RenderBounds.h = m_Bounds.h; +} + +void Base::UpdateCursor() +{ + Platform::SetCursor( m_Cursor ); +} + +DragAndDrop::Package* Base::DragAndDrop_GetPackage( int /*x*/, int /*y*/ ) +{ + return m_DragAndDrop_Package; +} + +bool Base::DragAndDrop_HandleDrop( Gwen::DragAndDrop::Package* /*pPackage*/, int /*x*/, int /*y*/ ) +{ + DragAndDrop::SourceControl->SetParent( this ); + return true; +} + +bool Base::DragAndDrop_Draggable() +{ + if ( !m_DragAndDrop_Package ) return false; + + return m_DragAndDrop_Package->draggable; +} + +void Base::DragAndDrop_SetPackage( bool bDraggable, const String& strName, void* pUserData ) +{ + if ( !m_DragAndDrop_Package ) + { + m_DragAndDrop_Package = new Gwen::DragAndDrop::Package(); + } + + m_DragAndDrop_Package->draggable = bDraggable; + m_DragAndDrop_Package->name = strName; + m_DragAndDrop_Package->userdata = pUserData; +} + +void Base::DragAndDrop_StartDragging( Gwen::DragAndDrop::Package* pPackage, int x, int y ) +{ + pPackage->holdoffset = CanvasPosToLocal( Gwen::Point( x, y ) ); + pPackage->drawcontrol = this; +} + +bool Base::SizeToChildren( bool w, bool h ) +{ + Gwen::Point size = ChildrenSize(); + return SetSize( w ? size.x : Width(), h ? size.y : Height() ); +} + +Gwen::Point Base::ChildrenSize() +{ + Gwen::Point size; + + for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) + { + Base* pChild = *iter; + if ( pChild->Hidden() ) continue; + + size.x = GwenUtil_Max( size.x, pChild->Right() ); + size.y = GwenUtil_Max( size.y, pChild->Bottom() ); + } + + return size; +} + +void Base::SetPadding( const Padding& padding ) +{ + if ( m_Padding.left == padding.left && + m_Padding.top == padding.top && + m_Padding.right == padding.right && + m_Padding.bottom == padding.bottom ) + return; + + m_Padding = padding; + Invalidate(); + InvalidateParent(); +} + +void Base::SetMargin( const Margin& margin ) +{ + if ( m_Margin.top == margin.top && + m_Margin.left == margin.left && + m_Margin.bottom == margin.bottom && + m_Margin.right == margin.right ) + return; + + m_Margin = margin; + Invalidate(); + InvalidateParent(); +} + +bool Base::HandleAccelerator( Gwen::UnicodeString& accelerator ) +{ + if ( Gwen::KeyboardFocus == this || !AccelOnlyFocus() ) + { + AccelMap::iterator iter = m_Accelerators.find( accelerator ); + if ( iter != m_Accelerators.end() ) + { + iter->second->Call( this ); + return true; + } + } + + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + if ( (*it)->HandleAccelerator( accelerator ) ) + return true; + } + return false; +} + +bool Base::OnKeyPress( int iKey, bool bPress ) +{ + bool bHandled = false; + switch ( iKey ) + { + case Key::Tab: bHandled = OnKeyTab( bPress ); break; + case Key::Space: bHandled = OnKeySpace( bPress ); break; + case Key::Home: bHandled = OnKeyHome( bPress ); break; + case Key::End: bHandled = OnKeyEnd( bPress ); break; + case Key::Return: bHandled = OnKeyReturn( bPress ); break; + case Key::Backspace: bHandled = OnKeyBackspace( bPress ); break; + case Key::Delete: bHandled = OnKeyDelete( bPress ); break; + case Key::Right: bHandled = OnKeyRight( bPress ); break; + case Key::Left: bHandled = OnKeyLeft( bPress ); break; + case Key::Up: bHandled = OnKeyUp( bPress ); break; + case Key::Down: bHandled = OnKeyDown( bPress ); break; + case Key::Escape: bHandled = OnKeyEscape( bPress ); break; + + default: break; + } + + if ( !bHandled && GetParent() ) + GetParent()->OnKeyPress( iKey, bPress ); + + return bHandled; +} + +bool Base::OnKeyRelease( int iKey ) +{ + return OnKeyPress( iKey, false ); +} + +bool Base::OnKeyTab( bool bDown ) +{ + if ( !bDown ) return true; + + if ( GetCanvas()->NextTab ) + { + GetCanvas()->NextTab->Focus(); + Redraw(); + } + + return true; +} + +void Base::RenderFocus( Gwen::Skin::Base* skin ) +{ + if ( Gwen::KeyboardFocus != this ) return; + if ( !IsTabable() ) return; + + skin->DrawKeyboardHighlight( this, GetRenderBounds(), 3 ); +} + +void Base::SetToolTip( const String& strText ) +{ + SetToolTip( Gwen::Utility::StringToUnicode( strText ) ); +} + +void Base::SetToolTip( const UnicodeString& strText ) +{ + Label* tooltip = new Label( this ); + tooltip->SetText( strText ); + tooltip->SizeToContents(); + + SetToolTip( tooltip ); +} + +#ifndef GWEN_NO_ANIMATION + +void Base::Anim_WidthIn( float fLength, float fDelay, float fEase ) +{ + Gwen::Anim::Add( this, new Gwen::Anim::Size::Width( 0, Width(), fLength, false, fDelay, fEase ) ); + SetWidth( 0 ); +} + +void Base::Anim_HeightIn( float fLength, float fDelay, float fEase ) +{ + Gwen::Anim::Add( this, new Gwen::Anim::Size::Height( 0, Height(), fLength, false, fDelay, fEase ) ); + SetHeight( 0 ); +} + +void Base::Anim_WidthOut( float fLength, bool bHide, float fDelay, float fEase ) +{ + Gwen::Anim::Add( this, new Gwen::Anim::Size::Width( Width(), 0, fLength, bHide, fDelay, fEase ) ); +} + +void Base::Anim_HeightOut( float fLength, bool bHide, float fDelay, float fEase ) +{ + Gwen::Anim::Add( this, new Gwen::Anim::Size::Height( Height(), 0, fLength, bHide, fDelay, fEase ) ); +} + +#endif \ No newline at end of file diff --git a/btgui/Gwen/Controls/Base.h b/btgui/Gwen/Controls/Base.h new file mode 100644 index 000000000..46a4104c8 --- /dev/null +++ b/btgui/Gwen/Controls/Base.h @@ -0,0 +1,507 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_BASE_H +#define GWEN_CONTROLS_BASE_H + +#include "Gwen/Exports.h" +#include "Gwen/Structures.h" +#include "Gwen/BaseRender.h" +#include "Gwen/Events.h" +#include +#include + +#define GWEN_DECLARE_CAST(T)\ +virtual class T* DynamicCast##T() { return 0;}\ +virtual const class T* DynamicCast##T() const { return 0;}\ + +#define GWEN_IMPLEMENT_CAST(T)\ +virtual class T* DynamicCast##T() { return (T*)this;}\ +virtual const class T* DynamicCast##T() const { return (T*)this;}\ + + +namespace Gwen +{ + namespace ControlsInternal + { + class ColorDisplay; + class Resizer; + + }; + + namespace Pos + { + enum + { + None = 0, + Left = (1 << 1), + Right = (1 << 2), + Top = (1 << 3), + Bottom = (1 << 4), + CenterV = (1 << 5), + CenterH = (1 << 6), + Fill = (1 << 7), + Center = CenterV | CenterH, + }; + } + + namespace Skin + { + class Base; + } + + namespace Controls + { + class Canvas; + + namespace Layout + { + class TableRow; + }; + + + + + class GWEN_EXPORT Base : public Event::Handler + { + public: + + GWEN_DECLARE_CAST(TabButton) + GWEN_DECLARE_CAST(DockedTabControl) + virtual class Layout::TableRow* DynamicCastLayoutTableRow() { return 0;} + virtual const class Layout::TableRow* DynamicCastLayoutTableRow() const { return 0;} + + + + GWEN_DECLARE_CAST(TextBoxNumeric) + GWEN_DECLARE_CAST(HorizontalSlider) + GWEN_DECLARE_CAST(DockBase) + GWEN_DECLARE_CAST(MenuItem) + GWEN_DECLARE_CAST(PropertyRow) + GWEN_DECLARE_CAST(WindowControl) + + GWEN_DECLARE_CAST(TreeControl) + GWEN_DECLARE_CAST(TreeNode) + GWEN_DECLARE_CAST(HSVColorPicker) + GWEN_DECLARE_CAST(TabControl) + + GWEN_DECLARE_CAST(TabControlInner) + GWEN_DECLARE_CAST(GroupBox) + GWEN_DECLARE_CAST(Properties) + GWEN_DECLARE_CAST(RadioButton) + GWEN_DECLARE_CAST(LabeledRadioButton) + + + + virtual class ::Gwen::ControlsInternal::Resizer* DynamicCastResizer() { return 0;} + virtual const class ::Gwen::ControlsInternal::Resizer* DynamicCastResizer() const { return 0;} + + + virtual class ::Gwen::ControlsInternal::ColorDisplay* DynamicCastColorDisplay() { return 0;} + virtual const class ::Gwen::ControlsInternal::ColorDisplay* DynamicCastColorDisplay() const { return 0;} + + + + + + typedef std::list List; + + typedef std::map AccelMap; + + Base( Base* pParent ); + virtual ~Base(); + + virtual void DelayedDelete(); + + virtual void SetParent( Controls::Base* pParent ); + virtual Controls::Base* GetParent() const { return m_Parent; } + virtual Controls::Canvas* GetCanvas(); + + virtual Base::List& GetChildren(){ if ( m_InnerPanel ) return m_InnerPanel->GetChildren(); return Children; } + virtual bool IsChild( Controls::Base* pChild ); + virtual int NumChildren(); + virtual bool SizeToChildren( bool w = true, bool h = true ); + virtual Gwen::Point ChildrenSize(); + virtual Controls::Base* FindChildByName( const Gwen::String& name, bool bRecursive = false ); + + virtual void SetName(Gwen::String name) { m_Name = name; } + virtual const Gwen::String& GetName() { return m_Name; } + + virtual void Think(){} + virtual void ExpandAll(){} + virtual void SizeToContents(){} + virtual bool IsActive() { return false;} + + + virtual void AddChild( Controls::Base* pChild ); + + virtual void RemoveChild( Controls::Base* pParent ); + protected: + + + + virtual void OnChildAdded( Controls::Base* pChild ); + virtual void OnChildRemoved( Controls::Base* pChild ); + + public: + + virtual void RemoveAllChildren(); + + virtual void SendToBack( void ); + virtual void BringToFront( void ); + virtual void BringNextToControl( Controls::Base* pChild, bool bBehind ); + + virtual Gwen::Point LocalPosToCanvas( const Gwen::Point& in ); + virtual Gwen::Point CanvasPosToLocal( const Gwen::Point& in ); + + virtual void Dock( int iDock ); + virtual int GetDock(); + + virtual void RestrictToParent( bool restrict ) { m_bRestrictToParent = restrict; } + virtual bool ShouldRestrictToParent() { return m_bRestrictToParent; } + + virtual int X() const { return m_Bounds.x; } + virtual int Y() const { return m_Bounds.y; } + virtual int Width() const { return m_Bounds.w; } + virtual int Height() const { return m_Bounds.h; } + virtual int Bottom() const { return m_Bounds.y + m_Bounds.h + m_Margin.bottom; } + virtual int Right() const { return m_Bounds.x + m_Bounds.w + m_Margin.right; } + + virtual const Margin& GetMargin() const { return m_Margin; } + virtual const Padding& GetPadding() const { return m_Padding; } + + virtual void SetPos( int x, int y ); + virtual void SetWidth( int w ) { SetSize( w, Height()); } + virtual void SetHeight( int h ) { SetSize( Width(), h); } + virtual bool SetSize( int w, int h ); + virtual bool SetBounds( int x, int y, int w, int h ); + virtual bool SetBounds( const Gwen::Rect& bounds ); + + virtual void SetPadding( const Padding& padding ); + virtual void SetMargin( const Margin& margin ); + + // MoveTo is identical to SetPos except it uses ShouldRestrictToParent() + virtual void MoveTo (int x, int y ); + virtual void MoveBy (int x, int y ); + + virtual const Gwen::Rect& GetBounds() const { return m_Bounds; } + + virtual Controls::Base* GetControlAt( int x, int y ); + + + + + protected: + + virtual void OnBoundsChanged( Gwen::Rect oldBounds ); + virtual void OnChildBoundsChanged( Gwen::Rect oldChildBounds, Base* pChild ); + + virtual void OnScaleChanged(); + + public: + + // Innerbounds is the area inside the control that + // doesn't have child controls docked to it. + virtual const Gwen::Rect& GetInnerBounds() const { return m_InnerBounds; } + + protected: + + Gwen::Rect m_InnerBounds; + + public: + + virtual const Gwen::Rect& GetRenderBounds() const{ return m_RenderBounds; } + + protected: + + virtual void UpdateRenderBounds(); + + public: + + virtual void DoRender( Gwen::Skin::Base* skin ); + virtual void DoCacheRender( Gwen::Skin::Base* skin, Gwen::Controls::Base* pMaster ); + + protected: + + virtual void Render( Gwen::Skin::Base* skin ); + virtual void RenderUnder( Gwen::Skin::Base* /*skin*/ ){}; + virtual void RenderOver( Gwen::Skin::Base* /*skin*/ ){}; + virtual void RenderFocus( Gwen::Skin::Base* /*skin*/ ); + + public: + + virtual void SetHidden( bool hidden ) + { + if ( m_bHidden == hidden ) + return; + m_bHidden = hidden; + Invalidate(); + } + virtual bool Hidden() const; // Returns true only if this control is hidden + virtual bool Visible() const; // Returns false if this control or its parents are hidden + virtual void Hide(){ SetHidden( true ); } + virtual void Show(){ SetHidden( false ); } + + //Skin + virtual void SetSkin( Skin::Base* skin, bool doChildren = false ); + virtual Gwen::Skin::Base* GetSkin( void ); + + // Background drawing + virtual bool ShouldDrawBackground(){ return m_bDrawBackground; } + virtual void SetShouldDrawBackground( bool b ){ m_bDrawBackground =b; } + + protected: + + virtual void OnSkinChanged( Gwen::Skin::Base* newSkin ); + + public: + + virtual void OnMouseMoved( int x, int y, int deltaX, int deltaY ); + virtual bool OnMouseWheeled( int iDelta ); + virtual void OnMouseClickLeft( int /*x*/, int /*y*/, bool /*bDown*/ ){}; + virtual void OnMouseClickRight( int /*x*/, int /*y*/, bool /*bDown*/ ){} + virtual void OnMouseDoubleClickLeft( int x, int y ){ OnMouseClickLeft( x, y, true ); }; + virtual void OnMouseDoubleClickRight( int x, int y ){ OnMouseClickRight( x, y, true ); }; + virtual void OnLostKeyboardFocus(){} + virtual void OnKeyboardFocus(){} + + virtual void SetMouseInputEnabled( bool b ) { m_bMouseInputEnabled = b; } + virtual bool GetMouseInputEnabled() { return m_bMouseInputEnabled; } + + virtual void SetKeyboardInputEnabled( bool b ){ m_bKeyboardInputEnabled = b; } + virtual bool GetKeyboardInputEnabled() const { return m_bKeyboardInputEnabled; } + virtual bool NeedsInputChars(){ return false; } + + virtual bool OnChar( Gwen::UnicodeChar /*c*/ ){ return false; } + + virtual bool OnKeyPress( int iKey, bool bPress = true ); + virtual bool OnKeyRelease( int iKey ); + + virtual void OnPaste(Controls::Base* /*pFrom*/){} + virtual void OnCopy(Controls::Base* /*pFrom*/){} + virtual void OnCut(Controls::Base* /*pFrom*/){} + virtual void OnSelectAll(Controls::Base* /*pFrom*/){} + + virtual bool OnKeyTab( bool bDown ); + virtual bool OnKeySpace( bool /*bDown*/ ){ return false; } + virtual bool OnKeyReturn( bool /*bDown*/ ){ return false; } + virtual bool OnKeyBackspace( bool /*bDown*/ ){ return false; } + virtual bool OnKeyDelete( bool /*bDown*/ ){ return false; } + virtual bool OnKeyRight( bool /*bDown*/ ){ return false; } + virtual bool OnKeyLeft( bool /*bDown*/ ){ return false; } + virtual bool OnKeyHome( bool /*bDown*/ ){ return false; } + virtual bool OnKeyEnd( bool /*bDown*/ ){ return false; } + virtual bool OnKeyUp( bool /*bDown*/ ){ return false; } + virtual bool OnKeyDown( bool /*bDown*/ ){ return false; } + virtual bool OnKeyEscape( bool /*bDown*/ ) { return false; } + + virtual void OnMouseEnter(); + virtual void OnMouseLeave(); + virtual bool IsHovered(); + virtual bool ShouldDrawHover(); + + virtual void Touch(); + virtual void OnChildTouched( Controls::Base* pChild ); + + virtual bool IsOnTop(); + + virtual bool HasFocus(); + virtual void Focus(); + virtual void Blur(); + + //Other + virtual void SetDisabled( bool active ) { m_bDisabled = active; } + virtual bool IsDisabled(){ return m_bDisabled; } + + virtual void Redraw(){ m_bCacheTextureDirty = true; if ( m_Parent ) m_Parent->Redraw(); } + virtual void SetCacheToTexture() { m_bCacheToTexture = true; } + virtual bool ShouldCacheToTexture() { return m_bCacheToTexture; } + + virtual void SetCursor( unsigned char c ){ m_Cursor = c; } + virtual void UpdateCursor(); + + virtual Gwen::Point GetMinimumSize(){ return Gwen::Point( 1, 1 ); } + virtual Gwen::Point GetMaximumSize(){ return Gwen::Point( 4096, 4096 ); } + + virtual void SetToolTip( const String& strText ); + virtual void SetToolTip( const UnicodeString& strText ); + virtual void SetToolTip( Base* tooltip ) { m_ToolTip = tooltip; if ( m_ToolTip ){ m_ToolTip->SetParent( this ); m_ToolTip->SetHidden( true ); } } + virtual Base* GetToolTip() { return m_ToolTip; } + + virtual bool IsMenuComponent(); + virtual void CloseMenus(); + + virtual bool IsTabable() { return m_Tabable; } + virtual void SetTabable( bool isTabable ) { m_Tabable = isTabable; } + + + + + //Accelerator functionality + void DefaultAccel( Gwen::Controls::Base* /*pCtrl*/ ) { AcceleratePressed(); } + virtual void AcceleratePressed() {}; + virtual bool AccelOnlyFocus() { return false; } + virtual bool HandleAccelerator( Gwen::UnicodeString& accelerator ); + + template + void AddAccelerator( Gwen::UnicodeString accelerator, T func, Gwen::Event::Handler* handler = NULL ) + { + if ( handler == NULL ) + handler = this; + Gwen::Event::Caller* caller = new Gwen::Event::Caller(); + caller->Add( handler, func ); + m_Accelerators[ accelerator ] = caller; + } + + void AddAccelerator( Gwen::UnicodeString accelerator ) + { + AddAccelerator( accelerator, &Base::DefaultAccel, this ); + } + + AccelMap m_Accelerators; + + // Default Events + + Gwen::Event::Caller onHoverEnter; + Gwen::Event::Caller onHoverLeave; + + // Childrens List + + Base::List Children; + + protected: + + // The logical parent + // It's usually what you expect, the control you've parented it to. + Base* m_Parent; + + // If the innerpanel exists our children will automatically + // become children of that instead of us - allowing us to move + // them all around by moving that panel (useful for scrolling etc) + Base* m_InnerPanel; + + // This is the panel's actual parent - most likely the logical + // parent's InnerPanel (if it has one). You should rarely need this. + Base* m_ActualParent; + + Base* m_ToolTip; + + Skin::Base* m_Skin; + + Gwen::Rect m_Bounds; + Gwen::Rect m_RenderBounds; + Padding m_Padding; + Margin m_Margin; + + Gwen::String m_Name; + + + bool m_bRestrictToParent; + bool m_bDisabled; + bool m_bHidden; + bool m_bMouseInputEnabled; + bool m_bKeyboardInputEnabled; + bool m_bDrawBackground; + + int m_iDock; + + unsigned char m_Cursor; + + bool m_Tabable; + + public: + + bool NeedsLayout(){ return m_bNeedsLayout; } + void Invalidate(); + void InvalidateParent(){ if ( m_Parent ){ m_Parent->Invalidate(); } } + void InvalidateChildren( bool bRecursive = false ); + void Position( int pos, int xpadding = 0, int ypadding = 0 ); + + + protected: + + virtual void RecurseLayout( Skin::Base* skin ); + virtual void Layout( Skin::Base* skin ); + virtual void PostLayout( Skin::Base* /*skin*/ ){}; + + bool m_bNeedsLayout; + bool m_bCacheTextureDirty; + bool m_bCacheToTexture; + + // + // Drag + Drop + public: + + // Giver + + virtual void DragAndDrop_SetPackage( bool bDraggable, const String& strName = "", void* pUserData = NULL ); + virtual bool DragAndDrop_Draggable(); + virtual bool DragAndDrop_ShouldStartDrag(){ return true; } + virtual void DragAndDrop_StartDragging( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + virtual Gwen::DragAndDrop::Package* DragAndDrop_GetPackage( int x, int y ); + virtual void DragAndDrop_EndDragging( bool /*bSuccess*/, int /*x*/, int /*y*/ ){}; + + protected: + + DragAndDrop::Package* m_DragAndDrop_Package; + + public: + + // Receiver + virtual void DragAndDrop_HoverEnter( Gwen::DragAndDrop::Package* /*pPackage*/, int /*x*/, int /*y*/ ){ } + virtual void DragAndDrop_HoverLeave( Gwen::DragAndDrop::Package* /*pPackage*/ ){ } + virtual void DragAndDrop_Hover( Gwen::DragAndDrop::Package* /*pPackage*/, int /*x*/, int /*y*/ ){}; + virtual bool DragAndDrop_HandleDrop( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + virtual bool DragAndDrop_CanAcceptPackage( Gwen::DragAndDrop::Package* /*pPackage*/ ){ return false; } + + + // + // This is to be used by the client implementation + // NOT HOOKS ETC. + // + public: + + void* GetUserData(){ return m_pUserData; } + void SetUserData( void* pData ){ m_pUserData = pData; } + + private: + + void* m_pUserData; + + // + // Useful anim shortcuts + // + public: + #ifndef GWEN_NO_ANIMATION + + virtual void Anim_WidthIn( float fLength, float fDelay = 0.0f, float fEase = 1.0f ); + virtual void Anim_HeightIn( float fLength, float fDelay = 0.0f, float fEase = 1.0f ); + virtual void Anim_WidthOut( float fLength, bool bHide = true, float fDelay = 0.0f, float fEase = 1.0f ); + virtual void Anim_HeightOut( float fLength, bool bHide = true, float fDelay = 0.0f, float fEase = 1.0f ); + + #endif + + }; + + } +} + +// To be placed in the controls .h definition. +#define GWEN_CONTROL( ThisName, BaseName )\ + public:\ + typedef BaseName BaseClass;\ + typedef ThisName ThisClass;\ + GWEN_IMPLEMENT_CAST(ThisName);\ + ThisName( Gwen::Controls::Base* pParent ) + +#define GWEN_CONTROL_INLINE( ThisName, BaseName )\ + GWEN_CONTROL( ThisName, BaseName ) : BaseClass( pParent ) + +#define GWEN_CONTROL_CONSTRUCTOR( ThisName )\ + ThisName::ThisName( Gwen::Controls::Base* pParent ) : BaseClass( pParent ) + +#endif diff --git a/btgui/Gwen/Controls/Button.cpp b/btgui/Gwen/Controls/Button.cpp new file mode 100644 index 000000000..702e0c3d0 --- /dev/null +++ b/btgui/Gwen/Controls/Button.cpp @@ -0,0 +1,169 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/ImagePanel.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + +GWEN_CONTROL_CONSTRUCTOR( Button ) +{ + m_Image = NULL; + m_bDepressed = false; + m_bCenterImage = false; + + SetSize( 100, 20 ); + SetMouseInputEnabled( true ); + SetIsToggle( false ); + SetAlignment( Gwen::Pos::Center ); + SetTextPadding( Padding( 3, 0, 3, 0 ) ); + m_bToggleStatus = false; + SetKeyboardInputEnabled( false ); + SetTabable( false ); +} + +void Button::Render( Skin::Base* skin ) +{ + if ( ShouldDrawBackground() ) + { + bool bDrawDepressed = IsDepressed() && IsHovered(); + if ( IsToggle() ) bDrawDepressed = bDrawDepressed || GetToggleState(); + + bool bDrawHovered = IsHovered() && ShouldDrawHover(); + + skin->DrawButton( this, bDrawDepressed, bDrawHovered ); + } +} + +void Button::OnMouseClickLeft( int /*x*/, int /*y*/, bool bDown ) +{ + if ( bDown ) + { + m_bDepressed = true; + Gwen::MouseFocus = this; + onDown.Call( this ); + } + else + { + if ( IsHovered() && m_bDepressed ) + { + OnPress(); + } + + m_bDepressed = false; + Gwen::MouseFocus = NULL; + onUp.Call( this ); + } + + Redraw(); +} + +void Button::OnPress() +{ + if ( IsToggle() ) + { + SetToggleState( !GetToggleState() ); + } + + onPress.Call( this ); +} + + +void Button::SetImage( const TextObject& strName, bool bCenter ) +{ + if ( strName.GetUnicode() == L"" ) + { + if ( m_Image ) + { + delete m_Image; + m_Image= NULL; + } + + return; + } + + if ( !m_Image ) + { + m_Image = new ImagePanel( this ); + } + + m_Image->SetImage( strName ); + m_Image->SizeToContents(); + m_Image->SetPos( m_Padding.left, 2 ); + m_bCenterImage = bCenter; + + int IdealTextPadding = m_Image->Right() + m_Padding.left + 4; + if ( m_rTextPadding.left < IdealTextPadding ) + { + m_rTextPadding.left = IdealTextPadding; + } +} + +void Button::SetToggleState( bool b ) +{ + if ( m_bToggleStatus == b ) return; + + m_bToggleStatus = b; + + onToggle.Call( this ); + + if ( m_bToggleStatus ) + { + onToggleOn.Call( this ); + } + else + { + onToggleOff.Call( this ); + } +} + +void Button::SizeToContents() +{ + BaseClass::SizeToContents(); + + if ( m_Image ) + { + int height = m_Image->Height() + 4; + if ( Height() < height ) + { + SetHeight( height ); + } + } +} + +bool Button::OnKeySpace( bool bDown ) +{ + OnMouseClickLeft( 0, 0, bDown ); + return true; +} + +void Button::AcceleratePressed() +{ + OnPress(); +} + +void Button::Layout( Skin::Base* pSkin ) +{ + BaseClass::Layout( pSkin ); + if ( m_Image ) + { + Gwen::Align::CenterVertically( m_Image ); + + if ( m_bCenterImage ) + Gwen::Align::CenterHorizontally( m_Image ); + } +} + +void Button::OnMouseDoubleClickLeft( int x, int y ) +{ + OnMouseClickLeft( x, y, true ); + onDoubleClick.Call( this ); +}; \ No newline at end of file diff --git a/btgui/Gwen/Controls/Button.h b/btgui/Gwen/Controls/Button.h new file mode 100644 index 000000000..c4e35a85c --- /dev/null +++ b/btgui/Gwen/Controls/Button.h @@ -0,0 +1,79 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_BUTTON_H +#define GWEN_CONTROLS_BUTTON_H + +#include "Gwen/TextObject.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" + +namespace Gwen +{ + namespace Controls + { + class ImagePanel; + + class GWEN_EXPORT Button : public Label + { + public: + + GWEN_CONTROL( Button, Label ); + + virtual void Render( Skin::Base* skin ); + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + virtual void OnMouseDoubleClickLeft( int x, int y ); + virtual bool OnKeySpace( bool bDown ); + + virtual void OnPress(); + + virtual void AcceleratePressed(); + + virtual bool IsDepressed() const { return m_bDepressed; } + + // + // Buttons can be toggle type, which means that it is + // toggled on and off. Its toggle status is in IsDepressed. + // + virtual void SetIsToggle( bool b ){ m_bToggle = b; } + virtual bool IsToggle() const { return m_bToggle; } + virtual bool GetToggleState() const { return m_bToggleStatus; } + virtual void SetToggleState( bool b ); + virtual void Toggle(){ SetToggleState( !GetToggleState() ); } + + + virtual void SetImage( const TextObject& strName, bool bCenter = false ); + + // You can use this to trigger OnPress directly from other controls using GWEN_CALL_EX + virtual void ReceiveEventPress( Base* /*pControl*/ ){ OnPress(); } + + virtual void SizeToContents(); + virtual void Layout( Skin::Base* pSkin ); + + public: + + Gwen::Event::Caller onPress; + Gwen::Event::Caller onDown; + Gwen::Event::Caller onUp; + Gwen::Event::Caller onDoubleClick; + Gwen::Event::Caller onToggle; + Gwen::Event::Caller onToggleOn; + Gwen::Event::Caller onToggleOff; + + protected: + + ImagePanel* m_Image; + + bool m_bDepressed; + bool m_bToggle; + bool m_bToggleStatus; + + bool m_bCenterImage; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Canvas.cpp b/btgui/Gwen/Controls/Canvas.cpp new file mode 100644 index 000000000..6860634d9 --- /dev/null +++ b/btgui/Gwen/Controls/Canvas.cpp @@ -0,0 +1,233 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Canvas.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Menu.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/ToolTip.h" + +#ifndef GWEN_NO_ANIMATION +#include "Gwen/Anim.h" +#endif + +using namespace Gwen::Controls; + + +Canvas::Canvas( Gwen::Skin::Base* pSkin ) : BaseClass( NULL ), m_bAnyDelete( false ) +{ + SetBounds( 0, 0, 10000, 10000 ); + SetSkin( pSkin ); + SetScale( 1.0f ); + SetBackgroundColor( Color( 255, 255, 255, 255 ) ); + SetDrawBackground( false ); +} + +void Canvas::RenderCanvas() +{ + DoThink(); + + Gwen::Renderer::Base* render = m_Skin->GetRender(); + render->Begin(); + + + RecurseLayout( m_Skin ); + + render->SetClipRegion( GetBounds() ); + render->SetRenderOffset( Gwen::Point( 0, 0 ) ); + render->SetScale( Scale() ); + + if ( m_bDrawBackground ) + { + render->SetDrawColor( m_BackgroundColor ); + render->DrawFilledRect( GetRenderBounds() ); + } + + DoRender( m_Skin ); + + DragAndDrop::RenderOverlay( this, m_Skin ); + + ToolTip::RenderToolTip( m_Skin ); + + render->EndClip(); + + render->End(); + ProcessDelayedDeletes(); + +} + +void Canvas::Render( Gwen::Skin::Base* /*pRender*/ ) +{ + m_bNeedsRedraw = false; +} + +void Canvas::OnBoundsChanged( Gwen::Rect oldBounds ) +{ + BaseClass::OnBoundsChanged( oldBounds ); + InvalidateChildren( true ); +} + + +void Canvas::DoThink() +{ + if ( Hidden() ) return; + + #ifndef GWEN_NO_ANIMATION + Gwen::Anim::Think(); + #endif + + // Reset tabbing + { + NextTab = NULL; + FirstTab = NULL; + } + + ProcessDelayedDeletes(); + // Check has focus etc.. + RecurseLayout( m_Skin ); + + // If we didn't have a next tab, cycle to the start. + if ( NextTab == NULL ) + NextTab = FirstTab; + + Gwen::Input::OnCanvasThink( this ); + +} + +void Canvas::SetScale( float f ) +{ + if ( m_fScale == f ) return; + + m_fScale = f; + + if ( m_Skin && m_Skin->GetRender() ) + m_Skin->GetRender()->SetScale( m_fScale ); + + OnScaleChanged(); + Redraw(); +} + +void Canvas::AddDelayedDelete( Gwen::Controls::Base* pControl ) +{ + if ( !m_bAnyDelete || m_DeleteSet.find( pControl ) == m_DeleteSet.end() ) + { + m_bAnyDelete = true; + m_DeleteSet.insert( pControl ); + m_DeleteList.push_back( pControl ); + } +} + +void Canvas::PreDelete( Controls::Base * pControl ) +{ + if ( m_bAnyDelete ) + { + std::set< Controls::Base * >::iterator itFind; + if ( ( itFind = m_DeleteSet.find( pControl ) ) != m_DeleteSet.end() ) + { + m_DeleteList.remove( pControl ); + m_DeleteSet.erase( pControl ); + m_bAnyDelete = !m_DeleteSet.empty(); + } + } +} + +void Canvas::ProcessDelayedDeletes() +{ + while( m_bAnyDelete ) + { + m_bAnyDelete = false; + + Controls::Base::List deleteList = m_DeleteList; + + m_DeleteList.clear(); + m_DeleteSet.clear(); + + for ( Gwen::Controls::Base::List::iterator it = deleteList.begin(); it != deleteList.end(); ++it ) + { + Gwen::Controls::Base* pControl = *it; + delete pControl; + } + } +} + +void Canvas::Release() +{ + Base::List::iterator iter = Children.begin(); + while ( iter != Children.end() ) + { + Base* pChild = *iter; + iter = Children.erase( iter ); + delete pChild; + } + + delete this; +} + +bool Canvas::InputMouseMoved( int x, int y, int deltaX, int deltaY ) +{ + if ( Hidden() ) return false; + + // Todo: Handle scaling here.. + //float fScale = 1.0f / Scale(); + + Gwen::Input::OnMouseMoved( this, x, y, deltaX, deltaY ); + + if ( !Gwen::HoveredControl ) return false; + if ( Gwen::HoveredControl == this ) return false; + if ( Gwen::HoveredControl->GetCanvas() != this ) return false; + + Gwen::HoveredControl->OnMouseMoved( x, y, deltaX, deltaY ); + Gwen::HoveredControl->UpdateCursor(); + + DragAndDrop::OnMouseMoved( Gwen::HoveredControl, x, y ); + return true; +} + +bool Canvas::InputMouseButton( int iButton, bool bDown ) +{ + if ( Hidden() ) return false; + + return Gwen::Input::OnMouseClicked( this, iButton, bDown ); +} + +bool Canvas::InputKey( int iKey, bool bDown ) +{ + if ( Hidden() ) return false; + if ( iKey <= Gwen::Key::Invalid ) return false; + if ( iKey >= Gwen::Key::Count ) return false; + + return Gwen::Input::OnKeyEvent( this, iKey, bDown ); +} + +bool Canvas::InputCharacter( Gwen::UnicodeChar chr ) +{ + if ( Hidden() ) return false; + if ( !iswprint( chr ) ) return false; + + //Handle Accelerators + if ( Gwen::Input::HandleAccelerator( this, chr ) ) + return true; + + //Handle characters + if ( !Gwen::KeyboardFocus ) return false; + if ( Gwen::KeyboardFocus->GetCanvas() != this ) return false; + if ( !Gwen::KeyboardFocus->Visible() ) return false; + if ( Gwen::Input::IsControlDown() ) return false; + + return KeyboardFocus->OnChar( chr ); +} + +bool Canvas::InputMouseWheel( int val ) +{ + if ( Hidden() ) return false; + if ( !Gwen::HoveredControl ) return false; + if ( Gwen::HoveredControl == this ) return false; + if ( Gwen::HoveredControl->GetCanvas() != this ) return false; + + return Gwen::HoveredControl->OnMouseWheeled( val ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Canvas.h b/btgui/Gwen/Controls/Canvas.h new file mode 100644 index 000000000..6523d64e5 --- /dev/null +++ b/btgui/Gwen/Controls/Canvas.h @@ -0,0 +1,107 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_CANVAS_H +#define GWEN_CONTROLS_CANVAS_H + +#include +#include "Gwen/Controls/Base.h" +#include "Gwen/InputHandler.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT Canvas : public Base + { + public: + + typedef Controls::Base BaseClass; + + Canvas( Skin::Base* pSkin ); + + // + // For additional initialization + // (which is sometimes not appropriate in the constructor) + // + virtual void Initialize(){}; + + // + // You should call this to render your canvas. + // + virtual void RenderCanvas(); + + // + // Call this whenever you want to process input. This + // is usually once a frame.. + // + virtual void DoThink(); + + // + // In most situations you will be rendering the canvas + // every frame. But in some situations you will only want + // to render when there have been changes. You can do this + // by checking NeedsRedraw(). + // + virtual bool NeedsRedraw(){ return m_bNeedsRedraw; } + virtual void Redraw(){ m_bNeedsRedraw = true; } + + // Internal. Do not call directly. + virtual void Render( Skin::Base* pRender ); + + // Childpanels call parent->GetCanvas() until they get to + // this top level function. + virtual Controls::Canvas* GetCanvas(){ return this; } + + virtual void SetScale( float f ); + virtual float Scale() const { return m_fScale; } + + virtual void OnBoundsChanged( Gwen::Rect oldBounds ); + + // + // Call this to delete the canvas, and its children + // in the right order. + // + virtual void Release(); + + // Delayed deletes + virtual void AddDelayedDelete( Controls::Base* pControl ); + virtual void ProcessDelayedDeletes(); + + Controls::Base* FirstTab; + Controls::Base* NextTab; + + // Input + virtual bool InputMouseMoved( int x, int y, int deltaX, int deltaY ); + virtual bool InputMouseButton( int iButton, bool bDown ); + virtual bool InputKey( int iKey, bool bDown ); + virtual bool InputCharacter( Gwen::UnicodeChar chr ); + virtual bool InputMouseWheel( int val ); + + // Background + virtual void SetBackgroundColor( const Gwen::Color& color ){ m_BackgroundColor = color; } + virtual void SetDrawBackground( bool bShouldDraw ){ m_bDrawBackground = bShouldDraw; } + + private: + + bool m_bNeedsRedraw; + bool m_bAnyDelete; + float m_fScale; + + Controls::Base::List m_DeleteList; + std::set< Controls::Base* > m_DeleteSet; + friend class Controls::Base; + void PreDelete( Controls::Base * ); + + bool m_bDrawBackground; + Gwen::Color m_BackgroundColor; + + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/CheckBox.cpp b/btgui/Gwen/Controls/CheckBox.cpp new file mode 100644 index 000000000..ab25a832d --- /dev/null +++ b/btgui/Gwen/Controls/CheckBox.cpp @@ -0,0 +1,57 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/CheckBox.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + + +GWEN_CONTROL_CONSTRUCTOR( CheckBox ) +{ + SetSize( 13, 13 ); + + m_bChecked = true; + Toggle(); +} + + +void CheckBox::Render( Skin::Base* skin ) +{ + skin->DrawCheckBox( this, m_bChecked, IsDepressed() ); +} + +void CheckBox::OnPress() +{ + if ( IsChecked() && !AllowUncheck() ) + return; + + Toggle(); +} + +void CheckBox::OnCheckStatusChanged() +{ + if ( IsChecked() ) + { + onChecked.Call( this ); + } + else + { + onUnChecked.Call( this ); + } + + onCheckChanged.Call( this ); +} + +void CheckBox::SetChecked( bool bChecked ) +{ + if ( m_bChecked == bChecked ) return; + + m_bChecked = bChecked; + OnCheckStatusChanged(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/CheckBox.h b/btgui/Gwen/Controls/CheckBox.h new file mode 100644 index 000000000..e4fba1ec3 --- /dev/null +++ b/btgui/Gwen/Controls/CheckBox.h @@ -0,0 +1,82 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_CHECKBOX_H +#define GWEN_CONTROLS_CHECKBOX_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Symbol.h" +#include "Gwen/Controls/LabelClickable.h" + +namespace Gwen +{ + namespace Controls + { + + class GWEN_EXPORT CheckBox : public Button + { + public: + + GWEN_CONTROL( CheckBox, Button ); + + virtual void Render( Skin::Base* skin ); + virtual void OnPress(); + + virtual void SetChecked( bool Checked ); + virtual void Toggle() { SetChecked( !IsChecked() ); } + virtual bool IsChecked() { return m_bChecked; } + + Gwen::Event::Caller onChecked; + Gwen::Event::Caller onUnChecked; + Gwen::Event::Caller onCheckChanged; + + private: + + // For derived controls + virtual bool AllowUncheck(){ return true; } + + void OnCheckStatusChanged(); + + bool m_bChecked; + }; + + class GWEN_EXPORT CheckBoxWithLabel : public Base + { + public: + + GWEN_CONTROL_INLINE( CheckBoxWithLabel, Base ) + { + SetSize( 200, 19 ); + + m_Checkbox = new CheckBox( this ); + m_Checkbox->Dock( Pos::Left ); + m_Checkbox->SetMargin( Margin( 0, 3, 3, 3 ) ); + m_Checkbox->SetTabable( false ); + + m_Label = new LabelClickable( this ); + m_Label->Dock( Pos::Fill ); + m_Label->onPress.Add( m_Checkbox, &CheckBox::ReceiveEventPress ); + m_Label->SetTabable( false ); + + SetTabable( false ); + } + + virtual CheckBox* Checkbox() { return m_Checkbox; } + virtual LabelClickable* Label() { return m_Label; } + virtual bool OnKeySpace( bool bDown ) { if ( bDown ) m_Checkbox->SetChecked( !m_Checkbox->IsChecked() ); return true; } + + private: + + CheckBox* m_Checkbox; + LabelClickable* m_Label; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ColorControls.cpp b/btgui/Gwen/Controls/ColorControls.cpp new file mode 100644 index 000000000..532b3ed14 --- /dev/null +++ b/btgui/Gwen/Controls/ColorControls.cpp @@ -0,0 +1,326 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Utility.h" +#include "Gwen/Controls/ColorControls.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +//Find a place to put these... +Color HSVToColor( float h, float s, float v ) +{ + if (h < 0.0f) h += 360.0f; + if (h > 360.0f) h -= 360.0f; + + s *= 255.0f; + v *= 255.0f; + + float r, g, b; + + if (!h && !s) + { + r = g = b = v; + } + double min,max,delta,hue; + + max = v; + delta = (max * s)/255.0; + min = max - delta; + + hue = h; + if (h > 300 || h <= 60) + { + r = (int)max; + if (h > 300) + { + g = (int)min; + hue = (hue - 360.0)/60.0; + b = (int)((hue * delta - min) * -1); + } + else + { + b = (int)min; + hue = hue / 60.0; + g = (int)(hue * delta + min); + } + } + else if (h > 60 && h < 180) + { + g = (int)max; + if (h < 120) + { + b = (int)min; + hue = (hue/60.0 - 2.0 ) * delta; + r = (int)(min - hue); + } + else + { + r = (int)min; + hue = (hue/60 - 2.0) * delta; + b = (int)(min + hue); + } + } + else + { + b = (int)max; + if (h < 240) + { + r = (int)min; + hue = (hue/60.0 - 4.0 ) * delta; + g = (int)(min - hue); + } + else + { + g = (int)min; + hue = (hue/60 - 4.0) * delta; + r = (int)(min + hue); + } + } + + return Color( r, g, b, 255); +} + +HSV RGBtoHSV( int r, int g, int b ) +{ + double min,max,delta,temp; + min = GwenUtil_Min(r,GwenUtil_Min(g,b)); + max = GwenUtil_Max(r,GwenUtil_Max(g,b)); + delta = max - min; + + HSV hsv; + hsv.v = (int)max; + if (!delta) + { + hsv.h = hsv.s = 0; + } + else + { + temp = delta/max; + hsv.s = (int)(temp*255); + + if (r == (int)max) + { + temp = (double)(g-b)/delta; + } + else + if (g == (int)max) + { + temp = 2.0 + ((double)(b-r)/delta); + } + else + { + temp = 4.0 + ((double)(r-g)/delta); + } + temp *= 60; + if (temp < 0) + { + temp+=360; + } + if (temp == 360) + { + temp = 0; + } + hsv.h = (int)temp; + } + + + hsv.s /= 255.0f; + hsv.v /= 255.0f; + + return hsv; +} + + +GWEN_CONTROL_CONSTRUCTOR( ColorLerpBox ) +{ + SetColor( Gwen::Color(255, 128, 0, 255) ); + SetSize( 128, 128 ); + SetMouseInputEnabled( true ); + m_bDepressed = false; +} + +//Find a place to put this? color member? +Gwen::Color LerpColor( Gwen::Color &toColor, Gwen::Color &fromColor, float amount ) +{ + Gwen::Color colorDelta = toColor - fromColor; + + colorDelta.r *= amount; + colorDelta.g *= amount; + colorDelta.b *= amount; + + Gwen::Color newColor = fromColor + colorDelta; + return newColor; +} + +Gwen::Color ColorLerpBox::GetSelectedColor() +{ + return GetColorAtPos( cursorPos.x, cursorPos.y ); +} + +void ColorLerpBox::SetColor( Gwen::Color color, bool onlyHue ) +{ + HSV hsv = RGBtoHSV(color.r, color.g, color.b); + m_Hue = hsv.h; + if ( !onlyHue ) + { + cursorPos.x = hsv.s * Width(); + cursorPos.y = (1 - hsv.v) * Height(); + } + + onSelectionChanged.Call( this ); +} + +void ColorLerpBox::OnMouseMoved( int x, int y, int /*deltaX*/, int /*deltaY*/ ) +{ + if ( m_bDepressed ) + { + cursorPos = CanvasPosToLocal( Gwen::Point( x, y ) ); + //Do we have clamp? + if ( cursorPos.x < 0) + cursorPos.x = 0; + if (cursorPos.x > Width()) + cursorPos.x = Width(); + + if (cursorPos.y < 0) + cursorPos.y = 0; + if (cursorPos.y > Height()) + cursorPos.y = Height(); + + onSelectionChanged.Call( this ); + } +} + +void ColorLerpBox::OnMouseClickLeft( int x, int y, bool bDown ) +{ + m_bDepressed = bDown; + if ( bDown ) + Gwen::MouseFocus = this; + else + Gwen::MouseFocus = NULL; + + OnMouseMoved( x, y, 0, 0); +} + +Gwen::Color ColorLerpBox::GetColorAtPos( int x, int y ) +{ + float xPercent = ( (float)x / (float)Width() ); + float yPercent = 1 - ( (float)y / (float)Height() ); + + Gwen::Color result = HSVToColor( m_Hue, xPercent, yPercent ); + + result.a = 255; + + return result; +} +void ColorLerpBox::Render( Gwen::Skin::Base* skin ) +{ + //Is there any way to move this into skin? Not for now, no idea how we'll "actually" render these + BaseClass::Render( skin ); + for ( int x = 0; xGetRender()->SetDrawColor( GetColorAtPos( x, y ) ); + skin->GetRender()->DrawPixel( x, y ); + } + } + + skin->GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + skin->GetRender()->DrawLinedRect( GetRenderBounds() ); + + Gwen::Color selected = GetSelectedColor(); + if ( (selected.r + selected.g + selected.b) / 3 < 170 ) + skin->GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 255 ) ); + else + skin->GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + + Gwen::Rect testRect = Gwen::Rect( cursorPos.x -3, cursorPos.y -3, 6, 6); + + skin->GetRender()->DrawShavedCornerRect( testRect ); +} + + + + + +GWEN_CONTROL_CONSTRUCTOR( ColorSlider ) +{ + SetSize( 32, 128 ); + SetMouseInputEnabled( true ); + m_bDepressed = false; +} + +void ColorSlider::Render( Gwen::Skin::Base* skin ) +{ + //Is there any way to move this into skin? Not for now, no idea how we'll "actually" render these + int y = 0; + for ( y = 0; y < Height(); y++) + { + float yPercent = (float)y / (float)Height(); + skin->GetRender()->SetDrawColor( HSVToColor( yPercent * 360, 1, 1 ) ); + skin->GetRender()->DrawFilledRect( Gwen::Rect( 5, y, Width() - 10, 1 ) ); + } + + int drawHeight = m_iSelectedDist - 3; + + //Draw our selectors + skin->GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 255 )); + skin->GetRender()->DrawFilledRect( Gwen::Rect( 0, drawHeight + 2, Width(), 1)); + skin->GetRender()->DrawFilledRect( Gwen::Rect( 0, drawHeight, 5, 5) ); + skin->GetRender()->DrawFilledRect( Gwen::Rect( Width() - 5, drawHeight, 5, 5) ); + skin->GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 255 ) ); + skin->GetRender()->DrawFilledRect( Gwen::Rect( 1, drawHeight + 1, 3, 3 ) ); + skin->GetRender()->DrawFilledRect( Gwen::Rect( Width() - 4, drawHeight + 1, 3, 3 ) ); +} + +void ColorSlider::OnMouseClickLeft( int x, int y, bool bDown ) +{ + m_bDepressed = bDown; + if ( bDown) + Gwen::MouseFocus = this; + else + Gwen::MouseFocus = NULL; + + OnMouseMoved(x, y, 0, 0); +} + +Gwen::Color ColorSlider::GetColorAtHeight( int y ) +{ + float yPercent = (float)y / (float)Height(); + return HSVToColor( yPercent * 360, 1, 1); + +} +void ColorSlider::OnMouseMoved( int x, int y, int /*deltaX*/, int /*deltaY*/ ) +{ + if ( m_bDepressed ) + { + Gwen::Point cursorPos = CanvasPosToLocal( Gwen::Point( x, y ) ); + + if (cursorPos.y < 0) + cursorPos.y = 0; + if (cursorPos.y > Height()) + cursorPos.y = Height(); + + m_iSelectedDist = cursorPos.y; + onSelectionChanged.Call( this ); + } +} + +void ColorSlider::SetColor( Gwen::Color color) +{ + HSV hsv = RGBtoHSV( color.r, color.g, color.b ); + + m_iSelectedDist = hsv.h / 360 * Height(); + + onSelectionChanged.Call( this ); +} + +Gwen::Color ColorSlider::GetSelectedColor() +{ + return GetColorAtHeight( m_iSelectedDist ); +} diff --git a/btgui/Gwen/Controls/ColorControls.h b/btgui/Gwen/Controls/ColorControls.h new file mode 100644 index 000000000..c0a565509 --- /dev/null +++ b/btgui/Gwen/Controls/ColorControls.h @@ -0,0 +1,61 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_COLORCONTROLS_H +#define GWEN_CONTROLS_COLORCONTROLS_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + + +namespace Gwen +{ + namespace Controls + { + + class GWEN_EXPORT ColorLerpBox : public Controls::Base + { + public: + GWEN_CONTROL( ColorLerpBox, Controls::Base ); + virtual void Render( Gwen::Skin::Base* skin ); + Gwen::Color GetColorAtPos(int x, int y ); + void SetColor( Gwen::Color color, bool onlyHue = true ); + virtual void OnMouseMoved( int x, int y, int deltaX, int deltaY ); + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + Gwen::Color GetSelectedColor(); + + Event::Caller onSelectionChanged; + protected: + Gwen::Point cursorPos; + bool m_bDepressed; + int m_Hue; + + }; + + class GWEN_EXPORT ColorSlider : public Controls::Base + { + public: + GWEN_CONTROL( ColorSlider, Controls::Base ); + virtual void Render( Gwen::Skin::Base* skin ); + virtual void OnMouseMoved( int x, int y, int deltaX, int deltaY ); + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + Gwen::Color GetSelectedColor(); + Gwen::Color GetColorAtHeight(int y ); + void SetColor( Gwen::Color color ); + + Event::Caller onSelectionChanged; + + protected: + int m_iSelectedDist; + bool m_bDepressed; + + }; + } + +} +#endif diff --git a/btgui/Gwen/Controls/ColorPicker.cpp b/btgui/Gwen/Controls/ColorPicker.cpp new file mode 100644 index 000000000..8ba03da72 --- /dev/null +++ b/btgui/Gwen/Controls/ColorPicker.cpp @@ -0,0 +1,222 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ColorPicker.h" +#include "Gwen/Controls/HorizontalSlider.h" +#include "Gwen/Controls/GroupBox.h" +#include "Gwen/Controls/TextBox.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + +GWEN_CONTROL_CONSTRUCTOR( ColorPicker ) +{ + SetMouseInputEnabled( true ); + + SetSize( 256, 150 ); + CreateControls(); + SetColor( Gwen::Color( 50, 60, 70, 255 ) ); +} + +void ColorPicker::CreateColorControl( Gwen::String name, int y ) +{ + int colorSize = 12; + + GroupBox* colorGroup = new GroupBox( this ); + colorGroup->SetPos( 10, y ); + colorGroup->SetText( name ); + colorGroup->SetSize( 160, 35 ); + colorGroup->SetName( name + "groupbox" ); + + ColorDisplay* disp = new ColorDisplay( colorGroup ); + disp->SetName(name); + disp->SetBounds( 0 , 10, colorSize, colorSize ); + + TextBoxNumeric* numeric = new TextBoxNumeric( colorGroup ); + numeric->SetName( name + "Box" ); + numeric->SetPos( 105, 7 ); + numeric->SetSize( 26, 16 ); + numeric->SetSelectAllOnFocus( true ); + numeric->onTextChanged.Add( this, &ColorPicker::NumericTyped ); + + HorizontalSlider* slider = new HorizontalSlider( colorGroup ); + slider->SetPos( colorSize + 5 , 10 ); + slider->SetRange( 0, 255 ); + slider->SetSize( 80, colorSize ); + slider->SetName( name + "Slider"); + slider->onValueChanged.Add( this, &ColorPicker::SlidersMoved ); +} + +void ColorPicker::NumericTyped( Gwen::Controls::Base* control ) +{ + if (!control) + return; + + TextBoxNumeric* box = control->DynamicCastTextBoxNumeric(); + if (!box) + return; + + if ( box->GetText() == L"") + return; + + int textValue = atoi( Utility::UnicodeToString( box->GetText()).c_str() ); + if ( textValue < 0) textValue = 0; + if ( textValue > 255) textValue = 255; + + if ( box->GetName().find("Red") != Gwen::String::npos ) + SetRed( textValue ); + + if ( box->GetName().find("Green") != Gwen::String::npos ) + SetGreen( textValue ); + + if ( box->GetName().find("Blue") != Gwen::String::npos ) + SetBlue( textValue ); + + if ( box->GetName().find("Alpha") != Gwen::String::npos ) + SetAlpha( textValue ); + + UpdateControls(); +} + +void ColorPicker::SetColor( Gwen::Color color ) +{ + m_Color = color; + UpdateControls(); +} + +void ColorPicker::CreateControls() +{ + int startY = 5; + int height = 35; + + CreateColorControl( "Red", startY ); + CreateColorControl( "Green", startY + height ); + CreateColorControl( "Blue", startY + height * 2 ); + CreateColorControl( "Alpha", startY + height * 3 ); + + GroupBox* finalGroup = new GroupBox( this ); + finalGroup->SetPos( 180, 40 ); + finalGroup->SetSize( 60, 60 ); + finalGroup->SetText( "Result" ); + finalGroup->SetName( "ResultGroupBox" ); + + + ColorDisplay* disp = new ColorDisplay( finalGroup ); + disp->SetName( "Result" ); + disp->SetBounds( 0 , 10, 32, 32 ); + disp->SetDrawCheckers( true ); + + //UpdateControls(); +} + +void ColorPicker::UpdateColorControls( Gwen::String name, Gwen::Color col, int sliderVal ) +{ + Base* el = FindChildByName( name, true ); + + ColorDisplay* disp = el ? el->DynamicCastColorDisplay() : 0; + disp->SetColor( col ); + + HorizontalSlider* slider = FindChildByName( name + "Slider", true )->DynamicCastHorizontalSlider(); + slider->SetValue( sliderVal ); + + TextBoxNumeric* box = FindChildByName( name + "Box", true )->DynamicCastTextBoxNumeric(); + box->SetText( Gwen::Utility::ToString( sliderVal ) ); +} + +void ColorPicker::UpdateControls() +{ + + //This is a little weird, but whatever for now + UpdateColorControls( "Red", Color( GetColor().r, 0, 0, 255 ), GetColor().r ); + UpdateColorControls( "Green", Color( 0, GetColor().g, 0, 255 ), GetColor().g ); + UpdateColorControls( "Blue", Color( 0, 0, GetColor().b, 255 ), GetColor().b ); + UpdateColorControls( "Alpha", Color( 255, 255, 255, GetColor().a ), GetColor().a ); + + ColorDisplay* disp = FindChildByName( "Result", true )->DynamicCastColorDisplay(); + disp->SetColor( Color( GetColor().r, GetColor().g, GetColor().b, GetColor().a ) ); + + onColorChanged.Call( this ); +} +void ColorPicker::SlidersMoved( Gwen::Controls::Base* control ) +{ + + HorizontalSlider* slider = control->DynamicCastHorizontalSlider(); + if (slider) + SetColorByName( GetColorFromName( slider->GetName() ), slider->GetValue() ); + + UpdateControls(); + //SetColor( Gwen::Color( redSlider->GetValue(), greenSlider->GetValue(), blueSlider->GetValue(), alphaSlider->GetValue() ) ); +} + +void ColorPicker::Layout( Skin::Base* skin ) +{ + BaseClass::Layout( skin ); + + SizeToChildren( false, true ); + SetSize( Width(), Height() + 5 ); + + GroupBox* groupBox = FindChildByName( "ResultGroupBox", true )->DynamicCastGroupBox(); + if ( groupBox ) + groupBox->SetPos( groupBox->X(), Height() * 0.5f - groupBox->Height() * 0.5f ); + + UpdateControls(); +} + + +void ColorPicker::Render( Skin::Base* skin ) +{ + skin->DrawBackground( this ); +} + +int ColorPicker::GetColorByName( Gwen::String colorName ) +{ + if ( colorName == "Red") + return GetColor().r; + else if ( colorName == "Green") + return GetColor().g; + else if ( colorName == "Blue") + return GetColor().b; + else if ( colorName == "Alpha") + return GetColor().a; + else + return 0; +} + +Gwen::String ColorPicker::GetColorFromName( Gwen::String name ) +{ + if ( name.find("Red") != Gwen::String::npos ) + return "Red"; + if ( name.find("Green") != Gwen::String::npos ) + return "Green"; + if ( name.find("Blue") != Gwen::String::npos ) + return "Blue"; + if ( name.find("Alpha") != Gwen::String::npos ) + return "Alpha"; + else + return ""; +} + +void ColorPicker::SetColorByName( Gwen::String colorName, int colorValue ) +{ + if ( colorName == "Red") + SetRed( colorValue ); + else if ( colorName == "Green") + SetGreen( colorValue ); + else if ( colorName == "Blue") + SetBlue( colorValue ); + else if ( colorName == "Alpha") + SetAlpha( colorValue ); +} + +void ColorPicker::SetAlphaVisible( bool visible ) +{ + GroupBox* groupBox = FindChildByName( "Alphagroupbox", true )->DynamicCastGroupBox(); + groupBox->SetHidden( !visible ); + Invalidate(); +} diff --git a/btgui/Gwen/Controls/ColorPicker.h b/btgui/Gwen/Controls/ColorPicker.h new file mode 100644 index 000000000..a66811901 --- /dev/null +++ b/btgui/Gwen/Controls/ColorPicker.h @@ -0,0 +1,89 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_COLORPICKER_H +#define GWEN_CONTROLS_COLORPICKER_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + + +namespace Gwen +{ + namespace ControlsInternal + { + class GWEN_EXPORT ColorDisplay : public Controls::Base + { + public: + GWEN_CONTROL_INLINE( ColorDisplay, Controls::Base ) + { + SetSize( 32, 32 ); + m_Color = Color( 255, 0, 0, 255 ); + m_DrawCheckers = true; + } + + virtual void Render( Gwen::Skin::Base* skin ) + { + skin->DrawColorDisplay( this, m_Color ); + } + + virtual void SetColor( Gwen::Color color ) { m_Color = color; } + virtual Gwen::Color GetColor() { return m_Color; } + + virtual void SetRed( int red ) { m_Color.r = red; } + virtual void SetGreen( int green ) { m_Color.g = green;} + virtual void SetBlue( int blue ) { m_Color.b = blue; } + virtual void SetAlpha( int alpha ) { m_Color.a = alpha;} + + virtual void SetDrawCheckers( bool should ) { m_DrawCheckers = should; } + + protected: + Gwen::Color m_Color; + bool m_DrawCheckers; + }; + } + namespace Controls + { + + class GWEN_EXPORT ColorPicker : public Base + { + public: + + GWEN_CONTROL( ColorPicker, Base ); + + virtual void Render( Skin::Base* skin ); + virtual void Layout( Skin::Base* skin ); + virtual void CreateControls(); + virtual void SlidersMoved( Gwen::Controls::Base* control ); + virtual void NumericTyped( Gwen::Controls::Base* control ); + virtual void UpdateControls(); + virtual void UpdateColorControls( Gwen::String name, Gwen::Color col, int sliderVal ); + virtual void CreateColorControl( Gwen::String name, int y ); + + virtual void SetColor( Gwen::Color color ); + virtual Gwen::Color GetColor() { return m_Color; } + + int GetColorByName( Gwen::String colorName ); + void SetColorByName( Gwen::String colorName, int colorValue ); + Gwen::String GetColorFromName( Gwen::String name ); + virtual void SetAlphaVisible( bool visible ); + + virtual void SetRed( int red ) { m_Color.r = red; } + virtual void SetGreen( int green ) { m_Color.g = green;} + virtual void SetBlue( int blue ) { m_Color.b = blue; } + virtual void SetAlpha( int alpha ) { m_Color.a = alpha;} + + Event::Caller onColorChanged; + + protected: + Gwen::Color m_Color; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ComboBox.cpp b/btgui/Gwen/Controls/ComboBox.cpp new file mode 100644 index 000000000..0b08af05b --- /dev/null +++ b/btgui/Gwen/Controls/ComboBox.cpp @@ -0,0 +1,204 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ComboBox.h" +#include "Gwen/Controls/Menu.h" + + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + +class GWEN_EXPORT DownArrow : public Controls::Base +{ + public: + + GWEN_CONTROL_INLINE( DownArrow, Controls::Base ) + { + SetMouseInputEnabled( true ); + SetSize( 15, 15 ); + + } + + void Render( Skin::Base* skin ) + { + skin->DrawArrowDown(this->m_Bounds); + } + + void SetComboBox( ComboBox* p ){ m_ComboBox = p; } + + protected: + + ComboBox* m_ComboBox; +}; + +GWEN_CONTROL_CONSTRUCTOR( ComboBox ) +{ + SetSize( 100, 20 ); + SetMouseInputEnabled( true ); + + m_Menu = new Menu( this ); + m_Menu->SetHidden( true ); + m_Menu->SetDisableIconMargin( true ); + m_Menu->SetTabable( false ); + + ComboBoxButton* m_OpenButton = new ComboBoxButton( this ); + + m_OpenButton->onDown.Add( this, &ComboBox::OpenButtonPressed ); + + m_OpenButton->Dock( Pos::Right ); + m_OpenButton->SetMargin( Margin( 2, 2, 2, 2 ) ); + m_OpenButton->SetWidth( 16 ); + m_OpenButton->SetTabable( false ); + + + m_SelectedItem = NULL; + + SetAlignment( Gwen::Pos::Left | Gwen::Pos::CenterV ); + SetText( L"" ); + SetMargin( Margin( 3, 0, 0, 0 ) ); + + SetTabable( true ); + +} + +MenuItem* ComboBox::AddItem( const UnicodeString& strLabel, const String& strName, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::Function fn ) +{ + MenuItem* pItem = m_Menu->AddItem( strLabel, L"", pHandler, fn ); + pItem->SetName( strName ); + + pItem->onMenuItemSelected.Add( this, &ComboBox::OnItemSelected ); + + //Default + if ( m_SelectedItem == NULL ) + OnItemSelected( pItem ); + + return pItem; +} + +void ComboBox::Render( Skin::Base* skin ) +{ + skin->DrawComboBox( this ); +} + + +void ComboBox::OpenButtonPressed( Controls::Base* /*pControl*/ ) +{ + OnPress(); +} + +void ComboBox::OnPress() +{ + bool bWasMenuHidden = m_Menu->Hidden(); + + GetCanvas()->CloseMenus(); + + if ( bWasMenuHidden ) + { + OpenList(); + } + else + { + m_Menu->SetHidden( true ); + } +} + +void ComboBox::ClearItems() +{ + if ( m_Menu ) + { + m_Menu->ClearItems(); + } +} +void ComboBox::OnItemSelected( Controls::Base* pControl ) +{ + //Convert selected to a menu item + MenuItem* pItem = pControl->DynamicCastMenuItem(); + if ( !pItem ) return; + + m_SelectedItem = pItem; + SetText( m_SelectedItem->GetText() ); + m_Menu->SetHidden( true ); + + onSelection.Call( this ); + + Focus(); + Invalidate(); +} + +void ComboBox::OnLostKeyboardFocus() +{ + SetTextColor( Color( 0, 0, 0, 255 ) ); +} + + +void ComboBox::OnKeyboardFocus() +{ + //Until we add the blue highlighting again + SetTextColor( Color( 0, 0, 0, 255 ) ); + //m_SelectedText->SetTextColor( Color( 255, 255, 255, 255 ) ); +} + +Gwen::Controls::Label* ComboBox::GetSelectedItem() +{ + return m_SelectedItem; +} + +bool ComboBox::IsMenuOpen() +{ + return m_Menu && !m_Menu->Hidden(); +} + +void ComboBox::OpenList() +{ + if ( !m_Menu ) return; + + m_Menu->SetParent( GetCanvas() ); + m_Menu->SetHidden( false ); + m_Menu->BringToFront(); + + Gwen::Point p = LocalPosToCanvas( Gwen::Point( 0, 0 ) ); + + m_Menu->SetBounds( Gwen::Rect ( p.x, p.y + Height(), Width(), m_Menu->Height()) ); +} + +void ComboBox::CloseList() +{ + +} + + +bool ComboBox::OnKeyUp( bool bDown ) +{ + if ( bDown ) + { + Base::List::reverse_iterator it = std::find( m_Menu->Children.rbegin(), m_Menu->Children.rend(), m_SelectedItem ); + if ( it != m_Menu->Children.rend() && ( ++it != m_Menu->Children.rend() ) ) + { + Base* pUpElement = *it; + OnItemSelected(pUpElement); + } + } + return true; +} +bool ComboBox::OnKeyDown( bool bDown ) +{ + if ( bDown ) + { + Base::List::iterator it = std::find( m_Menu->Children.begin(), m_Menu->Children.end(), m_SelectedItem ); + if ( it != m_Menu->Children.end() && ( ++it != m_Menu->Children.end() ) ) + { + Base* pDownElement = *it; + OnItemSelected(pDownElement); + } + } + return true; +} + +void ComboBox::RenderFocus( Gwen::Skin::Base* /*skin*/ ) +{ +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/ComboBox.h b/btgui/Gwen/Controls/ComboBox.h new file mode 100644 index 000000000..88ea969c6 --- /dev/null +++ b/btgui/Gwen/Controls/ComboBox.h @@ -0,0 +1,87 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_COMBOBOX_H +#define GWEN_CONTROLS_COMBOBOX_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/TextBox.h" +#include "Gwen/Controls/Menu.h" + + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT ComboBoxButton : public Button + { + GWEN_CONTROL_INLINE( ComboBoxButton, Button ){} + + virtual void Render( Skin::Base* skin ) + { + skin->DrawComboBoxButton( this, m_bDepressed ); + } + }; + + class GWEN_EXPORT ComboBox : public Button + { + public: + + GWEN_CONTROL( ComboBox, Button ); + + virtual void Render( Skin::Base* skin ); + + virtual Gwen::Controls::Label* GetSelectedItem(); + + virtual void OnPress(); + void OpenButtonPressed( Controls::Base* /*pControl*/ ); + + virtual void OnItemSelected( Controls::Base* pControl ); + virtual void OpenList(); + virtual void CloseList(); + + virtual Controls::Base* GetControlAt( int x, int y ) + { + if ( x < 0 || y < 0 || x >= Width() || y >= Height() ) + return NULL; + + return this; + } + virtual bool IsMenuComponent() + { + return true; + } + + virtual void ClearItems(); + + virtual MenuItem* AddItem( const UnicodeString& strLabel, const String& strName = "", Gwen::Event::Handler* pHandler = NULL, Gwen::Event::Handler::Function fn = NULL ); + virtual bool OnKeyUp( bool bDown ); + virtual bool OnKeyDown( bool bDown ); + + virtual void RenderFocus( Gwen::Skin::Base* skin ); + virtual void OnLostKeyboardFocus(); + virtual void OnKeyboardFocus(); + + virtual bool IsMenuOpen(); + + Gwen::Event::Caller onSelection; + + protected: + + Menu* m_Menu; + MenuItem* m_SelectedItem; + + Controls::Base* m_Button; + + }; + + } +} +#endif diff --git a/btgui/Gwen/Controls/CrossSplitter.cpp b/btgui/Gwen/Controls/CrossSplitter.cpp new file mode 100644 index 000000000..2d52d61cc --- /dev/null +++ b/btgui/Gwen/Controls/CrossSplitter.cpp @@ -0,0 +1,183 @@ + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/CrossSplitter.h" +#include "Gwen/Controls/Button.h" + +using namespace Gwen; +using namespace Controls; + +GWEN_CONTROL_CONSTRUCTOR( CrossSplitter ) +{ + m_VSplitter = new SplitterBar( this ); + m_VSplitter->SetPos( 0, 128 ); + m_VSplitter->onDragged.Add( this, &CrossSplitter::OnVerticalMoved ); + m_VSplitter->SetCursor( Gwen::CursorType::SizeNS ); + + m_HSplitter = new SplitterBar( this ); + m_HSplitter->SetPos( 128, 0 ); + m_HSplitter->onDragged.Add( this, &CrossSplitter::OnHorizontalMoved ); + m_HSplitter->SetCursor( Gwen::CursorType::SizeWE ); + + m_CSplitter = new SplitterBar( this ); + m_CSplitter->SetPos( 128, 128 ); + m_CSplitter->onDragged.Add( this, &CrossSplitter::OnCenterMoved ); + m_CSplitter->SetCursor( Gwen::CursorType::SizeAll ); + + m_fHVal = 0.5f; + m_fVVal = 0.5f; + + SetPanel( 0, NULL ); + SetPanel( 1, NULL ); + SetPanel( 2, NULL ); + SetPanel( 3, NULL ); + + SetSplitterSize( 5 ); + SetSplittersVisible( false ); + + m_iZoomedSection = -1; +} + +void CrossSplitter::UpdateVSplitter() +{ + m_VSplitter->MoveTo( m_VSplitter->X(), ( Height() - m_VSplitter->Height() ) * ( m_fVVal )); +} +void CrossSplitter::UpdateHSplitter() +{ + m_HSplitter->MoveTo( ( Width() - m_HSplitter->Width() ) * ( m_fHVal ), m_HSplitter->Y() ); +} + +void CrossSplitter::OnCenterMoved( Controls::Base * /*control*/ ) +{ + //Move the other two bars into position + CalculateValueCenter(); + Invalidate(); +} + +void CrossSplitter::UpdateCSplitter() +{ + m_CSplitter->MoveTo( ( Width() - m_CSplitter->Width() ) * ( m_fHVal ), ( Height() - m_CSplitter->Height() ) * ( m_fVVal )); +} + +void CrossSplitter::OnHorizontalMoved( Controls::Base * /*control*/ ) +{ + m_fHVal = CalculateValueHorizontal(); + Invalidate(); +} +void CrossSplitter::OnVerticalMoved( Controls::Base * /*control*/ ) +{ + m_fVVal = CalculateValueVertical(); + Invalidate(); +} + +void CrossSplitter::CalculateValueCenter() +{ + m_fHVal = (float)m_CSplitter->X() / (float)( Width() - m_CSplitter->Width() ); + m_fVVal = (float)m_CSplitter->Y() / (float)( Height() - m_CSplitter->Height() ); +} + +float CrossSplitter::CalculateValueHorizontal() +{ + return (float)m_HSplitter->X() / (float)( Width() - m_HSplitter->Width() ); +} + +float CrossSplitter::CalculateValueVertical() +{ + return (float)m_VSplitter->Y() / (float)( Height() - m_VSplitter->Height() ); +} + +void CrossSplitter::Layout( Skin::Base* /*skin*/ ) +{ + m_VSplitter->SetSize( Width(), m_fBarSize ); + m_HSplitter->SetSize( m_fBarSize, Height() ); + m_CSplitter->SetSize( m_fBarSize, m_fBarSize ); + + UpdateVSplitter(); + UpdateHSplitter(); + UpdateCSplitter(); + + if ( m_iZoomedSection == -1 ) + { + if ( m_Sections[0] ) + m_Sections[0]->SetBounds( 0, 0, m_HSplitter->X(), m_VSplitter->Y() ); + + if ( m_Sections[1] ) + m_Sections[1]->SetBounds( m_HSplitter->X() + m_fBarSize, 0, Width() - ( m_HSplitter->X() + m_fBarSize ), m_VSplitter->Y() ); + + if ( m_Sections[2] ) + m_Sections[2]->SetBounds( 0, m_VSplitter->Y() + m_fBarSize, m_HSplitter->X(), Height() - ( m_VSplitter->Y() + m_fBarSize ) ); + + if ( m_Sections[3] ) + m_Sections[3]->SetBounds( m_HSplitter->X() + m_fBarSize, m_VSplitter->Y() + m_fBarSize, Width() - ( m_HSplitter->X() + m_fBarSize ), Height() - ( m_VSplitter->Y() + m_fBarSize ) ); + } + else + { + //This should probably use Fill docking instead + m_Sections[m_iZoomedSection]->SetBounds( 0, 0, Width(), Height() ); + } +} + +void CrossSplitter::SetPanel( int index, Controls::Base* pPanel) +{ + Debug::AssertCheck( index >= 0 && index <= 3, "CrossSplitter::SetPanel out of range" ); + + m_Sections[index] = pPanel; + + if ( pPanel ) + { + pPanel->Dock( Pos::None ); + pPanel->SetParent( this ); + } + + Invalidate(); +} + +Controls::Base* CrossSplitter::GetPanel( int i ) +{ + return m_Sections[i]; +} + + +void CrossSplitter::ZoomChanged() +{ + onZoomChange.Call( this ); + if ( m_iZoomedSection == -1 ) + { + onUnZoomed.Call( this ); + } + else + { + onZoomed.Call( this ); + } +} + +void CrossSplitter::Zoom( int section ) +{ + UnZoom(); + + if ( m_Sections[section] ) + { + for (int i = 0; i < 4; i++) + { + if ( i != section && m_Sections[i] ) + m_Sections[i]->SetHidden( true ); + } + m_iZoomedSection = section; + + Invalidate(); + } + ZoomChanged(); +} + +void CrossSplitter::UnZoom() +{ + m_iZoomedSection = -1; + + for ( int i = 0; i < 4; i++ ) + { + if ( m_Sections[i] ) + m_Sections[i]->SetHidden( false ); + } + + Invalidate(); + ZoomChanged(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/CrossSplitter.h b/btgui/Gwen/Controls/CrossSplitter.h new file mode 100644 index 000000000..f5840e5cf --- /dev/null +++ b/btgui/Gwen/Controls/CrossSplitter.h @@ -0,0 +1,63 @@ +#pragma once +#ifndef GWEN_CONTROLS_CROSSSPLITTER_H +#define GWEN_CONTROLS_CROSSSPLITTER_H + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/SplitterBar.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT CrossSplitter : public Controls::Base + { + public: + + GWEN_CONTROL( CrossSplitter, Controls::Base ); + + void Layout( Skin::Base* skin ); + + virtual float CalculateValueVertical(); + virtual float CalculateValueHorizontal(); + virtual void CalculateValueCenter(); + virtual void UpdateHSplitter(); + virtual void UpdateVSplitter(); + virtual void UpdateCSplitter(); + virtual void OnVerticalMoved( Controls::Base * control ); + virtual void OnHorizontalMoved( Controls::Base * control ); + virtual void OnCenterMoved( Controls::Base * control ); + + virtual void SetPanel( int i, Controls::Base* pPanel ); + virtual Controls::Base* GetPanel( int i ); + + virtual bool IsZoomed(){ return m_iZoomedSection != -1; } + virtual void Zoom( int section ); + virtual void UnZoom(); + virtual void ZoomChanged(); + virtual void CenterPanels() { m_fHVal = 0.5f; m_fVVal = 0.5f; Invalidate(); } + + virtual void SetSplittersVisible( bool b ){ m_VSplitter->SetShouldDrawBackground( b ); m_HSplitter->SetShouldDrawBackground( b ); m_CSplitter->SetShouldDrawBackground( b ); } + virtual void SetSplitterSize( int size ) { m_fBarSize = size; } + + private: + + SplitterBar* m_VSplitter; + SplitterBar* m_HSplitter; + SplitterBar* m_CSplitter; + + Controls::Base* m_Sections[4]; + + float m_fHVal; + float m_fVVal; + int m_fBarSize; + + char m_iZoomedSection; + + Gwen::Event::Caller onZoomed; + Gwen::Event::Caller onUnZoomed; + Gwen::Event::Caller onZoomChange; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Dialog/FileOpen.cpp b/btgui/Gwen/Controls/Dialog/FileOpen.cpp new file mode 100644 index 000000000..0db499854 --- /dev/null +++ b/btgui/Gwen/Controls/Dialog/FileOpen.cpp @@ -0,0 +1,24 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#include "Gwen/Gwen.h" +#include "Gwen/Platform.h" +#include "Gwen/Controls/Dialogs/FileOpen.h" + +using namespace Gwen; +using namespace Gwen::Dialogs; + +void Gwen::Dialogs::FileOpenEx( bool bUseSystem, const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::FunctionStr fnCallback ) +{ + if ( bUseSystem && Gwen::Platform::FileOpen( Name, StartPath, Extension, pHandler, fnCallback ) ) + { + return; + } + + // + // TODO: SHOW GWEN FILE SELECTION DIALOG + // +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Dialog/FileSave.cpp b/btgui/Gwen/Controls/Dialog/FileSave.cpp new file mode 100644 index 000000000..1b9aba284 --- /dev/null +++ b/btgui/Gwen/Controls/Dialog/FileSave.cpp @@ -0,0 +1,24 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#include "Gwen/Gwen.h" +#include "Gwen/Platform.h" +#include "Gwen/Controls/Dialogs/FileSave.h" + +using namespace Gwen; +using namespace Gwen::Dialogs; + +void Gwen::Dialogs::FileSaveEx( bool bUseSystem, const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::FunctionStr fnCallback ) +{ + if ( bUseSystem && Gwen::Platform::FileSave( Name, StartPath, Extension, pHandler, fnCallback ) ) + { + return; + } + + // + // TODO: SHOW GWEN FILE SELECTION DIALOG + // +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Dialog/Query.cpp b/btgui/Gwen/Controls/Dialog/Query.cpp new file mode 100644 index 000000000..9e339301f --- /dev/null +++ b/btgui/Gwen/Controls/Dialog/Query.cpp @@ -0,0 +1,12 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Dialogs/Query.h" + +using namespace Gwen; +using namespace Gwen::Controls; + diff --git a/btgui/Gwen/Controls/Dialogs/FileOpen.h b/btgui/Gwen/Controls/Dialogs/FileOpen.h new file mode 100644 index 000000000..c8635d532 --- /dev/null +++ b/btgui/Gwen/Controls/Dialogs/FileOpen.h @@ -0,0 +1,35 @@ +#pragma once +#ifndef GWEN_CONTROLS_DIALOGS_FILEOPEN_H +#define GWEN_CONTROLS_DIALOGS_FILEOPEN_H + +#include "Gwen/Gwen.h" + +namespace Gwen +{ + namespace Dialogs + { + // Usage: + // + // Gwen::Dialogs::FileOpen( true, "Open Map", "C:\my\folder\", "My Map Format|*.bmf", this, &MyClass::OpenFilename ); + // + + // + // The REAL function. + // If bUseSystem is used, it may use the system's modal dialog - which + // will steal focus and pause the rest of GWEN until it's continued. + // + void GWEN_EXPORT FileOpenEx( bool bUseSystem, const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler = NULL, Gwen::Event::Handler::FunctionStr fnCallback = NULL ); + + // + // Templated function simply to avoid having to manually cast the callback function. + // + template< typename A> + void FileOpen( bool bUseSystem, const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler = NULL, A fnCallback = NULL ) + { + FileOpenEx( bUseSystem, Name, StartPath, Extension, pHandler, (Gwen::Event::Handler::FunctionStr)fnCallback ); + } + + + } +} +#endif diff --git a/btgui/Gwen/Controls/Dialogs/FileSave.h b/btgui/Gwen/Controls/Dialogs/FileSave.h new file mode 100644 index 000000000..922036bf3 --- /dev/null +++ b/btgui/Gwen/Controls/Dialogs/FileSave.h @@ -0,0 +1,40 @@ +#pragma once +#ifndef GWEN_CONTROLS_DIALOGS_FILESAVE_H +#define GWEN_CONTROLS_DIALOGS_FILESAVE_H + +#include "Gwen/Gwen.h" + +namespace Gwen +{ + namespace Dialogs + { + // Usage: + // + // Gwen::Dialogs::FileOpen( true, "Open Map", "C:\my\folder\", "My Map Format|*.bmf", this, &MyClass::OpenFilename ); + // + + // + // Callback function, for success + // + typedef void (Event::Handler::*FileSaveSuccessCallback)( const String& filename ); + + // + // The REAL function. + // If bUseSystem is used, it may use the system's modal dialog - which + // will steal focus and pause the rest of GWEN until it's continued. + // + void GWEN_EXPORT FileSaveEx( bool bUseSystem, const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler = NULL, Gwen::Event::Handler::FunctionStr fnCallback = NULL ); + + // + // Templated function simply to avoid having to manually cast the callback function. + // + template< typename A> + void FileSave( bool bUseSystem, const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler = NULL, A fnCallback = NULL ) + { + FileSaveEx( bUseSystem, Name, StartPath, Extension, pHandler, (Gwen::Event::Handler::FunctionStr)fnCallback ); + } + + + } +} +#endif diff --git a/btgui/Gwen/Controls/Dialogs/Query.h b/btgui/Gwen/Controls/Dialogs/Query.h new file mode 100644 index 000000000..007750791 --- /dev/null +++ b/btgui/Gwen/Controls/Dialogs/Query.h @@ -0,0 +1,14 @@ +#pragma once +#ifndef GWEN_CONTROLS_DIALOGS_QUERY_H +#define GWEN_CONTROLS_DIALOGS_QUERY_H + +#include "Gwen/Gwen.h" + +namespace Gwen +{ + namespace Dialogs + { + //TODO. YesNo, Ok etc + } +} +#endif diff --git a/btgui/Gwen/Controls/DockBase.cpp b/btgui/Gwen/Controls/DockBase.cpp new file mode 100644 index 000000000..0774b1db2 --- /dev/null +++ b/btgui/Gwen/Controls/DockBase.cpp @@ -0,0 +1,343 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/DockBase.h" +#include "Gwen/Controls/DockedTabControl.h" +#include "Gwen/Controls/Highlight.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/Controls/Resizer.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + +GWEN_CONTROL_CONSTRUCTOR( DockBase ) +{ + SetPadding( Padding( 1, 1, 1, 1 ) ); + SetSize( 200, 200 ); + + m_DockedTabControl = NULL; + m_Left = NULL; + m_Right = NULL; + m_Top = NULL; + m_Bottom = NULL; + + m_bDrawHover = false; +} + +TabControl* DockBase::GetTabControl() +{ + return m_DockedTabControl; +} + +void DockBase::SetupChildDock( int iPos ) +{ + if ( !m_DockedTabControl ) + { + m_DockedTabControl = new DockedTabControl( this ); + m_DockedTabControl->onLoseTab.Add( this, &DockBase::OnTabRemoved ); + m_DockedTabControl->SetTabStripPosition( Pos::Bottom ); + m_DockedTabControl->SetShowTitlebar( true ); + } + + Dock( iPos ); + + int iSizeDirection = Pos::Left; + if ( iPos == Pos::Left ) iSizeDirection = Pos::Right; + if ( iPos == Pos::Top ) iSizeDirection = Pos::Bottom; + if ( iPos == Pos::Bottom ) iSizeDirection = Pos::Top; + + ControlsInternal::Resizer* sizer = new ControlsInternal::Resizer( this ); + sizer->Dock( iSizeDirection ); + sizer->SetResizeDir( iSizeDirection ); + sizer->SetSize( 2, 2 ); + sizer->SetTarget( this ); +} + +void DockBase::Render( Skin::Base* /*skin*/ ) +{ + //Gwen::Render->SetDrawColor( Colors::Black ); + //Gwen::Render->DrawLinedRect( GetRenderBounds() ); +} + +DockBase** DockBase::GetChildDockPtr( int iPos ) +{ + if ( iPos == Pos::Left ) return &m_Left; + if ( iPos == Pos::Right ) return &m_Right; + if ( iPos == Pos::Top ) return &m_Top; + if ( iPos == Pos::Bottom ) return &m_Bottom; + + return NULL; +} + +DockBase* DockBase::GetChildDock( int iPos ) +{ + DockBase** pDock = GetChildDockPtr( iPos ); + + if ( !(*pDock) ) + { + (*pDock) = new DockBase( this ); + (*pDock)->SetupChildDock( iPos ); + } + else + { + (*pDock)->SetHidden( false ); + } + + return *pDock; +} + +int DockBase::GetDroppedTabDirection( int x, int y ) +{ + int w = Width(); + int h = Height(); + + float top = (float)y / (float) h; + float left = (float)x / (float) w; + float right = (float)(w - x) /(float) w; + float bottom = (float)(h - y) / (float) h; + + float minimum = GwenUtil_Min( GwenUtil_Min( GwenUtil_Min( top, left ), right ), bottom ); + m_bDropFar = ( minimum < 0.2f ); + if ( minimum > 0.3 ) return Pos::Fill; + + if ( top == minimum && (!m_Top || m_Top->Hidden()) ) return Pos::Top; + if ( left == minimum && (!m_Left || m_Left->Hidden()) ) return Pos::Left; + if ( right == minimum && (!m_Right || m_Right->Hidden()) ) return Pos::Right; + if ( bottom == minimum && (!m_Bottom || m_Bottom->Hidden()) ) return Pos::Bottom; + + return Pos::Fill; +} + +bool DockBase::DragAndDrop_CanAcceptPackage( Gwen::DragAndDrop::Package* pPackage ) +{ + // A TAB button dropped + if ( pPackage->name == "TabButtonMove" ) + return true; + + // a TAB window dropped + if ( pPackage->name == "TabWindowMove" ) + return true; + + return false; +} + +void AddTabToDock( TabButton* pTabButton, DockedTabControl* pControl ) +{ + pControl->AddPage( pTabButton ); +} + +bool DockBase::DragAndDrop_HandleDrop( Gwen::DragAndDrop::Package* pPackage, int x, int y ) +{ + Gwen::Point pPos = CanvasPosToLocal( Gwen::Point( x, y ) ); + int dir = GetDroppedTabDirection( pPos.x, pPos.y ); + + DockedTabControl* pAddTo = m_DockedTabControl; + if ( dir == Pos::Fill && pAddTo == NULL ) return false; + + if ( dir != Pos::Fill ) + { + DockBase* pDock = GetChildDock( dir ); + pAddTo = pDock->m_DockedTabControl; + + if ( !m_bDropFar ) pDock->BringToFront(); + else pDock->SendToBack(); + } + + if ( pPackage->name == "TabButtonMove" ) + { + TabButton* pTabButton = DragAndDrop::SourceControl->DynamicCastTabButton(); + if ( !pTabButton ) return false; + + AddTabToDock( pTabButton, pAddTo ); + } + + if ( pPackage->name == "TabWindowMove" ) + { + DockedTabControl* pTabControl = DragAndDrop::SourceControl->DynamicCastDockedTabControl(); + if ( !pTabControl ) return false; + if ( pTabControl == pAddTo ) return false; + + pTabControl->MoveTabsTo( pAddTo ); + } + + Invalidate(); + + return true; +} + +bool DockBase::IsEmpty() +{ + if ( m_DockedTabControl && m_DockedTabControl->TabCount() > 0 ) return false; + + if ( m_Left && !m_Left->IsEmpty() ) return false; + if ( m_Right && !m_Right->IsEmpty() ) return false; + if ( m_Top && !m_Top->IsEmpty() ) return false; + if ( m_Bottom && !m_Bottom->IsEmpty() ) return false; + + return true; +} + +void DockBase::OnTabRemoved( Gwen::Controls::Base* /*pControl*/ ) +{ + DoRedundancyCheck(); + DoConsolidateCheck(); +} + +void DockBase::DoRedundancyCheck() +{ + if ( !IsEmpty() ) return; + + DockBase* pDockParent = GetParent()->DynamicCastDockBase(); + if ( !pDockParent ) return; + + pDockParent->OnRedundantChildDock( this ); +} + +void DockBase::DoConsolidateCheck() +{ + if ( IsEmpty() ) return; + if ( !m_DockedTabControl ) return; + if ( m_DockedTabControl->TabCount() > 0 ) return; + + if ( m_Bottom && !m_Bottom->IsEmpty() ) + { + m_Bottom->m_DockedTabControl->MoveTabsTo( m_DockedTabControl ); + return; + } + + if ( m_Top && !m_Top->IsEmpty() ) + { + m_Top->m_DockedTabControl->MoveTabsTo( m_DockedTabControl ); + return; + } + + if ( m_Left && !m_Left->IsEmpty() ) + { + m_Left->m_DockedTabControl->MoveTabsTo( m_DockedTabControl ); + return; + } + + if ( m_Right && !m_Right->IsEmpty() ) + { + m_Right->m_DockedTabControl->MoveTabsTo( m_DockedTabControl ); + return; + } +} + +void DockBase::OnRedundantChildDock( DockBase* pDockBase ) +{ + pDockBase->SetHidden( true ); + DoRedundancyCheck(); + DoConsolidateCheck(); +} + +void DockBase::DragAndDrop_HoverEnter( Gwen::DragAndDrop::Package* /*pPackage*/, int /*x*/, int /*y*/ ) +{ + m_bDrawHover = true; +} + +void DockBase::DragAndDrop_HoverLeave( Gwen::DragAndDrop::Package* /*pPackage*/ ) +{ + m_bDrawHover = false; +} + +void DockBase::DragAndDrop_Hover( Gwen::DragAndDrop::Package* /*pPackage*/, int x, int y ) +{ + Gwen::Point pPos = CanvasPosToLocal( Gwen::Point( x, y ) ); + int dir = GetDroppedTabDirection( pPos.x, pPos.y ); + + if ( dir == Pos::Fill ) + { + if ( !m_DockedTabControl ) + { + m_HoverRect = Gwen::Rect( 0, 0, 0, 0 ); + return; + } + + m_HoverRect = GetInnerBounds(); + return; + } + + m_HoverRect = GetRenderBounds(); + + int HelpBarWidth = 0; + + if ( dir == Pos::Left ) + { + HelpBarWidth = m_HoverRect.w * 0.25f; + m_HoverRect.w = HelpBarWidth; + } + + if ( dir == Pos::Right ) + { + HelpBarWidth = m_HoverRect.w * 0.25f; + m_HoverRect.x = m_HoverRect.w - HelpBarWidth; + m_HoverRect.w = HelpBarWidth; + } + + if ( dir == Pos::Top ) + { + HelpBarWidth = m_HoverRect.h * 0.25f; + m_HoverRect.h = HelpBarWidth; + } + + if ( dir == Pos::Bottom ) + { + HelpBarWidth = m_HoverRect.h * 0.25f; + m_HoverRect.y = m_HoverRect.h - HelpBarWidth; + m_HoverRect.h = HelpBarWidth; + } + + if ( (dir == Pos::Top || dir == Pos::Bottom ) && !m_bDropFar ) + { + if ( m_Left && m_Left->Visible() ) + { + m_HoverRect.x += m_Left->Width(); + m_HoverRect.w -= m_Left->Width(); + } + + if ( m_Right && m_Right->Visible() ) + { + m_HoverRect.w -= m_Right->Width(); + } + } + + if ( (dir == Pos::Left || dir == Pos::Right ) && !m_bDropFar ) + { + if ( m_Top && m_Top->Visible() ) + { + m_HoverRect.y += m_Top->Height(); + m_HoverRect.h -= m_Top->Height(); + } + + if ( m_Bottom && m_Bottom->Visible() ) + { + m_HoverRect.h -= m_Bottom->Height(); + } + } +} + +void DockBase::RenderOver( Skin::Base* skin ) +{ + if ( !m_bDrawHover ) return; + + Gwen::Renderer::Base* render = skin->GetRender(); + + render->SetDrawColor( Gwen::Color( 255, 100, 255, 20 ) ); + render->DrawFilledRect( GetRenderBounds() ); + + if ( m_HoverRect.w == 0 ) return; + + render->SetDrawColor( Gwen::Color( 255, 100, 255, 100 ) ); + render->DrawFilledRect( m_HoverRect ); + + render->SetDrawColor( Gwen::Color( 255, 100, 255, 200 ) ); + render->DrawLinedRect( m_HoverRect ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/DockBase.h b/btgui/Gwen/Controls/DockBase.h new file mode 100644 index 000000000..0c07c9cd0 --- /dev/null +++ b/btgui/Gwen/Controls/DockBase.h @@ -0,0 +1,77 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_DOCKBASE_H +#define GWEN_CONTROLS_DOCKBASE_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" + +namespace Gwen +{ + namespace Controls + { + class DockedTabControl; + class TabControl; + + class GWEN_EXPORT DockBase : public Base + { + public: + + GWEN_CONTROL( DockBase, Base ); + + virtual void Render( Skin::Base* skin ); + virtual void RenderOver( Skin::Base* skin ); + virtual bool IsEmpty(); + + virtual TabControl* GetTabControl(); + + virtual DockBase* GetRight(){ return GetChildDock( Pos::Right ); } + virtual DockBase* GetLeft(){ return GetChildDock( Pos::Left ); } + virtual DockBase* GetTop(){ return GetChildDock( Pos::Top ); } + virtual DockBase* GetBottom(){ return GetChildDock( Pos::Bottom ); } + + // No action on space (default button action is to press) + virtual bool OnKeySpace( bool /*bDown*/ ){ return false; } + + private: + + // Drag n Drop + virtual bool DragAndDrop_HandleDrop( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + virtual bool DragAndDrop_CanAcceptPackage( Gwen::DragAndDrop::Package* pPackage ); + virtual void DragAndDrop_HoverEnter( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + virtual void DragAndDrop_HoverLeave( Gwen::DragAndDrop::Package* pPackage ); + virtual void DragAndDrop_Hover( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + + virtual void SetupChildDock( int iPos ); + + virtual void DoRedundancyCheck(); + virtual void DoConsolidateCheck(); + virtual void OnRedundantChildDock( DockBase* pDockBase ); + + virtual int GetDroppedTabDirection( int x, int y ); + virtual void OnTabRemoved( Gwen::Controls::Base* pControl ); + + DockBase* GetChildDock( int iPos ); + DockBase** GetChildDockPtr( int iPos ); + + DockBase* m_Left; + DockBase* m_Right; + DockBase* m_Top; + DockBase* m_Bottom; + + // Only CHILD dockpanels have a tabcontrol. + DockedTabControl* m_DockedTabControl; + + bool m_bDrawHover; + bool m_bDropFar; + Gwen::Rect m_HoverRect; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/DockedTabControl.cpp b/btgui/Gwen/Controls/DockedTabControl.cpp new file mode 100644 index 000000000..45f96417f --- /dev/null +++ b/btgui/Gwen/Controls/DockedTabControl.cpp @@ -0,0 +1,92 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/DockedTabControl.h" +#include "Gwen/Controls/Highlight.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/Controls/WindowControl.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( DockedTabControl ) +{ + m_WindowControl = NULL; + + Dock( Pos::Fill ); + + m_pTitleBar = new TabTitleBar( this ); + m_pTitleBar->Dock( Pos::Top ); + m_pTitleBar->SetHidden( true ); + +} + +void DockedTabControl::Layout( Skin::Base* skin ) +{ + GetTabStrip()->SetHidden( TabCount() <= 1 ); + UpdateTitleBar(); + BaseClass::Layout( skin ); +} + +void DockedTabControl::UpdateTitleBar() +{ + if ( !GetCurrentButton() ) return; + + m_pTitleBar->UpdateFromTab( GetCurrentButton() ); +} + +void DockedTabControl::DragAndDrop_StartDragging( Gwen::DragAndDrop::Package* pPackage, int x, int y ) +{ + BaseClass::DragAndDrop_StartDragging( pPackage, x, y ); + + SetHidden( true ); + // This hiding our parent thing is kind of lousy. + GetParent()->SetHidden( true ); +} + +void DockedTabControl::DragAndDrop_EndDragging( bool bSuccess, int /*x*/, int /*y*/ ) +{ + SetHidden( false ); + + if ( !bSuccess ) + { + GetParent()->SetHidden( false ); + } + +/* + if ( !bSuccess ) + { + // Create our window control + if ( !m_WindowControl ) + { + m_WindowControl = new WindowControl( GetCanvas() ); + m_WindowControl->SetBounds( x, y, Width(), Height() ); + } + + m_WindowControl->SetPosition( x, y ); + SetParent( m_WindowControl ); + SetPosition( 0, 0 ); + Dock( Pos::Fill ); + } + */ +} + +void DockedTabControl::MoveTabsTo( DockedTabControl* pTarget ) +{ + Base::List Children = GetTabStrip()->Children; + for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) + { + TabButton* pButton = (*iter)->DynamicCastTabButton(); + if ( !pButton ) continue; + + pTarget->AddPage( pButton ); + } + + Invalidate(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/DockedTabControl.h b/btgui/Gwen/Controls/DockedTabControl.h new file mode 100644 index 000000000..a42076684 --- /dev/null +++ b/btgui/Gwen/Controls/DockedTabControl.h @@ -0,0 +1,42 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_DOCKEDTABCONTROL_H +#define GWEN_CONTROLS_DOCKEDTABCONTROL_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/TabControl.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT DockedTabControl : public TabControl + { + public: + + GWEN_CONTROL( DockedTabControl, TabControl ); + + void SetShowTitlebar( bool bShow ){ m_pTitleBar->SetHidden( !bShow ); } + + void Layout( Skin::Base* skin ); + void UpdateTitleBar(); + + virtual void DragAndDrop_StartDragging( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + virtual void DragAndDrop_EndDragging( bool bSuccess, int x, int y ); + + void MoveTabsTo( DockedTabControl* pTarget ); + + private: + + TabTitleBar* m_pTitleBar; + Base* m_WindowControl; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Dragger.cpp b/btgui/Gwen/Controls/Dragger.cpp new file mode 100644 index 000000000..2b89e344c --- /dev/null +++ b/btgui/Gwen/Controls/Dragger.cpp @@ -0,0 +1,59 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/Dragger.h" + +using namespace Gwen; +using namespace Gwen::ControlsInternal; + + + +GWEN_CONTROL_CONSTRUCTOR( Dragger ) +{ + m_pTarget = NULL; + SetMouseInputEnabled( true ); + m_bDepressed = false; +} + +void Dragger::OnMouseClickLeft( int x, int y, bool bDown ) +{ + if ( !m_pTarget ) return; + + if ( bDown ) + { + m_bDepressed = true; + m_HoldPos = m_pTarget->CanvasPosToLocal( Gwen::Point( x, y ) ); + Gwen::MouseFocus = this; + } + else + { + m_bDepressed = false; + + Gwen::MouseFocus = NULL; + } +} + +void Dragger::OnMouseMoved( int x, int y, int /*deltaX*/, int /*deltaY*/ ) +{ + if ( !m_pTarget ) return; + if ( !m_bDepressed ) return; + + Gwen::Point p = Gwen::Point( x - m_HoldPos.x, y - m_HoldPos.y ); + + // Translate to parent + if ( m_pTarget->GetParent() ) + p = m_pTarget->GetParent()->CanvasPosToLocal( p ); + + //m_pTarget->SetPosition( p.x, p.y ); + m_pTarget->MoveTo( p.x, p.y ); + onDragged.Call( this ); +} + +void Dragger::Render( Skin::Base* /*skin*/ ) +{ + //skin->DrawButton(this,false,false); +} diff --git a/btgui/Gwen/Controls/Dragger.h b/btgui/Gwen/Controls/Dragger.h new file mode 100644 index 000000000..165d96c0b --- /dev/null +++ b/btgui/Gwen/Controls/Dragger.h @@ -0,0 +1,43 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_DRAGGER_H +#define GWEN_CONTROLS_DRAGGER_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + + +namespace Gwen +{ + namespace ControlsInternal + { + class GWEN_EXPORT Dragger : public Controls::Base + { + public: + + GWEN_CONTROL( Dragger, Controls::Base ); + + virtual void OnMouseMoved( int x, int y, int deltaX, int deltaY ); + + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + virtual void Render( Skin::Base* skin ); + + virtual void SetTarget( Controls::Base* pBase ){ m_pTarget = pBase; } + + Gwen::Event::Caller onDragged; + + protected: + + bool m_bDepressed; + Gwen::Point m_HoldPos; + Controls::Base* m_pTarget; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/GroupBox.cpp b/btgui/Gwen/Controls/GroupBox.cpp new file mode 100644 index 000000000..3e9f60def --- /dev/null +++ b/btgui/Gwen/Controls/GroupBox.cpp @@ -0,0 +1,42 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/GroupBox.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + +GWEN_CONTROL_CONSTRUCTOR( GroupBox ) +{ + // Set to true, because it's likely that our + // children will want mouse input, and they + // can't get it without us.. + SetMouseInputEnabled( true ); + + SetTextPadding( Padding( 10, 0, 0, 0 ) ); + + SetAlignment( Pos::Top | Pos::Left ); + Invalidate(); + + m_InnerPanel = new Base( this ); + m_InnerPanel->Dock( Pos::Fill ); + +} + +void GroupBox::Layout( Skin::Base* skin ) +{ + m_InnerPanel->SetMargin( Margin( TextHeight() + 3, 6, 6, 6 ) ); + + BaseClass::Layout( skin ); +} + + +void GroupBox::Render( Skin::Base* skin ) +{ + skin->DrawGroupBox( this, TextX(), TextHeight(), TextWidth() ); +} diff --git a/btgui/Gwen/Controls/GroupBox.h b/btgui/Gwen/Controls/GroupBox.h new file mode 100644 index 000000000..0453523ae --- /dev/null +++ b/btgui/Gwen/Controls/GroupBox.h @@ -0,0 +1,34 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_GROUPBOX_H +#define GWEN_CONTROLS_GROUPBOX_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + + +namespace Gwen +{ + namespace Controls + { + + class GWEN_EXPORT GroupBox : public Label + { + public: + + GWEN_CONTROL( GroupBox, Label ); + + virtual void Render( Skin::Base* skin ); + virtual void Layout( Skin::Base* skin ); + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/HSVColorPicker.cpp b/btgui/Gwen/Controls/HSVColorPicker.cpp new file mode 100644 index 000000000..994e915c3 --- /dev/null +++ b/btgui/Gwen/Controls/HSVColorPicker.cpp @@ -0,0 +1,172 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/HSVColorPicker.h" +#include "Gwen/Controls/ColorControls.h" +#include "Gwen/Controls/ColorPicker.h" +#include "Gwen/Controls/TextBox.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/PanelListPanel.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + +GWEN_CONTROL_CONSTRUCTOR( HSVColorPicker ) +{ + SetMouseInputEnabled( true ); + SetSize( 256, 128 ); + SetCacheToTexture(); + + m_LerpBox = new Gwen::Controls::ColorLerpBox( this ); + m_LerpBox->onSelectionChanged.Add( this, &HSVColorPicker::ColorBoxChanged ); + m_LerpBox->SetPos( 5, 5 ); + + m_ColorSlider = new Gwen::Controls::ColorSlider( this ); + m_ColorSlider->SetPos( m_LerpBox->Width() + 15, 5 ); + m_ColorSlider->onSelectionChanged.Add( this, &HSVColorPicker::ColorSliderChanged ); + + m_After = new Gwen::ControlsInternal::ColorDisplay( this ); + m_After->SetSize( 48, 24 ); + m_After->SetPos( m_ColorSlider->X() + m_ColorSlider->Width() + 15, 5 ); + + m_Before = new Gwen::ControlsInternal::ColorDisplay( this ); + m_Before->SetSize( 48, 24 ); + m_Before->SetPos( m_After->X(), 28 ); + + int x = m_Before->X(); + int y = m_Before->Y() + 30; + + + { + Label* label = new Label( this ); + label->SetText(L"R:"); + label->SizeToContents(); + label->SetPos( x, y ); + + TextBoxNumeric* numeric = new TextBoxNumeric( this ); + numeric->SetName( "RedBox" ); + numeric->SetPos( x + 15, y -1 ); + numeric->SetSize( 26, 16 ); + numeric->SetSelectAllOnFocus( true ); + numeric->onTextChanged.Add( this, &HSVColorPicker::NumericTyped ); + + } + + y+= 20; + + { + Label* label = new Label( this ); + label->SetText(L"G:"); + label->SizeToContents(); + label->SetPos( x, y ); + + + TextBoxNumeric* numeric = new TextBoxNumeric( this ); + numeric->SetName( "GreenBox" ); + numeric->SetPos( x + 15, y -1 ); + numeric->SetSize( 26, 16 ); + numeric->SetSelectAllOnFocus( true ); + numeric->onTextChanged.Add( this, &HSVColorPicker::NumericTyped ); + } + + y+= 20; + + { + Label* label = new Label( this ); + label->SetText(L"B:"); + label->SizeToContents(); + label->SetPos( x, y ); + + + TextBoxNumeric* numeric = new TextBoxNumeric( this ); + numeric->SetName( "BlueBox" ); + numeric->SetPos( x + 15, y -1 ); + numeric->SetSize( 26, 16 ); + numeric->SetSelectAllOnFocus( true ); + numeric->onTextChanged.Add( this, &HSVColorPicker::NumericTyped ); + } +} + +void HSVColorPicker::NumericTyped( Gwen::Controls::Base* control ) +{ + TextBoxNumeric* box = control->DynamicCastTextBoxNumeric(); + if ( !box ) return; + + if ( box->GetText() == L"" ) return; + + int textValue = atoi( Gwen::Utility::UnicodeToString( box->GetText()).c_str() ); + if ( textValue < 0 ) textValue = 0; + if ( textValue > 255 ) textValue = 255; + + Gwen::Color newColor = GetColor(); + + if ( box->GetName().find( "Red" ) != Gwen::String::npos ) + { + newColor.r = textValue; + } + else if ( box->GetName().find( "Green" ) != Gwen::String::npos ) + { + newColor.g = textValue; + } + else if ( box->GetName().find( "Blue" ) != Gwen::String::npos ) + { + newColor.b = textValue; + } + else if ( box->GetName().find( "Alpha" ) != Gwen::String::npos ) + { + newColor.a = textValue; + } + + SetColor( newColor ); +} + +void HSVColorPicker::UpdateControls(Gwen::Color color) +{ + TextBoxNumeric* redBox = FindChildByName( "RedBox", false )->DynamicCastTextBoxNumeric(); + if ( redBox ) redBox->SetText( Gwen::Utility::ToString( (int)color.r), false ); + + TextBoxNumeric* greenBox = FindChildByName( "GreenBox", false )->DynamicCastTextBoxNumeric(); + if ( greenBox ) greenBox->SetText( Gwen::Utility::ToString( (int)color.g ), false ); + + TextBoxNumeric* blueBox = FindChildByName( "BlueBox", false )->DynamicCastTextBoxNumeric(); + if ( blueBox ) blueBox->SetText( Gwen::Utility::ToString( (int)color.b ), false ); + + m_After->SetColor( color ); +} +void HSVColorPicker::SetColor( Gwen::Color color, bool onlyHue, bool reset ) +{ + + UpdateControls( color ); + + + if ( reset ) + m_Before->SetColor( color ); + + m_ColorSlider->SetColor( color ); + m_LerpBox->SetColor( color, onlyHue ); + m_After->SetColor( color ); +} + +Gwen::Color HSVColorPicker::GetColor() +{ + return m_LerpBox->GetSelectedColor(); +} + +void HSVColorPicker::ColorBoxChanged( Gwen::Controls::Base* /*pControl*/ ) +{ + onColorChanged.Call( this ); + UpdateControls( GetColor() ); + Invalidate(); +} +void HSVColorPicker::ColorSliderChanged( Gwen::Controls::Base* /*pControl*/ ) +{ + if ( m_LerpBox ) + m_LerpBox->SetColor( m_ColorSlider->GetSelectedColor(), true ); + Invalidate(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/HSVColorPicker.h b/btgui/Gwen/Controls/HSVColorPicker.h new file mode 100644 index 000000000..ac5e1c410 --- /dev/null +++ b/btgui/Gwen/Controls/HSVColorPicker.h @@ -0,0 +1,47 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_HSVCOLORPICKER_H +#define GWEN_CONTROLS_HSVCOLORPICKER_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/ColorControls.h" +#include "Gwen/Controls/ColorPicker.h" + + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT HSVColorPicker : public Controls::Base + { + public: + GWEN_CONTROL( HSVColorPicker, Controls::Base ); + + Gwen::Color GetColor(); + Gwen::Color GetDefaultColor() { return m_Before->GetColor(); } + void SetColor( Gwen::Color color, bool onlyHue = false, bool reset = false ); + + void ColorBoxChanged( Gwen::Controls::Base* pControl ); + void ColorSliderChanged( Gwen::Controls::Base* pControl ); + void NumericTyped( Gwen::Controls::Base* control ); + + void UpdateControls( Gwen::Color newColor ); + + Event::Caller onColorChanged; + + protected: + ColorLerpBox* m_LerpBox; + ColorSlider* m_ColorSlider; + ControlsInternal::ColorDisplay* m_Before; + ControlsInternal::ColorDisplay* m_After; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Highlight.h b/btgui/Gwen/Controls/Highlight.h new file mode 100644 index 000000000..01c25d340 --- /dev/null +++ b/btgui/Gwen/Controls/Highlight.h @@ -0,0 +1,36 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_HIGHLIGHT_H +#define GWEN_CONTROLS_HIGHLIGHT_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Skin.h" + +namespace Gwen +{ + namespace ControlsInternal + { + class GWEN_EXPORT Highlight : public Controls::Base + { + public: + + GWEN_CONTROL_INLINE( Highlight, Controls::Base ) + { + + } + + void Render( Skin::Base* skin ) + { + skin->DrawHighlight( this ); + } + }; + } + +} +#endif diff --git a/btgui/Gwen/Controls/HorizontalScrollBar.cpp b/btgui/Gwen/Controls/HorizontalScrollBar.cpp new file mode 100644 index 000000000..323f2af5e --- /dev/null +++ b/btgui/Gwen/Controls/HorizontalScrollBar.cpp @@ -0,0 +1,136 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ScrollBar.h" +#include "Gwen/Controls/HorizontalScrollBar.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( HorizontalScrollBar ) +{ + m_Bar->SetHorizontal(); + + m_ScrollButton[SCROLL_BUTTON_LEFT]->SetDirectionLeft(); + m_ScrollButton[SCROLL_BUTTON_LEFT]->onPress.Add( this, &HorizontalScrollBar::NudgeLeft ); + + m_ScrollButton[SCROLL_BUTTON_RIGHT]->SetDirectionRight(); + m_ScrollButton[SCROLL_BUTTON_RIGHT]->onPress.Add( this, &HorizontalScrollBar::NudgeRight ); + + m_Bar->onDragged.Add( this, &HorizontalScrollBar::OnBarMoved ); +} + +void HorizontalScrollBar::Layout( Skin::Base* skin ) +{ + BaseClass::Layout( skin ); + + m_ScrollButton[SCROLL_BUTTON_LEFT]->SetWidth( Height() ); + m_ScrollButton[SCROLL_BUTTON_LEFT]->Dock(Pos::Left); + + m_ScrollButton[SCROLL_BUTTON_RIGHT]->SetWidth( Height() ); + m_ScrollButton[SCROLL_BUTTON_RIGHT]->Dock(Pos::Right); + + m_Bar->SetHeight( GetButtonSize() ); + m_Bar->SetPadding( Padding( GetButtonSize(), 0, GetButtonSize(), 0 ) ); + + float barWidth = (m_fViewableContentSize / m_fContentSize) * (Width() - (GetButtonSize() * 2)); + + if ( barWidth < GetButtonSize() * 0.5 ) + barWidth = GetButtonSize() * 0.5; + + m_Bar->SetWidth(barWidth); + m_Bar->SetHidden( Width() - (GetButtonSize() * 2) <= barWidth ); + + //Based on our last scroll amount, produce a position for the bar + if ( !m_Bar->IsDepressed() ) + { + SetScrolledAmount( GetScrolledAmount(), true ); + } +} + +void HorizontalScrollBar::NudgeLeft( Base* /*control*/ ) +{ + if ( !IsDisabled() ) + SetScrolledAmount( GetScrolledAmount() - GetNudgeAmount(), true); +} + +void HorizontalScrollBar::NudgeRight( Base* /*control*/ ) +{ + if ( !IsDisabled() ) + SetScrolledAmount( GetScrolledAmount() + GetNudgeAmount(), true); +} + +void HorizontalScrollBar::ScrollToLeft() +{ + SetScrolledAmount( 0, true); +} +void HorizontalScrollBar::ScrollToRight() +{ + SetScrolledAmount( 1, true); +} + +float HorizontalScrollBar::GetNudgeAmount() +{ + if ( m_bDepressed ) + return m_fViewableContentSize / m_fContentSize; + else + return BaseClass::GetNudgeAmount(); +} + + + +void HorizontalScrollBar::OnMouseClickLeft( int x, int y, bool bDown ) +{ + if ( bDown ) + { + m_bDepressed = true; + Gwen::MouseFocus = this; + } + else + { + Gwen::Point clickPos = CanvasPosToLocal( Gwen::Point( x, y ) ); + if ( clickPos.x < m_Bar->X() ) + NudgeLeft( this ); + else if ( clickPos.x > m_Bar->X() + m_Bar->Width() ) + NudgeRight( this ); + + m_bDepressed = false; + Gwen::MouseFocus = NULL; + } +} + +float HorizontalScrollBar::CalculateScrolledAmount() +{ + return (float)(m_Bar->X() - GetButtonSize()) / (float)(Width() - m_Bar->Width() - (GetButtonSize() * 2 )); +} + +bool HorizontalScrollBar::SetScrolledAmount( float amount, bool forceUpdate ) +{ + amount = Gwen::Clamp( amount, 0, 1 ); + + if ( !BaseClass::SetScrolledAmount( amount, forceUpdate ) ) + return false; + + if ( forceUpdate ) + { + int newX = GetButtonSize() + (amount * ((Width() - m_Bar->Width()) - (GetButtonSize()*2))); + m_Bar->MoveTo( newX, m_Bar->Y() ); + } + + return true; +} + +void HorizontalScrollBar::OnBarMoved( Controls::Base* control ) +{ + if ( m_Bar->IsDepressed() ) + { + SetScrolledAmount( CalculateScrolledAmount(), false ); + BaseClass::OnBarMoved(control); + } + else + InvalidateParent(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/HorizontalScrollBar.h b/btgui/Gwen/Controls/HorizontalScrollBar.h new file mode 100644 index 000000000..b431b0182 --- /dev/null +++ b/btgui/Gwen/Controls/HorizontalScrollBar.h @@ -0,0 +1,49 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_HORIZONTALSCROLLBAR_H +#define GWEN_CONTROLS_HORIZONTALSCROLLBAR_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Dragger.h" +#include "Gwen/Controls/ScrollBar.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT HorizontalScrollBar : public BaseScrollBar + { + public: + + GWEN_CONTROL( HorizontalScrollBar, BaseScrollBar ); + + virtual void Layout( Skin::Base* skin ); + + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + virtual void OnBarMoved( Controls::Base* control ); + + virtual int GetBarSize() { return m_Bar->Width(); } + virtual int GetBarPos() { return m_Bar->X() - Height(); } + virtual void SetBarSize( int size ) { m_Bar->SetWidth( size ); } + virtual int GetButtonSize() { return Height(); } + + virtual void ScrollToLeft(); + virtual void ScrollToRight(); + virtual void NudgeLeft( Base* control ); + virtual void NudgeRight( Base* control ); + virtual float GetNudgeAmount(); + + virtual float CalculateScrolledAmount(); + virtual bool SetScrolledAmount(float amount, bool forceUpdate); + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/HorizontalSlider.cpp b/btgui/Gwen/Controls/HorizontalSlider.cpp new file mode 100644 index 000000000..5cb0ffd73 --- /dev/null +++ b/btgui/Gwen/Controls/HorizontalSlider.cpp @@ -0,0 +1,45 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/Slider.h" +#include "Gwen/Controls/HorizontalSlider.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + + +GWEN_CONTROL_CONSTRUCTOR( HorizontalSlider ) +{ +} + +float HorizontalSlider::CalculateValue() +{ + return (float)m_SliderBar->X() / (float)( Width() - m_SliderBar->Width() ); +} + +void HorizontalSlider::UpdateBarFromValue() +{ + m_SliderBar->MoveTo( ( Width() - m_SliderBar->Width() ) * ( m_fValue ), m_SliderBar->Y() ); +} + +void HorizontalSlider::OnMouseClickLeft( int x, int y, bool bDown ) +{ + m_SliderBar->MoveTo( CanvasPosToLocal( Gwen::Point( x, y ) ).x - m_SliderBar->Width() * 0.5, m_SliderBar->Y() ); + m_SliderBar->OnMouseClickLeft( x, y, bDown ); + OnMoved( m_SliderBar ); +} + +void HorizontalSlider::Layout(Skin::Base* /*skin*/) +{ + m_SliderBar->SetSize( 10, Height() ); +} + +void HorizontalSlider::Render( Skin::Base* skin ) +{ + skin->DrawSlider( this, true, m_bClampToNotches ? m_iNumNotches : 0, m_SliderBar->Width() ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/HorizontalSlider.h b/btgui/Gwen/Controls/HorizontalSlider.h new file mode 100644 index 000000000..af3da74db --- /dev/null +++ b/btgui/Gwen/Controls/HorizontalSlider.h @@ -0,0 +1,35 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_HORIZONTALSLIDER_H +#define GWEN_CONTROLS_HORIZONTALSLIDER_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/Dragger.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Slider.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT HorizontalSlider : public Slider + { + GWEN_CONTROL( HorizontalSlider, Slider ); + + virtual void Layout( Skin::Base* skin ); + virtual void Render( Skin::Base* skin ); + + virtual float CalculateValue(); + virtual void UpdateBarFromValue(); + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ImagePanel.cpp b/btgui/Gwen/Controls/ImagePanel.cpp new file mode 100644 index 000000000..a84a18c14 --- /dev/null +++ b/btgui/Gwen/Controls/ImagePanel.cpp @@ -0,0 +1,8 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ImagePanel.h" \ No newline at end of file diff --git a/btgui/Gwen/Controls/ImagePanel.h b/btgui/Gwen/Controls/ImagePanel.h new file mode 100644 index 000000000..e29bfa090 --- /dev/null +++ b/btgui/Gwen/Controls/ImagePanel.h @@ -0,0 +1,78 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_IMAGEPANEL_H +#define GWEN_CONTROLS_IMAGEPANEL_H + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/BaseRender.h" +#include "Gwen/Texture.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT ImagePanel : public Controls::Base + { + public: + + GWEN_CONTROL_INLINE( ImagePanel, Controls::Base ) + { + SetUV( 0, 0, 1, 1 ); + SetMouseInputEnabled( false ); + m_DrawColor = Colors::White; + } + + virtual ~ImagePanel() + { + m_Texture.Release( GetSkin()->GetRender() ); + } + + + virtual void SetUV( float u1, float v1, float u2, float v2 ) + { + m_uv[0] = u1; + m_uv[1] = v1; + m_uv[2] = u2; + m_uv[3] = v2; + } + + virtual void SetImage( const TextObject& imageName ) + { + m_Texture.Load( imageName, GetSkin()->GetRender() ); + } + + virtual const TextObject& GetImageName() + { + return m_Texture.name; + } + + virtual void Render( Skin::Base* skin ) + { + skin->GetRender()->SetDrawColor( m_DrawColor ); + skin->GetRender()->DrawTexturedRect( &m_Texture, GetRenderBounds(), m_uv[0], m_uv[1], m_uv[2], m_uv[3] ); + } + + virtual void SizeToContents() + { + SetSize( m_Texture.width, m_Texture.height ); + } + + virtual void SetDrawColor( Gwen::Color& color ) + { + m_DrawColor = color; + } + + Texture m_Texture; + float m_uv[4]; + Gwen::Color m_DrawColor; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Label.cpp b/btgui/Gwen/Controls/Label.cpp new file mode 100644 index 000000000..54ca15843 --- /dev/null +++ b/btgui/Gwen/Controls/Label.cpp @@ -0,0 +1,75 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( Label ) +{ + m_Text = new ControlsInternal::Text( this ); + m_Text->SetFont( GetSkin()->GetDefaultFont() ); + + SetMouseInputEnabled( false ); + SetBounds( 0, 0, 100, 10 ); + SetAlignment( Gwen::Pos::Left | Gwen::Pos::Top ); +} + +void Label::Layout( Skin::Base* /*skin*/ ) +{ + + int iAlign = m_iAlign; + + int x = m_rTextPadding.left + m_Padding.left; + int y = m_rTextPadding.top + m_Padding.top; + + if ( iAlign & Pos::Right ) x = Width() - m_Text->Width() - m_rTextPadding.right - m_Padding.right; + if ( iAlign & Pos::CenterH ) x = (m_rTextPadding.left + m_Padding.left) + ((Width() - m_Text->Width() ) * 0.5f) - m_rTextPadding.right - m_Padding.right; + + if ( iAlign & Pos::CenterV ) y = (m_rTextPadding.top + m_Padding.top) + ((Height() - m_Text->Height()) * 0.5f) - m_rTextPadding.bottom - m_Padding.bottom; + if ( iAlign & Pos::Bottom ) y = Height() - m_Text->Height() - m_rTextPadding.bottom - m_Padding.bottom; + + m_Text->SetPos( x, y ); + +} + +void Label::SetText( const UnicodeString& str, bool bDoEvents ) +{ + if ( m_Text->GetText() == str ) return; + + m_Text->SetString( str ); + Redraw(); + + if ( bDoEvents ) + OnTextChanged(); +} + +void Label::SetText( const String& str, bool bDoEvents ) +{ + SetText( Gwen::Utility::StringToUnicode( str ), bDoEvents ); +} + +void Label::SizeToContents() +{ + m_Text->SetPos( m_rTextPadding.left + m_Padding.left, m_rTextPadding.top + m_Padding.top ); + m_Text->RefreshSize(); + + SetSize( m_Text->Width() + m_Padding.left + m_Padding.right + m_rTextPadding.left + m_rTextPadding.right, m_Text->Height() + m_Padding.top + m_Padding.bottom + m_rTextPadding.top + m_rTextPadding.bottom ); + +} + +Gwen::Point Label::GetCharacterPosition( int iChar ) +{ + Gwen::Point p = m_Text->GetCharacterPosition( iChar ); + p.x += m_Text->X(); + p.y += m_Text->Y(); + + return p; +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Label.h b/btgui/Gwen/Controls/Label.h new file mode 100644 index 000000000..f9d55d7dd --- /dev/null +++ b/btgui/Gwen/Controls/Label.h @@ -0,0 +1,70 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_LABEL_H +#define GWEN_CONTROLS_LABEL_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Text.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT Label : public Controls::Base + { + public: + + GWEN_CONTROL( Label, Controls::Base ); + + virtual void SetText( const UnicodeString& str, bool bDoEvents = true ); + virtual void SetText( const String& str, bool bDoEvents = true ); + + virtual const UnicodeString& GetText() const { return m_Text->GetText(); } + + virtual void Render( Skin::Base* /*skin*/ ){} + + virtual void Layout( Skin::Base* skin ); + + virtual void SizeToContents(); + + virtual void SetAlignment( int iAlign ){ m_iAlign = iAlign; } + + virtual void SetFont( Gwen::Font* pFont ){ m_Text->SetFont( pFont ); } + virtual Gwen::Font* GetFont(){ return m_Text->GetFont(); } + virtual void SetTextColor( const Gwen::Color& col ){ m_Text->SetTextColor( col ); } + inline const Gwen::Color &TextColor() const { return m_Text->TextColor(); } + + virtual int TextWidth() { return m_Text->Width(); } + virtual int TextRight() { return m_Text->Right(); } + virtual int TextHeight() { return m_Text->Height(); } + virtual int TextX() { return m_Text->X(); } + virtual int TextY() { return m_Text->Y(); } + virtual int TextLength() { return m_Text->Length(); } + + Gwen::Point GetCharacterPosition( int iChar ); + + virtual void SetTextPadding( const Padding& padding ){ m_rTextPadding = padding; Invalidate(); InvalidateParent(); } + virtual const Padding& GetTextPadding(){ return m_rTextPadding; } + + virtual Gwen::UnicodeString GetText() { return m_Text->GetText(); } + + inline int Alignment() const { return m_iAlign; } + protected: + + virtual void OnTextChanged(){}; + + Padding m_rTextPadding; + ControlsInternal::Text* m_Text; + int m_iAlign; + + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/LabelClickable.cpp b/btgui/Gwen/Controls/LabelClickable.cpp new file mode 100644 index 000000000..b497d7d49 --- /dev/null +++ b/btgui/Gwen/Controls/LabelClickable.cpp @@ -0,0 +1,25 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/LabelClickable.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( LabelClickable ) +{ + SetIsToggle( false ); + + SetAlignment( Gwen::Pos::Left | Gwen::Pos::CenterV ); +} + +void LabelClickable::Render( Skin::Base* /*skin*/ ) +{ + //skin->DrawButton( this, IsDepressed(), IsToggle() && GetToggleState() ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/LabelClickable.h b/btgui/Gwen/Controls/LabelClickable.h new file mode 100644 index 000000000..123797bf7 --- /dev/null +++ b/btgui/Gwen/Controls/LabelClickable.h @@ -0,0 +1,29 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_LABELCLICKABLE_H +#define GWEN_CONTROLS_LABELCLICKABLE_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT LabelClickable : public Button + { + public: + + GWEN_CONTROL( LabelClickable, Button ); + + virtual void Render( Skin::Base* skin ); + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Layout/Splitter (2).h b/btgui/Gwen/Controls/Layout/Splitter (2).h new file mode 100644 index 000000000..847f65ce8 --- /dev/null +++ b/btgui/Gwen/Controls/Layout/Splitter (2).h @@ -0,0 +1,83 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#pragma once +#include "Gwen/Controls/Base.h" + +namespace Gwen +{ + namespace Controls + { + namespace Layout + { + + class Splitter : public Base + { + public: + + typedef Base BaseClass; + + Splitter( Base* pParent ) : BaseClass( pParent ) + { + for ( int i=0; i<2; i++ ) + m_pPanel[i] = NULL; + } + + void SetPanel( int i, Base* pPanel ) + { + if ( i < 0 || i > 1 ) return; + + m_pPanel[i] = pPanel; + + if ( m_pPanel[i] ) + { + m_pPanel[i] ->SetParent( this ); + } + } + + Base* GetPanel( int i ) const + { + if ( i < 0 || i > 1 ) return NULL; + return m_pPanel[i]; + } + + void Layout( Skin::Base* skin ) + { + LayoutVertical( skin ); + } + + private: + + void LayoutVertical( Skin::Base* skin ) + { + int w = Width(); + int h = Height(); + + if ( m_pPanel[0] ) + { + const Margin& m = m_pPanel[0]->GetMargin(); + m_pPanel[0]->SetBounds( m.left, m.top, w-m.left-m.right, (h * 0.5) - m.top - m.bottom ); + } + + if ( m_pPanel[1] ) + { + const Margin& m = m_pPanel[1]->GetMargin(); + m_pPanel[1]->SetBounds( m.left, m.top + (h * 0.5f), w-m.left-m.right, (h * 0.5f) - m.top - m.bottom ); + } + } + + void LayoutHorizontal( Skin::Base* skin ) + { + // Todo. + } + + Base* m_pPanel[2]; + + }; + } + } +} diff --git a/btgui/Gwen/Controls/Layout/Splitter - Copy.h b/btgui/Gwen/Controls/Layout/Splitter - Copy.h new file mode 100644 index 000000000..f72b19663 --- /dev/null +++ b/btgui/Gwen/Controls/Layout/Splitter - Copy.h @@ -0,0 +1,87 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#pragma once +#ifndef GWEN_CONTROLS_LAYOUT_SPLITTER_H +#define GWEN_CONTROLS_LAYOUT_SPLITTER_H + +#include "Gwen/Controls/Base.h" + +namespace Gwen +{ + namespace Controls + { + namespace Layout + { + + class GWEN_EXPORT Splitter : public Base + { + public: + + typedef Base BaseClass; + + Splitter( Base* pParent ) : BaseClass( pParent ) + { + for ( int i=0; i<2; i++ ) + m_pPanel[i] = NULL; + } + + void SetPanel( int i, Base* pPanel ) + { + if ( i < 0 || i > 1 ) return; + + m_pPanel[i] = pPanel; + + if ( m_pPanel[i] ) + { + m_pPanel[i] ->SetParent( this ); + } + } + + Base* GetPanel( int i ) const + { + if ( i < 0 || i > 1 ) return NULL; + return m_pPanel[i]; + } + + void Layout( Skin::Base* skin ) + { + LayoutVertical( skin ); + } + + private: + + void LayoutVertical( Skin::Base* /*skin*/ ) + { + int w = Width(); + int h = Height(); + + if ( m_pPanel[0] ) + { + const Margin& m = m_pPanel[0]->GetMargin(); + m_pPanel[0]->SetBounds( m.left, m.top, w-m.left-m.right, (h * 0.5) - m.top - m.bottom ); + } + + if ( m_pPanel[1] ) + { + const Margin& m = m_pPanel[1]->GetMargin(); + m_pPanel[1]->SetBounds( m.left, m.top + (h * 0.5f), w-m.left-m.right, (h * 0.5f) - m.top - m.bottom ); + } + } + + void LayoutHorizontal( Skin::Base* /*skin*/ ) + { + // Todo. + } + + Base* m_pPanel[2]; + + }; + } + } +} +#endif diff --git a/btgui/Gwen/Controls/Layout/Splitter.h b/btgui/Gwen/Controls/Layout/Splitter.h new file mode 100644 index 000000000..f72b19663 --- /dev/null +++ b/btgui/Gwen/Controls/Layout/Splitter.h @@ -0,0 +1,87 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#pragma once +#ifndef GWEN_CONTROLS_LAYOUT_SPLITTER_H +#define GWEN_CONTROLS_LAYOUT_SPLITTER_H + +#include "Gwen/Controls/Base.h" + +namespace Gwen +{ + namespace Controls + { + namespace Layout + { + + class GWEN_EXPORT Splitter : public Base + { + public: + + typedef Base BaseClass; + + Splitter( Base* pParent ) : BaseClass( pParent ) + { + for ( int i=0; i<2; i++ ) + m_pPanel[i] = NULL; + } + + void SetPanel( int i, Base* pPanel ) + { + if ( i < 0 || i > 1 ) return; + + m_pPanel[i] = pPanel; + + if ( m_pPanel[i] ) + { + m_pPanel[i] ->SetParent( this ); + } + } + + Base* GetPanel( int i ) const + { + if ( i < 0 || i > 1 ) return NULL; + return m_pPanel[i]; + } + + void Layout( Skin::Base* skin ) + { + LayoutVertical( skin ); + } + + private: + + void LayoutVertical( Skin::Base* /*skin*/ ) + { + int w = Width(); + int h = Height(); + + if ( m_pPanel[0] ) + { + const Margin& m = m_pPanel[0]->GetMargin(); + m_pPanel[0]->SetBounds( m.left, m.top, w-m.left-m.right, (h * 0.5) - m.top - m.bottom ); + } + + if ( m_pPanel[1] ) + { + const Margin& m = m_pPanel[1]->GetMargin(); + m_pPanel[1]->SetBounds( m.left, m.top + (h * 0.5f), w-m.left-m.right, (h * 0.5f) - m.top - m.bottom ); + } + } + + void LayoutHorizontal( Skin::Base* /*skin*/ ) + { + // Todo. + } + + Base* m_pPanel[2]; + + }; + } + } +} +#endif diff --git a/btgui/Gwen/Controls/Layout/Table (2).h b/btgui/Gwen/Controls/Layout/Table (2).h new file mode 100644 index 000000000..43dd667c7 --- /dev/null +++ b/btgui/Gwen/Controls/Layout/Table (2).h @@ -0,0 +1,264 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#pragma once +#include "Gwen/Controls/Label.h" + +namespace Gwen +{ + namespace Controls + { + namespace Layout + { + class Table; + + class TableRow : public Base + { + static const int MaxColumns = 5; + + GWEN_CONTROL_INLINE( TableRow, Base ) + { + for ( int i=0; i= MaxColumns ) + m_ColumnCount = MaxColumns; + + for ( int i=0; iDock( Pos::Left ); + m_Columns[i]->SetTextPadding( Gwen::Rect( 3, 3, 3, 3 ) ); + } + } + else if ( m_Columns[i] ) + { + m_Columns[i]->DelayedDelete(); + m_Columns[i] = NULL; + } + + m_ColumnCount = iCount; + } + } + + void SetColumnWidth( int i, int iWidth ) + { + if ( !m_Columns[i] ) return; + if ( m_Columns[i]->Width() == iWidth ) return; + + m_Columns[i]->SetWidth( iWidth ); + } + + template + void SetCellText( int i, const T& strString ) + { + if ( !m_Columns[i] ) return; + m_Columns[i]->SetText( strString ); + } + + void SetCellContents( int i, Base* pControl, bool bEnableMouseInput = false ) + { + if ( !m_Columns[i] ) return; + pControl->SetParent( m_Columns[i] ); + + m_Columns[i]->SetMouseInputEnabled( bEnableMouseInput ); + } + + Label* GetCellContents( int i ) + { + return m_Columns[i]; + } + + void SizeToContents() + { + int iHeight = 0; + + for ( int i=0; iNumChildren() > 1 ) + { + m_Columns[i]->SizeToChildren(); + } + else + { + m_Columns[i]->SizeToContents(); + } + + iHeight = max( iHeight, m_Columns[i]->Height() ); + } + + SetHeight( iHeight ); + } + + void SetTextColor( const Gwen::Color& color ) + { + for ( int i=0; iSetTextColor( color ); + } + } + + //You might hate this. Actually I know you will + virtual UnicodeString GetText( int i ) + { + return m_Columns[i]->GetText(); + } + virtual void SetSelected( bool b ) {} + + private: + + int m_ColumnCount; + Label* m_Columns[MaxColumns]; + + friend class Table; + + + }; + + class Table : public Base + { + public: + + GWEN_CONTROL_INLINE( Table, Base ) + { + m_iColumnCount = 1; + m_iDefaultRowHeight = 22; + + for (int i=0; igetType()!=TypeTableRow) + continue; + + TableRow* pRow = static_cast(*it); + + pRow->SetColumnCount( i ); + } + + m_iColumnCount = i; + } + + void SetColumnWidth( int i, int iWidth ) + { + if ( m_ColumnWidth[i] == iWidth ) return; + + m_ColumnWidth[i] = iWidth; + Invalidate(); + } + + TableRow* AddRow() + { + TableRow* row = new TableRow( this ); + row->SetColumnCount( m_iColumnCount ); + row->SetHeight( m_iDefaultRowHeight ); + row->Dock( Pos::Top ); + return row; + } + + void AddRow( TableRow* pRow ) + { + pRow->SetParent( this ); + pRow->SetColumnCount( m_iColumnCount ); + pRow->SetHeight( m_iDefaultRowHeight ); + pRow->Dock( Pos::Top ); + } + + void Layout( Skin::Base* skin ) + { + Debug::Msg( "TABLE LAYOUT\n" ); + BaseClass::Layout( skin ); + + if ( m_bSizeToContents ) + { + DoSizeToContents(); + m_bSizeToContents = false; + } + + for ( Base::List::iterator it = m_Children.begin(); it != m_Children.end(); ++it ) + { + TableRow* pRow = static_cast(*it); + if ( !pRow ) continue; + + for (int i=0; iSetColumnWidth( i, m_ColumnWidth[i] ); + } + } + } + + void SizeToContents() + { + m_bSizeToContents = true; + Invalidate(); + } + + void DoSizeToContents() + { + for (int i=0; i(*it); + if ( !pRow ) continue; + + pRow->SizeToContents(); + + for (int i=0; im_Columns[i] ) + { + m_ColumnWidth[i] = max( m_ColumnWidth[i], pRow->m_Columns[i]->Width() ); + } + } + } + + Invalidate(); + } + + private: + + bool m_bSizeToContents; + int m_iColumnCount; + int m_iDefaultRowHeight; + + int m_ColumnWidth[ TableRow::MaxColumns ]; + }; + } + } +} diff --git a/btgui/Gwen/Controls/Layout/Table - Copy.h b/btgui/Gwen/Controls/Layout/Table - Copy.h new file mode 100644 index 000000000..6fee90d59 --- /dev/null +++ b/btgui/Gwen/Controls/Layout/Table - Copy.h @@ -0,0 +1,294 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_LAYOUT_TABLE_H +#define GWEN_CONTROLS_LAYOUT_TABLE_H + +#include "Gwen/Controls/Label.h" +#include "Gwen/Utility.h" + + +namespace Gwen +{ + namespace Controls + { + namespace Layout + { + class Table; + + class GWEN_EXPORT TableRow : public Base + { + static const int MaxColumns = 5; + + GWEN_CONTROL_INLINE( TableRow, Base ) + { + for ( int i=0; i= MaxColumns ) + m_ColumnCount = MaxColumns; + + for ( int i=0; iDock( Pos::Left ); + m_Columns[i]->SetPadding( Padding( 3, 3, 3, 3 ) ); + } + } + else if ( m_Columns[i] ) + { + m_Columns[i]->DelayedDelete(); + m_Columns[i] = NULL; + } + + m_ColumnCount = iCount; + } + } + + void SetColumnWidth( int i, int iWidth ) + { + if ( !m_Columns[i] ) return; + if ( m_Columns[i]->Width() == iWidth ) return; + + m_Columns[i]->SetWidth( iWidth ); + } + + template + void SetCellText( int i, const T& strString ) + { + if ( !m_Columns[i] ) return; + m_Columns[i]->SetText( strString ); + } + + void SetCellContents( int i, Base* pControl, bool bEnableMouseInput = false ) + { + if ( !m_Columns[i] ) return; + pControl->SetParent( m_Columns[i] ); + + m_Columns[i]->SetMouseInputEnabled( bEnableMouseInput ); + } + + Label* GetCellContents( int i ) + { + return m_Columns[i]; + } + + void SizeToContents() + { + int iHeight = 0; + + for ( int i=0; iNumChildren() > 1 ) + { + m_Columns[i]->SizeToChildren(); + } + else + { + m_Columns[i]->SizeToContents(); + } + + iHeight = Utility::Max( iHeight, m_Columns[i]->Height() ); + } + + SetHeight( iHeight ); + } + + void SetTextColor( const Gwen::Color& color ) + { + for ( int i=0; iSetTextColor( color ); + } + } + + //You might hate this. Actually I know you will + virtual UnicodeString GetText( int i ) + { + return m_Columns[i]->GetText(); + } + virtual void SetSelected( bool /*b*/ ) {} + + // + // This is sometimes called by derivatives. + // + Gwen::Event::Caller onRowSelected; + + private: + + int m_ColumnCount; + Label* m_Columns[MaxColumns]; + + friend class Table; + + + }; + + class GWEN_EXPORT Table : public Base + { + public: + + GWEN_CONTROL_INLINE( Table, Base ) + { + m_iColumnCount = 1; + m_iDefaultRowHeight = 22; + + for (int i=0; i(*it); + if ( !pRow ) continue; + + pRow->SetColumnCount( i ); + } + + m_iColumnCount = i; + } + + void SetColumnWidth( int i, int iWidth ) + { + if ( m_ColumnWidth[i] == iWidth ) return; + + m_ColumnWidth[i] = iWidth; + Invalidate(); + } + + TableRow* AddRow() + { + TableRow* row = new TableRow( this ); + row->SetColumnCount( m_iColumnCount ); + row->SetHeight( m_iDefaultRowHeight ); + row->Dock( Pos::Top ); + return row; + } + + void AddRow( TableRow* pRow ) + { + pRow->SetParent( this ); + pRow->SetColumnCount( m_iColumnCount ); + pRow->SetHeight( m_iDefaultRowHeight ); + pRow->Dock( Pos::Top ); + } + + void Remove( TableRow* pRow ) + { + pRow->DelayedDelete(); + } + + void Clear() + { + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + TableRow* pRow = static_cast(*it); + if ( !pRow ) continue; + Remove( pRow ); + } + } + + void Layout( Skin::Base* skin ) + { + BaseClass::Layout( skin ); + + if ( m_bSizeToContents ) + { + DoSizeToContents(); + } + + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + TableRow* pRow = static_cast(*it); + if ( !pRow ) continue; + + for (int i=0; iSetColumnWidth( i, m_ColumnWidth[i] ); + } + } + } + + void PostLayout( Skin::Base* /*skin*/ ) + { + if ( m_bSizeToContents ) + { + SizeToChildren(); + m_bSizeToContents = false; + } + } + + void SizeToContents() + { + m_bSizeToContents = true; + Invalidate(); + } + + void DoSizeToContents() + { + for (int i=0; i(*it); + if ( !pRow ) continue; + + pRow->SizeToContents(); + + for (int i=0; im_Columns[i] ) + { + m_ColumnWidth[i] = Utility::Max( m_ColumnWidth[i], pRow->m_Columns[i]->Width() ); + } + } + //iBottom += pRow->Height(); + } + + InvalidateParent(); + } + + private: + + bool m_bSizeToContents; + int m_iColumnCount; + int m_iDefaultRowHeight; + + int m_ColumnWidth[ TableRow::MaxColumns ]; + }; + } + } +} +#endif diff --git a/btgui/Gwen/Controls/Layout/Table.h b/btgui/Gwen/Controls/Layout/Table.h new file mode 100644 index 000000000..bbc1c8f9c --- /dev/null +++ b/btgui/Gwen/Controls/Layout/Table.h @@ -0,0 +1,317 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_LAYOUT_TABLE_H +#define GWEN_CONTROLS_LAYOUT_TABLE_H + +#include "Gwen/Controls/Label.h" +#include "Gwen/Utility.h" + + +namespace Gwen +{ + namespace Controls + { + namespace Layout + { + class Table; + + class GWEN_EXPORT TableRow : public Base + { + static const int MaxColumns = 5; + + GWEN_CONTROL_INLINE( TableRow, Base ) + { + for ( int i=0; i= MaxColumns ) + m_ColumnCount = MaxColumns; + + for ( int i=0; iDock( Pos::Left ); + m_Columns[i]->SetPadding( Padding( 3, 3, 3, 3 ) ); + } + } + else if ( m_Columns[i] ) + { + m_Columns[i]->DelayedDelete(); + m_Columns[i] = NULL; + } + + m_ColumnCount = iCount; + } + } + + void SetColumnWidth( int i, int iWidth ) + { + if ( !m_Columns[i] ) return; + if ( m_Columns[i]->Width() == iWidth ) return; + + m_Columns[i]->SetWidth( iWidth ); + } + + template + void SetCellText( int i, const T& strString ) + { + if ( !m_Columns[i] ) return; + m_Columns[i]->SetText( strString ); + } + + void SetCellContents( int i, Base* pControl, bool bEnableMouseInput = false ) + { + if ( !m_Columns[i] ) return; + pControl->SetParent( m_Columns[i] ); + + m_Columns[i]->SetMouseInputEnabled( bEnableMouseInput ); + } + + Label* GetCellContents( int i ) + { + return m_Columns[i]; + } + + void SizeToContents() + { + int iHeight = 0; + + for ( int i=0; iNumChildren() > 1 ) + { + m_Columns[i]->SizeToChildren(); + } + else + { + m_Columns[i]->SizeToContents(); + } + + iHeight = Utility::Max( iHeight, m_Columns[i]->Height() ); + } + + SetHeight( iHeight ); + } + + void SetTextColor( const Gwen::Color& color ) + { + for ( int i=0; iSetTextColor( color ); + } + } + + //You might hate this. Actually I know you will + virtual UnicodeString GetText( int i ) + { + return m_Columns[i]->GetText(); + } + virtual void SetSelected( bool /*b*/ ) {} + + // + // This is sometimes called by derivatives. + // + Gwen::Event::Caller onRowSelected; + + private: + + int m_ColumnCount; + Label* m_Columns[MaxColumns]; + + friend class Table; + + + }; + + class GWEN_EXPORT Table : public Base + { + public: + + GWEN_CONTROL_INLINE( Table, Base ) + { + m_iColumnCount = 1; + m_iDefaultRowHeight = 22; + + for (int i=0; iDynamicCastLayoutTableRow(); + if ( !pRow ) continue; + + pRow->SetColumnCount( i ); + } + + m_iColumnCount = i; + } + + void SetColumnWidth( int i, int iWidth ) + { + if ( m_ColumnWidth[i] == iWidth ) return; + + m_ColumnWidth[i] = iWidth; + Invalidate(); + } + + TableRow* AddRow() + { + TableRow* row = new TableRow( this ); + row->SetColumnCount( m_iColumnCount ); + row->SetHeight( m_iDefaultRowHeight ); + row->Dock( Pos::Top ); + return row; + } + + void AddRow( TableRow* pRow ) + { + pRow->SetParent( this ); + pRow->SetColumnCount( m_iColumnCount ); + pRow->SetHeight( m_iDefaultRowHeight ); + pRow->Dock( Pos::Top ); + } + + void Remove( TableRow* pRow ) + { + pRow->DelayedDelete(); + } + + void Clear() + { + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + if (!(*it)) + continue; + + TableRow* pRow = (*it)->DynamicCastLayoutTableRow(); + + if ( !pRow ) continue; + Remove( pRow ); + } + } + + void Layout( Skin::Base* skin ) + { + BaseClass::Layout( skin ); + + if ( m_bSizeToContents ) + { + DoSizeToContents(); + } + + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + if (!*it) + continue; + + TableRow* pRow = (*it)->DynamicCastLayoutTableRow(); + if ( !pRow ) continue; + + for (int i=0; iSetColumnWidth( i, m_ColumnWidth[i] ); + } + } + } + + void PostLayout( Skin::Base* /*skin*/ ) + { + if ( m_bSizeToContents ) + { + SizeToChildren(); + m_bSizeToContents = false; + } + } + + void SizeToContents() + { + m_bSizeToContents = true; + Invalidate(); + } + + void DoSizeToContents() + { + for (int i=0; iDynamicCastLayoutTableRow(); + if ( !pRow ) continue; + + pRow->SizeToContents(); + + for (int i=0; im_Columns[i] ) + { + m_ColumnWidth[i] = Utility::Max( m_ColumnWidth[i], pRow->m_Columns[i]->Width() ); + } + } + //iBottom += pRow->Height(); + } + + InvalidateParent(); + } + + private: + + bool m_bSizeToContents; + int m_iColumnCount; + int m_iDefaultRowHeight; + + int m_ColumnWidth[ TableRow::MaxColumns ]; + }; + } + } +} +#endif diff --git a/btgui/Gwen/Controls/ListBox.cpp b/btgui/Gwen/Controls/ListBox.cpp new file mode 100644 index 000000000..137b2aeb4 --- /dev/null +++ b/btgui/Gwen/Controls/ListBox.cpp @@ -0,0 +1,143 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ListBox.h" +#include "Gwen/Controls/ScrollControl.h" +#include "Gwen/InputHandler.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +class ListBoxRow : public Layout::TableRow +{ + GWEN_CONTROL_INLINE( ListBoxRow, Layout::TableRow ) + { + SetMouseInputEnabled( true ); + SetSelected( false ); + } + + void Render( Skin::Base* skin ) + { + skin->DrawListBoxLine( this, IsSelected() ); + } + + bool IsSelected() const + { + return m_bSelected; + } + + void OnMouseClickLeft( int /*x*/, int /*y*/, bool bDown ) + { + if ( bDown && !m_bSelected ) + { + SetSelected( true ); + onRowSelected.Call( this ); + } + } + + void SetSelected( bool b ) + { + m_bSelected = b; + + // TODO: Get these values from the skin. + if ( b ) + SetTextColor( Gwen::Colors::White ); + else + SetTextColor( Gwen::Colors::Black ); + } + + private: + + bool m_bSelected; + +}; + +GWEN_CONTROL_CONSTRUCTOR( ListBox ) +{ + m_ScrollControl = new ScrollControl( this ); + m_ScrollControl->Dock( Pos::Fill ); + m_ScrollControl->SetScroll( false, true ); + m_ScrollControl->SetAutoHideBars( true ); + m_ScrollControl->SetMargin( Margin( 1, 1, 1, 1 ) ); + + m_InnerPanel = m_ScrollControl; + + m_Table = new Controls::Layout::Table( this ); + m_Table->Dock( Pos::Top ); + m_Table->SetColumnCount( 1 ); + + m_bMultiSelect = false; +} + +void ListBox::OnChildBoundsChanged( Gwen::Rect /*oldChildBounds*/, Base* /*pChild*/ ) +{ + m_ScrollControl->UpdateScrollBars(); +} + +Layout::TableRow* ListBox::AddItem( const String& strLabel, const String& strName ) +{ + return AddItem( Utility::StringToUnicode( strLabel ), strName ); +} + +Layout::TableRow* ListBox::AddItem( const UnicodeString& strLabel, const String& strName ) +{ + ListBoxRow* pRow = new ListBoxRow( this ); + m_Table->AddRow( pRow ); + + pRow->SetCellText( 0, strLabel ); + pRow->SetName( strName ); + + pRow->onRowSelected.Add( this, &ListBox::OnRowSelected ); + + m_Table->SizeToContents(); + + return pRow; +} + +void ListBox::Render( Skin::Base* skin ) +{ + skin->DrawListBox( this ); +} + +void ListBox::UnselectAll() +{ + std::list::iterator it = m_SelectedRows.begin(); + while ( it != m_SelectedRows.end() ) + { + ListBoxRow* pRow = static_cast(*it); + it = m_SelectedRows.erase( it ); + + pRow->SetSelected( false ); + } +} + +void ListBox::OnRowSelected( Base* pControl ) +{ + ListBoxRow* pRow = static_cast(pControl); + + if ( !AllowMultiSelect() || !Gwen::Input::IsShiftDown() ) + { + UnselectAll(); + } + + m_SelectedRows.push_back( pRow ); + + onRowSelected.Call( this ); +} + +Layout::TableRow* ListBox::GetSelectedRow() +{ + if ( m_SelectedRows.empty() ) return NULL; + + return *m_SelectedRows.begin(); +} + +void ListBox::Clear() +{ + UnselectAll(); + m_Table->Clear(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/ListBox.h b/btgui/Gwen/Controls/ListBox.h new file mode 100644 index 000000000..c54ca62fd --- /dev/null +++ b/btgui/Gwen/Controls/ListBox.h @@ -0,0 +1,67 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_LISTBOX_H +#define GWEN_CONTROLS_LISTBOX_H + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Layout/Table.h" +#include "Gwen/Controls/ScrollControl.h" + + +namespace Gwen +{ + namespace Controls + { + class ScrollControl; + + class GWEN_EXPORT ListBox : public Base + { + public: + + GWEN_CONTROL( ListBox, Base ); + + typedef std::list Rows; + + Layout::TableRow* AddItem( const String& strLabel, const String& strName = "" ); + Layout::TableRow* AddItem( const UnicodeString& strLabel, const String& strName = "" ); + + void Render( Skin::Base* skin ); + + void UnselectAll(); + + void SetColumnCount( int iCount ) { m_Table->SetColumnCount( iCount ); } + + void SetAllowMultiSelect( bool bMultiSelect ){ m_bMultiSelect = bMultiSelect; } + bool AllowMultiSelect() const { return m_bMultiSelect; } + + const ListBox::Rows& GetSelectedRows(){ return m_SelectedRows; } + Layout::TableRow* GetSelectedRow(); + + Gwen::Controls::ScrollControl* Scroller() { return m_ScrollControl; } + + void OnChildBoundsChanged( Gwen::Rect oldChildBounds, Base* pChild ); + + Gwen::Event::Caller onRowSelected; + + Controls::Layout::Table* GetTable() { return m_Table; } + virtual void Clear(); + + protected: + + + void OnRowSelected( Base* pControl ); + + Controls::Layout::Table* m_Table; + ListBox::Rows m_SelectedRows; + Controls::ScrollControl* m_ScrollControl; + + bool m_bMultiSelect; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Menu.cpp b/btgui/Gwen/Controls/Menu.cpp new file mode 100644 index 000000000..989be4ef4 --- /dev/null +++ b/btgui/Gwen/Controls/Menu.cpp @@ -0,0 +1,172 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Menu.h" +#include "Gwen/Skin.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + + + +GWEN_CONTROL_CONSTRUCTOR( Menu ) +{ + SetBounds( 0, 0, 10, 10 ); + SetPadding( Padding( 2, 2, 2, 2 ) ); + + SetDisableIconMargin( false ); + + SetAutoHideBars( true ); + SetScroll( false, true ); +} + + +void Menu::Render( Skin::Base* skin ) +{ + skin->DrawMenu( this, IconMarginDisabled() ); +} + +void Menu::RenderUnder( Skin::Base* skin ) +{ + BaseClass::RenderUnder( skin ); + skin->DrawShadow( this ); +} + +void Menu::Layout( Skin::Base* skin ) +{ + int childrenHeight = 0; + for ( Base::List::iterator it = m_InnerPanel->Children.begin(); it != m_InnerPanel->Children.end(); ++it ) + { + Base* pChild = (*it); + if ( !pChild ) + continue; + + childrenHeight += pChild->Height(); + } + + if ( Y() + childrenHeight > GetCanvas()->Height() ) + childrenHeight = GetCanvas()->Height() - Y(); + + SetSize( Width(), childrenHeight ); + + BaseClass::Layout( skin ); +} + +MenuItem* Menu::AddItem( const Gwen::UnicodeString& strName, const UnicodeString& strIconName, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::Function fn ) +{ + MenuItem* pItem = new MenuItem( this ); + pItem->SetText( strName ); + pItem->SetImage( strIconName ); + + if ( fn && pHandler ) + { + pItem->onMenuItemSelected.Add( pHandler, fn ); + } + + OnAddItem( pItem ); + + return pItem; +} + +void Menu::OnAddItem( MenuItem* item ) +{ + item->Dock( Pos::Top ); + item->SetTextPadding( Padding( IconMarginDisabled() ? 0 : 24, 0, 16, 0 ) ); + item->SetPadding( Padding( 4, 4, 4, 4 ) ); + item->SizeToContents(); + item->SetAlignment( Pos::CenterV | Pos::Left ); + item->onHoverEnter.Add( this, &Menu::OnHoverItem ); + + // Do this here - after Top Docking these values mean nothing in layout + int w = item->Width() + 10 + 32; + if ( w < Width() ) w = Width(); + SetSize( w, Height() ); +} + +void Menu::ClearItems() +{ + for ( Base::List::iterator it = m_InnerPanel->Children.begin(); it != m_InnerPanel->Children.end(); ++it ) + { + Base* pChild = *it; + + if ( !pChild ) continue; + pChild->DelayedDelete(); + } +} + +MenuItem* Menu::AddItem( const Gwen::String& strName, const String& strIconName, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::Function fn ) +{ + return AddItem( Gwen::Utility::StringToUnicode( strName ), Gwen::Utility::StringToUnicode( strIconName ), pHandler, fn ); +} + + +void Menu::CloseAll() +{ + for ( Base::List::iterator it = m_InnerPanel->Children.begin(); it != m_InnerPanel->Children.end(); ++it ) + { + Base* pChild = *it; + MenuItem* pItem = pChild->DynamicCastMenuItem(); + if ( !pItem ) continue; + + pItem->CloseMenu(); + } +} + +bool Menu::IsMenuOpen() +{ + for ( Base::List::iterator it = m_InnerPanel->Children.begin(); it != m_InnerPanel->Children.end(); ++it ) + { + Base* pChild = *it; + MenuItem* pItem = pChild->DynamicCastMenuItem(); + if ( !pItem ) continue; + + if ( pItem->IsMenuOpen() ) + return true; + } + + return false; +} + +void Menu::OnHoverItem( Gwen::Controls::Base* pControl ) +{ + if ( !ShouldHoverOpenMenu() ) return; + + MenuItem* pItem = pControl->DynamicCastMenuItem(); + if (!pItem) return; + if ( pItem->IsMenuOpen() ) return; + + CloseAll(); + pItem->OpenMenu(); +} + +void Menu::Close() +{ + SetHidden( true ); +} + +void Menu::CloseMenus() +{ + BaseClass::CloseMenus(); + + CloseAll(); + Close(); +} + +void Menu::AddDivider() +{ + MenuDivider* divider = new MenuDivider( this ); + divider->Dock( Pos::Top ); + divider->SetMargin( Margin( IconMarginDisabled() ? 0 : 24, 0, 4, 0 ) ); +} + +void MenuDivider::Render( Gwen::Skin::Base* skin ) +{ + skin->DrawMenuDivider( this ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Menu.h b/btgui/Gwen/Controls/Menu.h new file mode 100644 index 000000000..67e514dde --- /dev/null +++ b/btgui/Gwen/Controls/Menu.h @@ -0,0 +1,86 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_MENU_H +#define GWEN_CONTROLS_MENU_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/MenuItem.h" +#include "Gwen/Controls/ScrollControl.h" + +namespace Gwen +{ + namespace Controls + { + class MenuItem; + + class GWEN_EXPORT Menu : public ScrollControl + { + public: + + GWEN_CONTROL( Menu, ScrollControl ); + + virtual void Render( Skin::Base* skin ); + virtual void RenderUnder( Skin::Base* skin ); + + virtual void Layout( Skin::Base* skin ); + + virtual MenuItem* AddItem( const Gwen::UnicodeString& strName, const UnicodeString& strIconName, Gwen::Event::Handler* pHandler = NULL, Gwen::Event::Handler::Function fn = NULL ); + + virtual MenuItem* AddItem( const Gwen::UnicodeString& strName, Gwen::Event::Handler* pHandler = NULL, Gwen::Event::Handler::Function fn = NULL ) + { + return AddItem( strName, L"", pHandler, fn ); + } + + virtual MenuItem* AddItem( const Gwen::String& strName, const String& strIconName, Gwen::Event::Handler* pHandler = NULL, Gwen::Event::Handler::Function fn = NULL ); + + virtual MenuItem* AddItem( const Gwen::String& strName, Gwen::Event::Handler* pHandler = NULL, Gwen::Event::Handler::Function fn = NULL ) + { + return AddItem( strName, "", pHandler, fn ); + } + + virtual void AddDivider(); + + void OnHoverItem( Gwen::Controls::Base* pControl ); + void CloseAll(); + bool IsMenuOpen(); + void ClearItems(); + + virtual void Close(); + + virtual bool IsMenuComponent(){ return true; } + virtual void CloseMenus(); + + bool IconMarginDisabled() { return m_bDisableIconMargin; } + void SetDisableIconMargin( bool bDisable ) { m_bDisableIconMargin = bDisable; } + + virtual bool ShouldClip(){ return false; } + + protected: + + virtual bool ShouldHoverOpenMenu(){ return true; } + virtual void OnAddItem( MenuItem* item ); + + bool m_bDisableIconMargin; + }; + + class GWEN_EXPORT MenuDivider : public Base + { + public: + + GWEN_CONTROL_INLINE( MenuDivider, Base ) + { + SetHeight( 1 ); + } + + void Render( Gwen::Skin::Base* skin ); + }; + } + +} +#endif diff --git a/btgui/Gwen/Controls/MenuItem.cpp b/btgui/Gwen/Controls/MenuItem.cpp new file mode 100644 index 000000000..8eeeab6c2 --- /dev/null +++ b/btgui/Gwen/Controls/MenuItem.cpp @@ -0,0 +1,137 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/MenuItem.h" +#include "Gwen/Skin.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( MenuItem ) +{ + m_Menu = NULL; + m_bOnStrip = false; + m_SubmenuArrow = NULL; + SetTabable( false ); + SetCheckable( false ); + SetCheck( false ); +} + +MenuItem::~MenuItem() +{ + +} + +void MenuItem::Render( Skin::Base* skin ) +{ + skin->DrawMenuItem( this, IsMenuOpen(), m_bCheckable ? m_bChecked : false ); +} + +void MenuItem::Layout( Skin::Base* skin ) +{ + BaseClass::Layout( skin ); + +} + +Menu* MenuItem::GetMenu() +{ + if ( !m_Menu ) + { + m_Menu = new Menu( GetCanvas() ); + m_Menu->SetHidden( true ); + + if ( !m_bOnStrip ) + { + m_SubmenuArrow = new Symbol::Arrow( this ); + m_SubmenuArrow->Dock( Pos::Right ); + m_SubmenuArrow->SetSize( 20, 20 ); + } + + Invalidate(); + } + + return m_Menu; +} + +void MenuItem::SetCheck( bool bCheck ) +{ + if ( bCheck == m_bChecked) + return; + + m_bChecked = bCheck; + + onCheckChange.Call( this ); + + if ( bCheck ) + onChecked.Call( this ); + else + onUnChecked.Call( this ); +} + +void MenuItem::OnPress() +{ + if ( m_Menu ) + { + ToggleMenu(); + } + else if ( !m_bOnStrip ) + { + SetCheck( !GetChecked() ); + onMenuItemSelected.Call( this ); + GetCanvas()->CloseMenus(); + } + + BaseClass::OnPress(); +} + +void MenuItem::ToggleMenu() +{ + if ( IsMenuOpen() ) CloseMenu(); + else OpenMenu(); +} + +bool MenuItem::IsMenuOpen() +{ + if ( !m_Menu ) return false; + + return !m_Menu->Hidden(); +} + +void MenuItem::OpenMenu() +{ + if ( !m_Menu ) return; + + m_Menu->SetHidden( false ); + m_Menu->BringToFront(); + + Gwen::Point p = LocalPosToCanvas( Gwen::Point( 0, 0 ) ); + + // Strip menus open downwards + if ( m_bOnStrip ) + { + m_Menu->SetPos( p.x, p.y + Height() + 1 ); + } + // Submenus open sidewards + else + { + m_Menu->SetPos( p.x + Width(), p.y); + } + + // TODO: Option this. + // TODO: Make sure on screen, open the other side of the + // parent if it's better... + + +} + +void MenuItem::CloseMenu() +{ + if ( !m_Menu ) return; + m_Menu->Close(); + m_Menu->CloseAll(); +} diff --git a/btgui/Gwen/Controls/MenuItem.h b/btgui/Gwen/Controls/MenuItem.h new file mode 100644 index 000000000..df45a6466 --- /dev/null +++ b/btgui/Gwen/Controls/MenuItem.h @@ -0,0 +1,69 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_MENUITEM_H +#define GWEN_CONTROLS_MENUITEM_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/Menu.h" +#include "Gwen/Controls/Symbol.h" + +namespace Gwen +{ + namespace Controls + { + class Menu; + + class GWEN_EXPORT MenuItem : public Button + { + public: + + GWEN_CONTROL( MenuItem, Button ); + + virtual ~MenuItem(); + + virtual void Render( Skin::Base* skin ); + virtual void Layout( Skin::Base* skin ); + + virtual void OnPress(); + + Menu* GetMenu(); + + bool IsMenuOpen(); + void OpenMenu(); + void CloseMenu(); + void ToggleMenu(); + + void SetOnStrip( bool b ){ m_bOnStrip = b;} + bool OnStrip(){ return m_bOnStrip; } + + virtual void SetCheckable( bool bCheck ) { m_bCheckable = bCheck; } + virtual void SetCheck( bool bCheck ); + virtual bool GetChecked() { return m_bChecked; } + + Gwen::Event::Caller onMenuItemSelected; + Gwen::Event::Caller onChecked; + Gwen::Event::Caller onUnChecked; + Gwen::Event::Caller onCheckChange; + + private: + + Menu* m_Menu; + bool m_bOnStrip; + bool m_bCheckable; + bool m_bChecked; + + + + Symbol::Arrow * m_SubmenuArrow; + }; + } + +} +#endif diff --git a/btgui/Gwen/Controls/MenuStrip.cpp b/btgui/Gwen/Controls/MenuStrip.cpp new file mode 100644 index 000000000..3c99511bf --- /dev/null +++ b/btgui/Gwen/Controls/MenuStrip.cpp @@ -0,0 +1,44 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/MenuStrip.h" +#include "Gwen/Skin.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( MenuStrip ) +{ + SetBounds( 0, 0, 200, 22 ); + Dock( Pos::Top ); + m_InnerPanel->SetPadding( Padding( 5, 2, 2, 2 ) ); +} + +void MenuStrip::Render( Skin::Base* skin ) +{ + skin->DrawMenuStrip( this ); +} + +void MenuStrip::Layout( Skin::Base* /*skin*/ ) +{ + //TODO: We don't want to do vertical sizing the same as Menu, do nothing for now +} + +void MenuStrip::OnAddItem( MenuItem* item ) +{ + item->Dock( Pos::Left ); + item->SetPadding( Padding( 5, 0, 5, 0 ) ); + item->SizeToContents(); + item->SetOnStrip( true ); + item->onHoverEnter.Add( this, &Menu::OnHoverItem ); +} + +bool MenuStrip::ShouldHoverOpenMenu() +{ + return IsMenuOpen(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/MenuStrip.h b/btgui/Gwen/Controls/MenuStrip.h new file mode 100644 index 000000000..57d03fdbe --- /dev/null +++ b/btgui/Gwen/Controls/MenuStrip.h @@ -0,0 +1,39 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_MENUSTRIP_H +#define GWEN_CONTROLS_MENUSTRIP_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Menu.h" +#include "Gwen/Controls/MenuItem.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT MenuStrip : public Menu + { + GWEN_CONTROL( MenuStrip, Menu ); + + virtual void Render( Skin::Base* skin ); + virtual void RenderUnder( Skin::Base* /*skin*/ ){} + virtual void Layout( Skin::Base* skin ); + + protected: + + virtual void OnAddItem( MenuItem* item ); + virtual bool ShouldHoverOpenMenu(); + virtual void Close() {} + + + }; + } + +} +#endif diff --git a/btgui/Gwen/Controls/Modal.h b/btgui/Gwen/Controls/Modal.h new file mode 100644 index 000000000..d0c3081d3 --- /dev/null +++ b/btgui/Gwen/Controls/Modal.h @@ -0,0 +1,37 @@ +#pragma once +#ifndef GWEN_CONTROLS_MODAL_H +#define GWEN_CONTROLS_MODAL_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + + +namespace Gwen +{ + namespace ControlsInternal + { + class Modal : public Controls::Base + { + GWEN_CONTROL_INLINE( Modal, Controls::Base ) + { + SetKeyboardInputEnabled( true ); + SetMouseInputEnabled( true ); + SetShouldDrawBackground( true ); + } + + virtual void Layout( Skin::Base* /*skin*/ ) + { + SetBounds( 0, 0, GetCanvas()->Width(), GetCanvas()->Height() ); + } + + virtual void Render( Skin::Base* skin ) + { + if ( !ShouldDrawBackground() ) return; + + skin->DrawModalControl( this ); + } + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/NumericUpDown.cpp b/btgui/Gwen/Controls/NumericUpDown.cpp new file mode 100644 index 000000000..1e02016ae --- /dev/null +++ b/btgui/Gwen/Controls/NumericUpDown.cpp @@ -0,0 +1,117 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Utility.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/NumericUpDown.h" +#include "Gwen/Controls/Layout/Splitter.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + + +GWEN_CONTROL_CONSTRUCTOR( NumericUpDown ) +{ + SetSize( 100, 20 ); + + Layout::Splitter* pSplitter = new Layout::Splitter( this ); + pSplitter->Dock( Pos::Right ); + pSplitter->SetSize( 13, 13 ); + + NumericUpDownButton_Up* pButtonUp = new NumericUpDownButton_Up( pSplitter ); + pButtonUp->onPress.Add( this, &NumericUpDown::OnButtonUp ); + pButtonUp->SetTabable( false ); + + pSplitter->SetPanel( 0, pButtonUp ); + + + NumericUpDownButton_Down* pButtonDown = new NumericUpDownButton_Down( pSplitter ); + pButtonDown->onPress.Add( this, &NumericUpDown::OnButtonDown ); + pButtonDown->SetTabable( false ); + pButtonUp->SetPadding( Padding( 0, 1, 1, 0 ) ); + + pSplitter->SetPanel( 1, pButtonDown ); + + m_iMax = 100; + m_iMin = 0; + m_iNumber = 0; + SetText( "0" ); +} + +void NumericUpDown::OnButtonUp( Base* /*control*/ ) +{ + SyncNumberFromText(); + SetValue( m_iNumber + 1 ); +} + +void NumericUpDown::OnButtonDown( Base* /*control*/ ) +{ + SyncNumberFromText(); + SetValue( m_iNumber - 1 ); +} + + +void NumericUpDown::SyncTextFromNumber() +{ + SetText( Utility::ToString( m_iNumber ) ); +} + +void NumericUpDown::SyncNumberFromText() +{ + SetValue( (int) GetFloatFromText() ); +} + +void NumericUpDown::SetMin( int i ) +{ + m_iMin = i; +} + +void NumericUpDown::SetMax( int i ) +{ + m_iMax = i; +} + +void NumericUpDown::SetValue( int i ) +{ + if ( i > m_iMax ) i = m_iMax; + if ( i < m_iMin ) i = m_iMin; + + if ( m_iNumber == i ) + { + return; + } + + m_iNumber = i; + + // Don't update the text if we're typing in it.. + if ( !HasFocus() ) + { + SyncTextFromNumber(); + } + + OnChange(); +} + +void NumericUpDown::OnChange() +{ + onChanged.Call( this ); +} + +void NumericUpDown::OnTextChanged() +{ + BaseClass::OnTextChanged(); + + SyncNumberFromText(); +} + +void NumericUpDown::OnEnter() +{ + SyncNumberFromText(); + SyncTextFromNumber(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/NumericUpDown.h b/btgui/Gwen/Controls/NumericUpDown.h new file mode 100644 index 000000000..b09b574cc --- /dev/null +++ b/btgui/Gwen/Controls/NumericUpDown.h @@ -0,0 +1,75 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_NUMERICUPDOWN_H +#define GWEN_CONTROLS_NUMERICUPDOWN_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/TextBox.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT NumericUpDownButton_Up : public Button + { + GWEN_CONTROL_INLINE( NumericUpDownButton_Up, Button ){} + + virtual void Render( Skin::Base* skin ) + { + skin->DrawNumericUpDownButton( this, m_bDepressed, true ); + } + }; + + class GWEN_EXPORT NumericUpDownButton_Down : public Button + { + GWEN_CONTROL_INLINE( NumericUpDownButton_Down, Button ){} + + virtual void Render( Skin::Base* skin ) + { + skin->DrawNumericUpDownButton( this, m_bDepressed, false ); + } + }; + + class GWEN_EXPORT NumericUpDown : public TextBoxNumeric + { + public: + + GWEN_CONTROL( NumericUpDown, TextBoxNumeric ); + + virtual void SetMin( int i ); + virtual void SetMax( int i ); + virtual void SetValue( int i ); + + Event::Caller onChanged; + + private: + + virtual void OnEnter(); + virtual void OnChange(); + virtual void OnTextChanged(); + + virtual void OnButtonUp( Base* control ); + virtual void OnButtonDown( Base* control ); + + virtual bool OnKeyUp( bool bDown ) { if ( bDown ) OnButtonUp( NULL ); return true; } + virtual bool OnKeyDown( bool bDown ){ if ( bDown ) OnButtonDown( NULL ); return true; } + + virtual void SyncTextFromNumber(); + virtual void SyncNumberFromText(); + + + + int m_iNumber; + int m_iMax; + int m_iMin; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/PanelListPanel.cpp b/btgui/Gwen/Controls/PanelListPanel.cpp new file mode 100644 index 000000000..017ebddac --- /dev/null +++ b/btgui/Gwen/Controls/PanelListPanel.cpp @@ -0,0 +1,124 @@ + +#include "Gwen/Controls/PanelListPanel.h" + +using namespace Gwen; +using namespace Controls; + +GWEN_CONTROL_CONSTRUCTOR( PanelListPanel ) +{ + m_bVertical = false; + m_bSizeToChildren = true; + m_iControlSpacing = 5; + m_iLineSpacing = 5; + m_bWrapping = true; +} + +void PanelListPanel::Render( Gwen::Skin::Base* /*skin*/ ) +{ +} + +Gwen::Point PanelListPanel::GetBiggestChildSize() +{ + int width = 0; + int height = 0; + + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + Controls::Base* pChild = *it; + if ( pChild->Width() > width ) + width = pChild->Width(); + + if ( pChild->Height() > height ) + height = pChild->Height(); + } + + return Gwen::Point( width, height ); +} + +void PanelListPanel::DoVerticalLayout() +{ + int panelWidth = 0; + int panelX = GetPadding().left; + int panelY = GetPadding().top; + int lastPanelY = panelY; + int testWrap = 0; + + Gwen::Point childSize = GetBiggestChildSize(); + //Lay my children out accordingly + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + Controls::Base* pChild = *it; + testWrap = lastPanelY + m_iControlSpacing + childSize.y; + if ( m_bWrapping && testWrap > Height() - GetPadding().bottom ) + { + panelY = GetPadding().top; + panelX = GetPadding().left + panelWidth + m_iLineSpacing; + lastPanelY = panelY + m_iControlSpacing + childSize.y; + } + else + { + panelY = lastPanelY; + lastPanelY = testWrap; + } + + pChild->SetPos( panelX, panelY ); + + if (pChild->X() + childSize.x > panelWidth ) + panelWidth = pChild->X() + childSize.x; + } + + if ( m_bSizeToChildren ) + { + Gwen::Point childrenSizeTotal = ChildrenSize(); + SetSize( childrenSizeTotal.x, Height()); + } +} + +void PanelListPanel::DoHorizontalLayout() +{ + int panelHeight = 0; + int panelX = GetPadding().left; + int panelY = GetPadding().top; + int lastPanelX = panelX; + int testWrap = 0; + + Gwen::Point childSize = GetBiggestChildSize(); + + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + Controls::Base* pChild = *it; + + testWrap = lastPanelX + m_iControlSpacing + childSize.x; + if ( m_bWrapping && testWrap > Width() - GetPadding().right ) + { + panelX = GetPadding().left; + panelY = GetPadding().top + panelHeight + m_iLineSpacing; + lastPanelX = panelX + m_iControlSpacing + childSize.x; + } + else + { + panelX = lastPanelX; + lastPanelX = testWrap; + } + + pChild->SetPos( panelX, panelY ); + + if (pChild->Y() + childSize.y > panelHeight ) + panelHeight = pChild->Y() + childSize.y; + } + + if ( m_bSizeToChildren ) + { + Gwen::Point childrenSizeTotal = ChildrenSize(); + SetSize( Width(), childrenSizeTotal.y); + } +} + +void PanelListPanel::Layout( Skin::Base* skin ) +{ + BaseClass::Layout( skin ); + if ( IsHorizontalLayout() ) + DoHorizontalLayout(); + else + DoVerticalLayout(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/PanelListPanel.h b/btgui/Gwen/Controls/PanelListPanel.h new file mode 100644 index 000000000..27db1e75e --- /dev/null +++ b/btgui/Gwen/Controls/PanelListPanel.h @@ -0,0 +1,46 @@ +#pragma once +#ifndef GWEN_CONTROLS_PANELLISTPANEL_H +#define GWEN_CONTROLS_PANELLISTPANEL_H + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT PanelListPanel : public Controls::Base + { + public: + + GWEN_CONTROL( PanelListPanel, Controls::Base ); + + void Render( Gwen::Skin::Base* skin ); + void Layout( Skin::Base* skin ); + + void DoHorizontalLayout(); + void DoVerticalLayout(); + + bool IsVerticalLayout() { return m_bVertical; } + bool IsHorizontalLayout() { return !m_bVertical; } + void SetVertical() { m_bVertical = true; Invalidate(); } + void SetHorizontal() { m_bVertical = false; Invalidate(); } + + void SetSizeToChildren( bool bShould ) { m_bSizeToChildren = bShould; } + void SetControlSpacing( int spacing ) { m_iControlSpacing = spacing; } + void SetLineSpacing( int spacing ) { m_iLineSpacing = spacing; } + void SetWrapping( bool wrap ) { m_bWrapping = wrap; } + + Gwen::Point GetBiggestChildSize(); + + protected: + + bool m_bVertical; + bool m_bSizeToChildren; + int m_iControlSpacing; + int m_iLineSpacing; + bool m_bWrapping; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ProgressBar.cpp b/btgui/Gwen/Controls/ProgressBar.cpp new file mode 100644 index 000000000..403b35942 --- /dev/null +++ b/btgui/Gwen/Controls/ProgressBar.cpp @@ -0,0 +1,49 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ScrollControl.h" +#include "Gwen/Controls/ProgressBar.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + +GWEN_CONTROL_CONSTRUCTOR( ProgressBar ) +{ + SetMouseInputEnabled( true ); + SetBounds( Gwen::Rect( 0, 0, 128, 32 ) ); + SetTextPadding( Padding( 3, 3, 3, 3 ) ); + SetHorizontal(); + + SetAlignment( Gwen::Pos::Center ); + + m_fProgress = 0.0f; + m_bAutoLabel = true; +} + +void ProgressBar::SetValue(float val) +{ + if ( val < 0 ) + val = 0; + + if ( val > 1 ) + val = 1; + + m_fProgress = val; + + if ( m_bAutoLabel ) + { + int displayVal = m_fProgress * 100; + SetText( Utility::ToString( displayVal ) + "%" ); + } +} + +void ProgressBar::Render( Skin::Base* skin ) +{ + skin->DrawProgressBar( this, m_bHorizontal, m_fProgress); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/ProgressBar.h b/btgui/Gwen/Controls/ProgressBar.h new file mode 100644 index 000000000..9d1bb94aa --- /dev/null +++ b/btgui/Gwen/Controls/ProgressBar.h @@ -0,0 +1,45 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_PROGRESSBAR_H +#define GWEN_CONTROLS_PROGRESSBAR_H +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT ProgressBar : public Label + { + public: + + GWEN_CONTROL( ProgressBar, Label ); + + virtual void Render( Skin::Base* skin ); + + virtual void SetVertical() { m_bHorizontal = false; } + virtual void SetHorizontal(){ m_bHorizontal = true; } + + virtual void SetValue( float val ); + virtual float GetValue() const { return m_fProgress; } + + virtual void SetAutoLabel( bool b ){ m_bAutoLabel = b; } + + protected: + + float m_fProgress; + + bool m_bHorizontal; + bool m_bAutoLabel; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Properties.cpp b/btgui/Gwen/Controls/Properties.cpp new file mode 100644 index 000000000..e06b89374 --- /dev/null +++ b/btgui/Gwen/Controls/Properties.cpp @@ -0,0 +1,125 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Properties.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( Properties ) +{ + m_SplitterBar = new SplitterBar( this ); + m_SplitterBar->SetPos( 80, 0 ); + m_SplitterBar->SetCursor( Gwen::CursorType::SizeWE ); + m_SplitterBar->onDragged.Add( this, &Properties::OnSplitterMoved ); + m_SplitterBar->SetShouldDrawBackground( false ); +} + +void Properties::PostLayout( Gwen::Skin::Base* /*skin*/ ) +{ + m_SplitterBar->SetHeight( 0 ); + + if ( SizeToChildren( false, true ) ) + { + InvalidateParent(); + } + + m_SplitterBar->SetSize( 3, Height() ); +} + +void Properties::OnSplitterMoved( Controls::Base * /*control*/ ) +{ + InvalidateChildren(); +} + +int Properties::GetSplitWidth() +{ + return m_SplitterBar->X(); +} + +PropertyRow* Properties::Add( const UnicodeString& text, const UnicodeString& value ) +{ + Property::Base* pProp = new Property::Text( this ); + pProp->SetPropertyValue( value ); + + return Add( text, pProp ); +} + +PropertyRow* Properties::Add( const String& text, const String& value ) +{ + return Add( Gwen::Utility::StringToUnicode( text ), Gwen::Utility::StringToUnicode( value ) ); +} + +PropertyRow* Properties::Add( const UnicodeString& text, Property::Base* pProp ) +{ + PropertyRow* row = new PropertyRow( this ); + row->Dock( Pos::Top ); + row->GetLabel()->SetText( text ); + row->SetProperty( pProp ); + + m_SplitterBar->BringToFront(); + return row; +} + +PropertyRow* Properties::Add( const String& text, Property::Base* pProp ) +{ + return Add( Gwen::Utility::StringToUnicode( text ), pProp ); +} + +void Properties::Clear() +{ + Base::List ChildListCopy = Children; + for ( Base::List::iterator it = ChildListCopy.begin(); it != ChildListCopy.end(); ++it ) + { + PropertyRow* row = (*it)->DynamicCastPropertyRow(); + if ( !row ) continue; + + row->DelayedDelete(); + } +} + + +GWEN_CONTROL_CONSTRUCTOR( PropertyRow ) +{ + m_Property = NULL; + + m_Label = new Label( this ); + m_Label->SetAlignment( Pos::CenterV | Pos::Left ); + m_Label->Dock( Pos::Left ); + m_Label->SetMargin( Margin( 2, 0, 0, 0 ) ); + + SetHeight( 16 ); +} + +void PropertyRow::Render( Gwen::Skin::Base* skin ) +{ + skin->DrawPropertyRow( this, m_Label->Right(), m_Property->IsEditing() ); +} + +void PropertyRow::Layout( Gwen::Skin::Base* /*skin*/ ) +{ + Properties* pParent = GetParent()->DynamicCastProperties(); + if ( !pParent ) return; + + m_Label->SetWidth( pParent->GetSplitWidth() ); +} + +void PropertyRow::SetProperty( Property::Base* prop ) +{ + m_Property = prop; + m_Property->SetParent( this ); + m_Property->Dock( Pos::Fill ); + m_Property->onChange.Add( this, &ThisClass::OnPropertyValueChanged ); +} + +void PropertyRow::OnPropertyValueChanged( Gwen::Controls::Base* /*control*/ ) +{ + onChange.Call( this ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Properties.h b/btgui/Gwen/Controls/Properties.h new file mode 100644 index 000000000..c48dd0384 --- /dev/null +++ b/btgui/Gwen/Controls/Properties.h @@ -0,0 +1,77 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_PROPERTIES_H +#define GWEN_CONTROLS_PROPERTIES_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/Property/BaseProperty.h" +#include "Gwen/Controls/Property/Text.h" +#include "Gwen/Controls/SplitterBar.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + + +namespace Gwen +{ + namespace Controls + { + + class PropertyRow; + + class GWEN_EXPORT Properties : public Base + { + public: + + GWEN_CONTROL( Properties, Base ); + + virtual void PostLayout( Gwen::Skin::Base* skin ); + + PropertyRow* Add( const UnicodeString& text, const UnicodeString& value = L"" ); + PropertyRow* Add( const String& text, const String& value = "" ); + PropertyRow* Add( const UnicodeString& text, Property::Base* pProp ); + PropertyRow* Add( const String& text, Property::Base* pProp ); + + virtual int GetSplitWidth(); + + virtual void Clear(); + + protected: + + virtual void OnSplitterMoved( Controls::Base * control ); + + Controls::SplitterBar* m_SplitterBar; + + }; + + class GWEN_EXPORT PropertyRow : public Base + { + public: + + GWEN_CONTROL( PropertyRow, Base ); + + virtual Label* GetLabel(){ return m_Label; } + virtual void SetProperty( Property::Base* prop ); + virtual Property::Base* GetProperty(){ return m_Property; } + + virtual void Layout( Gwen::Skin::Base* skin ); + virtual void Render( Gwen::Skin::Base* skin ); + + Event::Caller onChange; + + protected: + + void OnPropertyValueChanged( Gwen::Controls::Base* control ); + + Label* m_Label; + Property::Base* m_Property; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Property/BaseProperty.h b/btgui/Gwen/Controls/Property/BaseProperty.h new file mode 100644 index 000000000..fb0ce900f --- /dev/null +++ b/btgui/Gwen/Controls/Property/BaseProperty.h @@ -0,0 +1,60 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_PROPERTY_BASEPROPERTY_H +#define GWEN_CONTROLS_PROPERTY_BASEPROPERTY_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Utility.h" + + +namespace Gwen +{ + namespace Controls + { + namespace Property + { + class GWEN_EXPORT Base : public Gwen::Controls::Base + { + public: + + GWEN_CONTROL_INLINE( Base, Gwen::Controls::Base ){} + + virtual String GetPropertyValueAnsi() + { + return Gwen::Utility::UnicodeToString( GetPropertyValue() ); + } + + virtual void SetPropertyValue( const String& v, bool bFireChangeEvents = false ) + { + SetPropertyValue( Gwen::Utility::StringToUnicode( v ), bFireChangeEvents ); + } + + virtual UnicodeString GetPropertyValue() = 0; + + virtual void SetPropertyValue( const UnicodeString& v, bool bFireChangeEvents = false ) = 0; + + virtual bool IsEditing() = 0; + + virtual void DoChanged() + { + onChange.Call( this ); + } + + virtual void OnPropertyValueChanged( Gwen::Controls::Base* /*control*/ ) + { + DoChanged(); + } + + Event::Caller onChange; + }; + } + } +} +#endif diff --git a/btgui/Gwen/Controls/Property/ColorSelector.h b/btgui/Gwen/Controls/Property/ColorSelector.h new file mode 100644 index 000000000..5f6a78cad --- /dev/null +++ b/btgui/Gwen/Controls/Property/ColorSelector.h @@ -0,0 +1,80 @@ +#pragma once +#ifndef GWEN_CONTROLS_PROPERTY_COLORSELECTOR_H +#define GWEN_CONTROLS_PROPERTY_COLORSELECTOR_H + +#include "Gwen/Controls/Properties.h" +#include "Gwen/Controls/WindowControl.h" +#include "Gwen/Controls/HSVColorPicker.h" + +namespace Gwen +{ + namespace Controls + { + namespace Property + { + class ColorSelector : public Property::Text + { + public: + + GWEN_CONTROL_INLINE( ColorSelector, Property::Text ) + { + m_Button = new Button( this ); + m_Button->Dock( Pos::Right ); + m_Button->SetWidth( 20 ); + m_Button->onPress.Add( this, &ThisClass::OnButtonPress ); + } + + void OnButtonPress( Controls::Base* control ) + { + Gwen::Controls::WindowControl* wind = new Gwen::Controls::WindowControl( GetCanvas() ); + wind->SetTitle( L"Color Selection" ); + wind->SetSize( 256, 180 ); + wind->SetPos( GetCanvas()->Width() * 0.5 - 128, GetCanvas()->Height()* 0.5 - 128 ); + wind->SetDeleteOnClose( true ); + wind->DisableResizing(); + wind->MakeModal( true ); + + Gwen::Controls::HSVColorPicker* picker = new Gwen::Controls::HSVColorPicker( wind ); + picker->SetName( "picker" ); + + float defaultColor[3]; + Gwen::Utility::Strings::To::Floats( Gwen::Utility::UnicodeToString( m_TextBox->GetText() ), defaultColor, 3); + + picker->SetColor( Gwen::Color( defaultColor[0], defaultColor[1], defaultColor[2], 255 ), false, true ); + picker->onColorChanged.Add( this, &ThisClass::ColorChanged ); + } + + void ColorChanged( Controls::Base* control ) + { + Gwen::Controls::HSVColorPicker* picker = control->DynamicCastHSVColorPicker(); + + Gwen::String colorStr; + colorStr += Gwen::Utility::ToString( ( int )picker->GetColor().r ) + " "; + colorStr += Gwen::Utility::ToString( ( int )picker->GetColor().g ) + " "; + colorStr += Gwen::Utility::ToString( ( int )picker->GetColor().b ); + + m_TextBox->SetText( colorStr ); + DoChanged(); + } + + virtual UnicodeString GetPropertyValue() + { + return m_TextBox->GetText(); + } + + virtual void SetPropertyValue( const UnicodeString& v, bool bFireChangeEvents ) + { + m_TextBox->SetText( v, bFireChangeEvents ); + } + + virtual bool IsEditing() + { + return m_TextBox == Gwen::KeyboardFocus; + } + + Button* m_Button; + }; + } + } +} +#endif diff --git a/btgui/Gwen/Controls/Property/Text.h b/btgui/Gwen/Controls/Property/Text.h new file mode 100644 index 000000000..e02efe121 --- /dev/null +++ b/btgui/Gwen/Controls/Property/Text.h @@ -0,0 +1,52 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_PROPERTY_TEXT_H +#define GWEN_CONTROLS_PROPERTY_TEXT_H + +#include "Gwen/Controls/Property/BaseProperty.h" +#include "Gwen/Controls/TextBox.h" + +namespace Gwen +{ + namespace Controls + { + namespace Property + { + class GWEN_EXPORT Text : public Property::Base + { + public: + + GWEN_CONTROL_INLINE( Text, Property::Base ) + { + m_TextBox = new TextBox( this ); + m_TextBox->Dock( Pos::Fill ); + m_TextBox->SetShouldDrawBackground( false ); + m_TextBox->onTextChanged.Add( this, &BaseClass::OnPropertyValueChanged ); + } + + virtual UnicodeString GetPropertyValue() + { + return m_TextBox->GetText(); + } + + virtual void SetPropertyValue( const UnicodeString& v, bool bFireChangeEvents ) + { + m_TextBox->SetText( v, bFireChangeEvents ); + } + + virtual bool IsEditing() + { + return m_TextBox->HasFocus(); + } + + TextBox* m_TextBox; + }; + } + } +} +#endif diff --git a/btgui/Gwen/Controls/PropertyTree.h b/btgui/Gwen/Controls/PropertyTree.h new file mode 100644 index 000000000..0465542b1 --- /dev/null +++ b/btgui/Gwen/Controls/PropertyTree.h @@ -0,0 +1,62 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_PROPERTYTREE_H +#define GWEN_CONTROLS_PROPERTYTREE_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/TreeControl.h" +#include "Gwen/Controls/Properties.h" + + +namespace Gwen +{ + namespace Controls + { + class PropertyTreeNode : public TreeNode + { + public: + + GWEN_CONTROL_INLINE( PropertyTreeNode, TreeNode ) + { + } + + virtual void Render( Skin::Base* skin ) + { + skin->DrawPropertyTreeNode( this, m_InnerPanel->X(), m_InnerPanel->Y() ); + } + + }; + + class PropertyTree : public TreeControl + { + public: + + GWEN_CONTROL_INLINE( PropertyTree, TreeControl ) + { + + } + + Properties* Add( const UnicodeString& text ) + { + TreeNode* node = new PropertyTreeNode( this ); + node->SetText( text ); + node->Dock( Pos::Top ); + + Properties* props = new Properties( node ); + props->Dock( Pos::Top ); + + return props; + } + }; + + } +} +#endif diff --git a/btgui/Gwen/Controls/RadioButton.cpp b/btgui/Gwen/Controls/RadioButton.cpp new file mode 100644 index 000000000..1d923d8f4 --- /dev/null +++ b/btgui/Gwen/Controls/RadioButton.cpp @@ -0,0 +1,24 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/RadioButton.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( RadioButton ) +{ + SetSize( 11, 11 ); + SetMouseInputEnabled( true ); + SetTabable( false ); +} + +void RadioButton::Render( Skin::Base* skin ) +{ + skin->DrawRadioButton( this, IsChecked(), IsDepressed() ); +} + diff --git a/btgui/Gwen/Controls/RadioButton.h b/btgui/Gwen/Controls/RadioButton.h new file mode 100644 index 000000000..90df7c09d --- /dev/null +++ b/btgui/Gwen/Controls/RadioButton.h @@ -0,0 +1,78 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_RADIOBUTTON_H +#define GWEN_CONTROLS_RADIOBUTTON_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/CheckBox.h" +#include "Gwen/Controls/LabelClickable.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT RadioButton : public CheckBox + { + GWEN_CONTROL( RadioButton, CheckBox ); + virtual void Render( Skin::Base* skin ); + + private: + + // From CheckBox + virtual bool AllowUncheck(){ return false; } + }; + + class GWEN_EXPORT LabeledRadioButton : public Base + { + public: + + GWEN_CONTROL_INLINE( LabeledRadioButton, Base ) + { + SetSize( 200, 19 ); + + m_RadioButton = new RadioButton( this ); + m_RadioButton->Dock( Pos::Left ); + m_RadioButton->SetMargin( Margin( 0, 4, 2, 4 ) ); + m_RadioButton->SetTabable( false ); + m_RadioButton->SetKeyboardInputEnabled( false ); + + m_Label = new LabelClickable( this ); + m_Label->SetAlignment( Pos::CenterV | Pos::Left ); + m_Label->SetText( "Radio Button" ); + m_Label->Dock( Pos::Fill ); + m_Label->onPress.Add( m_RadioButton, &CheckBox::ReceiveEventPress ); + m_Label->SetTabable( false ); + m_Label->SetKeyboardInputEnabled( false ); + } + + void RenderFocus( Gwen::Skin::Base* skin ) + { + if ( Gwen::KeyboardFocus != this ) return; + if ( !IsTabable() ) return; + + skin->DrawKeyboardHighlight( this, GetRenderBounds(), 0 ); + } + + virtual RadioButton* GetRadioButton() { return m_RadioButton; } + virtual LabelClickable* GetLabel(){ return m_Label; } + virtual bool OnKeySpace(bool bDown) { if ( bDown ) m_RadioButton->SetChecked( !m_RadioButton->IsChecked() ); return true; } + + virtual void Select(){ m_RadioButton->SetChecked( true ); } + + private: + + RadioButton* m_RadioButton; + LabelClickable* m_Label; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/RadioButtonController.cpp b/btgui/Gwen/Controls/RadioButtonController.cpp new file mode 100644 index 000000000..c1825fd96 --- /dev/null +++ b/btgui/Gwen/Controls/RadioButtonController.cpp @@ -0,0 +1,74 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/RadioButtonController.h" +#include "Gwen/Controls/RadioButton.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + +GWEN_CONTROL_CONSTRUCTOR( RadioButtonController ) +{ + m_Selected = NULL; + SetTabable( false ); + SetKeyboardInputEnabled( false ); +} + +void RadioButtonController::OnRadioClicked( Gwen::Controls::Base* pFromPanel ) +{ + RadioButton* pCheckedRadioButton = pFromPanel->DynamicCastRadioButton(); + + //Iterate through all other buttons and set them to false; + for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) + { + Base* pChild = *iter; + LabeledRadioButton* pLRB = pChild->DynamicCastLabeledRadioButton(); + if ( pLRB ) + { + RadioButton* pChildRadioButton = pLRB->GetRadioButton(); + if ( pChildRadioButton == pCheckedRadioButton ) + { + m_Selected = pLRB; + } + else + { + pLRB->GetRadioButton()->SetChecked( false ); + } + } + } + + OnChange(); +} + +void RadioButtonController::OnChange() +{ + onSelectionChange.Call( this ); +} + +LabeledRadioButton* RadioButtonController::AddOption( const Gwen::String& strText, const Gwen::String& strOptionName ) +{ + return AddOption( Gwen::Utility::StringToUnicode( strText ), strOptionName ); +} + +LabeledRadioButton* RadioButtonController::AddOption( const Gwen::UnicodeString& strText, const Gwen::String& strOptionName ) +{ + LabeledRadioButton* lrb = new LabeledRadioButton( this ); + + lrb->SetName( strOptionName ); + lrb->GetLabel()->SetText( strText ); + lrb->GetRadioButton()->onChecked.Add( this, &RadioButtonController::OnRadioClicked ); + lrb->Dock( Pos::Top ); + lrb->SetMargin( Margin( 0, 1, 0, 1 ) ); + lrb->SetKeyboardInputEnabled( false ); + lrb->SetTabable( false ); + + Invalidate(); + + return lrb; +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/RadioButtonController.h b/btgui/Gwen/Controls/RadioButtonController.h new file mode 100644 index 000000000..82581d219 --- /dev/null +++ b/btgui/Gwen/Controls/RadioButtonController.h @@ -0,0 +1,48 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_RADIOBOTTONCONTROLLER_H +#define GWEN_CONTROLS_RADIOBOTTONCONTROLLER_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/RadioButton.h" + + +namespace Gwen +{ + namespace Controls + { + + class GWEN_EXPORT RadioButtonController : public Base + { + public: + + GWEN_CONTROL( RadioButtonController, Base ); + + virtual void Render( Skin::Base* /*skin*/ ){}; + virtual void OnRadioClicked( Base* pFromPanel ); + + virtual void OnChange(); + + virtual LabeledRadioButton* AddOption( const Gwen::String& strText, const Gwen::String& strOptionName = "" ); + virtual LabeledRadioButton* AddOption( const Gwen::UnicodeString& strText, const Gwen::String& strOptionName = "" ); + + virtual LabeledRadioButton* GetSelected(){ return m_Selected; } + + virtual String GetSelectedName(){ return m_Selected->GetName(); } + virtual UnicodeString GetSelectedLabel(){ return m_Selected->GetLabel()->GetText(); } + + Event::Caller onSelectionChange; + + private: + + LabeledRadioButton* m_Selected; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ResizableControl.cpp b/btgui/Gwen/Controls/ResizableControl.cpp new file mode 100644 index 000000000..a02b5c1f7 --- /dev/null +++ b/btgui/Gwen/Controls/ResizableControl.cpp @@ -0,0 +1,110 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ImagePanel.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/Resizer.h" +#include "Gwen/Controls/ResizableControl.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + +GWEN_CONTROL_CONSTRUCTOR( ResizableControl ) +{ + m_bResizable = true; + m_MinimumSize = Gwen::Point( 5, 5 ); + m_bClampMovement = false; + + Resizer* resizerBottom = new Resizer (this ); + resizerBottom->Dock( Pos::Bottom ); + resizerBottom->SetResizeDir( Pos::Bottom ); + resizerBottom->SetTarget( this ); + resizerBottom->onResize.Add( this, &ResizableControl::OnResizedInternal ); + + Resizer* resizerBottomLeft = new Resizer( resizerBottom ); + resizerBottomLeft->Dock( Pos::Left ); + resizerBottomLeft->SetResizeDir( Pos::Bottom | Pos::Left ); + resizerBottomLeft->SetTarget(this ); + resizerBottomLeft->onResize.Add( this, &ResizableControl::OnResizedInternal ); + + Resizer* resizerBottomRight = new Resizer( resizerBottom ); + resizerBottomRight->Dock( Pos::Right); + resizerBottomRight->SetResizeDir( Pos::Bottom | Pos::Right ); + resizerBottomRight->SetTarget( this ); + resizerBottomRight->onResize.Add( this, &ResizableControl::OnResizedInternal ); + + Resizer* resizerTop = new Resizer( this ); + resizerTop->Dock( Pos::Top ); + resizerTop->SetResizeDir( Pos::Top ); + resizerTop->SetTarget( this ); + resizerTop->onResize.Add( this, &ResizableControl::OnResizedInternal ); + + Resizer* resizerTopLeft = new Resizer( resizerTop ); + resizerTopLeft->Dock( Pos::Left ); + resizerTopLeft->SetResizeDir( Pos::Top | Pos::Left ); + resizerTopLeft->SetTarget( this ); + resizerTopLeft->onResize.Add( this, &ResizableControl::OnResizedInternal ); + + Resizer* resizerTopRight = new Resizer( resizerTop ); + resizerTopRight->Dock( Pos::Right ); + resizerTopRight->SetResizeDir( Pos::Top| Pos::Right ); + resizerTopRight->SetTarget( this ); + resizerTopRight->onResize.Add( this, &ResizableControl::OnResizedInternal ); + + Resizer* resizerLeft = new Resizer( this ); + resizerLeft->Dock( Pos::Left ); + resizerLeft->SetResizeDir( Pos::Left ); + resizerLeft->SetTarget( this ); + resizerLeft->onResize.Add( this, &ResizableControl::OnResizedInternal ); + + Resizer* resizerRight = new Resizer( this ); + resizerRight->Dock( Pos::Right ); + resizerRight->SetResizeDir( Pos::Right ); + resizerRight->SetTarget( this ); + resizerRight->onResize.Add( this, &ResizableControl::OnResizedInternal ); +} + +void ResizableControl::DisableResizing() +{ + for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it ) + { + Resizer* resizer = (*it)->DynamicCastResizer(); + if ( !resizer ) continue; + + resizer->SetMouseInputEnabled( false ); + resizer->SetHidden( true ); + SetPadding( Padding( resizer->Width(), resizer->Width(), resizer->Width(), resizer->Width() ) ); + } +} + +bool ResizableControl::SetBounds( int x, int y, int w, int h ) +{ + Gwen::Point minSize = GetMinimumSize(); + + // Clamp Minimum Size + if ( w < minSize.x ) w = minSize.x; + if ( h < minSize.y ) h = minSize.y; + + // Clamp to parent's window + Base* pParent = GetParent(); + if ( pParent && m_bClampMovement ) + { + if ( x + w > pParent->Width() ) x = pParent->Width() - w; + if ( x < 0 ) x = 0; + if ( y + h > pParent->Height() ) y = pParent->Height() - h; + if ( y < 0 ) y = 0; + } + + return BaseClass::SetBounds( x, y, w, h ); +} + +void ResizableControl::OnResizedInternal( Controls::Base* /*pControl*/ ) +{ + onResize.Call( this ); + OnResized(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/ResizableControl.h b/btgui/Gwen/Controls/ResizableControl.h new file mode 100644 index 000000000..c2c5b7648 --- /dev/null +++ b/btgui/Gwen/Controls/ResizableControl.h @@ -0,0 +1,55 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_RESIZABLECONTROL_H +#define GWEN_CONTROLS_RESIZABLECONTROL_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/Dragger.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT ResizableControl : public Base + { + public: + + GWEN_CONTROL( ResizableControl, Base ); + + virtual void SetClampMovement( bool shouldClamp ) { m_bClampMovement = shouldClamp; } + virtual bool GetClampMovement() { return m_bClampMovement; } + + virtual void SetMinimumSize( const Gwen::Point& minSize ) { m_MinimumSize = minSize; } + virtual Gwen::Point GetMinimumSize() { return m_MinimumSize; } + + virtual void DisableResizing(); + + virtual bool SetBounds( int x, int y, int w, int h ); + + virtual void OnResized(){}; + + Event::Caller onResize; + + protected: + + void OnResizedInternal( Controls::Base* pControl ); + + Gwen::Point m_MinimumSize; + bool m_bClampMovement; + bool m_bResizable; + + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Resizer.cpp b/btgui/Gwen/Controls/Resizer.cpp new file mode 100644 index 000000000..c920d740e --- /dev/null +++ b/btgui/Gwen/Controls/Resizer.cpp @@ -0,0 +1,120 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/Resizer.h" + +using namespace Gwen; +using namespace Gwen::ControlsInternal; + + +GWEN_CONTROL_CONSTRUCTOR( Resizer ) +{ + m_iResizeDir = Pos::Left; + SetMouseInputEnabled( true ); + SetSize( 6, 6 ); +} + +void Resizer::OnMouseMoved( int x, int y, int /*deltaX*/, int /*deltaY*/ ) +{ + if ( !m_pTarget ) return; + if ( !m_bDepressed ) return; + + Gwen::Rect oldBounds = m_pTarget->GetBounds(); + Gwen::Rect pBounds = m_pTarget->GetBounds(); + + Gwen::Point pntMin = m_pTarget->GetMinimumSize(); + + Gwen::Point pCursorPos = m_pTarget->CanvasPosToLocal( Gwen::Point( x, y ) ); + + Gwen::Point pDelta = m_pTarget->LocalPosToCanvas( m_HoldPos ); + pDelta.x -= x; + pDelta.y -= y; + + if ( m_iResizeDir & Pos::Left ) + { + pBounds.x -= pDelta.x; + pBounds.w += pDelta.x; + + // Conform to minimum size here so we don't + // go all weird when we snap it in the base conrt + + if ( pBounds.w < pntMin.x ) + { + int diff = pntMin.x - pBounds.w; + pBounds.w += diff; + pBounds.x -= diff; + } + + } + + if ( m_iResizeDir & Pos::Top ) + { + pBounds.y -= pDelta.y; + pBounds.h += pDelta.y; + + // Conform to minimum size here so we don't + // go all weird when we snap it in the base conrt + + if ( pBounds.h < pntMin.y ) + { + int diff = pntMin.y - pBounds.h; + pBounds.h += diff; + pBounds.y -= diff; + } + + } + + if ( m_iResizeDir & Pos::Right ) + { + // This is complicated. + // Basically we want to use the HoldPos, so it doesn't snap to the edge of the control + // But we need to move the HoldPos with the window movement. Yikes. + // I actually think this might be a big hack around the way this control works with regards + // to the holdpos being on the parent panel. + + int woff = pBounds.w - m_HoldPos.x; + int diff = pBounds.w; + pBounds.w = pCursorPos.x + woff; + if ( pBounds.w < pntMin.x ) pBounds.w = pntMin.x; + diff -= pBounds.w; + + m_HoldPos.x -= diff; + } + + if ( m_iResizeDir & Pos::Bottom ) + { + int hoff = pBounds.h - m_HoldPos.y; + int diff = pBounds.h; + pBounds.h = pCursorPos.y + hoff; + if ( pBounds.h < pntMin.y ) pBounds.h = pntMin.y; + diff -= pBounds.h; + + m_HoldPos.y -= diff; + } + + m_pTarget->SetBounds( pBounds ); + + onResize.Call( this ); +} + +void Resizer::SetResizeDir( int dir ) +{ + m_iResizeDir = dir; + + if ( (dir & Pos::Left && dir & Pos::Top) || (dir & Pos::Right && dir & Pos::Bottom) ) + return SetCursor( Gwen::CursorType::SizeNWSE ); + + if ( (dir & Pos::Right && dir & Pos::Top) || (dir & Pos::Left && dir & Pos::Bottom) ) + return SetCursor( Gwen::CursorType::SizeNESW ); + + if ( dir & Pos::Right || dir & Pos::Left ) + return SetCursor( Gwen::CursorType::SizeWE ); + + if ( dir & Pos::Top || dir & Pos::Bottom ) + return SetCursor( Gwen::CursorType::SizeNS ); + +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Resizer.h b/btgui/Gwen/Controls/Resizer.h new file mode 100644 index 000000000..30281bee6 --- /dev/null +++ b/btgui/Gwen/Controls/Resizer.h @@ -0,0 +1,39 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_RESIZER_H +#define GWEN_CONTROLS_RESIZER_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Dragger.h" + + +namespace Gwen +{ + namespace ControlsInternal + { + class GWEN_EXPORT Resizer : public Dragger + { + public: + + GWEN_CONTROL( Resizer, Dragger ); + + virtual void OnMouseMoved( int x, int y, int deltaX, int deltaY ); + virtual void SetResizeDir( int dir ); + + Event::Caller onResize; + + protected: + + int m_iResizeDir; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/RichLabel.cpp b/btgui/Gwen/Controls/RichLabel.cpp new file mode 100644 index 000000000..0c3468c34 --- /dev/null +++ b/btgui/Gwen/Controls/RichLabel.cpp @@ -0,0 +1,209 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/RichLabel.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +const unsigned char Type_Text = 0; +const unsigned char Type_Newline = 1; + +GWEN_CONTROL_CONSTRUCTOR( RichLabel ) +{ + m_bNeedsRebuild = false; +} + +void RichLabel::AddLineBreak() +{ + DividedText t; + t.type = Type_Newline; + + m_TextBlocks.push_back( t ); +} + +void RichLabel::AddText( const Gwen::TextObject& text, Gwen::Color color, Gwen::Font* font ) +{ + if ( text.m_Data.size() == 0 ) return; + + Gwen::Utility::Strings::UnicodeList lst; + Gwen::Utility::Strings::Split( text.GetUnicode(), L"\n", lst, false ); + + for (size_t i=0; i 0 ) AddLineBreak(); + + DividedText t; + t.type = Type_Text; + t.text = lst[i]; + t.color = color; + t.font = font; + + m_TextBlocks.push_back( t ); + m_bNeedsRebuild = true; + Invalidate(); + } +} + +bool RichLabel::SizeToChildren( bool w, bool h ) +{ + Rebuild(); + return BaseClass::SizeToChildren( w, h ); +} + +void RichLabel::SplitLabel( const Gwen::UnicodeString& text, Gwen::Font* pFont, const DividedText& txt, int& x, int& y, int& lineheight ) +{ + Gwen::Utility::Strings::UnicodeList lst; + Gwen::Utility::Strings::Split( text, L" ", lst, true ); + if ( lst.size() == 0 ) return; + + int iSpaceLeft = Width() - x; + + // Does the whole word fit in? + { + Gwen::Point StringSize = GetSkin()->GetRender()->MeasureText( pFont, text ); + if ( iSpaceLeft > StringSize.x ) + { + return CreateLabel( text, txt, x, y, lineheight, true ); + } + } + + // If the first word is bigger than the line, just give up. + { + Gwen::Point WordSize = GetSkin()->GetRender()->MeasureText( pFont, lst[0] ); + if ( WordSize.x >= iSpaceLeft ) + { + CreateLabel( lst[0], txt, x, y, lineheight, true ); + if ( lst[0].size() >= text.size() ) return; + + Gwen::UnicodeString LeftOver = text.substr( lst[0].size() + 1 ); + return SplitLabel( LeftOver, pFont, txt, x, y, lineheight ); + } + } + + Gwen::UnicodeString strNewString = L""; + for ( size_t i=0; iGetRender()->MeasureText( pFont, strNewString + lst[i] ); + if ( WordSize.x > iSpaceLeft ) + { + CreateLabel( strNewString, txt, x, y, lineheight, true ); + x = 0; + y += lineheight; + break;; + } + + strNewString += lst[i]; + } + + Gwen::UnicodeString LeftOver = text.substr( strNewString.size() + 1 ); + return SplitLabel( LeftOver, pFont, txt, x, y, lineheight ); +} + +void RichLabel::CreateLabel( const Gwen::UnicodeString& text, const DividedText& txt, int& x, int& y, int& lineheight, bool NoSplit ) +{ + + // + // Use default font or is one set? + // + Gwen::Font* pFont = GetSkin()->GetDefaultFont(); + if ( txt.font ) pFont = txt.font; + + // + // This string is too long for us, split it up. + // + Gwen::Point p = GetSkin()->GetRender()->MeasureText( pFont, text ); + + if ( lineheight == -1 ) + { + lineheight = p.y; + } + + if ( !NoSplit ) + { + if ( x + p.x > Width() ) + { + return SplitLabel( text, pFont, txt, x, y, lineheight ); + } + } + + // + // Wrap + // + if ( x + p.x >= Width() ) + { + CreateNewline( x, y, lineheight ); + } + + Gwen::Controls::Label* pLabel = new Gwen::Controls::Label( this ); + pLabel->SetText( x == 0 ? Gwen::Utility::Strings::TrimLeft( text, L" " ) : text ); + pLabel->SetTextColor( txt.color ); + pLabel->SetFont( pFont ); + pLabel->SizeToContents(); + pLabel->SetPos( x, y ); + + //lineheight = (lineheight + pLabel->Height()) / 2; + + x += pLabel->Width(); + + if ( x >= Width() ) + { + CreateNewline( x, y, lineheight ); + } +} + +void RichLabel::CreateNewline( int& x, int& y, int& lineheight ) +{ + x = 0; + y += lineheight; +} + +void RichLabel::Rebuild() +{ + RemoveAllChildren(); + + int x = 0; + int y = 0; + int lineheight = -1; + for ( DividedText::List::iterator it = m_TextBlocks.begin(); it != m_TextBlocks.end(); ++it ) + { + if ( it->type == Type_Newline ) + { + CreateNewline( x, y, lineheight ); + continue; + } + + if ( it->type == Type_Text ) + { + CreateLabel( (*it).text, *it, x, y, lineheight, false ); + continue; + } + + } + + m_bNeedsRebuild = false; +} + +void RichLabel::OnBoundsChanged( Gwen::Rect oldBounds ) +{ + BaseClass::OnBoundsChanged( oldBounds ); + + Rebuild(); +} + +void RichLabel::Layout( Gwen::Skin::Base* skin ) +{ + BaseClass::Layout( skin ); + + if ( m_bNeedsRebuild ) + { + Rebuild(); + } +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/RichLabel.h b/btgui/Gwen/Controls/RichLabel.h new file mode 100644 index 000000000..12c8f4275 --- /dev/null +++ b/btgui/Gwen/Controls/RichLabel.h @@ -0,0 +1,62 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_RICHLABEL_H +#define GWEN_CONTROLS_RICHLABEL_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Text.h" +#include "Gwen/TextObject.h" + + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT RichLabel : public Controls::Base + { + public: + + GWEN_CONTROL( RichLabel, Gwen::Controls::Base ); + + void AddLineBreak(); + void AddText( const Gwen::TextObject& text, Gwen::Color color, Gwen::Font* font = NULL ); + + virtual bool SizeToChildren( bool w = true, bool h = true ); + + protected: + + struct DividedText + { + typedef std::list List; + DividedText() + { + type = 0; + font = NULL; + } + + unsigned char type; + Gwen::UnicodeString text; + Gwen::Color color; + Gwen::Font* font; + }; + + void Layout( Gwen::Skin::Base* skin ); + void SplitLabel( const Gwen::UnicodeString& text, Gwen::Font* pFont, const DividedText& txt, int& x, int& y, int& lineheight ); + void CreateNewline( int& x, int& y, int& lineheight ); + void CreateLabel( const Gwen::UnicodeString& text, const DividedText& txt, int& x, int& y, int& lineheight, bool NoSplit ); + void Rebuild(); + + void OnBoundsChanged( Gwen::Rect oldBounds ); + + DividedText::List m_TextBlocks; + bool m_bNeedsRebuild; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ScrollBar.cpp b/btgui/Gwen/Controls/ScrollBar.cpp new file mode 100644 index 000000000..cf3cb0216 --- /dev/null +++ b/btgui/Gwen/Controls/ScrollBar.cpp @@ -0,0 +1,83 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ScrollBar.h" +#include "Gwen/Controls/ScrollBarButton.h" +#include "Gwen/Controls/ScrollBarBar.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + + +GWEN_CONTROL_CONSTRUCTOR( BaseScrollBar ) +{ + for (int i = 0; i < 2; i++) + { + m_ScrollButton[i] = new ScrollBarButton( this ); + } + + m_Bar = new ScrollBarBar( this ); + + SetBounds( 0, 0, 15, 15 ); + m_bDepressed = false; + + m_fScrolledAmount = 0; + m_fContentSize = 0; + m_fViewableContentSize = 0; + + SetNudgeAmount( 20 ); +} + +void BaseScrollBar::Render( Skin::Base* skin ) +{ + skin->DrawScrollBar( this, false, m_bDepressed ); +} + +void BaseScrollBar::OnBarMoved( Controls::Base* /*control*/ ) +{ + onBarMoved.Call( this ); +} + +void BaseScrollBar::BarMovedNotification() +{ + OnBarMoved( this ); +} + +void BaseScrollBar::SetContentSize( float size ) +{ + if ( m_fContentSize != size ) + { + Invalidate(); + } + + m_fContentSize = size; + +} +void BaseScrollBar::SetViewableContentSize( float size ) +{ + if ( m_fViewableContentSize != size ) + Invalidate(); + + m_fViewableContentSize = size; +} + +bool BaseScrollBar::SetScrolledAmount( float amount, bool /*forceUpdate*/ ) +{ + if ( m_fScrolledAmount == amount ) return false; + + m_fScrolledAmount = amount; + Invalidate(); + BarMovedNotification(); + return true; +} + + + + + + diff --git a/btgui/Gwen/Controls/ScrollBar.h b/btgui/Gwen/Controls/ScrollBar.h new file mode 100644 index 000000000..d6175dabe --- /dev/null +++ b/btgui/Gwen/Controls/ScrollBar.h @@ -0,0 +1,77 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_SCROLLBAR_H +#define GWEN_CONTROLS_SCROLLBAR_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/ScrollBarBar.h" +#include "Gwen/Controls/ScrollBarButton.h" +#include "Gwen/Gwen.h" + + +#define SCROLL_BUTTON_UP 0 +#define SCROLL_BUTTON_LEFT 0 +#define SCROLL_BUTTON_DOWN 1 +#define SCROLL_BUTTON_RIGHT 1 +#define NUDGE_DIST 10 + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT BaseScrollBar : public Base + { + public: + + GWEN_CONTROL( BaseScrollBar, Base ); + + virtual void Render( Skin::Base* skin ); + + virtual void SetBarSize(int size) = 0; + virtual int GetBarSize() = 0; + virtual int GetBarPos() = 0; + + virtual void OnBarMoved( Controls::Base* control); + virtual void OnMouseClickLeft( int /*x*/, int /*y*/, bool /*bDown*/ ){} + + virtual void ScrollToLeft(){} + virtual void ScrollToRight(){} + virtual void ScrollToTop(){} + virtual void ScrollToBottom(){} + + virtual float GetNudgeAmount() { return m_fNudgeAmount / m_fContentSize; } + virtual void SetNudgeAmount( float nudge ) { m_fNudgeAmount = nudge; } + + virtual void BarMovedNotification(); + + virtual float CalculateScrolledAmount() { return 0; } + virtual int CalculateBarSize() { return 0; } + virtual bool SetScrolledAmount(float amount, bool forceUpdate); + + virtual void SetContentSize(float size); + virtual void SetViewableContentSize(float size); + + virtual int GetButtonSize() { return 0; } + virtual float GetScrolledAmount() { return m_fScrolledAmount; } + + Gwen::Event::Caller onBarMoved; + + protected: + + ControlsInternal::ScrollBarButton* m_ScrollButton[2]; + ControlsInternal::ScrollBarBar * m_Bar; + + bool m_bDepressed; + float m_fScrolledAmount; + float m_fContentSize; + float m_fViewableContentSize; + float m_fNudgeAmount; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ScrollBarBar.cpp b/btgui/Gwen/Controls/ScrollBarBar.cpp new file mode 100644 index 000000000..cad1f88e7 --- /dev/null +++ b/btgui/Gwen/Controls/ScrollBarBar.cpp @@ -0,0 +1,57 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ScrollBar.h" +#include "Gwen/Controls/ScrollBarBar.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + +//Actual bar representing height of parent + +GWEN_CONTROL_CONSTRUCTOR( ScrollBarBar ) +{ + RestrictToParent( true ); + SetTarget( this ); +} + +void ScrollBarBar::Render( Skin::Base* skin ) +{ + skin->DrawScrollBarBar(this, m_bDepressed, IsHovered(), m_bHorizontal ); + BaseClass::Render( skin ); +} + +void ScrollBarBar::OnMouseMoved( int x, int y, int deltaX, int deltaY ) +{ + BaseClass::OnMouseMoved( x, y, deltaX, deltaY ); + + if ( !m_bDepressed ) + return; + + InvalidateParent(); +} + +void ScrollBarBar::OnMouseClickLeft( int x, int y, bool bDown ) +{ + BaseClass::OnMouseClickLeft( x, y, bDown ); + InvalidateParent(); +} + +void ScrollBarBar::Layout( Skin::Base* /*skin*/ ) +{ + if ( !GetParent() ) + return; + + //Move to our current position to force clamping - is this a hack? + MoveTo( X(), Y() ); +} + +void ScrollBarBar::MoveTo( int x, int y ) +{ + BaseClass::MoveTo( x, y ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/ScrollBarBar.h b/btgui/Gwen/Controls/ScrollBarBar.h new file mode 100644 index 000000000..9bcf0a203 --- /dev/null +++ b/btgui/Gwen/Controls/ScrollBarBar.h @@ -0,0 +1,46 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_SCROLLBARBAR_H +#define GWEN_CONTROLS_SCROLLBARBAR_H + +#include "Gwen/Controls/Dragger.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + +namespace Gwen +{ + namespace ControlsInternal + { + class GWEN_EXPORT ScrollBarBar : public ControlsInternal::Dragger + { + public: + + GWEN_CONTROL( ScrollBarBar, ControlsInternal::Dragger ); + + virtual void Render( Skin::Base* skin ); + virtual void Layout( Skin::Base* skin ); + + virtual void OnMouseMoved( int x, int y, int deltaX, int deltaY ); + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + + virtual void MoveTo(int x, int y); + + virtual void SetHorizontal() { m_bHorizontal = true; } + virtual void SetVertical() { m_bHorizontal = false; } + virtual bool IsVertical() { return !m_bHorizontal; } + virtual bool IsHorizontal() { return m_bHorizontal; } + virtual bool IsDepressed() { return m_bDepressed; } + + protected: + + bool m_bHorizontal; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ScrollBarButton.cpp b/btgui/Gwen/Controls/ScrollBarButton.cpp new file mode 100644 index 000000000..f65727237 --- /dev/null +++ b/btgui/Gwen/Controls/ScrollBarButton.cpp @@ -0,0 +1,45 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ScrollBar.h" +#include "Gwen/Controls/ScrollBarButton.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + + +GWEN_CONTROL_CONSTRUCTOR( ScrollBarButton ) +{ + m_iDirection = 0; + SetBounds(0,0,0,0); +} + +void ScrollBarButton::SetDirectionUp() +{ + m_iDirection = Pos::Top; +} + +void ScrollBarButton::SetDirectionDown() +{ + m_iDirection = Pos::Bottom; +} + +void ScrollBarButton::SetDirectionLeft() +{ + m_iDirection = Pos::Left; +} + +void ScrollBarButton::SetDirectionRight() +{ + m_iDirection = Pos::Right; +} + +void ScrollBarButton::Render( Skin::Base* skin ) +{ + skin->DrawScrollButton( this, m_iDirection, m_bDepressed ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/ScrollBarButton.h b/btgui/Gwen/Controls/ScrollBarButton.h new file mode 100644 index 000000000..78c924682 --- /dev/null +++ b/btgui/Gwen/Controls/ScrollBarButton.h @@ -0,0 +1,36 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_SCROLLBARBOTTON_H +#define GWEN_CONTROLS_SCROLLBARBOTTON_H + +#include "Gwen/Controls/Button.h" + +namespace Gwen +{ + namespace ControlsInternal + { + class GWEN_EXPORT ScrollBarButton : public Controls::Button + { + public: + + GWEN_CONTROL( ScrollBarButton, Controls::Button ); + + void Render( Skin::Base* skin ); + + void SetDirectionUp(); + void SetDirectionDown(); + void SetDirectionLeft(); + void SetDirectionRight(); + + protected: + + int m_iDirection; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/ScrollControl.cpp b/btgui/Gwen/Controls/ScrollControl.cpp new file mode 100644 index 000000000..023ade942 --- /dev/null +++ b/btgui/Gwen/Controls/ScrollControl.cpp @@ -0,0 +1,242 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ScrollControl.h" +#include "Gwen/Controls/ScrollBar.h" +#include "Gwen/Controls/VerticalScrollBar.h" +#include "Gwen/Controls/HorizontalScrollBar.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + +GWEN_CONTROL_CONSTRUCTOR( ScrollControl ) +{ + SetMouseInputEnabled( false ); + + m_VerticalScrollBar = new VerticalScrollBar( this ); + m_VerticalScrollBar->Dock(Pos::Right); + m_VerticalScrollBar->onBarMoved.Add( this, &ScrollControl::VBarMoved ); + m_VerticalScrollBar->SetNudgeAmount( 30 ); + m_bCanScrollV = true; + + m_HorizontalScrollBar = new HorizontalScrollBar( this ); + m_HorizontalScrollBar->Dock( Pos::Bottom ); + m_HorizontalScrollBar->onBarMoved.Add( this, &ScrollControl::HBarMoved ); + m_bCanScrollH = true; + m_HorizontalScrollBar->SetNudgeAmount( 30 ); + + m_InnerPanel = new Base( this ); + m_InnerPanel->SetPos(0, 0); + m_InnerPanel->SetMargin( Margin(5,5,5,5)); + m_InnerPanel->SendToBack(); + m_InnerPanel->SetMouseInputEnabled( false ); + + m_bAutoHideBars = false; +} + +void ScrollControl::SetScroll( bool h, bool v ) +{ + m_bCanScrollV = v; + m_bCanScrollH = h; + m_VerticalScrollBar->SetHidden( !m_bCanScrollV ); + m_HorizontalScrollBar->SetHidden( !m_bCanScrollH ); +} + +void ScrollControl::SetInnerSize( int w, int h ) +{ + m_InnerPanel->SetSize( w, h ); +} + +void ScrollControl::VBarMoved( Controls::Base * /*control*/ ) +{ + Invalidate(); +} + +void ScrollControl::HBarMoved( Controls::Base * /*control*/ ) +{ + Invalidate(); +} + +void ScrollControl::OnChildBoundsChanged( Gwen::Rect /*oldChildBounds*/, Base* /*pChild*/ ) +{ + UpdateScrollBars(); +} + +void ScrollControl::Layout( Skin::Base* skin ) +{ + UpdateScrollBars(); + BaseClass::Layout(skin); +} + +bool ScrollControl::OnMouseWheeled( int iDelta ) +{ + if ( CanScrollV() && m_VerticalScrollBar->Visible() ) + { + if ( m_VerticalScrollBar->SetScrolledAmount( m_VerticalScrollBar->GetScrolledAmount() - m_VerticalScrollBar->GetNudgeAmount() * ( (float)iDelta / 60.0f ), true) ) + return true; + } + + if ( CanScrollH() && m_HorizontalScrollBar->Visible() ) + { + if ( m_HorizontalScrollBar->SetScrolledAmount( m_HorizontalScrollBar->GetScrolledAmount() - m_HorizontalScrollBar->GetNudgeAmount() * ( (float)iDelta / 60.0f ), true) ) + return true; + } + + return false; +} +void ScrollControl::Render( Skin::Base* skin ) +{ + +#if 0 + + // Debug render - this shouldn't render ANYTHING REALLY - it should be up to the parent! + + Gwen::Rect rect = GetRenderBounds(); + Gwen::Renderer::Base* render = skin->GetRender(); + + render->SetDrawColor( Gwen::Color( 255, 255, 0, 100 ) ); + render->DrawFilledRect( rect ); + + render->SetDrawColor( Gwen::Color( 255, 0, 0, 100 ) ); + render->DrawFilledRect( m_InnerPanel->GetBounds() ); + + render->RenderText( skin->GetDefaultFont(), Gwen::Point( 0, 0 ), Utility::Format( L"Offset: %i %i", m_InnerPanel->X(), m_InnerPanel->Y() ) ); + +#else //0 + + (void)skin; + +#endif //0 +} + +void ScrollControl::UpdateScrollBars() +{ + if ( !m_InnerPanel ) + return; + + int childrenWidth = 0; + int childrenHeight = 0; + + //Get the max size of all our children together + for ( Base::List::iterator iter = m_InnerPanel->Children.begin(); iter != m_InnerPanel->Children.end(); ++iter ) + { + Base* pChild = *iter; + + childrenWidth = Utility::Max( childrenWidth, pChild->Right() ); + childrenHeight = Utility::Max( childrenHeight, pChild->Bottom() ); + } + + m_InnerPanel->SetSize( Utility::Max(Width(), childrenWidth), Utility::Max(Height(), childrenHeight)); + + float wPercent = (float)Width() / (float)(childrenWidth + (m_VerticalScrollBar->Hidden() ? 0 : m_VerticalScrollBar->Width())); + float hPercent = (float)Height() / (float)(childrenHeight + (m_HorizontalScrollBar->Hidden() ? 0 : m_HorizontalScrollBar->Height())); + + if ( m_bCanScrollV ) + SetVScrollRequired( hPercent >= 1 ); + else + m_VerticalScrollBar->SetHidden( true ); + + if ( m_bCanScrollH ) + SetHScrollRequired( wPercent >= 1 ); + else + m_HorizontalScrollBar->SetHidden( true ); + + + m_VerticalScrollBar->SetContentSize( m_InnerPanel->Height() ); + m_VerticalScrollBar->SetViewableContentSize( Height() - (m_HorizontalScrollBar->Hidden() ? 0 : m_HorizontalScrollBar->Height())); + + + m_HorizontalScrollBar->SetContentSize( m_InnerPanel->Width() ); + m_HorizontalScrollBar->SetViewableContentSize( Width() - (m_VerticalScrollBar->Hidden() ? 0 : m_VerticalScrollBar->Width()) ); + + int newInnerPanelPosX = 0; + int newInnerPanelPosY = 0; + + if ( CanScrollV() && !m_VerticalScrollBar->Hidden() ) + { + newInnerPanelPosY = -( ( m_InnerPanel->Height() ) - Height() + (m_HorizontalScrollBar->Hidden() ? 0 : m_HorizontalScrollBar->Height()) ) * m_VerticalScrollBar->GetScrolledAmount(); + } + if ( CanScrollH() && !m_HorizontalScrollBar->Hidden() ) + { + newInnerPanelPosX = - ( ( m_InnerPanel->Width() ) - Width() + (m_VerticalScrollBar->Hidden() ? 0 : m_VerticalScrollBar->Width())) * m_HorizontalScrollBar->GetScrolledAmount(); + } + + m_InnerPanel->SetPos( newInnerPanelPosX , newInnerPanelPosY ); +} + +void ScrollControl::SetVScrollRequired(bool req) +{ + if ( req ) + { + m_VerticalScrollBar->SetScrolledAmount( 0, true ); + m_VerticalScrollBar->SetDisabled( true ); + + if ( m_bAutoHideBars ) + m_VerticalScrollBar->SetHidden( true ); + } + else + { + m_VerticalScrollBar->SetHidden( false ); + m_VerticalScrollBar->SetDisabled( false ); + } +} + +void ScrollControl::SetHScrollRequired(bool req) +{ + if ( req ) + { + m_HorizontalScrollBar->SetScrolledAmount( 0, true ); + m_HorizontalScrollBar->SetDisabled( true ); + if ( m_bAutoHideBars ) + m_HorizontalScrollBar->SetHidden( true ); + } + else + { + m_HorizontalScrollBar->SetHidden( false ); + m_HorizontalScrollBar->SetDisabled( true ); + } +} + +void ScrollControl::ScrollToBottom() +{ + if ( CanScrollV() ) + { + UpdateScrollBars(); + m_VerticalScrollBar->ScrollToBottom(); + } +} +void ScrollControl::ScrollToTop() +{ + if ( CanScrollV() ) + { + UpdateScrollBars(); + m_VerticalScrollBar->ScrollToTop(); + } +} +void ScrollControl::ScrollToLeft() +{ + if ( CanScrollH() ) + { + UpdateScrollBars(); + m_HorizontalScrollBar->ScrollToLeft(); + } +} +void ScrollControl::ScrollToRight() +{ + if ( CanScrollH() ) + { + UpdateScrollBars(); + m_HorizontalScrollBar->ScrollToRight(); + } +} + +void ScrollControl::Clear() +{ + m_InnerPanel->RemoveAllChildren(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/ScrollControl.h b/btgui/Gwen/Controls/ScrollControl.h new file mode 100644 index 000000000..a0ea68b37 --- /dev/null +++ b/btgui/Gwen/Controls/ScrollControl.h @@ -0,0 +1,69 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_SCROLLCONTROL_H +#define GWEN_CONTROLS_SCROLLCONTROL_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/ScrollBar.h" +#include "Gwen/Controls/VerticalScrollBar.h" +#include "Gwen/Controls/HorizontalScrollBar.h" + + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT ScrollControl : public Base + { + public: + + GWEN_CONTROL( ScrollControl, Base ); + + virtual void Layout( Skin::Base* skin ); + virtual void Render( Skin::Base* skin ); + + virtual void SetScroll( bool h, bool v ); + virtual void SetAutoHideBars(bool should) { m_bAutoHideBars = should; } + virtual bool CanScrollH() { return m_bCanScrollH; } + virtual bool CanScrollV() { return m_bCanScrollV; } + virtual void OnChildBoundsChanged( Gwen::Rect oldChildBounds, Base* pChild ); + virtual void UpdateScrollBars(); + + virtual void SetVScrollRequired(bool req); + virtual void SetHScrollRequired(bool req); + + virtual void SetInnerSize( int w, int h ); + + virtual void VBarMoved(Controls::Base * control); + virtual void HBarMoved(Controls::Base * control); + + virtual bool OnMouseWheeled( int iDelta ); + + virtual void ScrollToBottom(); + virtual void ScrollToTop(); + virtual void ScrollToLeft(); + virtual void ScrollToRight(); + + virtual void Clear(); + + protected: + + bool m_bCanScrollH; + bool m_bCanScrollV; + + bool m_bAutoHideBars; + + Controls::BaseScrollBar* m_VerticalScrollBar; + Controls::BaseScrollBar* m_HorizontalScrollBar; + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Slider.cpp b/btgui/Gwen/Controls/Slider.cpp new file mode 100644 index 000000000..849da49a3 --- /dev/null +++ b/btgui/Gwen/Controls/Slider.cpp @@ -0,0 +1,104 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include +#include "Gwen/Controls/Slider.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + +GWEN_CONTROL_CONSTRUCTOR( SliderBar ) +{ + SetTarget( this ); + RestrictToParent( true ); +} + +void SliderBar::Render( Skin::Base* skin ) +{ + skin->DrawButton( this, m_bDepressed, IsHovered() ); +} + + +Slider::Slider( Controls::Base* pParent ) : BaseClass( pParent ) +{ + SetBounds( Gwen::Rect( 0, 0, 32, 128) ); + + m_SliderBar = new SliderBar( this ); + m_SliderBar->onDragged.Add( this, &Slider::OnMoved ); + + m_fMin = 0.0f; + m_fMax = 1.0f; + + m_bClampToNotches = false; + m_iNumNotches = 5; + m_fValue = 0.0f; + + SetTabable( true ); + +} + +void Slider::OnMoved( Controls::Base * /*control*/ ) +{ + SetValueInternal( CalculateValue() ); +} + +void Slider::Layout( Skin::Base* skin ) +{ + BaseClass::Layout( skin ); +} + +float Slider::CalculateValue() +{ + return 0; +} + +void Slider::SetValue( float val, bool /*forceUpdate*/ ) +{ + if (val < m_fMin) val = m_fMin; + if (val > m_fMax) val = m_fMax; + // Normalize Value + val = (val - m_fMin) / (m_fMax - m_fMin); + SetValueInternal( val ); + Redraw(); +} + +void Slider::SetValueInternal( float val ) +{ + if ( m_bClampToNotches ) + { + val = floor( (val * (float)m_iNumNotches) + 0.5f ); + val /= (float) m_iNumNotches; + } + + if ( m_fValue != val ) + { + m_fValue = val; + onValueChanged.Call( this ); + } + + UpdateBarFromValue(); +} + +float Slider::GetValue() +{ + return m_fMin + (m_fValue * (m_fMax - m_fMin)); +} + +void Slider::SetRange( float fMin, float fMax ) +{ + m_fMin = fMin; + m_fMax = fMax; +} + +void Slider::RenderFocus( Gwen::Skin::Base* skin ) +{ + if ( Gwen::KeyboardFocus != this ) return; + if ( !IsTabable() ) return; + + skin->DrawKeyboardHighlight( this, GetRenderBounds(), 0 ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Slider.h b/btgui/Gwen/Controls/Slider.h new file mode 100644 index 000000000..b5b194dc4 --- /dev/null +++ b/btgui/Gwen/Controls/Slider.h @@ -0,0 +1,80 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_SLIDER_H +#define GWEN_CONTROLS_SLIDER_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/Dragger.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + +namespace Gwen +{ + namespace ControlsInternal + { + class GWEN_EXPORT SliderBar : public ControlsInternal::Dragger + { + GWEN_CONTROL( SliderBar, ControlsInternal::Dragger ); + + virtual void Render( Skin::Base* skin ); + }; + } + + namespace Controls + { + + class GWEN_EXPORT Slider : public Base + { + GWEN_CONTROL( Slider, Base ); + + virtual void Render( Skin::Base* skin ) = 0; + virtual void Layout( Skin::Base* skin ); + + virtual void SetClampToNotches( bool bClamp ) { m_bClampToNotches = bClamp; } + + virtual void SetNotchCount( int num ) { m_iNumNotches = num; } + virtual int GetNotchCount() { return m_iNumNotches; } + + virtual void SetRange( float fMin, float fMax ); + virtual float GetValue(); + virtual void SetValue( float val, bool forceUpdate = true ); + + virtual float CalculateValue(); + virtual void OnMoved( Controls::Base * control ); + + virtual void OnMouseClickLeft( int /*x*/, int /*y*/, bool /*bDown*/ ){}; + + virtual bool OnKeyRight( bool bDown ) { if ( bDown ) SetValue( GetValue() + 1, true ); return true; } + virtual bool OnKeyLeft( bool bDown ) { if ( bDown ) SetValue( GetValue() - 1, true ); return true; } + virtual bool OnKeyUp( bool bDown ) { if ( bDown ) SetValue( GetValue() + 1, true ); return true; } + virtual bool OnKeyDown( bool bDown ) { if ( bDown ) SetValue( GetValue() - 1, true ); return true; } + + virtual void RenderFocus( Gwen::Skin::Base* skin); + + Gwen::Event::Caller onValueChanged; + + protected: + + virtual void SetValueInternal( float fVal ); + virtual void UpdateBarFromValue() = 0; + + ControlsInternal::SliderBar * m_SliderBar; + bool m_bClampToNotches; + int m_iNumNotches; + float m_fValue; + + float m_fMin; + float m_fMax; + + }; + } + + +} +#endif diff --git a/btgui/Gwen/Controls/SplitterBar.cpp b/btgui/Gwen/Controls/SplitterBar.cpp new file mode 100644 index 000000000..15876d1c4 --- /dev/null +++ b/btgui/Gwen/Controls/SplitterBar.cpp @@ -0,0 +1,23 @@ + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/SplitterBar.h" + +using namespace Gwen; +using namespace Controls; + +GWEN_CONTROL_CONSTRUCTOR( SplitterBar ) +{ + SetTarget( this ); + RestrictToParent( true ); +} + +void SplitterBar::Render( Skin::Base* skin ) +{ + if ( ShouldDrawBackground() ) + skin->DrawButton( this, true, false ); +} + +void SplitterBar::Layout( Skin::Base* /*skin*/ ) +{ + MoveTo( X(), Y() ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/SplitterBar.h b/btgui/Gwen/Controls/SplitterBar.h new file mode 100644 index 000000000..950853468 --- /dev/null +++ b/btgui/Gwen/Controls/SplitterBar.h @@ -0,0 +1,24 @@ +#pragma once +#ifndef GWEN_CONTROLS_SPLITTERBAR_H +#define GWEN_CONTROLS_SPLITTERBAR_H + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Dragger.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT SplitterBar : public ControlsInternal::Dragger + { + public: + + GWEN_CONTROL( SplitterBar, ControlsInternal::Dragger ); + + void Render( Skin::Base* skin ); + void Layout( Skin::Base* skin ); + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/StatusBar.h b/btgui/Gwen/Controls/StatusBar.h new file mode 100644 index 000000000..cd798f567 --- /dev/null +++ b/btgui/Gwen/Controls/StatusBar.h @@ -0,0 +1,36 @@ +#pragma once +#ifndef GWEN_CONTROLS_STATUSBAR_H +#define GWEN_CONTROLS_STATUSBAR_H + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" + +namespace Gwen +{ + namespace Controls + { + class StatusBar : public Controls::Base + { + public: + + GWEN_CONTROL_INLINE( StatusBar, Controls::Base ) + { + SetBounds( 0, 0, 200, 22 ); + Dock( Pos::Bottom ); + SetPadding( Padding( 2, 2, 2, 2 ) ); + } + + virtual void AddControl( Controls::Base* pCtrl, bool bRight) + { + pCtrl->SetParent( this ); + pCtrl->Dock( bRight ? Pos::Right : Pos::Left ); + } + + virtual void Render( Skin::Base* skin ) + { + skin->DrawStatusBar( this ); + } + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Symbol.h b/btgui/Gwen/Controls/Symbol.h new file mode 100644 index 000000000..397778e83 --- /dev/null +++ b/btgui/Gwen/Controls/Symbol.h @@ -0,0 +1,53 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_SYMBOL_H +#define GWEN_CONTROLS_SYMBOL_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Skin.h" + +namespace Gwen +{ + namespace Controls + { + + namespace Symbol + { + class GWEN_EXPORT Base : public Controls::Base + { + public: + + GWEN_CONTROL_INLINE( Base, Controls::Base ) + { + SetMouseInputEnabled( false ); + } + + }; + + class GWEN_EXPORT Arrow : public Base + { + public: + + Arrow( Gwen::Controls::Base* pnl ) : Base( pnl ) + { + } + + virtual void Render( Gwen::Skin::Base* pSkin ) + { + Gwen::Rect r( Width() / 2 - 2, Height() / 2 - 2, 5, 5 ); + pSkin->DrawArrowRight( r ); + } + + }; + + } + } + +} +#endif diff --git a/btgui/Gwen/Controls/TabButton.cpp b/btgui/Gwen/Controls/TabButton.cpp new file mode 100644 index 000000000..aa49cc14b --- /dev/null +++ b/btgui/Gwen/Controls/TabButton.cpp @@ -0,0 +1,98 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/TabButton.h" +#include "Gwen/Controls/TabControl.h" +#include "Gwen/Controls/Highlight.h" +#include "Gwen/DragAndDrop.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + +GWEN_CONTROL_CONSTRUCTOR( TabButton ) +{ + m_Page = NULL; + m_Control = NULL; + + SetPadding( Padding( 2, 2, 2, 2 ) ); + + DragAndDrop_SetPackage( true, "TabButtonMove" ); + SetAlignment( Pos::Top | Pos::Left ); + SetTextPadding( Padding( 5, 3, 3, 3 ) ); +} + + +void TabButton::Render( Skin::Base* skin ) +{ + skin->DrawTabButton( this, m_Page && m_Page->Visible() ); +} + + +void TabButton::SetTabControl( TabControl* ctrl ) +{ + if ( m_Control == ctrl ) return; + + if ( m_Control ) + { + m_Control->OnLoseTab( this ); + } + + m_Control = ctrl; +} + +bool TabButton::DragAndDrop_ShouldStartDrag() +{ + return m_Control->DoesAllowDrag(); +} + + +bool TabButton::OnKeyUp( bool bDown ) +{ + OnKeyLeft( bDown ); + return true; +} +bool TabButton::OnKeyDown( bool bDown ) +{ + OnKeyRight( bDown ); + return true; +} + +bool TabButton::OnKeyLeft( bool bDown ) +{ + if ( bDown ) + { + Base::List::reverse_iterator it = std::find( m_Parent->Children.rbegin(), m_Parent->Children.rend(), this ); + if ( it != m_Parent->Children.rend() && (++it != m_Parent->Children.rend()) ) + { + Base* pNextTab = *it; + GetTabControl()->OnTabPressed( pNextTab ); + Gwen::KeyboardFocus = pNextTab; + } + } + + return true; +} +bool TabButton::OnKeyRight( bool bDown ) +{ + if ( bDown ) + { + Base::List::iterator it = std::find( m_Parent->Children.begin(), m_Parent->Children.end(), this ); + if ( it != m_Parent->Children.end() && (++it != m_Parent->Children.end()) ) + { + Base* pNextTab = *it; + GetTabControl()->OnTabPressed( pNextTab ); + Gwen::KeyboardFocus = pNextTab; + } + } + + return true; +} + + diff --git a/btgui/Gwen/Controls/TabButton.h b/btgui/Gwen/Controls/TabButton.h new file mode 100644 index 000000000..ab35664e4 --- /dev/null +++ b/btgui/Gwen/Controls/TabButton.h @@ -0,0 +1,54 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TABBUTTON_H +#define GWEN_CONTROLS_TABBUTTON_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" + +namespace Gwen +{ + namespace Controls + { + class TabControl; + + class GWEN_EXPORT TabButton : public Button + { + public: + + GWEN_CONTROL( TabButton, Button ); + virtual void Render( Skin::Base* skin ); + + void SetPage( Base* page ){ m_Page = page; } + Base* GetPage(){ return m_Page; } + + void SetTabControl( TabControl* ctrl ); + TabControl* GetTabControl(){ return m_Control; } + + bool IsActive() { return m_Page && m_Page->Visible(); } + + virtual bool DragAndDrop_ShouldStartDrag(); + virtual void DragAndDrop_StartDragging( Gwen::DragAndDrop::Package* /*pPackage*/, int /*x*/, int /*y*/ ){ SetHidden( true ); } + virtual void DragAndDrop_EndDragging( bool /*bSuccess*/, int /*x*/, int /*y*/ ){ SetHidden( false ); } + + virtual bool OnKeyLeft( bool bDown ); + virtual bool OnKeyRight( bool bDown ); + virtual bool OnKeyUp( bool bDown ); + virtual bool OnKeyDown( bool bDown ); + + + private: + + Base* m_Page; + TabControl* m_Control; + + }; + + } +} +#endif diff --git a/btgui/Gwen/Controls/TabControl.cpp b/btgui/Gwen/Controls/TabControl.cpp new file mode 100644 index 000000000..2a3c48b72 --- /dev/null +++ b/btgui/Gwen/Controls/TabControl.cpp @@ -0,0 +1,249 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/TabControl.h" +#include "Gwen/Controls/Highlight.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/Controls/WindowControl.h" +#include "Gwen/Controls/ScrollBarButton.h" + + +namespace Gwen +{ + namespace Controls + { + class TabControlInner : public Base + { + public: + + GWEN_CONTROL_INLINE( TabControlInner, Base ) + { + m_ButtonRect = Gwen::Rect( 0, 0, 0, 0 ); + } + + void Render( Skin::Base* skin ) + { + skin->DrawTabControl( this, m_ButtonRect ); + } + + void UpdateCurrentButton( Gwen::Rect rct ) + { + m_ButtonRect = rct; + } + + Gwen::Rect m_ButtonRect; + }; + }; +}; + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( TabControl ) +{ + m_iScrollOffset = 0; + + m_pCurrentButton = NULL; + + m_TabStrip = new TabStrip( this ); + m_TabStrip->Dock( Pos::Top ); + m_TabStrip->SetWidth( 100 ); + m_TabStrip->SetHeight( 20 ); + + // Make this some special control? + m_pScroll[0] = new ControlsInternal::ScrollBarButton( this ); + m_pScroll[0]->SetDirectionLeft(); + m_pScroll[0]->onPress.Add( this, &TabControl::ScrollPressLeft ); + m_pScroll[0]->SetSize( 14, 16 ); + + m_pScroll[1] = new ControlsInternal::ScrollBarButton( this ); + m_pScroll[1]->SetDirectionRight(); + m_pScroll[1]->onPress.Add( this, &TabControl::ScrollPressRight ); + m_pScroll[1]->SetSize( 14, 16 ); + + m_InnerPanel = new TabControlInner( this ); + m_InnerPanel->Dock( Pos::Fill ); + + SetTabable( false ); +} + + + +TabButton* TabControl::AddPage( const UnicodeString& strText, Controls::Base* pPage ) +{ + if ( !pPage ) + { + pPage = new Base( this ); + } + else + { + pPage->SetParent( this ); + } + + TabButton* pButton = new TabButton( m_TabStrip ); + pButton->SetText( strText ); + pButton->SetPage( pPage ); + pButton->SetTabable( false ); + + AddPage( pButton ); + return pButton; +} + +void TabControl::AddPage( TabButton* pButton ) +{ + Base* pPage = pButton->GetPage(); + pPage->SetParent( this ); + pPage->SetHidden( true ); + pPage->SetMargin( Margin( 6, 6, 6, 6 ) ); + pPage->Dock( Pos::Fill ); + + pButton->SetParent( m_TabStrip ); + pButton->Dock( Pos::Left ); + pButton->SizeToContents(); + if ( pButton->GetTabControl() ) pButton->onPress.RemoveHandler( pButton->GetTabControl() ); + pButton->SetTabControl( this ); + pButton->onPress.Add( this, &TabControl::OnTabPressed ); + + + + if ( !m_pCurrentButton ) + { + pButton->OnPress(); + } + + onAddTab.Call( this ); + + Invalidate(); +} + +void TabControl::OnTabPressed( Controls::Base* control ) +{ + if (!control) + return; + + TabButton* pButton = control->DynamicCastTabButton(); + if ( !pButton ) return; + + Base* pPage = pButton->GetPage(); + if ( !pPage ) return; + + if ( m_pCurrentButton == pButton) + return; + + if ( m_pCurrentButton ) + { + Base* pPage = m_pCurrentButton->GetPage(); + if ( pPage ) + { + pPage->SetHidden( true ); + } + m_pCurrentButton = NULL; + } + + m_pCurrentButton = pButton; + + pPage->SetHidden( false ); + + m_TabStrip->Invalidate(); + Invalidate(); +} + +void TabControl::PostLayout( Skin::Base* skin ) +{ + BaseClass::PostLayout( skin ); + + HandleOverflow(); + + if ( m_TabStrip->Hidden() ) + { + m_InnerPanel->DynamicCastTabControlInner()->UpdateCurrentButton( Gwen::Rect( 0, 0, 0, 0 ) ); + } + else if ( m_pCurrentButton ) + { + Gwen::Rect rct; + + Gwen::Point p = m_pCurrentButton->LocalPosToCanvas( Gwen::Point( 0, 0 ) ); + p = m_InnerPanel->CanvasPosToLocal( p ); + + rct = Gwen::Rect( p.x+1, p.y+1, m_pCurrentButton->Width()-2, m_pCurrentButton->Height()-2 ); + m_InnerPanel->DynamicCastTabControlInner()->UpdateCurrentButton( rct ); + } + +} + +void TabControl::OnLoseTab( TabButton* pButton ) +{ + if ( m_pCurrentButton == pButton ) + m_pCurrentButton = NULL; + + //TODO: Select a tab if any exist. + + onLoseTab.Call( this ); + + Invalidate(); +} + +int TabControl::TabCount( void ) +{ + return m_TabStrip->NumChildren(); +} + +void TabControl::SetTabStripPosition( int iDock ) +{ + m_TabStrip->SetTabPosition( iDock ); +} + +bool TabControl::DoesAllowDrag() +{ + return m_TabStrip->AllowsTabReorder(); +} + +void TabControl::HandleOverflow() +{ + Gwen::Point TabsSize = m_TabStrip->ChildrenSize(); + + // Only enable the scrollers if the tabs are at the top. + // This is a limitation we should explore. + // Really TabControl should have derivitives for tabs placed elsewhere where we could specialize + // some functions like this for each direction. + bool bNeeded = TabsSize.x > Width() && m_TabStrip->GetDock() == Pos::Top; + + m_pScroll[0]->SetHidden( !bNeeded ); + m_pScroll[1]->SetHidden( !bNeeded ); + + if ( !bNeeded ) return; + + m_iScrollOffset = Gwen::Clamp( m_iScrollOffset, 0, TabsSize.x - Width() + 32 ); + + #if 0 + // + // This isn't frame rate independent. + // Could be better. Get rid of m_iScrollOffset and just use m_TabStrip->GetMargin().left ? + // Then get a margin animation type and do it properly! + // TODO! + // + m_TabStrip->SetMargin( Margin( Gwen::Approach( m_TabStrip->GetMargin().left, m_iScrollOffset * -1, 2 ), 0, 0, 0 ) ); + InvalidateParent(); + #else + m_TabStrip->SetMargin( Margin( m_iScrollOffset * -1, 0, 0, 0 ) ); + #endif + + m_pScroll[0]->SetPos( Width() - 30 , 5 ); + m_pScroll[1]->SetPos( m_pScroll[0]->Right(), 5 ); +} + +void TabControl::ScrollPressLeft( Base* pFrom ) +{ + m_iScrollOffset -= 120; +} + +void TabControl::ScrollPressRight( Base* pFrom ) +{ + m_iScrollOffset += 120; +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/TabControl.h b/btgui/Gwen/Controls/TabControl.h new file mode 100644 index 000000000..82aff58f4 --- /dev/null +++ b/btgui/Gwen/Controls/TabControl.h @@ -0,0 +1,67 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TABCONTROL_H +#define GWEN_CONTROLS_TABCONTROL_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/TabButton.h" +#include "Gwen/Controls/TabStrip.h" +#include "Gwen/Controls/TabTitleBar.h" + +namespace Gwen +{ + namespace ControlsInternal + { + class ScrollBarButton; + } + + namespace Controls + { + class GWEN_EXPORT TabControl : public Base + { + GWEN_CONTROL( TabControl, Base ); + + virtual TabButton* AddPage( const UnicodeString& strText, Controls::Base* pPage = NULL ); + virtual void AddPage( TabButton* pButton ); + + virtual void OnTabPressed( Controls::Base* control ); + virtual void OnLoseTab( TabButton* pButton ); + + virtual int TabCount( void ); + virtual TabButton* GetCurrentButton(){ return m_pCurrentButton; } + virtual TabStrip* GetTabStrip(){ return m_TabStrip; } + + virtual void SetTabStripPosition( int iDock ); + + virtual bool DoesAllowDrag(); + + virtual void SetAllowReorder( bool b ){ GetTabStrip()->SetAllowReorder( b ); } + + Gwen::Event::Caller onLoseTab; + Gwen::Event::Caller onAddTab; + + private: + + virtual void PostLayout( Skin::Base* skin ); + void HandleOverflow(); + + void ScrollPressLeft( Base* pFrom ); + void ScrollPressRight( Base* pFrom ); + + TabStrip* m_TabStrip; + TabButton* m_pCurrentButton; + + ControlsInternal::ScrollBarButton* m_pScroll[2]; + int m_iScrollOffset; + + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/TabStrip.cpp b/btgui/Gwen/Controls/TabStrip.cpp new file mode 100644 index 000000000..61afa5eb7 --- /dev/null +++ b/btgui/Gwen/Controls/TabStrip.cpp @@ -0,0 +1,181 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/TabStrip.h" +#include "Gwen/Controls/TabControl.h" +#include "Gwen/Controls/Highlight.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + + +GWEN_CONTROL_CONSTRUCTOR( TabStrip ) +{ + m_TabDragControl = NULL; + m_bAllowReorder = false; +} + +bool TabStrip::DragAndDrop_HandleDrop( Gwen::DragAndDrop::Package* /*pPackage*/, int x, int y ) +{ + Gwen::Point LocalPos = CanvasPosToLocal( Gwen::Point( x, y ) ); + + Base* el = DragAndDrop::SourceControl; + + TabButton* pButton = el? el->DynamicCastTabButton() : 0; + TabControl* pTabControl = GetParent()? GetParent()->DynamicCastTabControl() : 0; + if ( pTabControl && pButton ) + { + if ( pButton->GetTabControl() != pTabControl ) + { + // We've moved tab controls! + pTabControl->AddPage( pButton ); + } + } + + Base* DroppedOn = GetControlAt( LocalPos.x, LocalPos.y ); + if ( DroppedOn ) + { + Gwen::Point DropPos = DroppedOn->CanvasPosToLocal( Gwen::Point( x, y ) ); + DragAndDrop::SourceControl->BringNextToControl( DroppedOn, DropPos.x > DroppedOn->Width() / 2 ); + } + else + { + DragAndDrop::SourceControl->BringToFront(); + } + return true; +} + +bool TabStrip::DragAndDrop_CanAcceptPackage( Gwen::DragAndDrop::Package* pPackage ) +{ + if ( !m_bAllowReorder ) + return false; + + if ( pPackage->name == "TabButtonMove" ) + return true; + + return false; +} + +void TabStrip::Layout( Skin::Base* skin ) +{ + Gwen::Point pLargestTab( 5, 5 ); + + int iNum = 0; + for ( Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter ) + { + if (!*iter) + continue; + + TabButton* pButton = (*iter)->DynamicCastTabButton(); + if ( !pButton ) continue; + + pButton->SizeToContents(); + + Margin m; + int iActive = pButton->IsActive() ? 0 : 2; + int iNotFirst = iNum > 0 ? -1 : 0; + int iControlOverhang = -3; + + if ( m_iDock == Pos::Top ) + { + m.top = iActive; + m.left = iNotFirst; + m.bottom = iControlOverhang; + pButton->Dock( Pos::Left ); + } + + if ( m_iDock == Pos::Left ) + { + m.left = iActive * 2; + m.right = iControlOverhang; + m.top = iNotFirst; + pButton->Dock( Pos::Top ); + } + + if ( m_iDock == Pos::Right ) + { + m.right = iActive * 2; + m.left = iControlOverhang; + m.top = iNotFirst; + pButton->Dock( Pos::Top ); + } + + if ( m_iDock == Pos::Bottom ) + { + m.bottom = iActive; + m.left = iNotFirst; + m.top = iControlOverhang; + pButton->Dock( Pos::Left ); + } + + pLargestTab.x = Utility::Max( pLargestTab.x, pButton->Width() ); + pLargestTab.y = Utility::Max( pLargestTab.y, pButton->Height() ); + + pButton->SetMargin( m ); + iNum++; + } + + if ( m_iDock == Pos::Top || m_iDock == Pos::Bottom ) + SetSize( Width(), pLargestTab.y ); + + if ( m_iDock == Pos::Left || m_iDock == Pos::Right ) + SetSize( pLargestTab.x, Height() ); + + BaseClass::Layout( skin ); +} + +void TabStrip::DragAndDrop_HoverEnter( Gwen::DragAndDrop::Package* /*pPackage*/, int /*x*/, int /*y*/ ) +{ + if ( m_TabDragControl ) + { + Debug::Msg( "ERROR! TabStrip::DragAndDrop_HoverEnter\n" ); + } + + m_TabDragControl = new ControlsInternal::Highlight( this ); + m_TabDragControl->SetMouseInputEnabled( false ); + m_TabDragControl->SetSize( 3, Height() ); +} + +void TabStrip::DragAndDrop_HoverLeave( Gwen::DragAndDrop::Package* /*pPackage*/ ) +{ + delete m_TabDragControl; + m_TabDragControl = NULL; +} + +void TabStrip::DragAndDrop_Hover( Gwen::DragAndDrop::Package* /*pPackage*/, int x, int y ) +{ + Gwen::Point LocalPos = CanvasPosToLocal( Gwen::Point( x, y ) ); + + Base* DroppedOn = GetControlAt( LocalPos.x, LocalPos.y ); + if ( DroppedOn && DroppedOn != this ) + { + Gwen::Point DropPos = DroppedOn->CanvasPosToLocal( Gwen::Point( x, y ) ); + m_TabDragControl->SetBounds( Gwen::Rect( 0, 0, 3, Height() ) ); + m_TabDragControl->BringToFront(); + m_TabDragControl->SetPos( DroppedOn->X() - 1, 0 ); + + if ( DropPos.x > DroppedOn->Width() / 2 ) + { + m_TabDragControl->MoveBy( DroppedOn->Width()-1, 0 ); + } + m_TabDragControl->Dock( Pos::None ); + } + else + { + m_TabDragControl->Dock( Pos::Left ); + m_TabDragControl->BringToFront(); + } +} + +void TabStrip::SetTabPosition( int iPos ) +{ + Dock( iPos ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/TabStrip.h b/btgui/Gwen/Controls/TabStrip.h new file mode 100644 index 000000000..40c751cc4 --- /dev/null +++ b/btgui/Gwen/Controls/TabStrip.h @@ -0,0 +1,49 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TABSTRIP_H +#define GWEN_CONTROLS_TABSTRIP_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/TabButton.h" + +namespace Gwen +{ + namespace Controls + { + //class TabControl; + + class GWEN_EXPORT TabStrip : public Base + { + public: + + GWEN_CONTROL( TabStrip, Base ); + + virtual void Layout( Skin::Base* skin ); + + virtual bool DragAndDrop_HandleDrop( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + virtual bool DragAndDrop_CanAcceptPackage( Gwen::DragAndDrop::Package* pPackage ); + + virtual void DragAndDrop_HoverEnter( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + virtual void DragAndDrop_HoverLeave( Gwen::DragAndDrop::Package* pPackage ); + virtual void DragAndDrop_Hover( Gwen::DragAndDrop::Package* pPackage, int x, int y ); + + virtual void SetTabPosition( int iPos ); + + virtual void SetAllowReorder( bool b ){ m_bAllowReorder = b; } + virtual bool AllowsTabReorder() { return m_bAllowReorder; } + + private: + + Base* m_TabDragControl; + bool m_bAllowReorder; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/TabTitleBar.h b/btgui/Gwen/Controls/TabTitleBar.h new file mode 100644 index 000000000..f953854aa --- /dev/null +++ b/btgui/Gwen/Controls/TabTitleBar.h @@ -0,0 +1,56 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TABTITLEBAR_H +#define GWEN_CONTROLS_TABTITLEBAR_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/TabButton.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/Skin.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT TabTitleBar : public Label + { + public: + + GWEN_CONTROL_INLINE( TabTitleBar, Label ) + { + SetMouseInputEnabled( true ); + SetTextPadding( Gwen::Padding( 5, 2, 5, 2 ) ); + SetPadding( Gwen::Padding( 1, 2, 1, 2 ) ); + + DragAndDrop_SetPackage( true, "TabWindowMove" ); + } + + void Render( Skin::Base* skin ) + { + skin->DrawTabTitleBar( this ); + } + + void DragAndDrop_StartDragging( Gwen::DragAndDrop::Package* pPackage, int x, int y ) + { + DragAndDrop::SourceControl = GetParent(); + DragAndDrop::SourceControl->DragAndDrop_StartDragging( pPackage, x, y ); + } + + void UpdateFromTab( TabButton* pButton ) + { + SetText( pButton->GetText() ); + SizeToContents(); + } + + private: + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/Text.cpp b/btgui/Gwen/Controls/Text.cpp new file mode 100644 index 000000000..fe9fa8e08 --- /dev/null +++ b/btgui/Gwen/Controls/Text.cpp @@ -0,0 +1,114 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Text.h" +#include "Gwen/Skin.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::ControlsInternal; + +GWEN_CONTROL_CONSTRUCTOR( Text ) +{ + m_Font = NULL; + m_Color = Gwen::Colors::Black; // TODO: From skin somehow.. + SetMouseInputEnabled( false ); +} + +Text::~Text() +{ + // NOTE: This font doesn't need to be released + // Because it's a pointer to another font somewhere. +} + +void Text::RefreshSize() +{ + if ( !GetFont() ) + { + Debug::AssertCheck( 0, "Text::RefreshSize() - No Font!!\n" ); + return; + } + + Gwen::Point p( 1, GetFont()->size ); + + if ( Length() > 0 ) + { + p = GetSkin()->GetRender()->MeasureText( GetFont(), m_String ); + } + + if ( p.x == Width() && p.y == Height() ) + return; + + SetSize( p.x, p.y ); + InvalidateParent(); + Invalidate(); +} + + + +Gwen::Font* Text::GetFont() +{ + return m_Font; +} + + +void Text::SetString( const UnicodeString& str ){ m_String = str; Invalidate(); } +void Text::SetString( const String& str ){ SetString( Gwen::Utility::StringToUnicode( str ) ); } + +void Text::Render( Skin::Base* skin ) +{ + if ( Length() == 0 || !GetFont() ) return; + + skin->GetRender()->SetDrawColor( m_Color ); + skin->GetRender()->RenderText( GetFont(), Gwen::Point( 0, 0 ), m_String ); +} + +void Text::Layout( Skin::Base* /*skin*/ ) +{ + RefreshSize(); +} + +Gwen::Point Text::GetCharacterPosition( int iChar ) +{ + if ( Length() == 0 || iChar == 0 ) + { + return Gwen::Point( 1, 0 ); + } + + UnicodeString sub = m_String.substr( 0, iChar ); + Gwen::Point p = GetSkin()->GetRender()->MeasureText( GetFont(), sub ); + + if ( p.y >= m_Font->size ) + p.y -= m_Font->size; + + return p; +} + +int Text::GetClosestCharacter( Gwen::Point p ) +{ + int iDistance = 4096; + int iChar = 0; + + for ( size_t i=0; i iDistance ) continue; + + iDistance = iDist; + iChar = i; + } + + return iChar; +} + +void Text::OnScaleChanged() +{ + Invalidate(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/Text.h b/btgui/Gwen/Controls/Text.h new file mode 100644 index 000000000..ac36acd94 --- /dev/null +++ b/btgui/Gwen/Controls/Text.h @@ -0,0 +1,59 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TEXT_H +#define GWEN_CONTROLS_TEXT_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" + +namespace Gwen +{ + namespace ControlsInternal + { + class GWEN_EXPORT Text : public Controls::Base + { + public: + + GWEN_CONTROL( Text, Controls::Base ); + + virtual ~Text(); + Gwen::Font* GetFont(); + + void SetString( const UnicodeString& str ); + void SetString( const String& str ); + + void Render( Skin::Base* skin ); + void Layout( Skin::Base* skin ); + + void RefreshSize(); + + void SetFont( Gwen::Font* pFont ){ m_Font = pFont; } + + const UnicodeString& GetText() const { return m_String; } + + Gwen::Point GetCharacterPosition( int iChar ); + int GetClosestCharacter( Gwen::Point p ); + + int Length() const { return (int)m_String.size(); } + + virtual void SetTextColor( const Gwen::Color& col ){ m_Color = col; } + + virtual void OnScaleChanged(); + + inline const Gwen::Color &TextColor() const { return m_Color; } + + private: + + Gwen::UnicodeString m_String; + Gwen::Font* m_Font; + Gwen::Color m_Color; + }; + } + +} +#endif diff --git a/btgui/Gwen/Controls/TextBox.cpp b/btgui/Gwen/Controls/TextBox.cpp new file mode 100644 index 000000000..1825bc4c7 --- /dev/null +++ b/btgui/Gwen/Controls/TextBox.cpp @@ -0,0 +1,411 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/TextBox.h" +#include "Gwen/Skin.h" +#include "Gwen/Utility.h" +#include "Gwen/Platform.h" + +#include + + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( TextBox ) +{ + SetSize( 200, 20 ); + + SetMouseInputEnabled( true ); + SetKeyboardInputEnabled( true ); + + SetAlignment( Pos::Left | Pos::CenterV ); + SetTextPadding( Padding( 4, 2, 4, 2 ) ); + + m_iCursorPos = 0; + m_iCursorEnd = 0; + m_bSelectAll = false; + + SetTextColor( Gwen::Color( 50, 50, 50, 255 ) ); // TODO: From Skin + + SetTabable( true ); + + AddAccelerator( L"Ctrl + c", &TextBox::OnCopy ); + AddAccelerator( L"Ctrl + x", &TextBox::OnCut ); + AddAccelerator( L"Ctrl + v", &TextBox::OnPaste ); + AddAccelerator( L"Ctrl + a", &TextBox::OnSelectAll ); +} + +bool TextBox::OnChar( Gwen::UnicodeChar c ) +{ + if ( c == '\t' ) return false; + + Gwen::UnicodeString str; + str += c; + + InsertText( str ); + return true; +} + +void TextBox::InsertText( const Gwen::UnicodeString& strInsert ) +{ + // TODO: Make sure fits (implement maxlength) + + if ( HasSelection() ) + { + EraseSelection(); + } + + if ( m_iCursorPos > TextLength() ) m_iCursorPos = TextLength(); + + if ( !IsTextAllowed( strInsert, m_iCursorPos ) ) + return; + + UnicodeString str = GetText(); + str.insert( m_iCursorPos, strInsert ); + SetText( str ); + + m_iCursorPos += (int) strInsert.size(); + m_iCursorEnd = m_iCursorPos; + + RefreshCursorBounds(); +} + +void TextBox::Render( Skin::Base* skin ) +{ + if ( ShouldDrawBackground() ) + skin->DrawTextBox( this ); + + + if ( !HasFocus() ) return; + + // Draw selection.. if selected.. + if ( m_iCursorPos != m_iCursorEnd ) + { + skin->GetRender()->SetDrawColor( Gwen::Color( 50, 170, 255, 200 ) ); + skin->GetRender()->DrawFilledRect( m_rectSelectionBounds ); + } + + // Draw caret + if ( fmod( Gwen::Platform::GetTimeInSeconds()-m_fLastInputTime, 1.0f ) > 0.5f ) + skin->GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 255 ) ); + else + skin->GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + + skin->GetRender()->DrawFilledRect( m_rectCaretBounds ); +} + +void TextBox::RefreshCursorBounds() +{ + m_fLastInputTime = Gwen::Platform::GetTimeInSeconds(); + + MakeCaratVisible(); + + Gwen::Point pA = GetCharacterPosition( m_iCursorPos ); + Gwen::Point pB = GetCharacterPosition( m_iCursorEnd ); + + m_rectSelectionBounds.x = Utility::Min( pA.x, pB.x ); + m_rectSelectionBounds.y = m_Text->Y() - 1; + m_rectSelectionBounds.w = Utility::Max( pA.x, pB.x ) - m_rectSelectionBounds.x; + m_rectSelectionBounds.h = m_Text->Height() + 2; + + m_rectCaretBounds.x = pA.x; + m_rectCaretBounds.y = m_Text->Y() - 1; + m_rectCaretBounds.w = 1; + m_rectCaretBounds.h = m_Text->Height() + 2; + + Redraw(); +} + + +void TextBox::OnPaste( Gwen::Controls::Base* /*pCtrl*/ ) +{ + InsertText( Platform::GetClipboardText() ); +} + +void TextBox::OnCopy( Gwen::Controls::Base* /*pCtrl*/ ) +{ + if ( !HasSelection() ) return; + + Platform::SetClipboardText( GetSelection() ); +} + +void TextBox::OnCut( Gwen::Controls::Base* /*pCtrl*/ ) +{ + if ( !HasSelection() ) return; + + Platform::SetClipboardText( GetSelection() ); + EraseSelection(); +} + +void TextBox::OnSelectAll( Gwen::Controls::Base* /*pCtrl*/ ) +{ + m_iCursorEnd = 0; + m_iCursorPos = TextLength(); + + RefreshCursorBounds(); +} + +void TextBox::OnMouseDoubleClickLeft( int /*x*/, int /*y*/ ) +{ + OnSelectAll( this ); +} + +UnicodeString TextBox::GetSelection() +{ + if ( !HasSelection() ) return L""; + + int iStart = Utility::Min( m_iCursorPos, m_iCursorEnd ); + int iEnd = Utility::Max( m_iCursorPos, m_iCursorEnd ); + + const UnicodeString& str = GetText(); + return str.substr( iStart, iEnd - iStart ); +} + +bool TextBox::OnKeyReturn( bool bDown ) +{ + if ( bDown ) return true; + + OnEnter(); + + // Try to move to the next control, as if tab had been pressed + OnKeyTab( true ); + + // If we still have focus, blur it. + if ( HasFocus() ) + { + Blur(); + } + + return true; +} + +bool TextBox::OnKeyBackspace( bool bDown ) +{ + if ( !bDown ) return true; + if ( HasSelection() ) + { + EraseSelection(); + return true; + } + + if ( m_iCursorPos == 0 ) return true; + + DeleteText( m_iCursorPos-1, 1 ); + + return true; +} + +bool TextBox::OnKeyDelete( bool bDown ) +{ + if ( !bDown ) return true; + if ( HasSelection() ) + { + EraseSelection(); + return true; + } + + if ( m_iCursorPos >= TextLength() ) return true; + + DeleteText( m_iCursorPos, 1 ); + + return true; +} + +bool TextBox::OnKeyLeft( bool bDown ) +{ + if ( !bDown ) return true; + + if ( m_iCursorPos > 0 ) + m_iCursorPos--; + + if ( !Gwen::Input::IsShiftDown() ) + { + m_iCursorEnd = m_iCursorPos; + } + + RefreshCursorBounds(); + return true; +} + +bool TextBox::OnKeyRight( bool bDown ) +{ + if ( !bDown ) return true; + + if ( m_iCursorPos < TextLength() ) + m_iCursorPos++; + + if ( !Gwen::Input::IsShiftDown() ) + { + m_iCursorEnd = m_iCursorPos; + } + + RefreshCursorBounds(); + return true; +} + +bool TextBox::OnKeyHome( bool bDown ) +{ + if ( !bDown ) return true; + m_iCursorPos = 0; + + if ( !Gwen::Input::IsShiftDown() ) + { + m_iCursorEnd = m_iCursorPos; + } + + RefreshCursorBounds(); + return true; +} + +bool TextBox::OnKeyEnd( bool /*bDown*/ ) +{ + m_iCursorPos = TextLength(); + + if ( !Gwen::Input::IsShiftDown() ) + { + m_iCursorEnd = m_iCursorPos; + } + + RefreshCursorBounds(); + return true; +} + +void TextBox::SetCursorPos( int i ) +{ + if ( m_iCursorPos == i ) return; + + m_iCursorPos = i; + RefreshCursorBounds(); +} + +void TextBox::SetCursorEnd( int i ) +{ + if ( m_iCursorEnd == i ) return; + + m_iCursorEnd = i; + RefreshCursorBounds(); +} + + +void TextBox::DeleteText( int iStartPos, int iLength ) +{ + UnicodeString str = GetText(); + str.erase( iStartPos, iLength ); + SetText( str ); + + if ( m_iCursorPos > iStartPos ) + { + SetCursorPos( m_iCursorPos - iLength ); + } + + SetCursorEnd( m_iCursorPos ); +} + +bool TextBox::HasSelection() +{ + return m_iCursorPos != m_iCursorEnd; +} + +void TextBox::EraseSelection() +{ + int iStart = Utility::Min( m_iCursorPos, m_iCursorEnd ); + int iEnd = Utility::Max( m_iCursorPos, m_iCursorEnd ); + + DeleteText( iStart, iEnd - iStart ); + + // Move the cursor to the start of the selection, + // since the end is probably outside of the string now. + m_iCursorPos = iStart; + m_iCursorEnd = iStart; +} + +void TextBox::OnMouseClickLeft( int x, int y, bool bDown ) +{ + if ( m_bSelectAll ) + { + OnSelectAll( this ); + m_bSelectAll = false; + return; + } + + int iChar = m_Text->GetClosestCharacter( m_Text->CanvasPosToLocal( Gwen::Point( x, y ) ) ); + + if ( bDown ) + { + SetCursorPos( iChar ); + + if ( !Gwen::Input::IsShiftDown() ) + SetCursorEnd( iChar ); + + Gwen::MouseFocus = this; + } + else + { + if ( Gwen::MouseFocus == this ) + { + SetCursorPos( iChar ); + Gwen::MouseFocus = NULL; + } + } +} + +void TextBox::OnMouseMoved( int x, int y, int /*deltaX*/, int /*deltaY*/ ) +{ + if ( Gwen::MouseFocus != this ) return; + + int iChar = m_Text->GetClosestCharacter( m_Text->CanvasPosToLocal( Gwen::Point( x, y ) ) ); + + SetCursorPos( iChar ); +} + +void TextBox::MakeCaratVisible() +{ + int iCaratPos = m_Text->GetCharacterPosition( m_iCursorPos ).x; + + // If the carat is already in a semi-good position, leave it. + { + int iRealCaratPos = iCaratPos + m_Text->X(); + if ( iRealCaratPos > Width() * 0.1f && iRealCaratPos < Width() * 0.9f ) + return; + } + + // The ideal position is for the carat to be right in the middle + int idealx = -iCaratPos + Width() * 0.5f;; + + // Don't show too much whitespace to the right + if ( idealx + m_Text->Width() < Width() - m_rTextPadding.right ) + idealx = -m_Text->Width() + (Width() - m_rTextPadding.right ); + + // Or the left + if ( idealx > m_rTextPadding.left ) + idealx = m_rTextPadding.left; + + m_Text->SetPos( idealx, m_Text->Y() ); + +} + +void TextBox::Layout( Skin::Base* skin ) +{ + BaseClass::Layout( skin ); + + RefreshCursorBounds(); +} + +void TextBox::OnTextChanged() +{ + if ( m_iCursorPos > TextLength() ) m_iCursorPos = TextLength(); + if ( m_iCursorEnd > TextLength() ) m_iCursorEnd = TextLength(); + + onTextChanged.Call( this ); +} + +void TextBox::OnEnter() +{ + onReturnPressed.Call( this ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/TextBox.h b/btgui/Gwen/Controls/TextBox.h new file mode 100644 index 000000000..2d3e6f1a3 --- /dev/null +++ b/btgui/Gwen/Controls/TextBox.h @@ -0,0 +1,104 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TEXTBOX_H +#define GWEN_CONTROLS_TEXTOBX_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/ScrollControl.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT TextBox : public Label + { + GWEN_CONTROL( TextBox, Label ); + + virtual void Render( Skin::Base* skin ); + virtual void RenderFocus( Gwen::Skin::Base* /*skin*/){}; + virtual void Layout( Skin::Base* skin ); + + virtual bool OnChar( Gwen::UnicodeChar c ); + + virtual void InsertText( const Gwen::UnicodeString& str ); + virtual void DeleteText( int iStartPos, int iLength ); + + virtual void RefreshCursorBounds(); + + virtual bool OnKeyReturn( bool bDown ); + virtual bool OnKeyBackspace( bool bDown ); + virtual bool OnKeyDelete( bool bDown ); + virtual bool OnKeyRight( bool bDown ); + virtual bool OnKeyLeft( bool bDown ); + virtual bool OnKeyHome( bool bDown ); + virtual bool OnKeyEnd( bool bDown ); + + virtual bool AccelOnlyFocus() { return true; } + + virtual void OnPaste( Gwen::Controls::Base* pCtrl ); + virtual void OnCopy( Gwen::Controls::Base* pCtrl ); + virtual void OnCut( Gwen::Controls::Base* pCtrl ); + virtual void OnSelectAll( Gwen::Controls::Base* pCtrl ); + + virtual void OnMouseDoubleClickLeft( int x, int y ); + + virtual void EraseSelection(); + virtual bool HasSelection(); + virtual UnicodeString GetSelection(); + + virtual void SetCursorPos( int i ); + virtual void SetCursorEnd( int i ); + + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + virtual void OnMouseMoved( int x, int y, int deltaX, int deltaY ); + + virtual void SetSelectAllOnFocus( bool b ){ m_bSelectAll = b; if ( b ) OnSelectAll( this ); } + + virtual void MakeCaratVisible(); + + virtual void OnEnter(); + + virtual bool NeedsInputChars(){ return true; } + + Event::Caller onTextChanged; + Event::Caller onReturnPressed; + + protected: + + virtual void OnTextChanged(); + virtual bool IsTextAllowed( const Gwen::UnicodeString& /*str*/, int /*iPos*/ ){ return true; } + + bool m_bSelectAll; + + int m_iCursorPos; + int m_iCursorEnd; + + Gwen::Rect m_rectSelectionBounds; + Gwen::Rect m_rectCaretBounds; + + float m_fLastInputTime; + }; + + class GWEN_EXPORT TextBoxNumeric : public TextBox + { + public: + + GWEN_CONTROL( TextBoxNumeric, TextBox ); + + virtual float GetFloatFromText(); + + private: + + virtual bool IsTextAllowed( const Gwen::UnicodeString& str, int iPos ); + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/TextBoxNumeric.cpp b/btgui/Gwen/Controls/TextBoxNumeric.cpp new file mode 100644 index 000000000..f9e8d824f --- /dev/null +++ b/btgui/Gwen/Controls/TextBoxNumeric.cpp @@ -0,0 +1,75 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/TextBox.h" +#include "Gwen/Skin.h" +#include "Gwen/Utility.h" +#include "Gwen/Platform.h" + + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( TextBoxNumeric ) +{ + SetText( L"0" ); +} + +bool TextBoxNumeric::IsTextAllowed( const Gwen::UnicodeString& str, int iPos ) +{ + const UnicodeString& strString = GetText(); + + if ( str.length() == 0 ) + return true; + + for (size_t i=0; i 0 ) + return false; + + continue; + } + + if ( str[i] == L'0' ) continue; + if ( str[i] == L'1' ) continue; + if ( str[i] == L'2' ) continue; + if ( str[i] == L'3' ) continue; + if ( str[i] == L'4' ) continue; + if ( str[i] == L'5' ) continue; + if ( str[i] == L'6' ) continue; + if ( str[i] == L'7' ) continue; + if ( str[i] == L'8' ) continue; + if ( str[i] == L'9' ) continue; + + if ( str[i] == L'.' ) + { + // Already a fullstop + if ( std::count( strString.begin(), strString.end(), L'.' ) > 0 ) + return false; + + continue; + } + + return false; + } + + return true; +} + +float TextBoxNumeric::GetFloatFromText() +{ + double temp = GwenUtil_WideStringToFloat( GetText().c_str() ); + return temp; +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/ToolBar.h b/btgui/Gwen/Controls/ToolBar.h new file mode 100644 index 000000000..e36ee015b --- /dev/null +++ b/btgui/Gwen/Controls/ToolBar.h @@ -0,0 +1,51 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TOOLBAR_H +#define GWEN_CONTROLS_TOOLBAR_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Skin.h" + +namespace Gwen +{ + namespace Controls + { + /* + + TODO! + + */ + + class ToolBarStrip : public Base + { + GWEN_CONTROL_INLINE( ToolBarStrip, Base ) + { + SetPadding( Padding( 2, 2, 2, 2 ) ); + } + + virtual void Render( Skin::Base* skin ) + { + skin->DrawMenuStrip( this ); + } + + virtual void RenderUnder( Skin::Base* skin ) + { + + } + + virtual void Layout( Skin::Base* skin ) + { + + } + + }; + } + +} +#endif diff --git a/btgui/Gwen/Controls/TreeControl.cpp b/btgui/Gwen/Controls/TreeControl.cpp new file mode 100644 index 000000000..4c4b89d41 --- /dev/null +++ b/btgui/Gwen/Controls/TreeControl.cpp @@ -0,0 +1,74 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/TreeControl.h" +#include "Gwen/Controls/ScrollControl.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( TreeControl ) +{ + m_TreeControl = this; + + m_ToggleButton->DelayedDelete(); + m_ToggleButton = NULL; + m_Title->DelayedDelete(); + m_Title = NULL; + m_InnerPanel->DelayedDelete(); + m_InnerPanel = NULL; + + m_bAllowMultipleSelection = false; + + m_ScrollControl = new ScrollControl( this ); + m_ScrollControl->Dock( Pos::Fill ); + m_ScrollControl->SetScroll( false, true ); + m_ScrollControl->SetAutoHideBars( true ); + m_ScrollControl->SetMargin( Margin( 1, 1, 1, 1 ) ); + + m_InnerPanel = m_ScrollControl; + + m_ScrollControl->SetInnerSize( 1000, 1000 ); +} + +void TreeControl::Render( Skin::Base* skin ) +{ + if ( ShouldDrawBackground() ) + skin->DrawTreeControl( this ); +} + +void TreeControl::OnChildBoundsChanged( Gwen::Rect /*oldChildBounds*/, Base* /*pChild*/ ) +{ + m_ScrollControl->UpdateScrollBars(); +} + +void TreeControl::Clear() +{ + m_ScrollControl->Clear(); +} + +void TreeControl::Layout( Skin::Base* skin ) +{ + BaseClass::BaseClass::Layout( skin ); +} + +void TreeControl::PostLayout( Skin::Base* skin ) +{ + BaseClass::BaseClass::PostLayout( skin ); +} + +void TreeControl::OnNodeAdded( TreeNode* pNode ) +{ + pNode->onNamePress.Add( this, &TreeControl::OnNodeSelection ); +} + +void TreeControl::OnNodeSelection( Controls::Base* /*control*/ ) +{ + if ( !m_bAllowMultipleSelection || !Gwen::Input::IsKeyDown( Key::Control ) ) + DeselectAll(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/TreeControl.h b/btgui/Gwen/Controls/TreeControl.h new file mode 100644 index 000000000..b165fba7c --- /dev/null +++ b/btgui/Gwen/Controls/TreeControl.h @@ -0,0 +1,49 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TREECONTROL_H +#define GWEN_CONTROLS_TREECONTROL_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/TreeNode.h" + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT TreeControl : public TreeNode + { + public: + + GWEN_CONTROL( TreeControl, TreeNode ); + + virtual void Render( Skin::Base* skin ); + + virtual void OnChildBoundsChanged( Gwen::Rect oldChildBounds, Base* pChild ); + + ScrollControl* Scroller() { return m_ScrollControl; } + + virtual void Clear(); + + virtual void Layout( Skin::Base* skin ); + virtual void PostLayout( Skin::Base* skin ); + + virtual void AllowMultiSelect( bool b ){ m_bAllowMultipleSelection = b; } + + virtual void OnNodeAdded( TreeNode* pNode ); + + private: + + void OnNodeSelection( Controls::Base* control ); + + ScrollControl* m_ScrollControl; + bool m_bAllowMultipleSelection; + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/TreeNode.cpp b/btgui/Gwen/Controls/TreeNode.cpp new file mode 100644 index 000000000..bcf5869fd --- /dev/null +++ b/btgui/Gwen/Controls/TreeNode.cpp @@ -0,0 +1,211 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/TreeNode.h" +#include "Gwen/Controls/TreeControl.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +class OpenToggleButton : public Button +{ + GWEN_CONTROL_INLINE ( OpenToggleButton, Button ) + { + SetIsToggle( true ); + SetTabable( false ); + + } + + virtual void RenderFocus( Skin::Base* /*skin*/ ) {} + + virtual void Render( Skin::Base* skin ) + { + skin->DrawTreeButton( this, GetToggleState() ); + } +}; + +const int TreeIndentation = 14; +const int BranchLength = 16; + +GWEN_CONTROL_CONSTRUCTOR( TreeNode ) +{ + m_TreeControl = NULL; + + m_ToggleButton = new OpenToggleButton( this ); + m_ToggleButton->SetBounds( 2, 2, 13, 13 ); + m_ToggleButton->onToggle.Add( this, &TreeNode::OnToggleButtonPress ); + + m_Title = new Button( this ); + m_Title->Dock( Pos::Top ); + m_Title->SetMargin( Margin( BranchLength, 0, 0, 0 ) ); + m_Title->SetAlignment( Pos::Left | Pos::CenterV ); + m_Title->SetShouldDrawBackground( false ); + m_Title->onDoubleClick.Add( this, &TreeNode::OnDoubleClickName ); + m_Title->onDown.Add( this, &TreeNode::OnClickName ); + m_Title->SetHeight( 16 ); + + m_InnerPanel = new Base( this ); + m_InnerPanel->Dock( Pos::Top ); + m_InnerPanel->SetHeight( 100 ); + m_InnerPanel->SetMargin( Margin( TreeIndentation, 1, 0, 0 ) ); + m_InnerPanel->Hide(); + + m_bRoot = false; + m_bSelected = false; + m_bSelectable = true; +} + +void TreeNode::Render( Skin::Base* skin ) +{ + int iBottom = 0; + if ( m_InnerPanel->Children.size() > 0 ) + { + iBottom = m_InnerPanel->Children.back()->Y() + m_InnerPanel->Y(); + } + + skin->DrawTreeNode( this, m_InnerPanel->Visible(), IsSelected(), m_Title->Height(), m_Title->TextRight(), m_ToggleButton->Y() + m_ToggleButton->Height() * 0.5, iBottom, GetParent() == m_TreeControl ); +} + +TreeNode* TreeNode::AddNode( const UnicodeString& strLabel ) +{ + TreeNode* node = new TreeNode( this ); + node->SetText( strLabel ); + node->Dock( Pos::Top ); + node->SetRoot( this->DynamicCastTreeControl() != NULL ); + node->SetTreeControl( m_TreeControl ); + + if ( m_TreeControl ) + { + m_TreeControl->OnNodeAdded( node ); + } + + return node; +} + +TreeNode* TreeNode::AddNode( const String& strLabel ) +{ + return AddNode( Utility::StringToUnicode( strLabel ) ); +} + + +void TreeNode::Layout( Skin::Base* skin ) +{ + if ( m_ToggleButton ) + { + if ( m_InnerPanel->NumChildren() == 0 ) + { + m_ToggleButton->Hide(); + m_ToggleButton->SetToggleState( false ); + m_InnerPanel->Hide(); + } + else + { + m_ToggleButton->Show(); + m_InnerPanel->SizeToChildren( false, true ); + } + } + + BaseClass::Layout( skin ); +} + +void TreeNode::PostLayout( Skin::Base* /*skin*/ ) +{ + if ( SizeToChildren( false, true ) ) + { + InvalidateParent(); + } +} + +void TreeNode::SetText( const UnicodeString& text ){ m_Title->SetText( text ); }; +void TreeNode::SetText( const String& text ){ m_Title->SetText( text ); }; + +void TreeNode::Open() +{ + m_InnerPanel->Show(); + if ( m_ToggleButton ) m_ToggleButton->SetToggleState( true ); + Invalidate(); +} + +void TreeNode::Close() +{ + m_InnerPanel->Hide(); + if ( m_ToggleButton ) m_ToggleButton->SetToggleState( false ); + Invalidate(); +} + +void TreeNode::ExpandAll() +{ + Open(); + + Base::List& children = m_InnerPanel->GetChildren(); + for ( Base::List::iterator iter = children.begin(); iter != children.end(); ++iter ) + { + TreeNode* pChild = (*iter)->DynamicCastTreeNode(); + if ( !pChild ) continue; + + pChild->ExpandAll(); + } +} + +Button* TreeNode::GetButton(){ return m_Title; } + + +void TreeNode::OnToggleButtonPress( Base* /*control*/ ) +{ + if ( m_ToggleButton->GetToggleState() ) + { + Open(); + } + else + { + Close(); + } +} + +void TreeNode::OnDoubleClickName( Base* /*control*/ ) +{ + if ( !m_ToggleButton->Visible() ) return; + + m_ToggleButton->Toggle(); +} + +void TreeNode::OnClickName( Base* /*control*/ ) +{ + onNamePress.Call( this ); + + SetSelected( !IsSelected() ); +} + +void TreeNode::SetSelected( bool b ) +{ + if ( !m_bSelectable ) return; + if ( m_bSelected == b ) return; + + m_bSelected = b; + + onSelectChange.Call( this ); + + if ( m_bSelected ) + onSelect.Call( this ); + else + onUnselect.Call( this ); +} + +void TreeNode::DeselectAll() +{ + m_bSelected = false; + + Base::List& children = m_InnerPanel->GetChildren(); + for ( Base::List::iterator iter = children.begin(); iter != children.end(); ++iter ) + { + TreeNode* pChild = (*iter)->DynamicCastTreeNode(); + if ( !pChild ) continue; + + pChild->DeselectAll( ); + } +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/TreeNode.h b/btgui/Gwen/Controls/TreeNode.h new file mode 100644 index 000000000..a3cef43b5 --- /dev/null +++ b/btgui/Gwen/Controls/TreeNode.h @@ -0,0 +1,78 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_TREENODE_H +#define GWEN_CONTROLS_TREENODE_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/ScrollControl.h" + + +namespace Gwen +{ + namespace Controls + { + class TreeControl; + + class GWEN_EXPORT TreeNode : public Base + { + public: + + GWEN_CONTROL( TreeNode, Base ); + + virtual TreeNode* AddNode( const UnicodeString& strLabel ); + virtual TreeNode* AddNode( const String& strLabel ); + + virtual void SetText( const UnicodeString& text ); + virtual void SetText( const String& text ); + + virtual void Open(); + virtual void Close(); + + virtual void ExpandAll(); + + virtual Button* GetButton(); + + virtual void Render( Skin::Base* skin ); + virtual void Layout( Skin::Base* skin ); + virtual void PostLayout( Skin::Base* skin ); + + virtual void SetRoot( bool b ){ m_bRoot = b; } + virtual void SetTreeControl( TreeControl* pCtrl ){ m_TreeControl = pCtrl; } + + virtual void SetSelectable( bool b ){ m_bSelectable = b; } + virtual bool IsSelected(){ return m_bSelected; } + virtual void SetSelected( bool b ); + + virtual void DeselectAll(); + + Event::Caller onNamePress; + Event::Caller onSelectChange; + Event::Caller onSelect; + Event::Caller onUnselect; + + protected: + + void OnToggleButtonPress( Base* control ); + void OnDoubleClickName( Base* control ); + void OnClickName( Base* control ); + + + + TreeControl* m_TreeControl; + Button* m_ToggleButton; + Button* m_Title; + + bool m_bRoot; + bool m_bSelected; + bool m_bSelectable; + }; + + } +} +#endif diff --git a/btgui/Gwen/Controls/VerticalScrollBar.cpp b/btgui/Gwen/Controls/VerticalScrollBar.cpp new file mode 100644 index 000000000..62042325e --- /dev/null +++ b/btgui/Gwen/Controls/VerticalScrollBar.cpp @@ -0,0 +1,138 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/ScrollBar.h" +#include "Gwen/Controls/VerticalScrollBar.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +GWEN_CONTROL_CONSTRUCTOR( VerticalScrollBar ) +{ + m_Bar->SetVertical(); + + m_ScrollButton[SCROLL_BUTTON_UP]->SetDirectionUp(); + m_ScrollButton[SCROLL_BUTTON_UP]->onPress.Add( this, &VerticalScrollBar::NudgeUp ); + + m_ScrollButton[SCROLL_BUTTON_DOWN]->SetDirectionDown(); + m_ScrollButton[SCROLL_BUTTON_DOWN]->onPress.Add( this, &VerticalScrollBar::NudgeDown ); + + m_Bar->onDragged.Add( this, &VerticalScrollBar::OnBarMoved ); +} + +void VerticalScrollBar::Layout( Skin::Base* skin ) +{ + BaseClass::Layout( skin ); + + m_ScrollButton[SCROLL_BUTTON_UP]->Dock(Pos::Top); + m_ScrollButton[SCROLL_BUTTON_UP]->SetHeight( Width() ); + + m_ScrollButton[SCROLL_BUTTON_DOWN]->Dock(Pos::Bottom); + m_ScrollButton[SCROLL_BUTTON_DOWN]->SetHeight( Width() ); + + m_Bar->SetWidth( GetButtonSize() ); + //Add padding + m_Bar->SetPadding( Padding(0, GetButtonSize(), 0, GetButtonSize() ) ); + + //Calculate bar sizes + float barHeight = (m_fViewableContentSize / m_fContentSize) * (Height() - (GetButtonSize() * 2)); + + if ( barHeight < GetButtonSize() * 0.5 ) + barHeight = GetButtonSize() * 0.5; + + m_Bar->SetHeight(barHeight); + m_Bar->SetHidden( Height() - (GetButtonSize() * 2) <= barHeight ); + + if ( Hidden() ) + SetScrolledAmount(0, true); + + //Based on our last scroll amount, produce a position for the bar + if ( !m_Bar->IsDepressed() ) + { + SetScrolledAmount( GetScrolledAmount(), true ); + } +} + +void VerticalScrollBar::ScrollToTop() +{ + SetScrolledAmount(0, true); +} +void VerticalScrollBar::ScrollToBottom() +{ + SetScrolledAmount(1, true); +} +void VerticalScrollBar::NudgeUp( Base* /*control*/ ) +{ + if ( !IsDisabled() ) + SetScrolledAmount(GetScrolledAmount() - GetNudgeAmount(), true); +} + +void VerticalScrollBar::NudgeDown( Base* /*control*/ ) +{ + if ( !IsDisabled() ) + SetScrolledAmount(GetScrolledAmount() + GetNudgeAmount(), true); +} + +float VerticalScrollBar::GetNudgeAmount() +{ + if ( m_bDepressed ) + return m_fViewableContentSize / m_fContentSize; + else + return BaseClass::GetNudgeAmount(); +} + +void VerticalScrollBar::OnMouseClickLeft( int x, int y, bool bDown ) +{ + if ( bDown ) + { + m_bDepressed = true; + Gwen::MouseFocus = this; + } + else + { + Gwen::Point clickPos = CanvasPosToLocal( Gwen::Point( x, y ) ); + if ( clickPos.y < m_Bar->Y() ) + NudgeUp( this ); + else if ( clickPos.y > m_Bar->Y() + m_Bar->Height() ) + NudgeDown( this ); + + m_bDepressed = false; + Gwen::MouseFocus = NULL; + } +} + +float VerticalScrollBar::CalculateScrolledAmount() +{ + return (float)(m_Bar->Y() - GetButtonSize()) / (float)(Height() - m_Bar->Height() - (GetButtonSize() * 2 )); +} + +bool VerticalScrollBar::SetScrolledAmount(float amount, bool forceUpdate) +{ + amount = Gwen::Clamp( amount, 0, 1 ); + + if ( !BaseClass::SetScrolledAmount( amount, forceUpdate ) ) + return false; + + if ( forceUpdate ) + { + int newY = GetButtonSize() + (amount * ((Height() - m_Bar->Height()) - (GetButtonSize()*2))); + m_Bar->MoveTo( m_Bar->X(), newY); + } + + return true; +} + +void VerticalScrollBar::OnBarMoved( Controls::Base* control ) +{ + if ( m_Bar->IsDepressed() ) + { + SetScrolledAmount( CalculateScrolledAmount(), false ); + BaseClass::OnBarMoved(control); + } + else + InvalidateParent(); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/VerticalScrollBar.h b/btgui/Gwen/Controls/VerticalScrollBar.h new file mode 100644 index 000000000..f86a1f9e0 --- /dev/null +++ b/btgui/Gwen/Controls/VerticalScrollBar.h @@ -0,0 +1,47 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_VERTICALSCROLLBAR_H +#define GWEN_CONTROLS_VERTICALSCROLLBAR_H +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/ScrollBar.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + +namespace Gwen +{ + namespace Controls + { + + class GWEN_EXPORT VerticalScrollBar : public BaseScrollBar + { + + GWEN_CONTROL( VerticalScrollBar, BaseScrollBar ); + + virtual void Layout( Skin::Base* skin ); + + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + virtual void OnBarMoved( Controls::Base* control ); + + virtual int GetBarSize() { return m_Bar->Height(); } + virtual int GetBarPos() { return m_Bar->Y() - Width(); } + virtual void SetBarSize( int size ) { m_Bar->SetHeight( size ); } + virtual int GetButtonSize() { return Width(); } + + virtual void ScrollToTop(); + virtual void ScrollToBottom(); + virtual void NudgeUp( Base* control ); + virtual void NudgeDown( Base* control ); + virtual float GetNudgeAmount(); + + virtual float CalculateScrolledAmount(); + virtual bool SetScrolledAmount(float amount, bool forceUpdate); + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/VerticalSlider.cpp b/btgui/Gwen/Controls/VerticalSlider.cpp new file mode 100644 index 000000000..24881bcf3 --- /dev/null +++ b/btgui/Gwen/Controls/VerticalSlider.cpp @@ -0,0 +1,48 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/Slider.h" +#include "Gwen/Controls/VerticalSlider.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + + +GWEN_CONTROL_CONSTRUCTOR( VerticalSlider ) +{ +} + +float VerticalSlider::CalculateValue() +{ + return 1 - (float)m_SliderBar->Y() / (float)( Height() - m_SliderBar->Height() ); +} + +void VerticalSlider::UpdateBarFromValue() +{ + m_SliderBar->MoveTo( m_SliderBar->X(), ( Height() - m_SliderBar->Height() ) * ( 1 - m_fValue )); +} + + +void VerticalSlider::OnMouseClickLeft( int x, int y, bool bDown ) +{ + m_SliderBar->MoveTo( m_SliderBar->X(), CanvasPosToLocal( Gwen::Point( x, y ) ).y - m_SliderBar->Height() * 0.5 ); + m_SliderBar->OnMouseClickLeft( x, y, bDown ); + OnMoved( m_SliderBar ); +} + + +void VerticalSlider::Layout(Skin::Base* /*skin*/) +{ + m_SliderBar->SetSize( Width(), 10 ); +} + + +void VerticalSlider::Render( Skin::Base* skin ) +{ + skin->DrawSlider( this, false, m_bClampToNotches ? m_iNumNotches : 0, m_SliderBar->Height() ); +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/VerticalSlider.h b/btgui/Gwen/Controls/VerticalSlider.h new file mode 100644 index 000000000..89ade9a91 --- /dev/null +++ b/btgui/Gwen/Controls/VerticalSlider.h @@ -0,0 +1,37 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_VERTICALSLIDER_H +#define GWEN_CONTROLS_VERTICALSLIDER_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/Dragger.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Slider.h" + + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT VerticalSlider : public Slider + { + GWEN_CONTROL( VerticalSlider, Slider ); + + virtual void Layout( Skin::Base* skin ); + virtual void Render( Skin::Base* skin ); + + virtual float CalculateValue(); + virtual void UpdateBarFromValue(); + virtual void OnMouseClickLeft( int x, int y, bool bDown ); + + }; + } +} +#endif diff --git a/btgui/Gwen/Controls/WindowControl.cpp b/btgui/Gwen/Controls/WindowControl.cpp new file mode 100644 index 000000000..d45a01b43 --- /dev/null +++ b/btgui/Gwen/Controls/WindowControl.cpp @@ -0,0 +1,150 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Controls/WindowControl.h" +#include "Gwen/Controls/ImagePanel.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/Modal.h" + +using namespace Gwen; +using namespace Gwen::Controls; +using namespace Gwen::ControlsInternal; + +GWEN_CONTROL_CONSTRUCTOR( WindowControl ) +{ + m_Modal = NULL; + m_bInFocus = false; + m_bDeleteOnClose = false; + + m_TitleBar = new Dragger( this ); + m_TitleBar->Dock( Pos::Top ); + m_TitleBar->SetHeight( 18 ); + m_TitleBar->SetPadding( Padding( 0, 0, 0, 5 ) ); + m_TitleBar->SetTarget( this ); + + m_Title = new Label( m_TitleBar ); + m_Title->SetAlignment( Pos::Center ); + m_Title->SetText( "Window" ); + m_Title->SetTextColor(Gwen::Colors::White); + m_Title->Dock( Pos::Fill ); + + m_CloseButton = new Button( m_TitleBar ); + m_CloseButton->SetText( "" ); + m_CloseButton->SetSize( m_TitleBar->Height(), m_TitleBar->Height() ); + m_CloseButton->Dock(Pos::Right); + m_CloseButton->onPress.Add( this, &WindowControl::CloseButtonPressed ); + m_CloseButton->SetTabable( false ); + m_CloseButton->SetName( "closeButton" ); + + //Create a blank content control, dock it to the top - Should this be a ScrollControl? + m_InnerPanel = new Base( this ); + m_InnerPanel->Dock( Pos::Fill ); + + BringToFront(); + + SetTabable( false ); + Focus(); + + SetMinimumSize( Gwen::Point( 100, 40 ) ); + SetClampMovement( true ); + SetKeyboardInputEnabled( false ); +} + + +WindowControl::~WindowControl() +{ + if ( m_Modal ) + { + m_Modal->DelayedDelete(); + } +} + +void WindowControl::MakeModal( bool invisible ) +{ + if ( m_Modal ) return; + + m_Modal = new ControlsInternal::Modal( GetCanvas() ); + SetParent( m_Modal ); + + if ( invisible ) + { + m_Modal->SetShouldDrawBackground( false ); + } +} + +bool WindowControl::IsOnTop() +{ + for (Base::List::reverse_iterator iter = GetParent()->Children.rbegin(); iter != GetParent()->Children.rend(); ++iter) + { + if (!*iter) + continue; + + WindowControl* pWindow = (*iter)->DynamicCastWindowControl(); + + if ( !pWindow ) + continue; + + if ( pWindow == this ) + return true; + + return false; + } + + return false; + +} + +void WindowControl::Render( Skin::Base* skin ) +{ + //This should use m_bInFocus but I need to figure out best way to make layout happen + skin->DrawWindow( this, m_TitleBar->Bottom(), IsOnTop() ); +} + +void WindowControl::RenderUnder( Skin::Base* skin ) +{ + BaseClass::RenderUnder( skin ); + skin->DrawShadow( this ); +} + +void WindowControl::SetTitle(Gwen::UnicodeString title) +{ + m_Title->SetText( title ); +} +void WindowControl::SetClosable(bool closeable) +{ + m_CloseButton->SetHidden( !closeable ); +} + +void WindowControl::SetHidden(bool hidden) +{ + if ( !hidden ) + BringToFront(); + + BaseClass::SetHidden(hidden); +} + +void WindowControl::Touch() +{ + BaseClass::Touch(); + BringToFront(); + m_bInFocus = IsOnTop(); + //If Keyboard focus isn't one of our children, make it us +} + +void WindowControl::CloseButtonPressed( Gwen::Controls::Base* /*pFromPanel*/ ) +{ + SetHidden( true ); + + if ( m_bDeleteOnClose ) + DelayedDelete(); +} + + +void WindowControl::RenderFocus( Gwen::Skin::Base* /*skin*/ ) +{ + +} \ No newline at end of file diff --git a/btgui/Gwen/Controls/WindowControl.h b/btgui/Gwen/Controls/WindowControl.h new file mode 100644 index 000000000..a9e0fbc84 --- /dev/null +++ b/btgui/Gwen/Controls/WindowControl.h @@ -0,0 +1,63 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_CONTROLS_WINDOWCONTROL_H +#define GWEN_CONTROLS_WINDOWCONTROL_H + +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/Button.h" +#include "Gwen/Controls/Dragger.h" +#include "Gwen/Controls/Label.h" +#include "Gwen/Controls/ResizableControl.h" +#include "Gwen/Controls/Modal.h" +#include "Gwen/Skin.h" + + +namespace Gwen +{ + namespace Controls + { + class GWEN_EXPORT WindowControl : public ResizableControl + { + public: + + GWEN_CONTROL( WindowControl, ResizableControl ); + + virtual ~WindowControl(); + virtual void Render( Skin::Base* skin ); + virtual void RenderUnder( Skin::Base* skin ); + + virtual void SetTitle( Gwen::UnicodeString title ); + virtual void SetTitle( Gwen::String title ){ SetTitle( Gwen::Utility::StringToUnicode( title ) ); } + virtual void SetClosable(bool closeable); + + virtual void Touch(); + bool IsOnTop(); + + virtual void SetHidden(bool hidden); + + void CloseButtonPressed( Gwen::Controls::Base* pFromPanel ); + void RenderFocus( Gwen::Skin::Base* skin ); + void SetDeleteOnClose( bool b ){ m_bDeleteOnClose = b; } + void MakeModal(bool invisible = false); + + protected: + + ControlsInternal::Dragger* m_TitleBar; + Label* m_Title; + Button* m_CloseButton; + + bool m_bInFocus; + bool m_bDeleteOnClose; + + ControlsInternal::Modal* m_Modal; + }; + } +} +#endif diff --git a/btgui/Gwen/DragAndDrop.cpp b/btgui/Gwen/DragAndDrop.cpp new file mode 100644 index 000000000..94193d7a2 --- /dev/null +++ b/btgui/Gwen/DragAndDrop.cpp @@ -0,0 +1,238 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/Utility.h" +#include "Gwen/Platform.h" + +using namespace Gwen; +using namespace Gwen::DragAndDrop; + +DragAndDrop::Package* DragAndDrop::CurrentPackage = NULL; +Gwen::Controls::Base* DragAndDrop::HoveredControl = NULL; +Gwen::Controls::Base* DragAndDrop::SourceControl = NULL; + +static Gwen::Controls::Base* LastPressedControl = NULL; +static Gwen::Controls::Base* NewHoveredControl = NULL; +static Gwen::Point LastPressedPos; + +void DragAndDrop::ControlDeleted( Gwen::Controls::Base* pControl ) +{ + if ( SourceControl == pControl ) + { + SourceControl = NULL; + CurrentPackage = NULL; + HoveredControl = NULL; + LastPressedControl = NULL; + } + + if ( LastPressedControl == pControl ) + LastPressedControl = NULL; + + if ( HoveredControl == pControl ) + HoveredControl = NULL; + + if ( NewHoveredControl == pControl ) + NewHoveredControl = NULL; +} + +static int m_iMouseX = 0; +static int m_iMouseY = 0; + +bool DragAndDrop::Start( Gwen::Controls::Base* pControl, Package* pPackage ) +{ + if ( CurrentPackage ) + { + return false; + } + + CurrentPackage = pPackage; + SourceControl = pControl; + return true; +} + +bool OnDrop( int x, int y ) +{ + bool bSuccess = false; + + if ( DragAndDrop::HoveredControl ) + { + DragAndDrop::HoveredControl->DragAndDrop_HoverLeave( DragAndDrop::CurrentPackage ); + bSuccess = DragAndDrop::HoveredControl->DragAndDrop_HandleDrop( DragAndDrop::CurrentPackage, x, y ); + } + + // Report back to the source control, to tell it if we've been successful. + DragAndDrop::SourceControl->DragAndDrop_EndDragging( bSuccess, x, y ); + + DragAndDrop::CurrentPackage = NULL; + DragAndDrop::SourceControl = NULL; + + return true; +} + +bool DragAndDrop::OnMouseButton( Gwen::Controls::Base* pHoveredControl, int x, int y, bool bDown ) +{ + if ( !bDown ) + { + LastPressedControl = NULL; + + // Not carrying anything, allow normal actions + if ( !CurrentPackage ) + return false; + + // We were carrying something, drop it. + OnDrop( x, y ); + return true; + } + + if ( !pHoveredControl ) return false; + if ( !pHoveredControl->DragAndDrop_Draggable() ) return false; + + // Store the last clicked on control. Don't do anything yet, + // we'll check it in OnMouseMoved, and if it moves further than + // x pixels with the mouse down, we'll start to drag. + LastPressedPos = Gwen::Point( x, y ); + LastPressedControl = pHoveredControl; + + return false; +} + +bool ShouldStartDraggingControl( int x, int y ) +{ + // We're not holding a control down.. + if ( !LastPressedControl ) return false; + + // Not been dragged far enough + int iLength = abs( x - LastPressedPos.x ) + abs( y - LastPressedPos.y ); + if ( iLength < 5 ) return false; + + // Create the dragging package + + DragAndDrop::CurrentPackage = LastPressedControl->DragAndDrop_GetPackage( LastPressedPos.x, LastPressedPos.y ); + + // We didn't create a package! + if ( !DragAndDrop::CurrentPackage ) + { + LastPressedControl = NULL; + DragAndDrop::SourceControl = NULL; + return false; + } + + + + // Now we're dragging something! + DragAndDrop::SourceControl = LastPressedControl; + Gwen::MouseFocus = NULL; + LastPressedControl = NULL; + DragAndDrop::CurrentPackage->drawcontrol = NULL; + + // Some controls will want to decide whether they should be dragged at that moment. + // This function is for them (it defaults to true) + if ( !DragAndDrop::SourceControl->DragAndDrop_ShouldStartDrag() ) + { + DragAndDrop::SourceControl = NULL; + DragAndDrop::CurrentPackage = NULL; + return false; + } + + DragAndDrop::SourceControl->DragAndDrop_StartDragging( DragAndDrop::CurrentPackage, LastPressedPos.x, LastPressedPos.y ); + + return true; + +} + +void UpdateHoveredControl( Gwen::Controls::Base* pCtrl, int x, int y ) +{ + // + // We use this global variable to represent our hovered control + // That way, if the new hovered control gets deleted in one of the + // Hover callbacks, we won't be left with a hanging pointer. + // This isn't ideal - but it's minimal. + // + NewHoveredControl = pCtrl; + + // Nothing to change.. + if ( DragAndDrop::HoveredControl == NewHoveredControl ) return; + + // We changed - tell the old hovered control that it's no longer hovered. + if ( DragAndDrop::HoveredControl && DragAndDrop::HoveredControl != NewHoveredControl ) + DragAndDrop::HoveredControl->DragAndDrop_HoverLeave( DragAndDrop::CurrentPackage ); + + // If we're hovering where the control came from, just forget it. + // By changing it to NULL here we're not going to show any error cursors + // it will just do nothing if you drop it. + if ( NewHoveredControl == DragAndDrop::SourceControl ) + NewHoveredControl = NULL; + + // Check to see if the new potential control can accept this type of package. + // If not, ignore it and show an error cursor. + while ( NewHoveredControl && !NewHoveredControl->DragAndDrop_CanAcceptPackage( DragAndDrop::CurrentPackage ) ) + { + // We can't drop on this control, so lets try to drop + // onto its parent.. + NewHoveredControl = NewHoveredControl->GetParent(); + + // Its parents are dead. We can't drop it here. + // Show the NO WAY cursor. + if ( !NewHoveredControl ) + { + Platform::SetCursor( CursorType::No ); + } + } + + // Become out new hovered control + DragAndDrop::HoveredControl = NewHoveredControl; + + // If we exist, tell us that we've started hovering. + if ( DragAndDrop::HoveredControl ) + { + DragAndDrop::HoveredControl->DragAndDrop_HoverEnter( DragAndDrop::CurrentPackage, x, y ); + } + + NewHoveredControl = NULL; +} + +void DragAndDrop::OnMouseMoved( Gwen::Controls::Base* pHoveredControl, int x, int y ) +{ + // Always keep these up to date, they're used to draw the dragged control. + m_iMouseX = x; + m_iMouseY = y; + + // If we're not carrying anything, then check to see if we should + // pick up from a control that we're holding down. If not, then forget it. + if ( !CurrentPackage && !ShouldStartDraggingControl( x, y ) ) + return; + + // Swap to this new hovered control and notify them of the change. + UpdateHoveredControl( pHoveredControl, x, y ); + + if ( !HoveredControl ) return; + + // Update the hovered control every mouse move, so it can show where + // the dropped control will land etc.. + HoveredControl->DragAndDrop_Hover( CurrentPackage, x, y ); + + // Override the cursor - since it might have been set my underlying controls + // Ideally this would show the 'being dragged' control. TODO + Platform::SetCursor( CursorType::Normal ); + + pHoveredControl->Redraw(); +} + +void DragAndDrop::RenderOverlay( Gwen::Controls::Canvas* /*pCanvas*/, Skin::Base* skin ) +{ + if ( !CurrentPackage ) return; + if ( !CurrentPackage->drawcontrol ) return; + + Gwen::Point pntOld = skin->GetRender()->GetRenderOffset(); + + skin->GetRender()->AddRenderOffset( Gwen::Rect( m_iMouseX - SourceControl->X() - CurrentPackage->holdoffset.x, m_iMouseY - SourceControl->Y() - CurrentPackage->holdoffset.y, 0, 0 ) ); + CurrentPackage->drawcontrol->DoRender( skin ); + + skin->GetRender()->SetRenderOffset( pntOld ); +} \ No newline at end of file diff --git a/btgui/Gwen/DragAndDrop.h b/btgui/Gwen/DragAndDrop.h new file mode 100644 index 000000000..cdbd9074e --- /dev/null +++ b/btgui/Gwen/DragAndDrop.h @@ -0,0 +1,35 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_DRAGANDDROP_H +#define GWEN_DRAGANDDROP_H + +#include + +#include "Gwen/Skin.h" +#include "Gwen/Structures.h" + +namespace Gwen +{ + namespace DragAndDrop + { + extern GWEN_EXPORT Package* CurrentPackage; + extern GWEN_EXPORT Gwen::Controls::Base* SourceControl; + extern GWEN_EXPORT Gwen::Controls::Base* HoveredControl; + + bool GWEN_EXPORT Start( Gwen::Controls::Base* pControl, Package* pPackage ); + + bool GWEN_EXPORT OnMouseButton( Gwen::Controls::Base* pHoveredControl, int x, int y, bool bDown ); + void GWEN_EXPORT OnMouseMoved( Gwen::Controls::Base* pHoveredControl, int x, int y ); + + void GWEN_EXPORT RenderOverlay( Gwen::Controls::Canvas* pCanvas, Skin::Base* skin ); + + void GWEN_EXPORT ControlDeleted( Gwen::Controls::Base* pControl ); + } + +} +#endif diff --git a/btgui/Gwen/Events.h b/btgui/Gwen/Events.h new file mode 100644 index 000000000..4f8eb4438 --- /dev/null +++ b/btgui/Gwen/Events.h @@ -0,0 +1,92 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_EVENTS_H +#define GWEN_EVENTS_H + +#include +#include "Gwen/Exports.h" +#include "Gwen/Structures.h" + +// TODO: REMOVE THIS - IT SUCKS. Template the function instead. +#define GWEN_MCALL( fnc ) this, (Gwen::Event::Handler::Function)&fnc + +namespace Gwen +{ + namespace Controls + { + class Base; + } + + namespace Event + { + + class Caller; + + // A class must be derived from this + class GWEN_EXPORT Handler + { + public: + + Handler(); + virtual ~Handler(); + + void RegisterCaller( Caller* ); + void UnRegisterCaller( Caller* ); + + protected: + + void CleanLinks(); + std::list m_Callers; + + public: + + typedef void (Handler::*Function)( Gwen::Controls::Base* pFromPanel ); + typedef void (Handler::*FunctionStr)( const Gwen::String& string ); + + }; + + + + // + // + // + class GWEN_EXPORT Caller + { + public: + + Caller(); + ~Caller(); + + void Call( Controls::Base* pThis ); + + template + void Add( Event::Handler* ob, T f ) + { + AddInternal( ob, static_cast(f) ); + } + + void RemoveHandler( Event::Handler* pObject ); + + protected: + + void CleanLinks(); + void AddInternal( Event::Handler* pObject, Handler::Function pFunction ); + + struct handler + { + Handler::Function fnFunction; + Event::Handler* pObject; + }; + + std::list m_Handlers; + }; + + } + +} +#endif diff --git a/btgui/Gwen/Exports.h b/btgui/Gwen/Exports.h new file mode 100644 index 000000000..afa8d7271 --- /dev/null +++ b/btgui/Gwen/Exports.h @@ -0,0 +1,32 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_EXPORTS_H +#define GWEN_EXPORTS_H + + + +#define GWEN_EXPORT + + +#ifdef _MSC_VER + + #define GWEN_FINLINE __forceinline + #define GWEN_PURE_INTERFACE __declspec(novtable) + +#elif defined(__GNUC__) + + #define GWEN_FINLINE __attribute__((always_inline)) inline + #define GWEN_PUREINTERFACE + +#else + + #define GWEN_FINLINE inline + #define GWEN_PUREINTERFACE + +#endif +#endif diff --git a/btgui/Gwen/Font.h b/btgui/Gwen/Font.h new file mode 100644 index 000000000..6579742b8 --- /dev/null +++ b/btgui/Gwen/Font.h @@ -0,0 +1,52 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_FONT_H +#define GWEN_FONT_H + +#include +#include + +#include "Gwen/BaseRender.h" + +namespace Gwen +{ + + struct Font + { + typedef std::list List; + + Font() + { + data = NULL; + + facename = L"Arial"; + size = 10; + + dropshadow = false; + bold = false; + + } + + UnicodeString facename; + float size; + bool bold; + bool dropshadow; + + // This should be set by the renderer + // if it tries to use a font where it's + // NULL. + void* data; + + // This is the real font size, after it's + // been scaled by Render->Scale() + float realsize; + + }; + +} //namespace Gwen +#endif diff --git a/btgui/Gwen/Gwen.cpp b/btgui/Gwen/Gwen.cpp new file mode 100644 index 000000000..9836bde4a --- /dev/null +++ b/btgui/Gwen/Gwen.cpp @@ -0,0 +1,52 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" + + +namespace Gwen +{ + // Globals + GWEN_EXPORT Controls::Base* HoveredControl = NULL; + GWEN_EXPORT Controls::Base* KeyboardFocus = NULL; + GWEN_EXPORT Controls::Base* MouseFocus = NULL; + + namespace Debug + { + void Msg( const char* str, ... ) + { + char strOut[1024]; + va_list s; + va_start( s, str ); + GwenUtil_VSNPrintFSafe( strOut, sizeof(strOut), _TRUNCATE, str, s ); + va_end(s); + GwenUtil_OutputDebugCharString( strOut ); + } +#ifdef UNICODE + void Msg( const wchar_t* str, ... ) + { + wchar_t strOut[1024]; + va_list s; + va_start( s, str ); + GwenUtil_VSWPrintFSafeSized( strOut, str, s ); + va_end(s); + GwenUtil_OutputDebugWideString( strOut ); + } +#endif + void AssertCheck( bool b, const char* strMsg ) + { + if ( b ) return; +#ifdef WINDOWS + MessageBoxA( NULL, strMsg, "Assert", MB_ICONEXCLAMATION | MB_OK ); + _asm { int 3 } +#else + (void)strMsg; // unused param +#endif + } + } + +} diff --git a/btgui/Gwen/Gwen.h b/btgui/Gwen/Gwen.h new file mode 100644 index 000000000..244db70b9 --- /dev/null +++ b/btgui/Gwen/Gwen.h @@ -0,0 +1,86 @@ +/* + GWEN + + Copyright (c) 2010 Facepunch Studios + + MIT License + + 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. +*/ + +#pragma once +#ifndef GWEN_GWEN_H +#define GWEN_GWEN_H + +#include "Gwen/Macros.h" +#include "Gwen/Config.h" +#include "Gwen/Exports.h" +#include "Gwen/Structures.h" +#include "Gwen/Skin.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Controls/Canvas.h" +#include "Gwen/Align.h" +#include "Gwen/TextObject.h" + +// Enable the hook system (se Hook.h) +#define GWEN_HOOKSYSTEM + +namespace Gwen +{ + namespace Controls + { + class Base; + class Canvas; + } + + namespace Renderer + { + class Base; + } + + namespace Debug + { + void GWEN_EXPORT Msg( const wchar_t* str, ... ); + void GWEN_EXPORT Msg( const char* str, ... ); + void GWEN_EXPORT AssertCheck( bool b, const char* strMsg ); + } + + + namespace Colors + { + static const Color Black ( 0, 0, 0, 255 ); + static const Color Red ( 255, 0, 0, 255 ); + static const Color Yellow ( 255, 255, 0, 255 ); + static const Color White ( 255, 255, 255, 255 ); + static const Color Blue ( 0, 0, 255, 255 ); + static const Color Green ( 0, 255, 0, 255 ); + static const Color Grey ( 200, 200, 200, 255 ); + static const Color GreyLight( 230, 230, 230, 255 ); + static const Color GwenPink ( 255, 65, 199, 255 ); + + + }; + + extern GWEN_EXPORT Controls::Base* HoveredControl; + extern GWEN_EXPORT Controls::Base* KeyboardFocus; + extern GWEN_EXPORT Controls::Base* MouseFocus; + +} //namespace Gwen + +#endif diff --git a/btgui/Gwen/Hook.cpp b/btgui/Gwen/Hook.cpp new file mode 100644 index 000000000..6d28798d4 --- /dev/null +++ b/btgui/Gwen/Hook.cpp @@ -0,0 +1,32 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Hook.h" + +#ifdef GWEN_HOOKSYSTEM + +using namespace Gwen; +using namespace Gwen::Hook; + +std::list g_HookList; + +void Gwen::Hook::AddHook( BaseHook* pHook ) +{ + g_HookList.push_back( pHook ); +} + +void Gwen::Hook::RemoveHook( BaseHook* pHook ) +{ + g_HookList.remove( pHook ); +} + +HookList& Gwen::Hook::GetHookList() +{ + return g_HookList; +} + +#endif \ No newline at end of file diff --git a/btgui/Gwen/Hook.h b/btgui/Gwen/Hook.h new file mode 100644 index 000000000..e42814cd8 --- /dev/null +++ b/btgui/Gwen/Hook.h @@ -0,0 +1,82 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_HOOK_H +#define GWEN_HOOK_H + +#include "Gwen/Gwen.h" +#include + +#ifdef GWEN_HOOKSYSTEM + +namespace Gwen +{ + namespace Hook + { + class GWEN_EXPORT BaseHook + { + public: + + virtual bool OnControlClicked( Gwen::Controls::Base*, int /*iMouseX*/, int /*iMouseY*/ ){ return false; }; + }; + + typedef std::list HookList; + + GWEN_EXPORT HookList& GetHookList(); + + GWEN_EXPORT void AddHook( BaseHook* pHook ); + GWEN_EXPORT void RemoveHook( BaseHook* pHook ); + + template< typename fnc > + bool CallHook( fnc f ) + { + for ( HookList::iterator it = GetHookList().begin(); it != GetHookList().end(); ++it ) + { + if ( ((*it)->*f)() ) return true; + } + + return false; + } + + template< typename fnc, typename AA > + bool CallHook( fnc f, AA a ) + { + for ( HookList::iterator it = GetHookList().begin(); it != GetHookList().end(); ++it ) + { + if ( ((*it)->*f)( a ) ) return true; + } + + return false; + } + + template< typename fnc, typename AA, typename AB > + bool CallHook( fnc f, AA a, AB b ) + { + for ( HookList::iterator it = GetHookList().begin(); it != GetHookList().end(); ++it ) + { + if ( ((*it)->*f)( a, b ) ) return true; + } + + return false; + } + + template< typename fnc, typename AA, typename AB, typename AC > + bool CallHook( fnc f, AA a, AB b, AC c ) + { + for ( HookList::iterator it = GetHookList().begin(); it != GetHookList().end(); ++it ) + { + if ( ((*it)->*f)( a, b, c ) ) return true; + } + + return false; + } + } + +} + +#endif +#endif diff --git a/btgui/Gwen/Input/SDL13.h b/btgui/Gwen/Input/SDL13.h new file mode 100644 index 000000000..0052809b1 --- /dev/null +++ b/btgui/Gwen/Input/SDL13.h @@ -0,0 +1,117 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ +#ifndef GWEN_INPUT_SDL13_H +#define GWEN_INPUT_SDL13_H + +#include "Gwen/InputHandler.h" +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Canvas.h" + +#ifdef _WIN32 +#define UCS_STRING "UCS-2" +#else +#define UCS_STRING "UCS-4" +#endif + +namespace Gwen +{ + namespace Input + { + class SDL13 + { + public: + + SDL13() + { + m_Canvas = NULL; + } + + void Initialize( Gwen::Controls::Canvas* c ) + { + m_Canvas = c; + } + + bool ProcessEvent( SDL_Event* Event ) + { + if (!m_Canvas) return false; + + switch(Event->type) + { + case SDL_KEYUP: + case SDL_KEYDOWN: + { + SDL_KeyboardEvent* E = &Event->key; + int iKey = -1; + SDL_scancode scancode = E->keysym.scancode; + switch (scancode) { + case SDL_SCANCODE_RETURN: iKey = Gwen::Key::Return; break; + case SDL_SCANCODE_BACKSPACE: iKey = Gwen::Key::Backspace; break; + case SDL_SCANCODE_DELETE: iKey = Gwen::Key::Delete; break; + case SDL_SCANCODE_LEFT: iKey = Gwen::Key::Left; break; + case SDL_SCANCODE_RIGHT: iKey = Gwen::Key::Right; break; + case SDL_SCANCODE_LSHIFT: iKey = Gwen::Key::Shift; break; + case SDL_SCANCODE_RSHIFT: iKey = Gwen::Key::Shift; break; + case SDL_SCANCODE_TAB: iKey = Gwen::Key::Tab; break; + case SDL_SCANCODE_SPACE: iKey = Gwen::Key::Space; break; + case SDL_SCANCODE_HOME: iKey = Gwen::Key::Home; break; + case SDL_SCANCODE_END: iKey = Gwen::Key::End; break; + case SDL_SCANCODE_LCTRL: iKey = Gwen::Key::Control; break; + case SDL_SCANCODE_RCTRL: iKey = Gwen::Key::Control; break; + case SDL_SCANCODE_UP: iKey = Gwen::Key::Up; break; + case SDL_SCANCODE_DOWN: iKey = Gwen::Key::Down; break; + case SDL_SCANCODE_ESCAPE: iKey = Gwen::Key::Escape; break; + case SDL_SCANCODE_LALT: iKey = Gwen::Key::Alt; break; + case SDL_SCANCODE_RALT: iKey = Gwen::Key::Alt; break; + default: return false; + } + return m_Canvas->InputKey(iKey, E->state); + } + case SDL_TEXTINPUT: + { + SDL_TextInputEvent* E = &Event->text; + wchar_t* widechar = (wchar_t*)SDL_iconv_string(UCS_STRING, "UTF-8", E->text, SDL_strlen(E->text)+1); + bool ret = m_Canvas->InputCharacter(*widechar); + SDL_free(widechar); + return ret; + } + case SDL_MOUSEMOTION: + { + SDL_MouseMotionEvent* E = &Event->motion; + return m_Canvas->InputMouseMoved(E->x, E->y, E->xrel, E->yrel); + } + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + { + SDL_MouseButtonEvent* E = &Event->button; + int Button = -1; + switch (E->button) { + case SDL_BUTTON_LEFT: Button = 0; break; + case SDL_BUTTON_MIDDLE: Button = 2; break; + case SDL_BUTTON_RIGHT: Button = 1; break; + default: return false; + } + return m_Canvas->InputMouseButton(Button, E->state); + } + case SDL_MOUSEWHEEL: + { + SDL_MouseWheelEvent* E = &Event->wheel; + return m_Canvas->InputMouseWheel(E->y); + } + default: + { + return false; + } + } + } + + protected: + + Gwen::Controls::Canvas* m_Canvas; + + }; + } +} +#endif diff --git a/btgui/Gwen/Input/SFML.h b/btgui/Gwen/Input/SFML.h new file mode 100644 index 000000000..78625ba88 --- /dev/null +++ b/btgui/Gwen/Input/SFML.h @@ -0,0 +1,148 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_INPUT_SFML_H +#define GWEN_INPUT_SFML_H + +#include "Gwen/InputHandler.h" +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Canvas.h" + +#include + +namespace Gwen +{ + namespace Input + { + class SFML + { + public: + + SFML() + { + m_Canvas = NULL; + m_MouseX = 0; + m_MouseY = 0; + } + + void Initialize( Gwen::Controls::Canvas* c ) + { + m_Canvas = c; + } + + unsigned char TranslateKeyCode( int iKeyCode ) + { + switch ( iKeyCode ) + { +#if SFML_VERSION_MAJOR == 2 + case sf::Keyboard::Back: return Gwen::Key::Backspace; + case sf::Keyboard::Return: return Gwen::Key::Return; + case sf::Keyboard::Escape: return Gwen::Key::Escape; + case sf::Keyboard::Tab: return Gwen::Key::Tab; + case sf::Keyboard::Space: return Gwen::Key::Space; + case sf::Keyboard::Up: return Gwen::Key::Up; + case sf::Keyboard::Down: return Gwen::Key::Down; + case sf::Keyboard::Left: return Gwen::Key::Left; + case sf::Keyboard::Right: return Gwen::Key::Right; + case sf::Keyboard::Home: return Gwen::Key::Home; + case sf::Keyboard::End: return Gwen::Key::End; + case sf::Keyboard::Delete: return Gwen::Key::Delete; + case sf::Keyboard::LControl: return Gwen::Key::Control; + case sf::Keyboard::LAlt: return Gwen::Key::Alt; + case sf::Keyboard::LShift: return Gwen::Key::Shift; + case sf::Keyboard::RControl: return Gwen::Key::Control; + case sf::Keyboard::RAlt: return Gwen::Key::Alt; + case sf::Keyboard::RShift: return Gwen::Key::Shift; +#else + case sf::Key::Back: return Gwen::Key::Backspace; + case sf::Key::Return: return Gwen::Key::Return; + case sf::Key::Escape: return Gwen::Key::Escape; + case sf::Key::Tab: return Gwen::Key::Tab; + case sf::Key::Space: return Gwen::Key::Space; + case sf::Key::Up: return Gwen::Key::Up; + case sf::Key::Down: return Gwen::Key::Down; + case sf::Key::Left: return Gwen::Key::Left; + case sf::Key::Right: return Gwen::Key::Right; + case sf::Key::Home: return Gwen::Key::Home; + case sf::Key::End: return Gwen::Key::End; + case sf::Key::Delete: return Gwen::Key::Delete; + case sf::Key::LControl: return Gwen::Key::Control; + case sf::Key::LAlt: return Gwen::Key::Alt; + case sf::Key::LShift: return Gwen::Key::Shift; + case sf::Key::RControl: return Gwen::Key::Control; + case sf::Key::RAlt: return Gwen::Key::Alt; + case sf::Key::RShift: return Gwen::Key::Shift; +#endif + } + + return Gwen::Key::Invalid; + } + + bool ProcessMessage( sf::Event& event ) + { + if ( !m_Canvas ) return false; + + switch(event.Type) + { + case sf::Event::MouseMoved: + { + int dx = event.MouseMove.X - m_MouseX; + int dy = event.MouseMove.Y - m_MouseY; + + m_MouseX = event.MouseMove.X; + m_MouseY = event.MouseMove.Y; + + return m_Canvas->InputMouseMoved( m_MouseX, m_MouseY, dx, dy ); + } + + + case sf::Event::MouseButtonPressed: + case sf::Event::MouseButtonReleased: + { + return m_Canvas->InputMouseButton( event.MouseButton.Button, event.Type == sf::Event::MouseButtonPressed ); + } + + case sf::Event::MouseWheelMoved: + { + return m_Canvas->InputMouseWheel( event.MouseWheel.Delta * 60 ); + } + + case sf::Event::TextEntered: + { + return m_Canvas->InputCharacter( event.Text.Unicode ); + } + + case sf::Event::KeyPressed: + case sf::Event::KeyReleased: + { + bool bPressed = (event.Type == sf::Event::KeyPressed); + + if ( event.Key.Control && bPressed && event.Key.Code >= 'a' && event.Key.Code <= 'z' ) + { + return m_Canvas->InputCharacter( event.Key.Code ); + } + + unsigned char iKey = TranslateKeyCode( event.Key.Code ); + + return m_Canvas->InputKey( iKey, bPressed ); + + } + } + + return false; + } + + protected: + + Gwen::Controls::Canvas* m_Canvas; + int m_MouseX; + int m_MouseY; + + }; + } +} +#endif diff --git a/btgui/Gwen/Input/Windows.h b/btgui/Gwen/Input/Windows.h new file mode 100644 index 000000000..09ce2b4b5 --- /dev/null +++ b/btgui/Gwen/Input/Windows.h @@ -0,0 +1,164 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ +#ifndef GWEN_INPUT_WINDOWS_H +#define GWEN_INPUT_WINDOWS_H + +#include "Gwen/InputHandler.h" +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Canvas.h" + +#include + +namespace Gwen +{ + namespace Input + { + class Windows + { + public: + + Windows() + { + m_Canvas = NULL; + m_MouseX = 0; + m_MouseY = 0; + } + + void Initialize( Gwen::Controls::Canvas* c ) + { + m_Canvas = c; + } + + bool ProcessMessage( MSG msg ) + { + if ( !m_Canvas ) return false; + + switch ( msg.message ) + { + case WM_MOUSEMOVE: + { + int x = (signed short)LOWORD( msg.lParam ); + int y = (signed short)HIWORD( msg.lParam ); + int dx = x - m_MouseX; + int dy = y - m_MouseY; + + m_MouseX = x; + m_MouseY = y; + + return m_Canvas->InputMouseMoved( x, y, dx, dy ); + } + + case WM_CHAR: + { + Gwen::UnicodeChar chr = (Gwen::UnicodeChar)msg.wParam; + return m_Canvas->InputCharacter( chr ); + } + + case WM_MOUSEWHEEL: + { + return m_Canvas->InputMouseWheel( (short)HIWORD( msg.wParam ) ); + } + + case WM_LBUTTONDOWN: + { + SetCapture( msg.hwnd ); + return m_Canvas->InputMouseButton( 0, true ); + } + + case WM_LBUTTONUP: + { + ReleaseCapture(); + return m_Canvas->InputMouseButton( 0, false ); + } + + case WM_RBUTTONDOWN: + { + SetCapture( msg.hwnd ); + return m_Canvas->InputMouseButton( 1, true ); + } + + case WM_RBUTTONUP: + { + ReleaseCapture(); + return m_Canvas->InputMouseButton( 1, false ); + } + + case WM_MBUTTONDOWN: + { + SetCapture( msg.hwnd ); + return m_Canvas->InputMouseButton( 2, true ); + } + + case WM_MBUTTONUP: + { + ReleaseCapture(); + return m_Canvas->InputMouseButton( 2, true ); + } + + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + { + // Filter out those events from the application + return true; + } + + case WM_KEYDOWN: + case WM_KEYUP: + { + bool bDown = msg.message == WM_KEYDOWN; + int iKey = -1; + + // These aren't sent by WM_CHAR when CTRL is down - but we need + // them internally for copy and paste etc.. + if ( bDown && GetKeyState( VK_CONTROL ) & 0x80 && msg.wParam >= 'A' && msg.wParam <= 'Z' ) + { + Gwen::UnicodeChar chr = (Gwen::UnicodeChar)msg.wParam; + return m_Canvas->InputCharacter( chr ); + } + + if ( msg.wParam == VK_SHIFT ) iKey = Gwen::Key::Shift; + else if ( msg.wParam == VK_RETURN ) iKey = Gwen::Key::Return; + else if ( msg.wParam == VK_BACK ) iKey = Gwen::Key::Backspace; + else if ( msg.wParam == VK_DELETE ) iKey = Gwen::Key::Delete; + else if ( msg.wParam == VK_LEFT ) iKey = Gwen::Key::Left; + else if ( msg.wParam == VK_RIGHT ) iKey = Gwen::Key::Right; + else if ( msg.wParam == VK_TAB ) iKey = Gwen::Key::Tab; + else if ( msg.wParam == VK_SPACE ) iKey = Gwen::Key::Space; + else if ( msg.wParam == VK_HOME ) iKey = Gwen::Key::Home; + else if ( msg.wParam == VK_END ) iKey = Gwen::Key::End; + else if ( msg.wParam == VK_CONTROL ) iKey = Gwen::Key::Control; + else if ( msg.wParam == VK_SPACE ) iKey = Gwen::Key::Space; + else if ( msg.wParam == VK_UP ) iKey = Gwen::Key::Up; + else if ( msg.wParam == VK_DOWN ) iKey = Gwen::Key::Down; + + if ( iKey != -1 ) + { + return m_Canvas->InputKey( iKey, bDown ); + } + + break; + } + + default: + { + break; + } + } + + return false; + } + + protected: + + Gwen::Controls::Canvas* m_Canvas; + int m_MouseX; + int m_MouseY; + + }; + } +} +#endif diff --git a/btgui/Gwen/InputHandler.h b/btgui/Gwen/InputHandler.h new file mode 100644 index 000000000..ee97f55ef --- /dev/null +++ b/btgui/Gwen/InputHandler.h @@ -0,0 +1,82 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_INPUTHANDLER_H +#define GWEN_INPUTHANDLER_H + +#include +#include "Gwen/Gwen.h" + +namespace Gwen +{ + namespace Controls + { + class Base; + } + + namespace Key + { + const unsigned char Invalid = 0; + const unsigned char Return = 1; + const unsigned char Backspace = 2; + const unsigned char Delete = 3; + const unsigned char Left = 4; + const unsigned char Right = 5; + const unsigned char Shift = 6; + const unsigned char Tab = 7; + const unsigned char Space = 8; + const unsigned char Home = 9; + const unsigned char End = 10; + const unsigned char Control = 11; + const unsigned char Up = 12; + const unsigned char Down = 13; + const unsigned char Escape = 14; + const unsigned char Alt = 15; + + const unsigned char Count = 16; + } + + namespace Input + { + namespace Message + { + enum + { + Copy, + Paste, + Cut, + Undo, + Redo, + SelectAll + }; + }; + + + + // For use in panels + bool GWEN_EXPORT IsKeyDown( int iKey ); + bool GWEN_EXPORT IsLeftMouseDown(); + bool GWEN_EXPORT IsRightMouseDown(); + Gwen::Point GWEN_EXPORT GetMousePosition(); + + inline bool IsShiftDown(){ return IsKeyDown( Gwen::Key::Shift ); } + inline bool IsControlDown(){ return IsKeyDown( Gwen::Key::Control ); } + + // Does copy, paste etc + bool GWEN_EXPORT DoSpecialKeys( Controls::Base* pCanvas, Gwen::UnicodeChar chr ); + bool GWEN_EXPORT HandleAccelerator( Controls::Base* pCanvas, Gwen::UnicodeChar chr ); + + // Send input to canvas for study + void GWEN_EXPORT OnMouseMoved( Controls::Base* pCanvas, int x, int y, int deltaX, int deltaY ); + bool GWEN_EXPORT OnMouseClicked( Controls::Base* pCanvas, int iButton, bool bDown ); + bool GWEN_EXPORT OnKeyEvent( Controls::Base* pCanvas, int iKey, bool bDown ); + void GWEN_EXPORT OnCanvasThink( Controls::Base* pControl ); + + + }; +} +#endif diff --git a/btgui/Gwen/Macros.h b/btgui/Gwen/Macros.h new file mode 100644 index 000000000..e0669f163 --- /dev/null +++ b/btgui/Gwen/Macros.h @@ -0,0 +1,82 @@ + +// C RunTime Header Files +#ifndef GWEN_MACROS_H +#define GWEN_MACROS_H +#include +#include +#ifndef __APPLE__ +#include +#endif //__APPLE__ +#include +#include + +// Not tied to platform api. +#define GwenUtil_Min( a, b ) ( ( (a) < (b) ) ? (a) : (b) ) +#define GwenUtil_Max( a, b ) ( ( (a) > (b) ) ? (a) : (b) ) +#define GwenUtil_VSWPrintFSafeSized( _DstBuf_ARRAY_, _Format, _ArgList ) GwenUtil_VSWPrintFSafe( _DstBuf_ARRAY_, sizeof( _DstBuf_ARRAY_ ) / sizeof( wchar_t ), _Format, _ArgList ) + +#ifdef _WIN32 + + #define NOMINMAX + #include + + #define GwenUtil_VSNPrintFSafe( _DstBuf, _DstSize, _MaxCount, _Format, _ArgList ) vsnprintf_s( _DstBuf, _DstSize, _MaxCount, _Format, _ArgList ) + #define GwenUtil_VSWPrintFSafe( _DstBuf, _SizeInWords, _Format, _ArgList ) vswprintf_s( _DstBuf, _SizeInWords, _Format, _ArgList ) + #define GwenUtil_OutputDebugCharString( lpOutputString ) OutputDebugStringA( lpOutputString ) + #define GwenUtil_OutputDebugWideString( lpOutputString ) OutputDebugStringW( lpOutputString ) + #define GwenUtil_WideStringToFloat( _Str ) _wtof( _Str ) + +#elif defined(__APPLE__) + + #include + + #define GwenUtil_VSNPrintFSafe( _DstBuf, _DstSize, _MaxCount, _Format, _ArgList ) vsnprintf( _DstBuf, _DstSize, _Format, _ArgList ) + #define GwenUtil_VSWPrintFSafe( _DstBuf, _SizeInWords, _Format, _ArgList ) vswprintf( _DstBuf, _SizeInWords, _Format, _ArgList ) + #define GwenUtil_OutputDebugCharString( lpOutputString ) //printf( lpOutputString ) + #define GwenUtil_OutputDebugWideString( lpOutputString ) //wprintf( lpOutputString ) + #define GwenUtil_WideStringToFloat( _Str ) wcstof(_Str, NULL) + +#elif defined(__linux__) + + #define GwenUtil_VSNPrintFSafe( _DstBuf, _DstSize, _MaxCount, _Format, _ArgList ) vsnprintf( _DstBuf, _DstSize, _Format, _ArgList ) + #define GwenUtil_VSWPrintFSafe( _DstBuf, _SizeInWords, _Format, _ArgList ) vswprintf( _DstBuf, _SizeInWords, _Format, _ArgList ) + #define GwenUtil_OutputDebugCharString( lpOutputString ) //printf( lpOutputString ) + #define GwenUtil_OutputDebugWideString( lpOutputString ) //wprintf( lpOutputString ) + #define GwenUtil_WideStringToFloat( _Str ) wcstof(_Str, NULL) + +#else + + #error MUST_IMPLEMENT_PLATFORM + +#endif + + +namespace Gwen +{ + template + T1 Clamp( T1 current, T2 vmin, T3 vmax ) + { + if ( current > vmax ) return (T1)vmax; + if ( current < vmin ) return (T1)vmin; + return current; + } + + template + inline T Approach( T fCurrent, T fTarget, T2 fDelta ) + { + if ( fCurrent < fTarget ) + { + fCurrent += fDelta; + if ( fCurrent > fTarget ) return fTarget; + } + else if ( fCurrent > fTarget ) + { + fCurrent -= fDelta; + if ( fCurrent < fTarget ) return fTarget; + } + + return fCurrent; + } +} + +#endif \ No newline at end of file diff --git a/btgui/Gwen/Platform.h b/btgui/Gwen/Platform.h new file mode 100644 index 000000000..d6ed301b5 --- /dev/null +++ b/btgui/Gwen/Platform.h @@ -0,0 +1,43 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_PLATFORM_H +#define GWEN_PLATFORM_H + +#include "Gwen/Structures.h" +#include "Gwen/Events.h" + +namespace Gwen +{ + namespace Platform + { + // + // Set the system cursor to iCursor + // Cursors are defined in Structures.h + // + void GWEN_EXPORT SetCursor( unsigned char iCursor ); + + // + // Used by copy/paste + // + UnicodeString GWEN_EXPORT GetClipboardText(); + bool GWEN_EXPORT SetClipboardText( const UnicodeString& str ); + + // + // Needed for things like double click + // + float GWEN_EXPORT GetTimeInSeconds(); + + // + // System Dialogs ( Can return false if unhandled ) + // + bool GWEN_EXPORT FileOpen( const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Event::Handler::FunctionStr fnCallback ); + bool GWEN_EXPORT FileSave( const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Event::Handler::FunctionStr fnCallback ); + } + +} +#endif diff --git a/btgui/Gwen/Platforms/Null.cpp b/btgui/Gwen/Platforms/Null.cpp new file mode 100644 index 000000000..e2205c4cc --- /dev/null +++ b/btgui/Gwen/Platforms/Null.cpp @@ -0,0 +1,54 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#include "Gwen/Macros.h" +#include "Gwen/Platform.h" + +#ifndef _WIN32 + +#include + +static Gwen::UnicodeString gs_ClipboardEmulator; + +void Gwen::Platform::SetCursor( unsigned char iCursor ) +{ + // No platform independent way to do this +} + +Gwen::UnicodeString Gwen::Platform::GetClipboardText() +{ + return gs_ClipboardEmulator; +} + +bool Gwen::Platform::SetClipboardText( const Gwen::UnicodeString& str ) +{ + gs_ClipboardEmulator = str; + return true; +} + +float Gwen::Platform::GetTimeInSeconds() +{ + float fSeconds = (float) clock() / (float)CLOCKS_PER_SEC; + return fSeconds; +} + +bool Gwen::Platform::FileOpen( const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Event::Handler::FunctionStr fnCallback ) +{ + // No platform independent way to do this. + // Ideally you would open a system dialog here + + return false; +} + +bool Gwen::Platform::FileSave( const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::FunctionStr fnCallback ) +{ + // No platform independent way to do this. + // Ideally you would open a system dialog here + + return false; +} + +#endif // ndef WIN32 \ No newline at end of file diff --git a/btgui/Gwen/Platforms/Windows.cpp b/btgui/Gwen/Platforms/Windows.cpp new file mode 100644 index 000000000..9f4800c0f --- /dev/null +++ b/btgui/Gwen/Platforms/Windows.cpp @@ -0,0 +1,236 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#include "Gwen/Macros.h" +#include "Gwen/Platform.h" + +#ifdef _WIN32 + + +#include + +#include +#pragma comment( lib, "winmm.lib" ) + +using namespace Gwen; +using namespace Gwen::Platform; + +#ifdef UNICODE +static LPWSTR iCursorConvertion[] = +#else +static LPSTR iCursorConvertion[] = +#endif +{ + IDC_ARROW, + IDC_IBEAM, + IDC_SIZENS, + IDC_SIZEWE, + IDC_SIZENWSE, + IDC_SIZENESW, + IDC_SIZEALL, + IDC_NO, + IDC_WAIT, + IDC_HAND +}; + +void Gwen::Platform::SetCursor( unsigned char iCursor ) +{ + // Todo.. Properly. + ::SetCursor( LoadCursor( NULL, iCursorConvertion[iCursor] ) ); +} + +Gwen::UnicodeString Gwen::Platform::GetClipboardText() +{ + if ( !OpenClipboard( NULL ) ) return L""; + + HANDLE hData = GetClipboardData( CF_UNICODETEXT ); + + if ( hData == NULL ) + { + CloseClipboard(); + return L""; + } + + wchar_t* buffer = (wchar_t *)GlobalLock( hData ); + UnicodeString str = buffer; + GlobalUnlock( hData ); + CloseClipboard(); + return str; +} + +bool Gwen::Platform::SetClipboardText( const Gwen::UnicodeString& str ) +{ + if ( !OpenClipboard( NULL ) ) return false; + + EmptyClipboard(); + + // Create a buffer to hold the string + size_t iDataSize = (str.length()+1) * sizeof(wchar_t); + HGLOBAL clipbuffer = GlobalAlloc( GMEM_DDESHARE, iDataSize ); + + // Copy the string into the buffer + wchar_t* buffer = (wchar_t*) GlobalLock( clipbuffer ); + wcscpy_s( buffer, iDataSize, str.c_str() ); + GlobalUnlock(clipbuffer); + + // Place it on the clipboard + SetClipboardData( CF_UNICODETEXT, clipbuffer ); + + CloseClipboard(); + return true; +} + +double GetPerformanceFrequency() +{ + static double Frequency = 0.0f; + + if ( Frequency == 0.0f ) + { + __int64 perfFreq; + QueryPerformanceFrequency( (LARGE_INTEGER*)&perfFreq ); + Frequency = 1.0 / (double)perfFreq; + } + + return Frequency; +} + +float Gwen::Platform::GetTimeInSeconds() +{ +#if 1 + + static float fCurrentTime = 0.0f; + static __int64 iLastTime = 0; + + __int64 thistime; + QueryPerformanceCounter( (LARGE_INTEGER*)&thistime ); + + float fSecondsDifference = (double)( thistime - iLastTime ) * GetPerformanceFrequency(); + if ( fSecondsDifference > 0.1f ) fSecondsDifference = 0.1f; + + fCurrentTime += fSecondsDifference; + + iLastTime = thistime; + + return fCurrentTime; + +#else + + return timeGetTime() / 1000.0; + +#endif +} + +bool Gwen::Platform::FileOpen( const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Event::Handler::FunctionStr fnCallback ) +{ + char Filestring[256]; + String returnstring; + + char FilterBuffer[512]; + { + memset( FilterBuffer, 0, sizeof(FilterBuffer) ); + memcpy( FilterBuffer, Extension.c_str(), GwenUtil_Min( Extension.size(), 512 ) ); + for (int i=0; i<512; i++) + { + if ( FilterBuffer[i] == '|' ) + FilterBuffer[i] = 0; + } + } + + OPENFILENAMEA opf; + opf.hwndOwner = 0; + opf.lpstrFilter = FilterBuffer; + opf.lpstrCustomFilter = 0; + opf.nMaxCustFilter = 0L; + opf.nFilterIndex = 1L; + opf.lpstrFile = Filestring; + opf.lpstrFile[0] = '\0'; + opf.nMaxFile = 256; + opf.lpstrFileTitle = 0; + opf.nMaxFileTitle=50; + opf.lpstrInitialDir = StartPath.c_str(); + opf.lpstrTitle = Name.c_str(); + opf.nFileOffset = 0; + opf.nFileExtension = 0; + opf.lpstrDefExt = "*.*"; + opf.lpfnHook = NULL; + opf.lCustData = 0; + opf.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR) & ~OFN_ALLOWMULTISELECT; + opf.lStructSize = sizeof(OPENFILENAME); + + if ( GetOpenFileNameA( &opf ) ) + { + if ( pHandler && fnCallback ) + { + (pHandler->*fnCallback)( opf.lpstrFile ); + } + } + else + { + if ( pHandler && fnCallback ) + { + (pHandler->*fnCallback)( "" ); + } + } + + return true; +} + +bool Gwen::Platform::FileSave( const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::FunctionStr fnCallback ) +{ + char Filestring[256]; + String returnstring; + + char FilterBuffer[512]; + { + memset( FilterBuffer, 0, sizeof(FilterBuffer) ); + memcpy( FilterBuffer, Extension.c_str(), GwenUtil_Min( Extension.size(), 512 ) ); + for (int i=0; i<512; i++) + { + if ( FilterBuffer[i] == '|' ) + FilterBuffer[i] = 0; + } + } + + OPENFILENAMEA opf; + opf.hwndOwner = 0; + opf.lpstrFilter = FilterBuffer; + opf.lpstrCustomFilter = 0; + opf.nMaxCustFilter = 0L; + opf.nFilterIndex = 1L; + opf.lpstrFile = Filestring; + opf.lpstrFile[0] = '\0'; + opf.nMaxFile = 256; + opf.lpstrFileTitle = 0; + opf.nMaxFileTitle=50; + opf.lpstrInitialDir = StartPath.c_str(); + opf.lpstrTitle = Name.c_str(); + opf.nFileOffset = 0; + opf.nFileExtension = 0; + opf.lpstrDefExt = "*.*"; + opf.lpfnHook = NULL; + opf.lCustData = 0; + opf.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR) & ~OFN_ALLOWMULTISELECT; + opf.lStructSize = sizeof(OPENFILENAME); + + if ( GetSaveFileNameA( &opf ) ) + { + if ( pHandler && fnCallback ) + { + (pHandler->*fnCallback)( opf.lpstrFile ); + } + } + else + { + if ( pHandler && fnCallback ) + { + (pHandler->*fnCallback)( "" ); + } + } + + return true; +} + +#endif // WIN32 \ No newline at end of file diff --git a/btgui/Gwen/Renderers/DirectX9.h b/btgui/Gwen/Renderers/DirectX9.h new file mode 100644 index 000000000..2c07a7ac2 --- /dev/null +++ b/btgui/Gwen/Renderers/DirectX9.h @@ -0,0 +1,74 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#ifndef GWEN_RENDERERS_DIRECTX9_H +#define GWEN_RENDERERS_DIRECTX9_H +#include "Gwen/Gwen.h" +#include "Gwen/BaseRender.h" + +struct VERTEXFORMAT2D +{ + FLOAT x, y, z, rhw; + DWORD color; + float u, v; +}; + +#define D3DFVF_VERTEXFORMAT2D ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 ) + +namespace Gwen +{ + namespace Renderer + { + + class GWEN_EXPORT DirectX9 : public Gwen::Renderer::Base + { + public: + + DirectX9( IDirect3DDevice9* pDevice ); + ~DirectX9(); + + virtual void Begin(); + virtual void End(); + virtual void Release(); + + virtual void SetDrawColor(Gwen::Color color); + + virtual void DrawLine( int x, int y, int a, int b ); + virtual void DrawFilledRect( Gwen::Rect rect ); + + virtual void LoadFont( Gwen::Font* pFont ); + virtual void FreeFont( Gwen::Font* pFont ); + virtual void RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::UnicodeString& text ); + virtual Gwen::Point MeasureText( Gwen::Font* pFont, const Gwen::UnicodeString& text ); + + void StartClip(); + void EndClip(); + + void DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect pTargetRect, float u1=0.0f, float v1=0.0f, float u2=1.0f, float v2=1.0f ); + void LoadTexture( Gwen::Texture* pTexture ); + void FreeTexture( Gwen::Texture* pTexture ); + + protected: + + void* m_pCurrentTexture; + IDirect3DDevice9* m_pDevice; + DWORD m_Color; + + void Flush(); + void AddVert( int x, int y ); + void AddVert( int x, int y, float u, float v ); + + static const int MaxVerts = 1024; + VERTEXFORMAT2D m_pVerts[MaxVerts]; + int m_iVertNum; + + Gwen::Font::List m_FontList; + + }; + + } +} +#endif diff --git a/btgui/Gwen/Renderers/FontData.h b/btgui/Gwen/Renderers/FontData.h new file mode 100644 index 000000000..4a2792109 --- /dev/null +++ b/btgui/Gwen/Renderers/FontData.h @@ -0,0 +1,265 @@ + +unsigned char sGwenFontData[] = +{ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,255,0,255,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0, + 255,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 255,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 255,0,255,0,0,0,255,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,255,0,0,255,255,0,255,0,255,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,255,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,255,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 255,255,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + +static const char sGwenDebugFontSpacing[]= +{ + 0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,4,6,6,9,8,3,4,4,4,6,3,7,3,3,6,6,6,6,6,6,6,6,6,6,3,3,6,5,6,6,11,7,7,8,8,7,6,8,8,3,5,7,6,9,8,8,7,8,7,7,5,8,7,9,7,7,7,3,3,3,6,6,3,5,6,5,6,5,4,6,6,2,2,5,2,8,6,6,6,6,4,5,4,5,6,8,6,5,5,3,3,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,6,6,5,6,3,6,3,9,4,6,7,4,9,3,4,6,3,3,3,5,6,3,3,3,4,6,9,9,9,6,7,7,7,7,7,7,10,8,7,7,7,7,3,3,3,3,8,8,8,8,8,8,8,6,8,8,8,8,8,7,7,5,5,5,5,5,5,5,8,5,5,5,5,5,2,2,2,2,6,5,6,6,6,6,6,6,6,5,5,5,5,5,6,5,116,112,61,0,0,0,0,-96,-48,96,80,-64,0,64,-96,16,0,0,0,98,99,0,16,0,-96,-48,96,80,-64,0,-16,-128,16,98,99,0,-80,32,16,-16,16,112,-64,-64,-32,-16,-48,16,-48,0,64,-128,-64,32,-48,-64,-48,-16,96,32,64,96,96,32,32,-96,-64,-96,80,64,-80,16,-48,16,-80,-16,48,112,80,-80,-16,64,80,-112,-48,16,80,48,96,16,16,16,-112,-16,-16,0,96,48,48,-112,112,-80,-32,-48,-96,-112,16,80,80,48,-64,-80,-112,96,80,64,96,48,80,73,65,32,84,82,84,0,92,103,32,101,120,92,114,102,105,108,117,32,92,105,117,120,108,0,115,114,32,114,114,116,101,110,0,92,103,32,101,120,92,114,102,105,108,117,32,92,105,117,108,0,92,103,32,101,120,92,114,102,105,108,117,32,92,105,117,120,101,110,105,114,101,0,100,84,60,115,116,95,116,97,60,115,119,58,116,115,97,42,114,32,58,115,108,32,110,111,111,58,101,44,115,116,97,99,114,97,71,58,110,108,66,32,48,58,110,105,97,58,101,111,61,83,100,32,32,114,101,110,105,114,101,44,0,112,116,101,111,105,109,105,0,115,110,116,101,111,117,100,97,0,115,111,64,80,-112,34,32,114,101,0,100,105,99,115,101,67,114,58,115,44,115,116,97,99,114,97,71,58,110,108,66,32,62,67,116,101,111,62,112,116,42,83,100,32,32,114,101,117,102,110,44,0,115,116,116,110,100,102,110,108,0,100,105,99,115,101,67,114,58,115,44,115,116,97,99,114,97,71,58,110,108,66,32,62,67,116,101,111,62,112,116,43,0,115,116,116,110,105,101,116,101,60,108,0,112,116,97,105,97,32,115,32,103,0,100,105,99,115,101,67,114,58,115,44,115,116,97,99,114,97,71,58,110,108,66,32,62,67,116,101,111,62,67,97,108,32,114,114,110,112,98,0,100,84,60,115,116,95,116,97,60,115,119,58,116,115,97,42,114,32,58,115,108,32,110,111,111,58,101,44,115,116,97,99,114,97,71,58,110,108,66,32,48,58,110,105,97,58,101,0,112,116,101,111,111,101,109,97,0,100,84,60,115,116,95,116,97,60,115,119,58,116,115,97,42,114,32,58,115,108,32,110,111,111,58,101,44,115,116,97,99,114,97,71,58,110,108,66,32,48,58,110,105,97,58,110,0,112,116,101,111,111,110,109,97,0,118,100,101,111,16,-26,100,105,99,115,101,67,114,58,115,44,115,116,97,99,114,97,71,58,110,108,66,32,62,67,116,101,111,62,112,116,45,0,115,116,116,110,100,101,116,101,97,111,0,0,0,0,97,111,48,48,-96,-112,-48,16,-64,0,-16,-128,16,0,-103,97,111,58,110,105,33,-128,32,-64,-16,16,112,-64,-64,-32,-16,-48,16,-48,0,64,-128,-64,32,-48,-64,-48,-16,96,32,112,96,96,32,-96,-96,-64,-96,80,64,-80,16,-48,16,-80,-16,48,112,80,-80,-16,64,80,-112,-48,16,80,48,96,16,16,16,-112,32,-16,0,96,48,48,-112,112,-80,-32,-48,-96,-112,16,80,80,48,-64,-124,-96,-112,64,-110,-128,0,80,112,0,100,84,60,115,116,95,112,97,60,115,116,98,99,114,60,97,44,117,115,58,114,97,60,97,62,97,115,58,111,111,99,95,62,97,71,58,101,58,108,42,114,32,58,115,108,32,58,115,115,110,99,95,116,116,100,104,116,116,99,95,99,115,100,108,97,60,97,62,62,97,115,58,111,111,116,116,100,97,99,115,100,97,95,105,119,114,115,99,116,99,95,105,119,114,44,115,116,97,99,114,104,116,32,115,99,115,101,69,116,97,114,32,62,58,115,116,116,58,114,114,0,100,84,60,115,116,95,112,97,60,115,116,98,99,114,60,97,44,117,115,58,114,97,60,97,62,97,115,58,111,111,99,95,62,97,71,58,101,58,108,42,114,32,58,115,108,32,58,115,115,110,99,95,116,116,100,104,116,116,99,95,99,115,100,108,97,60,97,62,62,97,115,58,111,111,116,116,100,97,99,115,100,97,95,105,119,114,115,99,116,99,95,105,119,114,44,115,116,97,99,114,104,116,32,115,99,115,101,69,116,97,114,32,62,58,115,116,116,58,114,114,0,112,116,101,111,111,101,101,99,101,100,84,60,115,116,95,112,97,60,115,116,98,99,114,60,97,44,117,115,58,114,97,60,97,62,97,115,58,111,111,99,95,62,97,71,58,101,58,108,42,114,32,58,115,108,32,58,115,115,110,99,95,116,116,100,104,116,116,99,95,99,115,100,108,97,60,97,62,62,97,115,58,111,111,116,116,100,97,99,115,100,97,95,105,119,114,115,99,116,99,95,105,119,114,44,115,116,97,99,114,104,116,32,115,99,115,101,69,116,97,114,32,62,58,115,116,116,58,99,92,103,32,101,120,92,114,102,105,108,117,32,92,105,117,97,114,109,100,105,99,115,101,67,114,58,115,44,115,116,97,99,114,97,71,58,110,108,66,32,62,73,97,60,58,101,100,101,111,115,110,111,97,0,116,45,97,99,97,114,97,34,41,100,105,99,115,101,67,114,58,115,44,115,116,97,99,114,97,71,58,110,108,66,32,62,67,116,101,111,62,112,116,42,100,105,99,115,101,67,114,58,115,44,115,116,97,99,114,97,71,58,110,108,66,32,62,67,116,101,111,62,112,116,43,0,100,105,99,115,101,67,114,58,115,44,115,116,97,99,114,97,71,58,110,108,66,32,62,67,116,101,111,62,67,97,98,99,98,99,98,99,-113,67,32,83,116,0,100,105,99,115,101,72,58,115,111,44,115,116,97,99,114,97,71,58,111,66,72,32,62,67,116,101,111,62,112,116,42,100,105,99,115,101,72,58,115,111,44,115,116,97,99,114,97,71,58,111,66,72,32,62,67,116,101,111,62,112,116,43,0,100,105,99,115,101,72,58,115,111,44,115,116,97,99,114,97,71,58,111,66,72,32,62,67,116,101,111,62,67,97,98,99,-92,-96,64,-128,112,116,115,32,114,114,116,101,110,0,100,84,60,115,116,95,112,97,60,115,119,58,116,115,97,42,97,115,58,116,97,71,58,105,65,97,110,99,115,100,108,97,60,115,119,58,109,110,116,32,62,114,32,58,115,108,32,110,111,111,58,101,44,115,116,97,99,114,114,32,58,105,108,32,110,111,111,58,101,99,116,97,115,58,116,97,71,58,105,65,97,110,99,115,100,108,97,60,115,119,58,109,110,116,32,62,62,32,99,116,101,111,111,97,32,0,100,105,99,115,101,65,58,105,105,42,97,115,58,111,111,108,32,110,110,58,109,111,62,58,110,105,97,60,58,114,114,0,100,105,99,115,101,65,58,105,105,42,97,115,58,111,111,108,32,110,110,58,109,111,62,58,110,105,97,60,58,114,114,0,100,84,60,115,116,95,112,97,60,115,119,58,116,115,97,42,97,115,58,116,97,71,58,105,65,97,110,99,115,100,108,97,60,115,119,58,109,110,116,32,62,114,32,58,115,108,32,110,111,111,58,101,44,115,116,97,99,114,114,32,58,105,108,32,110,111,111,58,101,99,116,97,115,58,116,97,71,58,105,65,97,110,99,115,100,108,97,60,115,119,58,109,110,116,32,62,62,32,99,116,101,111,111,97,32,0,100,84,60,115,116,95,112,97,60,115,119,58,116,115,97,42,97,115,58,116,97,71,58,105,65,97,110,99,115,100,108,97,60,115,119,58,109,110,116,32,62,114,32,58,115,108,32,110,111,111,58,101,44,115,116,97,99,114,114,32,58,105,108,32,110,111,111,58,101,99,116,97,115,58,116,97,71,58,105,65,97,110,99,115,100,108,97,60,115,119,58,109,110,116,32,62,62,32,99,116,101,111,95,0,100,105,99,115,101,65,58,105,105,42,97,115,58,111,111,108,32,110,110,58,109,111,62,58,110,105,97,60,58,109,0,100,84,60,115,116,95,112,97,60,115,119,58,116,115,97,42,97,115,58,116,97,71,58,105,65,97,110,99,115,100,108,97,60,115,119,58,109,110,116,32 +}; diff --git a/btgui/Gwen/Renderers/GDIPlus.h b/btgui/Gwen/Renderers/GDIPlus.h new file mode 100644 index 000000000..1e5f7fa33 --- /dev/null +++ b/btgui/Gwen/Renderers/GDIPlus.h @@ -0,0 +1,95 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#ifndef GWEN_RENDERERS_GDIPLUS_H +#define GWEN_RENDERERS_GDIPLUS_H + +#include "Gwen/Gwen.h" +#include "Gwen/BaseRender.h" + + +/* + + GDI(plus) is pretty slow for rendering GWEN, because we're + re-rendering everything on redraw. + + Therefore its usage should be as a test - rather than production. + + // Note: For this to work you should be including + + #include + + // Which we don't do in the header, for the sake of usability + +*/ + +namespace Gwen +{ + namespace Renderer + { + + class GDIPlus : public Gwen::Renderer::Base + { + public: + + GDIPlus( HWND pHWND ); + ~GDIPlus(); + + virtual void Begin(); + virtual void End(); + + virtual void SetDrawColor(Gwen::Color color); + + virtual void DrawLine( int x, int y, int a, int b ); + virtual void DrawFilledRect( Gwen::Rect rect ); + + virtual void LoadFont( Gwen::Font* pFont ); + virtual void FreeFont( Gwen::Font* pFont ); + virtual void RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::UnicodeString& text ); + virtual Gwen::Point MeasureText( Gwen::Font* pFont, const Gwen::UnicodeString& text ); + + void StartClip(); + void EndClip(); + + void DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect pTargetRect, float u1=0.0f, float v1=0.0f, float u2=1.0f, float v2=1.0f ); + void LoadTexture( Gwen::Texture* pTexture ); + void FreeTexture( Gwen::Texture* pTexture ); + + protected: + + int m_iWidth; + int m_iHeight; + + Gdiplus::Color m_Colour; + + HWND m_HWND; + HDC m_hDC; + ULONG_PTR m_gdiplusToken; + + Gdiplus::Graphics* graphics; + }; + + class GDIPlusBuffered : public GDIPlus + { + public: + + GDIPlusBuffered( HWND pHWND ); + ~GDIPlusBuffered(); + + virtual void Begin(); + virtual void End(); + + private: + + void CreateBackbuffer(); + void DestroyBackbuffer(); + + Gdiplus::Bitmap* m_Bitmap; + + }; + } +} +#endif diff --git a/btgui/Gwen/Renderers/OpenGL.h b/btgui/Gwen/Renderers/OpenGL.h new file mode 100644 index 000000000..e0a611c2f --- /dev/null +++ b/btgui/Gwen/Renderers/OpenGL.h @@ -0,0 +1,60 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#ifndef GWEN_RENDERERS_OPENGL_H +#define GWEN_RENDERERS_OPENGL_H + +#include "Gwen/Gwen.h" +#include "Gwen/BaseRender.h" + +namespace Gwen +{ + namespace Renderer + { + + class OpenGL : public Gwen::Renderer::Base + { + public: + + struct Vertex + { + float x, y, z; + float u, v; + unsigned char r, g, b, a; + }; + + OpenGL(); + ~OpenGL(); + + virtual void Begin(); + virtual void End(); + + virtual void SetDrawColor( Gwen::Color color ); + virtual void DrawFilledRect( Gwen::Rect rect ); + + void StartClip(); + void EndClip(); + + void DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect pTargetRect, float u1=0.0f, float v1=0.0f, float u2=1.0f, float v2=1.0f ); + void LoadTexture( Gwen::Texture* pTexture ); + void FreeTexture( Gwen::Texture* pTexture ); + + protected: + + static const int MaxVerts = 1024; + + + void Flush(); + void AddVert( int x, int y, float u = 0.0f , float v = 0.0f ); + + Gwen::Color m_Color; + int m_iVertNum; + Vertex m_Vertices[ MaxVerts ]; + }; + + } +} +#endif diff --git a/btgui/Gwen/Renderers/OpenGL_DebugFont.h b/btgui/Gwen/Renderers/OpenGL_DebugFont.h new file mode 100644 index 000000000..4fd995892 --- /dev/null +++ b/btgui/Gwen/Renderers/OpenGL_DebugFont.h @@ -0,0 +1,72 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#ifndef GWEN_RENDERERS_OPENGL_DEBUGFONT_H +#define GWEN_RENDERERS_OPENGL_DEBUGFONT_H + +#include "Gwen/Gwen.h" +#include "Gwen/Renderers/OpenGL.h" + +void restoreOpenGLState(); +void saveOpenGLState(int screenWidth, int screenHeight); + + +namespace Gwen +{ + namespace Renderer + { + + class OpenGL_DebugFont : public Gwen::Renderer::Base + { + public: + + struct Vertex + { + float x, y, z; + float u, v; + unsigned char r, g, b, a; + }; + + + static const int MaxVerts = 1024; + + OpenGL_DebugFont(); + ~OpenGL_DebugFont(); + + void RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::UnicodeString& text ); + Gwen::Point MeasureText( Gwen::Font* pFont, const Gwen::UnicodeString& text ); + + virtual void Begin(); + virtual void End(); + + virtual void SetDrawColor( Gwen::Color color ); + virtual void DrawFilledRect( Gwen::Rect rect ); + void DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect rect, float u1, float v1, float u2, float v2 ); + + + void StartClip(); + void EndClip(); + + void Flush(); + void AddVert( int x, int y, float u = 0.0f , float v = 0.0f ); + + + protected: + + Gwen::Texture* m_pFontTexture; + float m_fFontScale[2]; + float m_fLetterSpacing; + + + Gwen::Color m_Color; + int m_iVertNum; + Vertex m_Vertices[ MaxVerts ]; + + }; + + } +} +#endif diff --git a/btgui/Gwen/Renderers/SFML.h b/btgui/Gwen/Renderers/SFML.h new file mode 100644 index 000000000..9583cde90 --- /dev/null +++ b/btgui/Gwen/Renderers/SFML.h @@ -0,0 +1,51 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_RENDERERS_SFML_H +#define GWEN_RENDERERS_SFML_H +#include "Gwen/Gwen.h" +#include "Gwen/BaseRender.h" +#include + +namespace Gwen +{ + namespace Renderer + { + + class SFML : public Gwen::Renderer::Base + { + public: + + SFML( sf::RenderTarget& target ); + ~SFML(); + + virtual void SetDrawColor(Gwen::Color color); + + virtual void DrawLine( int x, int y, int a, int b ); + virtual void DrawFilledRect( Gwen::Rect rect ); + + virtual void LoadFont( Gwen::Font* pFont ); + virtual void FreeFont( Gwen::Font* pFont ); + virtual void RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::UnicodeString& text ); + virtual Gwen::Point MeasureText( Gwen::Font* pFont, const Gwen::UnicodeString& text ); + + void StartClip(); + void EndClip(); + + void DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect pTargetRect, float u1=0.0f, float v1=0.0f, float u2=1.0f, float v2=1.0f ); + void LoadTexture( Gwen::Texture* pTexture ); + void FreeTexture( Gwen::Texture* pTexture ); + + protected: + + sf::RenderTarget& m_Target; + sf::Color m_Color; + + }; + } +} +#endif diff --git a/btgui/Gwen/Skin.cpp b/btgui/Gwen/Skin.cpp new file mode 100644 index 000000000..700521336 --- /dev/null +++ b/btgui/Gwen/Skin.cpp @@ -0,0 +1,85 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Gwen.h" +#include + +namespace Gwen +{ + namespace Skin + { + /* + + Here we're drawing a few symbols such as the directional arrows and the checkbox check + + Texture'd skins don't generally use these - but the Simple skin does. We did originally + use the marlett font to draw these.. but since that's a Windows font it wasn't a very + good cross platform solution. + + */ + + void Base::DrawArrowDown( Gwen::Rect rect ) + { + float x = (rect.w / 5.0f); + float y = (rect.h / 5.0f); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*0.0f, rect.y + y*1.0f, x, y*1.0f ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*1.0f, x, y*2.0f ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*2.0f, rect.y + y*1.0f, x, y*3.0f ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*3.0f, rect.y + y*1.0f, x, y*2.0f ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*4.0f, rect.y + y*1.0f, x, y*1.0f ) ); + } + + void Base::DrawArrowUp( Gwen::Rect rect ) + { + float x = (rect.w / 5.0f); + float y = (rect.h / 5.0f); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*0.0f, rect.y + y*3.0f, x, y*1.0f ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*2.0f, x, y*2.0f ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*2.0f, rect.y + y*1.0f, x, y*3.0f ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*3.0f, rect.y + y*2.0f, x, y*2.0f ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*4.0f, rect.y + y*3.0f, x, y*1.0f ) ); + } + + void Base::DrawArrowLeft( Gwen::Rect rect ) + { + float x = (rect.w / 5.0f); + float y = (rect.h / 5.0f); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*3.0f, rect.y + y*0.0f, x*1.0f, y ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*2.0f, rect.y + y*1.0f, x*2.0f, y ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*2.0f, x*3.0f, y ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*2.0f, rect.y + y*3.0f, x*2.0f, y ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*3.0f, rect.y + y*4.0f, x*1.0f, y ) ); + } + + void Base::DrawArrowRight( Gwen::Rect rect ) + { + float x = (rect.w / 5.0f); + float y = (rect.h / 5.0f); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*0.0f, x*1.0f, y ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*1.0f, x*2.0f, y ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*2.0f, x*3.0f, y ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*3.0f, x*2.0f, y ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*4.0f, x*1.0f, y ) ); + } + + void Base::DrawCheck( Gwen::Rect rect ) + { + float x = (rect.w / 5.0f); + float y = (rect.h / 5.0f); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*0.0f, rect.y + y*3.0f, x*2, y*2 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*1.0f, rect.y + y*4.0f, x*2, y*2 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*2.0f, rect.y + y*3.0f, x*2, y*2 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*3.0f, rect.y + y*1.0f, x*2, y*2 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + x*4.0f, rect.y + y*0.0f, x*2, y*2 ) ); + } + } +} diff --git a/btgui/Gwen/Skin.h b/btgui/Gwen/Skin.h new file mode 100644 index 000000000..4dfc8cecf --- /dev/null +++ b/btgui/Gwen/Skin.h @@ -0,0 +1,138 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_SKIN_H +#define GWEN_SKIN_H + +#include "Gwen/BaseRender.h" +#include "Gwen/Font.h" + +namespace Gwen +{ + namespace Controls + { + class Base; + } + + namespace Skin + { + namespace Symbol + { + const unsigned char None = 0; + const unsigned char ArrowRight = 1; + const unsigned char Check = 2; + const unsigned char Dot = 3; + } + + class GWEN_EXPORT Base + { + public: + + Base() + { + m_DefaultFont.facename = L"Arial"; + m_DefaultFont.size = 10.0f; + m_Render = NULL; + } + + virtual ~Base() + { + ReleaseFont( &m_DefaultFont ); + } + + virtual void ReleaseFont( Gwen::Font* fnt ) + { + if ( !fnt ) return; + if ( !m_Render ) return; + + m_Render->FreeFont( fnt ); + } + + virtual void DrawButton( Controls::Base* control, bool bDepressed, bool bHovered ) = 0; + virtual void DrawTabButton( Controls::Base* control, bool bActive ) = 0; + virtual void DrawTabControl( Controls::Base* control, Gwen::Rect CurrentButtonRect ) = 0; + virtual void DrawTabTitleBar( Controls::Base* control ) = 0; + + virtual void DrawMenuItem( Controls::Base* control, bool bSubmenuOpen, bool bChecked ) = 0; + virtual void DrawMenuStrip( Controls::Base* control ) = 0; + virtual void DrawMenu( Controls::Base* control, bool bPaddingDisabled ) = 0; + virtual void DrawRadioButton(Controls::Base* control, bool bSelected, bool bDepressed) = 0; + virtual void DrawCheckBox( Controls::Base* control, bool bSelected, bool bDepressed ) = 0; + virtual void DrawGroupBox( Controls::Base* control, int textStart, int textHeight, int textWidth ) = 0; + virtual void DrawTextBox( Controls::Base* control ) = 0; + virtual void DrawWindow( Controls::Base* control, int topHeight, bool inFocus ) = 0; + virtual void DrawHighlight( Controls::Base* control ) = 0; + virtual void DrawBackground( Controls::Base* control ) = 0; + virtual void DrawStatusBar( Controls::Base* control ) = 0; + + virtual void DrawShadow( Controls::Base* control ) = 0; + virtual void DrawScrollBarBar( Controls::Base* control, bool bDepressed, bool isHovered, bool isHorizontal ) = 0; + virtual void DrawScrollBar( Controls::Base* control, bool isHorizontal, bool bDepressed ) = 0; + virtual void DrawScrollButton( Controls::Base* control, int iDirection, bool bDepressed ) = 0; + virtual void DrawProgressBar( Controls::Base* control, bool isHorizontal, float progress) = 0; + + virtual void DrawListBox( Controls::Base* control ) = 0; + virtual void DrawListBoxLine( Controls::Base* control, bool bSelected ) = 0; + + virtual void DrawSlider( Controls::Base* control, bool bIsHorizontal, int numNotches, int barSize) = 0; + virtual void DrawComboBox( Controls::Base* control ) = 0; + virtual void DrawComboBoxButton( Controls::Base* control, bool bDepressed ) = 0; + virtual void DrawKeyboardHighlight( Controls::Base* control, const Gwen::Rect& rect, int offset ) = 0; + //virtual void DrawComboBoxKeyboardHighlight( Controls::Base* control ); + virtual void DrawToolTip( Controls::Base* control ) = 0; + + virtual void DrawNumericUpDownButton( Controls::Base* control, bool bDepressed, bool bUp ) = 0; + + virtual void DrawTreeButton( Controls::Base* control, bool bOpen ) = 0; + virtual void DrawTreeControl( Controls::Base* control ) = 0; + virtual void DrawTreeNode( Controls::Base* ctrl, bool bOpen, bool bSelected, int iLabelHeight, int iLabelWidth, int iHalfWay, int iLastBranch, bool bIsRoot ) = 0; + + virtual void DrawPropertyRow( Controls::Base* control, int iWidth, bool bBeingEdited ) = 0; + virtual void DrawPropertyTreeNode( Controls::Base* control, int BorderLeft, int BorderTop ) = 0; + virtual void DrawColorDisplay( Controls::Base* control, Gwen::Color color ) = 0; + virtual void DrawModalControl( Controls::Base* control ) = 0; + virtual void DrawMenuDivider( Controls::Base* control ) = 0; + + + virtual void SetRender( Gwen::Renderer::Base* renderer ) + { + m_Render = renderer; + } + virtual Gwen::Renderer::Base* GetRender() + { + return m_Render; + } + + virtual void DrawArrowDown( Gwen::Rect rect ); + virtual void DrawArrowUp( Gwen::Rect rect ); + virtual void DrawArrowLeft( Gwen::Rect rect ); + virtual void DrawArrowRight( Gwen::Rect rect ); + virtual void DrawCheck( Gwen::Rect rect ); + + + public: + + virtual Gwen::Font* GetDefaultFont() + { + return &m_DefaultFont; + } + + virtual void SetDefaultFont( const Gwen::UnicodeString& strFacename, float fSize = 10.0f ) + { + m_DefaultFont.facename = strFacename; + m_DefaultFont.size = fSize; + } + + protected: + + Gwen::Font m_DefaultFont; + Gwen::Renderer::Base* m_Render; + + }; + }; +} +#endif diff --git a/btgui/Gwen/Skins/Simple.h b/btgui/Gwen/Skins/Simple.h new file mode 100644 index 000000000..a77a386df --- /dev/null +++ b/btgui/Gwen/Skins/Simple.h @@ -0,0 +1,750 @@ +#pragma once +#ifndef GWEN_SKINS_SIMPLE_H +#define GWEN_SKINS_SIMPLE_H + +#include "Gwen/Skin.h" +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" + +namespace Gwen +{ + namespace Skin + { + class Simple : public Gwen::Skin::Base + { + public: + + Gwen::Color m_colBorderColor; + Gwen::Color m_colControlOutlineLight; + Gwen::Color m_colControlOutlineLighter; + Gwen::Color m_colBG; + Gwen::Color m_colBGDark; + Gwen::Color m_colControl; + Gwen::Color m_colControlBorderHighlight; + Gwen::Color m_colControlDarker; + Gwen::Color m_colControlOutlineNormal; + Gwen::Color m_colControlBright; + Gwen::Color m_colControlDark; + Gwen::Color m_colHighlightBG; + Gwen::Color m_colHighlightBorder; + Gwen::Color m_colToolTipBackground; + Gwen::Color m_colToolTipBorder; + Gwen::Color m_colModal; + + Simple() + { + m_colBorderColor = Gwen::Color( 80, 80, 80, 255 ); + m_colBG = Gwen::Color( 248, 248, 248, 255 ); + m_colBGDark = Gwen::Color( 235, 235, 235, 255 ); + + m_colControl = Gwen::Color( 240, 240, 240, 255 ); + m_colControlBright = Gwen::Color( 255, 255, 255, 255 ); + m_colControlDark = Gwen::Color( 214, 214, 214, 255 ); + m_colControlDarker = Gwen::Color( 180, 180, 180, 255 ); + + m_colControlOutlineNormal = Gwen::Color( 112, 112, 112, 255 ); + m_colControlOutlineLight = Gwen::Color( 144, 144, 144, 255 ); + m_colControlOutlineLighter = Gwen::Color( 210, 210, 210, 255 ); + + m_colHighlightBG = Gwen::Color( 192, 221, 252, 255 ); + m_colHighlightBorder = Gwen::Color( 51, 153, 255, 255 ); + + m_colToolTipBackground = Gwen::Color( 255, 255, 225, 255 ); + m_colToolTipBorder = Gwen::Color( 0, 0, 0, 255 ); + + m_colModal = Gwen::Color( 25, 25, 25, 150 ); + + m_DefaultFont.facename = L"Microsoft Sans Serif"; + m_DefaultFont.size = 11; + } + + + virtual void DrawButton( Gwen::Controls::Base* control, bool bDepressed, bool bHovered ) + { + int w = control->Width(); + int h = control->Height(); + + DrawButton( w, h, bDepressed, bHovered ); + } + + virtual void DrawMenuItem( Gwen::Controls::Base* control, bool bSubmenuOpen, bool bChecked ) + { + if ( bSubmenuOpen || control->IsHovered() ) + { + m_Render->SetDrawColor( m_colHighlightBG ); + m_Render->DrawFilledRect( control->GetRenderBounds() ); + + m_Render->SetDrawColor( m_colHighlightBorder ); + m_Render->DrawLinedRect( control->GetRenderBounds() ); + } + + Gwen::Rect rect = control->GetRenderBounds(); + if ( bChecked ) + { + m_Render->SetDrawColor( Color( 0, 0, 0, 255) ); + + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + DrawCheck( r ); + } + } + + virtual void DrawMenuStrip( Gwen::Controls::Base* control ) + { + int w = control->Width(); + int h = control->Height(); + + m_Render->SetDrawColor( Gwen::Color( 246, 248, 252, 255 ) ); + m_Render->DrawFilledRect( Gwen::Rect( 0, 0, w, h ) ); + + m_Render->SetDrawColor( Gwen::Color( 218, 224, 241, 150 ) ); + + m_Render->DrawFilledRect( Gwen::Rect( 0, h*0.4f, w, h*0.6f ) ); + m_Render->DrawFilledRect( Gwen::Rect( 0, h*0.5f, w, h*0.5f ) ); + + } + + virtual void DrawMenu( Gwen::Controls::Base* control, bool bPaddingDisabled ) + { + int w = control->Width(); + int h = control->Height(); + + m_Render->SetDrawColor( m_colControlBright ); + m_Render->DrawFilledRect( Gwen::Rect( 0, 0, w, h ) ); + + if ( !bPaddingDisabled ) + { + m_Render->SetDrawColor( m_colControl ); + m_Render->DrawFilledRect( Gwen::Rect( 1, 0, 22, h ) ); + } + + m_Render->SetDrawColor( m_colControlOutlineNormal ); + m_Render->DrawLinedRect( Gwen::Rect( 0, 0, w, h ) ); + } + + virtual void DrawShadow( Gwen::Controls::Base* control ) + { + int w = control->Width(); + int h = control->Height(); + + int x = 4; + int y = 6; + + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 10 ) ); + + m_Render->DrawFilledRect( Gwen::Rect( x, y, w, h ) ); + x+=2; + m_Render->DrawFilledRect( Gwen::Rect( x, y, w, h ) ); + y+=2; + m_Render->DrawFilledRect( Gwen::Rect( x, y, w, h ) ); + + } + + virtual void DrawButton( int w, int h, bool bDepressed, bool bHovered, bool bSquared = false ) + { + if ( bDepressed ) m_Render->SetDrawColor( m_colControlDark ); + else if ( bHovered )m_Render->SetDrawColor( m_colControlBright ); + else m_Render->SetDrawColor( m_colControl ); + + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, w-2, h-2 ) ); + + if ( bDepressed ) m_Render->SetDrawColor( m_colControlDark ); + else if ( bHovered )m_Render->SetDrawColor( m_colControl ); + else m_Render->SetDrawColor( m_colControlDark ); + + m_Render->DrawFilledRect( Gwen::Rect( 1, h*0.5, w-2, h*0.5-2 ) ); + + if ( !bDepressed ) + { + m_Render->SetDrawColor( m_colControlBright ); + m_Render->DrawShavedCornerRect( Gwen::Rect( 1, 1, w-2, h-2 ), bSquared ); + } + else + { + m_Render->SetDrawColor( m_colControlDarker ); + m_Render->DrawShavedCornerRect( Gwen::Rect( 1, 1, w-2, h-2 ), bSquared ); + } + + // Border + m_Render->SetDrawColor( m_colControlOutlineNormal ); + m_Render->DrawShavedCornerRect( Gwen::Rect( 0, 0, w, h ), bSquared ); + } + + virtual void DrawRadioButton( Gwen::Controls::Base* control, bool bSelected, bool bDepressed) + { + Gwen::Rect rect = control->GetRenderBounds(); + + // Inside colour + if ( control->IsHovered() ) m_Render->SetDrawColor( Gwen::Color( 220, 242, 254, 255 ) ); + else m_Render->SetDrawColor( m_colControlBright ); + + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-2 ) ); + + // Border + if ( control->IsHovered() ) m_Render->SetDrawColor( Gwen::Color( 85, 130, 164, 255 ) ); + else m_Render->SetDrawColor( m_colControlOutlineLight ); + + m_Render->DrawShavedCornerRect( rect ); + + m_Render->SetDrawColor( Gwen::Color( 0, 50, 60, 15 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, rect.w-4, rect.h-4 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, rect.w*0.3f, rect.h-4 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, rect.w-4, rect.h*0.3f ) ); + + if ( control->IsHovered() ) m_Render->SetDrawColor( Gwen::Color( 121, 198, 249, 255 ) ); + else m_Render->SetDrawColor( Gwen::Color( 0, 50, 60, 50 ) ); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+3, 1, rect.h-5 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+3, rect.y+2, rect.w-5, 1 ) ); + + + if ( bSelected ) + { + m_Render->SetDrawColor( Gwen::Color( 40, 230, 30, 255 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, rect.w -4, rect.h-4 ) ); + } + } + + + virtual void DrawCheckBox( Gwen::Controls::Base* control, bool bSelected, bool bDepressed) + { + Gwen::Rect rect = control->GetRenderBounds(); + + // Inside colour + if ( control->IsHovered() ) m_Render->SetDrawColor( Gwen::Color( 220, 242, 254, 255 ) ); + else m_Render->SetDrawColor( m_colControlBright ); + + m_Render->DrawFilledRect( rect ); + + // Border + if ( control->IsHovered() ) m_Render->SetDrawColor( Gwen::Color( 85, 130, 164, 255 ) ); + else m_Render->SetDrawColor( m_colControlOutlineLight ); + + m_Render->DrawLinedRect( rect ); + + m_Render->SetDrawColor( Gwen::Color( 0, 50, 60, 15 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, rect.w-4, rect.h-4 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, rect.w*0.3f, rect.h-4 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, rect.w-4, rect.h*0.3f ) ); + + if ( control->IsHovered() ) m_Render->SetDrawColor( Gwen::Color( 121, 198, 249, 255 ) ); + else m_Render->SetDrawColor( Gwen::Color( 0, 50, 60, 50 ) ); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, 1, rect.h-4 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+2, rect.y+2, rect.w-4, 1 ) ); + + + + if ( bDepressed ) + { + m_Render->SetDrawColor( Color( 100, 100, 100, 255) ); + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + DrawCheck( r ); + } + else if ( bSelected ) + { + m_Render->SetDrawColor( Color( 0, 0, 0, 255) ); + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + DrawCheck( r ); + } + } + + virtual void DrawGroupBox( Gwen::Controls::Base* control, int textStart, int textHeight, int textWidth ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + rect.y += textHeight * 0.5f; + rect.h -= textHeight * 0.5f; + + Gwen::Color m_colDarker = Gwen::Color( 0, 50, 60, 50 ); + Gwen::Color m_colLighter = Gwen::Color( 255, 255, 255, 150 ); + + m_Render->SetDrawColor( m_colLighter ); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y+1, textStart-3, 1 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1+textStart+textWidth, rect.y+1, rect.w-textStart+textWidth-2, 1 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, (rect.y + rect.h)-1, rect.w-2, 1 ) ); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y+1, 1, rect.h ) ); + m_Render->DrawFilledRect( Gwen::Rect( (rect.x + rect.w)-2, rect.y+1, 1, rect.h-1 ) ); + + m_Render->SetDrawColor( m_colDarker ); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y, textStart-3, 1 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1+textStart+textWidth, rect.y, rect.w-textStart-textWidth-2, 1 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, (rect.y + rect.h) -1, rect.w-2, 1 ) ); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x, rect.y+1, 1, rect.h-1 ) ); + m_Render->DrawFilledRect( Gwen::Rect( (rect.x + rect.w)-1, rect.y+1, 1, rect.h-1 ) ); + } + + virtual void DrawTextBox( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + bool bHasFocus = control->HasFocus(); + + // Box inside + m_Render->SetDrawColor( Gwen::Color( 255, 255, 255, 255 ) ); + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-2 ) ); + + m_Render->SetDrawColor( m_colControlOutlineLight ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y, rect.w-2, 1 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x, rect.y+1, 1, rect.h-2 ) ); + + m_Render->SetDrawColor( m_colControlOutlineLighter ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, (rect.y + rect.h)-1, rect.w-2, 1 ) ); + m_Render->DrawFilledRect( Gwen::Rect( (rect.x + rect.w)-1, rect.y+1, 1, rect.h-2 ) ); + + if ( bHasFocus ) + { + m_Render->SetDrawColor( Gwen::Color( 50, 200, 255, 150 ) ); + m_Render->DrawLinedRect( rect ); + } + } + + virtual void DrawTabButton( Gwen::Controls::Base* control, bool bActive ) + { + Gwen::Rect rect = control->GetRenderBounds(); + bool bHovered = control->IsHovered(); + + if ( bActive ) + { + m_Render->SetDrawColor( m_colControl ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y+1, rect.w-2, rect.h-1 ) ); + } + else + { + if ( bHovered )m_Render->SetDrawColor( m_colControlBright ); + else m_Render->SetDrawColor( m_colControl ); + + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-1 ) ); + + if ( bHovered )m_Render->SetDrawColor( m_colControl ); + else m_Render->SetDrawColor( m_colControlDark ); + + m_Render->DrawFilledRect( Gwen::Rect( 1, rect.h*0.5, rect.w-2, rect.h*0.5-1 ) ); + + m_Render->SetDrawColor( m_colControlBright ); + m_Render->DrawShavedCornerRect( Gwen::Rect( 1, 1, rect.w-2, rect.h ) ); + } + + m_Render->SetDrawColor( m_colBorderColor ); + + m_Render->DrawShavedCornerRect( Gwen::Rect( 0, 0, rect.w, rect.h ) ); + } + + virtual void DrawTabControl( Gwen::Controls::Base* control, Gwen::Rect CurrentButtonRect ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + m_Render->SetDrawColor( m_colControl ); + m_Render->DrawFilledRect( rect ); + + m_Render->SetDrawColor( m_colBorderColor ); + m_Render->DrawLinedRect( rect ); + + m_Render->SetDrawColor( m_colControl ); + m_Render->DrawFilledRect( CurrentButtonRect ); + } + + virtual void DrawWindow( Gwen::Controls::Base* control, int topHeight, bool inFocus ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + // Titlebar + if ( inFocus ) + m_Render->SetDrawColor( Gwen::Color( 87, 164, 232, 230 ) ); + else + m_Render->SetDrawColor( Gwen::Color( 87*0.70, 164*0.70, 232*0.70, 230 ) ); + + int iBorderSize = 5; + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y+1, rect.w-2, topHeight-1 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y+topHeight-1, iBorderSize, rect.h-2-topHeight ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+rect.w-iBorderSize, rect.y+topHeight-1, iBorderSize, rect.h-2-topHeight ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y+rect.h-iBorderSize, rect.w-2, iBorderSize ) ); + + // Main inner + m_Render->SetDrawColor( Gwen::Color( m_colControlDark.r, m_colControlDark.g, m_colControlDark.b, 230 ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x+iBorderSize+1, rect.y+topHeight, rect.w-iBorderSize*2-2, rect.h-topHeight-iBorderSize-1 ) ); + + // Light inner border + m_Render->SetDrawColor( Gwen::Color( 255, 255, 255, 100 ) ); + m_Render->DrawShavedCornerRect( Gwen::Rect( rect.x+1, rect.y+1, rect.w-2, rect.h-2 ) ); + + // Dark line between titlebar and main + m_Render->SetDrawColor( m_colBorderColor ); + + // Inside border + m_Render->SetDrawColor( m_colControlOutlineNormal ); + m_Render->DrawLinedRect( Gwen::Rect( rect.x+iBorderSize, rect.y+topHeight-1, rect.w - 10, rect.h - topHeight - (iBorderSize - 1) ) ); + + // Dark outer border + m_Render->SetDrawColor( m_colBorderColor ); + m_Render->DrawShavedCornerRect( Gwen::Rect( rect.x, rect.y, rect.w, rect.h ) ); + } + + virtual void DrawHighlight( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + m_Render->SetDrawColor( Gwen::Color( 255, 100, 255, 255 ) ); + m_Render->DrawFilledRect( rect ); + } + + virtual void DrawScrollBar( Gwen::Controls::Base* control, bool isHorizontal, bool bDepressed ) + { + Gwen::Rect rect = control->GetRenderBounds(); + if (bDepressed) + m_Render->SetDrawColor( m_colControlDarker ); + else + m_Render->SetDrawColor( m_colControlBright ); + m_Render->DrawFilledRect( rect ); + } + + virtual void DrawScrollBarBar( Controls::Base* control, bool bDepressed, bool isHovered, bool isHorizontal ) + { + //TODO: something specialized + DrawButton( control, bDepressed, isHovered ); + } + + virtual void DrawTabTitleBar( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + m_Render->SetDrawColor( Gwen::Color( 177, 193, 214, 255 ) ); + m_Render->DrawFilledRect( rect ); + + m_Render->SetDrawColor( m_colBorderColor ); + rect.h += 1; + m_Render->DrawLinedRect( rect ); + } + + virtual void DrawProgressBar( Gwen::Controls::Base* control, bool isHorizontal, float progress) + { + Gwen::Rect rect = control->GetRenderBounds(); + Gwen::Color FillColour( 0, 211, 40, 255 ); + + if ( isHorizontal ) + { + //Background + m_Render->SetDrawColor( m_colControlDark ); + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-2 ) ); + + //Right half + m_Render->SetDrawColor( FillColour ); + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, rect.w*progress-2, rect.h-2 ) ); + + m_Render->SetDrawColor( Gwen::Color( 255, 255, 255, 150 ) ); + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h*0.45f ) ); + } + else + { + //Background + m_Render->SetDrawColor( m_colControlDark ); + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-2 ) ); + + //Top half + m_Render->SetDrawColor( FillColour ); + m_Render->DrawFilledRect( Gwen::Rect( 1, 1 + (rect.h * (1 - progress)), rect.w-2, rect.h * progress - 2 ) ); + + m_Render->SetDrawColor( Gwen::Color( 255, 255, 255, 150 ) ); + m_Render->DrawFilledRect( Gwen::Rect( 1, 1, rect.w*0.45f, rect.h-2 ) ); + } + + m_Render->SetDrawColor( Gwen::Color( 255, 255, 255, 150 ) ); + m_Render->DrawShavedCornerRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-2 ) ); + + m_Render->SetDrawColor( Gwen::Color( 255, 255, 255, 70 ) ); + m_Render->DrawShavedCornerRect( Gwen::Rect( 2, 2, rect.w-4, rect.h-4 ) ); + + m_Render->SetDrawColor( m_colBorderColor ); + m_Render->DrawShavedCornerRect( rect ); + } + + virtual void DrawListBox( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + m_Render->SetDrawColor( m_colControlBright ); + m_Render->DrawFilledRect( rect ); + + m_Render->SetDrawColor( m_colBorderColor ); + m_Render->DrawLinedRect( rect ); + } + + virtual void DrawListBoxLine( Gwen::Controls::Base* control, bool bSelected ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + if ( bSelected ) + { + m_Render->SetDrawColor( m_colHighlightBorder ); + m_Render->DrawFilledRect( rect ); + } + else if ( control->IsHovered() ) + { + m_Render->SetDrawColor( m_colHighlightBG ); + m_Render->DrawFilledRect( rect ); + } + } + + + virtual void DrawSlider( Gwen::Controls::Base* control, bool bIsHorizontal, int numNotches, int barSize) + { + Gwen::Rect rect = control->GetRenderBounds(); + Gwen::Rect notchRect = rect; + + if ( bIsHorizontal ) + { + rect.y += rect.h * 0.4; + rect.h -= rect.h * 0.8; + } + else + { + rect.x += rect.w * 0.4; + rect.w -= rect.w * 0.8; + } + + m_Render->SetDrawColor( m_colBGDark ); + m_Render->DrawFilledRect( rect ); + + m_Render->SetDrawColor( m_colControlDarker ); + m_Render->DrawLinedRect( rect ); + } + + virtual void DrawComboBox( Gwen::Controls::Base* control ) + { + DrawTextBox( control ); + } + + + virtual void DrawBackground( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + m_Render->SetDrawColor( m_colBGDark ); + m_Render->DrawFilledRect( rect ); + m_Render->SetDrawColor( m_colControlDarker); + m_Render->DrawLinedRect( rect ); + } + + virtual void DrawKeyboardHighlight( Gwen::Controls::Base* control, const Gwen::Rect& r, int iOffset ) + { + Gwen::Rect rect = r; + + rect.x += iOffset; + rect.y += iOffset; + rect.w -= iOffset*2; + rect.h -= iOffset*2; + + //draw the top and bottom + bool skip = true; + for(int i=0; i< rect.w*0.5; i++) + { + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + if (!skip) + { + m_Render->DrawPixel(rect.x + (i*2), rect.y); + m_Render->DrawPixel(rect.x + (i*2), rect.y+rect.h-1); + } + else + skip = !skip; + } + skip = false; + for(int i=0; i< rect.h*0.5; i++) + { + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + if (!skip) + { + m_Render->DrawPixel(rect.x , rect.y +i*2); + m_Render->DrawPixel(rect.x +rect.w-1, rect.y +i*2 ); + } + else + skip = !skip; + } + } + + virtual void DrawToolTip( Gwen::Controls::Base* control ) + { + Gwen::Rect rct = control->GetRenderBounds(); + rct.x -= 3; + rct.y -= 3; + rct.w += 6; + rct.h += 6; + + m_Render->SetDrawColor( m_colToolTipBackground ); + m_Render->DrawFilledRect( rct ); + + m_Render->SetDrawColor( m_colToolTipBorder ); + m_Render->DrawLinedRect( rct ); + } + + virtual void DrawScrollButton( Gwen::Controls::Base* control, int iDirection, bool bDepressed ) + { + DrawButton( control, bDepressed, false ); + + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 240 ) ); + + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + + if ( iDirection == Gwen::Pos::Top ) DrawArrowUp( r ); + else if ( iDirection == Gwen::Pos::Bottom ) DrawArrowDown( r ); + else if ( iDirection == Gwen::Pos::Left ) DrawArrowLeft( r ); + else DrawArrowRight( r ); + } + + virtual void DrawComboBoxButton( Gwen::Controls::Base* control, bool bDepressed ) + { + //DrawButton( control->Width(), control->Height(), bDepressed, false, true ); + + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 240 ) ); + + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + DrawArrowDown( r ); + } + + virtual void DrawNumericUpDownButton( Gwen::Controls::Base* control, bool bDepressed, bool bUp ) + { + //DrawButton( control->Width(), control->Height(), bDepressed, false, true ); + + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 240 ) ); + + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + + if ( bUp ) DrawArrowUp( r ); + else DrawArrowDown( r ); + + } + + virtual void DrawTreeButton( Controls::Base* control, bool bOpen ) + { + Gwen::Rect rect = control->GetRenderBounds(); + rect.x += 2; + rect.y += 2; + rect.w -= 4; + rect.h -= 4; + + m_Render->SetDrawColor( m_colControlBright ); + m_Render->DrawFilledRect( rect ); + + m_Render->SetDrawColor( m_colBorderColor ); + m_Render->DrawLinedRect( rect ); + + m_Render->SetDrawColor( m_colBorderColor ); + + if ( !bOpen ) // ! because the button shows intention, not the current state + m_Render->DrawFilledRect( Gwen::Rect( rect.x + rect.w/2, rect.y + 2, 1, rect.h - 4 ) ); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x +2, rect.y + rect.h/2, rect.w-4, 1 ) ); + + } + + virtual void DrawTreeControl( Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + m_Render->SetDrawColor( m_colControlBright ); + m_Render->DrawFilledRect( rect ); + + m_Render->SetDrawColor( m_colBorderColor ); + m_Render->DrawLinedRect( rect ); + } + + void DrawTreeNode( Controls::Base* ctrl, bool bOpen, bool bSelected, int iLabelHeight, int iLabelWidth, int iHalfWay, int iLastBranch, bool bIsRoot ) + { + if ( bSelected ) + { + m_Render->SetDrawColor( Color( 0, 150, 255, 100 ) ); + m_Render->DrawFilledRect( Gwen::Rect( 17, 0, iLabelWidth + 2, iLabelHeight-1 ) ); + m_Render->SetDrawColor( Color( 0, 150, 255, 200 ) ); + m_Render->DrawLinedRect( Gwen::Rect( 17, 0, iLabelWidth + 2, iLabelHeight-1 ) ); + } + + m_Render->SetDrawColor( Color( 0, 0, 0, 50 ) ); + + if ( !bIsRoot ) + m_Render->DrawFilledRect( Gwen::Rect( 9, iHalfWay, 16-9, 1 ) ); + + if ( !bOpen ) return; + + m_Render->DrawFilledRect( Gwen::Rect( 14 + 8, iLabelHeight, 1, iLastBranch + iHalfWay - iLabelHeight ) ); + } + + virtual void DrawStatusBar( Controls::Base* control ) + { + DrawBackground( control ); + } + + virtual void DrawPropertyRow( Controls::Base* control, int iWidth, bool bBeingEdited ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + + if ( bBeingEdited ) + { + m_Render->SetDrawColor( m_colHighlightBG ); + m_Render->DrawFilledRect( Gwen::Rect( 0, rect.y, iWidth, rect.h ) ); + } + + m_Render->SetDrawColor( m_colControlOutlineLighter ); + + m_Render->DrawFilledRect( Gwen::Rect( iWidth, rect.y, 1, rect.h ) ); + + rect.y += rect.h-1; + rect.h = 1; + + + m_Render->DrawFilledRect( rect ); + } + + virtual void DrawPropertyTreeNode( Controls::Base* control, int BorderLeft, int BorderTop ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + m_Render->SetDrawColor( m_colControlOutlineLighter ); + + m_Render->DrawFilledRect( Gwen::Rect( rect.x, rect.y, BorderLeft, rect.h ) ); + m_Render->DrawFilledRect( Gwen::Rect( rect.x + BorderLeft, rect.y, rect.w - BorderLeft, BorderTop ) ); + } + + void DrawColorDisplay( Controls::Base* control, Gwen::Color color ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + if ( color.a != 255 ) + { + GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 255 ) ); + GetRender()->DrawFilledRect( rect ); + + GetRender()->SetDrawColor( Gwen::Color( 128, 128, 128, 128 ) ); + + GetRender()->DrawFilledRect( Gwen::Rect( 0, 0, rect.w * 0.5, rect.h * 0.5) ); + GetRender()->DrawFilledRect( Gwen::Rect( rect.w * 0.5, rect.h * 0.5, rect.w * 0.5,rect.h * 0.5) ); + } + + GetRender()->SetDrawColor( color ); + GetRender()->DrawFilledRect( rect ); + + GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + GetRender()->DrawLinedRect( rect ); + } + + virtual void DrawModalControl( Controls::Base* control ) + { + if ( control->ShouldDrawBackground() ) + { + Gwen::Rect rect = control->GetRenderBounds(); + GetRender()->SetDrawColor( m_colModal ); + GetRender()->DrawFilledRect( rect ); + } + } + + virtual void DrawMenuDivider( Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + GetRender()->SetDrawColor( m_colBGDark ); + GetRender()->DrawFilledRect( rect ); + GetRender()->SetDrawColor( m_colControlDarker); + GetRender()->DrawLinedRect( rect ); + } + }; + } +} +#endif diff --git a/btgui/Gwen/Skins/TexturedBase.h b/btgui/Gwen/Skins/TexturedBase.h new file mode 100644 index 000000000..a342413d1 --- /dev/null +++ b/btgui/Gwen/Skins/TexturedBase.h @@ -0,0 +1,625 @@ +#pragma once +#ifndef GWEN_SKINS_TEXTUREDBASE_H +#define GWEN_SKINS_TEXTUREDBASE_H + +#include "Gwen/Skin.h" +#include "Gwen/Gwen.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/Texture.h" +#include "Gwen/Skins/Texturing.h" + +namespace Gwen +{ + namespace Skin + { + class TexturedBase : public Gwen::Skin::Base + { + public: + + Gwen::Color m_colBorderColor; + Gwen::Color m_colControlOutlineLight; + Gwen::Color m_colControlOutlineLighter; + Gwen::Color m_colBG; + Gwen::Color m_colBGDark; + Gwen::Color m_colControl; + Gwen::Color m_colControlBorderHighlight; + Gwen::Color m_colControlDarker; + Gwen::Color m_colControlOutlineNormal; + Gwen::Color m_colControlBright; + Gwen::Color m_colControlDark; + Gwen::Color m_colHighlightBG; + Gwen::Color m_colHighlightBorder; + Gwen::Color m_colToolTipBackground; + Gwen::Color m_colToolTipBorder; + Gwen::Color m_colModal; + + Texture m_Texture; + + Texturing::Bordered m_texButton; + Texturing::Bordered m_texButton_Hovered; + Texturing::Bordered m_texButton_Pressed; + + Texturing::Bordered m_texMenu_Strip, m_texMenu_Panel, m_texMenu_Panel_Border; + Texturing::Bordered m_texMenu_Hover; + Texturing::Bordered m_texShadow; + + Texturing::Bordered m_texTextBox, m_texTextBox_Focus; + + Texturing::Bordered m_texTab_Control, m_texTab, m_texTab_Inactive, m_texTab_Gap, m_texTabBar; + + Texturing::Bordered m_texWindow, m_texWindow_Inactive; + Texturing::Bordered m_texTreeBG; + + Texturing::Single m_Checkbox, m_Checkbox_Checked; + Texturing::Single m_RadioButton, m_RadioButton_Checked; + + Texturing::Single m_CheckMark; + + + Texturing::Single m_TreeMinus, m_TreePlus; + + virtual void Init( const TextObject& TextureName ) + { + m_colBorderColor = Gwen::Color( 80, 80, 80, 255 ); + m_colBG = Gwen::Color( 248, 248, 248, 255 ); + m_colBGDark = Gwen::Color( 235, 235, 235, 255 ); + + m_colControl = Gwen::Color( 240, 240, 240, 255 ); + m_colControlBright = Gwen::Color( 255, 255, 255, 255 ); + m_colControlDark = Gwen::Color( 214, 214, 214, 255 ); + m_colControlDarker = Gwen::Color( 180, 180, 180, 255 ); + + m_colControlOutlineNormal = Gwen::Color( 112, 112, 112, 255 ); + m_colControlOutlineLight = Gwen::Color( 144, 144, 144, 255 ); + m_colControlOutlineLighter = Gwen::Color( 210, 210, 210, 255 ); + + m_colHighlightBG = Gwen::Color( 192, 221, 252, 255 ); + m_colHighlightBorder = Gwen::Color( 51, 153, 255, 255 ); + + m_colToolTipBackground = Gwen::Color( 255, 255, 225, 255 ); + m_colToolTipBorder = Gwen::Color( 0, 0, 0, 255 ); + + m_colModal = Gwen::Color( 25, 25, 25, 150 ); + + m_DefaultFont.facename = L"Microsoft Sans Serif"; + m_DefaultFont.size = 11; + + m_Texture.Load( TextureName, GetRender() ); + + m_texButton.Init( &m_Texture, 194, 0, 24, 24, Margin( 8, 8, 8, 8 ) ); + m_texButton_Hovered.Init( &m_Texture, 194, 25, 24, 24, Margin( 8, 8, 8, 8 ) ); + m_texButton_Pressed.Init( &m_Texture, 194, 50, 24, 24, Margin( 8, 8, 8, 8 ) ); + + m_texMenu_Strip.Init( &m_Texture, 194, 75, 62, 21, Margin( 8, 8, 8, 8 ) ); + m_texMenu_Panel.Init( &m_Texture, 194, 130, 62, 32, Margin( 8, 8, 8, 8 ) ); + m_texMenu_Panel_Border.Init( &m_Texture, 194, 97, 62, 32, Margin( 24, 8, 8, 8 ) ); + m_texMenu_Hover.Init( &m_Texture, 219, 50, 24, 24, Margin( 8, 8, 8, 8 ) ); + + m_texShadow.Init( &m_Texture, 223, 0, 32, 32, Margin( 8, 8, 8, 8 ) ); + + m_texTextBox.Init( &m_Texture, 0, 122, 24, 24, Margin( 8, 8, 8, 8 ) ); + m_texTextBox_Focus.Init( &m_Texture, 25, 122, 24, 24, Margin( 8, 8, 8, 8 ) ); + + m_texTab.Init( &m_Texture, 0, 97, 24, 24, Margin( 8, 8, 8, 8 ) ); + m_texTab_Inactive.Init( &m_Texture, 25, 97, 24, 24, Margin( 8, 8, 8, 8 ) ); + m_texTab_Control.Init( &m_Texture, 50, 97, 24, 24, Margin( 8, 8, 8, 8 ) ); + m_texTab_Gap.Init( &m_Texture, 50+8, 97+8, 8, 8, Margin( 8, 8, 8, 8 ) ); + m_texTabBar.Init( &m_Texture, 0, 147, 74, 16, Margin( 4, 4, 4, 4 ) ); + + + m_texWindow.Init( &m_Texture, 0, 0, 96, 96, Margin( 16, 32, 16, 16 ) ); + m_texWindow_Inactive.Init( &m_Texture, 97, 0, 96, 96, Margin( 16, 32, 16, 16 ) ); + + m_Checkbox.Init( &m_Texture, 75, 97, 16, 16 ); + m_Checkbox_Checked.Init( &m_Texture, 93, 97, 16, 16 ); + + m_RadioButton.Init( &m_Texture, 110, 97, 16, 16 ); + m_RadioButton_Checked.Init( &m_Texture, 127, 97, 16, 16 ); + + + m_CheckMark.Init( &m_Texture, 145, 97, 16, 16 ); + m_TreeMinus.Init( &m_Texture, 75, 115, 11, 11 ); + m_TreePlus.Init( &m_Texture, 93, 115, 11, 11 ); + + m_texTreeBG.Init( &m_Texture, 0, 164, 49, 49, Margin( 16, 16, 16, 16 ) ); + } + + + virtual void DrawButton( Gwen::Controls::Base* control, bool bDepressed, bool bHovered ) + { + if ( bDepressed ) + m_texButton_Pressed.Draw( GetRender(), control->GetRenderBounds() ); + else + m_texButton.Draw( GetRender(), control->GetRenderBounds() ); + + if ( bHovered ) + m_texButton_Hovered.Draw( GetRender(), control->GetRenderBounds() ); + } + + virtual void DrawMenuItem( Gwen::Controls::Base* control, bool bSubmenuOpen, bool bChecked ) + { + if ( bSubmenuOpen || control->IsHovered() ) + m_texMenu_Hover.Draw( GetRender(), control->GetRenderBounds() ); + + if ( bChecked ) + m_CheckMark.Draw( GetRender(), Gwen::Rect( control->GetRenderBounds().x+2, control->GetRenderBounds().y+2, 16, 16 )); + } + + virtual void DrawMenuStrip( Gwen::Controls::Base* control ) + { + m_texMenu_Strip.Draw( GetRender(), control->GetRenderBounds() ); + } + + virtual void DrawMenu( Gwen::Controls::Base* control, bool bPaddingDisabled ) + { + if ( !bPaddingDisabled ) + { + return m_texMenu_Panel_Border.Draw( GetRender(), control->GetRenderBounds() ); + } + + m_texMenu_Panel.Draw( GetRender(), control->GetRenderBounds() ); + } + + virtual void DrawShadow( Gwen::Controls::Base* control ) + { + Gwen::Rect r = control->GetRenderBounds(); + r.x -= 8; + r.y -= 8; + r.w += 16; + r.h += 16; + // m_texShadow.Draw( r ); + } + + virtual void DrawRadioButton( Gwen::Controls::Base* control, bool bSelected, bool bDepressed) + { + if ( bSelected ) + m_RadioButton_Checked.Draw( GetRender(), control->GetRenderBounds() ); + else + m_RadioButton.Draw( GetRender(), control->GetRenderBounds() ); + } + + + virtual void DrawCheckBox( Gwen::Controls::Base* control, bool bSelected, bool bDepressed) + { + if ( bSelected ) + m_Checkbox_Checked.Draw( GetRender(), control->GetRenderBounds() ); + else + m_Checkbox.Draw( GetRender(), control->GetRenderBounds() ); + } + + virtual void DrawGroupBox( Gwen::Controls::Base* control, int textStart, int textHeight, int textWidth ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + rect.y += textHeight * 0.5f; + rect.h -= textHeight * 0.5f; + + Gwen::Color m_colDarker = Gwen::Color( 0, 50, 60, 50 ); + Gwen::Color m_colLighter = Gwen::Color( 255, 255, 255, 150 ); + + GetRender()->SetDrawColor( m_colLighter ); + + GetRender()->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y+1, textStart-3, 1 ) ); + GetRender()->DrawFilledRect( Gwen::Rect( rect.x+1+textStart+textWidth, rect.y+1, rect.w-textStart+textWidth-2, 1 ) ); + GetRender()->DrawFilledRect( Gwen::Rect( rect.x+1, (rect.y + rect.h)-1, rect.x+rect.w-2, 1 ) ); + + GetRender()->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y+1, 1, rect.h ) ); + GetRender()->DrawFilledRect( Gwen::Rect( (rect.x + rect.w)-2, rect.y+1, 1, rect.h-1 ) ); + + GetRender()->SetDrawColor( m_colDarker ); + + GetRender()->DrawFilledRect( Gwen::Rect( rect.x+1, rect.y, textStart-3, 1 ) ); + GetRender()->DrawFilledRect( Gwen::Rect( rect.x+1+textStart+textWidth, rect.y, rect.w-textStart-textWidth-2, 1 ) ); + GetRender()->DrawFilledRect( Gwen::Rect( rect.x+1, (rect.y + rect.h)-1, rect.x+rect.w-2, 1 ) ); + + GetRender()->DrawFilledRect( Gwen::Rect( rect.x, rect.y+1, 1, rect.h-1 ) ); + GetRender()->DrawFilledRect( Gwen::Rect( (rect.x + rect.w)-1, rect.y+1, 1, rect.h-1 ) ); + } + + virtual void DrawTextBox( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + bool bHasFocus = control->HasFocus(); + + if ( bHasFocus ) + m_texTextBox_Focus.Draw( GetRender(), control->GetRenderBounds() ); + else + m_texTextBox.Draw( GetRender(), control->GetRenderBounds() ); + + + //I dunno what this is for yet + /* + if ( CursorRect.w == 1 ) + { + if ( bHasFocus ) + { + GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 200 ) ); + GetRender()->DrawFilledRect( CursorRect ); + } + } + else + { + if ( bHasFocus ) + { + GetRender()->SetDrawColor( Gwen::Color( 50, 150, 255, 250 ) ); + GetRender()->DrawFilledRect( CursorRect ); + } + } + */ + } + + virtual void DrawTabButton( Gwen::Controls::Base* control, bool bActive ) + { + if ( bActive ) + m_texTab.Draw( GetRender(), control->GetRenderBounds() ); + else + m_texTab_Inactive.Draw( GetRender(), control->GetRenderBounds() ); + } + + virtual void DrawTabControl( Gwen::Controls::Base* control, Gwen::Rect CurrentButtonRect ) + { + m_texTab_Control.Draw( GetRender(), control->GetRenderBounds() ); + + if ( CurrentButtonRect.w > 0 && CurrentButtonRect.h > 0 ) + m_texTab_Gap.Draw( GetRender(), CurrentButtonRect ); + } + + virtual void DrawTabTitleBar( Gwen::Controls::Base* control ) + { + m_texTabBar.Draw( GetRender(), control->GetRenderBounds() ); + } + + virtual void DrawWindow( Gwen::Controls::Base* control, int topHeight, bool inFocus ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + if ( inFocus ) m_texWindow.Draw( GetRender(), control->GetRenderBounds() ); + else m_texWindow_Inactive.Draw( GetRender(), control->GetRenderBounds() ); + } + + virtual void DrawHighlight( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + GetRender()->SetDrawColor( Gwen::Color( 255, 100, 255, 255 ) ); + GetRender()->DrawFilledRect( rect ); + } + + virtual void DrawScrollBar( Gwen::Controls::Base* control, bool isHorizontal, bool bDepressed ) + { + Gwen::Rect rect = control->GetRenderBounds(); + if (bDepressed) + GetRender()->SetDrawColor( m_colControlDarker ); + else + GetRender()->SetDrawColor( m_colControlBright ); + GetRender()->DrawFilledRect( rect ); + } + + virtual void DrawScrollBarBar( Controls::Base* control, bool bDepressed, bool isHovered, bool isHorizontal ) + { + //TODO: something specialized + DrawButton( control, bDepressed, isHovered ); + } + + + + virtual void DrawProgressBar( Gwen::Controls::Base* control, bool isHorizontal, float progress) + { + Gwen::Rect rect = control->GetRenderBounds(); + Gwen::Color FillColour( 0, 211, 40, 255 ); + + if ( isHorizontal ) + { + //Background + GetRender()->SetDrawColor( m_colControlDark ); + GetRender()->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-2 ) ); + + //Right half + GetRender()->SetDrawColor( FillColour ); + GetRender()->DrawFilledRect( Gwen::Rect( 1, 1, rect.w*progress-2, rect.h-2 ) ); + + GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 150 ) ); + GetRender()->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h*0.45f ) ); + } + else + { + //Background + GetRender()->SetDrawColor( m_colControlDark ); + GetRender()->DrawFilledRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-2 ) ); + + //Top half + GetRender()->SetDrawColor( FillColour ); + GetRender()->DrawFilledRect( Gwen::Rect( 1, 1 + (rect.h * (1 - progress)), rect.w-2, rect.h * progress - 2 ) ); + + GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 150 ) ); + GetRender()->DrawFilledRect( Gwen::Rect( 1, 1, rect.w*0.45f, rect.h-2 ) ); + } + + GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 150 ) ); + GetRender()->DrawShavedCornerRect( Gwen::Rect( 1, 1, rect.w-2, rect.h-2 ) ); + + GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 70 ) ); + GetRender()->DrawShavedCornerRect( Gwen::Rect( 2, 2, rect.w-4, rect.h-4 ) ); + + GetRender()->SetDrawColor( m_colBorderColor ); + GetRender()->DrawShavedCornerRect( rect ); + } + + virtual void DrawListBox( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + GetRender()->SetDrawColor( m_colControlBright ); + GetRender()->DrawFilledRect( rect ); + + GetRender()->SetDrawColor( m_colBorderColor ); + GetRender()->DrawLinedRect( rect ); + } + + virtual void DrawListBoxLine( Gwen::Controls::Base* control, bool bSelected ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + if ( bSelected ) + { + GetRender()->SetDrawColor( m_colHighlightBorder ); + GetRender()->DrawFilledRect( rect ); + } + else if ( control->IsHovered() ) + { + GetRender()->SetDrawColor( m_colHighlightBG ); + GetRender()->DrawFilledRect( rect ); + } + } + + + virtual void DrawSlider( Gwen::Controls::Base* control, bool bIsHorizontal, int numNotches, int barSize) + { + Gwen::Rect rect = control->GetRenderBounds(); + Gwen::Rect notchRect = rect; + + if ( bIsHorizontal ) + { + rect.y += rect.h * 0.4; + rect.h -= rect.h * 0.8; + } + else + { + rect.x += rect.w * 0.4; + rect.w -= rect.w * 0.8; + } + + GetRender()->SetDrawColor( m_colBGDark ); + GetRender()->DrawFilledRect( rect ); + + GetRender()->SetDrawColor( m_colControlDarker ); + GetRender()->DrawLinedRect( rect ); + } + + virtual void DrawComboBox( Gwen::Controls::Base* control ) + { + DrawTextBox( control ); + } + + virtual void DrawKeyboardHighlight( Gwen::Controls::Base* control, const Gwen::Rect& r, int iOffset ) + { + Gwen::Rect rect = r; + + rect.x += iOffset; + rect.y += iOffset; + rect.w -= iOffset*2; + rect.h -= iOffset*2; + + //draw the top and bottom + bool skip = true; + for(int i=0; i< rect.w*0.5; i++) + { + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + if (!skip) + { + GetRender()->DrawPixel(rect.x + (i*2), rect.y); + GetRender()->DrawPixel(rect.x + (i*2), rect.y+rect.h-1); + } + else + skip = !skip; + } + skip = false; + for(int i=0; i< rect.h*0.5; i++) + { + GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + if (!skip) + { + GetRender()->DrawPixel(rect.x , rect.y +i*2); + GetRender()->DrawPixel(rect.x +rect.w-1, rect.y +i*2 ); + } + else + skip = !skip; + } + } + + virtual void DrawToolTip( Gwen::Controls::Base* control ) + { + Gwen::Rect rct = control->GetRenderBounds(); + rct.x -= 3; + rct.y -= 3; + rct.w += 6; + rct.h += 6; + + GetRender()->SetDrawColor( m_colToolTipBackground ); + GetRender()->DrawFilledRect( rct ); + + GetRender()->SetDrawColor( m_colToolTipBorder ); + GetRender()->DrawLinedRect( rct ); + } + + virtual void DrawScrollButton( Gwen::Controls::Base* control, int iDirection, bool bDepressed ) + { + DrawButton( control, bDepressed, false ); + + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 240 ) ); + + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + + if ( iDirection == Gwen::Pos::Top ) DrawArrowUp( r ); + else if ( iDirection == Gwen::Pos::Bottom ) DrawArrowDown( r ); + else if ( iDirection == Gwen::Pos::Left ) DrawArrowLeft( r ); + else DrawArrowRight( r ); + } + + virtual void DrawComboBoxButton( Gwen::Controls::Base* control, bool bDepressed ) + { + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 240 ) ); + + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + DrawArrowDown( r ); + } + + virtual void DrawNumericUpDownButton( Gwen::Controls::Base* control, bool bDepressed, bool bUp ) + { + // DrawButton( control->Width(), control->Height(), bDepressed, false, true ); + + m_Render->SetDrawColor( Gwen::Color( 0, 0, 0, 240 ) ); + + Gwen::Rect r( control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5 ); + + if ( bUp ) DrawArrowUp( r ); + else DrawArrowDown( r ); + } + + virtual void DrawStatusBar( Controls::Base* control ) + { + DrawBackground( control ); + } + + + virtual void DrawBackground( Gwen::Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + m_Render->SetDrawColor( m_colBGDark ); + m_Render->DrawFilledRect( rect ); + m_Render->SetDrawColor( m_colControlDarker); + m_Render->DrawLinedRect( rect ); + } + + virtual void DrawTreeButton( Controls::Base* control, bool bOpen ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + rect.x += 2; + rect.y += 2; + rect.w -= 2; + rect.h -= 2; + if ( bOpen ) + { + m_TreeMinus.Draw( GetRender(), rect ); + } + else + m_TreePlus.Draw( GetRender(), rect ); + } + + virtual void DrawTreeControl( Controls::Base* control ) + { + m_texTreeBG.Draw( GetRender(), control->GetRenderBounds() ); + } + + + + virtual void DrawPropertyRow( Controls::Base* control, int iWidth, bool bBeingEdited ) + { + + Gwen::Rect rect = control->GetRenderBounds(); + + + if ( bBeingEdited ) + { + GetRender()->SetDrawColor( m_colHighlightBG ); + GetRender()->DrawFilledRect( Gwen::Rect( 0, rect.y, iWidth, rect.h ) ); + } + + GetRender()->SetDrawColor( m_colControlOutlineLighter ); + + GetRender()->DrawFilledRect( Gwen::Rect( iWidth, rect.y, 1, rect.h ) ); + + rect.y += rect.h-1; + rect.h = 1; + + + GetRender()->DrawFilledRect( rect ); + + } + + virtual void DrawPropertyTreeNode( Controls::Base* control, int BorderLeft, int BorderTop ) + { + + Gwen::Rect rect = control->GetRenderBounds(); + + GetRender()->SetDrawColor( m_colControlOutlineLighter ); + + GetRender()->DrawFilledRect( Gwen::Rect( rect.x, rect.y, BorderLeft, rect.h ) ); + GetRender()->DrawFilledRect( Gwen::Rect( rect.x + BorderLeft, rect.y, rect.w - BorderLeft, BorderTop ) ); + + } + + void DrawTreeNode( Controls::Base* ctrl, bool bOpen, bool bSelected, int iLabelHeight, int iLabelWidth, int iHalfWay, int iLastBranch, bool bIsRoot ) + { + if ( bSelected ) + { + GetRender()->SetDrawColor( Color( 0, 150, 255, 100 ) ); + GetRender()->DrawFilledRect( Gwen::Rect( 17, 0, iLabelWidth + 2, iLabelHeight-1 ) ); + GetRender()->SetDrawColor( Color( 0, 150, 255, 200 ) ); + GetRender()->DrawLinedRect( Gwen::Rect( 17, 0, iLabelWidth + 2, iLabelHeight-1 ) ); + } + + GetRender()->SetDrawColor( Color( 0, 0, 0, 50 ) ); + + if ( !bIsRoot ) + GetRender()->DrawFilledRect( Gwen::Rect( 9, iHalfWay, 16-9, 1 ) ); + + if ( !bOpen ) return; + + GetRender()->DrawFilledRect( Gwen::Rect( 14 + 8, iLabelHeight, 1, iLastBranch + iHalfWay - iLabelHeight ) ); + } + + void DrawColorDisplay( Controls::Base* control, Gwen::Color color ) + { + Gwen::Rect rect = control->GetRenderBounds(); + + if ( color.a != 255) + { + GetRender()->SetDrawColor( Gwen::Color( 255, 255, 255, 255 ) ); + GetRender()->DrawFilledRect( rect ); + + GetRender()->SetDrawColor( Gwen::Color( 128, 128, 128, 128 ) ); + + GetRender()->DrawFilledRect( Gwen::Rect( 0, 0, rect.w * 0.5, rect.h * 0.5) ); + GetRender()->DrawFilledRect( Gwen::Rect( rect.w * 0.5, rect.h * 0.5, rect.w * 0.5,rect.h * 0.5) ); + } + + GetRender()->SetDrawColor( color ); + GetRender()->DrawFilledRect( rect ); + + GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 255 ) ); + GetRender()->DrawLinedRect( rect ); + } + + virtual void DrawModalControl( Controls::Base* control ) + { + if ( control->ShouldDrawBackground() ) + { + Gwen::Rect rect = control->GetRenderBounds(); + GetRender()->SetDrawColor( m_colModal ); + GetRender()->DrawFilledRect( rect ); + } + } + + virtual void DrawMenuDivider( Controls::Base* control ) + { + Gwen::Rect rect = control->GetRenderBounds(); + GetRender()->SetDrawColor( m_colBGDark ); + GetRender()->DrawFilledRect( rect ); + GetRender()->SetDrawColor( m_colControlDarker); + GetRender()->DrawLinedRect( rect ); + } + }; + } +} +#endif diff --git a/btgui/Gwen/Skins/Texturing.h b/btgui/Gwen/Skins/Texturing.h new file mode 100644 index 000000000..3792aba09 --- /dev/null +++ b/btgui/Gwen/Skins/Texturing.h @@ -0,0 +1,147 @@ +#pragma once +#ifndef GWEN_SKINS_TEXTURING_H +#define GWEN_SKINS_TEXTURING_H + +#include "Gwen/Gwen.h" +#include "Gwen/Texture.h" + +namespace Gwen +{ + namespace Skin + { + namespace Texturing + { + struct Single + { + Single() + { + texture = NULL; + } + + void Init( Texture* pTexture, float x, float y, float w, float h ) + { + texture = pTexture; + + float texw = texture->width; + float texh = texture->height; + + uv[0] = x / texw; + uv[1] = y / texh; + uv[2] = (x+w) / texw; + uv[3] = (y+h) / texh; + } + + void Draw( Gwen::Renderer::Base* render, Gwen::Rect r, const Gwen::Color& col = Gwen::Colors::White ) + { + render->SetDrawColor( col ); + + render->DrawTexturedRect( texture, r, uv[0], uv[1],uv[2], uv[3] ); + } + + Texture* texture; + float uv[4]; + }; + + struct Bordered + { + Bordered() + { + texture = NULL; + } + + void Init( Texture* pTexture, float x, float y, float w, float h, Margin in_margin, float DrawMarginScale = 1.0f ) + { + texture = pTexture; + + margin = in_margin; + + SetRect( 0, x, y, margin.left, margin.top ); + SetRect( 1, x+margin.left, y, w - margin.left - margin.right - 1, margin.top ); + SetRect( 2, (x + w) - margin.right, y, margin.right, margin.top ); + + SetRect( 3, x, y+margin.top, margin.left, h - margin.top - margin.bottom - 1 ); + SetRect( 4, x+margin.left, y+margin.top, w - margin.left - margin.right - 1, h - margin.top - margin.bottom - 1 ); + SetRect( 5, (x + w) - margin.right, y+margin.top, margin.right, h - margin.top - margin.bottom - 1 ); + + SetRect( 6, x, (y+h)-margin.bottom, margin.left, margin.bottom ); + SetRect( 7, x+margin.left, (y+h)-margin.bottom, w - margin.left - margin.right - 1, margin.bottom ); + SetRect( 8, (x + w) - margin.right, (y+h)-margin.bottom, margin.right, margin.bottom ); + + margin.left *= DrawMarginScale; + margin.right *= DrawMarginScale; + margin.top *= DrawMarginScale; + margin.bottom *= DrawMarginScale; + + width = w - x; + height = h - y; + } + + void SetRect( int iNum, float x, float y, float w, float h ) + { + float texw = texture->width; + float texh = texture->height; + + //x -= 1.0f; + //y -= 1.0f; + + + + rects[iNum].uv[0] = x / texw; + rects[iNum].uv[1] = y / texh; + + rects[iNum].uv[2] = (x+w) / texw; + rects[iNum].uv[3] = (y+h) / texh; + + // rects[iNum].uv[0] += 1.0f / texture->width; + // rects[iNum].uv[1] += 1.0f / texture->width; + } + + void Draw( Gwen::Renderer::Base* render, Gwen::Rect r, const Gwen::Color& col = Gwen::Colors::White ) + { + render->SetDrawColor( col ); + + if ( r.w < width && r.h < height ) + { + render->DrawTexturedRect( texture, + r, + rects[0].uv[0], rects[0].uv[1], rects[8].uv[2], rects[8].uv[3] ); + return; + } + + DrawRect( render, 0, r.x, r.y, margin.left, margin.top ); + DrawRect( render, 1, r.x + margin.left, r.y, r.w - margin.left - margin.right, margin.top ); + DrawRect( render, 2, (r.x + r.w) - margin.right, r.y, margin.right, margin.top ); + + DrawRect( render, 3, r.x, r.y+margin.top, margin.left, r.h - margin.top - margin.bottom ); + DrawRect( render, 4, r.x + margin.left, r.y+margin.top, r.w - margin.left - margin.right, r.h - margin.top - margin.bottom ); + DrawRect( render, 5, (r.x + r.w) - margin.right, r.y+margin.top, margin.right, r.h - margin.top - margin.bottom ); + + DrawRect( render, 6, r.x, (r.y+r.h) - margin.bottom, margin.left, margin.bottom ); + DrawRect( render, 7, r.x + margin.left, (r.y+r.h) - margin.bottom, r.w - margin.left - margin.right, margin.bottom ); + DrawRect( render, 8, (r.x + r.w) - margin.right, (r.y+r.h) - margin.bottom, margin.right, margin.bottom ); + } + + void DrawRect( Gwen::Renderer::Base* render, int i, int x, int y, int w, int h ) + { + render->DrawTexturedRect( texture, + Gwen::Rect( x, y, w, h ), + rects[i].uv[0], rects[i].uv[1], rects[i].uv[2], rects[i].uv[3] ); + } + + Texture* texture; + + struct SubRect + { + float uv[4]; + }; + + SubRect rects[9]; + Margin margin; + + float width; + float height; + }; + } + } +} +#endif diff --git a/btgui/Gwen/Structures.h b/btgui/Gwen/Structures.h new file mode 100644 index 000000000..500f2e9c9 --- /dev/null +++ b/btgui/Gwen/Structures.h @@ -0,0 +1,200 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifdef _MSC_VER +#pragma warning( disable : 4244 ) +#pragma warning( disable : 4251 ) +#endif +#ifndef GWEN_STRUCTURES_H +#define GWEN_STRUCTURES_H + +#include "Gwen/Exports.h" +#include + +namespace Gwen +{ + namespace Controls + { + class Base; + class Canvas; + } + + namespace CursorType + { + static const unsigned char Normal = 0; + static const unsigned char Beam = 1; + static const unsigned char SizeNS = 2; + static const unsigned char SizeWE = 3; + static const unsigned char SizeNWSE = 4; + static const unsigned char SizeNESW = 5; + static const unsigned char SizeAll = 6; + static const unsigned char No = 7; + static const unsigned char Wait = 8; + static const unsigned char Finger = 9; + + static const unsigned char Count = 10; + } + + typedef std::wstring UnicodeString; + typedef std::string String; + typedef wchar_t UnicodeChar; // Portability?? + + struct GWEN_EXPORT Margin + { + Margin( int left = 0, int top = 0, int right = 0, int bottom = 0 ) + { + this->top = top; + this->bottom = bottom; + this->left = left; + this->right = right; + } + + int top, bottom, left, right; + }; + + + typedef Margin Padding; + + + struct GWEN_EXPORT Rect + { + Rect( int x = 0, int y = 0, int w = 0, int h = 0 ) + { + this->x = x; + this->y = y; + this->w = w; + this->h = h; + } + + int x, y, w, h; + }; + + + struct GWEN_EXPORT Point + { + Point(int x = 0, int y = 0) + { + this->x = x; + this->y = y; + } + + int x, y; + }; + + struct GWEN_EXPORT HSV + { + float h; + float s; + float v; + }; + + + struct GWEN_EXPORT Color + { + Color( unsigned char r = 255, unsigned char g = 255, unsigned char b = 255, unsigned char a = 255 ) + { + this->r = r; + this->g = g; + this->b = b; + this->a = a; + } + + void operator = ( Color c ) + { + this->r = c.r; + this->g = c.g; + this->b = c.b; + this->a = c.a; + } + + void operator += ( Color c ) + { + this->r += c.r; + this->g += c.g; + this->b += c.b; + this->a += c.a; + } + + void operator -= ( Color c ) + { + this->r -= c.r; + this->g -= c.g; + this->b -= c.b; + this->a -= c.a; + } + + void operator *= ( float f ) + { + this->r *= f; + this->g *= f; + this->b *= f; + this->a *= f; + } + + Color operator *( float f ) + { + return Color( + (float)this->r*f, + (float)this->g*f, + (float)this->b*f, + (float)this->a*f + ); + } + + Color operator - ( Color c ) + { + return Color( + this->r - c.r, + this->g - c.g, + this->b - c.b, + this->a - c.a + ); + } + + Color operator + ( Color c ) + { + return Color( + this->r + c.r, + this->g + c.g, + this->b + c.b, + this->a + c.a + ); + } + + bool operator ==( const Color& c ) const + { + return c.r==r && c.g==g && c.b==b && c.a==a; + } + + + unsigned char r, g, b, a; + }; + + + namespace DragAndDrop + { + struct GWEN_EXPORT Package + { + Package() + { + userdata = NULL; + draggable = false; + drawcontrol = NULL; + holdoffset = Gwen::Point( 0, 0 ); + } + + String name; + void* userdata; + bool draggable; + + Gwen::Controls::Base* drawcontrol; + Gwen::Point holdoffset; + }; + } + +} +#endif diff --git a/btgui/Gwen/TextObject.h b/btgui/Gwen/TextObject.h new file mode 100644 index 000000000..20f8db9c9 --- /dev/null +++ b/btgui/Gwen/TextObject.h @@ -0,0 +1,65 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_TEXTOBJECT_H +#define GWEN_TEXTOBJECT_H + +#include "Gwen/Gwen.h" +#include "Gwen/Utility.h" + +namespace Gwen +{ + class TextObject + { + public: + + TextObject(){} + + TextObject( const Gwen::String& text ) + { + *this = text; + } + + TextObject( const char* text ) + { + *this = Gwen::String( text ); + } + + TextObject( const wchar_t* text ) + { + *this = Gwen::UnicodeString( text ); + } + + TextObject( const Gwen::UnicodeString& unicode ) + { + *this = unicode; + } + + void operator = ( const Gwen::String& str ) + { + m_Data = Gwen::Utility::StringToUnicode( str ); + } + + void operator = ( const Gwen::UnicodeString& unicodeStr ) + { + m_Data = unicodeStr; + } + + Gwen::String Get() const + { + return Gwen::Utility::UnicodeToString( m_Data ); + } + + const Gwen::UnicodeString& GetUnicode() const + { + return m_Data; + } + + Gwen::UnicodeString m_Data; + }; +} +#endif diff --git a/btgui/Gwen/Texture.h b/btgui/Gwen/Texture.h new file mode 100644 index 000000000..876cb7386 --- /dev/null +++ b/btgui/Gwen/Texture.h @@ -0,0 +1,54 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#pragma once +#ifndef GWEN_TEXTURE_H +#define GWEN_TEXTURE_H + +#include + +#include "Gwen/BaseRender.h" +#include "Gwen/TextObject.h" + +namespace Gwen +{ + // + // Texture + // + struct Texture + { + TextObject name; + void* data; + bool failed; + int width; + int height; + + Texture() + { + data = NULL; + width = 4; + height = 4; + failed = false; + } + + ~Texture() + { + } + + void Load( const TextObject& str, Gwen::Renderer::Base* render ) + { + name = str; + render->LoadTexture( this ); + } + + void Release( Gwen::Renderer::Base* render ) + { + render->FreeTexture( this ); + } + }; + +} +#endif diff --git a/btgui/Gwen/ToolTip.cpp b/btgui/Gwen/ToolTip.cpp new file mode 100644 index 000000000..60e552650 --- /dev/null +++ b/btgui/Gwen/ToolTip.cpp @@ -0,0 +1,61 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/ToolTip.h" +#include "Gwen/Utility.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +namespace ToolTip +{ + Base* g_ToolTip = NULL; + + void Enable( Controls::Base* pControl ) + { + if ( !pControl->GetToolTip() ) + return; + + g_ToolTip = pControl; + } + + void Disable( Controls::Base* pControl ) + { + if ( g_ToolTip == pControl ) + { + g_ToolTip = NULL; + } + } + + void RenderToolTip( Skin::Base* skin ) + { + if ( !g_ToolTip ) return; + + Gwen::Renderer::Base* render = skin->GetRender(); + + Gwen::Point pOldRenderOffset = render->GetRenderOffset(); + Gwen::Point MousePos = Input::GetMousePosition(); + Gwen::Rect Bounds = g_ToolTip->GetToolTip()->GetBounds(); + + Gwen::Rect rOffset = Gwen::Rect( MousePos.x - Bounds.w * 0.5f, MousePos.y - Bounds.h - 10, Bounds.w, Bounds.h ); + rOffset = Utility::ClampRectToRect( rOffset, g_ToolTip->GetCanvas()->GetBounds() ); + + //Calculate offset on screen bounds + render->AddRenderOffset( rOffset ); + render->EndClip(); + + skin->DrawToolTip( g_ToolTip->GetToolTip() ); + g_ToolTip->GetToolTip()->DoRender( skin ); + + render->SetRenderOffset( pOldRenderOffset ); + } + + void ControlDeleted( Controls::Base* pControl ) + { + Disable( pControl ); + } +} diff --git a/btgui/Gwen/ToolTip.h b/btgui/Gwen/ToolTip.h new file mode 100644 index 000000000..c263887a8 --- /dev/null +++ b/btgui/Gwen/ToolTip.h @@ -0,0 +1,29 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#pragma once +#ifndef GWEN_TOOLTIP_H +#define GWEN_TOOLTIP_H + +#include "Gwen/Controls/Base.h" +#include "Gwen/Gwen.h" +#include "Gwen/Skin.h" + +using namespace Gwen; +using namespace Gwen::Controls; + +namespace ToolTip +{ + GWEN_EXPORT void Enable ( Controls::Base* pControl ); + GWEN_EXPORT void Disable ( Controls::Base* pControl ); + + GWEN_EXPORT void ControlDeleted ( Controls::Base* pControl ); + + GWEN_EXPORT void RenderToolTip ( Skin::Base* skin ); +} + +#endif diff --git a/btgui/Gwen/UnitTest/UnitTest.h b/btgui/Gwen/UnitTest/UnitTest.h new file mode 100644 index 000000000..7d8f76f7f --- /dev/null +++ b/btgui/Gwen/UnitTest/UnitTest.h @@ -0,0 +1,64 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + + +#pragma once +#ifndef GWEN_UNITTEST_UNITTEST_H +#define GWEN_UNITTEST_UNITTEST_H + +#include "Gwen/Gwen.h" +#include "Gwen/Align.h" +#include "Gwen/Utility.h" +#include "Gwen/Controls/WindowControl.h" +#include "Gwen/Controls/TabControl.h" +#include "Gwen/Controls/ListBox.h" + +class UnitTest; + + + +class GUnit : public Gwen::Controls::Base +{ + public: + + GWEN_CONTROL_INLINE( GUnit, Gwen::Controls::Base ) + { + m_pUnitTest = NULL; + } + + void SetUnitTest( UnitTest* u ){ m_pUnitTest = u; } + + void UnitPrint( const Gwen::UnicodeString& str ); + void UnitPrint( const Gwen::String& str ); + + + + + UnitTest* m_pUnitTest; +}; + +class UnitTest : public Gwen::Controls::WindowControl +{ + public: + + GWEN_CONTROL( UnitTest, Gwen::Controls::WindowControl ); + + void PrintText( const Gwen::UnicodeString& str ); + + void Render( Gwen::Skin::Base* skin ); + + + private: + + Gwen::Controls::TabControl* m_TabControl; + Gwen::Controls::ListBox* m_TextOutput; + unsigned int m_iFrames; + float m_fLastSecond; + +}; + +#define DEFINE_UNIT_TEST( name, displayname ) GUnit* RegisterUnitTest_##name( Gwen::Controls::TabControl* tab ){ GUnit* u = new name( tab ); tab->AddPage( displayname, u ); return u; } +#endif diff --git a/btgui/Gwen/Utility.cpp b/btgui/Gwen/Utility.cpp new file mode 100644 index 000000000..2da302d1b --- /dev/null +++ b/btgui/Gwen/Utility.cpp @@ -0,0 +1,111 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/ToolTip.h" +#include "Gwen/Utility.h" + +using namespace Gwen; + +#ifdef _MSC_VER + #pragma warning(disable:4267)// conversion from 'size_t' to 'int', possible loss of data +#endif + +UnicodeString Gwen::Utility::Format( const wchar_t* fmt, ... ) +{ + wchar_t strOut[ 4096 ]; + + va_list s; + va_start( s, fmt ); + GwenUtil_VSWPrintFSafeSized( strOut, fmt, s ); + va_end(s); + + UnicodeString str = strOut; + return str; +} + + + +void Gwen::Utility::Strings::Split( const Gwen::String& str, const Gwen::String& seperator, Strings::List& outbits, bool bLeave ) +{ + int iOffset = 0; + int iLength = str.length(); + int iSepLen = seperator.length(); + + size_t i = str.find( seperator, 0 ); + while ( i != std::string::npos ) + { + outbits.push_back( str.substr( iOffset, i-iOffset ) ); + iOffset = i + iSepLen; + + i = str.find( seperator, iOffset ); + if ( bLeave ) iOffset -= iSepLen; + } + + outbits.push_back( str.substr( iOffset, iLength-iOffset ) ); +} + +void Gwen::Utility::Strings::Split( const Gwen::UnicodeString& str, const Gwen::UnicodeString& seperator, Strings::UnicodeList& outbits, bool bLeave ) +{ + int iOffset = 0; + int iLength = str.length(); + int iSepLen = seperator.length(); + + size_t i = str.find( seperator, 0 ); + while ( i != std::wstring::npos ) + { + outbits.push_back( str.substr( iOffset, i-iOffset ) ); + iOffset = i + iSepLen; + + i = str.find( seperator, iOffset ); + if ( bLeave ) iOffset -= iSepLen; + } + + outbits.push_back( str.substr( iOffset, iLength-iOffset ) ); +} + +int Gwen::Utility::Strings::To::Int( const Gwen::String& str ) +{ + if ( str == "" ) return 0; + return atoi( str.c_str() ); +} + +float Gwen::Utility::Strings::To::Float( const Gwen::String& str ) +{ + if ( str == "" ) return 0.0f; + return (float)atof( str.c_str() ); +} + +bool Gwen::Utility::Strings::To::Bool( const Gwen::String& str ) +{ + if ( str.size() == 0 ) return false; + if ( str[0] == 'T' || str[0] == 't' || str[0] == 'y' || str[0] == 'Y' ) return true; + if ( str[0] == 'F' || str[0] == 'f' || str[0] == 'n' || str[0] == 'N' ) return false; + if ( str[0] == '0' ) return false; + return true; +} + +bool Gwen::Utility::Strings::To::Floats( const Gwen::String& str, float* f, size_t iCount ) +{ + Strings::List lst; + Strings::Split( str, " ", lst ); + if ( lst.size() != iCount ) return false; + + for ( size_t i=0; i +#include +#include "Gwen/Structures.h" + +namespace Gwen +{ + namespace Utility + { + template + const T& Max( const T& x, const T& y ) + { + if ( y < x ) return x; + return y; + } + + template + const T& Min( const T& x, const T& y ) + { + if ( y > x ) return x; + return y; + } + +#ifdef _MSC_VER + #pragma warning( push ) + #pragma warning( disable : 4996 ) +#endif + + inline String UnicodeToString( const UnicodeString& strIn ) + { + if ( !strIn.length() ) return ""; + + String temp(strIn.length(), (char)0); + + std::use_facet< std::ctype >(std::locale()). \ + narrow(&strIn[0], &strIn[0]+strIn.length(), ' ', &temp[0]); + + return temp; + } + + inline UnicodeString StringToUnicode( const String& strIn ) + { + if ( !strIn.length() ) return L""; + + UnicodeString temp(strIn.length(), (wchar_t)0); + + std::use_facet< std::ctype >(std::locale()). \ + widen(&strIn[0], &strIn[0]+strIn.length(), &temp[0]); + + return temp; + } + +#ifdef _MSC_VER + #pragma warning( pop ) +#endif + + template + String ToString( const T& object ) + { + std::ostringstream os; + os << object; + return os.str(); + } + + inline Gwen::Rect ClampRectToRect( Gwen::Rect inside, Gwen::Rect outside, bool clampSize = false ) + { + if ( inside.x < outside.x ) + inside.x = outside.x; + + if ( inside.y < outside.y ) + inside.y = outside.y; + + if ( inside.x + inside.w > outside.x + outside.w ) + { + if ( clampSize ) + inside.w = outside.w; + else + inside.x = outside.x + outside.w - inside.w; + } + if ( inside.y + inside.h > outside.y + outside.h ) + { + if ( clampSize ) + inside.h = outside.h; + else + inside.y = outside.w + outside.h - inside.h; + } + + return inside; + } + + GWEN_EXPORT UnicodeString Format( const wchar_t* fmt, ... ); + + namespace Strings + { + typedef std::vector List; + typedef std::vector UnicodeList; + + GWEN_EXPORT void Split( const Gwen::String& str, const Gwen::String& seperator, Strings::List& outbits, bool bLeaveSeperators = false ); + GWEN_EXPORT void Split( const Gwen::UnicodeString& str, const Gwen::UnicodeString& seperator, Strings::UnicodeList& outbits, bool bLeaveSeperators = false ); + + template + T TrimLeft( const T& str, const T& strChars ) + { + T outstr = str; + outstr.erase( 0, outstr.find_first_not_of( strChars ) ); + return outstr; + } + + namespace To + { + GWEN_EXPORT bool Bool( const Gwen::String& str ); + GWEN_EXPORT int Int( const Gwen::String& str ); + GWEN_EXPORT float Float( const Gwen::String& str ); + GWEN_EXPORT bool Floats( const Gwen::String& str, float* f, size_t iCount ); + } + } + } + + + +} +#endif diff --git a/btgui/Gwen/events.cpp b/btgui/Gwen/events.cpp new file mode 100644 index 000000000..ae6c65105 --- /dev/null +++ b/btgui/Gwen/events.cpp @@ -0,0 +1,111 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/Events.h" + +using namespace Gwen; +using namespace Gwen::Event; + + +Handler::Handler() +{ + +} + +Handler::~Handler() +{ + CleanLinks(); +} + +void Handler::CleanLinks() +{ + // Tell all the callers that we're dead + std::list::iterator iter = m_Callers.begin(); + while ( iter != m_Callers.end() ) + { + Caller* pCaller = *iter; + UnRegisterCaller( pCaller ); + pCaller->RemoveHandler( this ); + iter = m_Callers.begin(); + } +} + +void Handler::RegisterCaller( Caller* pCaller ) +{ + m_Callers.push_back( pCaller ); +} + +void Handler::UnRegisterCaller( Caller* pCaller ) +{ + m_Callers.remove( pCaller ); +} + + +Caller::Caller() +{ + +} + +Caller::~Caller() +{ + CleanLinks(); +} + +void Caller::CleanLinks() +{ + std::list::iterator iter; + for (iter = m_Handlers.begin(); iter != m_Handlers.end(); ++iter) + { + handler& h = *iter; + h.pObject->UnRegisterCaller( this ); + } + + m_Handlers.clear(); +} + +void Caller::Call( Controls::Base* pThis ) +{ + std::list::iterator iter; + for (iter = m_Handlers.begin(); iter != m_Handlers.end(); ++iter) + { + handler& h = *iter; + (h.pObject->*h.fnFunction)( pThis ); + } +} + +void Caller::AddInternal( Event::Handler* pObject, Event::Handler::Function pFunction ) +{ + handler h; + h.fnFunction = pFunction; + h.pObject = pObject; + + m_Handlers.push_back( h ); + + pObject->RegisterCaller( this ); +} + +void Caller::RemoveHandler( Event::Handler* pObject ) +{ + pObject->UnRegisterCaller( this ); + + std::list::iterator iter = m_Handlers.begin(); + + while ( iter != m_Handlers.end() ) + { + handler& h = *iter; + + if ( h.pObject == pObject ) + { + iter = m_Handlers.erase( iter ); + } + else + { + ++iter; + } + } + +} \ No newline at end of file diff --git a/btgui/Gwen/inputhandler.cpp b/btgui/Gwen/inputhandler.cpp new file mode 100644 index 000000000..5cae979a0 --- /dev/null +++ b/btgui/Gwen/inputhandler.cpp @@ -0,0 +1,356 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + + +#include "Gwen/InputHandler.h" +#include "Gwen/Controls/Base.h" +#include "Gwen/DragAndDrop.h" +#include "Gwen/Hook.h" +#include "Gwen/Platform.h" + +#define DOUBLE_CLICK_SPEED 0.5f +#define MAX_MOUSE_BUTTONS 5 + +using namespace Gwen; + + +struct Action +{ + unsigned char type; + + int x, y; + Gwen::UnicodeChar chr; +}; + +static const float KeyRepeatRate = 0.03f; +static const float KeyRepeatDelay = 0.3f; + +struct t_KeyData +{ + t_KeyData() + { + for ( int i=0; iGetControlAt( MousePosition.x, MousePosition.y ); + + if ( Gwen::HoveredControl && pHovered != Gwen::HoveredControl ) + { + Gwen::HoveredControl->OnMouseLeave(); + + pInCanvas->Redraw(); + } + + if ( pHovered != Gwen::HoveredControl ) + { + Gwen::HoveredControl = pHovered; + + if ( Gwen::HoveredControl ) + Gwen::HoveredControl->OnMouseEnter(); + + pInCanvas->Redraw(); + } + + if ( Gwen::MouseFocus && Gwen::MouseFocus->GetCanvas() == pInCanvas ) + { + Gwen::HoveredControl = Gwen::MouseFocus; + } + +} + +void FindKeyboardFocus( Controls::Base* pControl ) +{ + if ( !pControl ) return; + if ( pControl->GetKeyboardInputEnabled() ) + { + //Make sure none of our children have keyboard focus first - todo recursive + for (Controls::Base::List::iterator iter = pControl->Children.begin(); iter != pControl->Children.end(); ++iter) + { + Controls::Base* pChild = *iter; + if ( pChild == Gwen::KeyboardFocus ) + return; + } + + pControl->Focus(); + return; + } + + return FindKeyboardFocus( pControl->GetParent() ); +} + +Gwen::Point Gwen::Input::GetMousePosition() +{ + return MousePosition; +} + +void Gwen::Input::OnCanvasThink( Controls::Base* pControl ) +{ + if ( Gwen::MouseFocus && !Gwen::MouseFocus->Visible() ) + Gwen::MouseFocus = NULL; + + if ( Gwen::KeyboardFocus && ( !Gwen::KeyboardFocus->Visible() || !KeyboardFocus->GetKeyboardInputEnabled() ) ) + Gwen::KeyboardFocus = NULL; + + if ( !KeyboardFocus ) return; + if ( KeyboardFocus->GetCanvas() != pControl ) return; + + float fTime = Gwen::Platform::GetTimeInSeconds(); + + // + // Simulate Key-Repeats + // + for ( int i=0; i KeyData.NextRepeat[i] ) + { + KeyData.NextRepeat[i] = Gwen::Platform::GetTimeInSeconds() + KeyRepeatRate; + + if ( KeyboardFocus ) + { + KeyboardFocus->OnKeyPress( i ); + } + } + } +} + +bool Gwen::Input::IsKeyDown( int iKey ) +{ + return KeyData.KeyState[ iKey ]; +} + +bool Gwen::Input::IsLeftMouseDown() +{ + return KeyData.LeftMouseDown; +} + +bool Gwen::Input::IsRightMouseDown() +{ + return KeyData.RightMouseDown; +} + +void Gwen::Input::OnMouseMoved( Controls::Base* pCanvas, int x, int y, int /*deltaX*/, int /*deltaY*/ ) +{ + MousePosition.x = x; + MousePosition.y = y; + + UpdateHoveredControl( pCanvas ); +} + +bool Gwen::Input::OnMouseClicked( Controls::Base* pCanvas, int iMouseButton, bool bDown ) +{ + // If we click on a control that isn't a menu we want to close + // all the open menus. Menus are children of the canvas. + if ( bDown && (!Gwen::HoveredControl || !Gwen::HoveredControl->IsMenuComponent()) ) + { + pCanvas->CloseMenus(); + } + + if ( !Gwen::HoveredControl ) return false; + if ( Gwen::HoveredControl->GetCanvas() != pCanvas ) return false; + if ( !Gwen::HoveredControl->Visible() ) return false; + if ( Gwen::HoveredControl == pCanvas ) return false; + + if ( iMouseButton > MAX_MOUSE_BUTTONS ) + return false; + + if ( iMouseButton == 0 ) KeyData.LeftMouseDown = bDown; + else if ( iMouseButton == 1 ) KeyData.RightMouseDown = bDown; + + // Double click. + // Todo: Shouldn't double click if mouse has moved significantly + bool bIsDoubleClick = false; + + if ( bDown && + g_pntLastClickPos.x == MousePosition.x && + g_pntLastClickPos.y == MousePosition.y && + ( Gwen::Platform::GetTimeInSeconds() - g_fLastClickTime[ iMouseButton ] ) < DOUBLE_CLICK_SPEED ) + { + bIsDoubleClick = true; + } + + if ( bDown && !bIsDoubleClick ) + { + g_fLastClickTime[ iMouseButton ] = Gwen::Platform::GetTimeInSeconds(); + g_pntLastClickPos = MousePosition; + } + + if ( bDown ) + { + FindKeyboardFocus( Gwen::HoveredControl ); + } + + Gwen::HoveredControl->UpdateCursor(); + + // This tells the child it has been touched, which + // in turn tells its parents, who tell their parents. + // This is basically so that Windows can pop themselves + // to the top when one of their children have been clicked. + if ( bDown ) + Gwen::HoveredControl->Touch(); + +#ifdef GWEN_HOOKSYSTEM + if ( bDown ) + { + if ( Hook::CallHook( &Hook::BaseHook::OnControlClicked, Gwen::HoveredControl, MousePosition.x, MousePosition.y ) ) + return true; + } +#endif + + switch ( iMouseButton ) + { + case 0: + { + if ( DragAndDrop::OnMouseButton( Gwen::HoveredControl, MousePosition.x, MousePosition.y, bDown ) ) + return true; + + if ( bIsDoubleClick ) Gwen::HoveredControl->OnMouseDoubleClickLeft( MousePosition.x, MousePosition.y ); + else Gwen::HoveredControl->OnMouseClickLeft( MousePosition.x, MousePosition.y, bDown ); + return true; + } + + case 1: + { + if ( bIsDoubleClick ) Gwen::HoveredControl->OnMouseDoubleClickRight( MousePosition.x, MousePosition.y ); + else Gwen::HoveredControl->OnMouseClickRight( MousePosition.x, MousePosition.y, bDown ); + return true; + } + } + + return false; +} + +bool Gwen::Input::HandleAccelerator( Controls::Base* pCanvas, Gwen::UnicodeChar chr ) +{ + //Build the accelerator search string + Gwen::UnicodeString accelString; + if ( Gwen::Input::IsControlDown() ) + accelString += L"Ctrl + "; + if ( Gwen::Input::IsShiftDown() ) + accelString += L"Shift + "; + + accelString += chr; + + //Debug::Msg("Accelerator string :%S\n", accelString.c_str()); + + if ( Gwen::KeyboardFocus && Gwen::KeyboardFocus->HandleAccelerator( accelString ) ) + return true; + + if ( Gwen::MouseFocus && Gwen::MouseFocus->HandleAccelerator( accelString ) ) + return true; + + if ( pCanvas->HandleAccelerator( accelString ) ) + return true; + + return false; +} + +bool Gwen::Input::DoSpecialKeys( Controls::Base* pCanvas, Gwen::UnicodeChar chr ) +{ + if ( !Gwen::KeyboardFocus ) return false; + if ( Gwen::KeyboardFocus->GetCanvas() != pCanvas ) return false; + if ( !Gwen::KeyboardFocus->Visible() ) return false; + if ( !Gwen::Input::IsControlDown() ) return false; + + if ( chr == L'C' || chr == L'c' ) + { + Gwen::KeyboardFocus->OnCopy(NULL); + return true; + } + + if ( chr == L'V' || chr == L'v' ) + { + Gwen::KeyboardFocus->OnPaste(NULL); + return true; + } + + if ( chr == L'X' || chr == L'x' ) + { + Gwen::KeyboardFocus->OnCut(NULL); + return true; + } + + if ( chr == L'A' || chr == L'a' ) + { + Gwen::KeyboardFocus->OnSelectAll(NULL); + return true; + } + + return false; +} + +bool Gwen::Input::OnKeyEvent( Controls::Base* pCanvas, int iKey, bool bDown ) +{ + if ( !Gwen::KeyboardFocus ) return false; + if ( Gwen::KeyboardFocus->GetCanvas() != pCanvas ) return false; + if ( !Gwen::KeyboardFocus->Visible() ) return false; + + if ( bDown ) + { + if ( !KeyData.KeyState[ iKey ] ) + { + KeyData.KeyState[ iKey ] = true; + KeyData.NextRepeat[ iKey ] = Gwen::Platform::GetTimeInSeconds() + KeyRepeatDelay; + KeyData.Target = KeyboardFocus; + + return KeyboardFocus->OnKeyPress( iKey ); + } + } + else + { + if ( KeyData.KeyState[ iKey ] ) + { + KeyData.KeyState[ iKey ] = false; + + // BUG BUG. This causes shift left arrow in textboxes + // to not work. What is disabling it here breaking? + //KeyData.Target = NULL; + + return KeyboardFocus->OnKeyRelease( iKey ); + } + } + + return false; +} \ No newline at end of file diff --git a/btgui/Gwen/premake4.lua b/btgui/Gwen/premake4.lua new file mode 100644 index 000000000..6978f6e2a --- /dev/null +++ b/btgui/Gwen/premake4.lua @@ -0,0 +1,18 @@ + project "gwen" + + kind "StaticLib" + + flags {"Unicode"} + + + + defines { "GWEN_COMPILE_STATIC" , "_HAS_EXCEPTIONS=0", "_STATIC_CPPLIB" } + + targetdir "../../lib" + includedirs { + ".",".." + } + files { + "**.cpp", + "**.h" + } diff --git a/btgui/GwenOpenGLTest/Apple/premake4.lua b/btgui/GwenOpenGLTest/Apple/premake4.lua new file mode 100644 index 000000000..b2f3ba578 --- /dev/null +++ b/btgui/GwenOpenGLTest/Apple/premake4.lua @@ -0,0 +1,51 @@ + if os.is("macosx") then + + project "Gwen_OpenGLTest_Apple" + + kind "ConsoleApp" + flags {"Unicode"} + + defines { "GWEN_COMPILE_STATIC" , "_HAS_EXCEPTIONS=0", "_STATIC_CPPLIB" } + + targetdir "../../../../bin" + + includedirs + { + + "../..","..","../../../rendertest","../../../../bullet2" + } + + initOpenGL() + initGlew() + + links { + "gwen","Cocoa.framework" + } + + + files { + "../../../rendertest/MacOpenGLWindow.mm", + "../../../rendertest/MacOpenGLWindow.h", + "../../../rendertest/TwFonts.cpp", + "../../../rendertest/TwFonts.h", + "../../../rendertest/LoadShader.cpp", + "../../../rendertest/LoadShader.h", + "../../../rendertest/GLPrimitiveRenderer.cpp", + "../../../rendertest/GLPrimitiveRenderer.h", + "../../../rendertest/GwenOpenGL3CoreRenderer.h", + "../../../OpenGLTrueTypeFont/fontstash.cpp", + "../../../OpenGLTrueTypeFont/fontstash.h", + "../../../OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp", + "../../../OpenGLTrueTypeFont/opengl_fontstashcallbacks.h", + "../../../../bullet2/LinearMath/btConvexHullComputer.cpp", + "../../../../bullet2/LinearMath/btConvexHullComputer.h", + "../../../../bullet2/LinearMath/btSerializer.cpp", + "../../../../bullet2/LinearMath/btSerializer.h", + "../../../../bullet2/LinearMath/btAlignedAllocator.cpp", + "../../../../bullet2/LinearMath/btQuickprof.cpp", + "../../../../bullet2/LinearMath/btQuickprof.h", + "../**.cpp", + "../**.h", + } + end + diff --git a/btgui/GwenOpenGLTest/Button.cpp b/btgui/GwenOpenGLTest/Button.cpp new file mode 100644 index 000000000..727670ed2 --- /dev/null +++ b/btgui/GwenOpenGLTest/Button.cpp @@ -0,0 +1,75 @@ +#include "UnitTest.h" + +using namespace Gwen; + +class Button : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( Button, GUnit ) + { + // Normal button + Controls::Button* pButtonA = new Controls::Button( this ); + pButtonA->SetText( L"Event Tester" ); + pButtonA->onPress.Add( this, &Button::onButtonA ); + + { + Controls::Button* pButtonA = new Controls::Button( this ); + pButtonA->SetBounds( 200, 30, 300, 200 ); + pButtonA->SetText( L"Event Tester" ); + pButtonA->onPress.Add( this, &Button::onButtonA ); + } + + // Unicode test + Controls::Button* pButtonB = new Controls::Button( this ); + pButtonB->SetText( L"\u0417\u0430\u043C\u0435\u0436\u043D\u0430\u044F \u043C\u043E\u0432\u0430" ); + Gwen::Align::PlaceBelow( pButtonB, pButtonA, 10 ); + + // Image with text + Controls::Button* pButtonC = new Controls::Button( this ); + pButtonC->SetText( L"Image Button" ); + pButtonC->SetImage( L"test16.png" ); + Gwen::Align::PlaceBelow( pButtonC, pButtonB, 10 ); + + // Just image + Controls::Button* pButtonD = new Controls::Button( this ); + pButtonD->SetText( L"" ); + pButtonD->SetImage( L"test16.png" ); + pButtonD->SetSize( 20, 20 ); + Gwen::Align::PlaceBelow( pButtonD, pButtonC, 10 ); + + // Toggle button + Controls::Button* pButtonE = new Controls::Button( this ); + pButtonE->SetText( L"Toggle Me" ); + pButtonE->SetIsToggle( true ); + pButtonE->onToggle.Add( this, &Button::OnToggle ); + pButtonE->onToggleOn.Add( this, &Button::OnToggleOn ); + pButtonE->onToggleOff.Add( this, &Button::OnToggleOff ); + Gwen::Align::PlaceBelow( pButtonE, pButtonD, 10 ); + } + + void onButtonA( Controls::Base* pControl ) + { + UnitPrint( L"Button Pressed (using 'OnPress' event)" ); + } + + void OnToggle( Controls::Base* pControl ) + { + UnitPrint( L"Button Toggled (using 'OnToggle' event)" ); + } + + void OnToggleOn( Controls::Base* pControl ) + { + UnitPrint( L"Button Toggled ON (using 'OnToggleOn' event)" ); + } + + void OnToggleOff( Controls::Base* pControl ) + { + UnitPrint( L"Button Toggled Off (using 'OnToggleOff' event)" ); + } + +}; + + + +DEFINE_UNIT_TEST( Button, L"Button" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/Checkbox.cpp b/btgui/GwenOpenGLTest/Checkbox.cpp new file mode 100644 index 000000000..b46a84b37 --- /dev/null +++ b/btgui/GwenOpenGLTest/Checkbox.cpp @@ -0,0 +1,48 @@ +#include "UnitTest.h" +#include "Gwen/Controls/CheckBox.h" + +using namespace Gwen; + +class Checkbox : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( Checkbox, GUnit ) + { + Gwen::Controls::CheckBox* check = new Gwen::Controls::CheckBox( this ); + check->SetPos( 10, 10 ); + check->onChecked.Add( this, &Checkbox::OnChecked ); + check->onUnChecked.Add( this, &Checkbox::OnUnchecked ); + check->onCheckChanged.Add( this, &Checkbox::OnCheckChanged ); + + + Gwen::Controls::CheckBoxWithLabel* labeled = new Gwen::Controls::CheckBoxWithLabel( this ); + labeled->SetPos( 10, 10 ); + labeled->Label()->SetText( "Labeled CheckBox" ); + labeled->Checkbox()->onChecked.Add( this, &Checkbox::OnChecked ); + labeled->Checkbox()->onUnChecked.Add( this, &Checkbox::OnUnchecked ); + labeled->Checkbox()->onCheckChanged.Add( this, &Checkbox::OnCheckChanged ); + Gwen::Align::PlaceBelow( labeled, check, 10 ); + + } + + void OnChecked( Controls::Base* pControl ) + { + UnitPrint( L"Checkbox Checked (using 'OnChecked' event)" ); + } + + void OnUnchecked( Controls::Base* pControl ) + { + UnitPrint( L"Checkbox Unchecked (using 'OnUnchecked' event)" ); + } + + void OnCheckChanged( Controls::Base* pControl ) + { + UnitPrint( L"Checkbox CheckChanged (using 'OnCheckChanged' event)" ); + } + +}; + + + +DEFINE_UNIT_TEST( Checkbox, L"Checkbox" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/ComboBox.cpp b/btgui/GwenOpenGLTest/ComboBox.cpp new file mode 100644 index 000000000..e4473c3a4 --- /dev/null +++ b/btgui/GwenOpenGLTest/ComboBox.cpp @@ -0,0 +1,57 @@ +#include "UnitTest.h" +#include "Gwen/Controls/ComboBox.h" + +using namespace Gwen; + +class ComboBox : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( ComboBox, GUnit ) + { + + { + Gwen::Controls::ComboBox* combo = new Gwen::Controls::ComboBox( this ); + combo->SetPos( 50, 50 ); + combo->SetWidth( 200 ); + + + combo->AddItem( L"Option One", "one" ); + combo->AddItem( L"Number Two", "two" ); + combo->AddItem( L"Door Three", "three" ); + combo->AddItem( L"Four Legs", "four" ); + combo->AddItem( L"Five Birds", "five" ); + + combo->onSelection.Add( this, &ComboBox::OnComboSelect ); + } + + { + // Empty.. + Gwen::Controls::ComboBox* combo = new Gwen::Controls::ComboBox( this ); + combo->SetPos( 50, 80 ); + combo->SetWidth( 200 ); + } + + { + // Empty.. + Gwen::Controls::ComboBox* combo = new Gwen::Controls::ComboBox( this ); + combo->SetPos( 50, 110 ); + combo->SetWidth( 200 ); + + for (int i=0; i<500; i++ ) + combo->AddItem( L"Lots Of Options" ); + } + + } + + void OnComboSelect( Gwen::Controls::Base* pControl ) + { + Gwen::Controls::ComboBox* combo = (Gwen::Controls::ComboBox*)pControl; + + UnitPrint( Utility::Format( L"Combo Changed: %s", combo->GetSelectedItem()->GetText().c_str() ) ); + } +}; + + + +DEFINE_UNIT_TEST( ComboBox, L"ComboBox" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/CrossSplitter.cpp b/btgui/GwenOpenGLTest/CrossSplitter.cpp new file mode 100644 index 000000000..dea72d466 --- /dev/null +++ b/btgui/GwenOpenGLTest/CrossSplitter.cpp @@ -0,0 +1,115 @@ +#include "UnitTest.h" +#include "Gwen/Controls/CrossSplitter.h" +#include "Gwen/Controls/StatusBar.h" +#include "Gwen/Controls/Button.h" + +using namespace Gwen; + +class CrossSplitter : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( CrossSplitter, GUnit ) + { + + m_bSplittersVisible = false; + m_iCurZoom = 0; + + m_Splitter = new Gwen::Controls::CrossSplitter( this ); + m_Splitter->SetPos(0, 0); + m_Splitter->Dock( Pos::Fill ); + + { + Gwen::Controls::Button* testButton = new Gwen::Controls::Button( m_Splitter ); + testButton->SetText( "TOPLEFT"); + m_Splitter->SetPanel( 0, testButton ); + } + + { + Gwen::Controls::Button* testButton = new Gwen::Controls::Button( m_Splitter ); + testButton->SetText( "TOPRIGHT"); + m_Splitter->SetPanel( 1, testButton ); + } + + { + Gwen::Controls::Button* testButton = new Gwen::Controls::Button( m_Splitter ); + testButton->SetText( "BOTTOMRIGHT"); + m_Splitter->SetPanel( 2, testButton ); + } + + { + Gwen::Controls::Button* testButton = new Gwen::Controls::Button( m_Splitter ); + testButton->SetText( "BOTTOMLEFT"); + m_Splitter->SetPanel( 3, testButton ); + } + + + //Status bar to hold unit testing buttons + Gwen::Controls::StatusBar* pStatus = new Gwen::Controls::StatusBar( this ); + pStatus->Dock( Pos::Bottom ); + + + { + Gwen::Controls::Button* pButton = new Gwen::Controls::Button( pStatus ); + pButton->SetText( "Zoom" ); + pButton->onPress.Add( this, &CrossSplitter::ZoomTest ); + pStatus->AddControl( pButton, false ); + } + + { + Gwen::Controls::Button* pButton = new Gwen::Controls::Button( pStatus ); + pButton->SetText( "UnZoom" ); + pButton->onPress.Add( this, &CrossSplitter::UnZoomTest ); + pStatus->AddControl( pButton, false ); + } + + { + Gwen::Controls::Button* pButton = new Gwen::Controls::Button( pStatus ); + pButton->SetText( "CenterPanels" ); + pButton->onPress.Add( this, &CrossSplitter::CenterPanels ); + pStatus->AddControl( pButton, true ); + } + + { + Gwen::Controls::Button* pButton = new Gwen::Controls::Button( pStatus ); + pButton->SetText( "Splitters" ); + pButton->onPress.Add( this, &CrossSplitter::ToggleSplitters ); + pStatus->AddControl( pButton, true ); + } + } + + void ZoomTest( Gwen::Controls::Base* pFromPanel ) + { + m_Splitter->Zoom(m_iCurZoom); + m_iCurZoom++; + if (m_iCurZoom == 4) + m_iCurZoom = 0; + } + + void UnZoomTest( Gwen::Controls::Base* pFromPanel ) + { + m_Splitter->UnZoom(); + } + + void CenterPanels( Gwen::Controls::Base* pFromPanel ) + { + m_Splitter->CenterPanels(); + m_Splitter->UnZoom(); + } + + void ToggleSplitters( Gwen::Controls::Base* pFromPanel ) + { + m_Splitter->SetSplittersVisible( !m_bSplittersVisible ); + m_bSplittersVisible = !m_bSplittersVisible; + } + + + bool m_bSplittersVisible; + int m_iCurZoom; + Controls::CrossSplitter* m_Splitter; + +}; + + + +DEFINE_UNIT_TEST( CrossSplitter, L"CrossSplitter" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/GroupBox.cpp b/btgui/GwenOpenGLTest/GroupBox.cpp new file mode 100644 index 000000000..f0a490162 --- /dev/null +++ b/btgui/GwenOpenGLTest/GroupBox.cpp @@ -0,0 +1,21 @@ +#include "UnitTest.h" +#include "Gwen/Controls/GroupBox.h" + +using namespace Gwen; + +class GroupBox2 : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( GroupBox2, GUnit ) + { + Gwen::Controls::GroupBox* pGroup = new Gwen::Controls::GroupBox( this ); + pGroup->Dock( Pos::Fill ); + pGroup->SetText( "Group Box" ); + } +}; + + + + +DEFINE_UNIT_TEST( GroupBox2, L"GroupBox" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/ImagePanel.cpp b/btgui/GwenOpenGLTest/ImagePanel.cpp new file mode 100644 index 000000000..015cfb307 --- /dev/null +++ b/btgui/GwenOpenGLTest/ImagePanel.cpp @@ -0,0 +1,32 @@ +#include "UnitTest.h" +#include "Gwen/Controls/ImagePanel.h" + +using namespace Gwen; + +class ImagePanel : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( ImagePanel, GUnit ) + { + // Normal + { + Controls::ImagePanel* img = new Controls::ImagePanel( this ); + img->SetImage( L"gwen.png" ); + img->SetBounds( 10, 10, 100, 100 ); + } + + // Missing + { + Controls::ImagePanel* img = new Controls::ImagePanel( this ); + img->SetImage( L"missingimage.png" ); + img->SetBounds( 120, 10, 100, 100 ); + } + + } + +}; + + + +DEFINE_UNIT_TEST( ImagePanel, L"ImagePanel" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/Label.cpp b/btgui/GwenOpenGLTest/Label.cpp new file mode 100644 index 000000000..a2301f1f2 --- /dev/null +++ b/btgui/GwenOpenGLTest/Label.cpp @@ -0,0 +1,99 @@ +#include "UnitTest.h" +#include "Gwen/Controls/Label.h" + +using namespace Gwen; + +class Label : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( Label, GUnit ) + { + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( "Garry's Normal Label" ); + label->SizeToContents(); + label->SetPos( 10, 10 ); + } + + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Chinese: \u4E45\u6709\u5F52\u5929\u613F \u7EC8\u8FC7\u9B3C\u95E8\u5173" ); + label->SizeToContents(); + label->SetPos( 10, 30 ); + } + + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Japanese: \u751F\u3080\u304E\u3000\u751F\u3054\u3081\u3000\u751F\u305F\u307E\u3054" ); + label->SizeToContents(); + label->SetPos( 10, 50 ); + } + + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Korean: \uADF9\uC9C0\uD0D0\uD5D8\u3000\uD611\uD68C\uACB0\uC131\u3000\uCCB4\uACC4\uC801\u3000\uC5F0\uAD6C" ); + label->SizeToContents(); + label->SetPos( 10, 70 ); + } + + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Hindi: \u092F\u0947 \u0905\u0928\u0941\u091A\u094D\u091B\u0947\u0926 \u0939\u093F\u0928\u094D\u0926\u0940 \u092E\u0947\u0902 \u0939\u0948\u0964" ); + label->SizeToContents(); + label->SetPos( 10, 90 ); + } + + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Arabic: \u0627\u0644\u0622\u0646 \u0644\u062D\u0636\u0648\u0631 \u0627\u0644\u0645\u0624\u062A\u0645\u0631 \u0627\u0644\u062F\u0648\u0644\u064A" ); + label->SizeToContents(); + label->SetPos( 10, 110 ); + } + + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Wow, Coloured Text" ); + label->SetTextColor( Gwen::Color( 0, 0, 255, 255 ) ); + label->SizeToContents(); + label->SetPos( 10, 130 ); + } + + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Coloured Text With Alpha" ); + label->SetTextColor( Gwen::Color( 0, 0, 255, 100 ) ); + label->SizeToContents(); + label->SetPos( 10, 150 ); + } + + { + // + // Note that when using a custom font, this font object has to stick around + // for the lifetime of the label. Rethink, or is that ideal? + // + m_Font.facename = L"Comic Sans MS"; + m_Font.size = 25; + + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Custom Font (Comic Sans 25)" ); + label->SetFont( &m_Font ); + label->SizeToContents(); + label->SetPos( 10, 170 ); + } + + { + Gwen::Controls::Label* label = new Gwen::Controls::Label( this ); + label->SetText( L"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." ); + label->SizeToContents(); + label->SetBounds( 300, 10, 150, 500 ); + } + + } + + Gwen::Font m_Font; +}; + + + +DEFINE_UNIT_TEST( Label, L"Label" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/ListBox.cpp b/btgui/GwenOpenGLTest/ListBox.cpp new file mode 100644 index 000000000..7072f89b2 --- /dev/null +++ b/btgui/GwenOpenGLTest/ListBox.cpp @@ -0,0 +1,71 @@ +#include "UnitTest.h" +#include "Gwen/Controls/ListBox.h" + +using namespace Gwen; + +class ListBox : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( ListBox, GUnit ) + { + { + Gwen::Controls::ListBox* ctrl = new Gwen::Controls::ListBox( this ); + ctrl->SetBounds( 10, 10, 100, 200 ); + + ctrl->AddItem( L"First" ); + ctrl->AddItem( L"Blue" ); + ctrl->AddItem( L"Yellow" ); + ctrl->AddItem( L"Orange" ); + ctrl->AddItem( L"Brown" ); + ctrl->AddItem( L"Green" ); + ctrl->AddItem( L"Dog" ); + ctrl->AddItem( L"Cat" ); + ctrl->AddItem( L"Shoes" ); + ctrl->AddItem( L"Chair" ); + ctrl->AddItem( L"Last" ); + + ctrl->onRowSelected.Add( this, &ThisClass::RowSelected ); + } + + { + Gwen::Controls::ListBox* ctrl = new Gwen::Controls::ListBox( this ); + ctrl->SetBounds( 120, 10, 200, 200 ); + ctrl->SetColumnCount( 3 ); + ctrl->SetAllowMultiSelect( true ); + ctrl->onRowSelected.Add( this, &ThisClass::RowSelected ); + + + { + Gwen::Controls::Layout::TableRow* pRow = ctrl->AddItem( L"Baked Beans" ); + pRow->SetCellText( 1, L"Heinz" ); + pRow->SetCellText( 2, L"£3.50" ); + } + + { + Gwen::Controls::Layout::TableRow* pRow = ctrl->AddItem( L"Bananas" ); + pRow->SetCellText( 1, L"Trees" ); + pRow->SetCellText( 2, L"£1.27" ); + } + + { + Gwen::Controls::Layout::TableRow* pRow = ctrl->AddItem( L"Chicken" ); + pRow->SetCellText( 1, L"\u5355\u5143\u6D4B\u8BD5" ); + pRow->SetCellText( 2, L"£8.95" ); + } + } + } + + void RowSelected( Gwen::Controls::Base* pControl ) + { + Gwen::Controls::ListBox* ctrl = (Gwen::Controls::ListBox*)pControl; + + UnitPrint( Utility::Format( L"Listbox Item Selected: %s", ctrl->GetSelectedRow()->GetText( 0 ).c_str() ) ); + } + + Gwen::Font m_Font; +}; + + + +DEFINE_UNIT_TEST( ListBox, L"ListBox" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/MenuStrip.cpp b/btgui/GwenOpenGLTest/MenuStrip.cpp new file mode 100644 index 000000000..14a8a1457 --- /dev/null +++ b/btgui/GwenOpenGLTest/MenuStrip.cpp @@ -0,0 +1,105 @@ +#include "UnitTest.h" +#include "Gwen/Controls/MenuStrip.h" + +using namespace Gwen; + +class MenuStrip : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( MenuStrip, GUnit ) + { + Gwen::Controls::MenuStrip* menu = new Gwen::Controls::MenuStrip( this ); + + { + Gwen::Controls::MenuItem* pRoot = menu->AddItem( L"File" ); + pRoot->GetMenu()->AddItem( L"New", L"test16.png", GWEN_MCALL( ThisClass::MenuItemSelect ) ); + pRoot->GetMenu()->AddItem( L"Load", L"test16.png", GWEN_MCALL( ThisClass::MenuItemSelect ) ); + pRoot->GetMenu()->AddItem( L"Save", GWEN_MCALL( ThisClass::MenuItemSelect ) ); + pRoot->GetMenu()->AddItem( L"Save As..", GWEN_MCALL( ThisClass::MenuItemSelect ) ); + pRoot->GetMenu()->AddItem( L"Quit", GWEN_MCALL( ThisClass::MenuItemSelect ) ); + } + + { + Gwen::Controls::MenuItem* pRoot = menu->AddItem( L"\u043F\u0438\u0440\u0430\u0442\u0441\u0442\u0432\u043E" ); + pRoot->GetMenu()->AddItem( L"\u5355\u5143\u6D4B\u8BD5", GWEN_MCALL( ThisClass::MenuItemSelect ) ); + pRoot->GetMenu()->AddItem( L"\u0111\u01A1n v\u1ECB th\u1EED nghi\u1EC7m", L"test16.png", GWEN_MCALL( ThisClass::MenuItemSelect ) ); + } + + { + Gwen::Controls::MenuItem* pRoot = menu->AddItem( L"Submenu" ); + + pRoot->GetMenu()->AddItem( "One" )->SetCheckable( true ); + + { + Gwen::Controls::MenuItem* pRootB = pRoot->GetMenu()->AddItem( "Two" ); + pRootB->GetMenu()->AddItem( "Two.One" ); + pRootB->GetMenu()->AddItem( "Two.Two" ); + pRootB->GetMenu()->AddItem( "Two.Three" ); + pRootB->GetMenu()->AddItem( "Two.Four" ); + pRootB->GetMenu()->AddItem( "Two.Five" ); + pRootB->GetMenu()->AddItem( "Two.Six" ); + pRootB->GetMenu()->AddItem( "Two.Seven" ); + pRootB->GetMenu()->AddItem( "Two.Eight" ); + pRootB->GetMenu()->AddItem( "Two.Nine", "test16.png" ); + } + + pRoot->GetMenu()->AddItem( "Three" ); + pRoot->GetMenu()->AddItem( "Four" ); + pRoot->GetMenu()->AddItem( "Five" ); + + { + Gwen::Controls::MenuItem* pRootB = pRoot->GetMenu()->AddItem( "Six" ); + pRootB->GetMenu()->AddItem( "Six.One" ); + pRootB->GetMenu()->AddItem( "Six.Two" ); + pRootB->GetMenu()->AddItem( "Six.Three" ); + pRootB->GetMenu()->AddItem( "Six.Four" ); + pRootB->GetMenu()->AddItem( "Six.Five", "test16.png" ); + + { + Gwen::Controls::MenuItem* pRootC = pRootB->GetMenu()->AddItem( "Six.Six" ); + pRootC->GetMenu()->AddItem( "Sheep" ); + pRootC->GetMenu()->AddItem( "Goose" ); + { + Gwen::Controls::MenuItem* pRootD = pRootC->GetMenu()->AddItem( "Camel" ); + pRootD->GetMenu()->AddItem( "Eyes" ); + pRootD->GetMenu()->AddItem( "Nose" ); + { + Gwen::Controls::MenuItem* pRootE = pRootD->GetMenu()->AddItem( "Hair" ); + pRootE->GetMenu()->AddItem( "Blonde" ); + pRootE->GetMenu()->AddItem( "Black" ); + { + Gwen::Controls::MenuItem* pRootF = pRootE->GetMenu()->AddItem( "Red" ); + pRootF->GetMenu()->AddItem( "Light" ); + pRootF->GetMenu()->AddItem( "Medium" ); + pRootF->GetMenu()->AddItem( "Dark" ); + } + pRootE->GetMenu()->AddItem( "Brown" ); + } + pRootD->GetMenu()->AddItem( "Ears" ); + } + pRootC->GetMenu()->AddItem( "Duck" ); + } + + pRootB->GetMenu()->AddItem( "Six.Seven" ); + pRootB->GetMenu()->AddItem( "Six.Eight" ); + pRootB->GetMenu()->AddItem( "Six.Nine" ); + } + + pRoot->GetMenu()->AddItem( "Seven" ); + + } + } + + void MenuItemSelect( Base* pControl ) + { + Gwen::Controls::MenuItem* pMenuItem = (Gwen::Controls::MenuItem*)pControl; + + UnitPrint( Utility::Format( L"Menu Selected: %s", pMenuItem->GetText().c_str() ) ); + } + +}; + + + +DEFINE_UNIT_TEST( MenuStrip, L"MenuStrip" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/Numeric.cpp b/btgui/GwenOpenGLTest/Numeric.cpp new file mode 100644 index 000000000..f7a1c85eb --- /dev/null +++ b/btgui/GwenOpenGLTest/Numeric.cpp @@ -0,0 +1,31 @@ +#include "UnitTest.h" +#include "Gwen/Controls/NumericUpDown.h" + +using namespace Gwen; + +class Numeric : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( Numeric, GUnit ) + { + + Controls::NumericUpDown* pCtrl = new Controls::NumericUpDown( this ); + pCtrl->SetBounds( 10, 10, 50, 20 ); + pCtrl->SetValue( 50 ); + pCtrl->SetMax( 1000 ); + pCtrl->SetMin( -1000 ); + + // pCtrl->onPress.Add( this, &ThisClass::onButtonA ); + } + + void onButtonA( Controls::Base* pControl ) + { + // UnitPrint( L"Button Pressed (using 'OnPress' event)" ); + } + +}; + + + +DEFINE_UNIT_TEST( Numeric, L"Numeric" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/OpenGLSample.cpp b/btgui/GwenOpenGLTest/OpenGLSample.cpp new file mode 100644 index 000000000..06237a07e --- /dev/null +++ b/btgui/GwenOpenGLTest/OpenGLSample.cpp @@ -0,0 +1,364 @@ + + +#include "Gwen/Gwen.h" +#include "Gwen/Skins/Simple.h" + +#include "UnitTest.h" + +extern char OpenSansData[]; + +#ifdef __APPLE__ +#include "OpenGLWindow/MacOpenGLWindow.h" +#else + +#include "GL/glew.h" +#ifdef _WIN32 +#include "OpenGLWindow/Win32OpenGLWindow.h" +#else +//let's cross the fingers it is Linux/X11 +#include "OpenGLWindow/X11OpenGLWindow.h" +#endif //_WIN32 +#endif//__APPLE__ + +#include "OpenGLTrueTypeFont/opengl_fontstashcallbacks.h" + +#include "OpenGLWindow/GwenOpenGL3CoreRenderer.h" +#include "OpenGLWindow/GLPrimitiveRenderer.h" +#include + +Gwen::Controls::Canvas* pCanvas = NULL; + +void MyMouseMoveCallback( float x, float y) +{ + //btDefaultMouseCallback(button,state,x,y); + + static int m_lastmousepos[2] = {0,0}; + static bool isInitialized = false; + if (pCanvas) + { + if (!isInitialized) + { + isInitialized = true; + m_lastmousepos[0] = x+1; + m_lastmousepos[1] = y+1; + } + bool handled = pCanvas->InputMouseMoved(x,y,m_lastmousepos[0],m_lastmousepos[1]); + } +} + +void MyMouseButtonCallback(int button, int state, float x, float y) +{ + //btDefaultMouseCallback(button,state,x,y); + + if (pCanvas) + { + bool handled = pCanvas->InputMouseMoved(x,y,x, y); + + if (button>=0) + { + handled = pCanvas->InputMouseButton(button,state); + if (handled) + { + if (!state) + return; + } + } + } +} + +int sWidth = 1050; +int sHeight = 768; + + + int droidRegular;//, droidItalic, droidBold, droidJapanese, dejavu; + +sth_stash* initFont(GLPrimitiveRenderer* primRenderer) +{ + GLint err; + + struct sth_stash* stash = 0; + OpenGL2RenderCallbacks* renderCallbacks = new OpenGL2RenderCallbacks(primRenderer); + + stash = sth_create(512,512,renderCallbacks);//256,256);//,1024);//512,512); + err = glGetError(); + assert(err==GL_NO_ERROR); + + if (!stash) + { + fprintf(stderr, "Could not create stash.\n"); + return 0; + } + + +#ifdef LOAD_FONTS_FROM_FILE + int datasize; + unsigned char* data; + float sx,sy,dx,dy,lh; + GLuint texture; + + + + const char* fontPaths[]={ + "./", + "../../bin/", + "../bin/", + "bin/" + }; + + int numPaths=sizeof(fontPaths)/sizeof(char*); + + // Load the first truetype font from memory (just because we can). + + FILE* fp = 0; + const char* fontPath ="./"; + char fullFontFileName[1024]; + + for (int i=0;icreateWindow(wci); + window->setWindowTitle("render test"); +#ifndef __APPLE__ + glewInit(); +#endif + + retinaScale = window->getRetinaScale(); + + GLPrimitiveRenderer* primRenderer = new GLPrimitiveRenderer(sWidth,sHeight); + + sth_stash* font = initFont(primRenderer ); + + + GwenOpenGL3CoreRenderer* gwenRenderer = new GwenOpenGL3CoreRenderer(primRenderer,font,sWidth,sHeight,retinaScale); + + + // + // Create a GWEN OpenGL Renderer + // +// Gwen::Renderer::OpenGL_DebugFont * pRenderer = new Gwen::Renderer::OpenGL_DebugFont(); + + // + // Create a GWEN skin + // + + +#ifdef USE_TEXTURED_SKIN + Gwen::Skin::TexturedBase skin; + skin.SetRender( pRenderer ); + skin.Init("DefaultSkin.png"); +#else + Gwen::Skin::Simple skin; + skin.SetRender( gwenRenderer ); +#endif + + + // + // Create a Canvas (it's root, on which all other GWEN panels are created) + // + pCanvas = new Gwen::Controls::Canvas( &skin ); + pCanvas->SetSize( sWidth, sHeight); + pCanvas->SetDrawBackground( true ); + pCanvas->SetBackgroundColor( Gwen::Color( 150, 170, 170, 255 ) ); + + window->setMouseButtonCallback(MyMouseButtonCallback); + window->setMouseMoveCallback(MyMouseMoveCallback); + + + // + // Create our unittest control (which is a Window with controls in it) + // + UnitTest* pUnit = new UnitTest( pCanvas ); + pUnit->SetPos( 10, 10 ); + + // + // Create a Windows Control helper + // (Processes Windows MSG's and fires input at GWEN) + // + //Gwen::Input::Windows GwenInput; + //GwenInput.Initialize( pCanvas ); + + // + // Begin the main game loop + // +// MSG msg; + while( !window->requestedExit() ) + { + // Skip out if the window is closed + //if ( !IsWindowVisible( g_pHWND ) ) + //break; + + // If we have a message from windows.. + // if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) + { + + // .. give it to the input handler to process + // GwenInput.ProcessMessage( msg ); + + // if it's QUIT then quit.. + // if ( msg.message == WM_QUIT ) + // break; + + // Handle the regular window stuff.. + // TranslateMessage(&msg); + // DispatchMessage(&msg); + + } + + window->startRendering(); + + // Main OpenGL Render Loop + { + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glEnable(GL_BLEND); + GLint err = glGetError(); + assert(err==GL_NO_ERROR); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + err = glGetError(); + assert(err==GL_NO_ERROR); + + err = glGetError(); + assert(err==GL_NO_ERROR); + + glDisable(GL_DEPTH_TEST); + err = glGetError(); + assert(err==GL_NO_ERROR); + + //glColor4ub(255,0,0,255); + + err = glGetError(); + assert(err==GL_NO_ERROR); + + + err = glGetError(); + assert(err==GL_NO_ERROR); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + // saveOpenGLState(width,height);//m_glutScreenWidth,m_glutScreenHeight); + + err = glGetError(); + assert(err==GL_NO_ERROR); + + + err = glGetError(); + assert(err==GL_NO_ERROR); + + glDisable(GL_CULL_FACE); + + glDisable(GL_DEPTH_TEST); + err = glGetError(); + assert(err==GL_NO_ERROR); + + err = glGetError(); + assert(err==GL_NO_ERROR); + + glEnable(GL_BLEND); + + + err = glGetError(); + assert(err==GL_NO_ERROR); + + + + pCanvas->RenderCanvas(); + + // SwapBuffers( GetDC( g_pHWND ) ); + } + window->endRendering(); + + } + + window->closeWindow(); + delete window; + + +} diff --git a/btgui/GwenOpenGLTest/PanelListPanel.cpp b/btgui/GwenOpenGLTest/PanelListPanel.cpp new file mode 100644 index 000000000..fcf1ae316 --- /dev/null +++ b/btgui/GwenOpenGLTest/PanelListPanel.cpp @@ -0,0 +1,61 @@ +#include "UnitTest.h" +#include "Gwen/Controls/PanelListPanel.h" +#include "Gwen/Controls/StatusBar.h" +#include "Gwen/Utility.h" + +using namespace Gwen; + +class PanelListPanel : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( PanelListPanel, GUnit ) + { + m_PLP = new Gwen::Controls::PanelListPanel( this ); + m_PLP->Dock( Pos::Fill ); + m_PLP->SetPadding( Gwen::Padding( 10, 10 )); + m_PLP->SetVertical(); + m_PLP->SetSizeToChildren( false ); + + for ( int i = 0; i < 16; i++) + { + Gwen::String testName = "TEST" + Utility::ToString( i ); + Gwen::Controls::Button* testButton = new Gwen::Controls::Button( m_PLP ); + testButton->SetText( testName ); + } + + Gwen::Controls::StatusBar* pStatus = new Gwen::Controls::StatusBar( this ); + pStatus->Dock( Pos::Bottom ); + + { + Gwen::Controls::Button* pButton = new Gwen::Controls::Button( pStatus ); + pButton->SetText( "Horizontal" ); + pButton->onPress.Add( this, &PanelListPanel::GoHorizontal ); + pStatus->AddControl( pButton, false ); + } + + { + Gwen::Controls::Button* pButton = new Gwen::Controls::Button( pStatus ); + pButton->SetText( "Vertical" ); + pButton->onPress.Add( this, &PanelListPanel::GoVertical ); + pStatus->AddControl( pButton, true ); + } + } + + + void GoVertical( Gwen::Controls::Base* pFromPanel ) + { + m_PLP->SetVertical(); + } + + void GoHorizontal( Gwen::Controls::Base* pFromPanel ) + { + m_PLP->SetHorizontal(); + } + + Gwen::Controls::PanelListPanel* m_PLP; +}; + + + +DEFINE_UNIT_TEST( PanelListPanel, L"PanelListPanel" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/ProgressBar.cpp b/btgui/GwenOpenGLTest/ProgressBar.cpp new file mode 100644 index 000000000..ed72c3e19 --- /dev/null +++ b/btgui/GwenOpenGLTest/ProgressBar.cpp @@ -0,0 +1,93 @@ +#include "UnitTest.h" +#include "Gwen/Controls/RadioButtonController.h" +#include "Gwen/Controls/ProgressBar.h" + +using namespace Gwen; + +class ProgressBar : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( ProgressBar, GUnit ) + { + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 110, 20, 200, 20 ) ); + pb->SetValue( 0.27f ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 110, 50, 200, 20 ) ); + pb->SetValue( 0.66f ); + pb->SetAlignment( Pos::Right | Pos::CenterV ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 110, 80, 200, 20 ) ); + pb->SetValue( 0.88f ); + pb->SetAlignment( Pos::Left | Pos::CenterV ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 110, 110, 200, 20 ) ); + pb->SetAutoLabel( false ); + pb->SetValue( 0.20f ); + pb->SetAlignment( Pos::Right | Pos::CenterV ); + pb->SetText( L"40,245 MB" ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 110, 140, 200, 20 ) ); + pb->SetAutoLabel( false ); + pb->SetValue( 1.00f ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 110, 170, 200, 20 ) ); + pb->SetAutoLabel( false ); + pb->SetValue( 0.00f ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 110, 200, 200, 20 ) ); + pb->SetAutoLabel( false ); + pb->SetValue( 0.50f ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 20, 20, 25, 200 ) ); + pb->SetVertical(); + pb->SetValue( 0.25f ); + pb->SetAlignment( Pos::Top | Pos::CenterH ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 50, 20, 25, 200 ) ); + pb->SetVertical(); + pb->SetValue( 0.40f ); + } + + { + Gwen::Controls::ProgressBar* pb = new Gwen::Controls::ProgressBar( this ); + pb->SetBounds( Gwen::Rect( 80, 20, 25, 200 ) ); + pb->SetVertical(); + pb->SetAlignment( Pos::Bottom | Pos::CenterH ); + pb->SetValue( 0.65f ); + } + + } + +}; + + + +DEFINE_UNIT_TEST( ProgressBar, L"ProgressBar" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/Properties.cpp b/btgui/GwenOpenGLTest/Properties.cpp new file mode 100644 index 000000000..c909db388 --- /dev/null +++ b/btgui/GwenOpenGLTest/Properties.cpp @@ -0,0 +1,63 @@ +#include "UnitTest.h" +#include "Gwen/Controls/Properties.h" +#include "Gwen/Controls/PropertyTree.h" + +using namespace Gwen; + +class Properties2 : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( Properties2, GUnit ) + { + { + Gwen::Controls::Properties* props = new Gwen::Controls::Properties( this ); + + props->SetBounds( 10, 10, 150, 300 ); + + { + { + Gwen::Controls::PropertyRow* pRow = props->Add( L"First Name" ); + pRow->onChange.Add( this, &Properties2::OnFirstNameChanged ); + } + + props->Add( L"Middle Name" ); + props->Add( L"Last Name" ); + } + + } + + { + Gwen::Controls::PropertyTree* ptree = new Gwen::Controls::PropertyTree( this ); + ptree->SetBounds( 200, 10, 200, 200 ); + + { + Gwen::Controls::Properties* props = ptree->Add( L"Item One" ); + props->Add( L"Middle Name" ); + props->Add( L"Last Name" ); + props->Add( L"Four" ); + } + + { + Gwen::Controls::Properties* props = ptree->Add( L"Item Two" ); + props->Add( L"More Items" ); + props->Add( L"To Fill" ); + props->Add( L"Out Here" ); + } + + ptree->ExpandAll(); + + } + } + + void OnFirstNameChanged( Controls::Base* pControl ) + { + Gwen::Controls::PropertyRow* pRow = (Gwen::Controls::PropertyRow*) pControl; + UnitPrint( Utility::Format( L"First Name Changed: %s", pRow->GetProperty()->GetPropertyValue().c_str() ) ); + } + +}; + + + +DEFINE_UNIT_TEST( Properties2, L"Properties" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/RadioButton.cpp b/btgui/GwenOpenGLTest/RadioButton.cpp new file mode 100644 index 000000000..5d4948dd0 --- /dev/null +++ b/btgui/GwenOpenGLTest/RadioButton.cpp @@ -0,0 +1,38 @@ +#include "UnitTest.h" +#include "Gwen/Controls/RadioButtonController.h" + +using namespace Gwen; + +class RadioButton2 : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( RadioButton2, GUnit ) + { + + Gwen::Controls::RadioButtonController* rc = new Gwen::Controls::RadioButtonController( this ); + + rc->AddOption( "Option 1" ); + rc->AddOption( "Option 2" ); + rc->AddOption( "Option 3" ); + rc->AddOption( L"\u0627\u0644\u0622\u0646 \u0644\u062D\u0636\u0648\u0631" ); + + rc->SetBounds( 30, 30, 200, 200 ); + + rc->onSelectionChange.Add( this, &RadioButton2::OnChange ); + + + } + + void OnChange( Controls::Base* pControl ) + { + Gwen::Controls::RadioButtonController* rc = (Gwen::Controls::RadioButtonController*) pControl; + Gwen::Controls::LabeledRadioButton* pSelected = rc->GetSelected(); + + UnitPrint( Utility::Format( L"RadioButton changed (using 'OnChange' event)\n Chosen Item: '%s'", pSelected->GetLabel()->GetText().c_str() ) ); + } +}; + + + +DEFINE_UNIT_TEST( RadioButton2, L"RadioButton" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/ScrollControl.cpp b/btgui/GwenOpenGLTest/ScrollControl.cpp new file mode 100644 index 000000000..c21a2080a --- /dev/null +++ b/btgui/GwenOpenGLTest/ScrollControl.cpp @@ -0,0 +1,138 @@ +#include "UnitTest.h" +#include "Gwen/Controls/ScrollControl.h" + +using namespace Gwen; + +class ScrollControl : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( ScrollControl, GUnit ) + { + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 10, 10, 100, 100 ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Twice As Big" ); + pTestButton->SetBounds( 0, 0, 200, 200 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 110, 10, 100, 100 ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Same Size" ); + pTestButton->SetBounds( 0, 0, 100, 100 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 210, 10, 100, 100 ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Wide" ); + pTestButton->SetBounds( 0, 0, 200, 50 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 310, 10, 100, 100 ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Tall" ); + pTestButton->SetBounds( 0, 0, 50, 200 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 410, 10, 100, 100 ); + pCtrl->SetScroll( false, true ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Vertical" ); + pTestButton->SetBounds( 0, 0, 200, 200 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 510, 10, 100, 100 ); + pCtrl->SetScroll( true, false ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Horinzontal" ); + pTestButton->SetBounds( 0, 0, 200, 200 ); + } + + // Bottom Row + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 10, 110, 100, 100 ); + pCtrl->SetAutoHideBars( true ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Twice As Big" ); + pTestButton->SetBounds( 0, 0, 200, 200 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 110, 110, 100, 100 ); + pCtrl->SetAutoHideBars( true ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Same Size" ); + pTestButton->SetBounds( 0, 0, 100, 100 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 210, 110, 100, 100 ); + pCtrl->SetAutoHideBars( true ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Wide" ); + pTestButton->SetBounds( 0, 0, 200, 50 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 310, 110, 100, 100 ); + pCtrl->SetAutoHideBars( true ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Tall" ); + pTestButton->SetBounds( 0, 0, 50, 200 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 410, 110, 100, 100 ); + pCtrl->SetAutoHideBars( true ); + pCtrl->SetScroll( false, true ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Vertical" ); + pTestButton->SetBounds( 0, 0, 200, 200 ); + } + + { + Gwen::Controls::ScrollControl* pCtrl = new Gwen::Controls::ScrollControl( this ); + pCtrl->SetBounds( 510, 110, 100, 100 ); + pCtrl->SetAutoHideBars( true ); + pCtrl->SetScroll( true, false ); + + Controls::Button* pTestButton = new Controls::Button( pCtrl ); + pTestButton->SetText( L"Horinzontal" ); + pTestButton->SetBounds( 0, 0, 200, 200 ); + } + } + +}; + + + +DEFINE_UNIT_TEST( ScrollControl, L"Scroll" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/Slider.cpp b/btgui/GwenOpenGLTest/Slider.cpp new file mode 100644 index 000000000..cf002fa86 --- /dev/null +++ b/btgui/GwenOpenGLTest/Slider.cpp @@ -0,0 +1,66 @@ +#include "UnitTest.h" +#include "Gwen/Controls/RadioButtonController.h" +#include "Gwen/Controls/VerticalSlider.h" +#include "Gwen/Controls/HorizontalSlider.h" + +using namespace Gwen; + +class Slider : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( Slider, GUnit ) + { + { + Gwen::Controls::HorizontalSlider* pSlider = new Gwen::Controls::HorizontalSlider( this ); + pSlider->SetPos( 10, 10 ); + pSlider->SetSize( 150, 20 ); + pSlider->SetRange( 0, 100 ); + pSlider->SetValue( 25 ); + pSlider->onValueChanged.Add( this, &Slider::SliderMoved ); + } + + { + Gwen::Controls::HorizontalSlider* pSlider = new Gwen::Controls::HorizontalSlider( this ); + pSlider->SetPos( 10, 40 ); + pSlider->SetSize( 150, 20 ); + pSlider->SetRange( 0, 100 ); + pSlider->SetValue( 25 ); + pSlider->SetNotchCount( 10 ); + pSlider->SetClampToNotches( true ); + pSlider->onValueChanged.Add( this, &Slider::SliderMoved ); + } + + { + Gwen::Controls::VerticalSlider* pSlider = new Gwen::Controls::VerticalSlider( this ); + pSlider->SetPos( 160, 10 ); + pSlider->SetSize( 20, 200 ); + pSlider->SetRange( 0, 100 ); + pSlider->SetValue( 25 ); + pSlider->onValueChanged.Add( this, &Slider::SliderMoved ); + } + + { + Gwen::Controls::VerticalSlider* pSlider = new Gwen::Controls::VerticalSlider( this ); + pSlider->SetPos( 190, 10 ); + pSlider->SetSize( 20, 200 ); + pSlider->SetRange( 0, 100 ); + pSlider->SetValue( 25 ); + pSlider->SetNotchCount( 10 ); + pSlider->SetClampToNotches( true ); + pSlider->onValueChanged.Add( this, &Slider::SliderMoved ); + } + } + + void SliderMoved( Base* pControl ) + { + Gwen::Controls::Slider* pSlider = (Gwen::Controls::Slider*)pControl; + + UnitPrint( Utility::Format( L"Slider Value: %.2f", pSlider->GetValue() ) ); + } + +}; + + + +DEFINE_UNIT_TEST( Slider, L"Slider" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/StatusBar.cpp b/btgui/GwenOpenGLTest/StatusBar.cpp new file mode 100644 index 000000000..902553739 --- /dev/null +++ b/btgui/GwenOpenGLTest/StatusBar.cpp @@ -0,0 +1,28 @@ +#include "UnitTest.h" +#include "Gwen/Controls/StatusBar.h" +#include "Gwen/Controls/Label.h" + +using namespace Gwen; + +class StatusBar : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( StatusBar, GUnit ) + { + Gwen::Controls::StatusBar* pStatus = new Gwen::Controls::StatusBar( this ); + pStatus->Dock( Pos::Bottom ); + + Gwen::Controls::Label* pLeft = new Gwen::Controls::Label( pStatus ); + pLeft->SetText(L"Label Added to left"); + pStatus->AddControl( pLeft, false ); + + Gwen::Controls::Label* pRight = new Gwen::Controls::Label( pStatus ); + pRight->SetText(L"Label Added to Right"); + pStatus->AddControl( pRight, true ); + } +}; + + + +DEFINE_UNIT_TEST( StatusBar, L"StatusBar" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/TabControl.cpp b/btgui/GwenOpenGLTest/TabControl.cpp new file mode 100644 index 000000000..8ed2b2ba6 --- /dev/null +++ b/btgui/GwenOpenGLTest/TabControl.cpp @@ -0,0 +1,71 @@ +#include "UnitTest.h" +#include "Gwen/Controls/TabControl.h" +#include "Gwen/Controls/RadioButtonController.h" + +using namespace Gwen; + +class TabControl2 : public GUnit +{ + public: + + Controls::TabControl* m_pDockControlLeft; + + GWEN_CONTROL_INLINE( TabControl2, GUnit ) + { + { + m_pDockControlLeft = new Controls::TabControl( this ); + m_pDockControlLeft->SetBounds( 10, 10, 200, 200 ); + + { + Controls::TabButton* pButton = m_pDockControlLeft->AddPage( L"Controls" ); + Base* pPage = pButton->GetPage(); + + { + Controls::RadioButtonController* pRadio = new Controls::RadioButtonController( pPage ); + pRadio->SetBounds( 10, 10, 100, 100 ); + + pRadio->AddOption( "Top" )->Select(); + pRadio->AddOption( "Bottom" ); + pRadio->AddOption( "Left" ); + pRadio->AddOption( "Right" ); + + pRadio->onSelectionChange.Add( this, &ThisClass::OnDockChange ); + + } + } + + m_pDockControlLeft->AddPage( L"Red" ); + m_pDockControlLeft->AddPage( L"Green" ); + m_pDockControlLeft->AddPage( L"Blue" ); + } + + { + Controls::TabControl* pDragMe = new Controls::TabControl( this ); + pDragMe->SetBounds( 220, 10, 200, 200 ); + + pDragMe->AddPage( L"You" ); + pDragMe->AddPage( L"Can" ); + pDragMe->AddPage( L"Reorder" )->SetImage( L"test16.png" ); + pDragMe->AddPage( L"These" ); + pDragMe->AddPage( L"Tabs" ); + + pDragMe->SetAllowReorder( true ); + } + } + + void OnDockChange( Gwen::Controls::Base* pControl ) + { + Gwen::Controls::RadioButtonController* rc = (Gwen::Controls::RadioButtonController*) pControl; + + if ( rc->GetSelectedLabel() == L"Top" ) m_pDockControlLeft->SetTabStripPosition( Pos::Top ); + if ( rc->GetSelectedLabel() == L"Bottom" ) m_pDockControlLeft->SetTabStripPosition( Pos::Bottom ); + if ( rc->GetSelectedLabel() == L"Left" ) m_pDockControlLeft->SetTabStripPosition( Pos::Left ); + if ( rc->GetSelectedLabel() == L"Right" ) m_pDockControlLeft->SetTabStripPosition( Pos::Right ); + } + + Gwen::Font m_Font; +}; + + + +DEFINE_UNIT_TEST( TabControl2, L"TabControl" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/TextBox.cpp b/btgui/GwenOpenGLTest/TextBox.cpp new file mode 100644 index 000000000..72b49adc9 --- /dev/null +++ b/btgui/GwenOpenGLTest/TextBox.cpp @@ -0,0 +1,79 @@ +#include "UnitTest.h" +#include "Gwen/Controls/TextBox.h" + +using namespace Gwen; + +class TextBox : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( TextBox, GUnit ) + { + { + Gwen::Controls::TextBox* label = new Gwen::Controls::TextBox( this ); + label->SetText( "" ); + label->SetPos( 10, 10 ); + label->onTextChanged.Add( this, &ThisClass::OnEdit ); + label->onReturnPressed.Add( this, &ThisClass::OnSubmit ); + + } + + { + Gwen::Controls::TextBox* label = new Gwen::Controls::TextBox( this ); + label->SetText( "Normal Everyday Label" ); + label->SetPos( 10, 10 + 25 ); + } + + { + Gwen::Controls::TextBox* label = new Gwen::Controls::TextBox( this ); + label->SetText( "Select All Text On Focus" ); + label->SetPos( 10, 10 + 25 * 2 ); + label->SetSelectAllOnFocus( true ); + } + + { + Gwen::Controls::TextBox* label = new Gwen::Controls::TextBox( this ); + label->SetText( L"Different Coloured Text, for some reason" ); + label->SetTextColor( Gwen::Color( 255, 0, 255, 255 ) ); + label->SetPos( 10, 10 + 25 * 3 ); + } + + { + Gwen::Controls::TextBoxNumeric* label = new Gwen::Controls::TextBoxNumeric( this ); + label->SetText( L"2004" ); + label->SetTextColor( Gwen::Color( 255, 0, 255, 255 ) ); + label->SetPos( 10, 10 + 25 * 4 ); + } + + { + m_Font.facename = L"Impact"; + m_Font.size = 50; + + Gwen::Controls::TextBox* label = new Gwen::Controls::TextBox( this ); + label->SetText( L"Different Font" ); + label->SetPos( 10, 10 + 25 * 5 ); + label->SetFont( &m_Font ); + label->SetSize( 200, 55 ); + } + + + } + + void OnEdit( Gwen::Controls::Base* pControl ) + { + Gwen::Controls::TextBox* textbox = (Gwen::Controls::TextBox*) (pControl); + UnitPrint( Utility::Format( L"Textbox Edit: [%s]\n", textbox->GetText().c_str() ) ); + } + + void OnSubmit( Gwen::Controls::Base* pControl ) + { + Gwen::Controls::TextBox* textbox = (Gwen::Controls::TextBox*) (pControl); + UnitPrint( Utility::Format( L"Textbox Submit: [%s]\n", textbox->GetText().c_str() ) ); + } + + Gwen::Font m_Font; +}; + + + +DEFINE_UNIT_TEST( TextBox, L"TextBox" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/TreeControl.cpp b/btgui/GwenOpenGLTest/TreeControl.cpp new file mode 100644 index 000000000..9892c98df --- /dev/null +++ b/btgui/GwenOpenGLTest/TreeControl.cpp @@ -0,0 +1,56 @@ +#include "UnitTest.h" +#include "Gwen/Controls/TreeControl.h" + +using namespace Gwen; + +using namespace Gwen::Controls; + + +class TreeControl2 : public GUnit +{ + public: + + GWEN_CONTROL_INLINE( TreeControl2, GUnit ) + { + { + Gwen::Controls::TreeControl* ctrl = new Gwen::Controls::TreeControl( this ); + + ctrl->AddNode( L"Node One" ); + Gwen::Controls::TreeNode* pNode = ctrl->AddNode( L"Node Two" ); + pNode->AddNode( L"Node Two Inside" ); + pNode->AddNode( L"Eyes" ); + pNode->AddNode( L"Brown" )->AddNode( L"Node Two Inside" )->AddNode( L"Eyes" )->AddNode( L"Brown" ); + ctrl->AddNode( L"Node Three" ); + + ctrl->SetBounds( 30, 30, 200, 200 ); + ctrl->ExpandAll(); + } + + { + Gwen::Controls::TreeControl* ctrl = new Gwen::Controls::TreeControl( this ); + + ctrl->AllowMultiSelect( true ); + + ctrl->AddNode( L"Node One" ); + Gwen::Controls::TreeNode* pNode = ctrl->AddNode( L"Node Two" ); + pNode->AddNode( L"Node Two Inside" ); + pNode->AddNode( L"Eyes" ); + Gwen::Controls::TreeNode* pNodeTwo = pNode->AddNode( L"Brown" )->AddNode( L"Node Two Inside" )->AddNode( L"Eyes" ); + pNodeTwo->AddNode( L"Brown" ); + pNodeTwo->AddNode( L"Green" ); + pNodeTwo->AddNode( L"Slime" ); + pNodeTwo->AddNode( L"Grass" ); + pNodeTwo->AddNode( L"Pipe" ); + + ctrl->AddNode( L"Node Three" ); + + ctrl->SetBounds( 240, 30, 200, 200 ); + ctrl->ExpandAll(); + } + } + +}; + + + +DEFINE_UNIT_TEST( TreeControl2, L"TreeControl" ); \ No newline at end of file diff --git a/btgui/GwenOpenGLTest/UnitTest.cpp b/btgui/GwenOpenGLTest/UnitTest.cpp new file mode 100644 index 000000000..97d23992d --- /dev/null +++ b/btgui/GwenOpenGLTest/UnitTest.cpp @@ -0,0 +1,100 @@ +/* + GWEN + Copyright (c) 2010 Facepunch Studios + See license in Gwen.h +*/ + +#include "UnitTest.h" +#include "Gwen/Platform.h" + +using namespace Gwen; + +#define ADD_UNIT_TEST( name )\ + GUnit* RegisterUnitTest_##name( Gwen::Controls::TabControl* tab );\ + RegisterUnitTest_##name( m_TabControl )->SetUnitTest( this ); + +GWEN_CONTROL_CONSTRUCTOR( UnitTest ) +{ + SetTitle( L"GWEN Unit Test" ); + + SetSize( 600, 450 ); + + m_TabControl = new Controls::TabControl( this ); + m_TabControl->Dock( Pos::Fill ); + m_TabControl->SetMargin( Margin( 2, 2, 2, 2 ) ); + + m_TextOutput = new Controls::ListBox( this ); + m_TextOutput->Dock( Pos::Bottom ); + m_TextOutput->SetHeight( 100 ); + + + //ADD_UNIT_TEST( MenuStrip ); + + ADD_UNIT_TEST( TreeControl2 ); + + ADD_UNIT_TEST( Properties2 ); + + + ADD_UNIT_TEST( TabControl2 ); + ADD_UNIT_TEST( ScrollControl ); + ADD_UNIT_TEST( MenuStrip ); + ADD_UNIT_TEST( Numeric ); + ADD_UNIT_TEST( ComboBox ); + ADD_UNIT_TEST( TextBox ); + ADD_UNIT_TEST( ListBox ); + ADD_UNIT_TEST( Slider ); + ADD_UNIT_TEST( ProgressBar ); + ADD_UNIT_TEST( RadioButton2 ); + ADD_UNIT_TEST( ImagePanel ); + + ADD_UNIT_TEST( Label ); + ADD_UNIT_TEST( Checkbox ); + ADD_UNIT_TEST( Button ); + + ADD_UNIT_TEST( CrossSplitter ); + + ADD_UNIT_TEST( PanelListPanel ); + ADD_UNIT_TEST( GroupBox2 ); + + ADD_UNIT_TEST( StatusBar ); + + + PrintText( L"Unit Test Started.\n" ); + + m_fLastSecond = Gwen::Platform::GetTimeInSeconds(); + m_iFrames = 0; +} + + +void UnitTest::PrintText( const Gwen::UnicodeString& str ) +{ + m_TextOutput->AddItem( str ); + m_TextOutput->Scroller()->ScrollToBottom(); +} + +void UnitTest::Render( Gwen::Skin::Base* skin ) +{ + m_iFrames++; + + if ( m_fLastSecond < Gwen::Platform::GetTimeInSeconds() ) + { + SetTitle( Gwen::Utility::Format( L"GWEN Unit Test - %i fps", m_iFrames ) ); + + m_fLastSecond = Gwen::Platform::GetTimeInSeconds() + 1.0f; + m_iFrames = 0; + } + + BaseClass::Render( skin ); + +} + +void GUnit::UnitPrint( const Gwen::UnicodeString& str ) +{ + m_pUnitTest->PrintText( str ); +} + +void GUnit::UnitPrint( const Gwen::String& str ) +{ + UnitPrint( Utility::StringToUnicode( str ) ); +} + diff --git a/btgui/GwenOpenGLTest/UnitTest.h b/btgui/GwenOpenGLTest/UnitTest.h new file mode 100644 index 000000000..7d8f76f7f --- /dev/null +++ b/btgui/GwenOpenGLTest/UnitTest.h @@ -0,0 +1,64 @@ +/* + GWEN + Copyright (c) 2011 Facepunch Studios + See license in Gwen.h +*/ + + +#pragma once +#ifndef GWEN_UNITTEST_UNITTEST_H +#define GWEN_UNITTEST_UNITTEST_H + +#include "Gwen/Gwen.h" +#include "Gwen/Align.h" +#include "Gwen/Utility.h" +#include "Gwen/Controls/WindowControl.h" +#include "Gwen/Controls/TabControl.h" +#include "Gwen/Controls/ListBox.h" + +class UnitTest; + + + +class GUnit : public Gwen::Controls::Base +{ + public: + + GWEN_CONTROL_INLINE( GUnit, Gwen::Controls::Base ) + { + m_pUnitTest = NULL; + } + + void SetUnitTest( UnitTest* u ){ m_pUnitTest = u; } + + void UnitPrint( const Gwen::UnicodeString& str ); + void UnitPrint( const Gwen::String& str ); + + + + + UnitTest* m_pUnitTest; +}; + +class UnitTest : public Gwen::Controls::WindowControl +{ + public: + + GWEN_CONTROL( UnitTest, Gwen::Controls::WindowControl ); + + void PrintText( const Gwen::UnicodeString& str ); + + void Render( Gwen::Skin::Base* skin ); + + + private: + + Gwen::Controls::TabControl* m_TabControl; + Gwen::Controls::ListBox* m_TextOutput; + unsigned int m_iFrames; + float m_fLastSecond; + +}; + +#define DEFINE_UNIT_TEST( name, displayname ) GUnit* RegisterUnitTest_##name( Gwen::Controls::TabControl* tab ){ GUnit* u = new name( tab ); tab->AddPage( displayname, u ); return u; } +#endif diff --git a/btgui/GwenOpenGLTest/premake4.lua b/btgui/GwenOpenGLTest/premake4.lua new file mode 100644 index 000000000..844682471 --- /dev/null +++ b/btgui/GwenOpenGLTest/premake4.lua @@ -0,0 +1,61 @@ + + project "Gwen_OpenGLTest" + + kind "ConsoleApp" + flags {"Unicode"} + + defines { "GWEN_COMPILE_STATIC" , "_HAS_EXCEPTIONS=0", "_STATIC_CPPLIB" } + + targetdir "../../bin" + + includedirs + { + + "..", + ".", + "../../src" + } + + initOpenGL() + initGlew() + + links { + "gwen", + } + + + files { + "../FontFiles/OpenSans.cpp", + "../OpenGLWindow/TwFonts.cpp", + "../OpenGLWindow/TwFonts.h", + "../OpenGLWindow/LoadShader.cpp", + "../OpenGLWindow/LoadShader.h", + "../OpenGLWindow/GLPrimitiveRenderer.cpp", + "../OpenGLWindow/GLPrimitiveRenderer.h", + "../OpenGLWindow/GwenOpenGL3CoreRenderer.h", + "../OpenGLTrueTypeFont/fontstash.cpp", + "../OpenGLTrueTypeFont/fontstash.h", + "../OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp", + "../OpenGLTrueTypeFont/opengl_fontstashcallbacks.h", + "../../src/BulletGeometry/btConvexHullComputer.cpp", + "../../src/BulletGeometry/btConvexHullComputer.h", + "../../src/BulletCommon/btAlignedAllocator.cpp", + "../../src/BulletCommon/btQuickprof.cpp", + "../../src/BulletCommon/btQuickprof.h", + "**.cpp", + "**.h", + } + if os.is("Windows") then + files { + "../OpenGLWindow/Win32OpenGLWindow.cpp", + "../OpenGLWindow/Win32OpenGLWindow.h", + "../OpenGLWindow/Win32Window.cpp", + "../OpenGLWindow/Win32Window.h", + } + end + if os.is("Linux") then + files{ + "../OpenGLWindow/X11OpenGLWindow.h", + "../OpenGLWindow/X11OpenGLWindow.cpp" + } + end diff --git a/btgui/OpenGLTrueTypeFont/fontstash.cpp b/btgui/OpenGLTrueTypeFont/fontstash.cpp new file mode 100644 index 000000000..a42e2eac4 --- /dev/null +++ b/btgui/OpenGLTrueTypeFont/fontstash.cpp @@ -0,0 +1,812 @@ +// +// Copyright (c) 2011 Andreas Krinke andreas.krinke@gmx.de +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#define STB_TRUETYPE_IMPLEMENTATION +#include +#include +#include +#ifdef _WIN32 +#include + +#endif +#include "fontstash.h" + + + +#define BORDER_X_LEFT 2 +#define BORDER_X_RIGHT 2 +#define BORDER_Y_TOP 2 +#define BORDER_Y_BOTTOM 2 +#define ADDITIONAL_HEIGHT 2 + +#define STB_TRUETYPE_IMPLEMENTATION +#define STBTT_malloc(x,u) malloc(x) +#define STBTT_free(x,u) free(x) +#include "stb_truetype.h" + +#define HASH_LUT_SIZE 256 + + + +#define TTFONT_FILE 1 +#define TTFONT_MEM 2 +#define BMFONT 3 + +static int idx = 1; +static float s_retinaScale = 1; + +static unsigned int hashint(unsigned int a) +{ + a += ~(a<<15); + a ^= (a>>10); + a += (a<<3); + a ^= (a>>6); + a += ~(a<<11); + a ^= (a>>16); + return a; +} + + + +struct sth_font +{ + int idx; + int type; + stbtt_fontinfo font; + unsigned char* data; + struct sth_glyph* glyphs; + int lut[HASH_LUT_SIZE]; + int nglyphs; + float ascender; + float descender; + float lineh; + struct sth_font* next; +}; + + + + + +struct sth_stash +{ + int tw,th; + float itw,ith; + struct sth_texture* textures; + struct sth_font* fonts; + int drawing; + + RenderCallbacks* m_renderCallbacks; +}; + + + +// Copyright (c) 2008-2009 Bjoern Hoehrmann +// See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. + +#define UTF8_ACCEPT 0 +#define UTF8_REJECT 1 + +static const unsigned char utf8d[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 00..1f + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 20..3f + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 40..5f + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 60..7f + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, // 80..9f + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, // a0..bf + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // c0..df + 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, // e0..ef + 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, // f0..ff + 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, // s0..s0 + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1, // s1..s2 + 1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, // s3..s4 + 1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, // s5..s6 + 1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // s7..s8 +}; + +static unsigned int decutf8(unsigned int* state, unsigned int* codep, unsigned int byte) +{ + unsigned int type = utf8d[byte]; + *codep = (*state != UTF8_ACCEPT) ? + (byte & 0x3fu) | (*codep << 6) : + (0xff >> type) & (byte); + *state = utf8d[256 + *state*16 + type]; + return *state; +} + + + +struct sth_stash* sth_create(int cachew, int cacheh, RenderCallbacks* renderCallbacks) +{ + struct sth_stash* stash = NULL; + struct sth_texture* texture = NULL; + + // Allocate memory for the font stash. + stash = (struct sth_stash*)malloc(sizeof(struct sth_stash)); + if (stash == NULL) + { + assert(0); + return NULL; + } + memset(stash,0,sizeof(struct sth_stash)); + + stash->m_renderCallbacks = renderCallbacks; + + // Allocate memory for the first texture + texture = (struct sth_texture*)malloc(sizeof(struct sth_texture)); + if (texture == NULL) + { + assert(0); + free(stash); + } + memset(texture,0,sizeof(struct sth_texture)); + + // Create first texture for the cache. + stash->tw = cachew; + stash->th = cacheh; + stash->itw = 1.0f/cachew; + stash->ith = 1.0f/cacheh; + stash->textures = texture; + + stash->m_renderCallbacks->updateTexture(texture, 0, stash->tw, stash->th); + + return stash; + +} + +int sth_add_font_from_memory(struct sth_stash* stash, unsigned char* buffer) +{ + int i, ascent, descent, fh, lineGap; + struct sth_font* fnt = NULL; + + fnt = (struct sth_font*)malloc(sizeof(struct sth_font)); + if (fnt == NULL) goto error; + memset(fnt,0,sizeof(struct sth_font)); + + + // Init hash lookup. + for (i = 0; i < HASH_LUT_SIZE; ++i) + fnt->lut[i] = -1; + + fnt->data = buffer; + + // Init stb_truetype + if (!stbtt_InitFont(&fnt->font, fnt->data, 0)) + goto error; + + + // Store normalized line height. The real line height is got + // by multiplying the lineh by font size. + stbtt_GetFontVMetrics(&fnt->font, &ascent, &descent, &lineGap); + + fh = ascent - descent; + fnt->ascender = (float)ascent / (float)fh; + fnt->descender = (float)descent / (float)fh; + fnt->lineh = (float)(fh + lineGap) / (float)fh; + + fnt->idx = idx; + fnt->type = TTFONT_MEM; + fnt->next = stash->fonts; + stash->fonts = fnt; + + + return idx++; + +error: + if (fnt) { + if (fnt->glyphs) free(fnt->glyphs); + free(fnt); + } + return 0; +} + +int sth_add_font(struct sth_stash* stash, const char* path) +{ + FILE* fp = 0; + int datasize; + unsigned char* data = NULL; + int idx; + + // Read in the font data. + fp = fopen(path, "rb"); + if (!fp) goto error; + fseek(fp,0,SEEK_END); + datasize = (int)ftell(fp); + fseek(fp,0,SEEK_SET); + data = (unsigned char*)malloc(datasize); + if (data == NULL) goto error; + fread(data, 1, datasize, fp); + fclose(fp); + fp = 0; + + idx = sth_add_font_from_memory(stash, data); + // Modify type of the loaded font. + if (idx) + stash->fonts->type = TTFONT_FILE; + else + free(data); + + return idx; + +error: + if (data) free(data); + if (fp) fclose(fp); + return 0; +} + +int sth_add_bitmap_font(struct sth_stash* stash, int ascent, int descent, int line_gap) +{ + int i, fh; + struct sth_font* fnt = NULL; + + fnt = (struct sth_font*)malloc(sizeof(struct sth_font)); + if (fnt == NULL) goto error; + memset(fnt,0,sizeof(struct sth_font)); + + // Init hash lookup. + for (i = 0; i < HASH_LUT_SIZE; ++i) fnt->lut[i] = -1; + + // Store normalized line height. The real line height is got + // by multiplying the lineh by font size. + fh = ascent - descent; + fnt->ascender = (float)ascent / (float)fh; + fnt->descender = (float)descent / (float)fh; + fnt->lineh = (float)(fh + line_gap) / (float)fh; + + fnt->idx = idx; + fnt->type = BMFONT; + fnt->next = stash->fonts; + stash->fonts = fnt; + + return idx++; + +error: + if (fnt) free(fnt); + return 0; +} + +/*void sth_add_glyph(struct sth_stash* stash, + int idx, + unsigned int id1, + const char* s, + short size, short base, + int x, int y, int w, int h, + float xoffset, float yoffset, float xadvance) +{ + struct sth_texture* texture = NULL; + struct sth_font* fnt = NULL; + struct sth_glyph* glyph = NULL; + unsigned int codepoint; + unsigned int state = 0; + + if (stash == NULL) return; + texture = stash->textures; + while (texture != NULL && texture->id != id) + texture = texture->next; + + if (texture == NULL) + { + // Create new texture + texture = (struct sth_texture*)malloc(sizeof(struct sth_texture)); + if (texture == NULL) return; + memset(texture, 0, sizeof(struct sth_texture)); + texture->id = id; + texture->next = stash->textures; + stash->textures = texture; + } + + fnt = stash->fonts; + while (fnt != NULL && fnt->idx != idx) fnt = fnt->next; + if (fnt == NULL) return; + if (fnt->type != BMFONT) return; + + for (; *s; ++s) + { + if (!decutf8(&state, &codepoint, *(unsigned char*)s)) break; + } + if (state != UTF8_ACCEPT) return; + + // Alloc space for new glyph. + fnt->nglyphs++; + fnt->glyphs = (sth_glyph*)realloc(fnt->glyphs, fnt->nglyphs*sizeof(struct sth_glyph)); + if (!fnt->glyphs) return; + + // Init glyph. + glyph = &fnt->glyphs[fnt->nglyphs-1]; + memset(glyph, 0, sizeof(struct sth_glyph)); + glyph->codepoint = codepoint; + glyph->size = size; + glyph->texture = texture; + glyph->x0_ = x; + glyph->y0 = y; + glyph->x1 = glyph->x0_+w; + glyph->y1 = glyph->y0+h; + glyph->xoff = xoffset; + glyph->yoff = yoffset - base; + glyph->xadv = xadvance; + + // Find code point and size. + h = hashint(codepoint) & (HASH_LUT_SIZE-1); + // Insert char to hash lookup. + glyph->next = fnt->lut[h]; + fnt->lut[h] = fnt->nglyphs-1; +} +*/ + +static struct sth_glyph* get_glyph(struct sth_stash* stash, struct sth_font* fnt, unsigned int codepoint, short isize) +{ + int i,g,advance,lsb,x0,y0,x1,y1,gw,gh; + float scale; + struct sth_texture* texture = NULL; + struct sth_glyph* glyph = NULL; + unsigned char* bmp = NULL; + unsigned int h; + float size = isize/10.0f; + int rh; + struct sth_row* br = NULL; + + // Find code point and size. + h = hashint(codepoint) & (HASH_LUT_SIZE-1); + i = fnt->lut[h]; + while (i != -1) + { + if (fnt->glyphs[i].codepoint == codepoint && (fnt->type == BMFONT || fnt->glyphs[i].size == isize)) + return &fnt->glyphs[i]; + i = fnt->glyphs[i].next; + } + // Could not find glyph. + + // For bitmap fonts: ignore this glyph. + if (fnt->type == BMFONT) return 0; + + // For truetype fonts: create this glyph. + scale = stbtt_ScaleForPixelHeight(&fnt->font, size); + g = stbtt_FindGlyphIndex(&fnt->font, codepoint); + stbtt_GetGlyphHMetrics(&fnt->font, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&fnt->font, g, scale,scale, &x0,&y0,&x1,&y1); + gw = x1-x0; + gh = y1-y0; + + // Check if glyph is larger than maximum texture size + if (gw >= stash->tw || gh >= stash->th) + return 0; + + // Find texture and row where the glyph can be fit. + br = NULL; + rh = (gh+7) & ~7; + texture = stash->textures; + while(br == NULL) + { + for (i = 0; i < texture->nrows; ++i) + { + if (texture->rows[i].h >= rh && texture->rows[i].x+gw+1 <= stash->tw) + br = &texture->rows[i]; + } + + // If no row is found, there are 3 possibilities: + // - add new row + // - try next texture + // - create new texture + if (br == NULL) + { + short py = BORDER_Y_TOP; + // Check that there is enough space. + if (texture->nrows) + { + py = texture->rows[texture->nrows-1].y + texture->rows[texture->nrows-1].h+1; + if (py+rh > stash->th) + { + if (texture->next != NULL) + { + texture = texture->next; + } + else + { + // Create new texture + texture->next = (struct sth_texture*)malloc(sizeof(struct sth_texture)); + texture = texture->next; + if (texture == NULL) goto error; + memset(texture,0,sizeof(struct sth_texture)); + + stash->m_renderCallbacks->updateTexture(texture,0,stash->tw,stash->th); + + + } + continue; + } + } + // Init and add row + br = &texture->rows[texture->nrows]; + br->x = BORDER_X_LEFT; + br->y = py+BORDER_Y_BOTTOM; + br->h = rh+ADDITIONAL_HEIGHT; + texture->nrows++; + } + } + + // Alloc space for new glyph. + fnt->nglyphs++; + fnt->glyphs = (sth_glyph*)realloc(fnt->glyphs, fnt->nglyphs*sizeof(struct sth_glyph)); + if (!fnt->glyphs) return 0; + + // Init glyph. + glyph = &fnt->glyphs[fnt->nglyphs-1]; + memset(glyph, 0, sizeof(struct sth_glyph)); + glyph->codepoint = codepoint; + glyph->size = isize; + glyph->texture = texture; + glyph->x0_ = br->x; + glyph->y0 = br->y; + glyph->x1 = glyph->x0_+gw; + glyph->y1 = glyph->y0+gh; + glyph->xadv = scale * advance; + glyph->xoff = (float)x0; + glyph->yoff = (float)y0; + glyph->next = 0; + + // Advance row location. + br->x += gw+BORDER_X_RIGHT; + + // Insert char to hash lookup. + glyph->next = fnt->lut[h]; + fnt->lut[h] = fnt->nglyphs-1; + + // Rasterize + { + unsigned char* ptr = texture->m_texels+glyph->x0_+glyph->y0*stash->tw; + stbtt_MakeGlyphBitmap(&fnt->font,ptr , gw,gh,stash->tw, scale,scale, g); + + stash->m_renderCallbacks->updateTexture(texture,glyph, stash->tw, stash->th); + + } + + return glyph; + +error: + if (texture) + free(texture); + return 0; +} + +static int get_quad(struct sth_stash* stash, struct sth_font* fnt, struct sth_glyph* glyph, short isize, float* x, float* y, struct sth_quad* q) +{ + float rx,ry; + float scale = 1.f/s_retinaScale;//1.0f; + + if (fnt->type == BMFONT) + scale = isize/(glyph->size*10.0f); + + rx = (*x + scale * float(glyph->xoff)); + ry = (*y + scale * float(glyph->yoff)); + + q->x0 = rx; + q->y0 = ry + 1.5*0.5f*float(isize)/10.f; + + q->x1 = rx + scale * float(glyph->x1 - glyph->x0_); + q->y1 = ry + scale * float(glyph->y1 - glyph->y0)+ 1.5*0.5f*float(isize)/10.f; + + q->s0 = float(glyph->x0_) * stash->itw; + q->t0 = float(glyph->y0) * stash->ith; + q->s1 = float(glyph->x1) * stash->itw; + q->t1 = float(glyph->y1) * stash->ith; + + *x += scale * glyph->xadv; + + return 1; +} + +static Vertex* setv(Vertex* v, float x, float y, float s, float t, float width, float height) +{ + bool scale=true; + if (scale) + { + v->position.p[0] = (x*2-width)/(width); + v->position.p[1] = 1-(y)/(height/2); + } else + { + v->position.p[0] = (x-width)/(width); + v->position.p[1] = (height-y)/(height); + } + v->position.p[2] = 0.f; + v->position.p[3] = 1.f; + + v->uv.p[0] = s; + v->uv.p[1] = t; + + v->colour.p[0] = 0.1f;//1.f; + v->colour.p[1] = 0.1f; + v->colour.p[2] = 0.1f; + v->colour.p[3] = 1.f; + + return v+1; +} + + + + +static void flush_draw(struct sth_stash* stash) +{ + struct sth_texture* texture = stash->textures; + while (texture) + { + if (texture->nverts > 0) + { + stash->m_renderCallbacks->render(texture); + texture->nverts = 0; + } + texture = texture->next; + } +} + + +void sth_begin_draw(struct sth_stash* stash) +{ + if (stash == NULL) return; + if (stash->drawing) + flush_draw(stash); + stash->drawing = 1; +} + +void sth_end_draw(struct sth_stash* stash) +{ + if (stash == NULL) return; + if (!stash->drawing) return; + +/* + // Debug dump. + if (stash->nverts+6 < VERT_COUNT) + { + float x = 500, y = 100; + float* v = &stash->verts[stash->nverts*4]; + + v = setv(v, x, y, 0, 0); + v = setv(v, x+stash->tw, y, 1, 0); + v = setv(v, x+stash->tw, y+stash->th, 1, 1); + + v = setv(v, x, y, 0, 0); + v = setv(v, x+stash->tw, y+stash->th, 1, 1); + v = setv(v, x, y+stash->th, 0, 1); + + stash->nverts += 6; + } +*/ + + flush_draw(stash); + stash->drawing = 0; +} + +void sth_draw_texture(struct sth_stash* stash, + int idx, float size, + float x, float y, + int screenwidth, int screenheight, + const char* s, float* dx) +{ + int width = stash->tw; + int height=stash->th; + + unsigned int codepoint; + struct sth_glyph* glyph = NULL; + struct sth_texture* texture = NULL; + unsigned int state = 0; + struct sth_quad q; + short isize = (short)(size*10.0f); + Vertex* v; + struct sth_font* fnt = NULL; + + if (stash == NULL) return; + + if (!stash->textures) return; + fnt = stash->fonts; + while(fnt != NULL && fnt->idx != idx) fnt = fnt->next; + if (fnt == NULL) return; + if (fnt->type != BMFONT && !fnt->data) return; + + int once = true; + for (; once; ++s) + { + once=false; + if (decutf8(&state, &codepoint, *(unsigned char*)s)) + continue; + glyph = get_glyph(stash, fnt, codepoint, isize); + if (!glyph) + continue; + texture = glyph->texture; + if (texture->nverts+6 >= VERT_COUNT) + flush_draw(stash); + + if (!get_quad(stash, fnt, glyph, isize, &x, &y, &q)) + continue; + + v = &texture->newverts[texture->nverts]; + q.x0 = 0; + q.y0 = 0; + q.x1 = q.x0+width; + q.y1 = q.y0+height; + + v = setv(v, q.x0, q.y0, 0,0,screenwidth,screenheight); + v = setv(v, q.x1, q.y0, 1,0,screenwidth,screenheight); + v = setv(v, q.x1, q.y1, 1,1,screenwidth,screenheight); + + v = setv(v, q.x0, q.y0, 0,0,screenwidth,screenheight); + v = setv(v, q.x1, q.y1, 1,1,screenwidth,screenheight); + v = setv(v, q.x0, q.y1, 0,1,screenwidth,screenheight); + texture->nverts += 6; + } + + flush_draw(stash); + + + + + if (dx) *dx = x; +} + +void sth_flush_draw(struct sth_stash* stash) +{ + flush_draw(stash); +} +void sth_draw_text(struct sth_stash* stash, + int idx, float size, + float x, float y, + const char* s, float* dx, int screenwidth, int screenheight, int measureOnly, float retinaScale) +{ + + unsigned int codepoint; + struct sth_glyph* glyph = NULL; + struct sth_texture* texture = NULL; + unsigned int state = 0; + struct sth_quad q; + short isize = (short)(size*10.0f); + Vertex* v; + struct sth_font* fnt = NULL; + + s_retinaScale = retinaScale; + if (stash == NULL) return; + + if (!stash->textures) return; + fnt = stash->fonts; + while(fnt != NULL && fnt->idx != idx) fnt = fnt->next; + if (fnt == NULL) return; + if (fnt->type != BMFONT && !fnt->data) return; + + for (; *s; ++s) + { + if (decutf8(&state, &codepoint, *(unsigned char*)s)) + continue; + glyph = get_glyph(stash, fnt, codepoint, isize); + if (!glyph) continue; + texture = glyph->texture; + + if (!measureOnly) + { + if (texture->nverts+6 >= VERT_COUNT) + flush_draw(stash); + } + + if (!get_quad(stash, fnt, glyph, isize, &x, &y, &q)) continue; + + if (!measureOnly) + { + v = &texture->newverts[texture->nverts]; + + v = setv(v, q.x0, q.y0, q.s0, q.t0,screenwidth,screenheight); + v = setv(v, q.x1, q.y0, q.s1, q.t0,screenwidth,screenheight); + v = setv(v, q.x1, q.y1, q.s1, q.t1,screenwidth,screenheight); + + v = setv(v, q.x0, q.y0, q.s0, q.t0,screenwidth,screenheight); + v = setv(v, q.x1, q.y1, q.s1, q.t1,screenwidth,screenheight); + v = setv(v, q.x0, q.y1, q.s0, q.t1,screenwidth,screenheight); + + texture->nverts += 6; + } + } + + if (dx) *dx = x; +} + +void sth_dim_text(struct sth_stash* stash, + int idx, float size, + const char* s, + float* minx, float* miny, float* maxx, float* maxy) +{ + unsigned int codepoint; + struct sth_glyph* glyph = NULL; + unsigned int state = 0; + struct sth_quad q; + short isize = (short)(size*10.0f); + struct sth_font* fnt = NULL; + float x = 0, y = 0; + + if (stash == NULL) + return; + if (!stash->textures) + return; + fnt = stash->fonts; + while(fnt != NULL && fnt->idx != idx) fnt = fnt->next; + if (fnt == NULL) return; + if (fnt->type != BMFONT && !fnt->data) return; + + *minx = *maxx = x; + *miny = *maxy = y; + + for (; *s; ++s) + { + if (decutf8(&state, &codepoint, *(unsigned char*)s)) continue; + glyph = get_glyph(stash, fnt, codepoint, isize); + if (!glyph) continue; + if (!get_quad(stash, fnt, glyph, isize, &x, &y, &q)) continue; + if (q.x0 < *minx) *minx = q.x0; + if (q.x1 > *maxx) *maxx = q.x1; + if (q.y1 < *miny) *miny = q.y1; + if (q.y0 > *maxy) *maxy = q.y0; + } +} + +void sth_vmetrics(struct sth_stash* stash, + int idx, float size, + float* ascender, float* descender, float* lineh) +{ + struct sth_font* fnt = NULL; + + if (stash == NULL) return; + if (!stash->textures) return; + fnt = stash->fonts; + while(fnt != NULL && fnt->idx != idx) fnt = fnt->next; + if (fnt == NULL) return; + if (fnt->type != BMFONT && !fnt->data) return; + if (ascender) + *ascender = fnt->ascender*size; + if (descender) + *descender = fnt->descender*size; + if (lineh) + *lineh = fnt->lineh*size; +} + +void sth_delete(struct sth_stash* stash) +{ + struct sth_texture* tex = NULL; + struct sth_texture* curtex = NULL; + struct sth_font* fnt = NULL; + struct sth_font* curfnt = NULL; + + if (!stash) return; + + tex = stash->textures; + while(tex != NULL) { + curtex = tex; + tex = tex->next; + stash->m_renderCallbacks->updateTexture(curtex,0,0,0); + free(curtex); + } + + fnt = stash->fonts; + while(fnt != NULL) { + curfnt = fnt; + fnt = fnt->next; + if (curfnt->glyphs) + { + free(curfnt->glyphs); + } + if (curfnt->type == TTFONT_FILE && curfnt->data) + { + free(curfnt->data); + } + free(curfnt); + } + free(stash); +} diff --git a/btgui/OpenGLTrueTypeFont/fontstash.h b/btgui/OpenGLTrueTypeFont/fontstash.h new file mode 100644 index 000000000..3159444de --- /dev/null +++ b/btgui/OpenGLTrueTypeFont/fontstash.h @@ -0,0 +1,145 @@ +// +// Copyright (c) 2011 Andreas Krinke andreas.krinke@gmx.de +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef FONTSTASH_H +#define FONTSTASH_H + + +#define MAX_ROWS 128 +#define VERT_COUNT (6*128) +#define INDEX_COUNT (VERT_COUNT*2) + + +struct vec2 +{ + vec2(float x, float y) + { + p[0] = x; + p[1] = y; + } + float p[2]; +}; + +struct vec4 +{ + vec4(float x,float y, float z, float w) + { + p[0] = x; + p[1] = y; + p[2] = z; + p[3] = w; + + } + + float p[4]; +}; + +typedef struct +{ + vec4 position; + vec4 colour; + vec2 uv; +} Vertex; + +struct sth_quad +{ + float x0,y0,s0,t0; + float x1,y1,s1,t1; +}; + +struct sth_row +{ + short x,y,h; +}; + +struct sth_glyph +{ + unsigned int codepoint; + short size; + struct sth_texture* texture; + int x0_,y0,x1,y1; + float xadv,xoff,yoff; + int next; +}; + + +struct sth_texture +{ + union + { + void* m_userData; + int m_userId; + }; + + unsigned char* m_texels; + + // TODO: replace rows with pointer + struct sth_row rows[MAX_ROWS]; + int nrows; + int nverts; + + Vertex newverts[VERT_COUNT]; + struct sth_texture* next; +}; + + +struct RenderCallbacks +{ + virtual void updateTexture(sth_texture* texture, sth_glyph* glyph, int textureWidth, int textureHeight)=0; + virtual void render(sth_texture* texture)=0; +}; + +struct sth_stash* sth_create(int cachew, int cacheh, RenderCallbacks* callbacks); + +int sth_add_font(struct sth_stash* stash, const char* path); +int sth_add_font_from_memory(struct sth_stash* stash, unsigned char* buffer); + +int sth_add_bitmap_font(struct sth_stash* stash, int ascent, int descent, int line_gap); +/*void sth_add_glyph(struct sth_stash* stash, int idx, unsigned int uid, const char* s, + short size, short base, int x, int y, int w, int h, + float xoffset, float yoffset, float xadvance); + */ + +void sth_begin_draw(struct sth_stash* stash); +void sth_end_draw(struct sth_stash* stash); + +void sth_draw_texture(struct sth_stash* stash, + int idx, float size, + float x, float y, + int screenwidth, int screenheight, + const char* s, float* dx); + +void sth_flush_draw(struct sth_stash* stash); + +void sth_draw_text(struct sth_stash* stash, + int idx, float size, + float x, float y, const char* string, float* dx, int screenwidth, int screenheight, int measureOnly=0, float retinaScale=1); + +void sth_dim_text(struct sth_stash* stash, int idx, float size, const char* string, + float* minx, float* miny, float* maxx, float* maxy); + +void sth_vmetrics(struct sth_stash* stash, + int idx, float size, + float* ascender, float* descender, float * lineh); + +void sth_delete(struct sth_stash* stash); + + + +#endif // FONTSTASH_H diff --git a/btgui/OpenGLTrueTypeFont/main.cpp b/btgui/OpenGLTrueTypeFont/main.cpp new file mode 100644 index 000000000..75a3e55e6 --- /dev/null +++ b/btgui/OpenGLTrueTypeFont/main.cpp @@ -0,0 +1,680 @@ +/* +Copyright (c) 2012 Advanced Micro Devices, Inc. + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +//Originally written by Erwin Coumans + +// +//#include "vld.h" +#ifndef __APPLE__ +#include +#endif +#include //memset + +#ifdef __APPLE__ + #include "OpenGLWindow/MacOpenGLWindow.h" +#elif defined (_WIN32) + #include "OpenGLWindow/Win32OpenGLWindow.h" +#elif defined (__linux) + #include "OpenGLWindow/X11OpenGLWindow.h" +#endif + +#include "fontstash.h" +#include "opengl_fontstashcallbacks.h" + + +#include "BulletCommon/btQuickprof.h" +#include "BulletCommon/btQuaternion.h" +#include "BulletCommon/CommandLineArgs.h" +#include "../OpenGLWindow/LoadShader.h" +extern char OpenSansData[]; +bool printStats = false; +bool pauseSimulation = false; +bool shootObject = false; + +int m_glutScreenWidth; +int m_glutScreenHeight; + +bool useInterop = false; + + +#include "../OpenGLWindow/GLPrimInternalData.h" + +static PrimInternalData sData; + +/*GLuint sData.m_texturehandle; +GLuint sData.m_shaderProg; +GLint m_positionUniform; +GLint m_colourAttribute, m_positionAttribute,m_textureAttribute; +GLuint m_vertexArrayObject,m_vertexBuffer; +GLuint m_indexBuffer; +*/ + + + +void loadShader(); +unsigned int indexData[6] = {0,1,2,0,2,3}; + +void loadBufferData(){ + Vertex vertexDataOrg[4] = { + { vec4(-0.5, -0.5, 0.0, 1.0 ), vec4( 1.0, 0.0, 0.0, 1.0 ) ,vec2(0,0)}, + { vec4(-0.5, 0.5, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0,1)}, + { vec4( 0.5, 0.5, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(1,1)}, + { vec4( 0.5, -0.5, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(1,0)} + }; + + Vertex vertexData[4] = { + { vec4(-0.5, -0.5, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0.0078125,0.015625)}, + { vec4(-0.5, 0.5, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0.101562,0.015625)}, + { vec4( 0.5, 0.5, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0.101562,0.105469)}, + { vec4( 0.5, -0.5, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0.0078125,0.105469)} + }; + + Vertex vertexData2[4] = { + { vec4(0, 0.901042, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0.0078125,0.015625)}, + { vec4(0.0234375, 0.901042, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0.101562,0.015625)}, + { vec4( 0.0234375, 0.871094, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0.101562,0.105469)}, + { vec4( 0., 0.871094, 0.0, 1.0 ), vec4( 1.0, 1.0, 1.0, 1.0 ) ,vec2(0.0078125,0.105469)} + }; + + + glGenVertexArrays(1, &sData.m_vertexArrayObject); + glBindVertexArray(sData.m_vertexArrayObject); + + glGenBuffers(1, &sData.m_vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, sData.m_vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), vertexData, GL_STATIC_DRAW); + GLuint err = glGetError(); + btAssert(err==GL_NO_ERROR); + + + + glGenBuffers(1, &sData.m_indexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sData.m_indexBuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER,6*sizeof(int), indexData,GL_STATIC_DRAW); + + glEnableVertexAttribArray(sData.m_positionAttribute); + glEnableVertexAttribArray(sData.m_colourAttribute); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + glEnableVertexAttribArray(sData.m_textureAttribute); + + glVertexAttribPointer(sData.m_positionAttribute, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)0); + glVertexAttribPointer(sData.m_colourAttribute , 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)sizeof(vec4)); + glVertexAttribPointer(sData.m_textureAttribute , 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)(sizeof(vec4)+sizeof(vec4))); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + +} + +void initTestTexture() +{ + // glEnable(GL_TEXTURE_2D); + glGenTextures(1,(GLuint*)&sData.m_texturehandle); + + GLint err = glGetError(); + btAssert(err==GL_NO_ERROR); + + glBindTexture(GL_TEXTURE_2D,sData.m_texturehandle); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + int width=256; + int height=256; + unsigned char* image = (unsigned char*)malloc(width*height); + memset(image,0,width*height); + for (int i=0;i] [--load_bulletfile=test.bullet] [--enable_interop=<0 or 1>] [--enable_gpusap=<0 or 1>] [--enable_convexheightfield=<0 or 1>] [--enable_static=<0 or 1>] [--x_dim=] [--y_dim=] [--z_dim=] [--x_gap=] [--y_gap=] [--z_gap=]\n"); +}; + +int main(int argc, char* argv[]) +{ + GLint err; + CommandLineArgs args(argc,argv); + + if (args.CheckCmdLineFlag("help")) + { + Usage(); + return 0; + } + + args.GetCmdLineArgument("enable_interop", useInterop); + printf("useInterop=%d\n",useInterop); + + + + args.GetCmdLineArgument("pause_simulation", pauseSimulation); + printf("pause_simulation=%d\n",pauseSimulation); + + + + char* tmpfile = 0; + args.GetCmdLineArgument("load_bulletfile", tmpfile ); + if (tmpfile) + fileName = tmpfile; + + printf("load_bulletfile=%s\n",fileName); + + int width = 700; + int height= 512; + printf("\n"); + + + btgDefaultOpenGLWindow* window = new btgDefaultOpenGLWindow(); + window->createWindow(btgWindowConstructionInfo(width,height)); + window->setWindowTitle("font test"); + + + +#ifndef __APPLE__ + err = glewInit(); +#endif + window->runMainLoop(); + + loadShader(); + + loadBufferData(); + + initTestTexture(); + + window->startRendering(); + window->endRendering(); + + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + +// render.InitShaders(); + +// render.writeTransforms(); + + window->runMainLoop(); + +// window->setMouseCallback(btDefaultMouseCallback); +// window->setKeyboardCallback(btDefaultKeyboardCallback); + // window->setWheelCallback(btDefaultWheelCallback); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + + int done; + struct sth_stash* stash = 0; + FILE* fp = 0; + int datasize; + + float sx,sy,dx,dy,lh; + int droidRegular;//, droidItalic, droidBold, droidJapanese, dejavu; + GLuint texture; + + + int fontTextureWidth = 512; + int fontTextureHeight = 512; + SimpleOpenGL2RenderCallbacks* renderCallbacks = new SimpleOpenGL2RenderCallbacks(&sData); + + stash = sth_create(fontTextureWidth,fontTextureHeight,renderCallbacks); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + if (!stash) + { + fprintf(stderr, "Could not create stash.\n"); + return -1; + } + + // Load the first truetype font from memory (just because we can). +#ifdef _WIN32 + const char* fontPath = "../../bin/"; +#else + const char* fontPath = "./"; +#endif + + char fullFontFileName[1024]; + sprintf(fullFontFileName,"%s%s",fontPath,"DroidSerif-Regular.ttf");//cour.ttf");//times.ttf");//DroidSerif-Regular.ttf"); + //sprintf(fullFontFileName,"%s%s",fontPath,"arial.ttf");//cour.ttf");//times.ttf");//DroidSerif-Regular.ttf"); + + fp = fopen(fullFontFileName, "rb"); +#ifdef LOAD_FONT_FROM_FILE + unsigned char* data; + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + btAssert(fp); + if (fp) + { + fseek(fp, 0, SEEK_END); + datasize = (int)ftell(fp); + fseek(fp, 0, SEEK_SET); + data = (unsigned char*)malloc(datasize); + if (data == NULL) + { + btAssert(0); + return -1; + } + else + fread(data, 1, datasize, fp); + fclose(fp); + fp = 0; + } + if (!(droidRegular = sth_add_font_from_memory(stash, data))) + { + btAssert(0); + return -1; + } + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + // Load the remaining truetype fonts directly. + sprintf(fullFontFileName,"%s%s",fontPath,"DroidSerif-Italic.ttf"); + + if (!(droidItalic = sth_add_font(stash,fullFontFileName))) + { + btAssert(0); + return -1; + } + sprintf(fullFontFileName,"%s%s",fontPath,"DroidSerif-Bold.ttf"); + + + if (!(droidBold = sth_add_font(stash,fullFontFileName))) + { + btAssert(0); + return -1; + } + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + sprintf(fullFontFileName,"%s%s",fontPath,"DroidSansJapanese.ttf"); + if (!(droidJapanese = sth_add_font(stash,fullFontFileName))) + { + btAssert(0); + return -1; + } + err = glGetError(); + btAssert(err==GL_NO_ERROR); +#else//LOAD_FONT_FROM_FILE + char* data2 = OpenSansData; + unsigned char* data = (unsigned char*) data2; + if (!(droidRegular = sth_add_font_from_memory(stash, data))) + { + printf("error!\n"); + } +#endif//LOAD_FONT_FROM_FILE + + + + while (!window->requestedExit()) + { + CProfileManager::Reset(); + GLint err = glGetError(); + btAssert(err==GL_NO_ERROR); + + // glClearColor(0.5f,0.5f,0.5f,1.f); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + window->startRendering(); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + glClearColor(1,1,1,1);//.4, .4, 0.4, 1.0); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + + //display(); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + if (1) + { + BT_PROFILE("font stash rendering"); + // Update and render + glEnable(GL_BLEND); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + glDisable(GL_DEPTH_TEST); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + //glColor4ub(255,0,0,255); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + glEnable(GL_BLEND); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + sx = 0; sy = height; + + sth_begin_draw(stash); + + display(); + + dx = sx; dy = sy; + static int once=0; + + + //sth_draw_text(stash, droidRegular,12.f, dx, dy-50, "How does this OpenGL True Type font look? ", &dx,width,height); + int spacing = 512; + if (1) + for (int i=20;i<=110;i+=12) + { + char txt[512]; + sprintf(txt,"%d. The quick brown fox jumped over the lazy dog. 1234567890",i); + sth_draw_text(stash, droidRegular,i, 10, dy-spacing, txt, &dx,width,height); + spacing-=i; + } + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + if (0) + for (int i=0;i<1;i++) + { + dx = sx; + if (once!=1) + { + //need to save this file as UTF-8 without signature, codepage 650001 in Visual Studio + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + //sth_draw_text(stash, droidJapanese,16.f, dx, dy-36, (const char*) "\xE7\xA7\x81\xE3\x81\xAF\xE3\x82\xAC\xE3\x83\xA9\xE3\x82\xB9\xE3\x82\x92\xE9\xA3\x9F\xE3\x81\xB9\xE3\x82\x89\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x99\xE3\x80\x82",&dx, + // width,height);//はabcdefghijlkmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+=?/\][{}.,<>`~@#$%^", &dx); +// sth_draw_text(stash, droidJapanese,32.f, dx, dy, (const char*) "私はガラスを食べられます。それは私を傷つけません。",&dx);//はabcdefghijlkmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+=?/\][{}.,<>`~@#$%^", &dx); + + dx = sx; + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + sth_flush_draw(stash); + dx=0; + sth_draw_text(stash, droidRegular,14.f, dx, dy-80, "How does this OpenGL True Type font look? ", &dx,width,height); + dx=0; + dy-=30; + + //sth_draw_text(stash, droidRegular,16.f, dx, dy-80, "Profile How does this OpenGL True Type font look? ", &dx,width,height); + dx=0; + dy-=30; + + + sth_draw_text(stash, droidRegular,16.f, dx, dy-80, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", &dx,width,height); + dx=0; + dy-=30; + sth_draw_text(stash, droidRegular,16.f, dx, dy-80, "!@#$%^abcdefghijklmnopqrstuvwxyz", &dx,width,height); + + dx=0; + // sth_draw_text(stash, droidRegular,16.f, dx, dy-42, "aph OpenGL Profile aCABCabdabcdefghijlkmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^", &dx,width,height); + //sth_draw_text(stash, droidRegular,16.f, dx, dy-42, "aph OpenGL Profile aCABCabdabcdefghijlkmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^", &dx,width,height); + + sth_flush_draw(stash); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + + } else + { + dx = sx; + dy = height; + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + + sth_draw_texture(stash, droidRegular, 16.f, 0, 0,width,height, "a", &dx); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + dumpTextureToPng(fontTextureWidth, fontTextureHeight,"newPic.png"); + + + } + once++; + } + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + sth_end_draw(stash); + + glEnable(GL_DEPTH_TEST); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + //glFinish(); + } + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + + window->endRendering(); + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + { + BT_PROFILE("glFinish"); + glFinish(); + } + + CProfileManager::Increment_Frame_Counter(); + + static bool printStats = true; + + + + if (printStats && !pauseSimulation) + { + static int count = 0; + count--; + if (count<0) + { + count = 100; +// CProfileManager::dumpAll(); + //printStats = false; + } else + { +// printf("."); + } + } + + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + + } + +#ifdef _WIN32 + sth_delete(stash); +#ifdef LOAD_FONT_FROM_FILE + free(data); +#endif //LOAD_FONT_FROM_FILE +#endif + +// render.CleanupShaders(); + window->closeWindow(); + delete window; + + return 0; + +} diff --git a/btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp b/btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp new file mode 100644 index 000000000..2d034af34 --- /dev/null +++ b/btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp @@ -0,0 +1,275 @@ +#include "opengl_fontstashcallbacks.h" +#include "../OpenGLWindow/GLPrimitiveRenderer.h" +#include "../OpenGLWindow/GLPrimInternalData.h" + +#include "fontstash.h" +#include "../OpenGLWindow/OpenGLInclude.h" +#include +#include +#include +#include +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.h" + + +static unsigned int s_indexData[INDEX_COUNT]; +GLuint s_indexArrayObject, s_indexBuffer; +GLuint s_vertexArrayObject,s_vertexBuffer; + +OpenGL2RenderCallbacks::OpenGL2RenderCallbacks(GLPrimitiveRenderer* primRender) + :m_primRender2(primRender) +{ + +} +OpenGL2RenderCallbacks::~OpenGL2RenderCallbacks() +{ +} + +PrimInternalData* OpenGL2RenderCallbacks::getData() +{ + return m_primRender2->getData(); +} +InternalOpenGL2RenderCallbacks::~InternalOpenGL2RenderCallbacks() +{ + +} + +void InternalOpenGL2RenderCallbacks::display2() +{ + + GLint err = glGetError(); + assert(err==GL_NO_ERROR); + // glViewport(0,0,10,10); + + //const float timeScale = 0.008f; + PrimInternalData* data = getData(); + + glUseProgram(data->m_shaderProg); + glBindBuffer(GL_ARRAY_BUFFER, s_vertexBuffer); + glBindVertexArray(s_vertexArrayObject); + + err = glGetError(); + assert(err==GL_NO_ERROR); + + + // glBindTexture(GL_TEXTURE_2D,m_texturehandle); + + + err = glGetError(); + assert(err==GL_NO_ERROR); + + vec2 p( 0.f,0.f);//?b?0.5f * sinf(timeValue), 0.5f * cosf(timeValue) ); + glUniform2fv(data->m_positionUniform, 1, (const GLfloat *)&p); + + err = glGetError(); + assert(err==GL_NO_ERROR); + err = glGetError(); + assert(err==GL_NO_ERROR); + + glEnableVertexAttribArray(data->m_positionAttribute); + err = glGetError(); + assert(err==GL_NO_ERROR); + + glEnableVertexAttribArray(data->m_colourAttribute); + err = glGetError(); + assert(err==GL_NO_ERROR); + + glEnableVertexAttribArray(data->m_textureAttribute); + + glVertexAttribPointer(data->m_positionAttribute, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)0); + glVertexAttribPointer(data->m_colourAttribute , 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)sizeof(vec4)); + glVertexAttribPointer(data->m_textureAttribute , 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)(sizeof(vec4)+sizeof(vec4))); + err = glGetError(); + assert(err==GL_NO_ERROR); +/* + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer); + //glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + int indexCount = 6; + err = glGetError(); + assert(err==GL_NO_ERROR); + + glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0); + err = glGetError(); + assert(err==GL_NO_ERROR); + */ + + // glutSwapBuffers(); +} + + + +void InternalOpenGL2RenderCallbacks::updateTexture(sth_texture* texture, sth_glyph* glyph, int textureWidth, int textureHeight) +{ + GLint err; + + err = glGetError(); + assert(err==GL_NO_ERROR); + + + if (glyph) + { + // Update texture (entire texture, could use glyph to update partial texture using glTexSubImage2D) + GLuint* gltexture = (GLuint*) texture->m_userData; + + glBindTexture(GL_TEXTURE_2D, *gltexture); + glPixelStorei(GL_UNPACK_ALIGNMENT,1); + err = glGetError(); + assert(err==GL_NO_ERROR); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, textureWidth, textureHeight, 0, GL_RED, GL_UNSIGNED_BYTE, texture->m_texels); + + GLenum err = glGetError(); + assert(err==GL_NO_ERROR); + + } else + { + if (textureWidth && textureHeight) + { + GLuint* texId = new GLuint; + texture->m_userData = texId; + + + //create new texture + glGenTextures(1, texId); + GLenum err = glGetError(); + assert(err==GL_NO_ERROR); + + + + glBindTexture(GL_TEXTURE_2D, *texId); + texture->m_texels = (unsigned char*)malloc(textureWidth*textureHeight); + memset(texture->m_texels,0,textureWidth*textureHeight); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, textureWidth, textureHeight, 0, GL_RED, GL_UNSIGNED_BYTE, texture->m_texels); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + err = glGetError(); + assert(err==GL_NO_ERROR); + + //////////////////////////// + //create the other data + { + glGenVertexArrays(1, &s_vertexArrayObject); + glBindVertexArray(s_vertexArrayObject); + + glGenBuffers(1, &s_vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, s_vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, VERT_COUNT * sizeof(Vertex), texture->newverts, GL_DYNAMIC_DRAW); + GLuint err = glGetError(); + assert(err==GL_NO_ERROR); + + for (int i=0;im_userData) + { + + GLuint* id = (GLuint*)texture->m_userData; + + glDeleteTextures(1, id); + //delete id; + texture->m_userData = 0; + } + + } + + } +} + +void InternalOpenGL2RenderCallbacks::render(sth_texture* texture) +{ + display2(); + + + GLuint* texId = (GLuint*) texture->m_userData; + + GLint err; + err = glGetError(); + assert(err==GL_NO_ERROR); + + glActiveTexture(GL_TEXTURE0); + err = glGetError(); + assert(err==GL_NO_ERROR); + + glBindTexture(GL_TEXTURE_2D, *texId); + bool useFiltering = false; + if (useFiltering) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + err = glGetError(); + assert(err==GL_NO_ERROR); + glBindBuffer(GL_ARRAY_BUFFER, s_vertexBuffer); + glBindVertexArray(s_vertexArrayObject); + glBufferData(GL_ARRAY_BUFFER, texture->nverts * sizeof(Vertex), &texture->newverts[0].position.p[0], GL_DYNAMIC_DRAW); + err = glGetError(); + assert(err==GL_NO_ERROR); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s_indexBuffer); + + //glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + int indexCount = texture->nverts; + err = glGetError(); + assert(err==GL_NO_ERROR); + + glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0); + err = glGetError(); + assert(err==GL_NO_ERROR); + + glBindVertexArray(0); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +// glDisableVertexAttribArray(m_textureAttribute); + glUseProgram(0); + +} + + +void dumpTextureToPng(int textureWidth, int textureHeight, const char* fileName) +{ + glPixelStorei(GL_PACK_ALIGNMENT,1); + unsigned char* pixels = (unsigned char*)malloc(textureWidth*textureHeight); + glReadPixels(0,0,textureWidth, textureHeight, GL_RED, GL_UNSIGNED_BYTE, pixels); + //swap the pixels + unsigned char* tmp = (unsigned char*)malloc(textureWidth); + for (int j=0;j +#include +#include +#include +#include + +typedef unsigned int stbiw_uint32; +typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; + +static void writefv(FILE *f, const char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { unsigned char x = (unsigned char) va_arg(v, int); fputc(x,f); break; } + case '2': { int x = va_arg(v,int); unsigned char b[2]; + b[0] = (unsigned char) x; b[1] = (unsigned char) (x>>8); + fwrite(b,2,1,f); break; } + case '4': { stbiw_uint32 x = va_arg(v,int); unsigned char b[4]; + b[0]=(unsigned char)x; b[1]=(unsigned char)(x>>8); + b[2]=(unsigned char)(x>>16); b[3]=(unsigned char)(x>>24); + fwrite(b,4,1,f); break; } + default: + assert(0); + return; + } + } +} + +static void write3(FILE *f, unsigned char a, unsigned char b, unsigned char c) +{ + unsigned char arr[3]; + arr[0] = a, arr[1] = b, arr[2] = c; + fwrite(arr, 3, 1, f); +} + +static void write_pixels(FILE *f, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad) +{ + unsigned char bg[3] = { 255, 0, 255}, px[3]; + stbiw_uint32 zero = 0; + int i,j,k, j_end; + + if (y <= 0) + return; + + if (vdir < 0) + j_end = -1, j = y-1; + else + j_end = y, j = 0; + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + unsigned char *d = (unsigned char *) data + (j*x+i)*comp; + if (write_alpha < 0) + fwrite(&d[comp-1], 1, 1, f); + switch (comp) { + case 1: + case 2: write3(f, d[0],d[0],d[0]); + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k=0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3])/255; + write3(f, px[1-rgb_dir],px[1],px[1+rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + write3(f, d[1-rgb_dir],d[1],d[1+rgb_dir]); + break; + } + if (write_alpha > 0) + fwrite(&d[comp-1], 1, 1, f); + } + fwrite(&zero,scanline_pad,1,f); + } +} + +static int outfile(char const *filename, int rgb_dir, int vdir, int x, int y, int comp, void *data, int alpha, int pad, const char *fmt, ...) +{ + FILE *f; + if (y < 0 || x < 0) return 0; + f = fopen(filename, "wb"); + if (f) { + va_list v; + va_start(v, fmt); + writefv(f, fmt, v); + va_end(v); + write_pixels(f,rgb_dir,vdir,x,y,comp,data,alpha,pad); + fclose(f); + } + return f != NULL; +} + +int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + int pad = (-x*3) & 3; + return outfile(filename,-1,-1,x,y,comp,(void *) data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header +} + +int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + int has_alpha = !(comp & 1); + return outfile(filename, -1,-1, x, y, comp, (void *) data, has_alpha, 0, + "111 221 2222 11", 0,0,2, 0,0,0, 0,0,x,y, 24+8*has_alpha, 8*has_alpha); +} + +// stretchy buffer; stbi__sbpush() == vector<>::push_back() -- stbi__sbcount() == vector<>::size() +#define stbi__sbraw(a) ((int *) (a) - 2) +#define stbi__sbm(a) stbi__sbraw(a)[0] +#define stbi__sbn(a) stbi__sbraw(a)[1] + +#define stbi__sbneedgrow(a,n) ((a)==0 || stbi__sbn(a)+n >= stbi__sbm(a)) +#define stbi__sbmaybegrow(a,n) (stbi__sbneedgrow(a,(n)) ? stbi__sbgrow(a,n) : 0) +#define stbi__sbgrow(a,n) stbi__sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbi__sbpush(a, v) (stbi__sbmaybegrow(a,1), (a)[stbi__sbn(a)++] = (v)) +#define stbi__sbcount(a) ((a) ? stbi__sbn(a) : 0) +#define stbi__sbfree(a) ((a) ? free(stbi__sbraw(a)),0 : 0) + +static void *stbi__sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbi__sbm(*arr)+increment : increment+1; + void *p = realloc(*arr ? stbi__sbraw(*arr) : 0, itemsize * m + sizeof(int)*2); + assert(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbi__sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbi__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbi__sbpush(data, (unsigned char) *bitbuffer); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbi__zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbi__zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbi__zhash(unsigned char *data) +{ + stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbi__zlib_flush() (out = stbi__zlib_flushf(out, &bitbuf, &bitcount)) +#define stbi__zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbi__zlib_flush()) +#define stbi__zlib_huffa(b,c) stbi__zlib_add(stbi__zlib_bitrev(b,c),c) +// default huffman tables +#define stbi__zlib_huff1(n) stbi__zlib_huffa(0x30 + (n), 8) +#define stbi__zlib_huff2(n) stbi__zlib_huffa(0x190 + (n)-144, 9) +#define stbi__zlib_huff3(n) stbi__zlib_huffa(0 + (n)-256,7) +#define stbi__zlib_huff4(n) stbi__zlib_huffa(0xc0 + (n)-280,8) +#define stbi__zlib_huff(n) ((n) <= 143 ? stbi__zlib_huff1(n) : (n) <= 255 ? stbi__zlib_huff2(n) : (n) <= 279 ? stbi__zlib_huff3(n) : stbi__zlib_huff4(n)) +#define stbi__zlib_huffb(n) ((n) <= 143 ? stbi__zlib_huff1(n) : stbi__zlib_huff2(n)) + +#define stbi__ZHASH 16384 + +unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char **hash_table[stbi__ZHASH]; // 64KB on the stack! + if (quality < 5) quality = 5; + + stbi__sbpush(out, 0x78); // DEFLATE 32K window + stbi__sbpush(out, 0x5e); // FLEVEL = 1 + stbi__zlib_add(1,1); // BFINAL = 1 + stbi__zlib_add(1,2); // BTYPE = 1 -- fixed huffman + + for (i=0; i < stbi__ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + // hash next 3 bytes of data to be compressed + int h = stbi__zhash(data+i)&(stbi__ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbi__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { // if entry lies within window + int d = stbi__zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) best=d,bestloc=hlist[j]; + } + } + // when hash table entry is too long, delete half the entries + if (hash_table[h] && stbi__sbn(hash_table[h]) == 2*quality) { + memcpy(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbi__sbn(hash_table[h]) = quality; + } + stbi__sbpush(hash_table[h],data+i); + + if (bestloc) { + // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal + h = stbi__zhash(data+i+1)&(stbi__ZHASH-1); + hlist = hash_table[h]; + n = stbi__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbi__zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { // if next match is better, bail on current match + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = data+i - bestloc; // distance back + assert(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbi__zlib_huff(j+257); + if (lengtheb[j]) stbi__zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbi__zlib_add(stbi__zlib_bitrev(j,5),5); + if (disteb[j]) stbi__zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbi__zlib_huffb(data[i]); + ++i; + } + } + // write out final bytes + for (;i < data_len; ++i) + stbi__zlib_huffb(data[i]); + stbi__zlib_huff(256); // end of block + // pad with 0 bits to byte boundary + while (bitcount) + stbi__zlib_add(0,1); + + for (i=0; i < stbi__ZHASH; ++i) + (void) stbi__sbfree(hash_table[i]); + + { + // compute adler32 on input + unsigned int i=0, s1=1, s2=0, blocklen = data_len % 5552; + int j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1; + s1 %= 65521, s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbi__sbpush(out, (unsigned char) (s2 >> 8)); + stbi__sbpush(out, (unsigned char) s2); + stbi__sbpush(out, (unsigned char) (s1 >> 8)); + stbi__sbpush(out, (unsigned char) s1); + } + *out_len = stbi__sbn(out); + // make returned pointer freeable + memmove(stbi__sbraw(out), out, *out_len); + return (unsigned char *) stbi__sbraw(out); +} + +unsigned int stbi__crc32(unsigned char *buffer, int len) +{ + static unsigned int crc_table[256]; + unsigned int crc = ~0u; + int i,j; + if (crc_table[1] == 0) + for(i=0; i < 256; i++) + for (crc_table[i]=i, j=0; j < 8; ++j) + crc_table[i] = (crc_table[i] >> 1) ^ (crc_table[i] & 1 ? 0xedb88320 : 0); + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +} + +#define stbi__wpng4(o,a,b,c,d) ((o)[0]=(unsigned char)(a),(o)[1]=(unsigned char)(b),(o)[2]=(unsigned char)(c),(o)[3]=(unsigned char)(d),(o)+=4) +#define stbi__wp32(data,v) stbi__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbi__wptag(data,s) stbi__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbi__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbi__crc32(*data - len - 4, len+4); + stbi__wp32(*data, crc); +} + +static unsigned char stbi__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return (unsigned char) a; + if (pb <= pc) return (unsigned char) b; + return (unsigned char) c; +} + +unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int i,j,k,p,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + filt = (unsigned char *) malloc((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) malloc(x * n); if (!line_buffer) { free(filt); return 0; } + for (j=0; j < y; ++j) { + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = j ? mapping : firstmap; + int best = 0, bestval = 0x7fffffff; + for (p=0; p < 2; ++p) { + for (k= p?best:0; k < 5; ++k) { + int type = mymap[k],est=0; + unsigned char *z = pixels + stride_bytes*j; + for (i=0; i < n; ++i) + switch (type) { + case 0: line_buffer[i] = z[i]; break; + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break; + case 3: line_buffer[i] = z[i] - (z[i-stride_bytes]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbi__paeth(0,z[i-stride_bytes],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + for (i=n; i < x*n; ++i) { + switch (type) { + case 0: line_buffer[i] = z[i]; break; + case 1: line_buffer[i] = z[i] - z[i-n]; break; + case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break; + case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-stride_bytes])>>1); break; + case 4: line_buffer[i] = z[i] - stbi__paeth(z[i-n], z[i-stride_bytes], z[i-stride_bytes-n]); break; + case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: line_buffer[i] = z[i] - stbi__paeth(z[i-n], 0,0); break; + } + } + if (p) break; + for (i=0; i < x*n; ++i) + est += abs((signed char) line_buffer[i]); + if (est < bestval) { bestval = est; best = k; } + } + } + // when we get here, best contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) best; + memcpy(filt+j*(x*n+1)+1, line_buffer, x*n); + } + free(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); // increase 8 to get smaller but use more memory + free(filt); + if (!zlib) return 0; + + // each tag requires 12 bytes of overhead + out = (unsigned char *) malloc(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + memcpy(o,sig,8); o+= 8; + stbi__wp32(o, 13); // header length + stbi__wptag(o, "IHDR"); + stbi__wp32(o, x); + stbi__wp32(o, y); + *o++ = 8; + *o++ = (unsigned char) ctype[n]; + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbi__wpcrc(&o,13); + + stbi__wp32(o, zlen); + stbi__wptag(o, "IDAT"); + memcpy(o, zlib, zlen); o += zlen; free(zlib); + stbi__wpcrc(&o, zlen); + + stbi__wp32(o,0); + stbi__wptag(o, "IEND"); + stbi__wpcrc(&o,0); + + assert(o == out + *out_len); + + return out; +} + +int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +{ + FILE *f; + int len; + unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); + if (!png) return 0; + f = fopen(filename, "wb"); + if (!f) { free(png); return 0; } + fwrite(png, 1, len, f); + fclose(f); + free(png); + return 1; +} +#endif // STB_IMAGE_WRITE_IMPLEMENTATION + +/* Revision history + + 0.92 (2010-08-01) + casts to unsigned char to fix warnings + 0.91 (2010-07-17) + first public release + 0.90 first internal release +*/ diff --git a/btgui/OpenGLTrueTypeFont/stb_truetype.h b/btgui/OpenGLTrueTypeFont/stb_truetype.h new file mode 100644 index 000000000..c02c578d6 --- /dev/null +++ b/btgui/OpenGLTrueTypeFont/stb_truetype.h @@ -0,0 +1,1960 @@ +// stb_truetype.h - v0.5 - public domain - 2009 Sean Barrett / RAD Game Tools +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// +// Bug/warning reports: +// "Zer" on mollyrocket (with fix) +// Cass Everitt +// stoiko (Haemimont Games) +// Brian Hook +// Walter van Niftrik +// +// VERSION HISTORY +// +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b(2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (STB) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// +// USAGE +// +// Include this file in whatever places neeed to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// Look at the header-file sections below for the API, but here's a quick skim: +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start, +// and you can cut and paste from it to move to more advanced) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- use for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetCodepointKernAdvance() +// +// ADVANCED USAGE +// +// Quality: +// +// - Use the functions with Subpixel at the end to allow your characters +// to have subpixel positioning. Since the font is anti-aliased, not +// hinted, this is very import for quality. +// +// - Kerning is now supported, and if you're supporting subpixel rendering +// then kerning is worth using to give your text a polished look. +// +// Performance: +// +// - Convert Unicode codepoints to "glyphs" and operate on the glyphs; if +// you don't do this, stb_truetype is forced to do the conversion on +// every call. +// +// - There are a lot of memory allocations. We should modify it to take +// a temp buffer and allocate from the temp buffer (without freeing), +// should help performance a lot. +// +// NOTES +// +// The system uses the raw data found in the .ttf file without changing it +// and without building auxiliary data structures. This is a bit inefficient +// on little-endian systems (the data is big-endian), but assuming you're +// caching the bitmaps or glyph shapes this shouldn't be a big deal. +// +// It appears to be very hard to programmatically determine what font a +// given file is in a general way. I provide an API for this, but I don't +// recommend it. +// +// +// SOURCE STATISTICS (based on v0.5, 1980 LOC) +// +// Documentation & header file 450 LOC \___ 550 LOC documentation +// Sample code 140 LOC / +// Truetype parsing 590 LOC ---- 600 LOC TrueType +// Software rasterization 240 LOC \ . +// Curve tesselation 120 LOC \__ 550 LOC Bitmap creation +// Bitmap management 100 LOC / +// Baked bitmap interface 70 LOC / +// Font name matching & access 150 LOC ---- 150 +// C runtime library abstraction 60 LOC ---- 60 + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// SAMPLE PROGRAMS +//// +// +// Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless +// +#if 0 +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1<<20]; +unsigned char temp_bitmap[512*512]; + +stbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs +GLstbtt_uint ftex; + +void my_stbtt_initfont(void) +{ + fread(ttf_buffer, 1, 1<<20, fopen("c:/windows/fonts/times.ttf", "rb")); + stbtt_BakeFontBitmap(data,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits! + // can free ttf_buffer at this point + glGenTextures(1, &ftex); + glBindTexture(GL_TEXTURE_2D, ftex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap); + // can free temp_bitmap at this point + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +} + +void my_stbtt_print(float x, float y, char *text) +{ + // assume orthographic projection with units = screen pixels, origin at top left + glBindTexture(GL_TEXTURE_2D, ftex); + glBegin(GL_QUADS); + while (*text) { + if (*text >= 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl,0=old d3d + glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0); + glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0); + glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1); + glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1<<25]; + +int main(int argc, char **argv) +{ + stbtt_fontinfo font; + unsigned char *bitmap; + int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); + + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24<<20]; +unsigned char screen[20][79]; + +int main(int arg, char **argv) +{ + stbtt_fontinfo font; + int i,j,ascent,baseline,ch=0; + float scale, xpos=0; + char *text = "Heljo World!"; + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent,0,0); + baseline = (int) (ascent*scale); + + while (text[ch]) { + int advance,lsb,x0,y0,x1,y1; + float x_shift = xpos - (float) floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to do this, + // you need to render the bitmap to a temp buffer, then "alpha blend" that into the working buffer + xpos += (advance * scale); + if (text[ch+1]) + xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); + ++ch; + } + + for (j=0; j < 20; ++j) { + for (i=0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i]>>5]); + putchar('\n'); + } + + return 0; +} +#endif + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH RUNTIME LIBRARIES +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + // #define your own (u)stbtt_int8/16/32 before including to override this + #ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; + #endif + + typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; + typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; + + // #define your own STBTT_sort() to override this to avoid qsort + #ifndef STBTT_sort + #include + #define STBTT_sort(data,num_items,item_size,compare_func) qsort(data,num_items,item_size,compare_func) + #endif + + // #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h + #ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) + #endif + + // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h + #ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) malloc(x) + #define STBTT_free(x,u) free(x) + #endif + + #ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) + #endif + + #ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) + #endif + + #ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset + #endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct +{ + unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap + float xoff,yoff,xadvance; +} stbtt_bakedchar; + +extern int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata); // you allocate this, it's num_chars long +// if return is positive, the first unused row of the bitmap +// if return is negative, returns the negative of the number of characters that fit +// if return is 0, no characters fit and no rows were used +// This uses a very crappy packing. + +typedef struct +{ + float x0,y0,s0,t0; // top-left + float x1,y1,s1,t1; // bottom-right +} stbtt_aligned_quad; + +extern void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, // same data as above + int char_index, // character to display + float *xpos, float *ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad *q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// It's inefficient; you might want to c&p it and optimize it. + + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// + +extern int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); +// Each .ttf file may have more than one font. Each has a sequential index +// number starting from 0. Call this function to get the font offset for a +// given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. You can just skip +// this step if you know it's that kind of font. + + +// The following structure is defined publically so you can declare one on +// the stack or as a global or etc. +typedef struct +{ + void * userdata; + unsigned char * data; // pointer to .ttf file + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph +} stbtt_fontinfo; + +extern int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are a pure +// cache with no additional data structures. Returns 0 on failure. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +extern float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +extern void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates + +extern void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +extern int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 +// @TODO; for now always returns 0! + +extern int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +extern void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); +extern int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); +extern int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); +// as above, but takes one or more glyph indices for greater efficiency + + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) + enum { + STBTT_vmove=1, + STBTT_vline, + STBTT_vcurve + }; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values + // (we share this with other code at RAD) + #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file + typedef struct + { + stbtt_vertex_type x,y,cx,cy; + unsigned char type,padding; + } stbtt_vertex; +#endif + +extern int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); +extern int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates + +extern void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); +// frees the data allocated above + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +extern void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); +// frees the bitmap allocated below + +extern unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +extern unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel +// shift for the character + +extern void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +extern void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +extern void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +extern void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +extern unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); +extern unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); +extern void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); +extern void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +extern void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +extern void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); + + +// @TODO: don't expose this structure +typedef struct +{ + int w,h,stride; + unsigned char *pixels; +} stbtt__bitmap; + +extern void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata); + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + + +extern int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +extern int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +extern const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE =0, + STBTT_PLATFORM_ID_MAC =1, + STBTT_PLATFORM_ID_ISO =2, + STBTT_PLATFORM_ID_MICROSOFT =3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 =0, + STBTT_UNICODE_EID_UNICODE_1_1 =1, + STBTT_UNICODE_EID_ISO_10646 =2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL =0, + STBTT_MS_EID_UNICODE_BMP =1, + STBTT_MS_EID_SHIFTJIS =2, + STBTT_MS_EID_UNICODE_FULL =10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, + STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, + STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, + STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, + STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, + STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, + STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, + STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, + STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, + STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, + STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, + STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , + STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , + STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, + STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#define ttBYTE(p) (* (stbtt_uint8 *) (p)) +#define ttCHAR(p) (* (stbtt_int8 *) (p)) +#define ttFixed(p) ttLONG(p) + +#if defined(STB_TRUETYPE_BIGENDIAN) && !defined(ALLOW_UNALIGNED_TRUETYPE) + + #define ttUSHORT(p) (* (stbtt_uint16 *) (p)) + #define ttSHORT(p) (* (stbtt_int16 *) (p)) + #define ttULONG(p) (* (stbtt_uint32 *) (p)) + #define ttLONG(p) (* (stbtt_int32 *) (p)) + +#else + + stbtt_uint16 ttUSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; } + stbtt_int16 ttSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; } + stbtt_uint32 ttULONG(const stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } + stbtt_int32 ttLONG(const stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } + +#endif + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) + +static int stbtt__isfont(const stbtt_uint8 *font) +{ + // check the version number + if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 + if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 + return 0; +} + +// @OPTIMIZE: binary search +static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) +{ + stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for (i=0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16*i; + if (stbtt_tag(data+loc+0, tag)) + return ttULONG(data+loc+8); + } + return 0; +} + +int stbtt_GetFontOffsetForIndex(const unsigned char *font_collection, int index) +{ + // if it's just a font, there's only one valid index + if (stbtt__isfont(font_collection)) + return index == 0 ? 0 : -1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection+8); + if (index >= n) + return -1; + return ttULONG(font_collection+12+index*14); + } + } + return -1; +} + +int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data2, int fontstart) +{ + stbtt_uint8 *data = (stbtt_uint8 *) data2; + stbtt_uint32 cmap, t; + stbtt_int32 i,numTables; + + info->data = data; + info->fontstart = fontstart; + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + if (!cmap || !info->loca || !info->head || !info->glyf || !info->hhea || !info->hmtx) + return 0; + + t = stbtt__find_table(data, fontstart, "maxp"); + if (t) + info->numGlyphs = ttUSHORT(data+t+4); + else + info->numGlyphs = 0xffff; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data + cmap + 2); + info->index_map = 0; + for (i=0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data+encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch (ttUSHORT(data+encoding_record+2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data+encoding_record+4); + break; + } + break; + } + } + if (info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data+info->head + 50); + return 1; +} + +int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) +{ + stbtt_uint8 *data = info->data; + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data + index_map + 0); + if (format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data + index_map + 2); + if (unicode_codepoint < bytes-6) + return ttBYTE(data + index_map + 6 + unicode_codepoint); + return 0; + } else if (format == 6) { + stbtt_uint32 first = ttUSHORT(data + index_map + 6); + stbtt_uint32 count = ttUSHORT(data + index_map + 8); + if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) + return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); + return 0; + } else if (format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); + stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; + stbtt_uint16 item, offset, start, end; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if (unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) + search += rangeShift*2; + + // now decrement to bias correctly to find smallest + search -= 2; + while (entrySelector) { + stbtt_uint16 start, end; + searchRange >>= 1; + start = ttUSHORT(data + search + 2 + segcount*2 + 2); + end = ttUSHORT(data + search + 2); + start = ttUSHORT(data + search + searchRange*2 + segcount*2 + 2); + end = ttUSHORT(data + search + searchRange*2); + if (unicode_codepoint > end) + search += searchRange*2; + --entrySelector; + } + search += 2; + + item = (stbtt_uint16) ((search - endCount) >> 1); + + STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item)); + start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); + end = ttUSHORT(data + index_map + 14 + 2 + 2*item); + if (unicode_codepoint < start) + return 0; + + offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); + if (offset == 0) + return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); + + return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); + } else if (format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data+index_map+12); + stbtt_int32 low,high; + stbtt_uint16 g = 0; + low = 0; high = (stbtt_int32)ngroups; + // Binary search the right group. + while (low < high) { + stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); + stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); + if ((stbtt_uint32) unicode_codepoint < start_char) + high = mid; + else if ((stbtt_uint32) unicode_codepoint > end_char) + low = mid+1; + else { + stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); + if (format == 12) + return start_glyph + unicode_codepoint-start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int16 x, stbtt_int16 y, stbtt_int16 cx, stbtt_int16 cy) +{ + v->type = type; + v->x = x; + v->y = y; + v->cx = cx; + v->cy = cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) +{ + int g1,g2; + + if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if (info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; + } else { + g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); + } + + return g1==g2 ? -1 : g1; // if length is 0, return -1 +} + +int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) +{ + int g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 0; + + if (x0) *x0 = ttSHORT(info->data + g + 2); + if (y0) *y0 = ttSHORT(info->data + g + 4); + if (x1) *x1 = ttSHORT(info->data + g + 6); + if (y1) *y1 = ttSHORT(info->data + g + 8); + return 1; +} + +int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); +} + +static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if (start_off) { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); + } + return num_vertices; +} + +int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint8 *endPtsOfContours; + stbtt_uint8 *data = info->data; + stbtt_vertex *vertices=0; + int num_vertices=0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if (g < 0) return 0; + + numberOfContours = ttSHORT(data + g); + + if (numberOfContours > 0) { + stbtt_uint8 flags=0,flagcount; + stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0, curve_end=0; + stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; + scx=0; + scy=0; + stbtt_uint8 *points; + endPtsOfContours = (data + g + 10); + ins = ttUSHORT(data + g + 10 + numberOfContours * 2); + points = data + g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); + + m = n + 2*numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if (vertices == 0) + return 0; + + next_move = 0; + flagcount=0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for (i=0; i < n; ++i) { + if (flagcount == 0) { + flags = *points++; + if (flags & 8) + flagcount = *points++; + } else + --flagcount; + vertices[off+i].type = flags; + } + + // now load x coordinates + x=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 2) { + stbtt_int16 dx = *points++; + x += (flags & 16) ? dx : -dx; // ??? + } else { + if (!(flags & 16)) { + x = x + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].x = x; + } + + // now load y coordinates + y=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 4) { + stbtt_int16 dy = *points++; + y += (flags & 32) ? dy : -dy; // ??? + } else { + if (!(flags & 32)) { + y = y + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].y = y; + } + + // now convert them to our format + num_vertices=0; + sx = sy = cx = cy = 0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + x = (stbtt_int16) vertices[off+i].x; + y = (stbtt_int16) vertices[off+i].y; + + if (next_move == i) { + if (i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + + // now start the new one + start_off = !(flags & 1); + if (start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if (!(vertices[off+i+1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; + sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; + } else { + // otherwise just use the next point as our start point + sx = (stbtt_int32) vertices[off+i+1].x; + sy = (stbtt_int32) vertices[off+i+1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); + was_off = 0; + next_move = 1 + ttUSHORT(endPtsOfContours+j*2); + ++j; + } else { + if (!(flags & 1)) { // if it's a curve + if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + } else if (numberOfContours == -1) { + // Compound shapes. + int more = 1; + stbtt_uint8 *comp = data + g + 10; + num_vertices = 0; + vertices = 0; + while (more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex *comp_verts = 0, *tmp = 0; + float mtx[6] = {1,0,0,1,0,0}, m, n; + + flags = ttSHORT(comp); comp+=2; + gidx = ttSHORT(comp); comp+=2; + + if (flags & 2) { // XY values + if (flags & 1) { // shorts + mtx[4] = ttSHORT(comp); comp+=2; + mtx[5] = ttSHORT(comp); comp+=2; + } else { + mtx[4] = ttCHAR(comp); comp+=1; + mtx[5] = ttCHAR(comp); comp+=1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if (flags & (1<<3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } + + // Find transformation scales. + m = (float) sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); + n = (float) sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if (comp_num_verts > 0) { + // Transform vertices. + for (i = 0; i < comp_num_verts; ++i) { + stbtt_vertex* v = &comp_verts[i]; + stbtt_vertex_type x,y; + x=v->x; y=v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + x=v->cx; y=v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); + if (!tmp) { + if (vertices) STBTT_free(vertices, info->userdata); + if (comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if (num_vertices > 0) memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); + memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); + if (vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1<<5); + } + } else if (numberOfContours < 0) { + // @TODO other compound variations? + STBTT_assert(0); + } else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); + if (glyph_index < numOfLongHorMetrics) { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2+1); + } else { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); + } +} + +int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) +{ + stbtt_uint8 *data = info->data + info->kern; + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(data+10) - 1; + needle = glyph1 << 16 | glyph2; + while (l <= r) { + m = (l + r) >> 1; + straw = ttULONG(data+18+(m*6)); // note: unaligned read + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else + return ttSHORT(data+22+(m*6)); + } + return 0; +} + +int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) +{ + if (!info->kern) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); +} + +void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); +} + +void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) +{ + if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); + if (descent) *descent = ttSHORT(info->data+info->hhea + 6); + if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); +} + +float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) +{ + int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); + return (float) height / fheight; +} + +void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) +{ + STBTT_free(v, info->userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + int x0,y0,x1,y1; + if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) + x0=y0=x1=y1=0; // e.g. space character + // now move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if (ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); + if (iy0) *iy0 = -STBTT_iceil (y1 * scale_y + shift_y); + if (ix1) *ix1 = STBTT_iceil (x1 * scale_x + shift_x); + if (iy1) *iy1 = -STBTT_ifloor(y0 * scale_y + shift_y); +} +void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); +} + +void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); +} + +void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); +} + +typedef struct stbtt__edge { + float x0,y0, x1,y1; + int invert; +} stbtt__edge; + +typedef struct stbtt__active_edge +{ + int x,dx; + float ey; + struct stbtt__active_edge *next; + int valid; +} stbtt__active_edge; + +#define FIXSHIFT 10 +#define FIX (1 << FIXSHIFT) +#define FIXMASK (FIX-1) + +static stbtt__active_edge *new_active(stbtt__edge *e, int off_x, float start_point, void *userdata) +{ + stbtt__active_edge *z = (stbtt__active_edge *) STBTT_malloc(sizeof(*z), userdata); // @TODO: make a pool of these!!! + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(e->y0 <= start_point); + if (!z) return z; + // round dx down to avoid going too far + if (dxdy < 0) + z->dx = -STBTT_ifloor(FIX * -dxdy); + else + z->dx = STBTT_ifloor(FIX * dxdy); + z->x = STBTT_ifloor(FIX * (e->x0 + dxdy * (start_point - e->y0))); + z->x -= off_x * FIX; + z->ey = e->y1; + z->next = 0; + z->valid = e->invert ? 1 : -1; + return z; +} + +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) +{ + // non-zero winding fill + int x0=0, w=0; + + while (e) { + if (w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; w += e->valid; + } else { + int x1 = e->x; w += e->valid; + // if we went to zero, we need to draw + if (w == 0) { + int i = x0 >> FIXSHIFT; + int j = x1 >> FIXSHIFT; + + if (i < len && j >= 0) { + if (i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> FIXSHIFT); + } else { + if (i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8) (((FIX - (x0 & FIXMASK)) * max_weight) >> FIXSHIFT); + else + i = -1; // clip + + if (j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & FIXMASK) * max_weight) >> FIXSHIFT); + else + j = len; // clip + + for (++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8) max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) +{ + stbtt__active_edge *active = NULL; + int y,j=0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], *scanline; + + if (result->w > 512) + scanline = (unsigned char *) STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; + + while (j < result->h) { + STBTT_memset(scanline, 0, result->w); + for (s=0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge **step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while (*step) { + stbtt__active_edge * z = *step; + if (z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->valid); + z->valid = 0; + STBTT_free(z, userdata); + } else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed=0; + step = &active; + while (*step && (*step)->next) { + if ((*step)->x > (*step)->next->x) { + stbtt__active_edge *t = *step; + stbtt__active_edge *q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if (!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while (e->y0 <= scan_y) { + if (e->y1 > scan_y) { + stbtt__active_edge *z = new_active(e, off_x, scan_y, userdata); + // find insertion point + if (active == NULL) + active = z; + else if (z->x < active->x) { + // insert at front + z->next = active; + active = z; + } else { + // find thing to insert AFTER + stbtt__active_edge *p = active; + while (p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + ++e; + } + + // now process all active edges in XOR fashion + if (active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + while (active) { + stbtt__active_edge *z = active; + active = active->next; + STBTT_free(z, userdata); + } + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +static int stbtt__edge_compare(const void *p, const void *q) +{ + stbtt__edge *a = (stbtt__edge *) p; + stbtt__edge *b = (stbtt__edge *) q; + + if (a->y0 < b->y0) return -1; + if (a->y0 > b->y0) return 1; + return 0; +} + +typedef struct +{ + float x,y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge *e; + int n,i,j,k,m; + int vsubsample = result->h < 8 ? 15 : 5; + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for (i=0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel + if (e == 0) return; + n = 0; + + m=0; + for (i=0; i < windings; ++i) { + stbtt__point *p = pts + m; + m += wcount[i]; + j = wcount[i]-1; + for (k=0; k < wcount[i]; j=k++) { + int a=k,b=j; + // skip the edge if horizontal + if (p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a=j,b=k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = p[a].y * y_scale_inv * vsubsample + shift_y; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = p[b].y * y_scale_inv * vsubsample + shift_y; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point *points, int n, float x, float y) +{ + if (!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tesselate until threshhold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2*x1 + x2)/4; + float my = (y0 + 2*y1 + y2)/4; + // versus directly drawn line + float dx = (x0+x2)/2 - mx; + float dy = (y0+y2)/2 - my; + if (n > 16) // 65536 segments on one curve better be enough! + return 1; + if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); + stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); + } else { + stbtt__add_point(points, *num_points,x2,y2); + *num_points = *num_points+1; + } + return 1; +} + +// returns number of contours +stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) +{ + stbtt__point *points=0; + int num_points=0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i,n=0,start=0, pass; + + // count how many "moves" there are to get the contour count + for (i=0; i < num_verts; ++i) + if (vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if (n == 0) return 0; + + *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if (*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for (pass=0; pass < 2; ++pass) { + float x=0,y=0; + if (pass == 1) { + points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); + if (points == NULL) goto error; + } + num_points = 0; + n= -1; + for (i=0; i < num_verts; ++i) { + switch (vertices[i].type) { + case STBTT_vmove: + // start the next contour + if (n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x,y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count, *winding_lengths; + stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); + if (windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) +{ + STBTT_free(bitmap, userdata); +} + +unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + int ix0,iy0,ix1,iy1; + stbtt__bitmap gbm; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if (scale_x == 0) scale_x = scale_y; + if (scale_y == 0) { + if (scale_x == 0) return NULL; + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBox(info, glyph, scale_x, scale_y, &ix0,&iy0,&ix1,&iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if (width ) *width = gbm.w; + if (height) *height = gbm.h; + if (xoff ) *xoff = ix0; + if (yoff ) *yoff = iy0; + + if (gbm.w && gbm.h) { + gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); + if (gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0,iy0; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if (gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); +} + +unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); +} + +void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); +} + +unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); +} + +void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small + +extern int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata) +{ + float scale; + int x,y,bottom_y, i; + stbtt_fontinfo f; + stbtt_InitFont(&f, data, offset); + STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels + x=y=1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for (i=0; i < num_chars; ++i) { + int advance, lsb, x0,y0,x1,y1,gw,gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); + gw = x1-x0; + gh = y1-y0; + if (x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x+gw < pw); + STBTT_assert(y+gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); + chardata[i].x0 = (stbtt_int16) x; + chardata[i].y0 = (stbtt_int16) y; + chardata[i].x1 = (stbtt_int16) (x + gw); + chardata[i].y1 = (stbtt_int16) (y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float) x0; + chardata[i].yoff = (float) y0; + x = x + gw + 2; + if (y+gh+2 > bottom_y) + bottom_y = y+gh+2; + } + return bottom_y; +} + +void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + stbtt_bakedchar *b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(const stbtt_uint8 *s1, stbtt_int32 len1, const stbtt_uint8 *s2, stbtt_int32 len2) +{ + stbtt_int32 i=0; + + // convert utf16 to utf8 and compare the results while converting + while (len2) { + stbtt_uint16 ch = s2[0]*256 + s2[1]; + if (ch < 0x80) { + if (i >= len1) return -1; + if (s1[i++] != ch) return -1; + } else if (ch < 0x800) { + if (i+1 >= len1) return -1; + if (s1[i++] != 0xc0 + (ch >> 6)) return -1; + if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } else if (ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = s2[2]*256 + s2[3]; + if (i+3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if (s1[i++] != 0xf0 + (c >> 18)) return -1; + if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; + s2 += 2; // plus another 2 below + len2 -= 2; + } else if (ch >= 0xdc00 && ch < 0xe000) { + return -1; + } else { + if (i+2 >= len1) return -1; + if (s1[i++] != 0xe0 + (ch >> 12)) return -1; + if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; + } + s2 += 2; + len2 -= 2; + } + return i; +} + +int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((const stbtt_uint8*) s1, len1, (const stbtt_uint8*) s2, len2); +} + +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) +{ + stbtt_int32 i,count,stringOffset; + stbtt_uint8 *fc = font->data; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return NULL; + + count = ttUSHORT(fc+nm+2); + stringOffset = nm + ttUSHORT(fc+nm+4); + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) + && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { + *length = ttUSHORT(fc+loc+8); + return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); + } + } + return NULL; +} + +static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc+nm+2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); + + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc+loc+6); + if (id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); + + // is this a Unicode encoding? + if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc+loc+8), off = ttUSHORT(fc+loc+10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); + if (matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { + stbtt_int32 slen = ttUSHORT(fc+loc+12+8), off = ttUSHORT(fc+loc+12+10); + if (slen == 0) { + if (matchlen == nlen) + return 1; + } else if (matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; + if (stbtt_CompareUTF8toUTF16_bigendian((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) + return 1; + } + } else { + // if nothing immediately following + if (matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} + +static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) +{ + stbtt_int32 nlen = STBTT_strlen((char *) name); + stbtt_uint32 nm,hd; + if (!stbtt__isfont(fc+offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if (flags) { + hd = stbtt__find_table(fc, offset, "head"); + if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return 0; + + if (flags) { + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } else { + if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} + +int stbtt_FindMatchingFont(const unsigned char *font_collection, const char *name_utf8, stbtt_int32 flags) +{ + stbtt_int32 i; + for (i=0;;++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if (off < 0) return off; + if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) + return off; + } +} + +#endif // STB_TRUETYPE_IMPLEMENTATION diff --git a/build/findOpenGLGlewGlut.lua b/build/findOpenGLGlewGlut.lua index f808972da..dd72ae923 100644 --- a/build/findOpenGLGlewGlut.lua +++ b/build/findOpenGLGlewGlut.lua @@ -12,17 +12,18 @@ function initGlut() configuration {} - configuration {"Windows"} - + if os.is("Windows") then + configuration {"Windows"} includedirs { - projectRootDir .. "rendering/GlutGlewWindows" + projectRootDir .. "btgui/OpenGLWindow/Glut" } - libdirs { projectRootDir .. "rendering/GlutGlewWindows"} - configuration {"Windows", "x32"} - links {"glut32"} - configuration {"Windows", "x64"} - links {"glut64"} - + libdirs { projectRootDir .. "btgui/OpenGLWindow/Glut"} + configuration {"Windows", "x32"} + links {"glut32"} + configuration {"Windows", "x64"} + links {"glut64"} + end + configuration {"MacOSX"} links { "Glut.framework" } configuration {"Linux"} @@ -36,10 +37,9 @@ configuration {"Windows"} defines { "GLEW_STATIC"} includedirs { - projectRootDir .. "rendering/GlutGlewWindows" + projectRootDir .. "btgui/OpenGLWindow/GlewWindows" } - libdirs { projectRootDir .. "rendering/GlutGlewWindows"} - files { projectRootDir .. "rendering/GlutGlewWindows/glew.c"} + files { projectRootDir .. "btgui/OpenGLWindow/GlewWindows/glew.c"} end if os.is("Linux") then links{"GLEW"} diff --git a/build/premake4.lua b/build/premake4.lua index 8105683aa..6e13791a6 100644 --- a/build/premake4.lua +++ b/build/premake4.lua @@ -93,6 +93,10 @@ include "../opencl/reduce" include "../opencl/gpu_broadphase/test" include "../opencl/gpu_sat/test" + include "../btgui/Gwen" + include "../btgui/GwenOpenGLTest" + include "../btgui/OpenGLTrueTypeFont" + end \ No newline at end of file diff --git a/opencl/gpu_broadphase/host/btGpuSapBroadphase.cpp b/opencl/gpu_broadphase/host/btGpuSapBroadphase.cpp index df4a6a5ab..1b503fbff 100644 --- a/opencl/gpu_broadphase/host/btGpuSapBroadphase.cpp +++ b/opencl/gpu_broadphase/host/btGpuSapBroadphase.cpp @@ -1,14 +1,14 @@ #include "btGpuSapBroadphase.h" -#include "parallel_primitives/host/btVector3.h" +#include "BulletCommon/btVector3.h" #include "parallel_primitives/host/btLauncherCL.h" -#include "parallel_primitives/host/btQuickprof.h" +#include "BulletCommon/btQuickprof.h" #include "../basic_initialize/btOpenCLUtils.h" #include "../kernels/sapKernels.h" #include "../kernels/sapFastKernels.h" -#include "parallel_primitives/host/btMinMax.h" +#include "BulletCommon/btMinMax.h" btGpuSapBroadphase::btGpuSapBroadphase(cl_context ctx,cl_device_id device, cl_command_queue q ) diff --git a/opencl/gpu_broadphase/test/main.cpp b/opencl/gpu_broadphase/test/main.cpp index e04af4eaa..62a5a667d 100644 --- a/opencl/gpu_broadphase/test/main.cpp +++ b/opencl/gpu_broadphase/test/main.cpp @@ -16,14 +16,14 @@ subject to the following restrictions: #include #include "../basic_initialize/btOpenCLUtils.h" #include "../host/btGpuSapBroadphase.h" -#include "parallel_primitives/host/btVector3.h" +#include "BulletCommon/btVector3.h" #include "parallel_primitives/host/btFillCL.h" #include "parallel_primitives/host/btBoundSearchCL.h" #include "parallel_primitives/host/btRadixSort32CL.h" #include "parallel_primitives/host/btPrefixScanCL.h" -#include "parallel_primitives/host/CommandLineArgs.h" +#include "BulletCommon/CommandLineArgs.h" +#include "BulletCommon/btMinMax.h" -#include "parallel_primitives/host/btMinMax.h" int g_nPassed = 0; int g_nFailed = 0; bool g_testFailed = 0; diff --git a/opencl/gpu_broadphase/test/premake4.lua b/opencl/gpu_broadphase/test/premake4.lua index 2420bf9ce..98a6e7b36 100644 --- a/opencl/gpu_broadphase/test/premake4.lua +++ b/opencl/gpu_broadphase/test/premake4.lua @@ -11,7 +11,7 @@ function createProject(vendor) kind "ConsoleApp" targetdir "../../../bin" - includedirs {"..","../.."} + includedirs {"..","../..","../../../src"} files { @@ -29,11 +29,11 @@ function createProject(vendor) "../../parallel_primitives/host/btPrefixScanCL.h", "../../parallel_primitives/host/btRadixSort32CL.cpp", "../../parallel_primitives/host/btRadixSort32CL.h", - "../../parallel_primitives/host/btAlignedAllocator.cpp", - "../../parallel_primitives/host/btAlignedAllocator.h", - "../../parallel_primitives/host/btAlignedObjectArray.h", - "../../parallel_primitives/host/btQuickprof.cpp", - "../../parallel_primitives/host/btQuickprof.h", + "../../../src/BulletCommon/btAlignedAllocator.cpp", + "../../../src/BulletCommon/btAlignedAllocator.h", + "../../../src/BulletCommon/btAlignedObjectArray.h", + "../../../src/BulletCommon/btQuickprof.cpp", + "../../../src/BulletCommon/btQuickprof.h", } diff --git a/opencl/gpu_sat/host/ConvexHullContact.cpp b/opencl/gpu_sat/host/ConvexHullContact.cpp index 6bdf260b1..fa871892f 100644 --- a/opencl/gpu_sat/host/ConvexHullContact.cpp +++ b/opencl/gpu_sat/host/ConvexHullContact.cpp @@ -25,7 +25,7 @@ subject to the following restrictions: #include "btConvexPolyhedronCL.h" typedef btAlignedObjectArray btVertexArray; -#include "parallel_primitives/host/btQuickprof.h" +#include "BulletCommon/btQuickprof.h" #include //for FLT_MAX #include "../basic_initialize/btOpenCLUtils.h" @@ -34,7 +34,7 @@ typedef btAlignedObjectArray btVertexArray; #include "../kernels/satKernels.h" #include "../kernels/satClipHullContacts.h" -#include "parallel_primitives/host/btAabbUtil2.h" +#include "BulletGeometry/btAabbUtil2.h" #define dot3F4 btDot @@ -52,7 +52,7 @@ m_totalContactsOut(m_context, m_queue) if (1) { const char* src = satKernelsCL; - cl_program satProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,src,&errNum,"","opencl/gpu_rigidbody_pipeline2/sat.cl"); + cl_program satProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,src,&errNum,"","opencl/gpu_sat/kernels/sat.cl"); btAssert(errNum==CL_SUCCESS); m_findSeparatingAxisKernel = btOpenCLUtils::compileCLKernelFromString(m_context, m_device,src, "findSeparatingAxisKernel",&errNum,satProg ); @@ -67,7 +67,7 @@ m_totalContactsOut(m_context, m_queue) if (1) { const char* srcClip = satClipKernelsCL; - cl_program satClipContactsProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,srcClip,&errNum,"","opencl/gpu_rigidbody_pipeline2/satClipHullContacts.cl"); + cl_program satClipContactsProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,srcClip,&errNum,"","opencl/gpu_sat/kernels/satClipHullContacts.cl"); btAssert(errNum==CL_SUCCESS); m_clipHullHullKernel = btOpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "clipHullHullKernel",&errNum,satClipContactsProg); diff --git a/opencl/gpu_sat/host/ConvexHullContact.h b/opencl/gpu_sat/host/ConvexHullContact.h index 299a5d6ae..68430a957 100644 --- a/opencl/gpu_sat/host/ConvexHullContact.h +++ b/opencl/gpu_sat/host/ConvexHullContact.h @@ -4,7 +4,7 @@ #include "parallel_primitives/host/btOpenCLArray.h" #include "btRigidBodyCL.h" -#include "parallel_primitives/host/btAlignedObjectArray.h" +#include "BulletCommon/btAlignedObjectArray.h" #include "btConvexUtility.h" #include "btConvexPolyhedronCL.h" #include "btCollidable.h" diff --git a/opencl/gpu_sat/host/btContact4.h b/opencl/gpu_sat/host/btContact4.h index a14f60a2c..10aaec47c 100644 --- a/opencl/gpu_sat/host/btContact4.h +++ b/opencl/gpu_sat/host/btContact4.h @@ -1,7 +1,7 @@ #ifndef BT_CONTACT4_H #define BT_CONTACT4_H -#include "parallel_primitives/host/btVector3.h" +#include "BulletCommon/btVector3.h" ATTRIBUTE_ALIGNED16(struct) btContact4 diff --git a/opencl/gpu_sat/host/btConvexPolyhedronCL.h b/opencl/gpu_sat/host/btConvexPolyhedronCL.h index ee789f026..5ee6682a9 100644 --- a/opencl/gpu_sat/host/btConvexPolyhedronCL.h +++ b/opencl/gpu_sat/host/btConvexPolyhedronCL.h @@ -1,7 +1,7 @@ #ifndef CONVEX_POLYHEDRON_CL #define CONVEX_POLYHEDRON_CL -#include "parallel_primitives/host/btTransform.h" +#include "BulletCommon/btTransform.h" struct btGpuFace { diff --git a/opencl/gpu_sat/host/btConvexUtility.h b/opencl/gpu_sat/host/btConvexUtility.h index 662f5c3b9..4a71e17aa 100644 --- a/opencl/gpu_sat/host/btConvexUtility.h +++ b/opencl/gpu_sat/host/btConvexUtility.h @@ -17,8 +17,8 @@ subject to the following restrictions: #ifndef _BT_CONVEX_UTILITY_H #define _BT_CONVEX_UTILITY_H -#include "parallel_primitives/host/btAlignedObjectArray.h" -#include "parallel_primitives/host/btTransform.h" +#include "BulletCommon/btAlignedObjectArray.h" +#include "BulletCommon/btTransform.h" #include "btConvexPolyhedronCL.h" diff --git a/opencl/gpu_sat/host/btRigidBodyCL.h b/opencl/gpu_sat/host/btRigidBodyCL.h index 9bf0f633d..4a2c360f8 100644 --- a/opencl/gpu_sat/host/btRigidBodyCL.h +++ b/opencl/gpu_sat/host/btRigidBodyCL.h @@ -1,8 +1,8 @@ #ifndef BT_RIGID_BODY_CL #define BT_RIGID_BODY_CL -#include "parallel_primitives/host/btScalar.h" -#include "parallel_primitives/host/btMatrix3x3.h" +#include "BulletCommon/btScalar.h" +#include "BulletCommon/btMatrix3x3.h" ATTRIBUTE_ALIGNED16(struct) btRigidBodyCL { diff --git a/opencl/gpu_sat/test/main.cpp b/opencl/gpu_sat/test/main.cpp index b40a82a9f..328568dc4 100644 --- a/opencl/gpu_sat/test/main.cpp +++ b/opencl/gpu_sat/test/main.cpp @@ -17,15 +17,15 @@ subject to the following restrictions: #include "../basic_initialize/btOpenCLUtils.h" #include "../host/ConvexHullContact.h" -#include "parallel_primitives/host/btVector3.h" +#include "BulletCommon/btVector3.h" #include "parallel_primitives/host/btFillCL.h" #include "parallel_primitives/host/btBoundSearchCL.h" #include "parallel_primitives/host/btRadixSort32CL.h" #include "parallel_primitives/host/btPrefixScanCL.h" -#include "parallel_primitives/host/CommandLineArgs.h" +#include "BulletCommon/CommandLineArgs.h" #include "../host/ConvexHullContact.h" -#include "parallel_primitives/host/btMinMax.h" +#include "BulletCommon/btMinMax.h" int g_nPassed = 0; int g_nFailed = 0; bool g_testFailed = 0; diff --git a/opencl/gpu_sat/test/premake4.lua b/opencl/gpu_sat/test/premake4.lua index b4cbae720..357e7fdbd 100644 --- a/opencl/gpu_sat/test/premake4.lua +++ b/opencl/gpu_sat/test/premake4.lua @@ -11,7 +11,7 @@ function createProject(vendor) kind "ConsoleApp" targetdir "../../../bin" - includedirs {"..","../.."} + includedirs {"..","../..","../../../src"} files { @@ -29,11 +29,11 @@ function createProject(vendor) "../../parallel_primitives/host/btPrefixScanCL.h", "../../parallel_primitives/host/btRadixSort32CL.cpp", "../../parallel_primitives/host/btRadixSort32CL.h", - "../../parallel_primitives/host/btAlignedAllocator.cpp", - "../../parallel_primitives/host/btAlignedAllocator.h", - "../../parallel_primitives/host/btAlignedObjectArray.h", - "../../parallel_primitives/host/btQuickprof.cpp", - "../../parallel_primitives/host/btQuickprof.h", + "../../../src/BulletCommon/btAlignedAllocator.cpp", + "../../../src/BulletCommon/btAlignedAllocator.h", + "../../../src/BulletCommon/btAlignedObjectArray.h", + "../../../src/BulletCommon/btQuickprof.cpp", + "../../../src/BulletCommon/btQuickprof.h", } diff --git a/opencl/lds_bank_conflict/main.cpp b/opencl/lds_bank_conflict/main.cpp index 07742d268..68771b06a 100644 --- a/opencl/lds_bank_conflict/main.cpp +++ b/opencl/lds_bank_conflict/main.cpp @@ -19,9 +19,9 @@ #include "btOpenCLUtils.h" #include "../parallel_primitives/host/btOpenCLArray.h" #include "../parallel_primitives/host/btLauncherCL.h" -#include "../parallel_primitives/host/btQuickprof.h" +#include "BulletCommon/btQuickprof.h" #include "../parallel_primitives/host/btFillCL.h" -#include "../parallel_primitives/host/CommandLineArgs.h" +#include "BulletCommon/CommandLineArgs.h" #include #include diff --git a/opencl/lds_bank_conflict/premake4.lua b/opencl/lds_bank_conflict/premake4.lua index 7a26da2cc..1f615b192 100644 --- a/opencl/lds_bank_conflict/premake4.lua +++ b/opencl/lds_bank_conflict/premake4.lua @@ -19,13 +19,20 @@ function createProject (vendor) } includedirs { - "../basic_initialize" + "../basic_initialize", + "../../src" } files { "main.cpp", "../basic_initialize/btOpenCLUtils.cpp", - "../basic_initialize/btOpenCLUtils.h" + "../basic_initialize/btOpenCLUtils.h", + "../../src/BulletCommon/btAlignedAllocator.cpp", + "../../src/BulletCommon/btAlignedAllocator.h", + "../../src/BulletCommon/btAlignedObjectArray.h", + "../../src/BulletCommon/btQuickprof.cpp", + "../../src/BulletCommon/btQuickprof.h", + } end diff --git a/opencl/parallel_primitives/benchmark/premake4.lua b/opencl/parallel_primitives/benchmark/premake4.lua index 515540c8b..9f710c9e3 100644 --- a/opencl/parallel_primitives/benchmark/premake4.lua +++ b/opencl/parallel_primitives/benchmark/premake4.lua @@ -11,7 +11,7 @@ function createProject(vendor) kind "ConsoleApp" targetdir "../../../bin" - includedirs {".."} + includedirs {"..","../../../src"} links { ("OpenCL_lib_parallel_primitives_host_" .. vendor) @@ -24,6 +24,11 @@ function createProject(vendor) "../host/btFillCL.cpp", "../host/btPrefixScanCL.cpp", "../host/btRadixSort32CL.cpp", + "../../../src/BulletCommon/btAlignedAllocator.cpp", + "../../../src/BulletCommon/btAlignedAllocator.h", + "../../../src/BulletCommon/btAlignedObjectArray.h", + "../../../src/BulletCommon/btQuickprof.cpp", + "../../../src/BulletCommon/btQuickprof.h", } end diff --git a/opencl/parallel_primitives/benchmark/test_large_problem_sorting.cpp b/opencl/parallel_primitives/benchmark/test_large_problem_sorting.cpp index 05ad99162..8bb6a77ea 100644 --- a/opencl/parallel_primitives/benchmark/test_large_problem_sorting.cpp +++ b/opencl/parallel_primitives/benchmark/test_large_problem_sorting.cpp @@ -66,7 +66,7 @@ #include "../host/btRadixSort32CL.h" #include "../../basic_initialize/btOpenCLUtils.h" -#include "../host/btQuickprof.h" +#include "BulletCommon/btQuickprof.h" cl_context g_cxMainContext; cl_device_id g_device; diff --git a/opencl/parallel_primitives/host/CommandLineArgs.h b/opencl/parallel_primitives/host/CommandLineArgs.h deleted file mode 100644 index b2a43016f..000000000 --- a/opencl/parallel_primitives/host/CommandLineArgs.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef COMMAND_LINE_ARGS_H -#define COMMAND_LINE_ARGS_H - -/****************************************************************************** - * Command-line parsing - ******************************************************************************/ -#include -#include -#include -#include -#include -class CommandLineArgs -{ -protected: - - std::map pairs; - -public: - - // Constructor - CommandLineArgs(int argc, char **argv) - { - using namespace std; - - for (int i = 1; i < argc; i++) - { - string arg = argv[i]; - - if ((arg[0] != '-') || (arg[1] != '-')) { - continue; - } - - string::size_type pos; - string key, val; - if ((pos = arg.find( '=')) == string::npos) { - key = string(arg, 2, arg.length() - 2); - val = ""; - } else { - key = string(arg, 2, pos - 2); - val = string(arg, pos + 1, arg.length() - 1); - } - pairs[key] = val; - } - } - - bool CheckCmdLineFlag(const char* arg_name) - { - using namespace std; - map::iterator itr; - if ((itr = pairs.find(arg_name)) != pairs.end()) { - return true; - } - return false; - } - - template - void GetCmdLineArgument(const char *arg_name, T &val); - - int ParsedArgc() - { - return pairs.size(); - } -}; - -template -void CommandLineArgs::GetCmdLineArgument(const char *arg_name, T &val) -{ - using namespace std; - map::iterator itr; - if ((itr = pairs.find(arg_name)) != pairs.end()) { - istringstream strstream(itr->second); - strstream >> val; - } -} - -template <> -void CommandLineArgs::GetCmdLineArgument(const char* arg_name, char* &val) -{ - using namespace std; - map::iterator itr; - if ((itr = pairs.find(arg_name)) != pairs.end()) { - - string s = itr->second; - val = (char*) malloc(sizeof(char) * (s.length() + 1)); - std::strcpy(val, s.c_str()); - - } else { - val = NULL; - } -} - -#endif //COMMAND_LINE_ARGS_H diff --git a/opencl/parallel_primitives/host/btAabbUtil2.h b/opencl/parallel_primitives/host/btAabbUtil2.h deleted file mode 100644 index d2997b4e6..000000000 --- a/opencl/parallel_primitives/host/btAabbUtil2.h +++ /dev/null @@ -1,232 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef BT_AABB_UTIL2 -#define BT_AABB_UTIL2 - -#include "btTransform.h" -#include "btVector3.h" -#include "btMinMax.h" - - - -SIMD_FORCE_INLINE void AabbExpand (btVector3& aabbMin, - btVector3& aabbMax, - const btVector3& expansionMin, - const btVector3& expansionMax) -{ - aabbMin = aabbMin + expansionMin; - aabbMax = aabbMax + expansionMax; -} - -/// conservative test for overlap between two aabbs -SIMD_FORCE_INLINE bool TestPointAgainstAabb2(const btVector3 &aabbMin1, const btVector3 &aabbMax1, - const btVector3 &point) -{ - bool overlap = true; - overlap = (aabbMin1.getX() > point.getX() || aabbMax1.getX() < point.getX()) ? false : overlap; - overlap = (aabbMin1.getZ() > point.getZ() || aabbMax1.getZ() < point.getZ()) ? false : overlap; - overlap = (aabbMin1.getY() > point.getY() || aabbMax1.getY() < point.getY()) ? false : overlap; - return overlap; -} - - -/// conservative test for overlap between two aabbs -SIMD_FORCE_INLINE bool TestAabbAgainstAabb2(const btVector3 &aabbMin1, const btVector3 &aabbMax1, - const btVector3 &aabbMin2, const btVector3 &aabbMax2) -{ - bool overlap = true; - overlap = (aabbMin1.getX() > aabbMax2.getX() || aabbMax1.getX() < aabbMin2.getX()) ? false : overlap; - overlap = (aabbMin1.getZ() > aabbMax2.getZ() || aabbMax1.getZ() < aabbMin2.getZ()) ? false : overlap; - overlap = (aabbMin1.getY() > aabbMax2.getY() || aabbMax1.getY() < aabbMin2.getY()) ? false : overlap; - return overlap; -} - -/// conservative test for overlap between triangle and aabb -SIMD_FORCE_INLINE bool TestTriangleAgainstAabb2(const btVector3 *vertices, - const btVector3 &aabbMin, const btVector3 &aabbMax) -{ - const btVector3 &p1 = vertices[0]; - const btVector3 &p2 = vertices[1]; - const btVector3 &p3 = vertices[2]; - - if (btMin(btMin(p1[0], p2[0]), p3[0]) > aabbMax[0]) return false; - if (btMax(btMax(p1[0], p2[0]), p3[0]) < aabbMin[0]) return false; - - if (btMin(btMin(p1[2], p2[2]), p3[2]) > aabbMax[2]) return false; - if (btMax(btMax(p1[2], p2[2]), p3[2]) < aabbMin[2]) return false; - - if (btMin(btMin(p1[1], p2[1]), p3[1]) > aabbMax[1]) return false; - if (btMax(btMax(p1[1], p2[1]), p3[1]) < aabbMin[1]) return false; - return true; -} - - -SIMD_FORCE_INLINE int btOutcode(const btVector3& p,const btVector3& halfExtent) -{ - return (p.getX() < -halfExtent.getX() ? 0x01 : 0x0) | - (p.getX() > halfExtent.getX() ? 0x08 : 0x0) | - (p.getY() < -halfExtent.getY() ? 0x02 : 0x0) | - (p.getY() > halfExtent.getY() ? 0x10 : 0x0) | - (p.getZ() < -halfExtent.getZ() ? 0x4 : 0x0) | - (p.getZ() > halfExtent.getZ() ? 0x20 : 0x0); -} - - - -SIMD_FORCE_INLINE bool btRayAabb2(const btVector3& rayFrom, - const btVector3& rayInvDirection, - const unsigned int raySign[3], - const btVector3 bounds[2], - btScalar& tmin, - btScalar lambda_min, - btScalar lambda_max) -{ - btScalar tmax, tymin, tymax, tzmin, tzmax; - tmin = (bounds[raySign[0]].getX() - rayFrom.getX()) * rayInvDirection.getX(); - tmax = (bounds[1-raySign[0]].getX() - rayFrom.getX()) * rayInvDirection.getX(); - tymin = (bounds[raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY(); - tymax = (bounds[1-raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY(); - - if ( (tmin > tymax) || (tymin > tmax) ) - return false; - - if (tymin > tmin) - tmin = tymin; - - if (tymax < tmax) - tmax = tymax; - - tzmin = (bounds[raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ(); - tzmax = (bounds[1-raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ(); - - if ( (tmin > tzmax) || (tzmin > tmax) ) - return false; - if (tzmin > tmin) - tmin = tzmin; - if (tzmax < tmax) - tmax = tzmax; - return ( (tmin < lambda_max) && (tmax > lambda_min) ); -} - -SIMD_FORCE_INLINE bool btRayAabb(const btVector3& rayFrom, - const btVector3& rayTo, - const btVector3& aabbMin, - const btVector3& aabbMax, - btScalar& param, btVector3& normal) -{ - btVector3 aabbHalfExtent = (aabbMax-aabbMin)* btScalar(0.5); - btVector3 aabbCenter = (aabbMax+aabbMin)* btScalar(0.5); - btVector3 source = rayFrom - aabbCenter; - btVector3 target = rayTo - aabbCenter; - int sourceOutcode = btOutcode(source,aabbHalfExtent); - int targetOutcode = btOutcode(target,aabbHalfExtent); - if ((sourceOutcode & targetOutcode) == 0x0) - { - btScalar lambda_enter = btScalar(0.0); - btScalar lambda_exit = param; - btVector3 r = target - source; - int i; - btScalar normSign = 1; - btVector3 hitNormal(0,0,0); - int bit=1; - - for (int j=0;j<2;j++) - { - for (i = 0; i != 3; ++i) - { - if (sourceOutcode & bit) - { - btScalar lambda = (-source[i] - aabbHalfExtent[i]*normSign) / r[i]; - if (lambda_enter <= lambda) - { - lambda_enter = lambda; - hitNormal.setValue(0,0,0); - hitNormal[i] = normSign; - } - } - else if (targetOutcode & bit) - { - btScalar lambda = (-source[i] - aabbHalfExtent[i]*normSign) / r[i]; - btSetMin(lambda_exit, lambda); - } - bit<<=1; - } - normSign = btScalar(-1.); - } - if (lambda_enter <= lambda_exit) - { - param = lambda_enter; - normal = hitNormal; - return true; - } - } - return false; -} - - - -SIMD_FORCE_INLINE void btTransformAabb(const btVector3& halfExtents, btScalar margin,const btTransform& t,btVector3& aabbMinOut,btVector3& aabbMaxOut) -{ - btVector3 halfExtentsWithMargin = halfExtents+btVector3(margin,margin,margin); - btMatrix3x3 abs_b = t.getBasis().absolute(); - btVector3 center = t.getOrigin(); - btVector3 extent = halfExtentsWithMargin.dot3( abs_b[0], abs_b[1], abs_b[2] ); - aabbMinOut = center - extent; - aabbMaxOut = center + extent; -} - - -SIMD_FORCE_INLINE void btTransformAabb(const btVector3& localAabbMin,const btVector3& localAabbMax, btScalar margin,const btTransform& trans,btVector3& aabbMinOut,btVector3& aabbMaxOut) -{ - btAssert(localAabbMin.getX() <= localAabbMax.getX()); - btAssert(localAabbMin.getY() <= localAabbMax.getY()); - btAssert(localAabbMin.getZ() <= localAabbMax.getZ()); - btVector3 localHalfExtents = btScalar(0.5)*(localAabbMax-localAabbMin); - localHalfExtents+=btVector3(margin,margin,margin); - - btVector3 localCenter = btScalar(0.5)*(localAabbMax+localAabbMin); - btMatrix3x3 abs_b = trans.getBasis().absolute(); - btVector3 center = trans(localCenter); - btVector3 extent = localHalfExtents.dot3( abs_b[0], abs_b[1], abs_b[2] ); - aabbMinOut = center-extent; - aabbMaxOut = center+extent; -} - -#define USE_BANCHLESS 1 -#ifdef USE_BANCHLESS - //This block replaces the block below and uses no branches, and replaces the 8 bit return with a 32 bit return for improved performance (~3x on XBox 360) - SIMD_FORCE_INLINE unsigned testQuantizedAabbAgainstQuantizedAabb(const unsigned short int* aabbMin1,const unsigned short int* aabbMax1,const unsigned short int* aabbMin2,const unsigned short int* aabbMax2) - { - return static_cast(btSelect((unsigned)((aabbMin1[0] <= aabbMax2[0]) & (aabbMax1[0] >= aabbMin2[0]) - & (aabbMin1[2] <= aabbMax2[2]) & (aabbMax1[2] >= aabbMin2[2]) - & (aabbMin1[1] <= aabbMax2[1]) & (aabbMax1[1] >= aabbMin2[1])), - 1, 0)); - } -#else - SIMD_FORCE_INLINE bool testQuantizedAabbAgainstQuantizedAabb(const unsigned short int* aabbMin1,const unsigned short int* aabbMax1,const unsigned short int* aabbMin2,const unsigned short int* aabbMax2) - { - bool overlap = true; - overlap = (aabbMin1[0] > aabbMax2[0] || aabbMax1[0] < aabbMin2[0]) ? false : overlap; - overlap = (aabbMin1[2] > aabbMax2[2] || aabbMax1[2] < aabbMin2[2]) ? false : overlap; - overlap = (aabbMin1[1] > aabbMax2[1] || aabbMax1[1] < aabbMin2[1]) ? false : overlap; - return overlap; - } -#endif //USE_BANCHLESS - -#endif //BT_AABB_UTIL2 - - diff --git a/opencl/parallel_primitives/host/btAlignedAllocator.cpp b/opencl/parallel_primitives/host/btAlignedAllocator.cpp deleted file mode 100644 index a65296c6a..000000000 --- a/opencl/parallel_primitives/host/btAlignedAllocator.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -#include "btAlignedAllocator.h" - -int gNumAlignedAllocs = 0; -int gNumAlignedFree = 0; -int gTotalBytesAlignedAllocs = 0;//detect memory leaks - -static void *btAllocDefault(size_t size) -{ - return malloc(size); -} - -static void btFreeDefault(void *ptr) -{ - free(ptr); -} - -static btAllocFunc *sAllocFunc = btAllocDefault; -static btFreeFunc *sFreeFunc = btFreeDefault; - - - -#if defined (BT_HAS_ALIGNED_ALLOCATOR) -#include -static void *btAlignedAllocDefault(size_t size, int alignment) -{ - return _aligned_malloc(size, (size_t)alignment); -} - -static void btAlignedFreeDefault(void *ptr) -{ - _aligned_free(ptr); -} -#elif defined(__CELLOS_LV2__) -#include - -static inline void *btAlignedAllocDefault(size_t size, int alignment) -{ - return memalign(alignment, size); -} - -static inline void btAlignedFreeDefault(void *ptr) -{ - free(ptr); -} -#else - - - - - -static inline void *btAlignedAllocDefault(size_t size, int alignment) -{ - void *ret; - char *real; - real = (char *)sAllocFunc(size + sizeof(void *) + (alignment-1)); - if (real) { - ret = btAlignPointer(real + sizeof(void *),alignment); - *((void **)(ret)-1) = (void *)(real); - } else { - ret = (void *)(real); - } - return (ret); -} - -static inline void btAlignedFreeDefault(void *ptr) -{ - void* real; - - if (ptr) { - real = *((void **)(ptr)-1); - sFreeFunc(real); - } -} -#endif - - -static btAlignedAllocFunc *sAlignedAllocFunc = btAlignedAllocDefault; -static btAlignedFreeFunc *sAlignedFreeFunc = btAlignedFreeDefault; - -void btAlignedAllocSetCustomAligned(btAlignedAllocFunc *allocFunc, btAlignedFreeFunc *freeFunc) -{ - sAlignedAllocFunc = allocFunc ? allocFunc : btAlignedAllocDefault; - sAlignedFreeFunc = freeFunc ? freeFunc : btAlignedFreeDefault; -} - -void btAlignedAllocSetCustom(btAllocFunc *allocFunc, btFreeFunc *freeFunc) -{ - sAllocFunc = allocFunc ? allocFunc : btAllocDefault; - sFreeFunc = freeFunc ? freeFunc : btFreeDefault; -} - -#ifdef BT_DEBUG_MEMORY_ALLOCATIONS -//this generic allocator provides the total allocated number of bytes -#include - -void* btAlignedAllocInternal (size_t size, int alignment,int line,char* filename) -{ - void *ret; - char *real; - - gTotalBytesAlignedAllocs += size; - gNumAlignedAllocs++; - - - real = (char *)sAllocFunc(size + 2*sizeof(void *) + (alignment-1)); - if (real) { - ret = (void*) btAlignPointer(real + 2*sizeof(void *), alignment); - *((void **)(ret)-1) = (void *)(real); - *((int*)(ret)-2) = size; - - } else { - ret = (void *)(real);//?? - } - - printf("allocation#%d at address %x, from %s,line %d, size %d\n",gNumAlignedAllocs,real, filename,line,size); - - int* ptr = (int*)ret; - *ptr = 12; - return (ret); -} - -void btAlignedFreeInternal (void* ptr,int line,char* filename) -{ - - void* real; - gNumAlignedFree++; - - if (ptr) { - real = *((void **)(ptr)-1); - int size = *((int*)(ptr)-2); - gTotalBytesAlignedAllocs -= size; - - printf("free #%d at address %x, from %s,line %d, size %d\n",gNumAlignedFree,real, filename,line,size); - - sFreeFunc(real); - } else - { - printf("NULL ptr\n"); - } -} - -#else //BT_DEBUG_MEMORY_ALLOCATIONS - -void* btAlignedAllocInternal (size_t size, int alignment) -{ - gNumAlignedAllocs++; - void* ptr; - ptr = sAlignedAllocFunc(size, alignment); -// printf("btAlignedAllocInternal %d, %x\n",size,ptr); - return ptr; -} - -void btAlignedFreeInternal (void* ptr) -{ - if (!ptr) - { - return; - } - - gNumAlignedFree++; -// printf("btAlignedFreeInternal %x\n",ptr); - sAlignedFreeFunc(ptr); -} - -#endif //BT_DEBUG_MEMORY_ALLOCATIONS - diff --git a/opencl/parallel_primitives/host/btAlignedAllocator.h b/opencl/parallel_primitives/host/btAlignedAllocator.h deleted file mode 100644 index f168f3c66..000000000 --- a/opencl/parallel_primitives/host/btAlignedAllocator.h +++ /dev/null @@ -1,107 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BT_ALIGNED_ALLOCATOR -#define BT_ALIGNED_ALLOCATOR - -///we probably replace this with our own aligned memory allocator -///so we replace _aligned_malloc and _aligned_free with our own -///that is better portable and more predictable - -#include "btScalar.h" -//#define BT_DEBUG_MEMORY_ALLOCATIONS 1 -#ifdef BT_DEBUG_MEMORY_ALLOCATIONS - -#define btAlignedAlloc(a,b) \ - btAlignedAllocInternal(a,b,__LINE__,__FILE__) - -#define btAlignedFree(ptr) \ - btAlignedFreeInternal(ptr,__LINE__,__FILE__) - -void* btAlignedAllocInternal (size_t size, int alignment,int line,char* filename); - -void btAlignedFreeInternal (void* ptr,int line,char* filename); - -#else - void* btAlignedAllocInternal (size_t size, int alignment); - void btAlignedFreeInternal (void* ptr); - - #define btAlignedAlloc(size,alignment) btAlignedAllocInternal(size,alignment) - #define btAlignedFree(ptr) btAlignedFreeInternal(ptr) - -#endif -typedef int size_type; - -typedef void *(btAlignedAllocFunc)(size_t size, int alignment); -typedef void (btAlignedFreeFunc)(void *memblock); -typedef void *(btAllocFunc)(size_t size); -typedef void (btFreeFunc)(void *memblock); - -///The developer can let all Bullet memory allocations go through a custom memory allocator, using btAlignedAllocSetCustom -void btAlignedAllocSetCustom(btAllocFunc *allocFunc, btFreeFunc *freeFunc); -///If the developer has already an custom aligned allocator, then btAlignedAllocSetCustomAligned can be used. The default aligned allocator pre-allocates extra memory using the non-aligned allocator, and instruments it. -void btAlignedAllocSetCustomAligned(btAlignedAllocFunc *allocFunc, btAlignedFreeFunc *freeFunc); - - -///The btAlignedAllocator is a portable class for aligned memory allocations. -///Default implementations for unaligned and aligned allocations can be overridden by a custom allocator using btAlignedAllocSetCustom and btAlignedAllocSetCustomAligned. -template < typename T , unsigned Alignment > -class btAlignedAllocator { - - typedef btAlignedAllocator< T , Alignment > self_type; - -public: - - //just going down a list: - btAlignedAllocator() {} - /* - btAlignedAllocator( const self_type & ) {} - */ - - template < typename Other > - btAlignedAllocator( const btAlignedAllocator< Other , Alignment > & ) {} - - typedef const T* const_pointer; - typedef const T& const_reference; - typedef T* pointer; - typedef T& reference; - typedef T value_type; - - pointer address ( reference ref ) const { return &ref; } - const_pointer address ( const_reference ref ) const { return &ref; } - pointer allocate ( size_type n , const_pointer * hint = 0 ) { - (void)hint; - return reinterpret_cast< pointer >(btAlignedAlloc( sizeof(value_type) * n , Alignment )); - } - void construct ( pointer ptr , const value_type & value ) { new (ptr) value_type( value ); } - void deallocate( pointer ptr ) { - btAlignedFree( reinterpret_cast< void * >( ptr ) ); - } - void destroy ( pointer ptr ) { ptr->~value_type(); } - - - template < typename O > struct rebind { - typedef btAlignedAllocator< O , Alignment > other; - }; - template < typename O > - self_type & operator=( const btAlignedAllocator< O , Alignment > & ) { return *this; } - - friend bool operator==( const self_type & , const self_type & ) { return true; } -}; - - - -#endif //BT_ALIGNED_ALLOCATOR - diff --git a/opencl/parallel_primitives/host/btAlignedObjectArray.h b/opencl/parallel_primitives/host/btAlignedObjectArray.h deleted file mode 100644 index 24e59ab65..000000000 --- a/opencl/parallel_primitives/host/btAlignedObjectArray.h +++ /dev/null @@ -1,511 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef BT_OBJECT_ARRAY__ -#define BT_OBJECT_ARRAY__ - -#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE -#include "btAlignedAllocator.h" - -///If the platform doesn't support placement new, you can disable BT_USE_PLACEMENT_NEW -///then the btAlignedObjectArray doesn't support objects with virtual methods, and non-trivial constructors/destructors -///You can enable BT_USE_MEMCPY, then swapping elements in the array will use memcpy instead of operator= -///see discussion here: http://continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1231 and -///http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1240 - -#define BT_USE_PLACEMENT_NEW 1 -//#define BT_USE_MEMCPY 1 //disable, because it is cumbersome to find out for each platform where memcpy is defined. It can be in or or otherwise... -#define BT_ALLOW_ARRAY_COPY_OPERATOR // enabling this can accidently perform deep copies of data if you are not careful - -#ifdef BT_USE_MEMCPY -#include -#include -#endif //BT_USE_MEMCPY - -#ifdef BT_USE_PLACEMENT_NEW -#include //for placement new -#endif //BT_USE_PLACEMENT_NEW - - -///The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods -///It is developed to replace stl::vector to avoid portability issues, including STL alignment issues to add SIMD/SSE data -template -//template -class btAlignedObjectArray -{ - btAlignedAllocator m_allocator; - - int m_size; - int m_capacity; - T* m_data; - //PCK: added this line - bool m_ownsMemory; - -#ifdef BT_ALLOW_ARRAY_COPY_OPERATOR -public: - SIMD_FORCE_INLINE btAlignedObjectArray& operator=(const btAlignedObjectArray &other) - { - copyFromArray(other); - return *this; - } -#else//BT_ALLOW_ARRAY_COPY_OPERATOR -private: - SIMD_FORCE_INLINE btAlignedObjectArray& operator=(const btAlignedObjectArray &other); -#endif//BT_ALLOW_ARRAY_COPY_OPERATOR - -protected: - SIMD_FORCE_INLINE int allocSize(int size) - { - return (size ? size*2 : 1); - } - SIMD_FORCE_INLINE void copy(int start,int end, T* dest) const - { - int i; - for (i=start;i=0); - btAssert(n=0); - btAssert(n=0); - btAssert(n=0); - btAssert(n0); - m_size--; - m_data[m_size].~T(); - } - - - ///resize changes the number of elements in the array. If the new size is larger, the new elements will be constructed using the optional second argument. - ///when the new number of elements is smaller, the destructor will be called, but memory will not be freed, to reduce performance overhead of run-time memory (de)allocations. - SIMD_FORCE_INLINE void resizeNoInitialize(int newsize) - { - int curSize = size(); - - if (newsize < curSize) - { - } else - { - if (newsize > size()) - { - reserve(newsize); - } - //leave this uninitialized - } - m_size = newsize; - } - - SIMD_FORCE_INLINE void resize(int newsize, const T& fillData=T()) - { - int curSize = size(); - - if (newsize < curSize) - { - for(int i = newsize; i < curSize; i++) - { - m_data[i].~T(); - } - } else - { - if (newsize > size()) - { - reserve(newsize); - } -#ifdef BT_USE_PLACEMENT_NEW - for (int i=curSize;i - void quickSortInternal(const L& CompareFunc,int lo, int hi) - { - // lo is the lower index, hi is the upper index - // of the region of array a that is to be sorted - int i=lo, j=hi; - T x=m_data[(lo+hi)/2]; - - // partition - do - { - while (CompareFunc(m_data[i],x)) - i++; - while (CompareFunc(x,m_data[j])) - j--; - if (i<=j) - { - swap(i,j); - i++; j--; - } - } while (i<=j); - - // recursion - if (lo - void quickSort(const L& CompareFunc) - { - //don't sort 0 or 1 elements - if (size()>1) - { - quickSortInternal(CompareFunc,0,size()-1); - } - } - - - ///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/ - template - void downHeap(T *pArr, int k, int n, const L& CompareFunc) - { - /* PRE: a[k+1..N] is a heap */ - /* POST: a[k..N] is a heap */ - - T temp = pArr[k - 1]; - /* k has child(s) */ - while (k <= n/2) - { - int child = 2*k; - - if ((child < n) && CompareFunc(pArr[child - 1] , pArr[child])) - { - child++; - } - /* pick larger child */ - if (CompareFunc(temp , pArr[child - 1])) - { - /* move child up */ - pArr[k - 1] = pArr[child - 1]; - k = child; - } - else - { - break; - } - } - pArr[k - 1] = temp; - } /*downHeap*/ - - void swap(int index0,int index1) - { -#ifdef BT_USE_MEMCPY - char temp[sizeof(T)]; - memcpy(temp,&m_data[index0],sizeof(T)); - memcpy(&m_data[index0],&m_data[index1],sizeof(T)); - memcpy(&m_data[index1],temp,sizeof(T)); -#else - T temp = m_data[index0]; - m_data[index0] = m_data[index1]; - m_data[index1] = temp; -#endif //BT_USE_PLACEMENT_NEW - - } - - template - void heapSort(const L& CompareFunc) - { - /* sort a[0..N-1], N.B. 0 to N-1 */ - int k; - int n = m_size; - for (k = n/2; k > 0; k--) - { - downHeap(m_data, k, n, CompareFunc); - } - - /* a[1..N] is now a heap */ - while ( n>=1 ) - { - swap(0,n-1); /* largest of a[0..n-1] */ - - - n = n - 1; - /* restore a[1..i-1] heap */ - downHeap(m_data, 1, n, CompareFunc); - } - } - - ///non-recursive binary search, assumes sorted array - int findBinarySearch(const T& key) const - { - int first = 0; - int last = size()-1; - - //assume sorted array - while (first <= last) { - int mid = (first + last) / 2; // compute mid point. - if (key > m_data[mid]) - first = mid + 1; // repeat search in top half. - else if (key < m_data[mid]) - last = mid - 1; // repeat search in bottom half. - else - return mid; // found it. return position ///// - } - return size(); // failed to find key - } - - - int findLinearSearch(const T& key) const - { - int index=size(); - int i; - - for (i=0;i - -#include "btConvexHull.h" -#include "btAlignedObjectArray.h" -#include "btMinMax.h" -#include "btVector3.h" - - - - - -//---------------------------------- - -class int3 -{ -public: - int x,y,z; - int3(){}; - int3(int _x,int _y, int _z){x=_x;y=_y;z=_z;} - const int& operator[](int i) const {return (&x)[i];} - int& operator[](int i) {return (&x)[i];} -}; - - -//------- btPlane ---------- - - -inline btPlane PlaneFlip(const btPlane &plane){return btPlane(-plane.normal,-plane.dist);} -inline int operator==( const btPlane &a, const btPlane &b ) { return (a.normal==b.normal && a.dist==b.dist); } -inline int coplanar( const btPlane &a, const btPlane &b ) { return (a==b || a==PlaneFlip(b)); } - - -//--------- Utility Functions ------ - -btVector3 PlaneLineIntersection(const btPlane &plane, const btVector3 &p0, const btVector3 &p1); -btVector3 PlaneProject(const btPlane &plane, const btVector3 &point); - -btVector3 ThreePlaneIntersection(const btPlane &p0,const btPlane &p1, const btPlane &p2); -btVector3 ThreePlaneIntersection(const btPlane &p0,const btPlane &p1, const btPlane &p2) -{ - btVector3 N1 = p0.normal; - btVector3 N2 = p1.normal; - btVector3 N3 = p2.normal; - - btVector3 n2n3; n2n3 = N2.cross(N3); - btVector3 n3n1; n3n1 = N3.cross(N1); - btVector3 n1n2; n1n2 = N1.cross(N2); - - btScalar quotient = (N1.dot(n2n3)); - - btAssert(btFabs(quotient) > btScalar(0.000001)); - - quotient = btScalar(-1.) / quotient; - n2n3 *= p0.dist; - n3n1 *= p1.dist; - n1n2 *= p2.dist; - btVector3 potentialVertex = n2n3; - potentialVertex += n3n1; - potentialVertex += n1n2; - potentialVertex *= quotient; - - btVector3 result(potentialVertex.getX(),potentialVertex.getY(),potentialVertex.getZ()); - return result; - -} - -btScalar DistanceBetweenLines(const btVector3 &ustart, const btVector3 &udir, const btVector3 &vstart, const btVector3 &vdir, btVector3 *upoint=NULL, btVector3 *vpoint=NULL); -btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2); -btVector3 NormalOf(const btVector3 *vert, const int n); - - -btVector3 PlaneLineIntersection(const btPlane &plane, const btVector3 &p0, const btVector3 &p1) -{ - // returns the point where the line p0-p1 intersects the plane n&d - static btVector3 dif; - dif = p1-p0; - btScalar dn= btDot(plane.normal,dif); - btScalar t = -(plane.dist+btDot(plane.normal,p0) )/dn; - return p0 + (dif*t); -} - -btVector3 PlaneProject(const btPlane &plane, const btVector3 &point) -{ - return point - plane.normal * (btDot(point,plane.normal)+plane.dist); -} - -btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2) -{ - // return the normal of the triangle - // inscribed by v0, v1, and v2 - btVector3 cp=btCross(v1-v0,v2-v1); - btScalar m=cp.length(); - if(m==0) return btVector3(1,0,0); - return cp*(btScalar(1.0)/m); -} - - -btScalar DistanceBetweenLines(const btVector3 &ustart, const btVector3 &udir, const btVector3 &vstart, const btVector3 &vdir, btVector3 *upoint, btVector3 *vpoint) -{ - static btVector3 cp; - cp = btCross(udir,vdir).normalized(); - - btScalar distu = -btDot(cp,ustart); - btScalar distv = -btDot(cp,vstart); - btScalar dist = (btScalar)fabs(distu-distv); - if(upoint) - { - btPlane plane; - plane.normal = btCross(vdir,cp).normalized(); - plane.dist = -btDot(plane.normal,vstart); - *upoint = PlaneLineIntersection(plane,ustart,ustart+udir); - } - if(vpoint) - { - btPlane plane; - plane.normal = btCross(udir,cp).normalized(); - plane.dist = -btDot(plane.normal,ustart); - *vpoint = PlaneLineIntersection(plane,vstart,vstart+vdir); - } - return dist; -} - - - - - - - -#define COPLANAR (0) -#define UNDER (1) -#define OVER (2) -#define SPLIT (OVER|UNDER) -#define PAPERWIDTH (btScalar(0.001)) - -btScalar planetestepsilon = PAPERWIDTH; - - - -typedef ConvexH::HalfEdge HalfEdge; - -ConvexH::ConvexH(int vertices_size,int edges_size,int facets_size) -{ - vertices.resize(vertices_size); - edges.resize(edges_size); - facets.resize(facets_size); -} - - -int PlaneTest(const btPlane &p, const btVector3 &v); -int PlaneTest(const btPlane &p, const btVector3 &v) { - btScalar a = btDot(v,p.normal)+p.dist; - int flag = (a>planetestepsilon)?OVER:((a<-planetestepsilon)?UNDER:COPLANAR); - return flag; -} - -int SplitTest(ConvexH &convex,const btPlane &plane); -int SplitTest(ConvexH &convex,const btPlane &plane) { - int flag=0; - for(int i=0;i -int maxdirfiltered(const T *p,int count,const T &dir,btAlignedObjectArray &allow) -{ - btAssert(count); - int m=-1; - for(int i=0;ibtDot(p[m],dir)) - m=i; - } - btAssert(m!=-1); - return m; -} - -btVector3 orth(const btVector3 &v); -btVector3 orth(const btVector3 &v) -{ - btVector3 a=btCross(v,btVector3(0,0,1)); - btVector3 b=btCross(v,btVector3(0,1,0)); - if (a.length() > b.length()) - { - return a.normalized(); - } else { - return b.normalized(); - } -} - - -template -int maxdirsterid(const T *p,int count,const T &dir,btAlignedObjectArray &allow) -{ - int m=-1; - while(m==-1) - { - m = maxdirfiltered(p,count,dir,allow); - if(allow[m]==3) return m; - T u = orth(dir); - T v = btCross(u,dir); - int ma=-1; - for(btScalar x = btScalar(0.0) ; x<= btScalar(360.0) ; x+= btScalar(45.0)) - { - btScalar s = btSin(SIMD_RADS_PER_DEG*(x)); - btScalar c = btCos(SIMD_RADS_PER_DEG*(x)); - int mb = maxdirfiltered(p,count,dir+(u*s+v*c)*btScalar(0.025),allow); - if(ma==m && mb==m) - { - allow[m]=3; - return m; - } - if(ma!=-1 && ma!=mb) // Yuck - this is really ugly - { - int mc = ma; - for(btScalar xx = x-btScalar(40.0) ; xx <= x ; xx+= btScalar(5.0)) - { - btScalar s = btSin(SIMD_RADS_PER_DEG*(xx)); - btScalar c = btCos(SIMD_RADS_PER_DEG*(xx)); - int md = maxdirfiltered(p,count,dir+(u*s+v*c)*btScalar(0.025),allow); - if(mc==m && md==m) - { - allow[m]=3; - return m; - } - mc=md; - } - } - ma=mb; - } - allow[m]=0; - m=-1; - } - btAssert(0); - return m; -} - - - - -int operator ==(const int3 &a,const int3 &b); -int operator ==(const int3 &a,const int3 &b) -{ - for(int i=0;i<3;i++) - { - if(a[i]!=b[i]) return 0; - } - return 1; -} - - -int above(btVector3* vertices,const int3& t, const btVector3 &p, btScalar epsilon); -int above(btVector3* vertices,const int3& t, const btVector3 &p, btScalar epsilon) -{ - btVector3 n=TriNormal(vertices[t[0]],vertices[t[1]],vertices[t[2]]); - return (btDot(n,p-vertices[t[0]]) > epsilon); // EPSILON??? -} -int hasedge(const int3 &t, int a,int b); -int hasedge(const int3 &t, int a,int b) -{ - for(int i=0;i<3;i++) - { - int i1= (i+1)%3; - if(t[i]==a && t[i1]==b) return 1; - } - return 0; -} -int hasvert(const int3 &t, int v); -int hasvert(const int3 &t, int v) -{ - return (t[0]==v || t[1]==v || t[2]==v) ; -} -int shareedge(const int3 &a,const int3 &b); -int shareedge(const int3 &a,const int3 &b) -{ - int i; - for(i=0;i<3;i++) - { - int i1= (i+1)%3; - if(hasedge(a,b[i1],b[i])) return 1; - } - return 0; -} - -class btHullTriangle; - - - -class btHullTriangle : public int3 -{ -public: - int3 n; - int id; - int vmax; - btScalar rise; - btHullTriangle(int a,int b,int c):int3(a,b,c),n(-1,-1,-1) - { - vmax=-1; - rise = btScalar(0.0); - } - ~btHullTriangle() - { - } - int &neib(int a,int b); -}; - - -int &btHullTriangle::neib(int a,int b) -{ - static int er=-1; - int i; - for(i=0;i<3;i++) - { - int i1=(i+1)%3; - int i2=(i+2)%3; - if((*this)[i]==a && (*this)[i1]==b) return n[i2]; - if((*this)[i]==b && (*this)[i1]==a) return n[i2]; - } - btAssert(0); - return er; -} -void HullLibrary::b2bfix(btHullTriangle* s,btHullTriangle*t) -{ - int i; - for(i=0;i<3;i++) - { - int i1=(i+1)%3; - int i2=(i+2)%3; - int a = (*s)[i1]; - int b = (*s)[i2]; - btAssert(m_tris[s->neib(a,b)]->neib(b,a) == s->id); - btAssert(m_tris[t->neib(a,b)]->neib(b,a) == t->id); - m_tris[s->neib(a,b)]->neib(b,a) = t->neib(b,a); - m_tris[t->neib(b,a)]->neib(a,b) = s->neib(a,b); - } -} - -void HullLibrary::removeb2b(btHullTriangle* s,btHullTriangle*t) -{ - b2bfix(s,t); - deAllocateTriangle(s); - - deAllocateTriangle(t); -} - -void HullLibrary::checkit(btHullTriangle *t) -{ - (void)t; - - int i; - btAssert(m_tris[t->id]==t); - for(i=0;i<3;i++) - { - int i1=(i+1)%3; - int i2=(i+2)%3; - int a = (*t)[i1]; - int b = (*t)[i2]; - - // release compile fix - (void)i1; - (void)i2; - (void)a; - (void)b; - - btAssert(a!=b); - btAssert( m_tris[t->n[i]]->neib(b,a) == t->id); - } -} - -btHullTriangle* HullLibrary::allocateTriangle(int a,int b,int c) -{ - void* mem = btAlignedAlloc(sizeof(btHullTriangle),16); - btHullTriangle* tr = new (mem)btHullTriangle(a,b,c); - tr->id = m_tris.size(); - m_tris.push_back(tr); - - return tr; -} - -void HullLibrary::deAllocateTriangle(btHullTriangle* tri) -{ - btAssert(m_tris[tri->id]==tri); - m_tris[tri->id]=NULL; - tri->~btHullTriangle(); - btAlignedFree(tri); -} - - -void HullLibrary::extrude(btHullTriangle *t0,int v) -{ - int3 t= *t0; - int n = m_tris.size(); - btHullTriangle* ta = allocateTriangle(v,t[1],t[2]); - ta->n = int3(t0->n[0],n+1,n+2); - m_tris[t0->n[0]]->neib(t[1],t[2]) = n+0; - btHullTriangle* tb = allocateTriangle(v,t[2],t[0]); - tb->n = int3(t0->n[1],n+2,n+0); - m_tris[t0->n[1]]->neib(t[2],t[0]) = n+1; - btHullTriangle* tc = allocateTriangle(v,t[0],t[1]); - tc->n = int3(t0->n[2],n+0,n+1); - m_tris[t0->n[2]]->neib(t[0],t[1]) = n+2; - checkit(ta); - checkit(tb); - checkit(tc); - if(hasvert(*m_tris[ta->n[0]],v)) removeb2b(ta,m_tris[ta->n[0]]); - if(hasvert(*m_tris[tb->n[0]],v)) removeb2b(tb,m_tris[tb->n[0]]); - if(hasvert(*m_tris[tc->n[0]],v)) removeb2b(tc,m_tris[tc->n[0]]); - deAllocateTriangle(t0); - -} - -btHullTriangle* HullLibrary::extrudable(btScalar epsilon) -{ - int i; - btHullTriangle *t=NULL; - for(i=0;iriserise)) - { - t = m_tris[i]; - } - } - return (t->rise >epsilon)?t:NULL ; -} - - - - -int4 HullLibrary::FindSimplex(btVector3 *verts,int verts_count,btAlignedObjectArray &allow) -{ - btVector3 basis[3]; - basis[0] = btVector3( btScalar(0.01), btScalar(0.02), btScalar(1.0) ); - int p0 = maxdirsterid(verts,verts_count, basis[0],allow); - int p1 = maxdirsterid(verts,verts_count,-basis[0],allow); - basis[0] = verts[p0]-verts[p1]; - if(p0==p1 || basis[0]==btVector3(0,0,0)) - return int4(-1,-1,-1,-1); - basis[1] = btCross(btVector3( btScalar(1),btScalar(0.02), btScalar(0)),basis[0]); - basis[2] = btCross(btVector3(btScalar(-0.02), btScalar(1), btScalar(0)),basis[0]); - if (basis[1].length() > basis[2].length()) - { - basis[1].normalize(); - } else { - basis[1] = basis[2]; - basis[1].normalize (); - } - int p2 = maxdirsterid(verts,verts_count,basis[1],allow); - if(p2 == p0 || p2 == p1) - { - p2 = maxdirsterid(verts,verts_count,-basis[1],allow); - } - if(p2 == p0 || p2 == p1) - return int4(-1,-1,-1,-1); - basis[1] = verts[p2] - verts[p0]; - basis[2] = btCross(basis[1],basis[0]).normalized(); - int p3 = maxdirsterid(verts,verts_count,basis[2],allow); - if(p3==p0||p3==p1||p3==p2) p3 = maxdirsterid(verts,verts_count,-basis[2],allow); - if(p3==p0||p3==p1||p3==p2) - return int4(-1,-1,-1,-1); - btAssert(!(p0==p1||p0==p2||p0==p3||p1==p2||p1==p3||p2==p3)); - if(btDot(verts[p3]-verts[p0],btCross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {btSwap(p2,p3);} - return int4(p0,p1,p2,p3); -} - -int HullLibrary::calchullgen(btVector3 *verts,int verts_count, int vlimit) -{ - if(verts_count <4) return 0; - if(vlimit==0) vlimit=1000000000; - int j; - btVector3 bmin(*verts),bmax(*verts); - btAlignedObjectArray isextreme; - isextreme.reserve(verts_count); - btAlignedObjectArray allow; - allow.reserve(verts_count); - - for(j=0;jn=int3(2,3,1); - btHullTriangle *t1 = allocateTriangle(p[3],p[2],p[0]); t1->n=int3(3,2,0); - btHullTriangle *t2 = allocateTriangle(p[0],p[1],p[3]); t2->n=int3(0,1,3); - btHullTriangle *t3 = allocateTriangle(p[1],p[0],p[2]); t3->n=int3(1,0,2); - isextreme[p[0]]=isextreme[p[1]]=isextreme[p[2]]=isextreme[p[3]]=1; - checkit(t0);checkit(t1);checkit(t2);checkit(t3); - - for(j=0;jvmax<0); - btVector3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]); - t->vmax = maxdirsterid(verts,verts_count,n,allow); - t->rise = btDot(n,verts[t->vmax]-verts[(*t)[0]]); - } - btHullTriangle *te; - vlimit-=4; - while(vlimit >0 && ((te=extrudable(epsilon)) != 0)) - { - //int3 ti=*te; - int v=te->vmax; - btAssert(v != -1); - btAssert(!isextreme[v]); // wtf we've already done this vertex - isextreme[v]=1; - //if(v==p0 || v==p1 || v==p2 || v==p3) continue; // done these already - j=m_tris.size(); - while(j--) { - if(!m_tris[j]) continue; - int3 t=*m_tris[j]; - if(above(verts,t,verts[v],btScalar(0.01)*epsilon)) - { - extrude(m_tris[j],v); - } - } - // now check for those degenerate cases where we have a flipped triangle or a really skinny triangle - j=m_tris.size(); - while(j--) - { - if(!m_tris[j]) continue; - if(!hasvert(*m_tris[j],v)) break; - int3 nt=*m_tris[j]; - if(above(verts,nt,center,btScalar(0.01)*epsilon) || btCross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]).length()< epsilon*epsilon*btScalar(0.1) ) - { - btHullTriangle *nb = m_tris[m_tris[j]->n[0]]; - btAssert(nb);btAssert(!hasvert(*nb,v));btAssert(nb->idvmax>=0) break; - btVector3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]); - t->vmax = maxdirsterid(verts,verts_count,n,allow); - if(isextreme[t->vmax]) - { - t->vmax=-1; // already done that vertex - algorithm needs to be able to terminate. - } - else - { - t->rise = btDot(n,verts[t->vmax]-verts[(*t)[0]]); - } - } - vlimit --; - } - return 1; -} - -int HullLibrary::calchull(btVector3 *verts,int verts_count, TUIntArray& tris_out, int &tris_count,int vlimit) -{ - int rc=calchullgen(verts,verts_count, vlimit) ; - if(!rc) return 0; - btAlignedObjectArray ts; - int i; - - for(i=0;i(ts[i]); - } - m_tris.resize(0); - - return 1; -} - - - - - -bool HullLibrary::ComputeHull(unsigned int vcount,const btVector3 *vertices,PHullResult &result,unsigned int vlimit) -{ - - int tris_count; - int ret = calchull( (btVector3 *) vertices, (int) vcount, result.m_Indices, tris_count, static_cast(vlimit) ); - if(!ret) return false; - result.mIndexCount = (unsigned int) (tris_count*3); - result.mFaceCount = (unsigned int) tris_count; - result.mVertices = (btVector3*) vertices; - result.mVcount = (unsigned int) vcount; - return true; - -} - - -void ReleaseHull(PHullResult &result); -void ReleaseHull(PHullResult &result) -{ - if ( result.m_Indices.size() ) - { - result.m_Indices.clear(); - } - - result.mVcount = 0; - result.mIndexCount = 0; - result.mVertices = 0; -} - - -//********************************************************************* -//********************************************************************* -//******** HullLib header -//********************************************************************* -//********************************************************************* - -//********************************************************************* -//********************************************************************* -//******** HullLib implementation -//********************************************************************* -//********************************************************************* - -HullError HullLibrary::CreateConvexHull(const HullDesc &desc, // describes the input request - HullResult &result) // contains the resulst -{ - HullError ret = QE_FAIL; - - - PHullResult hr; - - unsigned int vcount = desc.mVcount; - if ( vcount < 8 ) vcount = 8; - - btAlignedObjectArray vertexSource; - vertexSource.resize(static_cast(vcount)); - - btVector3 scale; - - unsigned int ovcount; - - bool ok = CleanupVertices(desc.mVcount,desc.mVertices, desc.mVertexStride, ovcount, &vertexSource[0], desc.mNormalEpsilon, scale ); // normalize point cloud, remove duplicates! - - if ( ok ) - { - - -// if ( 1 ) // scale vertices back to their original size. - { - for (unsigned int i=0; i(i)]; - v[0]*=scale[0]; - v[1]*=scale[1]; - v[2]*=scale[2]; - } - } - - ok = ComputeHull(ovcount,&vertexSource[0],hr,desc.mMaxVertices); - - if ( ok ) - { - - // re-index triangle mesh so it refers to only used vertices, rebuild a new vertex table. - btAlignedObjectArray vertexScratch; - vertexScratch.resize(static_cast(hr.mVcount)); - - BringOutYourDead(hr.mVertices,hr.mVcount, &vertexScratch[0], ovcount, &hr.m_Indices[0], hr.mIndexCount ); - - ret = QE_OK; - - if ( desc.HasHullFlag(QF_TRIANGLES) ) // if he wants the results as triangle! - { - result.mPolygons = false; - result.mNumOutputVertices = ovcount; - result.m_OutputVertices.resize(static_cast(ovcount)); - result.mNumFaces = hr.mFaceCount; - result.mNumIndices = hr.mIndexCount; - - result.m_Indices.resize(static_cast(hr.mIndexCount)); - - memcpy(&result.m_OutputVertices[0], &vertexScratch[0], sizeof(btVector3)*ovcount ); - - if ( desc.HasHullFlag(QF_REVERSE_ORDER) ) - { - - const unsigned int *source = &hr.m_Indices[0]; - unsigned int *dest = &result.m_Indices[0]; - - for (unsigned int i=0; i(ovcount)); - result.mNumFaces = hr.mFaceCount; - result.mNumIndices = hr.mIndexCount+hr.mFaceCount; - result.m_Indices.resize(static_cast(result.mNumIndices)); - memcpy(&result.m_OutputVertices[0], &vertexScratch[0], sizeof(btVector3)*ovcount ); - -// if ( 1 ) - { - const unsigned int *source = &hr.m_Indices[0]; - unsigned int *dest = &result.m_Indices[0]; - for (unsigned int i=0; i bmax[j] ) bmax[j] = p[j]; - } - } - } - - btScalar dx = bmax[0] - bmin[0]; - btScalar dy = bmax[1] - bmin[1]; - btScalar dz = bmax[2] - bmin[2]; - - btVector3 center; - - center[0] = dx*btScalar(0.5) + bmin[0]; - center[1] = dy*btScalar(0.5) + bmin[1]; - center[2] = dz*btScalar(0.5) + bmin[2]; - - if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || svcount < 3 ) - { - - btScalar len = FLT_MAX; - - if ( dx > EPSILON && dx < len ) len = dx; - if ( dy > EPSILON && dy < len ) len = dy; - if ( dz > EPSILON && dz < len ) len = dz; - - if ( len == FLT_MAX ) - { - dx = dy = dz = btScalar(0.01); // one centimeter - } - else - { - if ( dx < EPSILON ) dx = len * btScalar(0.05); // 1/5th the shortest non-zero edge. - if ( dy < EPSILON ) dy = len * btScalar(0.05); - if ( dz < EPSILON ) dz = len * btScalar(0.05); - } - - btScalar x1 = center[0] - dx; - btScalar x2 = center[0] + dx; - - btScalar y1 = center[1] - dy; - btScalar y2 = center[1] + dy; - - btScalar z1 = center[2] - dz; - btScalar z2 = center[2] + dz; - - addPoint(vcount,vertices,x1,y1,z1); - addPoint(vcount,vertices,x2,y1,z1); - addPoint(vcount,vertices,x2,y2,z1); - addPoint(vcount,vertices,x1,y2,z1); - addPoint(vcount,vertices,x1,y1,z2); - addPoint(vcount,vertices,x2,y1,z2); - addPoint(vcount,vertices,x2,y2,z2); - addPoint(vcount,vertices,x1,y2,z2); - - return true; // return cube - - - } - else - { - if ( scale ) - { - scale[0] = dx; - scale[1] = dy; - scale[2] = dz; - - recip[0] = 1 / dx; - recip[1] = 1 / dy; - recip[2] = 1 / dz; - - center[0]*=recip[0]; - center[1]*=recip[1]; - center[2]*=recip[2]; - - } - - } - - - - vtx = (const char *) svertices; - - for (unsigned int i=0; igetX(); - btScalar py = p->getY(); - btScalar pz = p->getZ(); - - if ( scale ) - { - px = px*recip[0]; // normalize - py = py*recip[1]; // normalize - pz = pz*recip[2]; // normalize - } - -// if ( 1 ) - { - unsigned int j; - - for (j=0; j dist2 ) - { - v[0] = px; - v[1] = py; - v[2] = pz; - - } - - break; - } - } - - if ( j == vcount ) - { - btVector3& dest = vertices[vcount]; - dest[0] = px; - dest[1] = py; - dest[2] = pz; - vcount++; - } - m_vertexIndexMapping.push_back(j); - } - } - - // ok..now make sure we didn't prune so many vertices it is now invalid. -// if ( 1 ) - { - btScalar bmin[3] = { FLT_MAX, FLT_MAX, FLT_MAX }; - btScalar bmax[3] = { -FLT_MAX, -FLT_MAX, -FLT_MAX }; - - for (unsigned int i=0; i bmax[j] ) bmax[j] = p[j]; - } - } - - btScalar dx = bmax[0] - bmin[0]; - btScalar dy = bmax[1] - bmin[1]; - btScalar dz = bmax[2] - bmin[2]; - - if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || vcount < 3) - { - btScalar cx = dx*btScalar(0.5) + bmin[0]; - btScalar cy = dy*btScalar(0.5) + bmin[1]; - btScalar cz = dz*btScalar(0.5) + bmin[2]; - - btScalar len = FLT_MAX; - - if ( dx >= EPSILON && dx < len ) len = dx; - if ( dy >= EPSILON && dy < len ) len = dy; - if ( dz >= EPSILON && dz < len ) len = dz; - - if ( len == FLT_MAX ) - { - dx = dy = dz = btScalar(0.01); // one centimeter - } - else - { - if ( dx < EPSILON ) dx = len * btScalar(0.05); // 1/5th the shortest non-zero edge. - if ( dy < EPSILON ) dy = len * btScalar(0.05); - if ( dz < EPSILON ) dz = len * btScalar(0.05); - } - - btScalar x1 = cx - dx; - btScalar x2 = cx + dx; - - btScalar y1 = cy - dy; - btScalar y2 = cy + dy; - - btScalar z1 = cz - dz; - btScalar z2 = cz + dz; - - vcount = 0; // add box - - addPoint(vcount,vertices,x1,y1,z1); - addPoint(vcount,vertices,x2,y1,z1); - addPoint(vcount,vertices,x2,y2,z1); - addPoint(vcount,vertices,x1,y2,z1); - addPoint(vcount,vertices,x1,y1,z2); - addPoint(vcount,vertices,x2,y1,z2); - addPoint(vcount,vertices,x2,y2,z2); - addPoint(vcount,vertices,x1,y2,z2); - - return true; - } - } - - return true; -} - -void HullLibrary::BringOutYourDead(const btVector3* verts,unsigned int vcount, btVector3* overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount) -{ - btAlignedObjectArraytmpIndices; - tmpIndices.resize(m_vertexIndexMapping.size()); - int i; - - for (i=0;i(vcount)); - memset(&usedIndices[0],0,sizeof(unsigned int)*vcount); - - ocount = 0; - - for (i=0; i= 0 && v < vcount ); - - if ( usedIndices[static_cast(v)] ) // if already remapped - { - indices[i] = usedIndices[static_cast(v)]-1; // index to new array - } - else - { - - indices[i] = ocount; // new index mapping - - overts[ocount][0] = verts[v][0]; // copy old vert to new vert array - overts[ocount][1] = verts[v][1]; - overts[ocount][2] = verts[v][2]; - - for (int k=0;k=0 && ocount <= vcount ); - - usedIndices[static_cast(v)] = ocount; // assign new index remapping - - - } - } - - -} diff --git a/opencl/parallel_primitives/host/btConvexHull.h b/opencl/parallel_primitives/host/btConvexHull.h deleted file mode 100644 index 69c52bc6f..000000000 --- a/opencl/parallel_primitives/host/btConvexHull.h +++ /dev/null @@ -1,241 +0,0 @@ - -/* -Stan Melax Convex Hull Computation -Copyright (c) 2008 Stan Melax http://www.melax.com/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -///includes modifications/improvements by John Ratcliff, see BringOutYourDead below. - -#ifndef BT_CD_HULL_H -#define BT_CD_HULL_H - -#include "btVector3.h" -#include "btAlignedObjectArray.h" - -typedef btAlignedObjectArray TUIntArray; - -class HullResult -{ -public: - HullResult(void) - { - mPolygons = true; - mNumOutputVertices = 0; - mNumFaces = 0; - mNumIndices = 0; - } - bool mPolygons; // true if indices represents polygons, false indices are triangles - unsigned int mNumOutputVertices; // number of vertices in the output hull - btAlignedObjectArray m_OutputVertices; // array of vertices - unsigned int mNumFaces; // the number of faces produced - unsigned int mNumIndices; // the total number of indices - btAlignedObjectArray m_Indices; // pointer to indices. - -// If triangles, then indices are array indexes into the vertex list. -// If polygons, indices are in the form (number of points in face) (p1, p2, p3, ..) etc.. -}; - -enum HullFlag -{ - QF_TRIANGLES = (1<<0), // report results as triangles, not polygons. - QF_REVERSE_ORDER = (1<<1), // reverse order of the triangle indices. - QF_DEFAULT = QF_TRIANGLES -}; - - -class HullDesc -{ -public: - HullDesc(void) - { - mFlags = QF_DEFAULT; - mVcount = 0; - mVertices = 0; - mVertexStride = sizeof(btVector3); - mNormalEpsilon = 0.001f; - mMaxVertices = 4096; // maximum number of points to be considered for a convex hull. - mMaxFaces = 4096; - }; - - HullDesc(HullFlag flag, - unsigned int vcount, - const btVector3 *vertices, - unsigned int stride = sizeof(btVector3)) - { - mFlags = flag; - mVcount = vcount; - mVertices = vertices; - mVertexStride = stride; - mNormalEpsilon = btScalar(0.001); - mMaxVertices = 4096; - } - - bool HasHullFlag(HullFlag flag) const - { - if ( mFlags & flag ) return true; - return false; - } - - void SetHullFlag(HullFlag flag) - { - mFlags|=flag; - } - - void ClearHullFlag(HullFlag flag) - { - mFlags&=~flag; - } - - unsigned int mFlags; // flags to use when generating the convex hull. - unsigned int mVcount; // number of vertices in the input point cloud - const btVector3 *mVertices; // the array of vertices. - unsigned int mVertexStride; // the stride of each vertex, in bytes. - btScalar mNormalEpsilon; // the epsilon for removing duplicates. This is a normalized value, if normalized bit is on. - unsigned int mMaxVertices; // maximum number of vertices to be considered for the hull! - unsigned int mMaxFaces; -}; - -enum HullError -{ - QE_OK, // success! - QE_FAIL // failed. -}; - -class btPlane -{ - public: - btVector3 normal; - btScalar dist; // distance below origin - the D from plane equasion Ax+By+Cz+D=0 - btPlane(const btVector3 &n,btScalar d):normal(n),dist(d){} - btPlane():normal(),dist(0){} - -}; - - - -class ConvexH -{ - public: - class HalfEdge - { - public: - short ea; // the other half of the edge (index into edges list) - unsigned char v; // the vertex at the start of this edge (index into vertices list) - unsigned char p; // the facet on which this edge lies (index into facets list) - HalfEdge(){} - HalfEdge(short _ea,unsigned char _v, unsigned char _p):ea(_ea),v(_v),p(_p){} - }; - ConvexH() - { - } - ~ConvexH() - { - } - btAlignedObjectArray vertices; - btAlignedObjectArray edges; - btAlignedObjectArray facets; - ConvexH(int vertices_size,int edges_size,int facets_size); -}; - - -class int4 -{ -public: - int x,y,z,w; - int4(){}; - int4(int _x,int _y, int _z,int _w){x=_x;y=_y;z=_z;w=_w;} - const int& operator[](int i) const {return (&x)[i];} - int& operator[](int i) {return (&x)[i];} -}; - -class PHullResult -{ -public: - - PHullResult(void) - { - mVcount = 0; - mIndexCount = 0; - mFaceCount = 0; - mVertices = 0; - } - - unsigned int mVcount; - unsigned int mIndexCount; - unsigned int mFaceCount; - btVector3* mVertices; - TUIntArray m_Indices; -}; - - - -///The HullLibrary class can create a convex hull from a collection of vertices, using the ComputeHull method. -///The btShapeHull class uses this HullLibrary to create a approximate convex mesh given a general (non-polyhedral) convex shape. -class HullLibrary -{ - - btAlignedObjectArray m_tris; - -public: - - btAlignedObjectArray m_vertexIndexMapping; - - - HullError CreateConvexHull(const HullDesc& desc, // describes the input request - HullResult& result); // contains the resulst - HullError ReleaseResult(HullResult &result); // release memory allocated for this result, we are done with it. - -private: - - bool ComputeHull(unsigned int vcount,const btVector3 *vertices,PHullResult &result,unsigned int vlimit); - - class btHullTriangle* allocateTriangle(int a,int b,int c); - void deAllocateTriangle(btHullTriangle*); - void b2bfix(btHullTriangle* s,btHullTriangle*t); - - void removeb2b(btHullTriangle* s,btHullTriangle*t); - - void checkit(btHullTriangle *t); - - btHullTriangle* extrudable(btScalar epsilon); - - int calchull(btVector3 *verts,int verts_count, TUIntArray& tris_out, int &tris_count,int vlimit); - - int calchullgen(btVector3 *verts,int verts_count, int vlimit); - - int4 FindSimplex(btVector3 *verts,int verts_count,btAlignedObjectArray &allow); - - class ConvexH* ConvexHCrop(ConvexH& convex,const btPlane& slice); - - void extrude(class btHullTriangle* t0,int v); - - ConvexH* test_cube(); - - //BringOutYourDead (John Ratcliff): When you create a convex hull you hand it a large input set of vertices forming a 'point cloud'. - //After the hull is generated it give you back a set of polygon faces which index the *original* point cloud. - //The thing is, often times, there are many 'dead vertices' in the point cloud that are on longer referenced by the hull. - //The routine 'BringOutYourDead' find only the referenced vertices, copies them to an new buffer, and re-indexes the hull so that it is a minimal representation. - void BringOutYourDead(const btVector3* verts,unsigned int vcount, btVector3* overts,unsigned int &ocount,unsigned int* indices,unsigned indexcount); - - bool CleanupVertices(unsigned int svcount, - const btVector3* svertices, - unsigned int stride, - unsigned int &vcount, // output number of vertices - btVector3* vertices, // location to store the results. - btScalar normalepsilon, - btVector3& scale); -}; - - -#endif //BT_CD_HULL_H - diff --git a/opencl/parallel_primitives/host/btConvexHullComputer.cpp b/opencl/parallel_primitives/host/btConvexHullComputer.cpp deleted file mode 100644 index c03c901c0..000000000 --- a/opencl/parallel_primitives/host/btConvexHullComputer.cpp +++ /dev/null @@ -1,2751 +0,0 @@ -/* -Copyright (c) 2011 Ole Kniemeyer, MAXON, www.maxon.net - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -#include - -#include "btConvexHullComputer.h" -#include "btAlignedObjectArray.h" -#include "btMinMax.h" -#include "btVector3.h" - -#ifdef __GNUC__ - #include -#elif defined(_MSC_VER) - typedef __int32 int32_t; - typedef __int64 int64_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; -#else - typedef int int32_t; - typedef long long int int64_t; - typedef unsigned int uint32_t; - typedef unsigned long long int uint64_t; -#endif - - -//The definition of USE_X86_64_ASM is moved into the build system. You can enable it manually by commenting out the following lines -//#if (defined(__GNUC__) && defined(__x86_64__) && !defined(__ICL)) // || (defined(__ICL) && defined(_M_X64)) bug in Intel compiler, disable inline assembly -// #define USE_X86_64_ASM -//#endif - - -//#define DEBUG_CONVEX_HULL -//#define SHOW_ITERATIONS - -#if defined(DEBUG_CONVEX_HULL) || defined(SHOW_ITERATIONS) - #include -#endif - -// Convex hull implementation based on Preparata and Hong -// Ole Kniemeyer, MAXON Computer GmbH -class btConvexHullInternal -{ - public: - - class Point64 - { - public: - int64_t x; - int64_t y; - int64_t z; - - Point64(int64_t x, int64_t y, int64_t z): x(x), y(y), z(z) - { - } - - bool isZero() - { - return (x == 0) && (y == 0) && (z == 0); - } - - int64_t dot(const Point64& b) const - { - return x * b.x + y * b.y + z * b.z; - } - }; - - class Point32 - { - public: - int32_t x; - int32_t y; - int32_t z; - int index; - - Point32() - { - } - - Point32(int32_t x, int32_t y, int32_t z): x(x), y(y), z(z), index(-1) - { - } - - bool operator==(const Point32& b) const - { - return (x == b.x) && (y == b.y) && (z == b.z); - } - - bool operator!=(const Point32& b) const - { - return (x != b.x) || (y != b.y) || (z != b.z); - } - - bool isZero() - { - return (x == 0) && (y == 0) && (z == 0); - } - - Point64 cross(const Point32& b) const - { - return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x); - } - - Point64 cross(const Point64& b) const - { - return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x); - } - - int64_t dot(const Point32& b) const - { - return x * b.x + y * b.y + z * b.z; - } - - int64_t dot(const Point64& b) const - { - return x * b.x + y * b.y + z * b.z; - } - - Point32 operator+(const Point32& b) const - { - return Point32(x + b.x, y + b.y, z + b.z); - } - - Point32 operator-(const Point32& b) const - { - return Point32(x - b.x, y - b.y, z - b.z); - } - }; - - class Int128 - { - public: - uint64_t low; - uint64_t high; - - Int128() - { - } - - Int128(uint64_t low, uint64_t high): low(low), high(high) - { - } - - Int128(uint64_t low): low(low), high(0) - { - } - - Int128(int64_t value): low(value), high((value >= 0) ? 0 : (uint64_t) -1LL) - { - } - - static Int128 mul(int64_t a, int64_t b); - - static Int128 mul(uint64_t a, uint64_t b); - - Int128 operator-() const - { - return Int128((uint64_t) -(int64_t)low, ~high + (low == 0)); - } - - Int128 operator+(const Int128& b) const - { -#ifdef USE_X86_64_ASM - Int128 result; - __asm__ ("addq %[bl], %[rl]\n\t" - "adcq %[bh], %[rh]\n\t" - : [rl] "=r" (result.low), [rh] "=r" (result.high) - : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high) - : "cc" ); - return result; -#else - uint64_t lo = low + b.low; - return Int128(lo, high + b.high + (lo < low)); -#endif - } - - Int128 operator-(const Int128& b) const - { -#ifdef USE_X86_64_ASM - Int128 result; - __asm__ ("subq %[bl], %[rl]\n\t" - "sbbq %[bh], %[rh]\n\t" - : [rl] "=r" (result.low), [rh] "=r" (result.high) - : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high) - : "cc" ); - return result; -#else - return *this + -b; -#endif - } - - Int128& operator+=(const Int128& b) - { -#ifdef USE_X86_64_ASM - __asm__ ("addq %[bl], %[rl]\n\t" - "adcq %[bh], %[rh]\n\t" - : [rl] "=r" (low), [rh] "=r" (high) - : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high) - : "cc" ); -#else - uint64_t lo = low + b.low; - if (lo < low) - { - ++high; - } - low = lo; - high += b.high; -#endif - return *this; - } - - Int128& operator++() - { - if (++low == 0) - { - ++high; - } - return *this; - } - - Int128 operator*(int64_t b) const; - - btScalar toScalar() const - { - return ((int64_t) high >= 0) ? btScalar(high) * (btScalar(0x100000000LL) * btScalar(0x100000000LL)) + btScalar(low) - : -(-*this).toScalar(); - } - - int getSign() const - { - return ((int64_t) high < 0) ? -1 : (high || low) ? 1 : 0; - } - - bool operator<(const Int128& b) const - { - return (high < b.high) || ((high == b.high) && (low < b.low)); - } - - int ucmp(const Int128&b) const - { - if (high < b.high) - { - return -1; - } - if (high > b.high) - { - return 1; - } - if (low < b.low) - { - return -1; - } - if (low > b.low) - { - return 1; - } - return 0; - } - }; - - - class Rational64 - { - private: - uint64_t m_numerator; - uint64_t m_denominator; - int sign; - - public: - Rational64(int64_t numerator, int64_t denominator) - { - if (numerator > 0) - { - sign = 1; - m_numerator = (uint64_t) numerator; - } - else if (numerator < 0) - { - sign = -1; - m_numerator = (uint64_t) -numerator; - } - else - { - sign = 0; - m_numerator = 0; - } - if (denominator > 0) - { - m_denominator = (uint64_t) denominator; - } - else if (denominator < 0) - { - sign = -sign; - m_denominator = (uint64_t) -denominator; - } - else - { - m_denominator = 0; - } - } - - bool isNegativeInfinity() const - { - return (sign < 0) && (m_denominator == 0); - } - - bool isNaN() const - { - return (sign == 0) && (m_denominator == 0); - } - - int compare(const Rational64& b) const; - - btScalar toScalar() const - { - return sign * ((m_denominator == 0) ? SIMD_INFINITY : (btScalar) m_numerator / m_denominator); - } - }; - - - class Rational128 - { - private: - Int128 numerator; - Int128 denominator; - int sign; - bool isInt64; - - public: - Rational128(int64_t value) - { - if (value > 0) - { - sign = 1; - this->numerator = value; - } - else if (value < 0) - { - sign = -1; - this->numerator = -value; - } - else - { - sign = 0; - this->numerator = (uint64_t) 0; - } - this->denominator = (uint64_t) 1; - isInt64 = true; - } - - Rational128(const Int128& numerator, const Int128& denominator) - { - sign = numerator.getSign(); - if (sign >= 0) - { - this->numerator = numerator; - } - else - { - this->numerator = -numerator; - } - int dsign = denominator.getSign(); - if (dsign >= 0) - { - this->denominator = denominator; - } - else - { - sign = -sign; - this->denominator = -denominator; - } - isInt64 = false; - } - - int compare(const Rational128& b) const; - - int compare(int64_t b) const; - - btScalar toScalar() const - { - return sign * ((denominator.getSign() == 0) ? SIMD_INFINITY : numerator.toScalar() / denominator.toScalar()); - } - }; - - class PointR128 - { - public: - Int128 x; - Int128 y; - Int128 z; - Int128 denominator; - - PointR128() - { - } - - PointR128(Int128 x, Int128 y, Int128 z, Int128 denominator): x(x), y(y), z(z), denominator(denominator) - { - } - - btScalar xvalue() const - { - return x.toScalar() / denominator.toScalar(); - } - - btScalar yvalue() const - { - return y.toScalar() / denominator.toScalar(); - } - - btScalar zvalue() const - { - return z.toScalar() / denominator.toScalar(); - } - }; - - - class Edge; - class Face; - - class Vertex - { - public: - Vertex* next; - Vertex* prev; - Edge* edges; - Face* firstNearbyFace; - Face* lastNearbyFace; - PointR128 point128; - Point32 point; - int copy; - - Vertex(): next(NULL), prev(NULL), edges(NULL), firstNearbyFace(NULL), lastNearbyFace(NULL), copy(-1) - { - } - -#ifdef DEBUG_CONVEX_HULL - void print() - { - printf("V%d (%d, %d, %d)", point.index, point.x, point.y, point.z); - } - - void printGraph(); -#endif - - Point32 operator-(const Vertex& b) const - { - return point - b.point; - } - - Rational128 dot(const Point64& b) const - { - return (point.index >= 0) ? Rational128(point.dot(b)) - : Rational128(point128.x * b.x + point128.y * b.y + point128.z * b.z, point128.denominator); - } - - btScalar xvalue() const - { - return (point.index >= 0) ? btScalar(point.x) : point128.xvalue(); - } - - btScalar yvalue() const - { - return (point.index >= 0) ? btScalar(point.y) : point128.yvalue(); - } - - btScalar zvalue() const - { - return (point.index >= 0) ? btScalar(point.z) : point128.zvalue(); - } - - void receiveNearbyFaces(Vertex* src) - { - if (lastNearbyFace) - { - lastNearbyFace->nextWithSameNearbyVertex = src->firstNearbyFace; - } - else - { - firstNearbyFace = src->firstNearbyFace; - } - if (src->lastNearbyFace) - { - lastNearbyFace = src->lastNearbyFace; - } - for (Face* f = src->firstNearbyFace; f; f = f->nextWithSameNearbyVertex) - { - btAssert(f->nearbyVertex == src); - f->nearbyVertex = this; - } - src->firstNearbyFace = NULL; - src->lastNearbyFace = NULL; - } - }; - - - class Edge - { - public: - Edge* next; - Edge* prev; - Edge* reverse; - Vertex* target; - Face* face; - int copy; - - ~Edge() - { - next = NULL; - prev = NULL; - reverse = NULL; - target = NULL; - face = NULL; - } - - void link(Edge* n) - { - btAssert(reverse->target == n->reverse->target); - next = n; - n->prev = this; - } - -#ifdef DEBUG_CONVEX_HULL - void print() - { - printf("E%p : %d -> %d, n=%p p=%p (0 %d\t%d\t%d) -> (%d %d %d)", this, reverse->target->point.index, target->point.index, next, prev, - reverse->target->point.x, reverse->target->point.y, reverse->target->point.z, target->point.x, target->point.y, target->point.z); - } -#endif - }; - - class Face - { - public: - Face* next; - Vertex* nearbyVertex; - Face* nextWithSameNearbyVertex; - Point32 origin; - Point32 dir0; - Point32 dir1; - - Face(): next(NULL), nearbyVertex(NULL), nextWithSameNearbyVertex(NULL) - { - } - - void init(Vertex* a, Vertex* b, Vertex* c) - { - nearbyVertex = a; - origin = a->point; - dir0 = *b - *a; - dir1 = *c - *a; - if (a->lastNearbyFace) - { - a->lastNearbyFace->nextWithSameNearbyVertex = this; - } - else - { - a->firstNearbyFace = this; - } - a->lastNearbyFace = this; - } - - Point64 getNormal() - { - return dir0.cross(dir1); - } - }; - - template class DMul - { - private: - static uint32_t high(uint64_t value) - { - return (uint32_t) (value >> 32); - } - - static uint32_t low(uint64_t value) - { - return (uint32_t) value; - } - - static uint64_t mul(uint32_t a, uint32_t b) - { - return (uint64_t) a * (uint64_t) b; - } - - static void shlHalf(uint64_t& value) - { - value <<= 32; - } - - static uint64_t high(Int128 value) - { - return value.high; - } - - static uint64_t low(Int128 value) - { - return value.low; - } - - static Int128 mul(uint64_t a, uint64_t b) - { - return Int128::mul(a, b); - } - - static void shlHalf(Int128& value) - { - value.high = value.low; - value.low = 0; - } - - public: - - static void mul(UWord a, UWord b, UWord& resLow, UWord& resHigh) - { - UWord p00 = mul(low(a), low(b)); - UWord p01 = mul(low(a), high(b)); - UWord p10 = mul(high(a), low(b)); - UWord p11 = mul(high(a), high(b)); - UWord p0110 = UWord(low(p01)) + UWord(low(p10)); - p11 += high(p01); - p11 += high(p10); - p11 += high(p0110); - shlHalf(p0110); - p00 += p0110; - if (p00 < p0110) - { - ++p11; - } - resLow = p00; - resHigh = p11; - } - }; - - private: - - class IntermediateHull - { - public: - Vertex* minXy; - Vertex* maxXy; - Vertex* minYx; - Vertex* maxYx; - - IntermediateHull(): minXy(NULL), maxXy(NULL), minYx(NULL), maxYx(NULL) - { - } - - void print(); - }; - - enum Orientation {NONE, CLOCKWISE, COUNTER_CLOCKWISE}; - - template class PoolArray - { - private: - T* array; - int size; - - public: - PoolArray* next; - - PoolArray(int size): size(size), next(NULL) - { - array = (T*) btAlignedAlloc(sizeof(T) * size, 16); - } - - ~PoolArray() - { - btAlignedFree(array); - } - - T* init() - { - T* o = array; - for (int i = 0; i < size; i++, o++) - { - o->next = (i+1 < size) ? o + 1 : NULL; - } - return array; - } - }; - - template class Pool - { - private: - PoolArray* arrays; - PoolArray* nextArray; - T* freeObjects; - int arraySize; - - public: - Pool(): arrays(NULL), nextArray(NULL), freeObjects(NULL), arraySize(256) - { - } - - ~Pool() - { - while (arrays) - { - PoolArray* p = arrays; - arrays = p->next; - p->~PoolArray(); - btAlignedFree(p); - } - } - - void reset() - { - nextArray = arrays; - freeObjects = NULL; - } - - void setArraySize(int arraySize) - { - this->arraySize = arraySize; - } - - T* newObject() - { - T* o = freeObjects; - if (!o) - { - PoolArray* p = nextArray; - if (p) - { - nextArray = p->next; - } - else - { - p = new(btAlignedAlloc(sizeof(PoolArray), 16)) PoolArray(arraySize); - p->next = arrays; - arrays = p; - } - o = p->init(); - } - freeObjects = o->next; - return new(o) T(); - }; - - void freeObject(T* object) - { - object->~T(); - object->next = freeObjects; - freeObjects = object; - } - }; - - btVector3 scaling; - btVector3 center; - Pool vertexPool; - Pool edgePool; - Pool facePool; - btAlignedObjectArray originalVertices; - int mergeStamp; - int minAxis; - int medAxis; - int maxAxis; - int usedEdgePairs; - int maxUsedEdgePairs; - - static Orientation getOrientation(const Edge* prev, const Edge* next, const Point32& s, const Point32& t); - Edge* findMaxAngle(bool ccw, const Vertex* start, const Point32& s, const Point64& rxs, const Point64& sxrxs, Rational64& minCot); - void findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge*& e0, Edge*& e1, Vertex* stop0, Vertex* stop1); - - Edge* newEdgePair(Vertex* from, Vertex* to); - - void removeEdgePair(Edge* edge) - { - Edge* n = edge->next; - Edge* r = edge->reverse; - - btAssert(edge->target && r->target); - - if (n != edge) - { - n->prev = edge->prev; - edge->prev->next = n; - r->target->edges = n; - } - else - { - r->target->edges = NULL; - } - - n = r->next; - - if (n != r) - { - n->prev = r->prev; - r->prev->next = n; - edge->target->edges = n; - } - else - { - edge->target->edges = NULL; - } - - edgePool.freeObject(edge); - edgePool.freeObject(r); - usedEdgePairs--; - } - - void computeInternal(int start, int end, IntermediateHull& result); - - bool mergeProjection(IntermediateHull& h0, IntermediateHull& h1, Vertex*& c0, Vertex*& c1); - - void merge(IntermediateHull& h0, IntermediateHull& h1); - - btVector3 toBtVector(const Point32& v); - - btVector3 getBtNormal(Face* face); - - bool shiftFace(Face* face, btScalar amount, btAlignedObjectArray stack); - - public: - Vertex* vertexList; - - void compute(const void* coords, bool doubleCoords, int stride, int count); - - btVector3 getCoordinates(const Vertex* v); - - btScalar shrink(btScalar amount, btScalar clampAmount); -}; - - -btConvexHullInternal::Int128 btConvexHullInternal::Int128::operator*(int64_t b) const -{ - bool negative = (int64_t) high < 0; - Int128 a = negative ? -*this : *this; - if (b < 0) - { - negative = !negative; - b = -b; - } - Int128 result = mul(a.low, (uint64_t) b); - result.high += a.high * (uint64_t) b; - return negative ? -result : result; -} - -btConvexHullInternal::Int128 btConvexHullInternal::Int128::mul(int64_t a, int64_t b) -{ - Int128 result; - -#ifdef USE_X86_64_ASM - __asm__ ("imulq %[b]" - : "=a" (result.low), "=d" (result.high) - : "0"(a), [b] "r"(b) - : "cc" ); - return result; - -#else - bool negative = a < 0; - if (negative) - { - a = -a; - } - if (b < 0) - { - negative = !negative; - b = -b; - } - DMul::mul((uint64_t) a, (uint64_t) b, result.low, result.high); - return negative ? -result : result; -#endif -} - -btConvexHullInternal::Int128 btConvexHullInternal::Int128::mul(uint64_t a, uint64_t b) -{ - Int128 result; - -#ifdef USE_X86_64_ASM - __asm__ ("mulq %[b]" - : "=a" (result.low), "=d" (result.high) - : "0"(a), [b] "r"(b) - : "cc" ); - -#else - DMul::mul(a, b, result.low, result.high); -#endif - - return result; -} - -int btConvexHullInternal::Rational64::compare(const Rational64& b) const -{ - if (sign != b.sign) - { - return sign - b.sign; - } - else if (sign == 0) - { - return 0; - } - - // return (numerator * b.denominator > b.numerator * denominator) ? sign : (numerator * b.denominator < b.numerator * denominator) ? -sign : 0; - -#ifdef USE_X86_64_ASM - - int result; - int64_t tmp; - int64_t dummy; - __asm__ ("mulq %[bn]\n\t" - "movq %%rax, %[tmp]\n\t" - "movq %%rdx, %%rbx\n\t" - "movq %[tn], %%rax\n\t" - "mulq %[bd]\n\t" - "subq %[tmp], %%rax\n\t" - "sbbq %%rbx, %%rdx\n\t" // rdx:rax contains 128-bit-difference "numerator*b.denominator - b.numerator*denominator" - "setnsb %%bh\n\t" // bh=1 if difference is non-negative, bh=0 otherwise - "orq %%rdx, %%rax\n\t" - "setnzb %%bl\n\t" // bl=1 if difference if non-zero, bl=0 if it is zero - "decb %%bh\n\t" // now bx=0x0000 if difference is zero, 0xff01 if it is negative, 0x0001 if it is positive (i.e., same sign as difference) - "shll $16, %%ebx\n\t" // ebx has same sign as difference - : "=&b"(result), [tmp] "=&r"(tmp), "=a"(dummy) - : "a"(denominator), [bn] "g"(b.numerator), [tn] "g"(numerator), [bd] "g"(b.denominator) - : "%rdx", "cc" ); - return result ? result ^ sign // if sign is +1, only bit 0 of result is inverted, which does not change the sign of result (and cannot result in zero) - // if sign is -1, all bits of result are inverted, which changes the sign of result (and again cannot result in zero) - : 0; - -#else - - return sign * Int128::mul(m_numerator, b.m_denominator).ucmp(Int128::mul(m_denominator, b.m_numerator)); - -#endif -} - -int btConvexHullInternal::Rational128::compare(const Rational128& b) const -{ - if (sign != b.sign) - { - return sign - b.sign; - } - else if (sign == 0) - { - return 0; - } - if (isInt64) - { - return -b.compare(sign * (int64_t) numerator.low); - } - - Int128 nbdLow, nbdHigh, dbnLow, dbnHigh; - DMul::mul(numerator, b.denominator, nbdLow, nbdHigh); - DMul::mul(denominator, b.numerator, dbnLow, dbnHigh); - - int cmp = nbdHigh.ucmp(dbnHigh); - if (cmp) - { - return cmp * sign; - } - return nbdLow.ucmp(dbnLow) * sign; -} - -int btConvexHullInternal::Rational128::compare(int64_t b) const -{ - if (isInt64) - { - int64_t a = sign * (int64_t) numerator.low; - return (a > b) ? 1 : (a < b) ? -1 : 0; - } - if (b > 0) - { - if (sign <= 0) - { - return -1; - } - } - else if (b < 0) - { - if (sign >= 0) - { - return 1; - } - b = -b; - } - else - { - return sign; - } - - return numerator.ucmp(denominator * b) * sign; -} - - -btConvexHullInternal::Edge* btConvexHullInternal::newEdgePair(Vertex* from, Vertex* to) -{ - btAssert(from && to); - Edge* e = edgePool.newObject(); - Edge* r = edgePool.newObject(); - e->reverse = r; - r->reverse = e; - e->copy = mergeStamp; - r->copy = mergeStamp; - e->target = to; - r->target = from; - e->face = NULL; - r->face = NULL; - usedEdgePairs++; - if (usedEdgePairs > maxUsedEdgePairs) - { - maxUsedEdgePairs = usedEdgePairs; - } - return e; -} - -bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHull& h1, Vertex*& c0, Vertex*& c1) -{ - Vertex* v0 = h0.maxYx; - Vertex* v1 = h1.minYx; - if ((v0->point.x == v1->point.x) && (v0->point.y == v1->point.y)) - { - btAssert(v0->point.z < v1->point.z); - Vertex* v1p = v1->prev; - if (v1p == v1) - { - c0 = v0; - if (v1->edges) - { - btAssert(v1->edges->next == v1->edges); - v1 = v1->edges->target; - btAssert(v1->edges->next == v1->edges); - } - c1 = v1; - return false; - } - Vertex* v1n = v1->next; - v1p->next = v1n; - v1n->prev = v1p; - if (v1 == h1.minXy) - { - if ((v1n->point.x < v1p->point.x) || ((v1n->point.x == v1p->point.x) && (v1n->point.y < v1p->point.y))) - { - h1.minXy = v1n; - } - else - { - h1.minXy = v1p; - } - } - if (v1 == h1.maxXy) - { - if ((v1n->point.x > v1p->point.x) || ((v1n->point.x == v1p->point.x) && (v1n->point.y > v1p->point.y))) - { - h1.maxXy = v1n; - } - else - { - h1.maxXy = v1p; - } - } - } - - v0 = h0.maxXy; - v1 = h1.maxXy; - Vertex* v00 = NULL; - Vertex* v10 = NULL; - int32_t sign = 1; - - for (int side = 0; side <= 1; side++) - { - int32_t dx = (v1->point.x - v0->point.x) * sign; - if (dx > 0) - { - while (true) - { - int32_t dy = v1->point.y - v0->point.y; - - Vertex* w0 = side ? v0->next : v0->prev; - if (w0 != v0) - { - int32_t dx0 = (w0->point.x - v0->point.x) * sign; - int32_t dy0 = w0->point.y - v0->point.y; - if ((dy0 <= 0) && ((dx0 == 0) || ((dx0 < 0) && (dy0 * dx <= dy * dx0)))) - { - v0 = w0; - dx = (v1->point.x - v0->point.x) * sign; - continue; - } - } - - Vertex* w1 = side ? v1->next : v1->prev; - if (w1 != v1) - { - int32_t dx1 = (w1->point.x - v1->point.x) * sign; - int32_t dy1 = w1->point.y - v1->point.y; - int32_t dxn = (w1->point.x - v0->point.x) * sign; - if ((dxn > 0) && (dy1 < 0) && ((dx1 == 0) || ((dx1 < 0) && (dy1 * dx < dy * dx1)))) - { - v1 = w1; - dx = dxn; - continue; - } - } - - break; - } - } - else if (dx < 0) - { - while (true) - { - int32_t dy = v1->point.y - v0->point.y; - - Vertex* w1 = side ? v1->prev : v1->next; - if (w1 != v1) - { - int32_t dx1 = (w1->point.x - v1->point.x) * sign; - int32_t dy1 = w1->point.y - v1->point.y; - if ((dy1 >= 0) && ((dx1 == 0) || ((dx1 < 0) && (dy1 * dx <= dy * dx1)))) - { - v1 = w1; - dx = (v1->point.x - v0->point.x) * sign; - continue; - } - } - - Vertex* w0 = side ? v0->prev : v0->next; - if (w0 != v0) - { - int32_t dx0 = (w0->point.x - v0->point.x) * sign; - int32_t dy0 = w0->point.y - v0->point.y; - int32_t dxn = (v1->point.x - w0->point.x) * sign; - if ((dxn < 0) && (dy0 > 0) && ((dx0 == 0) || ((dx0 < 0) && (dy0 * dx < dy * dx0)))) - { - v0 = w0; - dx = dxn; - continue; - } - } - - break; - } - } - else - { - int32_t x = v0->point.x; - int32_t y0 = v0->point.y; - Vertex* w0 = v0; - Vertex* t; - while (((t = side ? w0->next : w0->prev) != v0) && (t->point.x == x) && (t->point.y <= y0)) - { - w0 = t; - y0 = t->point.y; - } - v0 = w0; - - int32_t y1 = v1->point.y; - Vertex* w1 = v1; - while (((t = side ? w1->prev : w1->next) != v1) && (t->point.x == x) && (t->point.y >= y1)) - { - w1 = t; - y1 = t->point.y; - } - v1 = w1; - } - - if (side == 0) - { - v00 = v0; - v10 = v1; - - v0 = h0.minXy; - v1 = h1.minXy; - sign = -1; - } - } - - v0->prev = v1; - v1->next = v0; - - v00->next = v10; - v10->prev = v00; - - if (h1.minXy->point.x < h0.minXy->point.x) - { - h0.minXy = h1.minXy; - } - if (h1.maxXy->point.x >= h0.maxXy->point.x) - { - h0.maxXy = h1.maxXy; - } - - h0.maxYx = h1.maxYx; - - c0 = v00; - c1 = v10; - - return true; -} - -void btConvexHullInternal::computeInternal(int start, int end, IntermediateHull& result) -{ - int n = end - start; - switch (n) - { - case 0: - result.minXy = NULL; - result.maxXy = NULL; - result.minYx = NULL; - result.maxYx = NULL; - return; - case 2: - { - Vertex* v = originalVertices[start]; - Vertex* w = v + 1; - if (v->point != w->point) - { - int32_t dx = v->point.x - w->point.x; - int32_t dy = v->point.y - w->point.y; - - if ((dx == 0) && (dy == 0)) - { - if (v->point.z > w->point.z) - { - Vertex* t = w; - w = v; - v = t; - } - btAssert(v->point.z < w->point.z); - v->next = v; - v->prev = v; - result.minXy = v; - result.maxXy = v; - result.minYx = v; - result.maxYx = v; - } - else - { - v->next = w; - v->prev = w; - w->next = v; - w->prev = v; - - if ((dx < 0) || ((dx == 0) && (dy < 0))) - { - result.minXy = v; - result.maxXy = w; - } - else - { - result.minXy = w; - result.maxXy = v; - } - - if ((dy < 0) || ((dy == 0) && (dx < 0))) - { - result.minYx = v; - result.maxYx = w; - } - else - { - result.minYx = w; - result.maxYx = v; - } - } - - Edge* e = newEdgePair(v, w); - e->link(e); - v->edges = e; - - e = e->reverse; - e->link(e); - w->edges = e; - - return; - } - } - // lint -fallthrough - case 1: - { - Vertex* v = originalVertices[start]; - v->edges = NULL; - v->next = v; - v->prev = v; - - result.minXy = v; - result.maxXy = v; - result.minYx = v; - result.maxYx = v; - - return; - } - } - - int split0 = start + n / 2; - Point32 p = originalVertices[split0-1]->point; - int split1 = split0; - while ((split1 < end) && (originalVertices[split1]->point == p)) - { - split1++; - } - computeInternal(start, split0, result); - IntermediateHull hull1; - computeInternal(split1, end, hull1); -#ifdef DEBUG_CONVEX_HULL - printf("\n\nMerge\n"); - result.print(); - hull1.print(); -#endif - merge(result, hull1); -#ifdef DEBUG_CONVEX_HULL - printf("\n Result\n"); - result.print(); -#endif -} - -#ifdef DEBUG_CONVEX_HULL -void btConvexHullInternal::IntermediateHull::print() -{ - printf(" Hull\n"); - for (Vertex* v = minXy; v; ) - { - printf(" "); - v->print(); - if (v == maxXy) - { - printf(" maxXy"); - } - if (v == minYx) - { - printf(" minYx"); - } - if (v == maxYx) - { - printf(" maxYx"); - } - if (v->next->prev != v) - { - printf(" Inconsistency"); - } - printf("\n"); - v = v->next; - if (v == minXy) - { - break; - } - } - if (minXy) - { - minXy->copy = (minXy->copy == -1) ? -2 : -1; - minXy->printGraph(); - } -} - -void btConvexHullInternal::Vertex::printGraph() -{ - print(); - printf("\nEdges\n"); - Edge* e = edges; - if (e) - { - do - { - e->print(); - printf("\n"); - e = e->next; - } while (e != edges); - do - { - Vertex* v = e->target; - if (v->copy != copy) - { - v->copy = copy; - v->printGraph(); - } - e = e->next; - } while (e != edges); - } -} -#endif - -btConvexHullInternal::Orientation btConvexHullInternal::getOrientation(const Edge* prev, const Edge* next, const Point32& s, const Point32& t) -{ - btAssert(prev->reverse->target == next->reverse->target); - if (prev->next == next) - { - if (prev->prev == next) - { - Point64 n = t.cross(s); - Point64 m = (*prev->target - *next->reverse->target).cross(*next->target - *next->reverse->target); - btAssert(!m.isZero()); - int64_t dot = n.dot(m); - btAssert(dot != 0); - return (dot > 0) ? COUNTER_CLOCKWISE : CLOCKWISE; - } - return COUNTER_CLOCKWISE; - } - else if (prev->prev == next) - { - return CLOCKWISE; - } - else - { - return NONE; - } -} - -btConvexHullInternal::Edge* btConvexHullInternal::findMaxAngle(bool ccw, const Vertex* start, const Point32& s, const Point64& rxs, const Point64& sxrxs, Rational64& minCot) -{ - Edge* minEdge = NULL; - -#ifdef DEBUG_CONVEX_HULL - printf("find max edge for %d\n", start->point.index); -#endif - Edge* e = start->edges; - if (e) - { - do - { - if (e->copy > mergeStamp) - { - Point32 t = *e->target - *start; - Rational64 cot(t.dot(sxrxs), t.dot(rxs)); -#ifdef DEBUG_CONVEX_HULL - printf(" Angle is %f (%d) for ", (float) btAtan(cot.toScalar()), (int) cot.isNaN()); - e->print(); -#endif - if (cot.isNaN()) - { - btAssert(ccw ? (t.dot(s) < 0) : (t.dot(s) > 0)); - } - else - { - int cmp; - if (minEdge == NULL) - { - minCot = cot; - minEdge = e; - } - else if ((cmp = cot.compare(minCot)) < 0) - { - minCot = cot; - minEdge = e; - } - else if ((cmp == 0) && (ccw == (getOrientation(minEdge, e, s, t) == COUNTER_CLOCKWISE))) - { - minEdge = e; - } - } -#ifdef DEBUG_CONVEX_HULL - printf("\n"); -#endif - } - e = e->next; - } while (e != start->edges); - } - return minEdge; -} - -void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge*& e0, Edge*& e1, Vertex* stop0, Vertex* stop1) -{ - Edge* start0 = e0; - Edge* start1 = e1; - Point32 et0 = start0 ? start0->target->point : c0->point; - Point32 et1 = start1 ? start1->target->point : c1->point; - Point32 s = c1->point - c0->point; - Point64 normal = ((start0 ? start0 : start1)->target->point - c0->point).cross(s); - int64_t dist = c0->point.dot(normal); - btAssert(!start1 || (start1->target->point.dot(normal) == dist)); - Point64 perp = s.cross(normal); - btAssert(!perp.isZero()); - -#ifdef DEBUG_CONVEX_HULL - printf(" Advancing %d %d (%p %p, %d %d)\n", c0->point.index, c1->point.index, start0, start1, start0 ? start0->target->point.index : -1, start1 ? start1->target->point.index : -1); -#endif - - int64_t maxDot0 = et0.dot(perp); - if (e0) - { - while (e0->target != stop0) - { - Edge* e = e0->reverse->prev; - if (e->target->point.dot(normal) < dist) - { - break; - } - btAssert(e->target->point.dot(normal) == dist); - if (e->copy == mergeStamp) - { - break; - } - int64_t dot = e->target->point.dot(perp); - if (dot <= maxDot0) - { - break; - } - maxDot0 = dot; - e0 = e; - et0 = e->target->point; - } - } - - int64_t maxDot1 = et1.dot(perp); - if (e1) - { - while (e1->target != stop1) - { - Edge* e = e1->reverse->next; - if (e->target->point.dot(normal) < dist) - { - break; - } - btAssert(e->target->point.dot(normal) == dist); - if (e->copy == mergeStamp) - { - break; - } - int64_t dot = e->target->point.dot(perp); - if (dot <= maxDot1) - { - break; - } - maxDot1 = dot; - e1 = e; - et1 = e->target->point; - } - } - -#ifdef DEBUG_CONVEX_HULL - printf(" Starting at %d %d\n", et0.index, et1.index); -#endif - - int64_t dx = maxDot1 - maxDot0; - if (dx > 0) - { - while (true) - { - int64_t dy = (et1 - et0).dot(s); - - if (e0 && (e0->target != stop0)) - { - Edge* f0 = e0->next->reverse; - if (f0->copy > mergeStamp) - { - int64_t dx0 = (f0->target->point - et0).dot(perp); - int64_t dy0 = (f0->target->point - et0).dot(s); - if ((dx0 == 0) ? (dy0 < 0) : ((dx0 < 0) && (Rational64(dy0, dx0).compare(Rational64(dy, dx)) >= 0))) - { - et0 = f0->target->point; - dx = (et1 - et0).dot(perp); - e0 = (e0 == start0) ? NULL : f0; - continue; - } - } - } - - if (e1 && (e1->target != stop1)) - { - Edge* f1 = e1->reverse->next; - if (f1->copy > mergeStamp) - { - Point32 d1 = f1->target->point - et1; - if (d1.dot(normal) == 0) - { - int64_t dx1 = d1.dot(perp); - int64_t dy1 = d1.dot(s); - int64_t dxn = (f1->target->point - et0).dot(perp); - if ((dxn > 0) && ((dx1 == 0) ? (dy1 < 0) : ((dx1 < 0) && (Rational64(dy1, dx1).compare(Rational64(dy, dx)) > 0)))) - { - e1 = f1; - et1 = e1->target->point; - dx = dxn; - continue; - } - } - else - { - btAssert((e1 == start1) && (d1.dot(normal) < 0)); - } - } - } - - break; - } - } - else if (dx < 0) - { - while (true) - { - int64_t dy = (et1 - et0).dot(s); - - if (e1 && (e1->target != stop1)) - { - Edge* f1 = e1->prev->reverse; - if (f1->copy > mergeStamp) - { - int64_t dx1 = (f1->target->point - et1).dot(perp); - int64_t dy1 = (f1->target->point - et1).dot(s); - if ((dx1 == 0) ? (dy1 > 0) : ((dx1 < 0) && (Rational64(dy1, dx1).compare(Rational64(dy, dx)) <= 0))) - { - et1 = f1->target->point; - dx = (et1 - et0).dot(perp); - e1 = (e1 == start1) ? NULL : f1; - continue; - } - } - } - - if (e0 && (e0->target != stop0)) - { - Edge* f0 = e0->reverse->prev; - if (f0->copy > mergeStamp) - { - Point32 d0 = f0->target->point - et0; - if (d0.dot(normal) == 0) - { - int64_t dx0 = d0.dot(perp); - int64_t dy0 = d0.dot(s); - int64_t dxn = (et1 - f0->target->point).dot(perp); - if ((dxn < 0) && ((dx0 == 0) ? (dy0 > 0) : ((dx0 < 0) && (Rational64(dy0, dx0).compare(Rational64(dy, dx)) < 0)))) - { - e0 = f0; - et0 = e0->target->point; - dx = dxn; - continue; - } - } - else - { - btAssert((e0 == start0) && (d0.dot(normal) < 0)); - } - } - } - - break; - } - } -#ifdef DEBUG_CONVEX_HULL - printf(" Advanced edges to %d %d\n", et0.index, et1.index); -#endif -} - - -void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1) -{ - if (!h1.maxXy) - { - return; - } - if (!h0.maxXy) - { - h0 = h1; - return; - } - - mergeStamp--; - - Vertex* c0 = NULL; - Edge* toPrev0 = NULL; - Edge* firstNew0 = NULL; - Edge* pendingHead0 = NULL; - Edge* pendingTail0 = NULL; - Vertex* c1 = NULL; - Edge* toPrev1 = NULL; - Edge* firstNew1 = NULL; - Edge* pendingHead1 = NULL; - Edge* pendingTail1 = NULL; - Point32 prevPoint; - - if (mergeProjection(h0, h1, c0, c1)) - { - Point32 s = *c1 - *c0; - Point64 normal = Point32(0, 0, -1).cross(s); - Point64 t = s.cross(normal); - btAssert(!t.isZero()); - - Edge* e = c0->edges; - Edge* start0 = NULL; - if (e) - { - do - { - int64_t dot = (*e->target - *c0).dot(normal); - btAssert(dot <= 0); - if ((dot == 0) && ((*e->target - *c0).dot(t) > 0)) - { - if (!start0 || (getOrientation(start0, e, s, Point32(0, 0, -1)) == CLOCKWISE)) - { - start0 = e; - } - } - e = e->next; - } while (e != c0->edges); - } - - e = c1->edges; - Edge* start1 = NULL; - if (e) - { - do - { - int64_t dot = (*e->target - *c1).dot(normal); - btAssert(dot <= 0); - if ((dot == 0) && ((*e->target - *c1).dot(t) > 0)) - { - if (!start1 || (getOrientation(start1, e, s, Point32(0, 0, -1)) == COUNTER_CLOCKWISE)) - { - start1 = e; - } - } - e = e->next; - } while (e != c1->edges); - } - - if (start0 || start1) - { - findEdgeForCoplanarFaces(c0, c1, start0, start1, NULL, NULL); - if (start0) - { - c0 = start0->target; - } - if (start1) - { - c1 = start1->target; - } - } - - prevPoint = c1->point; - prevPoint.z++; - } - else - { - prevPoint = c1->point; - prevPoint.x++; - } - - Vertex* first0 = c0; - Vertex* first1 = c1; - bool firstRun = true; - - while (true) - { - Point32 s = *c1 - *c0; - Point32 r = prevPoint - c0->point; - Point64 rxs = r.cross(s); - Point64 sxrxs = s.cross(rxs); - -#ifdef DEBUG_CONVEX_HULL - printf("\n Checking %d %d\n", c0->point.index, c1->point.index); -#endif - Rational64 minCot0(0, 0); - Edge* min0 = findMaxAngle(false, c0, s, rxs, sxrxs, minCot0); - Rational64 minCot1(0, 0); - Edge* min1 = findMaxAngle(true, c1, s, rxs, sxrxs, minCot1); - if (!min0 && !min1) - { - Edge* e = newEdgePair(c0, c1); - e->link(e); - c0->edges = e; - - e = e->reverse; - e->link(e); - c1->edges = e; - return; - } - else - { - int cmp = !min0 ? 1 : !min1 ? -1 : minCot0.compare(minCot1); -#ifdef DEBUG_CONVEX_HULL - printf(" -> Result %d\n", cmp); -#endif - if (firstRun || ((cmp >= 0) ? !minCot1.isNegativeInfinity() : !minCot0.isNegativeInfinity())) - { - Edge* e = newEdgePair(c0, c1); - if (pendingTail0) - { - pendingTail0->prev = e; - } - else - { - pendingHead0 = e; - } - e->next = pendingTail0; - pendingTail0 = e; - - e = e->reverse; - if (pendingTail1) - { - pendingTail1->next = e; - } - else - { - pendingHead1 = e; - } - e->prev = pendingTail1; - pendingTail1 = e; - } - - Edge* e0 = min0; - Edge* e1 = min1; - -#ifdef DEBUG_CONVEX_HULL - printf(" Found min edges to %d %d\n", e0 ? e0->target->point.index : -1, e1 ? e1->target->point.index : -1); -#endif - - if (cmp == 0) - { - findEdgeForCoplanarFaces(c0, c1, e0, e1, NULL, NULL); - } - - if ((cmp >= 0) && e1) - { - if (toPrev1) - { - for (Edge* e = toPrev1->next, *n = NULL; e != min1; e = n) - { - n = e->next; - removeEdgePair(e); - } - } - - if (pendingTail1) - { - if (toPrev1) - { - toPrev1->link(pendingHead1); - } - else - { - min1->prev->link(pendingHead1); - firstNew1 = pendingHead1; - } - pendingTail1->link(min1); - pendingHead1 = NULL; - pendingTail1 = NULL; - } - else if (!toPrev1) - { - firstNew1 = min1; - } - - prevPoint = c1->point; - c1 = e1->target; - toPrev1 = e1->reverse; - } - - if ((cmp <= 0) && e0) - { - if (toPrev0) - { - for (Edge* e = toPrev0->prev, *n = NULL; e != min0; e = n) - { - n = e->prev; - removeEdgePair(e); - } - } - - if (pendingTail0) - { - if (toPrev0) - { - pendingHead0->link(toPrev0); - } - else - { - pendingHead0->link(min0->next); - firstNew0 = pendingHead0; - } - min0->link(pendingTail0); - pendingHead0 = NULL; - pendingTail0 = NULL; - } - else if (!toPrev0) - { - firstNew0 = min0; - } - - prevPoint = c0->point; - c0 = e0->target; - toPrev0 = e0->reverse; - } - } - - if ((c0 == first0) && (c1 == first1)) - { - if (toPrev0 == NULL) - { - pendingHead0->link(pendingTail0); - c0->edges = pendingTail0; - } - else - { - for (Edge* e = toPrev0->prev, *n = NULL; e != firstNew0; e = n) - { - n = e->prev; - removeEdgePair(e); - } - if (pendingTail0) - { - pendingHead0->link(toPrev0); - firstNew0->link(pendingTail0); - } - } - - if (toPrev1 == NULL) - { - pendingTail1->link(pendingHead1); - c1->edges = pendingTail1; - } - else - { - for (Edge* e = toPrev1->next, *n = NULL; e != firstNew1; e = n) - { - n = e->next; - removeEdgePair(e); - } - if (pendingTail1) - { - toPrev1->link(pendingHead1); - pendingTail1->link(firstNew1); - } - } - - return; - } - - firstRun = false; - } -} - - -static bool pointCmp(const btConvexHullInternal::Point32& p, const btConvexHullInternal::Point32& q) -{ - return (p.y < q.y) || ((p.y == q.y) && ((p.x < q.x) || ((p.x == q.x) && (p.z < q.z)))); -} - -void btConvexHullInternal::compute(const void* coords, bool doubleCoords, int stride, int count) -{ - btVector3 min(btScalar(1e30), btScalar(1e30), btScalar(1e30)), max(btScalar(-1e30), btScalar(-1e30), btScalar(-1e30)); - const char* ptr = (const char*) coords; - if (doubleCoords) - { - for (int i = 0; i < count; i++) - { - const double* v = (const double*) ptr; - btVector3 p((btScalar) v[0], (btScalar) v[1], (btScalar) v[2]); - ptr += stride; - min.setMin(p); - max.setMax(p); - } - } - else - { - for (int i = 0; i < count; i++) - { - const float* v = (const float*) ptr; - btVector3 p(v[0], v[1], v[2]); - ptr += stride; - min.setMin(p); - max.setMax(p); - } - } - - btVector3 s = max - min; - maxAxis = s.maxAxis(); - minAxis = s.minAxis(); - if (minAxis == maxAxis) - { - minAxis = (maxAxis + 1) % 3; - } - medAxis = 3 - maxAxis - minAxis; - - s /= btScalar(10216); - if (((medAxis + 1) % 3) != maxAxis) - { - s *= -1; - } - scaling = s; - - if (s[0] != 0) - { - s[0] = btScalar(1) / s[0]; - } - if (s[1] != 0) - { - s[1] = btScalar(1) / s[1]; - } - if (s[2] != 0) - { - s[2] = btScalar(1) / s[2]; - } - - center = (min + max) * btScalar(0.5); - - btAlignedObjectArray points; - points.resize(count); - ptr = (const char*) coords; - if (doubleCoords) - { - for (int i = 0; i < count; i++) - { - const double* v = (const double*) ptr; - btVector3 p((btScalar) v[0], (btScalar) v[1], (btScalar) v[2]); - ptr += stride; - p = (p - center) * s; - points[i].x = (int32_t) p[medAxis]; - points[i].y = (int32_t) p[maxAxis]; - points[i].z = (int32_t) p[minAxis]; - points[i].index = i; - } - } - else - { - for (int i = 0; i < count; i++) - { - const float* v = (const float*) ptr; - btVector3 p(v[0], v[1], v[2]); - ptr += stride; - p = (p - center) * s; - points[i].x = (int32_t) p[medAxis]; - points[i].y = (int32_t) p[maxAxis]; - points[i].z = (int32_t) p[minAxis]; - points[i].index = i; - } - } - points.quickSort(pointCmp); - - vertexPool.reset(); - vertexPool.setArraySize(count); - originalVertices.resize(count); - for (int i = 0; i < count; i++) - { - Vertex* v = vertexPool.newObject(); - v->edges = NULL; - v->point = points[i]; - v->copy = -1; - originalVertices[i] = v; - } - - points.clear(); - - edgePool.reset(); - edgePool.setArraySize(6 * count); - - usedEdgePairs = 0; - maxUsedEdgePairs = 0; - - mergeStamp = -3; - - IntermediateHull hull; - computeInternal(0, count, hull); - vertexList = hull.minXy; -#ifdef DEBUG_CONVEX_HULL - printf("max. edges %d (3v = %d)", maxUsedEdgePairs, 3 * count); -#endif -} - -btVector3 btConvexHullInternal::toBtVector(const Point32& v) -{ - btVector3 p; - p[medAxis] = btScalar(v.x); - p[maxAxis] = btScalar(v.y); - p[minAxis] = btScalar(v.z); - return p * scaling; -} - -btVector3 btConvexHullInternal::getBtNormal(Face* face) -{ - return toBtVector(face->dir0).cross(toBtVector(face->dir1)).normalized(); -} - -btVector3 btConvexHullInternal::getCoordinates(const Vertex* v) -{ - btVector3 p; - p[medAxis] = v->xvalue(); - p[maxAxis] = v->yvalue(); - p[minAxis] = v->zvalue(); - return p * scaling + center; -} - -btScalar btConvexHullInternal::shrink(btScalar amount, btScalar clampAmount) -{ - if (!vertexList) - { - return 0; - } - int stamp = --mergeStamp; - btAlignedObjectArray stack; - vertexList->copy = stamp; - stack.push_back(vertexList); - btAlignedObjectArray faces; - - Point32 ref = vertexList->point; - Int128 hullCenterX(0, 0); - Int128 hullCenterY(0, 0); - Int128 hullCenterZ(0, 0); - Int128 volume(0, 0); - - while (stack.size() > 0) - { - Vertex* v = stack[stack.size() - 1]; - stack.pop_back(); - Edge* e = v->edges; - if (e) - { - do - { - if (e->target->copy != stamp) - { - e->target->copy = stamp; - stack.push_back(e->target); - } - if (e->copy != stamp) - { - Face* face = facePool.newObject(); - face->init(e->target, e->reverse->prev->target, v); - faces.push_back(face); - Edge* f = e; - - Vertex* a = NULL; - Vertex* b = NULL; - do - { - if (a && b) - { - int64_t vol = (v->point - ref).dot((a->point - ref).cross(b->point - ref)); - btAssert(vol >= 0); - Point32 c = v->point + a->point + b->point + ref; - hullCenterX += vol * c.x; - hullCenterY += vol * c.y; - hullCenterZ += vol * c.z; - volume += vol; - } - - btAssert(f->copy != stamp); - f->copy = stamp; - f->face = face; - - a = b; - b = f->target; - - f = f->reverse->prev; - } while (f != e); - } - e = e->next; - } while (e != v->edges); - } - } - - if (volume.getSign() <= 0) - { - return 0; - } - - btVector3 hullCenter; - hullCenter[medAxis] = hullCenterX.toScalar(); - hullCenter[maxAxis] = hullCenterY.toScalar(); - hullCenter[minAxis] = hullCenterZ.toScalar(); - hullCenter /= 4 * volume.toScalar(); - hullCenter *= scaling; - - int faceCount = faces.size(); - - if (clampAmount > 0) - { - btScalar minDist = SIMD_INFINITY; - for (int i = 0; i < faceCount; i++) - { - btVector3 normal = getBtNormal(faces[i]); - btScalar dist = normal.dot(toBtVector(faces[i]->origin) - hullCenter); - if (dist < minDist) - { - minDist = dist; - } - } - - if (minDist <= 0) - { - return 0; - } - - amount = btMin(amount, minDist * clampAmount); - } - - unsigned int seed = 243703; - for (int i = 0; i < faceCount; i++, seed = 1664525 * seed + 1013904223) - { - btSwap(faces[i], faces[seed % faceCount]); - } - - for (int i = 0; i < faceCount; i++) - { - if (!shiftFace(faces[i], amount, stack)) - { - return -amount; - } - } - - return amount; -} - -bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjectArray stack) -{ - btVector3 origShift = getBtNormal(face) * -amount; - if (scaling[0] != 0) - { - origShift[0] /= scaling[0]; - } - if (scaling[1] != 0) - { - origShift[1] /= scaling[1]; - } - if (scaling[2] != 0) - { - origShift[2] /= scaling[2]; - } - Point32 shift((int32_t) origShift[medAxis], (int32_t) origShift[maxAxis], (int32_t) origShift[minAxis]); - if (shift.isZero()) - { - return true; - } - Point64 normal = face->getNormal(); -#ifdef DEBUG_CONVEX_HULL - printf("\nShrinking face (%d %d %d) (%d %d %d) (%d %d %d) by (%d %d %d)\n", - face->origin.x, face->origin.y, face->origin.z, face->dir0.x, face->dir0.y, face->dir0.z, face->dir1.x, face->dir1.y, face->dir1.z, shift.x, shift.y, shift.z); -#endif - int64_t origDot = face->origin.dot(normal); - Point32 shiftedOrigin = face->origin + shift; - int64_t shiftedDot = shiftedOrigin.dot(normal); - btAssert(shiftedDot <= origDot); - if (shiftedDot >= origDot) - { - return false; - } - - Edge* intersection = NULL; - - Edge* startEdge = face->nearbyVertex->edges; -#ifdef DEBUG_CONVEX_HULL - printf("Start edge is "); - startEdge->print(); - printf(", normal is (%lld %lld %lld), shifted dot is %lld\n", normal.x, normal.y, normal.z, shiftedDot); -#endif - Rational128 optDot = face->nearbyVertex->dot(normal); - int cmp = optDot.compare(shiftedDot); -#ifdef SHOW_ITERATIONS - int n = 0; -#endif - if (cmp >= 0) - { - Edge* e = startEdge; - do - { -#ifdef SHOW_ITERATIONS - n++; -#endif - Rational128 dot = e->target->dot(normal); - btAssert(dot.compare(origDot) <= 0); -#ifdef DEBUG_CONVEX_HULL - printf("Moving downwards, edge is "); - e->print(); - printf(", dot is %f (%f %lld)\n", (float) dot.toScalar(), (float) optDot.toScalar(), shiftedDot); -#endif - if (dot.compare(optDot) < 0) - { - int c = dot.compare(shiftedDot); - optDot = dot; - e = e->reverse; - startEdge = e; - if (c < 0) - { - intersection = e; - break; - } - cmp = c; - } - e = e->prev; - } while (e != startEdge); - - if (!intersection) - { - return false; - } - } - else - { - Edge* e = startEdge; - do - { -#ifdef SHOW_ITERATIONS - n++; -#endif - Rational128 dot = e->target->dot(normal); - btAssert(dot.compare(origDot) <= 0); -#ifdef DEBUG_CONVEX_HULL - printf("Moving upwards, edge is "); - e->print(); - printf(", dot is %f (%f %lld)\n", (float) dot.toScalar(), (float) optDot.toScalar(), shiftedDot); -#endif - if (dot.compare(optDot) > 0) - { - cmp = dot.compare(shiftedDot); - if (cmp >= 0) - { - intersection = e; - break; - } - optDot = dot; - e = e->reverse; - startEdge = e; - } - e = e->prev; - } while (e != startEdge); - - if (!intersection) - { - return true; - } - } - -#ifdef SHOW_ITERATIONS - printf("Needed %d iterations to find initial intersection\n", n); -#endif - - if (cmp == 0) - { - Edge* e = intersection->reverse->next; -#ifdef SHOW_ITERATIONS - n = 0; -#endif - while (e->target->dot(normal).compare(shiftedDot) <= 0) - { -#ifdef SHOW_ITERATIONS - n++; -#endif - e = e->next; - if (e == intersection->reverse) - { - return true; - } -#ifdef DEBUG_CONVEX_HULL - printf("Checking for outwards edge, current edge is "); - e->print(); - printf("\n"); -#endif - } -#ifdef SHOW_ITERATIONS - printf("Needed %d iterations to check for complete containment\n", n); -#endif - } - - Edge* firstIntersection = NULL; - Edge* faceEdge = NULL; - Edge* firstFaceEdge = NULL; - -#ifdef SHOW_ITERATIONS - int m = 0; -#endif - while (true) - { -#ifdef SHOW_ITERATIONS - m++; -#endif -#ifdef DEBUG_CONVEX_HULL - printf("Intersecting edge is "); - intersection->print(); - printf("\n"); -#endif - if (cmp == 0) - { - Edge* e = intersection->reverse->next; - startEdge = e; -#ifdef SHOW_ITERATIONS - n = 0; -#endif - while (true) - { -#ifdef SHOW_ITERATIONS - n++; -#endif - if (e->target->dot(normal).compare(shiftedDot) >= 0) - { - break; - } - intersection = e->reverse; - e = e->next; - if (e == startEdge) - { - return true; - } - } -#ifdef SHOW_ITERATIONS - printf("Needed %d iterations to advance intersection\n", n); -#endif - } - -#ifdef DEBUG_CONVEX_HULL - printf("Advanced intersecting edge to "); - intersection->print(); - printf(", cmp = %d\n", cmp); -#endif - - if (!firstIntersection) - { - firstIntersection = intersection; - } - else if (intersection == firstIntersection) - { - break; - } - - int prevCmp = cmp; - Edge* prevIntersection = intersection; - Edge* prevFaceEdge = faceEdge; - - Edge* e = intersection->reverse; -#ifdef SHOW_ITERATIONS - n = 0; -#endif - while (true) - { -#ifdef SHOW_ITERATIONS - n++; -#endif - e = e->reverse->prev; - btAssert(e != intersection->reverse); - cmp = e->target->dot(normal).compare(shiftedDot); -#ifdef DEBUG_CONVEX_HULL - printf("Testing edge "); - e->print(); - printf(" -> cmp = %d\n", cmp); -#endif - if (cmp >= 0) - { - intersection = e; - break; - } - } -#ifdef SHOW_ITERATIONS - printf("Needed %d iterations to find other intersection of face\n", n); -#endif - - if (cmp > 0) - { - Vertex* removed = intersection->target; - e = intersection->reverse; - if (e->prev == e) - { - removed->edges = NULL; - } - else - { - removed->edges = e->prev; - e->prev->link(e->next); - e->link(e); - } -#ifdef DEBUG_CONVEX_HULL - printf("1: Removed part contains (%d %d %d)\n", removed->point.x, removed->point.y, removed->point.z); -#endif - - Point64 n0 = intersection->face->getNormal(); - Point64 n1 = intersection->reverse->face->getNormal(); - int64_t m00 = face->dir0.dot(n0); - int64_t m01 = face->dir1.dot(n0); - int64_t m10 = face->dir0.dot(n1); - int64_t m11 = face->dir1.dot(n1); - int64_t r0 = (intersection->face->origin - shiftedOrigin).dot(n0); - int64_t r1 = (intersection->reverse->face->origin - shiftedOrigin).dot(n1); - Int128 det = Int128::mul(m00, m11) - Int128::mul(m01, m10); - btAssert(det.getSign() != 0); - Vertex* v = vertexPool.newObject(); - v->point.index = -1; - v->copy = -1; - v->point128 = PointR128(Int128::mul(face->dir0.x * r0, m11) - Int128::mul(face->dir0.x * r1, m01) - + Int128::mul(face->dir1.x * r1, m00) - Int128::mul(face->dir1.x * r0, m10) + det * shiftedOrigin.x, - Int128::mul(face->dir0.y * r0, m11) - Int128::mul(face->dir0.y * r1, m01) - + Int128::mul(face->dir1.y * r1, m00) - Int128::mul(face->dir1.y * r0, m10) + det * shiftedOrigin.y, - Int128::mul(face->dir0.z * r0, m11) - Int128::mul(face->dir0.z * r1, m01) - + Int128::mul(face->dir1.z * r1, m00) - Int128::mul(face->dir1.z * r0, m10) + det * shiftedOrigin.z, - det); - v->point.x = (int32_t) v->point128.xvalue(); - v->point.y = (int32_t) v->point128.yvalue(); - v->point.z = (int32_t) v->point128.zvalue(); - intersection->target = v; - v->edges = e; - - stack.push_back(v); - stack.push_back(removed); - stack.push_back(NULL); - } - - if (cmp || prevCmp || (prevIntersection->reverse->next->target != intersection->target)) - { - faceEdge = newEdgePair(prevIntersection->target, intersection->target); - if (prevCmp == 0) - { - faceEdge->link(prevIntersection->reverse->next); - } - if ((prevCmp == 0) || prevFaceEdge) - { - prevIntersection->reverse->link(faceEdge); - } - if (cmp == 0) - { - intersection->reverse->prev->link(faceEdge->reverse); - } - faceEdge->reverse->link(intersection->reverse); - } - else - { - faceEdge = prevIntersection->reverse->next; - } - - if (prevFaceEdge) - { - if (prevCmp > 0) - { - faceEdge->link(prevFaceEdge->reverse); - } - else if (faceEdge != prevFaceEdge->reverse) - { - stack.push_back(prevFaceEdge->target); - while (faceEdge->next != prevFaceEdge->reverse) - { - Vertex* removed = faceEdge->next->target; - removeEdgePair(faceEdge->next); - stack.push_back(removed); -#ifdef DEBUG_CONVEX_HULL - printf("2: Removed part contains (%d %d %d)\n", removed->point.x, removed->point.y, removed->point.z); -#endif - } - stack.push_back(NULL); - } - } - faceEdge->face = face; - faceEdge->reverse->face = intersection->face; - - if (!firstFaceEdge) - { - firstFaceEdge = faceEdge; - } - } -#ifdef SHOW_ITERATIONS - printf("Needed %d iterations to process all intersections\n", m); -#endif - - if (cmp > 0) - { - firstFaceEdge->reverse->target = faceEdge->target; - firstIntersection->reverse->link(firstFaceEdge); - firstFaceEdge->link(faceEdge->reverse); - } - else if (firstFaceEdge != faceEdge->reverse) - { - stack.push_back(faceEdge->target); - while (firstFaceEdge->next != faceEdge->reverse) - { - Vertex* removed = firstFaceEdge->next->target; - removeEdgePair(firstFaceEdge->next); - stack.push_back(removed); -#ifdef DEBUG_CONVEX_HULL - printf("3: Removed part contains (%d %d %d)\n", removed->point.x, removed->point.y, removed->point.z); -#endif - } - stack.push_back(NULL); - } - - btAssert(stack.size() > 0); - vertexList = stack[0]; - -#ifdef DEBUG_CONVEX_HULL - printf("Removing part\n"); -#endif -#ifdef SHOW_ITERATIONS - n = 0; -#endif - int pos = 0; - while (pos < stack.size()) - { - int end = stack.size(); - while (pos < end) - { - Vertex* kept = stack[pos++]; -#ifdef DEBUG_CONVEX_HULL - kept->print(); -#endif - bool deeper = false; - Vertex* removed; - while ((removed = stack[pos++]) != NULL) - { -#ifdef SHOW_ITERATIONS - n++; -#endif - kept->receiveNearbyFaces(removed); - while (removed->edges) - { - if (!deeper) - { - deeper = true; - stack.push_back(kept); - } - stack.push_back(removed->edges->target); - removeEdgePair(removed->edges); - } - } - if (deeper) - { - stack.push_back(NULL); - } - } - } -#ifdef SHOW_ITERATIONS - printf("Needed %d iterations to remove part\n", n); -#endif - - stack.resize(0); - face->origin = shiftedOrigin; - - return true; -} - - -static int getVertexCopy(btConvexHullInternal::Vertex* vertex, btAlignedObjectArray& vertices) -{ - int index = vertex->copy; - if (index < 0) - { - index = vertices.size(); - vertex->copy = index; - vertices.push_back(vertex); -#ifdef DEBUG_CONVEX_HULL - printf("Vertex %d gets index *%d\n", vertex->point.index, index); -#endif - } - return index; -} - -btScalar btConvexHullComputer::compute(const void* coords, bool doubleCoords, int stride, int count, btScalar shrink, btScalar shrinkClamp) -{ - if (count <= 0) - { - vertices.clear(); - edges.clear(); - faces.clear(); - return 0; - } - - btConvexHullInternal hull; - hull.compute(coords, doubleCoords, stride, count); - - btScalar shift = 0; - if ((shrink > 0) && ((shift = hull.shrink(shrink, shrinkClamp)) < 0)) - { - vertices.clear(); - edges.clear(); - faces.clear(); - return shift; - } - - vertices.resize(0); - edges.resize(0); - faces.resize(0); - - btAlignedObjectArray oldVertices; - getVertexCopy(hull.vertexList, oldVertices); - int copied = 0; - while (copied < oldVertices.size()) - { - btConvexHullInternal::Vertex* v = oldVertices[copied]; - vertices.push_back(hull.getCoordinates(v)); - btConvexHullInternal::Edge* firstEdge = v->edges; - if (firstEdge) - { - int firstCopy = -1; - int prevCopy = -1; - btConvexHullInternal::Edge* e = firstEdge; - do - { - if (e->copy < 0) - { - int s = edges.size(); - edges.push_back(Edge()); - edges.push_back(Edge()); - Edge* c = &edges[s]; - Edge* r = &edges[s + 1]; - e->copy = s; - e->reverse->copy = s + 1; - c->reverse = 1; - r->reverse = -1; - c->targetVertex = getVertexCopy(e->target, oldVertices); - r->targetVertex = copied; -#ifdef DEBUG_CONVEX_HULL - printf(" CREATE: Vertex *%d has edge to *%d\n", copied, c->getTargetVertex()); -#endif - } - if (prevCopy >= 0) - { - edges[e->copy].next = prevCopy - e->copy; - } - else - { - firstCopy = e->copy; - } - prevCopy = e->copy; - e = e->next; - } while (e != firstEdge); - edges[firstCopy].next = prevCopy - firstCopy; - } - copied++; - } - - for (int i = 0; i < copied; i++) - { - btConvexHullInternal::Vertex* v = oldVertices[i]; - btConvexHullInternal::Edge* firstEdge = v->edges; - if (firstEdge) - { - btConvexHullInternal::Edge* e = firstEdge; - do - { - if (e->copy >= 0) - { -#ifdef DEBUG_CONVEX_HULL - printf("Vertex *%d has edge to *%d\n", i, edges[e->copy].getTargetVertex()); -#endif - faces.push_back(e->copy); - btConvexHullInternal::Edge* f = e; - do - { -#ifdef DEBUG_CONVEX_HULL - printf(" Face *%d\n", edges[f->copy].getTargetVertex()); -#endif - f->copy = -1; - f = f->reverse->prev; - } while (f != e); - } - e = e->next; - } while (e != firstEdge); - } - } - - return shift; -} - - - - - diff --git a/opencl/parallel_primitives/host/btConvexHullComputer.h b/opencl/parallel_primitives/host/btConvexHullComputer.h deleted file mode 100644 index 7240ac4fb..000000000 --- a/opencl/parallel_primitives/host/btConvexHullComputer.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright (c) 2011 Ole Kniemeyer, MAXON, www.maxon.net - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BT_CONVEX_HULL_COMPUTER_H -#define BT_CONVEX_HULL_COMPUTER_H - -#include "btVector3.h" -#include "btAlignedObjectArray.h" - -/// Convex hull implementation based on Preparata and Hong -/// See http://code.google.com/p/bullet/issues/detail?id=275 -/// Ole Kniemeyer, MAXON Computer GmbH -class btConvexHullComputer -{ - private: - btScalar compute(const void* coords, bool doubleCoords, int stride, int count, btScalar shrink, btScalar shrinkClamp); - - public: - - class Edge - { - private: - int next; - int reverse; - int targetVertex; - - friend class btConvexHullComputer; - - public: - int getSourceVertex() const - { - return (this + reverse)->targetVertex; - } - - int getTargetVertex() const - { - return targetVertex; - } - - const Edge* getNextEdgeOfVertex() const // clockwise list of all edges of a vertex - { - return this + next; - } - - const Edge* getNextEdgeOfFace() const // counter-clockwise list of all edges of a face - { - return (this + reverse)->getNextEdgeOfVertex(); - } - - const Edge* getReverseEdge() const - { - return this + reverse; - } - }; - - - // Vertices of the output hull - btAlignedObjectArray vertices; - - // Edges of the output hull - btAlignedObjectArray edges; - - // Faces of the convex hull. Each entry is an index into the "edges" array pointing to an edge of the face. Faces are planar n-gons - btAlignedObjectArray faces; - - /* - Compute convex hull of "count" vertices stored in "coords". "stride" is the difference in bytes - between the addresses of consecutive vertices. If "shrink" is positive, the convex hull is shrunken - by that amount (each face is moved by "shrink" length units towards the center along its normal). - If "shrinkClamp" is positive, "shrink" is clamped to not exceed "shrinkClamp * innerRadius", where "innerRadius" - is the minimum distance of a face to the center of the convex hull. - - The returned value is the amount by which the hull has been shrunken. If it is negative, the amount was so large - that the resulting convex hull is empty. - - The output convex hull can be found in the member variables "vertices", "edges", "faces". - */ - btScalar compute(const float* coords, int stride, int count, btScalar shrink, btScalar shrinkClamp) - { - return compute(coords, false, stride, count, shrink, shrinkClamp); - } - - // same as above, but double precision - btScalar compute(const double* coords, int stride, int count, btScalar shrink, btScalar shrinkClamp) - { - return compute(coords, true, stride, count, shrink, shrinkClamp); - } -}; - - -#endif //BT_CONVEX_HULL_COMPUTER_H - diff --git a/opencl/parallel_primitives/host/btDefaultMotionState.h b/opencl/parallel_primitives/host/btDefaultMotionState.h deleted file mode 100644 index c90b74923..000000000 --- a/opencl/parallel_primitives/host/btDefaultMotionState.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef BT_DEFAULT_MOTION_STATE_H -#define BT_DEFAULT_MOTION_STATE_H - -#include "btMotionState.h" - -///The btDefaultMotionState provides a common implementation to synchronize world transforms with offsets. -ATTRIBUTE_ALIGNED16(struct) btDefaultMotionState : public btMotionState -{ - btTransform m_graphicsWorldTrans; - btTransform m_centerOfMassOffset; - btTransform m_startWorldTrans; - void* m_userPointer; - - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btDefaultMotionState(const btTransform& startTrans = btTransform::getIdentity(),const btTransform& centerOfMassOffset = btTransform::getIdentity()) - : m_graphicsWorldTrans(startTrans), - m_centerOfMassOffset(centerOfMassOffset), - m_startWorldTrans(startTrans), - m_userPointer(0) - - { - } - - ///synchronizes world transform from user to physics - virtual void getWorldTransform(btTransform& centerOfMassWorldTrans ) const - { - centerOfMassWorldTrans = m_centerOfMassOffset.inverse() * m_graphicsWorldTrans ; - } - - ///synchronizes world transform from physics to user - ///Bullet only calls the update of worldtransform for active objects - virtual void setWorldTransform(const btTransform& centerOfMassWorldTrans) - { - m_graphicsWorldTrans = centerOfMassWorldTrans * m_centerOfMassOffset ; - } - - - -}; - -#endif //BT_DEFAULT_MOTION_STATE_H diff --git a/opencl/parallel_primitives/host/btFillCL.h b/opencl/parallel_primitives/host/btFillCL.h index 9de498b3d..676897ff0 100644 --- a/opencl/parallel_primitives/host/btFillCL.h +++ b/opencl/parallel_primitives/host/btFillCL.h @@ -2,7 +2,7 @@ #define BT_FILL_CL_H #include "btOpenCLArray.h" -#include "btScalar.h" +#include "BulletCommon/btScalar.h" #include "btInt2.h" #include "btInt4.h" diff --git a/opencl/parallel_primitives/host/btGeometryUtil.cpp b/opencl/parallel_primitives/host/btGeometryUtil.cpp deleted file mode 100644 index 5ac230f71..000000000 --- a/opencl/parallel_primitives/host/btGeometryUtil.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#include "btGeometryUtil.h" - - -/* - Make sure this dummy function never changes so that it - can be used by probes that are checking whether the - library is actually installed. -*/ -extern "C" -{ - void btBulletMathProbe (); - - void btBulletMathProbe () {} -} - - -bool btGeometryUtil::isPointInsidePlanes(const btAlignedObjectArray& planeEquations, const btVector3& point, btScalar margin) -{ - int numbrushes = planeEquations.size(); - for (int i=0;ibtScalar(0.)) - { - return false; - } - } - return true; - -} - - -bool btGeometryUtil::areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray& vertices, btScalar margin) -{ - int numvertices = vertices.size(); - for (int i=0;ibtScalar(0.)) - { - return false; - } - } - return true; -} - -bool notExist(const btVector3& planeEquation,const btAlignedObjectArray& planeEquations); - -bool notExist(const btVector3& planeEquation,const btAlignedObjectArray& planeEquations) -{ - int numbrushes = planeEquations.size(); - for (int i=0;i btScalar(0.999)) - { - return false; - } - } - return true; -} - -void btGeometryUtil::getPlaneEquationsFromVertices(btAlignedObjectArray& vertices, btAlignedObjectArray& planeEquationsOut ) -{ - const int numvertices = vertices.size(); - // brute force: - for (int i=0;i btScalar(0.0001)) - { - planeEquation.normalize(); - if (notExist(planeEquation,planeEquationsOut)) - { - planeEquation[3] = -planeEquation.dot(N1); - - //check if inside, and replace supportingVertexOut if needed - if (areVerticesBehindPlane(planeEquation,vertices,btScalar(0.01))) - { - planeEquationsOut.push_back(planeEquation); - } - } - } - normalSign = btScalar(-1.); - } - - } - } - } - -} - -void btGeometryUtil::getVerticesFromPlaneEquations(const btAlignedObjectArray& planeEquations , btAlignedObjectArray& verticesOut ) -{ - const int numbrushes = planeEquations.size(); - // brute force: - for (int i=0;i btScalar(0.0001) ) && - ( n3n1.length2() > btScalar(0.0001) ) && - ( n1n2.length2() > btScalar(0.0001) ) ) - { - //point P out of 3 plane equations: - - // d1 ( N2 * N3 ) + d2 ( N3 * N1 ) + d3 ( N1 * N2 ) - //P = ------------------------------------------------------------------------- - // N1 . ( N2 * N3 ) - - - btScalar quotient = (N1.dot(n2n3)); - if (btFabs(quotient) > btScalar(0.000001)) - { - quotient = btScalar(-1.) / quotient; - n2n3 *= N1[3]; - n3n1 *= N2[3]; - n1n2 *= N3[3]; - btVector3 potentialVertex = n2n3; - potentialVertex += n3n1; - potentialVertex += n1n2; - potentialVertex *= quotient; - - //check if inside, and replace supportingVertexOut if needed - if (isPointInsidePlanes(planeEquations,potentialVertex,btScalar(0.01))) - { - verticesOut.push_back(potentialVertex); - } - } - } - } - } - } -} - diff --git a/opencl/parallel_primitives/host/btGeometryUtil.h b/opencl/parallel_primitives/host/btGeometryUtil.h deleted file mode 100644 index a4b13b456..000000000 --- a/opencl/parallel_primitives/host/btGeometryUtil.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef BT_GEOMETRY_UTIL_H -#define BT_GEOMETRY_UTIL_H - -#include "btVector3.h" -#include "btAlignedObjectArray.h" - -///The btGeometryUtil helper class provides a few methods to convert between plane equations and vertices. -class btGeometryUtil -{ - public: - - - static void getPlaneEquationsFromVertices(btAlignedObjectArray& vertices, btAlignedObjectArray& planeEquationsOut ); - - static void getVerticesFromPlaneEquations(const btAlignedObjectArray& planeEquations , btAlignedObjectArray& verticesOut ); - - static bool isInside(const btAlignedObjectArray& vertices, const btVector3& planeNormal, btScalar margin); - - static bool isPointInsidePlanes(const btAlignedObjectArray& planeEquations, const btVector3& point, btScalar margin); - - static bool areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray& vertices, btScalar margin); - -}; - - -#endif //BT_GEOMETRY_UTIL_H - diff --git a/opencl/parallel_primitives/host/btGrahamScan2dConvexHull.h b/opencl/parallel_primitives/host/btGrahamScan2dConvexHull.h deleted file mode 100644 index e658c5cf0..000000000 --- a/opencl/parallel_primitives/host/btGrahamScan2dConvexHull.h +++ /dev/null @@ -1,117 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2011 Advanced Micro Devices, Inc. http://bulletphysics.org - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef GRAHAM_SCAN_2D_CONVEX_HULL_H -#define GRAHAM_SCAN_2D_CONVEX_HULL_H - - -#include "btVector3.h" -#include "btAlignedObjectArray.h" - -struct GrahamVector3 : public btVector3 -{ - GrahamVector3(const btVector3& org, int orgIndex) - :btVector3(org), - m_orgIndex(orgIndex) - { - } - btScalar m_angle; - int m_orgIndex; -}; - - -struct btAngleCompareFunc { - btVector3 m_anchor; - btAngleCompareFunc(const btVector3& anchor) - : m_anchor(anchor) - { - } - bool operator()(const GrahamVector3& a, const GrahamVector3& b) const { - if (a.m_angle != b.m_angle) - return a.m_angle < b.m_angle; - else - { - btScalar al = (a-m_anchor).length2(); - btScalar bl = (b-m_anchor).length2(); - if (al != bl) - return al < bl; - else - { - return a.m_orgIndex < b.m_orgIndex; - } - } - } -}; - -inline void GrahamScanConvexHull2D(btAlignedObjectArray& originalPoints, btAlignedObjectArray& hull, const btVector3& normalAxis) -{ - btVector3 axis0,axis1; - btPlaneSpace1(normalAxis,axis0,axis1); - - - if (originalPoints.size()<=1) - { - for (int i=0;i1) { - btVector3& a = hull[hull.size()-2]; - btVector3& b = hull[hull.size()-1]; - isConvex = btCross(a-b,a-originalPoints[i]).dot(normalAxis)> 0; - if (!isConvex) - hull.pop_back(); - else - hull.push_back(originalPoints[i]); - } - } -} - -#endif //GRAHAM_SCAN_2D_CONVEX_HULL_H diff --git a/opencl/parallel_primitives/host/btHashMap.h b/opencl/parallel_primitives/host/btHashMap.h deleted file mode 100644 index ce07db3ac..000000000 --- a/opencl/parallel_primitives/host/btHashMap.h +++ /dev/null @@ -1,450 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef BT_HASH_MAP_H -#define BT_HASH_MAP_H - -#include "btAlignedObjectArray.h" - -///very basic hashable string implementation, compatible with btHashMap -struct btHashString -{ - const char* m_string; - unsigned int m_hash; - - SIMD_FORCE_INLINE unsigned int getHash()const - { - return m_hash; - } - - btHashString(const char* name) - :m_string(name) - { - /* magic numbers from http://www.isthe.com/chongo/tech/comp/fnv/ */ - static const unsigned int InitialFNV = 2166136261u; - static const unsigned int FNVMultiple = 16777619u; - - /* Fowler / Noll / Vo (FNV) Hash */ - unsigned int hash = InitialFNV; - - for(int i = 0; m_string[i]; i++) - { - hash = hash ^ (m_string[i]); /* xor the low 8 bits */ - hash = hash * FNVMultiple; /* multiply by the magic number */ - } - m_hash = hash; - } - - int portableStringCompare(const char* src, const char* dst) const - { - int ret = 0 ; - - while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) - ++src, ++dst; - - if ( ret < 0 ) - ret = -1 ; - else if ( ret > 0 ) - ret = 1 ; - - return( ret ); - } - - bool equals(const btHashString& other) const - { - return (m_string == other.m_string) || - (0==portableStringCompare(m_string,other.m_string)); - - } - -}; - -const int BT_HASH_NULL=0xffffffff; - - -class btHashInt -{ - int m_uid; -public: - btHashInt(int uid) :m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - void setUid1(int uid) - { - m_uid = uid; - } - - bool equals(const btHashInt& other) const - { - return getUid1() == other.getUid1(); - } - //to our success - SIMD_FORCE_INLINE unsigned int getHash()const - { - int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); - return key; - } -}; - - - -class btHashPtr -{ - - union - { - const void* m_pointer; - int m_hashValues[2]; - }; - -public: - - btHashPtr(const void* ptr) - :m_pointer(ptr) - { - } - - const void* getPointer() const - { - return m_pointer; - } - - bool equals(const btHashPtr& other) const - { - return getPointer() == other.getPointer(); - } - - //to our success - SIMD_FORCE_INLINE unsigned int getHash()const - { - const bool VOID_IS_8 = ((sizeof(void*)==8)); - - int key = VOID_IS_8? m_hashValues[0]+m_hashValues[1] : m_hashValues[0]; - - // Thomas Wang's hash - key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); - return key; - } - - -}; - - -template -class btHashKeyPtr -{ - int m_uid; -public: - - btHashKeyPtr(int uid) :m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - bool equals(const btHashKeyPtr& other) const - { - return getUid1() == other.getUid1(); - } - - //to our success - SIMD_FORCE_INLINE unsigned int getHash()const - { - int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); - return key; - } - - -}; - - -template -class btHashKey -{ - int m_uid; -public: - - btHashKey(int uid) :m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - bool equals(const btHashKey& other) const - { - return getUid1() == other.getUid1(); - } - //to our success - SIMD_FORCE_INLINE unsigned int getHash()const - { - int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); - return key; - } -}; - - -///The btHashMap template class implements a generic and lightweight hashmap. -///A basic sample of how to use btHashMap is located in Demos\BasicDemo\main.cpp -template -class btHashMap -{ - -protected: - btAlignedObjectArray m_hashTable; - btAlignedObjectArray m_next; - - btAlignedObjectArray m_valueArray; - btAlignedObjectArray m_keyArray; - - void growTables(const Key& /*key*/) - { - int newCapacity = m_valueArray.capacity(); - - if (m_hashTable.size() < newCapacity) - { - //grow hashtable and next table - int curHashtableSize = m_hashTable.size(); - - m_hashTable.resize(newCapacity); - m_next.resize(newCapacity); - - int i; - - for (i= 0; i < newCapacity; ++i) - { - m_hashTable[i] = BT_HASH_NULL; - } - for (i = 0; i < newCapacity; ++i) - { - m_next[i] = BT_HASH_NULL; - } - - for(i=0;i= (unsigned int)m_hashTable.size()) - { - return BT_HASH_NULL; - } - - int index = m_hashTable[hash]; - while ((index != BT_HASH_NULL) && key.equals(m_keyArray[index]) == false) - { - index = m_next[index]; - } - return index; - } - - void clear() - { - m_hashTable.clear(); - m_next.clear(); - m_valueArray.clear(); - m_keyArray.clear(); - } - -}; - -#endif //BT_HASH_MAP_H diff --git a/opencl/parallel_primitives/host/btIDebugDraw.h b/opencl/parallel_primitives/host/btIDebugDraw.h deleted file mode 100644 index 33efaa65b..000000000 --- a/opencl/parallel_primitives/host/btIDebugDraw.h +++ /dev/null @@ -1,411 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef BT_IDEBUG_DRAW__H -#define BT_IDEBUG_DRAW__H - -#include "btVector3.h" -#include "btTransform.h" - - -///The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations. -///Typical use case: create a debug drawer object, and assign it to a btCollisionWorld or btDynamicsWorld using setDebugDrawer and call debugDrawWorld. -///A class that implements the btIDebugDraw interface has to implement the drawLine method at a minimum. -///For color arguments the X,Y,Z components refer to Red, Green and Blue each in the range [0..1] -class btIDebugDraw -{ - public: - - enum DebugDrawModes - { - DBG_NoDebug=0, - DBG_DrawWireframe = 1, - DBG_DrawAabb=2, - DBG_DrawFeaturesText=4, - DBG_DrawContactPoints=8, - DBG_NoDeactivation=16, - DBG_NoHelpText = 32, - DBG_DrawText=64, - DBG_ProfileTimings = 128, - DBG_EnableSatComparison = 256, - DBG_DisableBulletLCP = 512, - DBG_EnableCCD = 1024, - DBG_DrawConstraints = (1 << 11), - DBG_DrawConstraintLimits = (1 << 12), - DBG_FastWireframe = (1<<13), - DBG_DrawNormals = (1<<14), - DBG_DrawBroadphasePairs= (1<<15), - - DBG_MAX_DEBUG_DRAW_MODE - }; - - virtual ~btIDebugDraw() {}; - - virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)=0; - - virtual void drawLine(const btVector3& from,const btVector3& to, const btVector3& fromColor, const btVector3& toColor) - { - (void) toColor; - drawLine (from, to, fromColor); - } - - virtual void drawSphere(btScalar radius, const btTransform& transform, const btVector3& color) - { - - btVector3 start = transform.getOrigin(); - - - const btVector3 xoffs = transform.getBasis() * btVector3(1,0,0); - const btVector3 yoffs = transform.getBasis() * btVector3(0,1,0); - const btVector3 zoffs = transform.getBasis() * btVector3(0,0,1); - - drawArc(start,xoffs,yoffs,radius,radius,0,SIMD_2_PI,color,true,btScalar(10.0)); - drawArc(start,yoffs,zoffs,radius,radius,0,SIMD_2_PI,color,true,btScalar(10.0)); - drawArc(start,zoffs,xoffs,radius,radius,0,SIMD_2_PI,color,true,btScalar(10.0)); -// drawArc(start,zoffs,yoffs,radius,radius,0,SIMD_2_PI,color,false,btScalar(10.0)); - - } - - virtual void drawSphere (const btVector3& p, btScalar radius, const btVector3& color) - { - btTransform tr; - tr.setIdentity(); - tr.setOrigin(p); - drawSphere(radius,tr,color); - } - - virtual void drawTriangle(const btVector3& v0,const btVector3& v1,const btVector3& v2,const btVector3& /*n0*/,const btVector3& /*n1*/,const btVector3& /*n2*/,const btVector3& color, btScalar alpha) - { - drawTriangle(v0,v1,v2,color,alpha); - } - virtual void drawTriangle(const btVector3& v0,const btVector3& v1,const btVector3& v2,const btVector3& color, btScalar /*alpha*/) - { - drawLine(v0,v1,color); - drawLine(v1,v2,color); - drawLine(v2,v0,color); - } - - virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)=0; - - virtual void reportErrorWarning(const char* warningString) = 0; - - virtual void draw3dText(const btVector3& location,const char* textString) = 0; - - virtual void setDebugMode(int debugMode) =0; - - virtual int getDebugMode() const = 0; - - virtual void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color) - { - - btVector3 halfExtents = (to-from)* 0.5f; - btVector3 center = (to+from) *0.5f; - int i,j; - - btVector3 edgecoord(1.f,1.f,1.f),pa,pb; - for (i=0;i<4;i++) - { - for (j=0;j<3;j++) - { - pa = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1], - edgecoord[2]*halfExtents[2]); - pa+=center; - - int othercoord = j%3; - edgecoord[othercoord]*=-1.f; - pb = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1], - edgecoord[2]*halfExtents[2]); - pb+=center; - - drawLine(pa,pb,color); - } - edgecoord = btVector3(-1.f,-1.f,-1.f); - if (i<3) - edgecoord[i]*=-1.f; - } - } - virtual void drawTransform(const btTransform& transform, btScalar orthoLen) - { - btVector3 start = transform.getOrigin(); - drawLine(start, start+transform.getBasis() * btVector3(orthoLen, 0, 0), btVector3(0.7f,0,0)); - drawLine(start, start+transform.getBasis() * btVector3(0, orthoLen, 0), btVector3(0,0.7f,0)); - drawLine(start, start+transform.getBasis() * btVector3(0, 0, orthoLen), btVector3(0,0,0.7f)); - } - - virtual void drawArc(const btVector3& center, const btVector3& normal, const btVector3& axis, btScalar radiusA, btScalar radiusB, btScalar minAngle, btScalar maxAngle, - const btVector3& color, bool drawSect, btScalar stepDegrees = btScalar(10.f)) - { - const btVector3& vx = axis; - btVector3 vy = normal.cross(axis); - btScalar step = stepDegrees * SIMD_RADS_PER_DEG; - int nSteps = (int)((maxAngle - minAngle) / step); - if(!nSteps) nSteps = 1; - btVector3 prev = center + radiusA * vx * btCos(minAngle) + radiusB * vy * btSin(minAngle); - if(drawSect) - { - drawLine(center, prev, color); - } - for(int i = 1; i <= nSteps; i++) - { - btScalar angle = minAngle + (maxAngle - minAngle) * btScalar(i) / btScalar(nSteps); - btVector3 next = center + radiusA * vx * btCos(angle) + radiusB * vy * btSin(angle); - drawLine(prev, next, color); - prev = next; - } - if(drawSect) - { - drawLine(center, prev, color); - } - } - virtual void drawSpherePatch(const btVector3& center, const btVector3& up, const btVector3& axis, btScalar radius, - btScalar minTh, btScalar maxTh, btScalar minPs, btScalar maxPs, const btVector3& color, btScalar stepDegrees = btScalar(10.f)) - { - btVector3 vA[74]; - btVector3 vB[74]; - btVector3 *pvA = vA, *pvB = vB, *pT; - btVector3 npole = center + up * radius; - btVector3 spole = center - up * radius; - btVector3 arcStart; - btScalar step = stepDegrees * SIMD_RADS_PER_DEG; - const btVector3& kv = up; - const btVector3& iv = axis; - btVector3 jv = kv.cross(iv); - bool drawN = false; - bool drawS = false; - if(minTh <= -SIMD_HALF_PI) - { - minTh = -SIMD_HALF_PI + step; - drawN = true; - } - if(maxTh >= SIMD_HALF_PI) - { - maxTh = SIMD_HALF_PI - step; - drawS = true; - } - if(minTh > maxTh) - { - minTh = -SIMD_HALF_PI + step; - maxTh = SIMD_HALF_PI - step; - drawN = drawS = true; - } - int n_hor = (int)((maxTh - minTh) / step) + 1; - if(n_hor < 2) n_hor = 2; - btScalar step_h = (maxTh - minTh) / btScalar(n_hor - 1); - bool isClosed = false; - if(minPs > maxPs) - { - minPs = -SIMD_PI + step; - maxPs = SIMD_PI; - isClosed = true; - } - else if((maxPs - minPs) >= SIMD_PI * btScalar(2.f)) - { - isClosed = true; - } - else - { - isClosed = false; - } - int n_vert = (int)((maxPs - minPs) / step) + 1; - if(n_vert < 2) n_vert = 2; - btScalar step_v = (maxPs - minPs) / btScalar(n_vert - 1); - for(int i = 0; i < n_hor; i++) - { - btScalar th = minTh + btScalar(i) * step_h; - btScalar sth = radius * btSin(th); - btScalar cth = radius * btCos(th); - for(int j = 0; j < n_vert; j++) - { - btScalar psi = minPs + btScalar(j) * step_v; - btScalar sps = btSin(psi); - btScalar cps = btCos(psi); - pvB[j] = center + cth * cps * iv + cth * sps * jv + sth * kv; - if(i) - { - drawLine(pvA[j], pvB[j], color); - } - else if(drawS) - { - drawLine(spole, pvB[j], color); - } - if(j) - { - drawLine(pvB[j-1], pvB[j], color); - } - else - { - arcStart = pvB[j]; - } - if((i == (n_hor - 1)) && drawN) - { - drawLine(npole, pvB[j], color); - } - if(isClosed) - { - if(j == (n_vert-1)) - { - drawLine(arcStart, pvB[j], color); - } - } - else - { - if(((!i) || (i == (n_hor-1))) && ((!j) || (j == (n_vert-1)))) - { - drawLine(center, pvB[j], color); - } - } - } - pT = pvA; pvA = pvB; pvB = pT; - } - } - - - virtual void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btVector3& color) - { - drawLine(btVector3(bbMin[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMin[1], bbMin[2]), color); - drawLine(btVector3(bbMax[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMax[1], bbMin[2]), color); - drawLine(btVector3(bbMax[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMax[1], bbMin[2]), color); - drawLine(btVector3(bbMin[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMin[1], bbMin[2]), color); - drawLine(btVector3(bbMin[0], bbMin[1], bbMin[2]), btVector3(bbMin[0], bbMin[1], bbMax[2]), color); - drawLine(btVector3(bbMax[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMin[1], bbMax[2]), color); - drawLine(btVector3(bbMax[0], bbMax[1], bbMin[2]), btVector3(bbMax[0], bbMax[1], bbMax[2]), color); - drawLine(btVector3(bbMin[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMax[1], bbMax[2]), color); - drawLine(btVector3(bbMin[0], bbMin[1], bbMax[2]), btVector3(bbMax[0], bbMin[1], bbMax[2]), color); - drawLine(btVector3(bbMax[0], bbMin[1], bbMax[2]), btVector3(bbMax[0], bbMax[1], bbMax[2]), color); - drawLine(btVector3(bbMax[0], bbMax[1], bbMax[2]), btVector3(bbMin[0], bbMax[1], bbMax[2]), color); - drawLine(btVector3(bbMin[0], bbMax[1], bbMax[2]), btVector3(bbMin[0], bbMin[1], bbMax[2]), color); - } - virtual void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btTransform& trans, const btVector3& color) - { - drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), color); - } - - virtual void drawCapsule(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color) - { - btVector3 capStart(0.f,0.f,0.f); - capStart[upAxis] = -halfHeight; - - btVector3 capEnd(0.f,0.f,0.f); - capEnd[upAxis] = halfHeight; - - // Draw the ends - { - - btTransform childTransform = transform; - childTransform.getOrigin() = transform * capStart; - drawSphere(radius, childTransform, color); - } - - { - btTransform childTransform = transform; - childTransform.getOrigin() = transform * capEnd; - drawSphere(radius, childTransform, color); - } - - // Draw some additional lines - btVector3 start = transform.getOrigin(); - - capStart[(upAxis+1)%3] = radius; - capEnd[(upAxis+1)%3] = radius; - drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color); - capStart[(upAxis+1)%3] = -radius; - capEnd[(upAxis+1)%3] = -radius; - drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color); - - capStart[(upAxis+1)%3] = 0.f; - capEnd[(upAxis+1)%3] = 0.f; - - capStart[(upAxis+2)%3] = radius; - capEnd[(upAxis+2)%3] = radius; - drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color); - capStart[(upAxis+2)%3] = -radius; - capEnd[(upAxis+2)%3] = -radius; - drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color); - } - - virtual void drawCylinder(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color) - { - btVector3 start = transform.getOrigin(); - btVector3 offsetHeight(0,0,0); - offsetHeight[upAxis] = halfHeight; - btVector3 offsetRadius(0,0,0); - offsetRadius[(upAxis+1)%3] = radius; - drawLine(start+transform.getBasis() * (offsetHeight+offsetRadius),start+transform.getBasis() * (-offsetHeight+offsetRadius),color); - drawLine(start+transform.getBasis() * (offsetHeight-offsetRadius),start+transform.getBasis() * (-offsetHeight-offsetRadius),color); - - // Drawing top and bottom caps of the cylinder - btVector3 yaxis(0,0,0); - yaxis[upAxis] = btScalar(1.0); - btVector3 xaxis(0,0,0); - xaxis[(upAxis+1)%3] = btScalar(1.0); - drawArc(start-transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,btScalar(10.0)); - drawArc(start+transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,btScalar(10.0)); - } - - virtual void drawCone(btScalar radius, btScalar height, int upAxis, const btTransform& transform, const btVector3& color) - { - - btVector3 start = transform.getOrigin(); - - btVector3 offsetHeight(0,0,0); - offsetHeight[upAxis] = height * btScalar(0.5); - btVector3 offsetRadius(0,0,0); - offsetRadius[(upAxis+1)%3] = radius; - btVector3 offset2Radius(0,0,0); - offset2Radius[(upAxis+2)%3] = radius; - - drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight+offsetRadius),color); - drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight-offsetRadius),color); - drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight+offset2Radius),color); - drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight-offset2Radius),color); - - // Drawing the base of the cone - btVector3 yaxis(0,0,0); - yaxis[upAxis] = btScalar(1.0); - btVector3 xaxis(0,0,0); - xaxis[(upAxis+1)%3] = btScalar(1.0); - drawArc(start-transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,10.0); - } - - virtual void drawPlane(const btVector3& planeNormal, btScalar planeConst, const btTransform& transform, const btVector3& color) - { - btVector3 planeOrigin = planeNormal * planeConst; - btVector3 vec0,vec1; - btPlaneSpace1(planeNormal,vec0,vec1); - btScalar vecLen = 100.f; - btVector3 pt0 = planeOrigin + vec0*vecLen; - btVector3 pt1 = planeOrigin - vec0*vecLen; - btVector3 pt2 = planeOrigin + vec1*vecLen; - btVector3 pt3 = planeOrigin - vec1*vecLen; - drawLine(transform*pt0,transform*pt1,color); - drawLine(transform*pt2,transform*pt3,color); - } -}; - - -#endif //BT_IDEBUG_DRAW__H - diff --git a/opencl/parallel_primitives/host/btInt4.h b/opencl/parallel_primitives/host/btInt4.h index c4539e481..5b29b7284 100644 --- a/opencl/parallel_primitives/host/btInt4.h +++ b/opencl/parallel_primitives/host/btInt4.h @@ -1,7 +1,7 @@ #ifndef BT_INT4_H #define BT_INT4_H -#include "btScalar.h" +#include "BulletCommon/btScalar.h" ATTRIBUTE_ALIGNED16(struct) btUnsignedInt4 { diff --git a/opencl/parallel_primitives/host/btLauncherCL.h b/opencl/parallel_primitives/host/btLauncherCL.h index 6b5657426..69a3b79e2 100644 --- a/opencl/parallel_primitives/host/btLauncherCL.h +++ b/opencl/parallel_primitives/host/btLauncherCL.h @@ -3,7 +3,7 @@ #define BT_LAUNCHER_CL_H #include "btBufferInfoCL.h" -#include "btMinMax.h" +#include "BulletCommon/btMinMax.h" #include "btOpenCLArray.h" #include diff --git a/opencl/parallel_primitives/host/btList.h b/opencl/parallel_primitives/host/btList.h deleted file mode 100644 index eec80a706..000000000 --- a/opencl/parallel_primitives/host/btList.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef BT_GEN_LIST_H -#define BT_GEN_LIST_H - -class btGEN_Link { -public: - btGEN_Link() : m_next(0), m_prev(0) {} - btGEN_Link(btGEN_Link *next, btGEN_Link *prev) : m_next(next), m_prev(prev) {} - - btGEN_Link *getNext() const { return m_next; } - btGEN_Link *getPrev() const { return m_prev; } - - bool isHead() const { return m_prev == 0; } - bool isTail() const { return m_next == 0; } - - void insertBefore(btGEN_Link *link) { - m_next = link; - m_prev = link->m_prev; - m_next->m_prev = this; - m_prev->m_next = this; - } - - void insertAfter(btGEN_Link *link) { - m_next = link->m_next; - m_prev = link; - m_next->m_prev = this; - m_prev->m_next = this; - } - - void remove() { - m_next->m_prev = m_prev; - m_prev->m_next = m_next; - } - -private: - btGEN_Link *m_next; - btGEN_Link *m_prev; -}; - -class btGEN_List { -public: - btGEN_List() : m_head(&m_tail, 0), m_tail(0, &m_head) {} - - btGEN_Link *getHead() const { return m_head.getNext(); } - btGEN_Link *getTail() const { return m_tail.getPrev(); } - - void addHead(btGEN_Link *link) { link->insertAfter(&m_head); } - void addTail(btGEN_Link *link) { link->insertBefore(&m_tail); } - -private: - btGEN_Link m_head; - btGEN_Link m_tail; -}; - -#endif //BT_GEN_LIST_H - - - diff --git a/opencl/parallel_primitives/host/btMatrix3x3.h b/opencl/parallel_primitives/host/btMatrix3x3.h deleted file mode 100644 index d4f5c95aa..000000000 --- a/opencl/parallel_primitives/host/btMatrix3x3.h +++ /dev/null @@ -1,1362 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef BT_MATRIX3x3_H -#define BT_MATRIX3x3_H - -#include "btVector3.h" -#include "btQuaternion.h" -#include - -#ifdef BT_USE_SSE -//const __m128 ATTRIBUTE_ALIGNED16(v2220) = {2.0f, 2.0f, 2.0f, 0.0f}; -const __m128 ATTRIBUTE_ALIGNED16(vMPPP) = {-0.0f, +0.0f, +0.0f, +0.0f}; -#endif - -#if defined(BT_USE_SSE) || defined(BT_USE_NEON) -const btSimdFloat4 ATTRIBUTE_ALIGNED16(v1000) = {1.0f, 0.0f, 0.0f, 0.0f}; -const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0100) = {0.0f, 1.0f, 0.0f, 0.0f}; -const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0010) = {0.0f, 0.0f, 1.0f, 0.0f}; -#endif - -#ifdef BT_USE_DOUBLE_PRECISION -#define btMatrix3x3Data btMatrix3x3DoubleData -#else -#define btMatrix3x3Data btMatrix3x3FloatData -#endif //BT_USE_DOUBLE_PRECISION - - -/**@brief The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with btQuaternion, btTransform and btVector3. -* Make sure to only include a pure orthogonal matrix without scaling. */ -ATTRIBUTE_ALIGNED16(class) btMatrix3x3 { - - ///Data storage for the matrix, each vector is a row of the matrix - btVector3 m_el[3]; - -public: - /** @brief No initializaion constructor */ - btMatrix3x3 () {} - - // explicit btMatrix3x3(const btScalar *m) { setFromOpenGLSubMatrix(m); } - - /**@brief Constructor from Quaternion */ - explicit btMatrix3x3(const btQuaternion& q) { setRotation(q); } - /* - template - Matrix3x3(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { - setEulerYPR(yaw, pitch, roll); - } - */ - /** @brief Constructor with row major formatting */ - btMatrix3x3(const btScalar& xx, const btScalar& xy, const btScalar& xz, - const btScalar& yx, const btScalar& yy, const btScalar& yz, - const btScalar& zx, const btScalar& zy, const btScalar& zz) - { - setValue(xx, xy, xz, - yx, yy, yz, - zx, zy, zz); - } - -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON) - SIMD_FORCE_INLINE btMatrix3x3 (const btSimdFloat4 v0, const btSimdFloat4 v1, const btSimdFloat4 v2 ) - { - m_el[0].mVec128 = v0; - m_el[1].mVec128 = v1; - m_el[2].mVec128 = v2; - } - - SIMD_FORCE_INLINE btMatrix3x3 (const btVector3& v0, const btVector3& v1, const btVector3& v2 ) - { - m_el[0] = v0; - m_el[1] = v1; - m_el[2] = v2; - } - - // Copy constructor - SIMD_FORCE_INLINE btMatrix3x3(const btMatrix3x3& rhs) - { - m_el[0].mVec128 = rhs.m_el[0].mVec128; - m_el[1].mVec128 = rhs.m_el[1].mVec128; - m_el[2].mVec128 = rhs.m_el[2].mVec128; - } - - // Assignment Operator - SIMD_FORCE_INLINE btMatrix3x3& operator=(const btMatrix3x3& m) - { - m_el[0].mVec128 = m.m_el[0].mVec128; - m_el[1].mVec128 = m.m_el[1].mVec128; - m_el[2].mVec128 = m.m_el[2].mVec128; - - return *this; - } - -#else - - /** @brief Copy constructor */ - SIMD_FORCE_INLINE btMatrix3x3 (const btMatrix3x3& other) - { - m_el[0] = other.m_el[0]; - m_el[1] = other.m_el[1]; - m_el[2] = other.m_el[2]; - } - - /** @brief Assignment Operator */ - SIMD_FORCE_INLINE btMatrix3x3& operator=(const btMatrix3x3& other) - { - m_el[0] = other.m_el[0]; - m_el[1] = other.m_el[1]; - m_el[2] = other.m_el[2]; - return *this; - } - -#endif - - /** @brief Get a column of the matrix as a vector - * @param i Column number 0 indexed */ - SIMD_FORCE_INLINE btVector3 getColumn(int i) const - { - return btVector3(m_el[0][i],m_el[1][i],m_el[2][i]); - } - - - /** @brief Get a row of the matrix as a vector - * @param i Row number 0 indexed */ - SIMD_FORCE_INLINE const btVector3& getRow(int i) const - { - btFullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Get a mutable reference to a row of the matrix as a vector - * @param i Row number 0 indexed */ - SIMD_FORCE_INLINE btVector3& operator[](int i) - { - btFullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Get a const reference to a row of the matrix as a vector - * @param i Row number 0 indexed */ - SIMD_FORCE_INLINE const btVector3& operator[](int i) const - { - btFullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Multiply by the target matrix on the right - * @param m Rotation matrix to be applied - * Equivilant to this = this * m */ - btMatrix3x3& operator*=(const btMatrix3x3& m); - - /** @brief Adds by the target matrix on the right - * @param m matrix to be applied - * Equivilant to this = this + m */ - btMatrix3x3& operator+=(const btMatrix3x3& m); - - /** @brief Substractss by the target matrix on the right - * @param m matrix to be applied - * Equivilant to this = this - m */ - btMatrix3x3& operator-=(const btMatrix3x3& m); - - /** @brief Set from the rotational part of a 4x4 OpenGL matrix - * @param m A pointer to the beginning of the array of scalars*/ - void setFromOpenGLSubMatrix(const btScalar *m) - { - m_el[0].setValue(m[0],m[4],m[8]); - m_el[1].setValue(m[1],m[5],m[9]); - m_el[2].setValue(m[2],m[6],m[10]); - - } - /** @brief Set the values of the matrix explicitly (row major) - * @param xx Top left - * @param xy Top Middle - * @param xz Top Right - * @param yx Middle Left - * @param yy Middle Middle - * @param yz Middle Right - * @param zx Bottom Left - * @param zy Bottom Middle - * @param zz Bottom Right*/ - void setValue(const btScalar& xx, const btScalar& xy, const btScalar& xz, - const btScalar& yx, const btScalar& yy, const btScalar& yz, - const btScalar& zx, const btScalar& zy, const btScalar& zz) - { - m_el[0].setValue(xx,xy,xz); - m_el[1].setValue(yx,yy,yz); - m_el[2].setValue(zx,zy,zz); - } - - /** @brief Set the matrix from a quaternion - * @param q The Quaternion to match */ - void setRotation(const btQuaternion& q) - { - btScalar d = q.length2(); - btFullAssert(d != btScalar(0.0)); - btScalar s = btScalar(2.0) / d; - - #if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vs, Q = q.get128(); - __m128i Qi = btCastfTo128i(Q); - __m128 Y, Z; - __m128 V1, V2, V3; - __m128 V11, V21, V31; - __m128 NQ = _mm_xor_ps(Q, btvMzeroMask); - __m128i NQi = btCastfTo128i(NQ); - - V1 = btCastiTo128f(_mm_shuffle_epi32 (Qi, BT_SHUFFLE(1,0,2,3))); // Y X Z W - V2 = _mm_shuffle_ps(NQ, Q, BT_SHUFFLE(0,0,1,3)); // -X -X Y W - V3 = btCastiTo128f(_mm_shuffle_epi32 (Qi, BT_SHUFFLE(2,1,0,3))); // Z Y X W - V1 = _mm_xor_ps(V1, vMPPP); // change the sign of the first element - - V11 = btCastiTo128f(_mm_shuffle_epi32 (Qi, BT_SHUFFLE(1,1,0,3))); // Y Y X W - V21 = _mm_unpackhi_ps(Q, Q); // Z Z W W - V31 = _mm_shuffle_ps(Q, NQ, BT_SHUFFLE(0,2,0,3)); // X Z -X -W - - V2 = V2 * V1; // - V1 = V1 * V11; // - V3 = V3 * V31; // - - V11 = _mm_shuffle_ps(NQ, Q, BT_SHUFFLE(2,3,1,3)); // -Z -W Y W - V11 = V11 * V21; // - V21 = _mm_xor_ps(V21, vMPPP); // change the sign of the first element - V31 = _mm_shuffle_ps(Q, NQ, BT_SHUFFLE(3,3,1,3)); // W W -Y -W - V31 = _mm_xor_ps(V31, vMPPP); // change the sign of the first element - Y = btCastiTo128f(_mm_shuffle_epi32 (NQi, BT_SHUFFLE(3,2,0,3))); // -W -Z -X -W - Z = btCastiTo128f(_mm_shuffle_epi32 (Qi, BT_SHUFFLE(1,0,1,3))); // Y X Y W - - vs = _mm_load_ss(&s); - V21 = V21 * Y; - V31 = V31 * Z; - - V1 = V1 + V11; - V2 = V2 + V21; - V3 = V3 + V31; - - vs = bt_splat3_ps(vs, 0); - // s ready - V1 = V1 * vs; - V2 = V2 * vs; - V3 = V3 * vs; - - V1 = V1 + v1000; - V2 = V2 + v0100; - V3 = V3 + v0010; - - m_el[0] = V1; - m_el[1] = V2; - m_el[2] = V3; - #else - btScalar xs = q.x() * s, ys = q.y() * s, zs = q.z() * s; - btScalar wx = q.w() * xs, wy = q.w() * ys, wz = q.w() * zs; - btScalar xx = q.x() * xs, xy = q.x() * ys, xz = q.x() * zs; - btScalar yy = q.y() * ys, yz = q.y() * zs, zz = q.z() * zs; - setValue( - btScalar(1.0) - (yy + zz), xy - wz, xz + wy, - xy + wz, btScalar(1.0) - (xx + zz), yz - wx, - xz - wy, yz + wx, btScalar(1.0) - (xx + yy)); - #endif - } - - - /** @brief Set the matrix from euler angles using YPR around YXZ respectively - * @param yaw Yaw about Y axis - * @param pitch Pitch about X axis - * @param roll Roll about Z axis - */ - void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { - setEulerZYX(roll, pitch, yaw); - } - - /** @brief Set the matrix from euler angles YPR around ZYX axes - * @param eulerX Roll about X axis - * @param eulerY Pitch around Y axis - * @param eulerZ Yaw aboud Z axis - * - * These angles are used to produce a rotation matrix. The euler - * angles are applied in ZYX order. I.e a vector is first rotated - * about X then Y and then Z - **/ - void setEulerZYX(btScalar eulerX,btScalar eulerY,btScalar eulerZ) { - ///@todo proposed to reverse this since it's labeled zyx but takes arguments xyz and it will match all other parts of the code - btScalar ci ( btCos(eulerX)); - btScalar cj ( btCos(eulerY)); - btScalar ch ( btCos(eulerZ)); - btScalar si ( btSin(eulerX)); - btScalar sj ( btSin(eulerY)); - btScalar sh ( btSin(eulerZ)); - btScalar cc = ci * ch; - btScalar cs = ci * sh; - btScalar sc = si * ch; - btScalar ss = si * sh; - - setValue(cj * ch, sj * sc - cs, sj * cc + ss, - cj * sh, sj * ss + cc, sj * cs - sc, - -sj, cj * si, cj * ci); - } - - /**@brief Set the matrix to the identity */ - void setIdentity() - { -#if (defined(BT_USE_SSE_IN_API)&& defined (BT_USE_SSE)) || defined(BT_USE_NEON) - m_el[0] = v1000; - m_el[1] = v0100; - m_el[2] = v0010; -#else - setValue(btScalar(1.0), btScalar(0.0), btScalar(0.0), - btScalar(0.0), btScalar(1.0), btScalar(0.0), - btScalar(0.0), btScalar(0.0), btScalar(1.0)); -#endif - } - - static const btMatrix3x3& getIdentity() - { -#if (defined(BT_USE_SSE_IN_API)&& defined (BT_USE_SSE)) || defined(BT_USE_NEON) - static const btMatrix3x3 - identityMatrix(v1000, v0100, v0010); -#else - static const btMatrix3x3 - identityMatrix( - btScalar(1.0), btScalar(0.0), btScalar(0.0), - btScalar(0.0), btScalar(1.0), btScalar(0.0), - btScalar(0.0), btScalar(0.0), btScalar(1.0)); -#endif - return identityMatrix; - } - - /**@brief Fill the rotational part of an OpenGL matrix and clear the shear/perspective - * @param m The array to be filled */ - void getOpenGLSubMatrix(btScalar *m) const - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 v0 = m_el[0].mVec128; - __m128 v1 = m_el[1].mVec128; - __m128 v2 = m_el[2].mVec128; // x2 y2 z2 w2 - __m128 *vm = (__m128 *)m; - __m128 vT; - - v2 = _mm_and_ps(v2, btvFFF0fMask); // x2 y2 z2 0 - - vT = _mm_unpackhi_ps(v0, v1); // z0 z1 * * - v0 = _mm_unpacklo_ps(v0, v1); // x0 x1 y0 y1 - - v1 = _mm_shuffle_ps(v0, v2, BT_SHUFFLE(2, 3, 1, 3) ); // y0 y1 y2 0 - v0 = _mm_shuffle_ps(v0, v2, BT_SHUFFLE(0, 1, 0, 3) ); // x0 x1 x2 0 - v2 = btCastdTo128f(_mm_move_sd(btCastfTo128d(v2), btCastfTo128d(vT))); // z0 z1 z2 0 - - vm[0] = v0; - vm[1] = v1; - vm[2] = v2; -#elif defined(BT_USE_NEON) - // note: zeros the w channel. We can preserve it at the cost of two more vtrn instructions. - static const uint32x2_t zMask = (const uint32x2_t) {-1, 0 }; - float32x4_t *vm = (float32x4_t *)m; - float32x4x2_t top = vtrnq_f32( m_el[0].mVec128, m_el[1].mVec128 ); // {x0 x1 z0 z1}, {y0 y1 w0 w1} - float32x2x2_t bl = vtrn_f32( vget_low_f32(m_el[2].mVec128), vdup_n_f32(0.0f) ); // {x2 0 }, {y2 0} - float32x4_t v0 = vcombine_f32( vget_low_f32(top.val[0]), bl.val[0] ); - float32x4_t v1 = vcombine_f32( vget_low_f32(top.val[1]), bl.val[1] ); - float32x2_t q = (float32x2_t) vand_u32( (uint32x2_t) vget_high_f32( m_el[2].mVec128), zMask ); - float32x4_t v2 = vcombine_f32( vget_high_f32(top.val[0]), q ); // z0 z1 z2 0 - - vm[0] = v0; - vm[1] = v1; - vm[2] = v2; -#else - m[0] = btScalar(m_el[0].x()); - m[1] = btScalar(m_el[1].x()); - m[2] = btScalar(m_el[2].x()); - m[3] = btScalar(0.0); - m[4] = btScalar(m_el[0].y()); - m[5] = btScalar(m_el[1].y()); - m[6] = btScalar(m_el[2].y()); - m[7] = btScalar(0.0); - m[8] = btScalar(m_el[0].z()); - m[9] = btScalar(m_el[1].z()); - m[10] = btScalar(m_el[2].z()); - m[11] = btScalar(0.0); -#endif - } - - /**@brief Get the matrix represented as a quaternion - * @param q The quaternion which will be set */ - void getRotation(btQuaternion& q) const - { -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON) - btScalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z(); - btScalar s, x; - - union { - btSimdFloat4 vec; - btScalar f[4]; - } temp; - - if (trace > btScalar(0.0)) - { - x = trace + btScalar(1.0); - - temp.f[0]=m_el[2].y() - m_el[1].z(); - temp.f[1]=m_el[0].z() - m_el[2].x(); - temp.f[2]=m_el[1].x() - m_el[0].y(); - temp.f[3]=x; - //temp.f[3]= s * btScalar(0.5); - } - else - { - int i, j, k; - if(m_el[0].x() < m_el[1].y()) - { - if( m_el[1].y() < m_el[2].z() ) - { i = 2; j = 0; k = 1; } - else - { i = 1; j = 2; k = 0; } - } - else - { - if( m_el[0].x() < m_el[2].z()) - { i = 2; j = 0; k = 1; } - else - { i = 0; j = 1; k = 2; } - } - - x = m_el[i][i] - m_el[j][j] - m_el[k][k] + btScalar(1.0); - - temp.f[3] = (m_el[k][j] - m_el[j][k]); - temp.f[j] = (m_el[j][i] + m_el[i][j]); - temp.f[k] = (m_el[k][i] + m_el[i][k]); - temp.f[i] = x; - //temp.f[i] = s * btScalar(0.5); - } - - s = btSqrt(x); - q.set128(temp.vec); - s = btScalar(0.5) / s; - - q *= s; -#else - btScalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z(); - - btScalar temp[4]; - - if (trace > btScalar(0.0)) - { - btScalar s = btSqrt(trace + btScalar(1.0)); - temp[3]=(s * btScalar(0.5)); - s = btScalar(0.5) / s; - - temp[0]=((m_el[2].y() - m_el[1].z()) * s); - temp[1]=((m_el[0].z() - m_el[2].x()) * s); - temp[2]=((m_el[1].x() - m_el[0].y()) * s); - } - else - { - int i = m_el[0].x() < m_el[1].y() ? - (m_el[1].y() < m_el[2].z() ? 2 : 1) : - (m_el[0].x() < m_el[2].z() ? 2 : 0); - int j = (i + 1) % 3; - int k = (i + 2) % 3; - - btScalar s = btSqrt(m_el[i][i] - m_el[j][j] - m_el[k][k] + btScalar(1.0)); - temp[i] = s * btScalar(0.5); - s = btScalar(0.5) / s; - - temp[3] = (m_el[k][j] - m_el[j][k]) * s; - temp[j] = (m_el[j][i] + m_el[i][j]) * s; - temp[k] = (m_el[k][i] + m_el[i][k]) * s; - } - q.setValue(temp[0],temp[1],temp[2],temp[3]); -#endif - } - - /**@brief Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR - * @param yaw Yaw around Y axis - * @param pitch Pitch around X axis - * @param roll around Z axis */ - void getEulerYPR(btScalar& yaw, btScalar& pitch, btScalar& roll) const - { - - // first use the normal calculus - yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x())); - pitch = btScalar(btAsin(-m_el[2].x())); - roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z())); - - // on pitch = +/-HalfPI - if (btFabs(pitch)==SIMD_HALF_PI) - { - if (yaw>0) - yaw-=SIMD_PI; - else - yaw+=SIMD_PI; - - if (roll>0) - roll-=SIMD_PI; - else - roll+=SIMD_PI; - } - }; - - - /**@brief Get the matrix represented as euler angles around ZYX - * @param yaw Yaw around X axis - * @param pitch Pitch around Y axis - * @param roll around X axis - * @param solution_number Which solution of two possible solutions ( 1 or 2) are possible values*/ - void getEulerZYX(btScalar& yaw, btScalar& pitch, btScalar& roll, unsigned int solution_number = 1) const - { - struct Euler - { - btScalar yaw; - btScalar pitch; - btScalar roll; - }; - - Euler euler_out; - Euler euler_out2; //second solution - //get the pointer to the raw data - - // Check that pitch is not at a singularity - if (btFabs(m_el[2].x()) >= 1) - { - euler_out.yaw = 0; - euler_out2.yaw = 0; - - // From difference of angles formula - btScalar delta = btAtan2(m_el[0].x(),m_el[0].z()); - if (m_el[2].x() > 0) //gimbal locked up - { - euler_out.pitch = SIMD_PI / btScalar(2.0); - euler_out2.pitch = SIMD_PI / btScalar(2.0); - euler_out.roll = euler_out.pitch + delta; - euler_out2.roll = euler_out.pitch + delta; - } - else // gimbal locked down - { - euler_out.pitch = -SIMD_PI / btScalar(2.0); - euler_out2.pitch = -SIMD_PI / btScalar(2.0); - euler_out.roll = -euler_out.pitch + delta; - euler_out2.roll = -euler_out.pitch + delta; - } - } - else - { - euler_out.pitch = - btAsin(m_el[2].x()); - euler_out2.pitch = SIMD_PI - euler_out.pitch; - - euler_out.roll = btAtan2(m_el[2].y()/btCos(euler_out.pitch), - m_el[2].z()/btCos(euler_out.pitch)); - euler_out2.roll = btAtan2(m_el[2].y()/btCos(euler_out2.pitch), - m_el[2].z()/btCos(euler_out2.pitch)); - - euler_out.yaw = btAtan2(m_el[1].x()/btCos(euler_out.pitch), - m_el[0].x()/btCos(euler_out.pitch)); - euler_out2.yaw = btAtan2(m_el[1].x()/btCos(euler_out2.pitch), - m_el[0].x()/btCos(euler_out2.pitch)); - } - - if (solution_number == 1) - { - yaw = euler_out.yaw; - pitch = euler_out.pitch; - roll = euler_out.roll; - } - else - { - yaw = euler_out2.yaw; - pitch = euler_out2.pitch; - roll = euler_out2.roll; - } - } - - /**@brief Create a scaled copy of the matrix - * @param s Scaling vector The elements of the vector will scale each column */ - - btMatrix3x3 scaled(const btVector3& s) const - { -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON) - return btMatrix3x3(m_el[0] * s, m_el[1] * s, m_el[2] * s); -#else - return btMatrix3x3( - m_el[0].x() * s.x(), m_el[0].y() * s.y(), m_el[0].z() * s.z(), - m_el[1].x() * s.x(), m_el[1].y() * s.y(), m_el[1].z() * s.z(), - m_el[2].x() * s.x(), m_el[2].y() * s.y(), m_el[2].z() * s.z()); -#endif - } - - /**@brief Return the determinant of the matrix */ - btScalar determinant() const; - /**@brief Return the adjoint of the matrix */ - btMatrix3x3 adjoint() const; - /**@brief Return the matrix with all values non negative */ - btMatrix3x3 absolute() const; - /**@brief Return the transpose of the matrix */ - btMatrix3x3 transpose() const; - /**@brief Return the inverse of the matrix */ - btMatrix3x3 inverse() const; - - btMatrix3x3 transposeTimes(const btMatrix3x3& m) const; - btMatrix3x3 timesTranspose(const btMatrix3x3& m) const; - - SIMD_FORCE_INLINE btScalar tdotx(const btVector3& v) const - { - return m_el[0].x() * v.x() + m_el[1].x() * v.y() + m_el[2].x() * v.z(); - } - SIMD_FORCE_INLINE btScalar tdoty(const btVector3& v) const - { - return m_el[0].y() * v.x() + m_el[1].y() * v.y() + m_el[2].y() * v.z(); - } - SIMD_FORCE_INLINE btScalar tdotz(const btVector3& v) const - { - return m_el[0].z() * v.x() + m_el[1].z() * v.y() + m_el[2].z() * v.z(); - } - - - /**@brief diagonalizes this matrix by the Jacobi method. - * @param rot stores the rotation from the coordinate system in which the matrix is diagonal to the original - * coordinate system, i.e., old_this = rot * new_this * rot^T. - * @param threshold See iteration - * @param iteration The iteration stops when all off-diagonal elements are less than the threshold multiplied - * by the sum of the absolute values of the diagonal, or when maxSteps have been executed. - * - * Note that this matrix is assumed to be symmetric. - */ - void diagonalize(btMatrix3x3& rot, btScalar threshold, int maxSteps) - { - rot.setIdentity(); - for (int step = maxSteps; step > 0; step--) - { - // find off-diagonal element [p][q] with largest magnitude - int p = 0; - int q = 1; - int r = 2; - btScalar max = btFabs(m_el[0][1]); - btScalar v = btFabs(m_el[0][2]); - if (v > max) - { - q = 2; - r = 1; - max = v; - } - v = btFabs(m_el[1][2]); - if (v > max) - { - p = 1; - q = 2; - r = 0; - max = v; - } - - btScalar t = threshold * (btFabs(m_el[0][0]) + btFabs(m_el[1][1]) + btFabs(m_el[2][2])); - if (max <= t) - { - if (max <= SIMD_EPSILON * t) - { - return; - } - step = 1; - } - - // compute Jacobi rotation J which leads to a zero for element [p][q] - btScalar mpq = m_el[p][q]; - btScalar theta = (m_el[q][q] - m_el[p][p]) / (2 * mpq); - btScalar theta2 = theta * theta; - btScalar cos; - btScalar sin; - if (theta2 * theta2 < btScalar(10 / SIMD_EPSILON)) - { - t = (theta >= 0) ? 1 / (theta + btSqrt(1 + theta2)) - : 1 / (theta - btSqrt(1 + theta2)); - cos = 1 / btSqrt(1 + t * t); - sin = cos * t; - } - else - { - // approximation for large theta-value, i.e., a nearly diagonal matrix - t = 1 / (theta * (2 + btScalar(0.5) / theta2)); - cos = 1 - btScalar(0.5) * t * t; - sin = cos * t; - } - - // apply rotation to matrix (this = J^T * this * J) - m_el[p][q] = m_el[q][p] = 0; - m_el[p][p] -= t * mpq; - m_el[q][q] += t * mpq; - btScalar mrp = m_el[r][p]; - btScalar mrq = m_el[r][q]; - m_el[r][p] = m_el[p][r] = cos * mrp - sin * mrq; - m_el[r][q] = m_el[q][r] = cos * mrq + sin * mrp; - - // apply rotation to rot (rot = rot * J) - for (int i = 0; i < 3; i++) - { - btVector3& row = rot[i]; - mrp = row[p]; - mrq = row[q]; - row[p] = cos * mrp - sin * mrq; - row[q] = cos * mrq + sin * mrp; - } - } - } - - - - - /**@brief Calculate the matrix cofactor - * @param r1 The first row to use for calculating the cofactor - * @param c1 The first column to use for calculating the cofactor - * @param r1 The second row to use for calculating the cofactor - * @param c1 The second column to use for calculating the cofactor - * See http://en.wikipedia.org/wiki/Cofactor_(linear_algebra) for more details - */ - btScalar cofac(int r1, int c1, int r2, int c2) const - { - return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1]; - } - - void serialize(struct btMatrix3x3Data& dataOut) const; - - void serializeFloat(struct btMatrix3x3FloatData& dataOut) const; - - void deSerialize(const struct btMatrix3x3Data& dataIn); - - void deSerializeFloat(const struct btMatrix3x3FloatData& dataIn); - - void deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn); - -}; - - -SIMD_FORCE_INLINE btMatrix3x3& -btMatrix3x3::operator*=(const btMatrix3x3& m) -{ -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 rv00, rv01, rv02; - __m128 rv10, rv11, rv12; - __m128 rv20, rv21, rv22; - __m128 mv0, mv1, mv2; - - rv02 = m_el[0].mVec128; - rv12 = m_el[1].mVec128; - rv22 = m_el[2].mVec128; - - mv0 = _mm_and_ps(m[0].mVec128, btvFFF0fMask); - mv1 = _mm_and_ps(m[1].mVec128, btvFFF0fMask); - mv2 = _mm_and_ps(m[2].mVec128, btvFFF0fMask); - - // rv0 - rv00 = bt_splat_ps(rv02, 0); - rv01 = bt_splat_ps(rv02, 1); - rv02 = bt_splat_ps(rv02, 2); - - rv00 = _mm_mul_ps(rv00, mv0); - rv01 = _mm_mul_ps(rv01, mv1); - rv02 = _mm_mul_ps(rv02, mv2); - - // rv1 - rv10 = bt_splat_ps(rv12, 0); - rv11 = bt_splat_ps(rv12, 1); - rv12 = bt_splat_ps(rv12, 2); - - rv10 = _mm_mul_ps(rv10, mv0); - rv11 = _mm_mul_ps(rv11, mv1); - rv12 = _mm_mul_ps(rv12, mv2); - - // rv2 - rv20 = bt_splat_ps(rv22, 0); - rv21 = bt_splat_ps(rv22, 1); - rv22 = bt_splat_ps(rv22, 2); - - rv20 = _mm_mul_ps(rv20, mv0); - rv21 = _mm_mul_ps(rv21, mv1); - rv22 = _mm_mul_ps(rv22, mv2); - - rv00 = _mm_add_ps(rv00, rv01); - rv10 = _mm_add_ps(rv10, rv11); - rv20 = _mm_add_ps(rv20, rv21); - - m_el[0].mVec128 = _mm_add_ps(rv00, rv02); - m_el[1].mVec128 = _mm_add_ps(rv10, rv12); - m_el[2].mVec128 = _mm_add_ps(rv20, rv22); - -#elif defined(BT_USE_NEON) - - float32x4_t rv0, rv1, rv2; - float32x4_t v0, v1, v2; - float32x4_t mv0, mv1, mv2; - - v0 = m_el[0].mVec128; - v1 = m_el[1].mVec128; - v2 = m_el[2].mVec128; - - mv0 = (float32x4_t) vandq_s32((int32x4_t)m[0].mVec128, btvFFF0Mask); - mv1 = (float32x4_t) vandq_s32((int32x4_t)m[1].mVec128, btvFFF0Mask); - mv2 = (float32x4_t) vandq_s32((int32x4_t)m[2].mVec128, btvFFF0Mask); - - rv0 = vmulq_lane_f32(mv0, vget_low_f32(v0), 0); - rv1 = vmulq_lane_f32(mv0, vget_low_f32(v1), 0); - rv2 = vmulq_lane_f32(mv0, vget_low_f32(v2), 0); - - rv0 = vmlaq_lane_f32(rv0, mv1, vget_low_f32(v0), 1); - rv1 = vmlaq_lane_f32(rv1, mv1, vget_low_f32(v1), 1); - rv2 = vmlaq_lane_f32(rv2, mv1, vget_low_f32(v2), 1); - - rv0 = vmlaq_lane_f32(rv0, mv2, vget_high_f32(v0), 0); - rv1 = vmlaq_lane_f32(rv1, mv2, vget_high_f32(v1), 0); - rv2 = vmlaq_lane_f32(rv2, mv2, vget_high_f32(v2), 0); - - m_el[0].mVec128 = rv0; - m_el[1].mVec128 = rv1; - m_el[2].mVec128 = rv2; -#else - setValue( - m.tdotx(m_el[0]), m.tdoty(m_el[0]), m.tdotz(m_el[0]), - m.tdotx(m_el[1]), m.tdoty(m_el[1]), m.tdotz(m_el[1]), - m.tdotx(m_el[2]), m.tdoty(m_el[2]), m.tdotz(m_el[2])); -#endif - return *this; -} - -SIMD_FORCE_INLINE btMatrix3x3& -btMatrix3x3::operator+=(const btMatrix3x3& m) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON) - m_el[0].mVec128 = m_el[0].mVec128 + m.m_el[0].mVec128; - m_el[1].mVec128 = m_el[1].mVec128 + m.m_el[1].mVec128; - m_el[2].mVec128 = m_el[2].mVec128 + m.m_el[2].mVec128; -#else - setValue( - m_el[0][0]+m.m_el[0][0], - m_el[0][1]+m.m_el[0][1], - m_el[0][2]+m.m_el[0][2], - m_el[1][0]+m.m_el[1][0], - m_el[1][1]+m.m_el[1][1], - m_el[1][2]+m.m_el[1][2], - m_el[2][0]+m.m_el[2][0], - m_el[2][1]+m.m_el[2][1], - m_el[2][2]+m.m_el[2][2]); -#endif - return *this; -} - -SIMD_FORCE_INLINE btMatrix3x3 -operator*(const btMatrix3x3& m, const btScalar & k) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - __m128 vk = bt_splat_ps(_mm_load_ss((float *)&k), 0x80); - return btMatrix3x3( - _mm_mul_ps(m[0].mVec128, vk), - _mm_mul_ps(m[1].mVec128, vk), - _mm_mul_ps(m[2].mVec128, vk)); -#elif defined(BT_USE_NEON) - return btMatrix3x3( - vmulq_n_f32(m[0].mVec128, k), - vmulq_n_f32(m[1].mVec128, k), - vmulq_n_f32(m[2].mVec128, k)); -#else - return btMatrix3x3( - m[0].x()*k,m[0].y()*k,m[0].z()*k, - m[1].x()*k,m[1].y()*k,m[1].z()*k, - m[2].x()*k,m[2].y()*k,m[2].z()*k); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -operator+(const btMatrix3x3& m1, const btMatrix3x3& m2) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON) - return btMatrix3x3( - m1[0].mVec128 + m2[0].mVec128, - m1[1].mVec128 + m2[1].mVec128, - m1[2].mVec128 + m2[2].mVec128); -#else - return btMatrix3x3( - m1[0][0]+m2[0][0], - m1[0][1]+m2[0][1], - m1[0][2]+m2[0][2], - - m1[1][0]+m2[1][0], - m1[1][1]+m2[1][1], - m1[1][2]+m2[1][2], - - m1[2][0]+m2[2][0], - m1[2][1]+m2[2][1], - m1[2][2]+m2[2][2]); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -operator-(const btMatrix3x3& m1, const btMatrix3x3& m2) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON) - return btMatrix3x3( - m1[0].mVec128 - m2[0].mVec128, - m1[1].mVec128 - m2[1].mVec128, - m1[2].mVec128 - m2[2].mVec128); -#else - return btMatrix3x3( - m1[0][0]-m2[0][0], - m1[0][1]-m2[0][1], - m1[0][2]-m2[0][2], - - m1[1][0]-m2[1][0], - m1[1][1]-m2[1][1], - m1[1][2]-m2[1][2], - - m1[2][0]-m2[2][0], - m1[2][1]-m2[2][1], - m1[2][2]-m2[2][2]); -#endif -} - - -SIMD_FORCE_INLINE btMatrix3x3& -btMatrix3x3::operator-=(const btMatrix3x3& m) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON) - m_el[0].mVec128 = m_el[0].mVec128 - m.m_el[0].mVec128; - m_el[1].mVec128 = m_el[1].mVec128 - m.m_el[1].mVec128; - m_el[2].mVec128 = m_el[2].mVec128 - m.m_el[2].mVec128; -#else - setValue( - m_el[0][0]-m.m_el[0][0], - m_el[0][1]-m.m_el[0][1], - m_el[0][2]-m.m_el[0][2], - m_el[1][0]-m.m_el[1][0], - m_el[1][1]-m.m_el[1][1], - m_el[1][2]-m.m_el[1][2], - m_el[2][0]-m.m_el[2][0], - m_el[2][1]-m.m_el[2][1], - m_el[2][2]-m.m_el[2][2]); -#endif - return *this; -} - - -SIMD_FORCE_INLINE btScalar -btMatrix3x3::determinant() const -{ - return btTriple((*this)[0], (*this)[1], (*this)[2]); -} - - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::absolute() const -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - return btMatrix3x3( - _mm_and_ps(m_el[0].mVec128, btvAbsfMask), - _mm_and_ps(m_el[1].mVec128, btvAbsfMask), - _mm_and_ps(m_el[2].mVec128, btvAbsfMask)); -#elif defined(BT_USE_NEON) - return btMatrix3x3( - (float32x4_t)vandq_s32((int32x4_t)m_el[0].mVec128, btv3AbsMask), - (float32x4_t)vandq_s32((int32x4_t)m_el[1].mVec128, btv3AbsMask), - (float32x4_t)vandq_s32((int32x4_t)m_el[2].mVec128, btv3AbsMask)); -#else - return btMatrix3x3( - btFabs(m_el[0].x()), btFabs(m_el[0].y()), btFabs(m_el[0].z()), - btFabs(m_el[1].x()), btFabs(m_el[1].y()), btFabs(m_el[1].z()), - btFabs(m_el[2].x()), btFabs(m_el[2].y()), btFabs(m_el[2].z())); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::transpose() const -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - __m128 v0 = m_el[0].mVec128; - __m128 v1 = m_el[1].mVec128; - __m128 v2 = m_el[2].mVec128; // x2 y2 z2 w2 - __m128 vT; - - v2 = _mm_and_ps(v2, btvFFF0fMask); // x2 y2 z2 0 - - vT = _mm_unpackhi_ps(v0, v1); // z0 z1 * * - v0 = _mm_unpacklo_ps(v0, v1); // x0 x1 y0 y1 - - v1 = _mm_shuffle_ps(v0, v2, BT_SHUFFLE(2, 3, 1, 3) ); // y0 y1 y2 0 - v0 = _mm_shuffle_ps(v0, v2, BT_SHUFFLE(0, 1, 0, 3) ); // x0 x1 x2 0 - v2 = btCastdTo128f(_mm_move_sd(btCastfTo128d(v2), btCastfTo128d(vT))); // z0 z1 z2 0 - - - return btMatrix3x3( v0, v1, v2 ); -#elif defined(BT_USE_NEON) - // note: zeros the w channel. We can preserve it at the cost of two more vtrn instructions. - static const uint32x2_t zMask = (const uint32x2_t) {-1, 0 }; - float32x4x2_t top = vtrnq_f32( m_el[0].mVec128, m_el[1].mVec128 ); // {x0 x1 z0 z1}, {y0 y1 w0 w1} - float32x2x2_t bl = vtrn_f32( vget_low_f32(m_el[2].mVec128), vdup_n_f32(0.0f) ); // {x2 0 }, {y2 0} - float32x4_t v0 = vcombine_f32( vget_low_f32(top.val[0]), bl.val[0] ); - float32x4_t v1 = vcombine_f32( vget_low_f32(top.val[1]), bl.val[1] ); - float32x2_t q = (float32x2_t) vand_u32( (uint32x2_t) vget_high_f32( m_el[2].mVec128), zMask ); - float32x4_t v2 = vcombine_f32( vget_high_f32(top.val[0]), q ); // z0 z1 z2 0 - return btMatrix3x3( v0, v1, v2 ); -#else - return btMatrix3x3( m_el[0].x(), m_el[1].x(), m_el[2].x(), - m_el[0].y(), m_el[1].y(), m_el[2].y(), - m_el[0].z(), m_el[1].z(), m_el[2].z()); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::adjoint() const -{ - return btMatrix3x3(cofac(1, 1, 2, 2), cofac(0, 2, 2, 1), cofac(0, 1, 1, 2), - cofac(1, 2, 2, 0), cofac(0, 0, 2, 2), cofac(0, 2, 1, 0), - cofac(1, 0, 2, 1), cofac(0, 1, 2, 0), cofac(0, 0, 1, 1)); -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::inverse() const -{ - btVector3 co(cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1)); - btScalar det = (*this)[0].dot(co); - btFullAssert(det != btScalar(0.0)); - btScalar s = btScalar(1.0) / det; - return btMatrix3x3(co.x() * s, cofac(0, 2, 2, 1) * s, cofac(0, 1, 1, 2) * s, - co.y() * s, cofac(0, 0, 2, 2) * s, cofac(0, 2, 1, 0) * s, - co.z() * s, cofac(0, 1, 2, 0) * s, cofac(0, 0, 1, 1) * s); -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::transposeTimes(const btMatrix3x3& m) const -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - // zeros w -// static const __m128i xyzMask = (const __m128i){ -1ULL, 0xffffffffULL }; - __m128 row = m_el[0].mVec128; - __m128 m0 = _mm_and_ps( m.getRow(0).mVec128, btvFFF0fMask ); - __m128 m1 = _mm_and_ps( m.getRow(1).mVec128, btvFFF0fMask); - __m128 m2 = _mm_and_ps( m.getRow(2).mVec128, btvFFF0fMask ); - __m128 r0 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0)); - __m128 r1 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0x55)); - __m128 r2 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0xaa)); - row = m_el[1].mVec128; - r0 = _mm_add_ps( r0, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0))); - r1 = _mm_add_ps( r1, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0x55))); - r2 = _mm_add_ps( r2, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0xaa))); - row = m_el[2].mVec128; - r0 = _mm_add_ps( r0, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0))); - r1 = _mm_add_ps( r1, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0x55))); - r2 = _mm_add_ps( r2, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0xaa))); - return btMatrix3x3( r0, r1, r2 ); - -#elif defined BT_USE_NEON - // zeros w - static const uint32x4_t xyzMask = (const uint32x4_t){ -1, -1, -1, 0 }; - float32x4_t m0 = (float32x4_t) vandq_u32( (uint32x4_t) m.getRow(0).mVec128, xyzMask ); - float32x4_t m1 = (float32x4_t) vandq_u32( (uint32x4_t) m.getRow(1).mVec128, xyzMask ); - float32x4_t m2 = (float32x4_t) vandq_u32( (uint32x4_t) m.getRow(2).mVec128, xyzMask ); - float32x4_t row = m_el[0].mVec128; - float32x4_t r0 = vmulq_lane_f32( m0, vget_low_f32(row), 0); - float32x4_t r1 = vmulq_lane_f32( m0, vget_low_f32(row), 1); - float32x4_t r2 = vmulq_lane_f32( m0, vget_high_f32(row), 0); - row = m_el[1].mVec128; - r0 = vmlaq_lane_f32( r0, m1, vget_low_f32(row), 0); - r1 = vmlaq_lane_f32( r1, m1, vget_low_f32(row), 1); - r2 = vmlaq_lane_f32( r2, m1, vget_high_f32(row), 0); - row = m_el[2].mVec128; - r0 = vmlaq_lane_f32( r0, m2, vget_low_f32(row), 0); - r1 = vmlaq_lane_f32( r1, m2, vget_low_f32(row), 1); - r2 = vmlaq_lane_f32( r2, m2, vget_high_f32(row), 0); - return btMatrix3x3( r0, r1, r2 ); -#else - return btMatrix3x3( - m_el[0].x() * m[0].x() + m_el[1].x() * m[1].x() + m_el[2].x() * m[2].x(), - m_el[0].x() * m[0].y() + m_el[1].x() * m[1].y() + m_el[2].x() * m[2].y(), - m_el[0].x() * m[0].z() + m_el[1].x() * m[1].z() + m_el[2].x() * m[2].z(), - m_el[0].y() * m[0].x() + m_el[1].y() * m[1].x() + m_el[2].y() * m[2].x(), - m_el[0].y() * m[0].y() + m_el[1].y() * m[1].y() + m_el[2].y() * m[2].y(), - m_el[0].y() * m[0].z() + m_el[1].y() * m[1].z() + m_el[2].y() * m[2].z(), - m_el[0].z() * m[0].x() + m_el[1].z() * m[1].x() + m_el[2].z() * m[2].x(), - m_el[0].z() * m[0].y() + m_el[1].z() * m[1].y() + m_el[2].z() * m[2].y(), - m_el[0].z() * m[0].z() + m_el[1].z() * m[1].z() + m_el[2].z() * m[2].z()); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::timesTranspose(const btMatrix3x3& m) const -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - __m128 a0 = m_el[0].mVec128; - __m128 a1 = m_el[1].mVec128; - __m128 a2 = m_el[2].mVec128; - - btMatrix3x3 mT = m.transpose(); // we rely on transpose() zeroing w channel so that we don't have to do it here - __m128 mx = mT[0].mVec128; - __m128 my = mT[1].mVec128; - __m128 mz = mT[2].mVec128; - - __m128 r0 = _mm_mul_ps(mx, _mm_shuffle_ps(a0, a0, 0x00)); - __m128 r1 = _mm_mul_ps(mx, _mm_shuffle_ps(a1, a1, 0x00)); - __m128 r2 = _mm_mul_ps(mx, _mm_shuffle_ps(a2, a2, 0x00)); - r0 = _mm_add_ps(r0, _mm_mul_ps(my, _mm_shuffle_ps(a0, a0, 0x55))); - r1 = _mm_add_ps(r1, _mm_mul_ps(my, _mm_shuffle_ps(a1, a1, 0x55))); - r2 = _mm_add_ps(r2, _mm_mul_ps(my, _mm_shuffle_ps(a2, a2, 0x55))); - r0 = _mm_add_ps(r0, _mm_mul_ps(mz, _mm_shuffle_ps(a0, a0, 0xaa))); - r1 = _mm_add_ps(r1, _mm_mul_ps(mz, _mm_shuffle_ps(a1, a1, 0xaa))); - r2 = _mm_add_ps(r2, _mm_mul_ps(mz, _mm_shuffle_ps(a2, a2, 0xaa))); - return btMatrix3x3( r0, r1, r2); - -#elif defined BT_USE_NEON - float32x4_t a0 = m_el[0].mVec128; - float32x4_t a1 = m_el[1].mVec128; - float32x4_t a2 = m_el[2].mVec128; - - btMatrix3x3 mT = m.transpose(); // we rely on transpose() zeroing w channel so that we don't have to do it here - float32x4_t mx = mT[0].mVec128; - float32x4_t my = mT[1].mVec128; - float32x4_t mz = mT[2].mVec128; - - float32x4_t r0 = vmulq_lane_f32( mx, vget_low_f32(a0), 0); - float32x4_t r1 = vmulq_lane_f32( mx, vget_low_f32(a1), 0); - float32x4_t r2 = vmulq_lane_f32( mx, vget_low_f32(a2), 0); - r0 = vmlaq_lane_f32( r0, my, vget_low_f32(a0), 1); - r1 = vmlaq_lane_f32( r1, my, vget_low_f32(a1), 1); - r2 = vmlaq_lane_f32( r2, my, vget_low_f32(a2), 1); - r0 = vmlaq_lane_f32( r0, mz, vget_high_f32(a0), 0); - r1 = vmlaq_lane_f32( r1, mz, vget_high_f32(a1), 0); - r2 = vmlaq_lane_f32( r2, mz, vget_high_f32(a2), 0); - return btMatrix3x3( r0, r1, r2 ); - -#else - return btMatrix3x3( - m_el[0].dot(m[0]), m_el[0].dot(m[1]), m_el[0].dot(m[2]), - m_el[1].dot(m[0]), m_el[1].dot(m[1]), m_el[1].dot(m[2]), - m_el[2].dot(m[0]), m_el[2].dot(m[1]), m_el[2].dot(m[2])); -#endif -} - -SIMD_FORCE_INLINE btVector3 -operator*(const btMatrix3x3& m, const btVector3& v) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON) - return v.dot3(m[0], m[1], m[2]); -#else - return btVector3(m[0].dot(v), m[1].dot(v), m[2].dot(v)); -#endif -} - - -SIMD_FORCE_INLINE btVector3 -operator*(const btVector3& v, const btMatrix3x3& m) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - - const __m128 vv = v.mVec128; - - __m128 c0 = bt_splat_ps( vv, 0); - __m128 c1 = bt_splat_ps( vv, 1); - __m128 c2 = bt_splat_ps( vv, 2); - - c0 = _mm_mul_ps(c0, _mm_and_ps(m[0].mVec128, btvFFF0fMask) ); - c1 = _mm_mul_ps(c1, _mm_and_ps(m[1].mVec128, btvFFF0fMask) ); - c0 = _mm_add_ps(c0, c1); - c2 = _mm_mul_ps(c2, _mm_and_ps(m[2].mVec128, btvFFF0fMask) ); - - return btVector3(_mm_add_ps(c0, c2)); -#elif defined(BT_USE_NEON) - const float32x4_t vv = v.mVec128; - const float32x2_t vlo = vget_low_f32(vv); - const float32x2_t vhi = vget_high_f32(vv); - - float32x4_t c0, c1, c2; - - c0 = (float32x4_t) vandq_s32((int32x4_t)m[0].mVec128, btvFFF0Mask); - c1 = (float32x4_t) vandq_s32((int32x4_t)m[1].mVec128, btvFFF0Mask); - c2 = (float32x4_t) vandq_s32((int32x4_t)m[2].mVec128, btvFFF0Mask); - - c0 = vmulq_lane_f32(c0, vlo, 0); - c1 = vmulq_lane_f32(c1, vlo, 1); - c2 = vmulq_lane_f32(c2, vhi, 0); - c0 = vaddq_f32(c0, c1); - c0 = vaddq_f32(c0, c2); - - return btVector3(c0); -#else - return btVector3(m.tdotx(v), m.tdoty(v), m.tdotz(v)); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -operator*(const btMatrix3x3& m1, const btMatrix3x3& m2) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - - __m128 m10 = m1[0].mVec128; - __m128 m11 = m1[1].mVec128; - __m128 m12 = m1[2].mVec128; - - __m128 m2v = _mm_and_ps(m2[0].mVec128, btvFFF0fMask); - - __m128 c0 = bt_splat_ps( m10, 0); - __m128 c1 = bt_splat_ps( m11, 0); - __m128 c2 = bt_splat_ps( m12, 0); - - c0 = _mm_mul_ps(c0, m2v); - c1 = _mm_mul_ps(c1, m2v); - c2 = _mm_mul_ps(c2, m2v); - - m2v = _mm_and_ps(m2[1].mVec128, btvFFF0fMask); - - __m128 c0_1 = bt_splat_ps( m10, 1); - __m128 c1_1 = bt_splat_ps( m11, 1); - __m128 c2_1 = bt_splat_ps( m12, 1); - - c0_1 = _mm_mul_ps(c0_1, m2v); - c1_1 = _mm_mul_ps(c1_1, m2v); - c2_1 = _mm_mul_ps(c2_1, m2v); - - m2v = _mm_and_ps(m2[2].mVec128, btvFFF0fMask); - - c0 = _mm_add_ps(c0, c0_1); - c1 = _mm_add_ps(c1, c1_1); - c2 = _mm_add_ps(c2, c2_1); - - m10 = bt_splat_ps( m10, 2); - m11 = bt_splat_ps( m11, 2); - m12 = bt_splat_ps( m12, 2); - - m10 = _mm_mul_ps(m10, m2v); - m11 = _mm_mul_ps(m11, m2v); - m12 = _mm_mul_ps(m12, m2v); - - c0 = _mm_add_ps(c0, m10); - c1 = _mm_add_ps(c1, m11); - c2 = _mm_add_ps(c2, m12); - - return btMatrix3x3(c0, c1, c2); - -#elif defined(BT_USE_NEON) - - float32x4_t rv0, rv1, rv2; - float32x4_t v0, v1, v2; - float32x4_t mv0, mv1, mv2; - - v0 = m1[0].mVec128; - v1 = m1[1].mVec128; - v2 = m1[2].mVec128; - - mv0 = (float32x4_t) vandq_s32((int32x4_t)m2[0].mVec128, btvFFF0Mask); - mv1 = (float32x4_t) vandq_s32((int32x4_t)m2[1].mVec128, btvFFF0Mask); - mv2 = (float32x4_t) vandq_s32((int32x4_t)m2[2].mVec128, btvFFF0Mask); - - rv0 = vmulq_lane_f32(mv0, vget_low_f32(v0), 0); - rv1 = vmulq_lane_f32(mv0, vget_low_f32(v1), 0); - rv2 = vmulq_lane_f32(mv0, vget_low_f32(v2), 0); - - rv0 = vmlaq_lane_f32(rv0, mv1, vget_low_f32(v0), 1); - rv1 = vmlaq_lane_f32(rv1, mv1, vget_low_f32(v1), 1); - rv2 = vmlaq_lane_f32(rv2, mv1, vget_low_f32(v2), 1); - - rv0 = vmlaq_lane_f32(rv0, mv2, vget_high_f32(v0), 0); - rv1 = vmlaq_lane_f32(rv1, mv2, vget_high_f32(v1), 0); - rv2 = vmlaq_lane_f32(rv2, mv2, vget_high_f32(v2), 0); - - return btMatrix3x3(rv0, rv1, rv2); - -#else - return btMatrix3x3( - m2.tdotx( m1[0]), m2.tdoty( m1[0]), m2.tdotz( m1[0]), - m2.tdotx( m1[1]), m2.tdoty( m1[1]), m2.tdotz( m1[1]), - m2.tdotx( m1[2]), m2.tdoty( m1[2]), m2.tdotz( m1[2])); -#endif -} - -/* -SIMD_FORCE_INLINE btMatrix3x3 btMultTransposeLeft(const btMatrix3x3& m1, const btMatrix3x3& m2) { -return btMatrix3x3( -m1[0][0] * m2[0][0] + m1[1][0] * m2[1][0] + m1[2][0] * m2[2][0], -m1[0][0] * m2[0][1] + m1[1][0] * m2[1][1] + m1[2][0] * m2[2][1], -m1[0][0] * m2[0][2] + m1[1][0] * m2[1][2] + m1[2][0] * m2[2][2], -m1[0][1] * m2[0][0] + m1[1][1] * m2[1][0] + m1[2][1] * m2[2][0], -m1[0][1] * m2[0][1] + m1[1][1] * m2[1][1] + m1[2][1] * m2[2][1], -m1[0][1] * m2[0][2] + m1[1][1] * m2[1][2] + m1[2][1] * m2[2][2], -m1[0][2] * m2[0][0] + m1[1][2] * m2[1][0] + m1[2][2] * m2[2][0], -m1[0][2] * m2[0][1] + m1[1][2] * m2[1][1] + m1[2][2] * m2[2][1], -m1[0][2] * m2[0][2] + m1[1][2] * m2[1][2] + m1[2][2] * m2[2][2]); -} -*/ - -/**@brief Equality operator between two matrices -* It will test all elements are equal. */ -SIMD_FORCE_INLINE bool operator==(const btMatrix3x3& m1, const btMatrix3x3& m2) -{ -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - - __m128 c0, c1, c2; - - c0 = _mm_cmpeq_ps(m1[0].mVec128, m2[0].mVec128); - c1 = _mm_cmpeq_ps(m1[1].mVec128, m2[1].mVec128); - c2 = _mm_cmpeq_ps(m1[2].mVec128, m2[2].mVec128); - - c0 = _mm_and_ps(c0, c1); - c0 = _mm_and_ps(c0, c2); - - return (0x7 == _mm_movemask_ps((__m128)c0)); -#else - return - ( m1[0][0] == m2[0][0] && m1[1][0] == m2[1][0] && m1[2][0] == m2[2][0] && - m1[0][1] == m2[0][1] && m1[1][1] == m2[1][1] && m1[2][1] == m2[2][1] && - m1[0][2] == m2[0][2] && m1[1][2] == m2[1][2] && m1[2][2] == m2[2][2] ); -#endif -} - -///for serialization -struct btMatrix3x3FloatData -{ - btVector3FloatData m_el[3]; -}; - -///for serialization -struct btMatrix3x3DoubleData -{ - btVector3DoubleData m_el[3]; -}; - - - - -SIMD_FORCE_INLINE void btMatrix3x3::serialize(struct btMatrix3x3Data& dataOut) const -{ - for (int i=0;i<3;i++) - m_el[i].serialize(dataOut.m_el[i]); -} - -SIMD_FORCE_INLINE void btMatrix3x3::serializeFloat(struct btMatrix3x3FloatData& dataOut) const -{ - for (int i=0;i<3;i++) - m_el[i].serializeFloat(dataOut.m_el[i]); -} - - -SIMD_FORCE_INLINE void btMatrix3x3::deSerialize(const struct btMatrix3x3Data& dataIn) -{ - for (int i=0;i<3;i++) - m_el[i].deSerialize(dataIn.m_el[i]); -} - -SIMD_FORCE_INLINE void btMatrix3x3::deSerializeFloat(const struct btMatrix3x3FloatData& dataIn) -{ - for (int i=0;i<3;i++) - m_el[i].deSerializeFloat(dataIn.m_el[i]); -} - -SIMD_FORCE_INLINE void btMatrix3x3::deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn) -{ - for (int i=0;i<3;i++) - m_el[i].deSerializeDouble(dataIn.m_el[i]); -} - -#endif //BT_MATRIX3x3_H - diff --git a/opencl/parallel_primitives/host/btMinMax.h b/opencl/parallel_primitives/host/btMinMax.h deleted file mode 100644 index 5b436e9ba..000000000 --- a/opencl/parallel_primitives/host/btMinMax.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef BT_GEN_MINMAX_H -#define BT_GEN_MINMAX_H - -#include "btScalar.h" - -template -SIMD_FORCE_INLINE const T& btMin(const T& a, const T& b) -{ - return a < b ? a : b ; -} - -template -SIMD_FORCE_INLINE const T& btMax(const T& a, const T& b) -{ - return a > b ? a : b; -} - -template -SIMD_FORCE_INLINE const T& btClamped(const T& a, const T& lb, const T& ub) -{ - return a < lb ? lb : (ub < a ? ub : a); -} - -template -SIMD_FORCE_INLINE void btSetMin(T& a, const T& b) -{ - if (b < a) - { - a = b; - } -} - -template -SIMD_FORCE_INLINE void btSetMax(T& a, const T& b) -{ - if (a < b) - { - a = b; - } -} - -template -SIMD_FORCE_INLINE void btClamp(T& a, const T& lb, const T& ub) -{ - if (a < lb) - { - a = lb; - } - else if (ub < a) - { - a = ub; - } -} - -#endif //BT_GEN_MINMAX_H diff --git a/opencl/parallel_primitives/host/btMotionState.h b/opencl/parallel_primitives/host/btMotionState.h deleted file mode 100644 index 943181409..000000000 --- a/opencl/parallel_primitives/host/btMotionState.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BT_MOTIONSTATE_H -#define BT_MOTIONSTATE_H - -#include "btTransform.h" - -///The btMotionState interface class allows the dynamics world to synchronize and interpolate the updated world transforms with graphics -///For optimizations, potentially only moving objects get synchronized (using setWorldPosition/setWorldOrientation) -class btMotionState -{ - public: - - virtual ~btMotionState() - { - - } - - virtual void getWorldTransform(btTransform& worldTrans ) const =0; - - //Bullet only calls the update of worldtransform for active objects - virtual void setWorldTransform(const btTransform& worldTrans)=0; - - -}; - -#endif //BT_MOTIONSTATE_H diff --git a/opencl/parallel_primitives/host/btOpenCLArray.h b/opencl/parallel_primitives/host/btOpenCLArray.h index 91e88e9ed..02db9dc84 100644 --- a/opencl/parallel_primitives/host/btOpenCLArray.h +++ b/opencl/parallel_primitives/host/btOpenCLArray.h @@ -1,7 +1,7 @@ #ifndef BT_OPENCL_ARRAY_H #define BT_OPENCL_ARRAY_H -#include "btAlignedObjectArray.h" +#include "BulletCommon/btAlignedObjectArray.h" #include "../../basic_initialize/btOpenCLInclude.h" template diff --git a/opencl/parallel_primitives/host/btPolarDecomposition.cpp b/opencl/parallel_primitives/host/btPolarDecomposition.cpp deleted file mode 100644 index d7de20408..000000000 --- a/opencl/parallel_primitives/host/btPolarDecomposition.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "btPolarDecomposition.h" -#include "btMinMax.h" - -namespace -{ - btScalar abs_column_sum(const btMatrix3x3& a, int i) - { - return btFabs(a[0][i]) + btFabs(a[1][i]) + btFabs(a[2][i]); - } - - btScalar abs_row_sum(const btMatrix3x3& a, int i) - { - return btFabs(a[i][0]) + btFabs(a[i][1]) + btFabs(a[i][2]); - } - - btScalar p1_norm(const btMatrix3x3& a) - { - const btScalar sum0 = abs_column_sum(a,0); - const btScalar sum1 = abs_column_sum(a,1); - const btScalar sum2 = abs_column_sum(a,2); - return btMax(btMax(sum0, sum1), sum2); - } - - btScalar pinf_norm(const btMatrix3x3& a) - { - const btScalar sum0 = abs_row_sum(a,0); - const btScalar sum1 = abs_row_sum(a,1); - const btScalar sum2 = abs_row_sum(a,2); - return btMax(btMax(sum0, sum1), sum2); - } -} - -const btScalar btPolarDecomposition::DEFAULT_TOLERANCE = btScalar(0.0001); -const unsigned int btPolarDecomposition::DEFAULT_MAX_ITERATIONS = 16; - -btPolarDecomposition::btPolarDecomposition(btScalar tolerance, unsigned int maxIterations) -: m_tolerance(tolerance) -, m_maxIterations(maxIterations) -{ -} - -unsigned int btPolarDecomposition::decompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h) const -{ - // Use the 'u' and 'h' matrices for intermediate calculations - u = a; - h = a.inverse(); - - for (unsigned int i = 0; i < m_maxIterations; ++i) - { - const btScalar h_1 = p1_norm(h); - const btScalar h_inf = pinf_norm(h); - const btScalar u_1 = p1_norm(u); - const btScalar u_inf = pinf_norm(u); - - const btScalar h_norm = h_1 * h_inf; - const btScalar u_norm = u_1 * u_inf; - - // The matrix is effectively singular so we cannot invert it - if (btFuzzyZero(h_norm) || btFuzzyZero(u_norm)) - break; - - const btScalar gamma = btPow(h_norm / u_norm, 0.25f); - const btScalar inv_gamma = 1.0 / gamma; - - // Determine the delta to 'u' - const btMatrix3x3 delta = (u * (gamma - 2.0) + h.transpose() * inv_gamma) * 0.5; - - // Update the matrices - u += delta; - h = u.inverse(); - - // Check for convergence - if (p1_norm(delta) <= m_tolerance * u_1) - { - h = u.transpose() * a; - h = (h + h.transpose()) * 0.5; - return i; - } - } - - // The algorithm has failed to converge to the specified tolerance, but we - // want to make sure that the matrices returned are in the right form. - h = u.transpose() * a; - h = (h + h.transpose()) * 0.5; - - return m_maxIterations; -} - -unsigned int btPolarDecomposition::maxIterations() const -{ - return m_maxIterations; -} - -unsigned int polarDecompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h) -{ - static btPolarDecomposition polar; - return polar.decompose(a, u, h); -} - diff --git a/opencl/parallel_primitives/host/btPolarDecomposition.h b/opencl/parallel_primitives/host/btPolarDecomposition.h deleted file mode 100644 index 561566764..000000000 --- a/opencl/parallel_primitives/host/btPolarDecomposition.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef POLARDECOMPOSITION_H -#define POLARDECOMPOSITION_H - -#include "btMatrix3x3.h" - -/** - * This class is used to compute the polar decomposition of a matrix. In - * general, the polar decomposition factorizes a matrix, A, into two parts: a - * unitary matrix (U) and a positive, semi-definite Hermitian matrix (H). - * However, in this particular implementation the original matrix, A, is - * required to be a square 3x3 matrix with real elements. This means that U will - * be an orthogonal matrix and H with be a positive-definite, symmetric matrix. - */ -class btPolarDecomposition -{ - public: - static const btScalar DEFAULT_TOLERANCE; - static const unsigned int DEFAULT_MAX_ITERATIONS; - - /** - * Creates an instance with optional parameters. - * - * @param tolerance - the tolerance used to determine convergence of the - * algorithm - * @param maxIterations - the maximum number of iterations used to achieve - * convergence - */ - btPolarDecomposition(btScalar tolerance = DEFAULT_TOLERANCE, - unsigned int maxIterations = DEFAULT_MAX_ITERATIONS); - - /** - * Decomposes a matrix into orthogonal and symmetric, positive-definite - * parts. If the number of iterations returned by this function is equal to - * the maximum number of iterations, the algorithm has failed to converge. - * - * @param a - the original matrix - * @param u - the resulting orthogonal matrix - * @param h - the resulting symmetric matrix - * - * @return the number of iterations performed by the algorithm. - */ - unsigned int decompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h) const; - - /** - * Returns the maximum number of iterations that this algorithm will perform - * to achieve convergence. - * - * @return maximum number of iterations - */ - unsigned int maxIterations() const; - - private: - btScalar m_tolerance; - unsigned int m_maxIterations; -}; - -/** - * This functions decomposes the matrix 'a' into two parts: an orthogonal matrix - * 'u' and a symmetric, positive-definite matrix 'h'. If the number of - * iterations returned by this function is equal to - * btPolarDecomposition::DEFAULT_MAX_ITERATIONS, the algorithm has failed to - * converge. - * - * @param a - the original matrix - * @param u - the resulting orthogonal matrix - * @param h - the resulting symmetric matrix - * - * @return the number of iterations performed by the algorithm. - */ -unsigned int polarDecompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h); - -#endif // POLARDECOMPOSITION_H - diff --git a/opencl/parallel_primitives/host/btPoolAllocator.h b/opencl/parallel_primitives/host/btPoolAllocator.h deleted file mode 100644 index ef2084537..000000000 --- a/opencl/parallel_primitives/host/btPoolAllocator.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef _BT_POOL_ALLOCATOR_H -#define _BT_POOL_ALLOCATOR_H - -#include "btScalar.h" -#include "btAlignedAllocator.h" - -///The btPoolAllocator class allows to efficiently allocate a large pool of objects, instead of dynamically allocating them separately. -class btPoolAllocator -{ - int m_elemSize; - int m_maxElements; - int m_freeCount; - void* m_firstFree; - unsigned char* m_pool; - -public: - - btPoolAllocator(int elemSize, int maxElements) - :m_elemSize(elemSize), - m_maxElements(maxElements) - { - m_pool = (unsigned char*) btAlignedAlloc( static_cast(m_elemSize*m_maxElements),16); - - unsigned char* p = m_pool; - m_firstFree = p; - m_freeCount = m_maxElements; - int count = m_maxElements; - while (--count) { - *(void**)p = (p + m_elemSize); - p += m_elemSize; - } - *(void**)p = 0; - } - - ~btPoolAllocator() - { - btAlignedFree( m_pool); - } - - int getFreeCount() const - { - return m_freeCount; - } - - int getUsedCount() const - { - return m_maxElements - m_freeCount; - } - - int getMaxCount() const - { - return m_maxElements; - } - - void* allocate(int size) - { - // release mode fix - (void)size; - btAssert(!size || size<=m_elemSize); - btAssert(m_freeCount>0); - void* result = m_firstFree; - m_firstFree = *(void**)m_firstFree; - --m_freeCount; - return result; - } - - bool validPtr(void* ptr) - { - if (ptr) { - if (((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize)) - { - return true; - } - } - return false; - } - - void freeMemory(void* ptr) - { - if (ptr) { - btAssert((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize); - - *(void**)ptr = m_firstFree; - m_firstFree = ptr; - ++m_freeCount; - } - } - - int getElementSize() const - { - return m_elemSize; - } - - unsigned char* getPoolAddress() - { - return m_pool; - } - - const unsigned char* getPoolAddress() const - { - return m_pool; - } - -}; - -#endif //_BT_POOL_ALLOCATOR_H diff --git a/opencl/parallel_primitives/host/btPrefixScanCL.h b/opencl/parallel_primitives/host/btPrefixScanCL.h index a7dbf4f5e..b830ddb23 100644 --- a/opencl/parallel_primitives/host/btPrefixScanCL.h +++ b/opencl/parallel_primitives/host/btPrefixScanCL.h @@ -4,7 +4,7 @@ #include "btOpenCLArray.h" #include "btBufferInfoCL.h" -#include "btAlignedObjectArray.h" +#include "BulletCommon/btAlignedObjectArray.h" class btPrefixScanCL { diff --git a/opencl/parallel_primitives/host/btQuadWord.h b/opencl/parallel_primitives/host/btQuadWord.h deleted file mode 100644 index 11067ef47..000000000 --- a/opencl/parallel_primitives/host/btQuadWord.h +++ /dev/null @@ -1,244 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef BT_SIMD_QUADWORD_H -#define BT_SIMD_QUADWORD_H - -#include "btScalar.h" -#include "btMinMax.h" - - - - - -#if defined (__CELLOS_LV2) && defined (__SPU__) -#include -#endif - -/**@brief The btQuadWord class is base class for btVector3 and btQuaternion. - * Some issues under PS3 Linux with IBM 2.1 SDK, gcc compiler prevent from using aligned quadword. - */ -#ifndef USE_LIBSPE2 -ATTRIBUTE_ALIGNED16(class) btQuadWord -#else -class btQuadWord -#endif -{ -protected: - -#if defined (__SPU__) && defined (__CELLOS_LV2__) - union { - vec_float4 mVec128; - btScalar m_floats[4]; - }; -public: - vec_float4 get128() const - { - return mVec128; - } -protected: -#else //__CELLOS_LV2__ __SPU__ - -#if defined(BT_USE_SSE) || defined(BT_USE_NEON) - union { - btSimdFloat4 mVec128; - btScalar m_floats[4]; - }; -public: - SIMD_FORCE_INLINE btSimdFloat4 get128() const - { - return mVec128; - } - SIMD_FORCE_INLINE void set128(btSimdFloat4 v128) - { - mVec128 = v128; - } -#else - btScalar m_floats[4]; -#endif // BT_USE_SSE - -#endif //__CELLOS_LV2__ __SPU__ - - public: - -#if defined(BT_USE_SSE) || defined(BT_USE_NEON) - - // Set Vector - SIMD_FORCE_INLINE btQuadWord(const btSimdFloat4 vec) - { - mVec128 = vec; - } - - // Copy constructor - SIMD_FORCE_INLINE btQuadWord(const btQuadWord& rhs) - { - mVec128 = rhs.mVec128; - } - - // Assignment Operator - SIMD_FORCE_INLINE btQuadWord& - operator=(const btQuadWord& v) - { - mVec128 = v.mVec128; - - return *this; - } - -#endif - - /**@brief Return the x value */ - SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; } - /**@brief Return the y value */ - SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; } - /**@brief Return the z value */ - SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; } - /**@brief Set the x value */ - SIMD_FORCE_INLINE void setX(btScalar _x) { m_floats[0] = _x;}; - /**@brief Set the y value */ - SIMD_FORCE_INLINE void setY(btScalar _y) { m_floats[1] = _y;}; - /**@brief Set the z value */ - SIMD_FORCE_INLINE void setZ(btScalar _z) { m_floats[2] = _z;}; - /**@brief Set the w value */ - SIMD_FORCE_INLINE void setW(btScalar _w) { m_floats[3] = _w;}; - /**@brief Return the x value */ - SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; } - /**@brief Return the y value */ - SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; } - /**@brief Return the z value */ - SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; } - /**@brief Return the w value */ - SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; } - - //SIMD_FORCE_INLINE btScalar& operator[](int i) { return (&m_floats[0])[i]; } - //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; } - ///operator btScalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons. - SIMD_FORCE_INLINE operator btScalar *() { return &m_floats[0]; } - SIMD_FORCE_INLINE operator const btScalar *() const { return &m_floats[0]; } - - SIMD_FORCE_INLINE bool operator==(const btQuadWord& other) const - { -#ifdef BT_USE_SSE - return (0xf == _mm_movemask_ps((__m128)_mm_cmpeq_ps(mVec128, other.mVec128))); -#else - return ((m_floats[3]==other.m_floats[3]) && - (m_floats[2]==other.m_floats[2]) && - (m_floats[1]==other.m_floats[1]) && - (m_floats[0]==other.m_floats[0])); -#endif - } - - SIMD_FORCE_INLINE bool operator!=(const btQuadWord& other) const - { - return !(*this == other); - } - - /**@brief Set x,y,z and zero w - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z) - { - m_floats[0]=_x; - m_floats[1]=_y; - m_floats[2]=_z; - m_floats[3] = 0.f; - } - -/* void getValue(btScalar *m) const - { - m[0] = m_floats[0]; - m[1] = m_floats[1]; - m[2] = m_floats[2]; - } -*/ -/**@brief Set the values - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z,const btScalar& _w) - { - m_floats[0]=_x; - m_floats[1]=_y; - m_floats[2]=_z; - m_floats[3]=_w; - } - /**@brief No initialization constructor */ - SIMD_FORCE_INLINE btQuadWord() - // :m_floats[0](btScalar(0.)),m_floats[1](btScalar(0.)),m_floats[2](btScalar(0.)),m_floats[3](btScalar(0.)) - { - } - - /**@brief Three argument constructor (zeros w) - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - SIMD_FORCE_INLINE btQuadWord(const btScalar& _x, const btScalar& _y, const btScalar& _z) - { - m_floats[0] = _x, m_floats[1] = _y, m_floats[2] = _z, m_floats[3] = 0.0f; - } - -/**@brief Initializing constructor - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - SIMD_FORCE_INLINE btQuadWord(const btScalar& _x, const btScalar& _y, const btScalar& _z,const btScalar& _w) - { - m_floats[0] = _x, m_floats[1] = _y, m_floats[2] = _z, m_floats[3] = _w; - } - - /**@brief Set each element to the max of the current values and the values of another btQuadWord - * @param other The other btQuadWord to compare with - */ - SIMD_FORCE_INLINE void setMax(const btQuadWord& other) - { - #ifdef BT_USE_SSE - mVec128 = _mm_max_ps(mVec128, other.mVec128); - #elif defined(BT_USE_NEON) - mVec128 = vmaxq_f32(mVec128, other.mVec128); - #else - btSetMax(m_floats[0], other.m_floats[0]); - btSetMax(m_floats[1], other.m_floats[1]); - btSetMax(m_floats[2], other.m_floats[2]); - btSetMax(m_floats[3], other.m_floats[3]); - #endif - } - /**@brief Set each element to the min of the current values and the values of another btQuadWord - * @param other The other btQuadWord to compare with - */ - SIMD_FORCE_INLINE void setMin(const btQuadWord& other) - { - #ifdef BT_USE_SSE - mVec128 = _mm_min_ps(mVec128, other.mVec128); - #elif defined(BT_USE_NEON) - mVec128 = vminq_f32(mVec128, other.mVec128); - #else - btSetMin(m_floats[0], other.m_floats[0]); - btSetMin(m_floats[1], other.m_floats[1]); - btSetMin(m_floats[2], other.m_floats[2]); - btSetMin(m_floats[3], other.m_floats[3]); - #endif - } - - - -}; - -#endif //BT_SIMD_QUADWORD_H diff --git a/opencl/parallel_primitives/host/btQuaternion.h b/opencl/parallel_primitives/host/btQuaternion.h deleted file mode 100644 index 7d7f25fb4..000000000 --- a/opencl/parallel_primitives/host/btQuaternion.h +++ /dev/null @@ -1,877 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef BT_SIMD__QUATERNION_H_ -#define BT_SIMD__QUATERNION_H_ - - -#include "btVector3.h" -#include "btQuadWord.h" - - - - - -#ifdef BT_USE_SSE - -const __m128 ATTRIBUTE_ALIGNED16(vOnes) = {1.0f, 1.0f, 1.0f, 1.0f}; - -#endif - -#if defined(BT_USE_SSE) || defined(BT_USE_NEON) - -const btSimdFloat4 ATTRIBUTE_ALIGNED16(vQInv) = {-0.0f, -0.0f, -0.0f, +0.0f}; -const btSimdFloat4 ATTRIBUTE_ALIGNED16(vPPPM) = {+0.0f, +0.0f, +0.0f, -0.0f}; - -#endif - -/**@brief The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatrix3x3, btVector3 and btTransform. */ -class btQuaternion : public btQuadWord { -public: - /**@brief No initialization constructor */ - btQuaternion() {} - -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE))|| defined(BT_USE_NEON) - // Set Vector - SIMD_FORCE_INLINE btQuaternion(const btSimdFloat4 vec) - { - mVec128 = vec; - } - - // Copy constructor - SIMD_FORCE_INLINE btQuaternion(const btQuaternion& rhs) - { - mVec128 = rhs.mVec128; - } - - // Assignment Operator - SIMD_FORCE_INLINE btQuaternion& - operator=(const btQuaternion& v) - { - mVec128 = v.mVec128; - - return *this; - } - -#endif - - // template - // explicit Quaternion(const btScalar *v) : Tuple4(v) {} - /**@brief Constructor from scalars */ - btQuaternion(const btScalar& _x, const btScalar& _y, const btScalar& _z, const btScalar& _w) - : btQuadWord(_x, _y, _z, _w) - {} - /**@brief Axis angle Constructor - * @param axis The axis which the rotation is around - * @param angle The magnitude of the rotation around the angle (Radians) */ - btQuaternion(const btVector3& _axis, const btScalar& _angle) - { - setRotation(_axis, _angle); - } - /**@brief Constructor from Euler angles - * @param yaw Angle around Y unless BT_EULER_DEFAULT_ZYX defined then Z - * @param pitch Angle around X unless BT_EULER_DEFAULT_ZYX defined then Y - * @param roll Angle around Z unless BT_EULER_DEFAULT_ZYX defined then X */ - btQuaternion(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { -#ifndef BT_EULER_DEFAULT_ZYX - setEuler(yaw, pitch, roll); -#else - setEulerZYX(yaw, pitch, roll); -#endif - } - /**@brief Set the rotation using axis angle notation - * @param axis The axis around which to rotate - * @param angle The magnitude of the rotation in Radians */ - void setRotation(const btVector3& axis, const btScalar& _angle) - { - btScalar d = axis.length(); - btAssert(d != btScalar(0.0)); - btScalar s = btSin(_angle * btScalar(0.5)) / d; - setValue(axis.x() * s, axis.y() * s, axis.z() * s, - btCos(_angle * btScalar(0.5))); - } - /**@brief Set the quaternion using Euler angles - * @param yaw Angle around Y - * @param pitch Angle around X - * @param roll Angle around Z */ - void setEuler(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { - btScalar halfYaw = btScalar(yaw) * btScalar(0.5); - btScalar halfPitch = btScalar(pitch) * btScalar(0.5); - btScalar halfRoll = btScalar(roll) * btScalar(0.5); - btScalar cosYaw = btCos(halfYaw); - btScalar sinYaw = btSin(halfYaw); - btScalar cosPitch = btCos(halfPitch); - btScalar sinPitch = btSin(halfPitch); - btScalar cosRoll = btCos(halfRoll); - btScalar sinRoll = btSin(halfRoll); - setValue(cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw, - cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw, - sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw, - cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw); - } - /**@brief Set the quaternion using euler angles - * @param yaw Angle around Z - * @param pitch Angle around Y - * @param roll Angle around X */ - void setEulerZYX(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { - btScalar halfYaw = btScalar(yaw) * btScalar(0.5); - btScalar halfPitch = btScalar(pitch) * btScalar(0.5); - btScalar halfRoll = btScalar(roll) * btScalar(0.5); - btScalar cosYaw = btCos(halfYaw); - btScalar sinYaw = btSin(halfYaw); - btScalar cosPitch = btCos(halfPitch); - btScalar sinPitch = btSin(halfPitch); - btScalar cosRoll = btCos(halfRoll); - btScalar sinRoll = btSin(halfRoll); - setValue(sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw, //x - cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw, //y - cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw, //z - cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw); //formerly yzx - } - /**@brief Add two quaternions - * @param q The quaternion to add to this one */ - SIMD_FORCE_INLINE btQuaternion& operator+=(const btQuaternion& q) - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - mVec128 = _mm_add_ps(mVec128, q.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vaddq_f32(mVec128, q.mVec128); -#else - m_floats[0] += q.x(); - m_floats[1] += q.y(); - m_floats[2] += q.z(); - m_floats[3] += q.m_floats[3]; -#endif - return *this; - } - - /**@brief Subtract out a quaternion - * @param q The quaternion to subtract from this one */ - btQuaternion& operator-=(const btQuaternion& q) - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - mVec128 = _mm_sub_ps(mVec128, q.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vsubq_f32(mVec128, q.mVec128); -#else - m_floats[0] -= q.x(); - m_floats[1] -= q.y(); - m_floats[2] -= q.z(); - m_floats[3] -= q.m_floats[3]; -#endif - return *this; - } - - /**@brief Scale this quaternion - * @param s The scalar to scale by */ - btQuaternion& operator*=(const btScalar& s) - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0); // (S S S S) - mVec128 = _mm_mul_ps(mVec128, vs); -#elif defined(BT_USE_NEON) - mVec128 = vmulq_n_f32(mVec128, s); -#else - m_floats[0] *= s; - m_floats[1] *= s; - m_floats[2] *= s; - m_floats[3] *= s; -#endif - return *this; - } - - /**@brief Multiply this quaternion by q on the right - * @param q The other quaternion - * Equivilant to this = this * q */ - btQuaternion& operator*=(const btQuaternion& q) - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vQ2 = q.get128(); - - __m128 A1 = bt_pshufd_ps(mVec128, BT_SHUFFLE(0,1,2,0)); - __m128 B1 = bt_pshufd_ps(vQ2, BT_SHUFFLE(3,3,3,0)); - - A1 = A1 * B1; - - __m128 A2 = bt_pshufd_ps(mVec128, BT_SHUFFLE(1,2,0,1)); - __m128 B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2,0,1,1)); - - A2 = A2 * B2; - - B1 = bt_pshufd_ps(mVec128, BT_SHUFFLE(2,0,1,2)); - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(1,2,0,2)); - - B1 = B1 * B2; // A3 *= B3 - - mVec128 = bt_splat_ps(mVec128, 3); // A0 - mVec128 = mVec128 * vQ2; // A0 * B0 - - A1 = A1 + A2; // AB12 - mVec128 = mVec128 - B1; // AB03 = AB0 - AB3 - A1 = _mm_xor_ps(A1, vPPPM); // change sign of the last element - mVec128 = mVec128+ A1; // AB03 + AB12 - -#elif defined(BT_USE_NEON) - - float32x4_t vQ1 = mVec128; - float32x4_t vQ2 = q.get128(); - float32x4_t A0, A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - tmp = vtrn_f32( vget_high_f32(vQ1), vget_low_f32(vQ1) ); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32( vget_high_f32(vQ2), vget_low_f32(vQ2) ); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - A0 = vmulq_lane_f32(vQ2, vget_high_f32(vQ1), 1); // A0 * B0 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - A0 = vsubq_f32(A0, A3); // AB03 = AB0 - AB3 - - // change the sign of the last element - A1 = (btSimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)vPPPM); - A0 = vaddq_f32(A0, A1); // AB03 + AB12 - - mVec128 = A0; -#else - setValue( - m_floats[3] * q.x() + m_floats[0] * q.m_floats[3] + m_floats[1] * q.z() - m_floats[2] * q.y(), - m_floats[3] * q.y() + m_floats[1] * q.m_floats[3] + m_floats[2] * q.x() - m_floats[0] * q.z(), - m_floats[3] * q.z() + m_floats[2] * q.m_floats[3] + m_floats[0] * q.y() - m_floats[1] * q.x(), - m_floats[3] * q.m_floats[3] - m_floats[0] * q.x() - m_floats[1] * q.y() - m_floats[2] * q.z()); -#endif - return *this; - } - /**@brief Return the dot product between this quaternion and another - * @param q The other quaternion */ - btScalar dot(const btQuaternion& q) const - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vd; - - vd = _mm_mul_ps(mVec128, q.mVec128); - - __m128 t = _mm_movehl_ps(vd, vd); - vd = _mm_add_ps(vd, t); - t = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, t); - - return _mm_cvtss_f32(vd); -#elif defined(BT_USE_NEON) - float32x4_t vd = vmulq_f32(mVec128, q.mVec128); - float32x2_t x = vpadd_f32(vget_low_f32(vd), vget_high_f32(vd)); - x = vpadd_f32(x, x); - return vget_lane_f32(x, 0); -#else - return m_floats[0] * q.x() + - m_floats[1] * q.y() + - m_floats[2] * q.z() + - m_floats[3] * q.m_floats[3]; -#endif - } - - /**@brief Return the length squared of the quaternion */ - btScalar length2() const - { - return dot(*this); - } - - /**@brief Return the length of the quaternion */ - btScalar length() const - { - return btSqrt(length2()); - } - - /**@brief Normalize the quaternion - * Such that x^2 + y^2 + z^2 +w^2 = 1 */ - btQuaternion& normalize() - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vd; - - vd = _mm_mul_ps(mVec128, mVec128); - - __m128 t = _mm_movehl_ps(vd, vd); - vd = _mm_add_ps(vd, t); - t = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, t); - - vd = _mm_sqrt_ss(vd); - vd = _mm_div_ss(vOnes, vd); - vd = bt_pshufd_ps(vd, 0); // splat - mVec128 = _mm_mul_ps(mVec128, vd); - - return *this; -#else - return *this /= length(); -#endif - } - - /**@brief Return a scaled version of this quaternion - * @param s The scale factor */ - SIMD_FORCE_INLINE btQuaternion - operator*(const btScalar& s) const - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0x00); // (S S S S) - - return btQuaternion(_mm_mul_ps(mVec128, vs)); -#elif defined(BT_USE_NEON) - return btQuaternion(vmulq_n_f32(mVec128, s)); -#else - return btQuaternion(x() * s, y() * s, z() * s, m_floats[3] * s); -#endif - } - - /**@brief Return an inversely scaled versionof this quaternion - * @param s The inverse scale factor */ - btQuaternion operator/(const btScalar& s) const - { - btAssert(s != btScalar(0.0)); - return *this * (btScalar(1.0) / s); - } - - /**@brief Inversely scale this quaternion - * @param s The scale factor */ - btQuaternion& operator/=(const btScalar& s) - { - btAssert(s != btScalar(0.0)); - return *this *= btScalar(1.0) / s; - } - - /**@brief Return a normalized version of this quaternion */ - btQuaternion normalized() const - { - return *this / length(); - } - /**@brief Return the angle between this quaternion and the other - * @param q The other quaternion */ - btScalar angle(const btQuaternion& q) const - { - btScalar s = btSqrt(length2() * q.length2()); - btAssert(s != btScalar(0.0)); - return btAcos(dot(q) / s); - } - /**@brief Return the angle of rotation represented by this quaternion */ - btScalar getAngle() const - { - btScalar s = btScalar(2.) * btAcos(m_floats[3]); - return s; - } - - /**@brief Return the axis of the rotation represented by this quaternion */ - btVector3 getAxis() const - { - btScalar s_squared = 1.f-m_floats[3]*m_floats[3]; - - if (s_squared < btScalar(10.) * SIMD_EPSILON) //Check for divide by zero - return btVector3(1.0, 0.0, 0.0); // Arbitrary - btScalar s = 1.f/btSqrt(s_squared); - return btVector3(m_floats[0] * s, m_floats[1] * s, m_floats[2] * s); - } - - /**@brief Return the inverse of this quaternion */ - btQuaternion inverse() const - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btQuaternion(_mm_xor_ps(mVec128, vQInv)); -#elif defined(BT_USE_NEON) - return btQuaternion((btSimdFloat4)veorq_s32((int32x4_t)mVec128, (int32x4_t)vQInv)); -#else - return btQuaternion(-m_floats[0], -m_floats[1], -m_floats[2], m_floats[3]); -#endif - } - - /**@brief Return the sum of this quaternion and the other - * @param q2 The other quaternion */ - SIMD_FORCE_INLINE btQuaternion - operator+(const btQuaternion& q2) const - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btQuaternion(_mm_add_ps(mVec128, q2.mVec128)); -#elif defined(BT_USE_NEON) - return btQuaternion(vaddq_f32(mVec128, q2.mVec128)); -#else - const btQuaternion& q1 = *this; - return btQuaternion(q1.x() + q2.x(), q1.y() + q2.y(), q1.z() + q2.z(), q1.m_floats[3] + q2.m_floats[3]); -#endif - } - - /**@brief Return the difference between this quaternion and the other - * @param q2 The other quaternion */ - SIMD_FORCE_INLINE btQuaternion - operator-(const btQuaternion& q2) const - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btQuaternion(_mm_sub_ps(mVec128, q2.mVec128)); -#elif defined(BT_USE_NEON) - return btQuaternion(vsubq_f32(mVec128, q2.mVec128)); -#else - const btQuaternion& q1 = *this; - return btQuaternion(q1.x() - q2.x(), q1.y() - q2.y(), q1.z() - q2.z(), q1.m_floats[3] - q2.m_floats[3]); -#endif - } - - /**@brief Return the negative of this quaternion - * This simply negates each element */ - SIMD_FORCE_INLINE btQuaternion operator-() const - { -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btQuaternion(_mm_xor_ps(mVec128, btvMzeroMask)); -#elif defined(BT_USE_NEON) - return btQuaternion((btSimdFloat4)veorq_s32((int32x4_t)mVec128, (int32x4_t)btvMzeroMask) ); -#else - const btQuaternion& q2 = *this; - return btQuaternion( - q2.x(), - q2.y(), - q2.z(), - q2.m_floats[3]); -#endif - } - /**@todo document this and it's use */ - SIMD_FORCE_INLINE btQuaternion farthest( const btQuaternion& qd) const - { - btQuaternion diff,sum; - diff = *this - qd; - sum = *this + qd; - if( diff.dot(diff) > sum.dot(sum) ) - return qd; - return (-qd); - } - - /**@todo document this and it's use */ - SIMD_FORCE_INLINE btQuaternion nearest( const btQuaternion& qd) const - { - btQuaternion diff,sum; - diff = *this - qd; - sum = *this + qd; - if( diff.dot(diff) < sum.dot(sum) ) - return qd; - return (-qd); - } - - - /**@brief Return the quaternion which is the result of Spherical Linear Interpolation between this and the other quaternion - * @param q The other quaternion to interpolate with - * @param t The ratio between this and q to interpolate. If t = 0 the result is this, if t=1 the result is q. - * Slerp interpolates assuming constant velocity. */ - btQuaternion slerp(const btQuaternion& q, const btScalar& t) const - { - btScalar magnitude = btSqrt(length2() * q.length2()); - btAssert(magnitude > btScalar(0)); - - btScalar product = dot(q) / magnitude; - if (btFabs(product) < btScalar(1)) - { - // Take care of long angle case see http://en.wikipedia.org/wiki/Slerp - const btScalar sign = (product < 0) ? btScalar(-1) : btScalar(1); - - const btScalar theta = btAcos(sign * product); - const btScalar s1 = btSin(sign * t * theta); - const btScalar d = btScalar(1.0) / btSin(theta); - const btScalar s0 = btSin((btScalar(1.0) - t) * theta); - - return btQuaternion( - (m_floats[0] * s0 + q.x() * s1) * d, - (m_floats[1] * s0 + q.y() * s1) * d, - (m_floats[2] * s0 + q.z() * s1) * d, - (m_floats[3] * s0 + q.m_floats[3] * s1) * d); - } - else - { - return *this; - } - } - - static const btQuaternion& getIdentity() - { - static const btQuaternion identityQuat(btScalar(0.),btScalar(0.),btScalar(0.),btScalar(1.)); - return identityQuat; - } - - SIMD_FORCE_INLINE const btScalar& getW() const { return m_floats[3]; } - - -}; - - - - - -/**@brief Return the product of two quaternions */ -SIMD_FORCE_INLINE btQuaternion -operator*(const btQuaternion& q1, const btQuaternion& q2) -{ -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vQ1 = q1.get128(); - __m128 vQ2 = q2.get128(); - __m128 A0, A1, B1, A2, B2; - - A1 = bt_pshufd_ps(vQ1, BT_SHUFFLE(0,1,2,0)); // X Y z x // vtrn - B1 = bt_pshufd_ps(vQ2, BT_SHUFFLE(3,3,3,0)); // W W W X // vdup vext - - A1 = A1 * B1; - - A2 = bt_pshufd_ps(vQ1, BT_SHUFFLE(1,2,0,1)); // Y Z X Y // vext - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2,0,1,1)); // z x Y Y // vtrn vdup - - A2 = A2 * B2; - - B1 = bt_pshufd_ps(vQ1, BT_SHUFFLE(2,0,1,2)); // z x Y Z // vtrn vext - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(1,2,0,2)); // Y Z x z // vext vtrn - - B1 = B1 * B2; // A3 *= B3 - - A0 = bt_splat_ps(vQ1, 3); // A0 - A0 = A0 * vQ2; // A0 * B0 - - A1 = A1 + A2; // AB12 - A0 = A0 - B1; // AB03 = AB0 - AB3 - - A1 = _mm_xor_ps(A1, vPPPM); // change sign of the last element - A0 = A0 + A1; // AB03 + AB12 - - return btQuaternion(A0); - -#elif defined(BT_USE_NEON) - - float32x4_t vQ1 = q1.get128(); - float32x4_t vQ2 = q2.get128(); - float32x4_t A0, A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - tmp = vtrn_f32( vget_high_f32(vQ1), vget_low_f32(vQ1) ); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32( vget_high_f32(vQ2), vget_low_f32(vQ2) ); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - A0 = vmulq_lane_f32(vQ2, vget_high_f32(vQ1), 1); // A0 * B0 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - A0 = vsubq_f32(A0, A3); // AB03 = AB0 - AB3 - - // change the sign of the last element - A1 = (btSimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)vPPPM); - A0 = vaddq_f32(A0, A1); // AB03 + AB12 - - return btQuaternion(A0); - -#else - return btQuaternion( - q1.w() * q2.x() + q1.x() * q2.w() + q1.y() * q2.z() - q1.z() * q2.y(), - q1.w() * q2.y() + q1.y() * q2.w() + q1.z() * q2.x() - q1.x() * q2.z(), - q1.w() * q2.z() + q1.z() * q2.w() + q1.x() * q2.y() - q1.y() * q2.x(), - q1.w() * q2.w() - q1.x() * q2.x() - q1.y() * q2.y() - q1.z() * q2.z()); -#endif -} - -SIMD_FORCE_INLINE btQuaternion -operator*(const btQuaternion& q, const btVector3& w) -{ -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vQ1 = q.get128(); - __m128 vQ2 = w.get128(); - __m128 A1, B1, A2, B2, A3, B3; - - A1 = bt_pshufd_ps(vQ1, BT_SHUFFLE(3,3,3,0)); - B1 = bt_pshufd_ps(vQ2, BT_SHUFFLE(0,1,2,0)); - - A1 = A1 * B1; - - A2 = bt_pshufd_ps(vQ1, BT_SHUFFLE(1,2,0,1)); - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2,0,1,1)); - - A2 = A2 * B2; - - A3 = bt_pshufd_ps(vQ1, BT_SHUFFLE(2,0,1,2)); - B3 = bt_pshufd_ps(vQ2, BT_SHUFFLE(1,2,0,2)); - - A3 = A3 * B3; // A3 *= B3 - - A1 = A1 + A2; // AB12 - A1 = _mm_xor_ps(A1, vPPPM); // change sign of the last element - A1 = A1 - A3; // AB123 = AB12 - AB3 - - return btQuaternion(A1); - -#elif defined(BT_USE_NEON) - - float32x4_t vQ1 = q.get128(); - float32x4_t vQ2 = w.get128(); - float32x4_t A1, B1, A2, B2, A3, B3; - float32x2_t vQ1wx, vQ2zx, vQ1yz, vQ2yz, vQ1zx, vQ2xz; - - vQ1wx = vext_f32(vget_high_f32(vQ1), vget_low_f32(vQ1), 1); - { - float32x2x2_t tmp; - - tmp = vtrn_f32( vget_high_f32(vQ2), vget_low_f32(vQ2) ); // {z x}, {w y} - vQ2zx = tmp.val[0]; - - tmp = vtrn_f32( vget_high_f32(vQ1), vget_low_f32(vQ1) ); // {z x}, {w y} - vQ1zx = tmp.val[0]; - } - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ1), 1), vQ1wx); // W W W X - B1 = vcombine_f32(vget_low_f32(vQ2), vQ2zx); // X Y z x - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - - // change the sign of the last element - A1 = (btSimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)vPPPM); - - A1 = vsubq_f32(A1, A3); // AB123 = AB12 - AB3 - - return btQuaternion(A1); - -#else - return btQuaternion( - q.w() * w.x() + q.y() * w.z() - q.z() * w.y(), - q.w() * w.y() + q.z() * w.x() - q.x() * w.z(), - q.w() * w.z() + q.x() * w.y() - q.y() * w.x(), - -q.x() * w.x() - q.y() * w.y() - q.z() * w.z()); -#endif -} - -SIMD_FORCE_INLINE btQuaternion -operator*(const btVector3& w, const btQuaternion& q) -{ -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vQ1 = w.get128(); - __m128 vQ2 = q.get128(); - __m128 A1, B1, A2, B2, A3, B3; - - A1 = bt_pshufd_ps(vQ1, BT_SHUFFLE(0,1,2,0)); // X Y z x - B1 = bt_pshufd_ps(vQ2, BT_SHUFFLE(3,3,3,0)); // W W W X - - A1 = A1 * B1; - - A2 = bt_pshufd_ps(vQ1, BT_SHUFFLE(1,2,0,1)); - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2,0,1,1)); - - A2 = A2 *B2; - - A3 = bt_pshufd_ps(vQ1, BT_SHUFFLE(2,0,1,2)); - B3 = bt_pshufd_ps(vQ2, BT_SHUFFLE(1,2,0,2)); - - A3 = A3 * B3; // A3 *= B3 - - A1 = A1 + A2; // AB12 - A1 = _mm_xor_ps(A1, vPPPM); // change sign of the last element - A1 = A1 - A3; // AB123 = AB12 - AB3 - - return btQuaternion(A1); - -#elif defined(BT_USE_NEON) - - float32x4_t vQ1 = w.get128(); - float32x4_t vQ2 = q.get128(); - float32x4_t A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - - tmp = vtrn_f32( vget_high_f32(vQ1), vget_low_f32(vQ1) ); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32( vget_high_f32(vQ2), vget_low_f32(vQ2) ); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - - // change the sign of the last element - A1 = (btSimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)vPPPM); - - A1 = vsubq_f32(A1, A3); // AB123 = AB12 - AB3 - - return btQuaternion(A1); - -#else - return btQuaternion( - +w.x() * q.w() + w.y() * q.z() - w.z() * q.y(), - +w.y() * q.w() + w.z() * q.x() - w.x() * q.z(), - +w.z() * q.w() + w.x() * q.y() - w.y() * q.x(), - -w.x() * q.x() - w.y() * q.y() - w.z() * q.z()); -#endif -} - -/**@brief Calculate the dot product between two quaternions */ -SIMD_FORCE_INLINE btScalar -dot(const btQuaternion& q1, const btQuaternion& q2) -{ - return q1.dot(q2); -} - - -/**@brief Return the length of a quaternion */ -SIMD_FORCE_INLINE btScalar -length(const btQuaternion& q) -{ - return q.length(); -} - -/**@brief Return the angle between two quaternions*/ -SIMD_FORCE_INLINE btScalar -btAngle(const btQuaternion& q1, const btQuaternion& q2) -{ - return q1.angle(q2); -} - -/**@brief Return the inverse of a quaternion*/ -SIMD_FORCE_INLINE btQuaternion -inverse(const btQuaternion& q) -{ - return q.inverse(); -} - -/**@brief Return the result of spherical linear interpolation betwen two quaternions - * @param q1 The first quaternion - * @param q2 The second quaternion - * @param t The ration between q1 and q2. t = 0 return q1, t=1 returns q2 - * Slerp assumes constant velocity between positions. */ -SIMD_FORCE_INLINE btQuaternion -slerp(const btQuaternion& q1, const btQuaternion& q2, const btScalar& t) -{ - return q1.slerp(q2, t); -} - -SIMD_FORCE_INLINE btVector3 -quatRotate(const btQuaternion& rotation, const btVector3& v) -{ - btQuaternion q = rotation * v; - q *= rotation.inverse(); -#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btVector3(_mm_and_ps(q.get128(), btvFFF0fMask)); -#elif defined(BT_USE_NEON) - return btVector3((float32x4_t)vandq_s32((int32x4_t)q.get128(), btvFFF0Mask)); -#else - return btVector3(q.getX(),q.getY(),q.getZ()); -#endif -} - -SIMD_FORCE_INLINE btQuaternion -shortestArcQuat(const btVector3& v0, const btVector3& v1) // Game Programming Gems 2.10. make sure v0,v1 are normalized -{ - btVector3 c = v0.cross(v1); - btScalar d = v0.dot(v1); - - if (d < -1.0 + SIMD_EPSILON) - { - btVector3 n,unused; - btPlaneSpace1(v0,n,unused); - return btQuaternion(n.x(),n.y(),n.z(),0.0f); // just pick any vector that is orthogonal to v0 - } - - btScalar s = btSqrt((1.0f + d) * 2.0f); - btScalar rs = 1.0f / s; - - return btQuaternion(c.getX()*rs,c.getY()*rs,c.getZ()*rs,s * 0.5f); -} - -SIMD_FORCE_INLINE btQuaternion -shortestArcQuatNormalize2(btVector3& v0,btVector3& v1) -{ - v0.normalize(); - v1.normalize(); - return shortestArcQuat(v0,v1); -} - -#endif //BT_SIMD__QUATERNION_H_ - - - diff --git a/opencl/parallel_primitives/host/btQuickprof.cpp b/opencl/parallel_primitives/host/btQuickprof.cpp deleted file mode 100644 index 544aee89d..000000000 --- a/opencl/parallel_primitives/host/btQuickprof.cpp +++ /dev/null @@ -1,566 +0,0 @@ -/* - -*************************************************************************************************** -** -** profile.cpp -** -** Real-Time Hierarchical Profiling for Game Programming Gems 3 -** -** by Greg Hjelstrom & Byon Garrabrant -** -***************************************************************************************************/ - -// Credits: The Clock class was inspired by the Timer classes in -// Ogre (www.ogre3d.org). - -#include "btQuickprof.h" - -#ifndef BT_NO_PROFILE - - -static btClock gProfileClock; - - -#ifdef __CELLOS_LV2__ -#include -#include -#include -#endif - -#if defined (SUNOS) || defined (__SUNOS__) -#include -#endif - -#if defined(WIN32) || defined(_WIN32) - -#define BT_USE_WINDOWS_TIMERS -#define WIN32_LEAN_AND_MEAN -#define NOWINRES -#define NOMCX -#define NOIME - -#ifdef _XBOX - #include -#else //_XBOX - #include -#endif //_XBOX - -#include - - -#else //_WIN32 -#include -#endif //_WIN32 - -#define mymin(a,b) (a > b ? a : b) - -struct btClockData -{ - -#ifdef BT_USE_WINDOWS_TIMERS - LARGE_INTEGER mClockFrequency; - DWORD mStartTick; - LONGLONG mPrevElapsedTime; - LARGE_INTEGER mStartTime; -#else -#ifdef __CELLOS_LV2__ - uint64_t mStartTime; -#else - struct timeval mStartTime; -#endif -#endif //__CELLOS_LV2__ - -}; - -///The btClock is a portable basic clock that measures accurate time in seconds, use for profiling. -btClock::btClock() -{ - m_data = new btClockData; -#ifdef BT_USE_WINDOWS_TIMERS - QueryPerformanceFrequency(&m_data->mClockFrequency); -#endif - reset(); -} - -btClock::~btClock() -{ - delete m_data; -} - -btClock::btClock(const btClock& other) -{ - m_data = new btClockData; - *m_data = *other.m_data; -} - -btClock& btClock::operator=(const btClock& other) -{ - *m_data = *other.m_data; - return *this; -} - - - /// Resets the initial reference time. -void btClock::reset() -{ -#ifdef BT_USE_WINDOWS_TIMERS - QueryPerformanceCounter(&m_data->mStartTime); - m_data->mStartTick = GetTickCount(); - m_data->mPrevElapsedTime = 0; -#else -#ifdef __CELLOS_LV2__ - - typedef uint64_t ClockSize; - ClockSize newTime; - //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory"); - SYS_TIMEBASE_GET( newTime ); - m_data->mStartTime = newTime; -#else - gettimeofday(&m_data->mStartTime, 0); -#endif -#endif -} - -/// Returns the time in ms since the last call to reset or since -/// the btClock was created. -unsigned long int btClock::getTimeMilliseconds() -{ -#ifdef BT_USE_WINDOWS_TIMERS - LARGE_INTEGER currentTime; - QueryPerformanceCounter(¤tTime); - LONGLONG elapsedTime = currentTime.QuadPart - - m_data->mStartTime.QuadPart; - // Compute the number of millisecond ticks elapsed. - unsigned long msecTicks = (unsigned long)(1000 * elapsedTime / - m_data->mClockFrequency.QuadPart); - // Check for unexpected leaps in the Win32 performance counter. - // (This is caused by unexpected data across the PCI to ISA - // bridge, aka south bridge. See Microsoft KB274323.) - unsigned long elapsedTicks = GetTickCount() - m_data->mStartTick; - signed long msecOff = (signed long)(msecTicks - elapsedTicks); - if (msecOff < -100 || msecOff > 100) - { - // Adjust the starting time forwards. - LONGLONG msecAdjustment = mymin(msecOff * - m_data->mClockFrequency.QuadPart / 1000, elapsedTime - - m_data->mPrevElapsedTime); - m_data->mStartTime.QuadPart += msecAdjustment; - elapsedTime -= msecAdjustment; - - // Recompute the number of millisecond ticks elapsed. - msecTicks = (unsigned long)(1000 * elapsedTime / - m_data->mClockFrequency.QuadPart); - } - - // Store the current elapsed time for adjustments next time. - m_data->mPrevElapsedTime = elapsedTime; - - return msecTicks; -#else - -#ifdef __CELLOS_LV2__ - uint64_t freq=sys_time_get_timebase_frequency(); - double dFreq=((double) freq) / 1000.0; - typedef uint64_t ClockSize; - ClockSize newTime; - SYS_TIMEBASE_GET( newTime ); - //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory"); - - return (unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq); -#else - - struct timeval currentTime; - gettimeofday(¤tTime, 0); - return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000 + - (currentTime.tv_usec - m_data->mStartTime.tv_usec) / 1000; -#endif //__CELLOS_LV2__ -#endif -} - - /// Returns the time in us since the last call to reset or since - /// the Clock was created. -unsigned long int btClock::getTimeMicroseconds() -{ -#ifdef BT_USE_WINDOWS_TIMERS - LARGE_INTEGER currentTime; - QueryPerformanceCounter(¤tTime); - LONGLONG elapsedTime = currentTime.QuadPart - - m_data->mStartTime.QuadPart; - - // Compute the number of millisecond ticks elapsed. - unsigned long msecTicks = (unsigned long)(1000 * elapsedTime / - m_data->mClockFrequency.QuadPart); - - // Check for unexpected leaps in the Win32 performance counter. - // (This is caused by unexpected data across the PCI to ISA - // bridge, aka south bridge. See Microsoft KB274323.) - unsigned long elapsedTicks = GetTickCount() - m_data->mStartTick; - signed long msecOff = (signed long)(msecTicks - elapsedTicks); - if (msecOff < -100 || msecOff > 100) - { - // Adjust the starting time forwards. - LONGLONG msecAdjustment = mymin(msecOff * - m_data->mClockFrequency.QuadPart / 1000, elapsedTime - - m_data->mPrevElapsedTime); - m_data->mStartTime.QuadPart += msecAdjustment; - elapsedTime -= msecAdjustment; - } - - // Store the current elapsed time for adjustments next time. - m_data->mPrevElapsedTime = elapsedTime; - - // Convert to microseconds. - unsigned long usecTicks = (unsigned long)(1000000 * elapsedTime / - m_data->mClockFrequency.QuadPart); - - return usecTicks; -#else - -#ifdef __CELLOS_LV2__ - uint64_t freq=sys_time_get_timebase_frequency(); - double dFreq=((double) freq)/ 1000000.0; - typedef uint64_t ClockSize; - ClockSize newTime; - //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory"); - SYS_TIMEBASE_GET( newTime ); - - return (unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq); -#else - - struct timeval currentTime; - gettimeofday(¤tTime, 0); - return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000000 + - (currentTime.tv_usec - m_data->mStartTime.tv_usec); -#endif//__CELLOS_LV2__ -#endif -} - - - - - -inline void Profile_Get_Ticks(unsigned long int * ticks) -{ - *ticks = gProfileClock.getTimeMicroseconds(); -} - -inline float Profile_Get_Tick_Rate(void) -{ -// return 1000000.f; - return 1000.f; - -} - - - -/*************************************************************************************************** -** -** CProfileNode -** -***************************************************************************************************/ - -/*********************************************************************************************** - * INPUT: * - * name - pointer to a static string which is the name of this profile node * - * parent - parent pointer * - * * - * WARNINGS: * - * The name is assumed to be a static pointer, only the pointer is stored and compared for * - * efficiency reasons. * - *=============================================================================================*/ -CProfileNode::CProfileNode( const char * name, CProfileNode * parent ) : - Name( name ), - TotalCalls( 0 ), - TotalTime( 0 ), - StartTime( 0 ), - RecursionCounter( 0 ), - Parent( parent ), - Child( NULL ), - Sibling( NULL ), - m_userPtr(0) -{ - Reset(); -} - - -void CProfileNode::CleanupMemory() -{ - delete ( Child); - Child = NULL; - delete ( Sibling); - Sibling = NULL; -} - -CProfileNode::~CProfileNode( void ) -{ - delete ( Child); - delete ( Sibling); -} - - -/*********************************************************************************************** - * INPUT: * - * name - static string pointer to the name of the node we are searching for * - * * - * WARNINGS: * - * All profile names are assumed to be static strings so this function uses pointer compares * - * to find the named node. * - *=============================================================================================*/ -CProfileNode * CProfileNode::Get_Sub_Node( const char * name ) -{ - // Try to find this sub node - CProfileNode * child = Child; - while ( child ) { - if ( child->Name == name ) { - return child; - } - child = child->Sibling; - } - - // We didn't find it, so add it - - CProfileNode * node = new CProfileNode( name, this ); - node->Sibling = Child; - Child = node; - return node; -} - - -void CProfileNode::Reset( void ) -{ - TotalCalls = 0; - TotalTime = 0.0f; - - - if ( Child ) { - Child->Reset(); - } - if ( Sibling ) { - Sibling->Reset(); - } -} - - -void CProfileNode::Call( void ) -{ - TotalCalls++; - if (RecursionCounter++ == 0) { - Profile_Get_Ticks(&StartTime); - } -} - - -bool CProfileNode::Return( void ) -{ - if ( --RecursionCounter == 0 && TotalCalls != 0 ) { - unsigned long int time; - Profile_Get_Ticks(&time); - time-=StartTime; - TotalTime += (float)time / Profile_Get_Tick_Rate(); - } - return ( RecursionCounter == 0 ); -} - - -/*************************************************************************************************** -** -** CProfileIterator -** -***************************************************************************************************/ -CProfileIterator::CProfileIterator( CProfileNode * start ) -{ - CurrentParent = start; - CurrentChild = CurrentParent->Get_Child(); -} - - -void CProfileIterator::First(void) -{ - CurrentChild = CurrentParent->Get_Child(); -} - - -void CProfileIterator::Next(void) -{ - CurrentChild = CurrentChild->Get_Sibling(); -} - - -bool CProfileIterator::Is_Done(void) -{ - return CurrentChild == NULL; -} - - -void CProfileIterator::Enter_Child( int index ) -{ - CurrentChild = CurrentParent->Get_Child(); - while ( (CurrentChild != NULL) && (index != 0) ) { - index--; - CurrentChild = CurrentChild->Get_Sibling(); - } - - if ( CurrentChild != NULL ) { - CurrentParent = CurrentChild; - CurrentChild = CurrentParent->Get_Child(); - } -} - - -void CProfileIterator::Enter_Parent( void ) -{ - if ( CurrentParent->Get_Parent() != NULL ) { - CurrentParent = CurrentParent->Get_Parent(); - } - CurrentChild = CurrentParent->Get_Child(); -} - - -/*************************************************************************************************** -** -** CProfileManager -** -***************************************************************************************************/ - -CProfileNode CProfileManager::Root( "Root", NULL ); -CProfileNode * CProfileManager::CurrentNode = &CProfileManager::Root; -int CProfileManager::FrameCounter = 0; -unsigned long int CProfileManager::ResetTime = 0; - - -/*********************************************************************************************** - * CProfileManager::Start_Profile -- Begin a named profile * - * * - * Steps one level deeper into the tree, if a child already exists with the specified name * - * then it accumulates the profiling; otherwise a new child node is added to the profile tree. * - * * - * INPUT: * - * name - name of this profiling record * - * * - * WARNINGS: * - * The string used is assumed to be a static string; pointer compares are used throughout * - * the profiling code for efficiency. * - *=============================================================================================*/ -void CProfileManager::Start_Profile( const char * name ) -{ - if (name != CurrentNode->Get_Name()) { - CurrentNode = CurrentNode->Get_Sub_Node( name ); - } - - CurrentNode->Call(); -} - - -/*********************************************************************************************** - * CProfileManager::Stop_Profile -- Stop timing and record the results. * - *=============================================================================================*/ -void CProfileManager::Stop_Profile( void ) -{ - // Return will indicate whether we should back up to our parent (we may - // be profiling a recursive function) - if (CurrentNode->Return()) { - CurrentNode = CurrentNode->Get_Parent(); - } -} - - -/*********************************************************************************************** - * CProfileManager::Reset -- Reset the contents of the profiling system * - * * - * This resets everything except for the tree structure. All of the timing data is reset. * - *=============================================================================================*/ -void CProfileManager::Reset( void ) -{ - gProfileClock.reset(); - Root.Reset(); - Root.Call(); - FrameCounter = 0; - Profile_Get_Ticks(&ResetTime); -} - - -/*********************************************************************************************** - * CProfileManager::Increment_Frame_Counter -- Increment the frame counter * - *=============================================================================================*/ -void CProfileManager::Increment_Frame_Counter( void ) -{ - FrameCounter++; -} - - -/*********************************************************************************************** - * CProfileManager::Get_Time_Since_Reset -- returns the elapsed time since last reset * - *=============================================================================================*/ -float CProfileManager::Get_Time_Since_Reset( void ) -{ - unsigned long int time; - Profile_Get_Ticks(&time); - time -= ResetTime; - return (float)time / Profile_Get_Tick_Rate(); -} - -#include - -void CProfileManager::dumpRecursive(CProfileIterator* profileIterator, int spacing) -{ - profileIterator->First(); - if (profileIterator->Is_Done()) - return; - - float accumulated_time=0,parent_time = profileIterator->Is_Root() ? CProfileManager::Get_Time_Since_Reset() : profileIterator->Get_Current_Parent_Total_Time(); - int i; - int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset(); - for (i=0;iGet_Current_Parent_Name(), parent_time ); - float totalTime = 0.f; - - - int numChildren = 0; - - for (i = 0; !profileIterator->Is_Done(); i++,profileIterator->Next()) - { - numChildren++; - float current_total_time = profileIterator->Get_Current_Total_Time(); - accumulated_time += current_total_time; - float fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f; - { - int i; for (i=0;iGet_Current_Name(), fraction,(current_total_time / (double)frames_since_reset),profileIterator->Get_Current_Total_Calls()); - totalTime += current_total_time; - //recurse into children - } - - if (parent_time < accumulated_time) - { - printf("what's wrong\n"); - } - for (i=0;i SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time); - - for (i=0;iEnter_Child(i); - dumpRecursive(profileIterator,spacing+3); - profileIterator->Enter_Parent(); - } -} - - - -void CProfileManager::dumpAll() -{ - CProfileIterator* profileIterator = 0; - profileIterator = CProfileManager::Get_Iterator(); - - dumpRecursive(profileIterator,0); - - CProfileManager::Release_Iterator(profileIterator); -} - - - - -#endif //BT_NO_PROFILE diff --git a/opencl/parallel_primitives/host/btQuickprof.h b/opencl/parallel_primitives/host/btQuickprof.h deleted file mode 100644 index 93f3f4a60..000000000 --- a/opencl/parallel_primitives/host/btQuickprof.h +++ /dev/null @@ -1,203 +0,0 @@ - -/*************************************************************************************************** -** -** Real-Time Hierarchical Profiling for Game Programming Gems 3 -** -** by Greg Hjelstrom & Byon Garrabrant -** -***************************************************************************************************/ - -// Credits: The Clock class was inspired by the Timer classes in -// Ogre (www.ogre3d.org). - - - -#ifndef BT_QUICK_PROF_H -#define BT_QUICK_PROF_H - -//To disable built-in profiling, please comment out next line -//#define BT_NO_PROFILE 1 -#ifndef BT_NO_PROFILE -#include //@todo remove this, backwards compatibility -#include "btScalar.h" -#include "btAlignedAllocator.h" -#include - - - - - -#define USE_BT_CLOCK 1 - -#ifdef USE_BT_CLOCK - -///The btClock is a portable basic clock that measures accurate time in seconds, use for profiling. -class btClock -{ -public: - btClock(); - - btClock(const btClock& other); - btClock& operator=(const btClock& other); - - ~btClock(); - - /// Resets the initial reference time. - void reset(); - - /// Returns the time in ms since the last call to reset or since - /// the btClock was created. - unsigned long int getTimeMilliseconds(); - - /// Returns the time in us since the last call to reset or since - /// the Clock was created. - unsigned long int getTimeMicroseconds(); -private: - struct btClockData* m_data; -}; - -#endif //USE_BT_CLOCK - - - - -///A node in the Profile Hierarchy Tree -class CProfileNode { - -public: - CProfileNode( const char * name, CProfileNode * parent ); - ~CProfileNode( void ); - - CProfileNode * Get_Sub_Node( const char * name ); - - CProfileNode * Get_Parent( void ) { return Parent; } - CProfileNode * Get_Sibling( void ) { return Sibling; } - CProfileNode * Get_Child( void ) { return Child; } - - void CleanupMemory(); - void Reset( void ); - void Call( void ); - bool Return( void ); - - const char * Get_Name( void ) { return Name; } - int Get_Total_Calls( void ) { return TotalCalls; } - float Get_Total_Time( void ) { return TotalTime; } - void* GetUserPointer() const {return m_userPtr;} - void SetUserPointer(void* ptr) { m_userPtr = ptr;} -protected: - - const char * Name; - int TotalCalls; - float TotalTime; - unsigned long int StartTime; - int RecursionCounter; - - CProfileNode * Parent; - CProfileNode * Child; - CProfileNode * Sibling; - void* m_userPtr; -}; - -///An iterator to navigate through the tree -class CProfileIterator -{ -public: - // Access all the children of the current parent - void First(void); - void Next(void); - bool Is_Done(void); - bool Is_Root(void) { return (CurrentParent->Get_Parent() == 0); } - - void Enter_Child( int index ); // Make the given child the new parent - void Enter_Largest_Child( void ); // Make the largest child the new parent - void Enter_Parent( void ); // Make the current parent's parent the new parent - - // Access the current child - const char * Get_Current_Name( void ) { return CurrentChild->Get_Name(); } - int Get_Current_Total_Calls( void ) { return CurrentChild->Get_Total_Calls(); } - float Get_Current_Total_Time( void ) { return CurrentChild->Get_Total_Time(); } - - void* Get_Current_UserPointer( void ) { return CurrentChild->GetUserPointer(); } - void Set_Current_UserPointer(void* ptr) {CurrentChild->SetUserPointer(ptr);} - // Access the current parent - const char * Get_Current_Parent_Name( void ) { return CurrentParent->Get_Name(); } - int Get_Current_Parent_Total_Calls( void ) { return CurrentParent->Get_Total_Calls(); } - float Get_Current_Parent_Total_Time( void ) { return CurrentParent->Get_Total_Time(); } - - - -protected: - - CProfileNode * CurrentParent; - CProfileNode * CurrentChild; - - - CProfileIterator( CProfileNode * start ); - friend class CProfileManager; -}; - - -///The Manager for the Profile system -class CProfileManager { -public: - static void Start_Profile( const char * name ); - static void Stop_Profile( void ); - - static void CleanupMemory(void) - { - Root.CleanupMemory(); - } - - static void Reset( void ); - static void Increment_Frame_Counter( void ); - static int Get_Frame_Count_Since_Reset( void ) { return FrameCounter; } - static float Get_Time_Since_Reset( void ); - - static CProfileIterator * Get_Iterator( void ) - { - - return new CProfileIterator( &Root ); - } - static void Release_Iterator( CProfileIterator * iterator ) { delete ( iterator); } - - static void dumpRecursive(CProfileIterator* profileIterator, int spacing); - - static void dumpAll(); - -private: - static CProfileNode Root; - static CProfileNode * CurrentNode; - static int FrameCounter; - static unsigned long int ResetTime; -}; - - -///ProfileSampleClass is a simple way to profile a function's scope -///Use the BT_PROFILE macro at the start of scope to time -class CProfileSample { -public: - CProfileSample( const char * name ) - { - CProfileManager::Start_Profile( name ); - } - - ~CProfileSample( void ) - { - CProfileManager::Stop_Profile(); - } -}; - - -#define BT_PROFILE( name ) CProfileSample __profile( name ) - -#else - -#define BT_PROFILE( name ) - -#endif //#ifndef BT_NO_PROFILE - - - -#endif //BT_QUICK_PROF_H - - diff --git a/opencl/parallel_primitives/host/btRandom.h b/opencl/parallel_primitives/host/btRandom.h deleted file mode 100644 index 4cbfc6bfe..000000000 --- a/opencl/parallel_primitives/host/btRandom.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef BT_GEN_RANDOM_H -#define BT_GEN_RANDOM_H - -#ifdef MT19937 - -#include -#include - -#define GEN_RAND_MAX UINT_MAX - -SIMD_FORCE_INLINE void GEN_srand(unsigned int seed) { init_genrand(seed); } -SIMD_FORCE_INLINE unsigned int GEN_rand() { return genrand_int32(); } - -#else - -#include - -#define GEN_RAND_MAX RAND_MAX - -SIMD_FORCE_INLINE void GEN_srand(unsigned int seed) { srand(seed); } -SIMD_FORCE_INLINE unsigned int GEN_rand() { return rand(); } - -#endif - -#endif //BT_GEN_RANDOM_H - diff --git a/opencl/parallel_primitives/host/btScalar.h b/opencl/parallel_primitives/host/btScalar.h deleted file mode 100644 index 3a94054e9..000000000 --- a/opencl/parallel_primitives/host/btScalar.h +++ /dev/null @@ -1,660 +0,0 @@ -/* -Copyright (c) 2003-2009 Erwin Coumans http://bullet.googlecode.com - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef BT_SCALAR_H -#define BT_SCALAR_H - -#ifdef BT_MANAGED_CODE -//Aligned data types not supported in managed code -#pragma unmanaged -#endif - - -#include -#include //size_t for MSVC 6.0 -#include - -/* SVN $Revision$ on $Date$ from http://bullet.googlecode.com*/ -#define BT_BULLET_VERSION 281 - -inline int btGetVersion() -{ - return BT_BULLET_VERSION; -} - -#if defined(DEBUG) || defined (_DEBUG) -#define BT_DEBUG -#endif - - -#ifdef _WIN32 - - #if defined(__MINGW32__) || defined(__CYGWIN__) || (defined (_MSC_VER) && _MSC_VER < 1300) - - #define SIMD_FORCE_INLINE inline - #define ATTRIBUTE_ALIGNED16(a) a - #define ATTRIBUTE_ALIGNED64(a) a - #define ATTRIBUTE_ALIGNED128(a) a - #else - //#define BT_HAS_ALIGNED_ALLOCATOR - #pragma warning(disable : 4324) // disable padding warning -// #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. -// #pragma warning(disable:4996) //Turn off warnings about deprecated C routines -// #pragma warning(disable:4786) // Disable the "debug name too long" warning - - #define SIMD_FORCE_INLINE __forceinline - #define ATTRIBUTE_ALIGNED16(a) __declspec(align(16)) a - #define ATTRIBUTE_ALIGNED64(a) __declspec(align(64)) a - #define ATTRIBUTE_ALIGNED128(a) __declspec (align(128)) a - #ifdef _XBOX - #define BT_USE_VMX128 - - #include - #define BT_HAVE_NATIVE_FSEL - #define btFsel(a,b,c) __fsel((a),(b),(c)) - #else - -#if (defined (_WIN32) && (_MSC_VER) && _MSC_VER >= 1400) && (!defined (BT_USE_DOUBLE_PRECISION)) - #define BT_USE_SSE - #ifdef BT_USE_SSE - //BT_USE_SSE_IN_API is disabled under Windows by default, because - //it makes it harder to integrate Bullet into your application under Windows - //(structured embedding Bullet structs/classes need to be 16-byte aligned) - //with relatively little performance gain - //If you are not embedded Bullet data in your classes, or make sure that you align those classes on 16-byte boundaries - //you can manually enable this line or set it in the build system for a bit of performance gain (a few percent, dependent on usage) - //#define BT_USE_SSE_IN_API - #endif //BT_USE_SSE - #include -#endif - - #endif//_XBOX - - #endif //__MINGW32__ - -#ifdef BT_DEBUG - #ifdef _MSC_VER - #include - #define btAssert(x) { if(!(x)){printf("Assert "__FILE__ ":%u ("#x")\n", __LINE__);__debugbreak(); }} - #else//_MSC_VER - #include - #define btAssert assert - #endif//_MSC_VER -#else - #define btAssert(x) -#endif - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - - #define btLikely(_c) _c - #define btUnlikely(_c) _c - -#else - -#if defined (__CELLOS_LV2__) - #define SIMD_FORCE_INLINE inline __attribute__((always_inline)) - #define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) - #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64))) - #define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) - #ifndef assert - #include - #endif -#ifdef BT_DEBUG -#ifdef __SPU__ -#include -#define printf spu_printf - #define btAssert(x) {if(!(x)){printf("Assert "__FILE__ ":%u ("#x")\n", __LINE__);spu_hcmpeq(0,0);}} -#else - #define btAssert assert -#endif - -#else - #define btAssert(x) -#endif - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - - #define btLikely(_c) _c - #define btUnlikely(_c) _c - -#else - -#ifdef USE_LIBSPE2 - - #define SIMD_FORCE_INLINE __inline - #define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) - #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64))) - #define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) - #ifndef assert - #include - #endif -#ifdef BT_DEBUG - #define btAssert assert -#else - #define btAssert(x) -#endif - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - - - #define btLikely(_c) __builtin_expect((_c), 1) - #define btUnlikely(_c) __builtin_expect((_c), 0) - - -#else - //non-windows systems - -#if (defined (__APPLE__) && (!defined (BT_USE_DOUBLE_PRECISION))) - #if defined (__i386__) || defined (__x86_64__) - #define BT_USE_SSE - //BT_USE_SSE_IN_API is enabled on Mac OSX by default, because memory is automatically aligned on 16-byte boundaries - //if apps run into issues, we will disable the next line - #define BT_USE_SSE_IN_API - #ifdef BT_USE_SSE - // include appropriate SSE level - #if defined (__SSE4_1__) - #include - #elif defined (__SSSE3__) - #include - #elif defined (__SSE3__) - #include - #else - #include - #endif - #endif //BT_USE_SSE - #elif defined( __armv7__ ) - #ifdef __clang__ - #define BT_USE_NEON 1 - - #if defined BT_USE_NEON && defined (__clang__) - #include - #endif//BT_USE_NEON - #endif //__clang__ - #endif//__arm__ - - #define SIMD_FORCE_INLINE inline __attribute__ ((always_inline)) -///@todo: check out alignment methods for other platforms/compilers - #define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) - #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64))) - #define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) - #ifndef assert - #include - #endif - - #if defined(DEBUG) || defined (_DEBUG) - #if defined (__i386__) || defined (__x86_64__) - #include - #define btAssert(x)\ - {\ - if(!(x))\ - {\ - printf("Assert %s in line %d, file %s\n",#x, __LINE__, __FILE__);\ - asm volatile ("int3");\ - }\ - } - #else//defined (__i386__) || defined (__x86_64__) - #define btAssert assert - #endif//defined (__i386__) || defined (__x86_64__) - #else//defined(DEBUG) || defined (_DEBUG) - #define btAssert(x) - #endif//defined(DEBUG) || defined (_DEBUG) - - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - #define btLikely(_c) _c - #define btUnlikely(_c) _c - -#else - - #define SIMD_FORCE_INLINE inline - ///@todo: check out alignment methods for other platforms/compilers - ///#define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) - ///#define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64))) - ///#define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) - #define ATTRIBUTE_ALIGNED16(a) a - #define ATTRIBUTE_ALIGNED64(a) a - #define ATTRIBUTE_ALIGNED128(a) a - #ifndef assert - #include - #endif - -#if defined(DEBUG) || defined (_DEBUG) - #define btAssert assert -#else - #define btAssert(x) -#endif - - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - #define btLikely(_c) _c - #define btUnlikely(_c) _c -#endif //__APPLE__ - -#endif // LIBSPE2 - -#endif //__CELLOS_LV2__ -#endif - - -///The btScalar type abstracts floating point numbers, to easily switch between double and single floating point precision. -#if defined(BT_USE_DOUBLE_PRECISION) -typedef double btScalar; -//this number could be bigger in double precision -#define BT_LARGE_FLOAT 1e30 -#else -typedef float btScalar; -//keep BT_LARGE_FLOAT*BT_LARGE_FLOAT < FLT_MAX -#define BT_LARGE_FLOAT 1e18f -#endif - -#ifdef BT_USE_SSE -typedef __m128 btSimdFloat4; -#endif//BT_USE_SSE - -#if defined BT_USE_SSE_IN_API && defined (BT_USE_SSE) -#ifdef _WIN32 - -#ifndef BT_NAN -static int btNanMask = 0x7F800001; -#define BT_NAN (*(float*)&btNanMask) -#endif - -#ifndef BT_INFINITY -static int btInfinityMask = 0x7F800000; -#define BT_INFINITY (*(float*)&btInfinityMask) -#endif - -inline __m128 operator + (const __m128 A, const __m128 B) -{ - return _mm_add_ps(A, B); -} - -inline __m128 operator - (const __m128 A, const __m128 B) -{ - return _mm_sub_ps(A, B); -} - -inline __m128 operator * (const __m128 A, const __m128 B) -{ - return _mm_mul_ps(A, B); -} - -#define btCastfTo128i(a) (_mm_castps_si128(a)) -#define btCastfTo128d(a) (_mm_castps_pd(a)) -#define btCastiTo128f(a) (_mm_castsi128_ps(a)) -#define btCastdTo128f(a) (_mm_castpd_ps(a)) -#define btCastdTo128i(a) (_mm_castpd_si128(a)) -#define btAssign128(r0,r1,r2,r3) _mm_setr_ps(r0,r1,r2,r3) - -#else//_WIN32 - -#define btCastfTo128i(a) ((__m128i)(a)) -#define btCastfTo128d(a) ((__m128d)(a)) -#define btCastiTo128f(a) ((__m128) (a)) -#define btCastdTo128f(a) ((__m128) (a)) -#define btCastdTo128i(a) ((__m128i)(a)) -#define btAssign128(r0,r1,r2,r3) (__m128){r0,r1,r2,r3} -#define BT_INFINITY INFINITY -#define BT_NAN NAN -#endif//_WIN32 -#endif //BT_USE_SSE_IN_API - -#ifdef BT_USE_NEON -#include - -typedef float32x4_t btSimdFloat4; -#define BT_INFINITY INFINITY -#define BT_NAN NAN -#define btAssign128(r0,r1,r2,r3) (float32x4_t){r0,r1,r2,r3} -#endif - - - - - -#define BT_DECLARE_ALIGNED_ALLOCATOR() \ - SIMD_FORCE_INLINE void* operator new(size_t sizeInBytes) { return btAlignedAlloc(sizeInBytes,16); } \ - SIMD_FORCE_INLINE void operator delete(void* ptr) { btAlignedFree(ptr); } \ - SIMD_FORCE_INLINE void* operator new(size_t, void* ptr) { return ptr; } \ - SIMD_FORCE_INLINE void operator delete(void*, void*) { } \ - SIMD_FORCE_INLINE void* operator new[](size_t sizeInBytes) { return btAlignedAlloc(sizeInBytes,16); } \ - SIMD_FORCE_INLINE void operator delete[](void* ptr) { btAlignedFree(ptr); } \ - SIMD_FORCE_INLINE void* operator new[](size_t, void* ptr) { return ptr; } \ - SIMD_FORCE_INLINE void operator delete[](void*, void*) { } \ - - - -#if defined(BT_USE_DOUBLE_PRECISION) || defined(BT_FORCE_DOUBLE_FUNCTIONS) - -SIMD_FORCE_INLINE btScalar btSqrt(btScalar x) { return sqrt(x); } -SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabs(x); } -SIMD_FORCE_INLINE btScalar btCos(btScalar x) { return cos(x); } -SIMD_FORCE_INLINE btScalar btSin(btScalar x) { return sin(x); } -SIMD_FORCE_INLINE btScalar btTan(btScalar x) { return tan(x); } -SIMD_FORCE_INLINE btScalar btAcos(btScalar x) { if (xbtScalar(1)) x=btScalar(1); return acos(x); } -SIMD_FORCE_INLINE btScalar btAsin(btScalar x) { if (xbtScalar(1)) x=btScalar(1); return asin(x); } -SIMD_FORCE_INLINE btScalar btAtan(btScalar x) { return atan(x); } -SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { return atan2(x, y); } -SIMD_FORCE_INLINE btScalar btExp(btScalar x) { return exp(x); } -SIMD_FORCE_INLINE btScalar btLog(btScalar x) { return log(x); } -SIMD_FORCE_INLINE btScalar btPow(btScalar x,btScalar y) { return pow(x,y); } -SIMD_FORCE_INLINE btScalar btFmod(btScalar x,btScalar y) { return fmod(x,y); } - -#else - -SIMD_FORCE_INLINE btScalar btSqrt(btScalar y) -{ -#ifdef USE_APPROXIMATION - double x, z, tempf; - unsigned long *tfptr = ((unsigned long *)&tempf) + 1; - - tempf = y; - *tfptr = (0xbfcdd90a - *tfptr)>>1; /* estimate of 1/sqrt(y) */ - x = tempf; - z = y*btScalar(0.5); - x = (btScalar(1.5)*x)-(x*x)*(x*z); /* iteration formula */ - x = (btScalar(1.5)*x)-(x*x)*(x*z); - x = (btScalar(1.5)*x)-(x*x)*(x*z); - x = (btScalar(1.5)*x)-(x*x)*(x*z); - x = (btScalar(1.5)*x)-(x*x)*(x*z); - return x*y; -#else - return sqrtf(y); -#endif -} -SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabsf(x); } -SIMD_FORCE_INLINE btScalar btCos(btScalar x) { return cosf(x); } -SIMD_FORCE_INLINE btScalar btSin(btScalar x) { return sinf(x); } -SIMD_FORCE_INLINE btScalar btTan(btScalar x) { return tanf(x); } -SIMD_FORCE_INLINE btScalar btAcos(btScalar x) { - if (xbtScalar(1)) - x=btScalar(1); - return acosf(x); -} -SIMD_FORCE_INLINE btScalar btAsin(btScalar x) { - if (xbtScalar(1)) - x=btScalar(1); - return asinf(x); -} -SIMD_FORCE_INLINE btScalar btAtan(btScalar x) { return atanf(x); } -SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { return atan2f(x, y); } -SIMD_FORCE_INLINE btScalar btExp(btScalar x) { return expf(x); } -SIMD_FORCE_INLINE btScalar btLog(btScalar x) { return logf(x); } -SIMD_FORCE_INLINE btScalar btPow(btScalar x,btScalar y) { return powf(x,y); } -SIMD_FORCE_INLINE btScalar btFmod(btScalar x,btScalar y) { return fmodf(x,y); } - -#endif - -#define SIMD_2_PI btScalar(6.283185307179586232) -#define SIMD_PI (SIMD_2_PI * btScalar(0.5)) -#define SIMD_HALF_PI (SIMD_2_PI * btScalar(0.25)) -#define SIMD_RADS_PER_DEG (SIMD_2_PI / btScalar(360.0)) -#define SIMD_DEGS_PER_RAD (btScalar(360.0) / SIMD_2_PI) -#define SIMDSQRT12 btScalar(0.7071067811865475244008443621048490) - -#define btRecipSqrt(x) ((btScalar)(btScalar(1.0)/btSqrt(btScalar(x)))) /* reciprocal square root */ - - -#ifdef BT_USE_DOUBLE_PRECISION -#define SIMD_EPSILON DBL_EPSILON -#define SIMD_INFINITY DBL_MAX -#else -#define SIMD_EPSILON FLT_EPSILON -#define SIMD_INFINITY FLT_MAX -#endif - -SIMD_FORCE_INLINE btScalar btAtan2Fast(btScalar y, btScalar x) -{ - btScalar coeff_1 = SIMD_PI / 4.0f; - btScalar coeff_2 = 3.0f * coeff_1; - btScalar abs_y = btFabs(y); - btScalar angle; - if (x >= 0.0f) { - btScalar r = (x - abs_y) / (x + abs_y); - angle = coeff_1 - coeff_1 * r; - } else { - btScalar r = (x + abs_y) / (abs_y - x); - angle = coeff_2 - coeff_1 * r; - } - return (y < 0.0f) ? -angle : angle; -} - -SIMD_FORCE_INLINE bool btFuzzyZero(btScalar x) { return btFabs(x) < SIMD_EPSILON; } - -SIMD_FORCE_INLINE bool btEqual(btScalar a, btScalar eps) { - return (((a) <= eps) && !((a) < -eps)); -} -SIMD_FORCE_INLINE bool btGreaterEqual (btScalar a, btScalar eps) { - return (!((a) <= eps)); -} - - -SIMD_FORCE_INLINE int btIsNegative(btScalar x) { - return x < btScalar(0.0) ? 1 : 0; -} - -SIMD_FORCE_INLINE btScalar btRadians(btScalar x) { return x * SIMD_RADS_PER_DEG; } -SIMD_FORCE_INLINE btScalar btDegrees(btScalar x) { return x * SIMD_DEGS_PER_RAD; } - -#define BT_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name - -#ifndef btFsel -SIMD_FORCE_INLINE btScalar btFsel(btScalar a, btScalar b, btScalar c) -{ - return a >= 0 ? b : c; -} -#endif -#define btFsels(a,b,c) (btScalar)btFsel(a,b,c) - - -SIMD_FORCE_INLINE bool btMachineIsLittleEndian() -{ - long int i = 1; - const char *p = (const char *) &i; - if (p[0] == 1) // Lowest address contains the least significant byte - return true; - else - return false; -} - - - -///btSelect avoids branches, which makes performance much better for consoles like Playstation 3 and XBox 360 -///Thanks Phil Knight. See also http://www.cellperformance.com/articles/2006/04/more_techniques_for_eliminatin_1.html -SIMD_FORCE_INLINE unsigned btSelect(unsigned condition, unsigned valueIfConditionNonZero, unsigned valueIfConditionZero) -{ - // Set testNz to 0xFFFFFFFF if condition is nonzero, 0x00000000 if condition is zero - // Rely on positive value or'ed with its negative having sign bit on - // and zero value or'ed with its negative (which is still zero) having sign bit off - // Use arithmetic shift right, shifting the sign bit through all 32 bits - unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31); - unsigned testEqz = ~testNz; - return ((valueIfConditionNonZero & testNz) | (valueIfConditionZero & testEqz)); -} -SIMD_FORCE_INLINE int btSelect(unsigned condition, int valueIfConditionNonZero, int valueIfConditionZero) -{ - unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31); - unsigned testEqz = ~testNz; - return static_cast((valueIfConditionNonZero & testNz) | (valueIfConditionZero & testEqz)); -} -SIMD_FORCE_INLINE float btSelect(unsigned condition, float valueIfConditionNonZero, float valueIfConditionZero) -{ -#ifdef BT_HAVE_NATIVE_FSEL - return (float)btFsel((btScalar)condition - btScalar(1.0f), valueIfConditionNonZero, valueIfConditionZero); -#else - return (condition != 0) ? valueIfConditionNonZero : valueIfConditionZero; -#endif -} - -template SIMD_FORCE_INLINE void btSwap(T& a, T& b) -{ - T tmp = a; - a = b; - b = tmp; -} - - -//PCK: endian swapping functions -SIMD_FORCE_INLINE unsigned btSwapEndian(unsigned val) -{ - return (((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); -} - -SIMD_FORCE_INLINE unsigned short btSwapEndian(unsigned short val) -{ - return static_cast(((val & 0xff00) >> 8) | ((val & 0x00ff) << 8)); -} - -SIMD_FORCE_INLINE unsigned btSwapEndian(int val) -{ - return btSwapEndian((unsigned)val); -} - -SIMD_FORCE_INLINE unsigned short btSwapEndian(short val) -{ - return btSwapEndian((unsigned short) val); -} - -///btSwapFloat uses using char pointers to swap the endianness -////btSwapFloat/btSwapDouble will NOT return a float, because the machine might 'correct' invalid floating point values -///Not all values of sign/exponent/mantissa are valid floating point numbers according to IEEE 754. -///When a floating point unit is faced with an invalid value, it may actually change the value, or worse, throw an exception. -///In most systems, running user mode code, you wouldn't get an exception, but instead the hardware/os/runtime will 'fix' the number for you. -///so instead of returning a float/double, we return integer/long long integer -SIMD_FORCE_INLINE unsigned int btSwapEndianFloat(float d) -{ - unsigned int a = 0; - unsigned char *dst = (unsigned char *)&a; - unsigned char *src = (unsigned char *)&d; - - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - return a; -} - -// unswap using char pointers -SIMD_FORCE_INLINE float btUnswapEndianFloat(unsigned int a) -{ - float d = 0.0f; - unsigned char *src = (unsigned char *)&a; - unsigned char *dst = (unsigned char *)&d; - - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - - return d; -} - - -// swap using char pointers -SIMD_FORCE_INLINE void btSwapEndianDouble(double d, unsigned char* dst) -{ - unsigned char *src = (unsigned char *)&d; - - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; - -} - -// unswap using char pointers -SIMD_FORCE_INLINE double btUnswapEndianDouble(const unsigned char *src) -{ - double d = 0.0; - unsigned char *dst = (unsigned char *)&d; - - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; - - return d; -} - -// returns normalized value in range [-SIMD_PI, SIMD_PI] -SIMD_FORCE_INLINE btScalar btNormalizeAngle(btScalar angleInRadians) -{ - angleInRadians = btFmod(angleInRadians, SIMD_2_PI); - if(angleInRadians < -SIMD_PI) - { - return angleInRadians + SIMD_2_PI; - } - else if(angleInRadians > SIMD_PI) - { - return angleInRadians - SIMD_2_PI; - } - else - { - return angleInRadians; - } -} - -///rudimentary class to provide type info -struct btTypedObject -{ - btTypedObject(int objectType) - :m_objectType(objectType) - { - } - int m_objectType; - inline int getObjectType() const - { - return m_objectType; - } -}; - - - -///align a pointer to the provided alignment, upwards -template T* btAlignPointer(T* unalignedPtr, size_t alignment) -{ - - struct btConvertPointerSizeT - { - union - { - T* ptr; - size_t integer; - }; - }; - btConvertPointerSizeT converter; - - - const size_t bit_mask = ~(alignment - 1); - converter.ptr = unalignedPtr; - converter.integer += alignment-1; - converter.integer &= bit_mask; - return converter.ptr; -} - -#endif //BT_SCALAR_H diff --git a/opencl/parallel_primitives/host/btStackAlloc.h b/opencl/parallel_primitives/host/btStackAlloc.h deleted file mode 100644 index 397b08487..000000000 --- a/opencl/parallel_primitives/host/btStackAlloc.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -/* -StackAlloc extracted from GJK-EPA collision solver by Nathanael Presson -Nov.2006 -*/ - -#ifndef BT_STACK_ALLOC -#define BT_STACK_ALLOC - -#include "btScalar.h" //for btAssert -#include "btAlignedAllocator.h" - -///The btBlock class is an internal structure for the btStackAlloc memory allocator. -struct btBlock -{ - btBlock* previous; - unsigned char* address; -}; - -///The StackAlloc class provides some fast stack-based memory allocator (LIFO last-in first-out) -class btStackAlloc -{ -public: - - btStackAlloc(unsigned int size) { ctor();create(size); } - ~btStackAlloc() { destroy(); } - - inline void create(unsigned int size) - { - destroy(); - data = (unsigned char*) btAlignedAlloc(size,16); - totalsize = size; - } - inline void destroy() - { - btAssert(usedsize==0); - //Raise(L"StackAlloc is still in use"); - - if(usedsize==0) - { - if(!ischild && data) - btAlignedFree(data); - - data = 0; - usedsize = 0; - } - - } - - int getAvailableMemory() const - { - return static_cast(totalsize - usedsize); - } - - unsigned char* allocate(unsigned int size) - { - const unsigned int nus(usedsize+size); - if(nusprevious = current; - pb->address = data+usedsize; - current = pb; - return(pb); - } - SIMD_FORCE_INLINE void endBlock(btBlock* block) - { - btAssert(block==current); - //Raise(L"Unmatched blocks"); - if(block==current) - { - current = block->previous; - usedsize = (unsigned int)((block->address-data)-sizeof(btBlock)); - } - } - -private: - void ctor() - { - data = 0; - totalsize = 0; - usedsize = 0; - current = 0; - ischild = false; - } - unsigned char* data; - unsigned int totalsize; - unsigned int usedsize; - btBlock* current; - bool ischild; -}; - -#endif //BT_STACK_ALLOC diff --git a/opencl/parallel_primitives/host/btTransform.h b/opencl/parallel_primitives/host/btTransform.h deleted file mode 100644 index 907627379..000000000 --- a/opencl/parallel_primitives/host/btTransform.h +++ /dev/null @@ -1,305 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef BT_TRANSFORM_H -#define BT_TRANSFORM_H - - -#include "btMatrix3x3.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btTransformData btTransformDoubleData -#else -#define btTransformData btTransformFloatData -#endif - - - - -/**@brief The btTransform class supports rigid transforms with only translation and rotation and no scaling/shear. - *It can be used in combination with btVector3, btQuaternion and btMatrix3x3 linear algebra classes. */ -ATTRIBUTE_ALIGNED16(class) btTransform { - - ///Storage for the rotation - btMatrix3x3 m_basis; - ///Storage for the translation - btVector3 m_origin; - -public: - - /**@brief No initialization constructor */ - btTransform() {} - /**@brief Constructor from btQuaternion (optional btVector3 ) - * @param q Rotation from quaternion - * @param c Translation from Vector (default 0,0,0) */ - explicit SIMD_FORCE_INLINE btTransform(const btQuaternion& q, - const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0))) - : m_basis(q), - m_origin(c) - {} - - /**@brief Constructor from btMatrix3x3 (optional btVector3) - * @param b Rotation from Matrix - * @param c Translation from Vector default (0,0,0)*/ - explicit SIMD_FORCE_INLINE btTransform(const btMatrix3x3& b, - const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0))) - : m_basis(b), - m_origin(c) - {} - /**@brief Copy constructor */ - SIMD_FORCE_INLINE btTransform (const btTransform& other) - : m_basis(other.m_basis), - m_origin(other.m_origin) - { - } - /**@brief Assignment Operator */ - SIMD_FORCE_INLINE btTransform& operator=(const btTransform& other) - { - m_basis = other.m_basis; - m_origin = other.m_origin; - return *this; - } - - - /**@brief Set the current transform as the value of the product of two transforms - * @param t1 Transform 1 - * @param t2 Transform 2 - * This = Transform1 * Transform2 */ - SIMD_FORCE_INLINE void mult(const btTransform& t1, const btTransform& t2) { - m_basis = t1.m_basis * t2.m_basis; - m_origin = t1(t2.m_origin); - } - -/* void multInverseLeft(const btTransform& t1, const btTransform& t2) { - btVector3 v = t2.m_origin - t1.m_origin; - m_basis = btMultTransposeLeft(t1.m_basis, t2.m_basis); - m_origin = v * t1.m_basis; - } - */ - -/**@brief Return the transform of the vector */ - SIMD_FORCE_INLINE btVector3 operator()(const btVector3& x) const - { - return x.dot3(m_basis[0], m_basis[1], m_basis[2]) + m_origin; - } - - /**@brief Return the transform of the vector */ - SIMD_FORCE_INLINE btVector3 operator*(const btVector3& x) const - { - return (*this)(x); - } - - /**@brief Return the transform of the btQuaternion */ - SIMD_FORCE_INLINE btQuaternion operator*(const btQuaternion& q) const - { - return getRotation() * q; - } - - /**@brief Return the basis matrix for the rotation */ - SIMD_FORCE_INLINE btMatrix3x3& getBasis() { return m_basis; } - /**@brief Return the basis matrix for the rotation */ - SIMD_FORCE_INLINE const btMatrix3x3& getBasis() const { return m_basis; } - - /**@brief Return the origin vector translation */ - SIMD_FORCE_INLINE btVector3& getOrigin() { return m_origin; } - /**@brief Return the origin vector translation */ - SIMD_FORCE_INLINE const btVector3& getOrigin() const { return m_origin; } - - /**@brief Return a quaternion representing the rotation */ - btQuaternion getRotation() const { - btQuaternion q; - m_basis.getRotation(q); - return q; - } - - - /**@brief Set from an array - * @param m A pointer to a 15 element array (12 rotation(row major padded on the right by 1), and 3 translation */ - void setFromOpenGLMatrix(const btScalar *m) - { - m_basis.setFromOpenGLSubMatrix(m); - m_origin.setValue(m[12],m[13],m[14]); - } - - /**@brief Fill an array representation - * @param m A pointer to a 15 element array (12 rotation(row major padded on the right by 1), and 3 translation */ - void getOpenGLMatrix(btScalar *m) const - { - m_basis.getOpenGLSubMatrix(m); - m[12] = m_origin.x(); - m[13] = m_origin.y(); - m[14] = m_origin.z(); - m[15] = btScalar(1.0); - } - - /**@brief Set the translational element - * @param origin The vector to set the translation to */ - SIMD_FORCE_INLINE void setOrigin(const btVector3& origin) - { - m_origin = origin; - } - - SIMD_FORCE_INLINE btVector3 invXform(const btVector3& inVec) const; - - - /**@brief Set the rotational element by btMatrix3x3 */ - SIMD_FORCE_INLINE void setBasis(const btMatrix3x3& basis) - { - m_basis = basis; - } - - /**@brief Set the rotational element by btQuaternion */ - SIMD_FORCE_INLINE void setRotation(const btQuaternion& q) - { - m_basis.setRotation(q); - } - - - /**@brief Set this transformation to the identity */ - void setIdentity() - { - m_basis.setIdentity(); - m_origin.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); - } - - /**@brief Multiply this Transform by another(this = this * another) - * @param t The other transform */ - btTransform& operator*=(const btTransform& t) - { - m_origin += m_basis * t.m_origin; - m_basis *= t.m_basis; - return *this; - } - - /**@brief Return the inverse of this transform */ - btTransform inverse() const - { - btMatrix3x3 inv = m_basis.transpose(); - return btTransform(inv, inv * -m_origin); - } - - /**@brief Return the inverse of this transform times the other transform - * @param t The other transform - * return this.inverse() * the other */ - btTransform inverseTimes(const btTransform& t) const; - - /**@brief Return the product of this transform and the other */ - btTransform operator*(const btTransform& t) const; - - /**@brief Return an identity transform */ - static const btTransform& getIdentity() - { - static const btTransform identityTransform(btMatrix3x3::getIdentity()); - return identityTransform; - } - - void serialize(struct btTransformData& dataOut) const; - - void serializeFloat(struct btTransformFloatData& dataOut) const; - - void deSerialize(const struct btTransformData& dataIn); - - void deSerializeDouble(const struct btTransformDoubleData& dataIn); - - void deSerializeFloat(const struct btTransformFloatData& dataIn); - -}; - - -SIMD_FORCE_INLINE btVector3 -btTransform::invXform(const btVector3& inVec) const -{ - btVector3 v = inVec - m_origin; - return (m_basis.transpose() * v); -} - -SIMD_FORCE_INLINE btTransform -btTransform::inverseTimes(const btTransform& t) const -{ - btVector3 v = t.getOrigin() - m_origin; - return btTransform(m_basis.transposeTimes(t.m_basis), - v * m_basis); -} - -SIMD_FORCE_INLINE btTransform -btTransform::operator*(const btTransform& t) const -{ - return btTransform(m_basis * t.m_basis, - (*this)(t.m_origin)); -} - -/**@brief Test if two transforms have all elements equal */ -SIMD_FORCE_INLINE bool operator==(const btTransform& t1, const btTransform& t2) -{ - return ( t1.getBasis() == t2.getBasis() && - t1.getOrigin() == t2.getOrigin() ); -} - - -///for serialization -struct btTransformFloatData -{ - btMatrix3x3FloatData m_basis; - btVector3FloatData m_origin; -}; - -struct btTransformDoubleData -{ - btMatrix3x3DoubleData m_basis; - btVector3DoubleData m_origin; -}; - - - -SIMD_FORCE_INLINE void btTransform::serialize(btTransformData& dataOut) const -{ - m_basis.serialize(dataOut.m_basis); - m_origin.serialize(dataOut.m_origin); -} - -SIMD_FORCE_INLINE void btTransform::serializeFloat(btTransformFloatData& dataOut) const -{ - m_basis.serializeFloat(dataOut.m_basis); - m_origin.serializeFloat(dataOut.m_origin); -} - - -SIMD_FORCE_INLINE void btTransform::deSerialize(const btTransformData& dataIn) -{ - m_basis.deSerialize(dataIn.m_basis); - m_origin.deSerialize(dataIn.m_origin); -} - -SIMD_FORCE_INLINE void btTransform::deSerializeFloat(const btTransformFloatData& dataIn) -{ - m_basis.deSerializeFloat(dataIn.m_basis); - m_origin.deSerializeFloat(dataIn.m_origin); -} - -SIMD_FORCE_INLINE void btTransform::deSerializeDouble(const btTransformDoubleData& dataIn) -{ - m_basis.deSerializeDouble(dataIn.m_basis); - m_origin.deSerializeDouble(dataIn.m_origin); -} - - -#endif //BT_TRANSFORM_H - - - - - - diff --git a/opencl/parallel_primitives/host/btTransformUtil.h b/opencl/parallel_primitives/host/btTransformUtil.h deleted file mode 100644 index 2303c2742..000000000 --- a/opencl/parallel_primitives/host/btTransformUtil.h +++ /dev/null @@ -1,228 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - -#ifndef BT_TRANSFORM_UTIL_H -#define BT_TRANSFORM_UTIL_H - -#include "btTransform.h" -#define ANGULAR_MOTION_THRESHOLD btScalar(0.5)*SIMD_HALF_PI - - - - -SIMD_FORCE_INLINE btVector3 btAabbSupport(const btVector3& halfExtents,const btVector3& supportDir) -{ - return btVector3(supportDir.x() < btScalar(0.0) ? -halfExtents.x() : halfExtents.x(), - supportDir.y() < btScalar(0.0) ? -halfExtents.y() : halfExtents.y(), - supportDir.z() < btScalar(0.0) ? -halfExtents.z() : halfExtents.z()); -} - - - - - - -/// Utils related to temporal transforms -class btTransformUtil -{ - -public: - - static void integrateTransform(const btTransform& curTrans,const btVector3& linvel,const btVector3& angvel,btScalar timeStep,btTransform& predictedTransform) - { - predictedTransform.setOrigin(curTrans.getOrigin() + linvel * timeStep); -// #define QUATERNION_DERIVATIVE - #ifdef QUATERNION_DERIVATIVE - btQuaternion predictedOrn = curTrans.getRotation(); - predictedOrn += (angvel * predictedOrn) * (timeStep * btScalar(0.5)); - predictedOrn.normalize(); - #else - //Exponential map - //google for "Practical Parameterization of Rotations Using the Exponential Map", F. Sebastian Grassia - - btVector3 axis; - btScalar fAngle = angvel.length(); - //limit the angular motion - if (fAngle*timeStep > ANGULAR_MOTION_THRESHOLD) - { - fAngle = ANGULAR_MOTION_THRESHOLD / timeStep; - } - - if ( fAngle < btScalar(0.001) ) - { - // use Taylor's expansions of sync function - axis = angvel*( btScalar(0.5)*timeStep-(timeStep*timeStep*timeStep)*(btScalar(0.020833333333))*fAngle*fAngle ); - } - else - { - // sync(fAngle) = sin(c*fAngle)/t - axis = angvel*( btSin(btScalar(0.5)*fAngle*timeStep)/fAngle ); - } - btQuaternion dorn (axis.x(),axis.y(),axis.z(),btCos( fAngle*timeStep*btScalar(0.5) )); - btQuaternion orn0 = curTrans.getRotation(); - - btQuaternion predictedOrn = dorn * orn0; - predictedOrn.normalize(); - #endif - predictedTransform.setRotation(predictedOrn); - } - - static void calculateVelocityQuaternion(const btVector3& pos0,const btVector3& pos1,const btQuaternion& orn0,const btQuaternion& orn1,btScalar timeStep,btVector3& linVel,btVector3& angVel) - { - linVel = (pos1 - pos0) / timeStep; - btVector3 axis; - btScalar angle; - if (orn0 != orn1) - { - calculateDiffAxisAngleQuaternion(orn0,orn1,axis,angle); - angVel = axis * angle / timeStep; - } else - { - angVel.setValue(0,0,0); - } - } - - static void calculateDiffAxisAngleQuaternion(const btQuaternion& orn0,const btQuaternion& orn1a,btVector3& axis,btScalar& angle) - { - btQuaternion orn1 = orn0.nearest(orn1a); - btQuaternion dorn = orn1 * orn0.inverse(); - angle = dorn.getAngle(); - axis = btVector3(dorn.x(),dorn.y(),dorn.z()); - axis[3] = btScalar(0.); - //check for axis length - btScalar len = axis.length2(); - if (len < SIMD_EPSILON*SIMD_EPSILON) - axis = btVector3(btScalar(1.),btScalar(0.),btScalar(0.)); - else - axis /= btSqrt(len); - } - - static void calculateVelocity(const btTransform& transform0,const btTransform& transform1,btScalar timeStep,btVector3& linVel,btVector3& angVel) - { - linVel = (transform1.getOrigin() - transform0.getOrigin()) / timeStep; - btVector3 axis; - btScalar angle; - calculateDiffAxisAngle(transform0,transform1,axis,angle); - angVel = axis * angle / timeStep; - } - - static void calculateDiffAxisAngle(const btTransform& transform0,const btTransform& transform1,btVector3& axis,btScalar& angle) - { - btMatrix3x3 dmat = transform1.getBasis() * transform0.getBasis().inverse(); - btQuaternion dorn; - dmat.getRotation(dorn); - - ///floating point inaccuracy can lead to w component > 1..., which breaks - dorn.normalize(); - - angle = dorn.getAngle(); - axis = btVector3(dorn.x(),dorn.y(),dorn.z()); - axis[3] = btScalar(0.); - //check for axis length - btScalar len = axis.length2(); - if (len < SIMD_EPSILON*SIMD_EPSILON) - axis = btVector3(btScalar(1.),btScalar(0.),btScalar(0.)); - else - axis /= btSqrt(len); - } - -}; - - -///The btConvexSeparatingDistanceUtil can help speed up convex collision detection -///by conservatively updating a cached separating distance/vector instead of re-calculating the closest distance -class btConvexSeparatingDistanceUtil -{ - btQuaternion m_ornA; - btQuaternion m_ornB; - btVector3 m_posA; - btVector3 m_posB; - - btVector3 m_separatingNormal; - - btScalar m_boundingRadiusA; - btScalar m_boundingRadiusB; - btScalar m_separatingDistance; - -public: - - btConvexSeparatingDistanceUtil(btScalar boundingRadiusA,btScalar boundingRadiusB) - :m_boundingRadiusA(boundingRadiusA), - m_boundingRadiusB(boundingRadiusB), - m_separatingDistance(0.f) - { - } - - btScalar getConservativeSeparatingDistance() - { - return m_separatingDistance; - } - - void updateSeparatingDistance(const btTransform& transA,const btTransform& transB) - { - const btVector3& toPosA = transA.getOrigin(); - const btVector3& toPosB = transB.getOrigin(); - btQuaternion toOrnA = transA.getRotation(); - btQuaternion toOrnB = transB.getRotation(); - - if (m_separatingDistance>0.f) - { - - - btVector3 linVelA,angVelA,linVelB,angVelB; - btTransformUtil::calculateVelocityQuaternion(m_posA,toPosA,m_ornA,toOrnA,btScalar(1.),linVelA,angVelA); - btTransformUtil::calculateVelocityQuaternion(m_posB,toPosB,m_ornB,toOrnB,btScalar(1.),linVelB,angVelB); - btScalar maxAngularProjectedVelocity = angVelA.length() * m_boundingRadiusA + angVelB.length() * m_boundingRadiusB; - btVector3 relLinVel = (linVelB-linVelA); - btScalar relLinVelocLength = relLinVel.dot(m_separatingNormal); - if (relLinVelocLength<0.f) - { - relLinVelocLength = 0.f; - } - - btScalar projectedMotion = maxAngularProjectedVelocity +relLinVelocLength; - m_separatingDistance -= projectedMotion; - } - - m_posA = toPosA; - m_posB = toPosB; - m_ornA = toOrnA; - m_ornB = toOrnB; - } - - void initSeparatingDistance(const btVector3& separatingVector,btScalar separatingDistance,const btTransform& transA,const btTransform& transB) - { - m_separatingDistance = separatingDistance; - - if (m_separatingDistance>0.f) - { - m_separatingNormal = separatingVector; - - const btVector3& toPosA = transA.getOrigin(); - const btVector3& toPosB = transB.getOrigin(); - btQuaternion toOrnA = transA.getRotation(); - btQuaternion toOrnB = transB.getRotation(); - m_posA = toPosA; - m_posB = toPosB; - m_ornA = toOrnA; - m_ornB = toOrnB; - } - } - -}; - - -#endif //BT_TRANSFORM_UTIL_H - diff --git a/opencl/parallel_primitives/host/btVector3.cpp b/opencl/parallel_primitives/host/btVector3.cpp deleted file mode 100644 index 24bd521a9..000000000 --- a/opencl/parallel_primitives/host/btVector3.cpp +++ /dev/null @@ -1,1631 +0,0 @@ -/* - Copyright (c) 2011 Apple Inc. - http://continuousphysics.com/Bullet/ - - This software is provided 'as-is', without any express or implied warranty. - In no event will the authors be held liable for any damages arising from the use of this software. - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it freely, - subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - This source version has been altered. - */ - -#if defined (_WIN32) || defined (__i386__) -#define BT_USE_SSE_IN_API -#endif - -#include "btVector3.h" - -#if defined (BT_USE_SSE) || defined (BT_USE_NEON) - -#ifdef __APPLE__ -#include -typedef float float4 __attribute__ ((vector_size(16))); -#else -#define float4 __m128 -#endif -//typedef uint32_t uint4 __attribute__ ((vector_size(16))); - - -#if defined BT_USE_SSE || defined _WIN32 - -#define LOG2_ARRAY_SIZE 6 -#define STACK_ARRAY_COUNT (1UL << LOG2_ARRAY_SIZE) - -#include - -long _maxdot_large( const float *vv, const float *vec, unsigned long count, float *dotResult ); -long _maxdot_large( const float *vv, const float *vec, unsigned long count, float *dotResult ) -{ - const float4 *vertices = (const float4*) vv; - static const unsigned char indexTable[16] = {-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; - float4 dotMax = btAssign128( -BT_INFINITY, -BT_INFINITY, -BT_INFINITY, -BT_INFINITY ); - float4 vvec = _mm_loadu_ps( vec ); - float4 vHi = btCastiTo128f(_mm_shuffle_epi32( btCastfTo128i( vvec), 0xaa )); /// zzzz - float4 vLo = _mm_movelh_ps( vvec, vvec ); /// xyxy - - long maxIndex = -1L; - - size_t segment = 0; - float4 stack_array[ STACK_ARRAY_COUNT ]; - -#if DEBUG - memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) ); -#endif - - size_t index; - float4 max; - // Faster loop without cleanup code for full tiles - for ( segment = 0; segment + STACK_ARRAY_COUNT*4 <= count; segment += STACK_ARRAY_COUNT*4 ) - { - max = dotMax; - - for( index = 0; index < STACK_ARRAY_COUNT; index+= 4 ) - { // do four dot products at a time. Carefully avoid touching the w element. - float4 v0 = vertices[0]; - float4 v1 = vertices[1]; - float4 v2 = vertices[2]; - float4 v3 = vertices[3]; vertices += 4; - - float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - float4 z = _mm_shuffle_ps(hi0, hi1, 0x88); - float4 x = _mm_shuffle_ps(lo0, lo1, 0x88); - float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index] = x; - max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+1] = x; - max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+2] = x; - max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+3] = x; - max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan - - // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way. - } - - // If we found a new max - if( 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(max, dotMax))) - { - // copy the new max across all lanes of our max accumulator - max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0x4e)); - max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0xb1)); - - dotMax = max; - - // find first occurrence of that max - size_t test; - for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], max))); index++ ) // local_count must be a multiple of 4 - {} - // record where it is. - maxIndex = 4*index + segment + indexTable[test]; - } - } - - // account for work we've already done - count -= segment; - - // Deal with the last < STACK_ARRAY_COUNT vectors - max = dotMax; - index = 0; - - - if( btUnlikely( count > 16) ) - { - for( ; index + 4 <= count / 4; index+=4 ) - { // do four dot products at a time. Carefully avoid touching the w element. - float4 v0 = vertices[0]; - float4 v1 = vertices[1]; - float4 v2 = vertices[2]; - float4 v3 = vertices[3]; vertices += 4; - - float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - float4 z = _mm_shuffle_ps(hi0, hi1, 0x88); - float4 x = _mm_shuffle_ps(lo0, lo1, 0x88); - float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index] = x; - max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+1] = x; - max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+2] = x; - max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+3] = x; - max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan - - // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way. - } - } - - size_t localCount = (count & -4L) - 4*index; - if( localCount ) - { -#ifdef __APPLE__ - float4 t0, t1, t2, t3, t4; - float4 * sap = &stack_array[index + localCount / 4]; - vertices += localCount; // counter the offset - size_t byteIndex = -(localCount) * sizeof(float); - //AT&T Code style assembly - asm volatile - ( ".align 4 \n\ - 0: movaps %[max], %[t2] // move max out of the way to avoid propagating NaNs in max \n\ - movaps (%[vertices], %[byteIndex], 4), %[t0] // vertices[0] \n\ - movaps 16(%[vertices], %[byteIndex], 4), %[t1] // vertices[1] \n\ - movaps %[t0], %[max] // vertices[0] \n\ - movlhps %[t1], %[max] // x0y0x1y1 \n\ - movaps 32(%[vertices], %[byteIndex], 4), %[t3] // vertices[2] \n\ - movaps 48(%[vertices], %[byteIndex], 4), %[t4] // vertices[3] \n\ - mulps %[vLo], %[max] // x0y0x1y1 * vLo \n\ - movhlps %[t0], %[t1] // z0w0z1w1 \n\ - movaps %[t3], %[t0] // vertices[2] \n\ - movlhps %[t4], %[t0] // x2y2x3y3 \n\ - mulps %[vLo], %[t0] // x2y2x3y3 * vLo \n\ - movhlps %[t3], %[t4] // z2w2z3w3 \n\ - shufps $0x88, %[t4], %[t1] // z0z1z2z3 \n\ - mulps %[vHi], %[t1] // z0z1z2z3 * vHi \n\ - movaps %[max], %[t3] // x0y0x1y1 * vLo \n\ - shufps $0x88, %[t0], %[max] // x0x1x2x3 * vLo.x \n\ - shufps $0xdd, %[t0], %[t3] // y0y1y2y3 * vLo.y \n\ - addps %[t3], %[max] // x + y \n\ - addps %[t1], %[max] // x + y + z \n\ - movaps %[max], (%[sap], %[byteIndex]) // record result for later scrutiny \n\ - maxps %[t2], %[max] // record max, restore max \n\ - add $16, %[byteIndex] // advance loop counter\n\ - jnz 0b \n\ - " - : [max] "+x" (max), [t0] "=&x" (t0), [t1] "=&x" (t1), [t2] "=&x" (t2), [t3] "=&x" (t3), [t4] "=&x" (t4), [byteIndex] "+r" (byteIndex) - : [vLo] "x" (vLo), [vHi] "x" (vHi), [vertices] "r" (vertices), [sap] "r" (sap) - : "memory", "cc" - ); - index += localCount/4; -#else - { - for( unsigned int i=0; i 16) ) - { - for( ; index + 4 <= count / 4; index+=4 ) - { // do four dot products at a time. Carefully avoid touching the w element. - float4 v0 = vertices[0]; - float4 v1 = vertices[1]; - float4 v2 = vertices[2]; - float4 v3 = vertices[3]; vertices += 4; - - float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - float4 z = _mm_shuffle_ps(hi0, hi1, 0x88); - float4 x = _mm_shuffle_ps(lo0, lo1, 0x88); - float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index] = x; - min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+1] = x; - min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+2] = x; - min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan - - v0 = vertices[0]; - v1 = vertices[1]; - v2 = vertices[2]; - v3 = vertices[3]; vertices += 4; - - lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1 - hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1 - lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3 - hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3 - - lo0 = lo0*vLo; - lo1 = lo1*vLo; - z = _mm_shuffle_ps(hi0, hi1, 0x88); - x = _mm_shuffle_ps(lo0, lo1, 0x88); - y = _mm_shuffle_ps(lo0, lo1, 0xdd); - z = z*vHi; - x = x+y; - x = x+z; - stack_array[index+3] = x; - min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan - - // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way. - } - } - - size_t localCount = (count & -4L) - 4*index; - if( localCount ) - { - - -#ifdef __APPLE__ - vertices += localCount; // counter the offset - float4 t0, t1, t2, t3, t4; - size_t byteIndex = -(localCount) * sizeof(float); - float4 * sap = &stack_array[index + localCount / 4]; - - asm volatile - ( ".align 4 \n\ - 0: movaps %[min], %[t2] // move min out of the way to avoid propagating NaNs in min \n\ - movaps (%[vertices], %[byteIndex], 4), %[t0] // vertices[0] \n\ - movaps 16(%[vertices], %[byteIndex], 4), %[t1] // vertices[1] \n\ - movaps %[t0], %[min] // vertices[0] \n\ - movlhps %[t1], %[min] // x0y0x1y1 \n\ - movaps 32(%[vertices], %[byteIndex], 4), %[t3] // vertices[2] \n\ - movaps 48(%[vertices], %[byteIndex], 4), %[t4] // vertices[3] \n\ - mulps %[vLo], %[min] // x0y0x1y1 * vLo \n\ - movhlps %[t0], %[t1] // z0w0z1w1 \n\ - movaps %[t3], %[t0] // vertices[2] \n\ - movlhps %[t4], %[t0] // x2y2x3y3 \n\ - movhlps %[t3], %[t4] // z2w2z3w3 \n\ - mulps %[vLo], %[t0] // x2y2x3y3 * vLo \n\ - shufps $0x88, %[t4], %[t1] // z0z1z2z3 \n\ - mulps %[vHi], %[t1] // z0z1z2z3 * vHi \n\ - movaps %[min], %[t3] // x0y0x1y1 * vLo \n\ - shufps $0x88, %[t0], %[min] // x0x1x2x3 * vLo.x \n\ - shufps $0xdd, %[t0], %[t3] // y0y1y2y3 * vLo.y \n\ - addps %[t3], %[min] // x + y \n\ - addps %[t1], %[min] // x + y + z \n\ - movaps %[min], (%[sap], %[byteIndex]) // record result for later scrutiny \n\ - minps %[t2], %[min] // record min, restore min \n\ - add $16, %[byteIndex] // advance loop counter\n\ - jnz 0b \n\ - " - : [min] "+x" (min), [t0] "=&x" (t0), [t1] "=&x" (t1), [t2] "=&x" (t2), [t3] "=&x" (t3), [t4] "=&x" (t4), [byteIndex] "+r" (byteIndex) - : [vLo] "x" (vLo), [vHi] "x" (vHi), [vertices] "r" (vertices), [sap] "r" (sap) - : "memory", "cc" - ); - index += localCount/4; -#else - { - for( unsigned int i=0; i - - -static long _maxdot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult ); -static long _maxdot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult ); -static long _maxdot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult ); -static long _mindot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult ); -static long _mindot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult ); -static long _mindot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult ); - -long (*_maxdot_large)( const float *vv, const float *vec, unsigned long count, float *dotResult ) = _maxdot_large_sel; -long (*_mindot_large)( const float *vv, const float *vec, unsigned long count, float *dotResult ) = _mindot_large_sel; - -extern "C" {int _get_cpu_capabilities( void );} - -static long _maxdot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult ) -{ - if( _get_cpu_capabilities() & 0x2000 ) - _maxdot_large = _maxdot_large_v1; - else - _maxdot_large = _maxdot_large_v0; - - return _maxdot_large(vv, vec, count, dotResult); -} - -static long _mindot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult ) -{ - if( _get_cpu_capabilities() & 0x2000 ) - _mindot_large = _mindot_large_v1; - else - _mindot_large = _mindot_large_v0; - - return _mindot_large(vv, vec, count, dotResult); -} - - - -#define vld1q_f32_aligned_postincrement( _ptr ) ({ float32x4_t _r; asm( "vld1.f32 {%0}, [%1, :128]!\n" : "=w" (_r), "+r" (_ptr) ); /*return*/ _r; }) - - -long _maxdot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult ) -{ - unsigned long i = 0; - float32x4_t vvec = vld1q_f32_aligned_postincrement( vec ); - float32x2_t vLo = vget_low_f32(vvec); - float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0); - float32x2_t dotMaxLo = (float32x2_t) { -BT_INFINITY, -BT_INFINITY }; - float32x2_t dotMaxHi = (float32x2_t) { -BT_INFINITY, -BT_INFINITY }; - uint32x2_t indexLo = (uint32x2_t) {0, 1}; - uint32x2_t indexHi = (uint32x2_t) {2, 3}; - uint32x2_t iLo = (uint32x2_t) {-1, -1}; - uint32x2_t iHi = (uint32x2_t) {-1, -1}; - const uint32x2_t four = (uint32x2_t) {4,4}; - - for( ; i+8 <= count; i+= 8 ) - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v3 = vld1q_f32_aligned_postincrement( vv ); - - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo); - float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo); - float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo); - - float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3)); - float32x2_t zLo = vmul_f32( z0.val[0], vHi); - float32x2_t zHi = vmul_f32( z1.val[0], vHi); - - float32x2_t rLo = vpadd_f32( xy0, xy1); - float32x2_t rHi = vpadd_f32( xy2, xy3); - rLo = vadd_f32(rLo, zLo); - rHi = vadd_f32(rHi, zHi); - - uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo ); - uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi ); - dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo); - dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi); - iLo = vbsl_u32(maskLo, indexLo, iLo); - iHi = vbsl_u32(maskHi, indexHi, iHi); - indexLo = vadd_u32(indexLo, four); - indexHi = vadd_u32(indexHi, four); - - v0 = vld1q_f32_aligned_postincrement( vv ); - v1 = vld1q_f32_aligned_postincrement( vv ); - v2 = vld1q_f32_aligned_postincrement( vv ); - v3 = vld1q_f32_aligned_postincrement( vv ); - - xy0 = vmul_f32( vget_low_f32(v0), vLo); - xy1 = vmul_f32( vget_low_f32(v1), vLo); - xy2 = vmul_f32( vget_low_f32(v2), vLo); - xy3 = vmul_f32( vget_low_f32(v3), vLo); - - z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3)); - zLo = vmul_f32( z0.val[0], vHi); - zHi = vmul_f32( z1.val[0], vHi); - - rLo = vpadd_f32( xy0, xy1); - rHi = vpadd_f32( xy2, xy3); - rLo = vadd_f32(rLo, zLo); - rHi = vadd_f32(rHi, zHi); - - maskLo = vcgt_f32( rLo, dotMaxLo ); - maskHi = vcgt_f32( rHi, dotMaxHi ); - dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo); - dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi); - iLo = vbsl_u32(maskLo, indexLo, iLo); - iHi = vbsl_u32(maskHi, indexHi, iHi); - indexLo = vadd_u32(indexLo, four); - indexHi = vadd_u32(indexHi, four); - } - - for( ; i+4 <= count; i+= 4 ) - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v3 = vld1q_f32_aligned_postincrement( vv ); - - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo); - float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo); - float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo); - - float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3)); - float32x2_t zLo = vmul_f32( z0.val[0], vHi); - float32x2_t zHi = vmul_f32( z1.val[0], vHi); - - float32x2_t rLo = vpadd_f32( xy0, xy1); - float32x2_t rHi = vpadd_f32( xy2, xy3); - rLo = vadd_f32(rLo, zLo); - rHi = vadd_f32(rHi, zHi); - - uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo ); - uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi ); - dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo); - dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi); - iLo = vbsl_u32(maskLo, indexLo, iLo); - iHi = vbsl_u32(maskHi, indexHi, iHi); - indexLo = vadd_u32(indexLo, four); - indexHi = vadd_u32(indexHi, four); - } - - switch( count & 3 ) - { - case 3: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo); - float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo); - - float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x2_t zLo = vmul_f32( z0.val[0], vHi); - float32x2_t zHi = vmul_f32( vdup_lane_f32(vget_high_f32(v2), 0), vHi); - - float32x2_t rLo = vpadd_f32( xy0, xy1); - float32x2_t rHi = vpadd_f32( xy2, xy2); - rLo = vadd_f32(rLo, zLo); - rHi = vadd_f32(rHi, zHi); - - uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo ); - uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi ); - dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo); - dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi); - iLo = vbsl_u32(maskLo, indexLo, iLo); - iHi = vbsl_u32(maskHi, indexHi, iHi); - } - break; - case 2: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo); - - float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x2_t zLo = vmul_f32( z0.val[0], vHi); - - float32x2_t rLo = vpadd_f32( xy0, xy1); - rLo = vadd_f32(rLo, zLo); - - uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo ); - dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo); - iLo = vbsl_u32(maskLo, indexLo, iLo); - } - break; - case 1: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0); - float32x2_t zLo = vmul_f32( z0, vHi); - float32x2_t rLo = vpadd_f32( xy0, xy0); - rLo = vadd_f32(rLo, zLo); - uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo ); - dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo); - iLo = vbsl_u32(maskLo, indexLo, iLo); - } - break; - - default: - break; - } - - // select best answer between hi and lo results - uint32x2_t mask = vcgt_f32( dotMaxHi, dotMaxLo ); - dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo); - iLo = vbsl_u32(mask, iHi, iLo); - - // select best answer between even and odd results - dotMaxHi = vdup_lane_f32(dotMaxLo, 1); - iHi = vdup_lane_u32(iLo, 1); - mask = vcgt_f32( dotMaxHi, dotMaxLo ); - dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo); - iLo = vbsl_u32(mask, iHi, iLo); - - *dotResult = vget_lane_f32( dotMaxLo, 0); - return vget_lane_u32(iLo, 0); -} - - -long _maxdot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult ) -{ - float32x4_t vvec = vld1q_f32_aligned_postincrement( vec ); - float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec)); - float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0); - const uint32x4_t four = (uint32x4_t){ 4, 4, 4, 4 }; - uint32x4_t local_index = (uint32x4_t) {0, 1, 2, 3}; - uint32x4_t index = (uint32x4_t) { -1, -1, -1, -1 }; - float32x4_t maxDot = (float32x4_t) { -BT_INFINITY, -BT_INFINITY, -BT_INFINITY, -BT_INFINITY }; - - unsigned long i = 0; - for( ; i + 8 <= count; i += 8 ) - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v3 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3)); - - xy0 = vmulq_f32(xy0, vLo); - xy1 = vmulq_f32(xy1, vLo); - - float32x4x2_t zb = vuzpq_f32( z0, z1); - float32x4_t z = vmulq_f32( zb.val[0], vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy1); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcgtq_f32(x, maxDot); - maxDot = vbslq_f32( mask, x, maxDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - - v0 = vld1q_f32_aligned_postincrement( vv ); - v1 = vld1q_f32_aligned_postincrement( vv ); - v2 = vld1q_f32_aligned_postincrement( vv ); - v3 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3)); - // the next two lines should resolve to a single vswp d, d - z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3)); - - xy0 = vmulq_f32(xy0, vLo); - xy1 = vmulq_f32(xy1, vLo); - - zb = vuzpq_f32( z0, z1); - z = vmulq_f32( zb.val[0], vHi); - xy = vuzpq_f32( xy0, xy1); - x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - mask = vcgtq_f32(x, maxDot); - maxDot = vbslq_f32( mask, x, maxDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - - for( ; i + 4 <= count; i += 4 ) - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v3 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3)); - - xy0 = vmulq_f32(xy0, vLo); - xy1 = vmulq_f32(xy1, vLo); - - float32x4x2_t zb = vuzpq_f32( z0, z1); - float32x4_t z = vmulq_f32( zb.val[0], vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy1); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcgtq_f32(x, maxDot); - maxDot = vbslq_f32( mask, x, maxDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - - switch (count & 3) { - case 3: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v2)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v2)); - - xy0 = vmulq_f32(xy0, vLo); - xy1 = vmulq_f32(xy1, vLo); - - float32x4x2_t zb = vuzpq_f32( z0, z1); - float32x4_t z = vmulq_f32( zb.val[0], vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy1); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcgtq_f32(x, maxDot); - maxDot = vbslq_f32( mask, x, maxDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - break; - - case 2: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - - xy0 = vmulq_f32(xy0, vLo); - - float32x4x2_t zb = vuzpq_f32( z0, z0); - float32x4_t z = vmulq_f32( zb.val[0], vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy0); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcgtq_f32(x, maxDot); - maxDot = vbslq_f32( mask, x, maxDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - break; - - case 1: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v0)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0); - - xy0 = vmulq_f32(xy0, vLo); - - z = vmulq_f32( z, vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy0); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcgtq_f32(x, maxDot); - maxDot = vbslq_f32( mask, x, maxDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - break; - - default: - break; - } - - - // select best answer between hi and lo results - uint32x2_t mask = vcgt_f32( vget_high_f32(maxDot), vget_low_f32(maxDot)); - float32x2_t maxDot2 = vbsl_f32(mask, vget_high_f32(maxDot), vget_low_f32(maxDot)); - uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index)); - - // select best answer between even and odd results - float32x2_t maxDotO = vdup_lane_f32(maxDot2, 1); - uint32x2_t indexHi = vdup_lane_u32(index2, 1); - mask = vcgt_f32( maxDotO, maxDot2 ); - maxDot2 = vbsl_f32(mask, maxDotO, maxDot2); - index2 = vbsl_u32(mask, indexHi, index2); - - *dotResult = vget_lane_f32( maxDot2, 0); - return vget_lane_u32(index2, 0); - -} - -long _mindot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult ) -{ - unsigned long i = 0; - float32x4_t vvec = vld1q_f32_aligned_postincrement( vec ); - float32x2_t vLo = vget_low_f32(vvec); - float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0); - float32x2_t dotMinLo = (float32x2_t) { BT_INFINITY, BT_INFINITY }; - float32x2_t dotMinHi = (float32x2_t) { BT_INFINITY, BT_INFINITY }; - uint32x2_t indexLo = (uint32x2_t) {0, 1}; - uint32x2_t indexHi = (uint32x2_t) {2, 3}; - uint32x2_t iLo = (uint32x2_t) {-1, -1}; - uint32x2_t iHi = (uint32x2_t) {-1, -1}; - const uint32x2_t four = (uint32x2_t) {4,4}; - - for( ; i+8 <= count; i+= 8 ) - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v3 = vld1q_f32_aligned_postincrement( vv ); - - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo); - float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo); - float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo); - - float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3)); - float32x2_t zLo = vmul_f32( z0.val[0], vHi); - float32x2_t zHi = vmul_f32( z1.val[0], vHi); - - float32x2_t rLo = vpadd_f32( xy0, xy1); - float32x2_t rHi = vpadd_f32( xy2, xy3); - rLo = vadd_f32(rLo, zLo); - rHi = vadd_f32(rHi, zHi); - - uint32x2_t maskLo = vclt_f32( rLo, dotMinLo ); - uint32x2_t maskHi = vclt_f32( rHi, dotMinHi ); - dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo); - dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi); - iLo = vbsl_u32(maskLo, indexLo, iLo); - iHi = vbsl_u32(maskHi, indexHi, iHi); - indexLo = vadd_u32(indexLo, four); - indexHi = vadd_u32(indexHi, four); - - v0 = vld1q_f32_aligned_postincrement( vv ); - v1 = vld1q_f32_aligned_postincrement( vv ); - v2 = vld1q_f32_aligned_postincrement( vv ); - v3 = vld1q_f32_aligned_postincrement( vv ); - - xy0 = vmul_f32( vget_low_f32(v0), vLo); - xy1 = vmul_f32( vget_low_f32(v1), vLo); - xy2 = vmul_f32( vget_low_f32(v2), vLo); - xy3 = vmul_f32( vget_low_f32(v3), vLo); - - z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3)); - zLo = vmul_f32( z0.val[0], vHi); - zHi = vmul_f32( z1.val[0], vHi); - - rLo = vpadd_f32( xy0, xy1); - rHi = vpadd_f32( xy2, xy3); - rLo = vadd_f32(rLo, zLo); - rHi = vadd_f32(rHi, zHi); - - maskLo = vclt_f32( rLo, dotMinLo ); - maskHi = vclt_f32( rHi, dotMinHi ); - dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo); - dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi); - iLo = vbsl_u32(maskLo, indexLo, iLo); - iHi = vbsl_u32(maskHi, indexHi, iHi); - indexLo = vadd_u32(indexLo, four); - indexHi = vadd_u32(indexHi, four); - } - - for( ; i+4 <= count; i+= 4 ) - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v3 = vld1q_f32_aligned_postincrement( vv ); - - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo); - float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo); - float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo); - - float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3)); - float32x2_t zLo = vmul_f32( z0.val[0], vHi); - float32x2_t zHi = vmul_f32( z1.val[0], vHi); - - float32x2_t rLo = vpadd_f32( xy0, xy1); - float32x2_t rHi = vpadd_f32( xy2, xy3); - rLo = vadd_f32(rLo, zLo); - rHi = vadd_f32(rHi, zHi); - - uint32x2_t maskLo = vclt_f32( rLo, dotMinLo ); - uint32x2_t maskHi = vclt_f32( rHi, dotMinHi ); - dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo); - dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi); - iLo = vbsl_u32(maskLo, indexLo, iLo); - iHi = vbsl_u32(maskHi, indexHi, iHi); - indexLo = vadd_u32(indexLo, four); - indexHi = vadd_u32(indexHi, four); - } - switch( count & 3 ) - { - case 3: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo); - float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo); - - float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x2_t zLo = vmul_f32( z0.val[0], vHi); - float32x2_t zHi = vmul_f32( vdup_lane_f32(vget_high_f32(v2), 0), vHi); - - float32x2_t rLo = vpadd_f32( xy0, xy1); - float32x2_t rHi = vpadd_f32( xy2, xy2); - rLo = vadd_f32(rLo, zLo); - rHi = vadd_f32(rHi, zHi); - - uint32x2_t maskLo = vclt_f32( rLo, dotMinLo ); - uint32x2_t maskHi = vclt_f32( rHi, dotMinHi ); - dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo); - dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi); - iLo = vbsl_u32(maskLo, indexLo, iLo); - iHi = vbsl_u32(maskHi, indexHi, iHi); - } - break; - case 2: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo); - - float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x2_t zLo = vmul_f32( z0.val[0], vHi); - - float32x2_t rLo = vpadd_f32( xy0, xy1); - rLo = vadd_f32(rLo, zLo); - - uint32x2_t maskLo = vclt_f32( rLo, dotMinLo ); - dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo); - iLo = vbsl_u32(maskLo, indexLo, iLo); - } - break; - case 1: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo); - float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0); - float32x2_t zLo = vmul_f32( z0, vHi); - float32x2_t rLo = vpadd_f32( xy0, xy0); - rLo = vadd_f32(rLo, zLo); - uint32x2_t maskLo = vclt_f32( rLo, dotMinLo ); - dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo); - iLo = vbsl_u32(maskLo, indexLo, iLo); - } - break; - - default: - break; - } - - // select best answer between hi and lo results - uint32x2_t mask = vclt_f32( dotMinHi, dotMinLo ); - dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo); - iLo = vbsl_u32(mask, iHi, iLo); - - // select best answer between even and odd results - dotMinHi = vdup_lane_f32(dotMinLo, 1); - iHi = vdup_lane_u32(iLo, 1); - mask = vclt_f32( dotMinHi, dotMinLo ); - dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo); - iLo = vbsl_u32(mask, iHi, iLo); - - *dotResult = vget_lane_f32( dotMinLo, 0); - return vget_lane_u32(iLo, 0); -} - -long _mindot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult ) -{ - float32x4_t vvec = vld1q_f32_aligned_postincrement( vec ); - float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec)); - float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0); - const uint32x4_t four = (uint32x4_t){ 4, 4, 4, 4 }; - uint32x4_t local_index = (uint32x4_t) {0, 1, 2, 3}; - uint32x4_t index = (uint32x4_t) { -1, -1, -1, -1 }; - float32x4_t minDot = (float32x4_t) { BT_INFINITY, BT_INFINITY, BT_INFINITY, BT_INFINITY }; - - unsigned long i = 0; - for( ; i + 8 <= count; i += 8 ) - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v3 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3)); - - xy0 = vmulq_f32(xy0, vLo); - xy1 = vmulq_f32(xy1, vLo); - - float32x4x2_t zb = vuzpq_f32( z0, z1); - float32x4_t z = vmulq_f32( zb.val[0], vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy1); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcltq_f32(x, minDot); - minDot = vbslq_f32( mask, x, minDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - - v0 = vld1q_f32_aligned_postincrement( vv ); - v1 = vld1q_f32_aligned_postincrement( vv ); - v2 = vld1q_f32_aligned_postincrement( vv ); - v3 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3)); - // the next two lines should resolve to a single vswp d, d - z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3)); - - xy0 = vmulq_f32(xy0, vLo); - xy1 = vmulq_f32(xy1, vLo); - - zb = vuzpq_f32( z0, z1); - z = vmulq_f32( zb.val[0], vHi); - xy = vuzpq_f32( xy0, xy1); - x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - mask = vcltq_f32(x, minDot); - minDot = vbslq_f32( mask, x, minDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - - for( ; i + 4 <= count; i += 4 ) - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v3 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3)); - - xy0 = vmulq_f32(xy0, vLo); - xy1 = vmulq_f32(xy1, vLo); - - float32x4x2_t zb = vuzpq_f32( z0, z1); - float32x4_t z = vmulq_f32( zb.val[0], vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy1); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcltq_f32(x, minDot); - minDot = vbslq_f32( mask, x, minDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - - switch (count & 3) { - case 3: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v2 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v2)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v2)); - - xy0 = vmulq_f32(xy0, vLo); - xy1 = vmulq_f32(xy1, vLo); - - float32x4x2_t zb = vuzpq_f32( z0, z1); - float32x4_t z = vmulq_f32( zb.val[0], vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy1); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcltq_f32(x, minDot); - minDot = vbslq_f32( mask, x, minDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - break; - - case 2: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - float32x4_t v1 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1)); - - xy0 = vmulq_f32(xy0, vLo); - - float32x4x2_t zb = vuzpq_f32( z0, z0); - float32x4_t z = vmulq_f32( zb.val[0], vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy0); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcltq_f32(x, minDot); - minDot = vbslq_f32( mask, x, minDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - break; - - case 1: - { - float32x4_t v0 = vld1q_f32_aligned_postincrement( vv ); - - // the next two lines should resolve to a single vswp d, d - float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v0)); - // the next two lines should resolve to a single vswp d, d - float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0); - - xy0 = vmulq_f32(xy0, vLo); - - z = vmulq_f32( z, vHi); - float32x4x2_t xy = vuzpq_f32( xy0, xy0); - float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]); - x = vaddq_f32(x, z); - - uint32x4_t mask = vcltq_f32(x, minDot); - minDot = vbslq_f32( mask, x, minDot); - index = vbslq_u32(mask, local_index, index); - local_index = vaddq_u32(local_index, four); - } - break; - - default: - break; - } - - - // select best answer between hi and lo results - uint32x2_t mask = vclt_f32( vget_high_f32(minDot), vget_low_f32(minDot)); - float32x2_t minDot2 = vbsl_f32(mask, vget_high_f32(minDot), vget_low_f32(minDot)); - uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index)); - - // select best answer between even and odd results - float32x2_t minDotO = vdup_lane_f32(minDot2, 1); - uint32x2_t indexHi = vdup_lane_u32(index2, 1); - mask = vclt_f32( minDotO, minDot2 ); - minDot2 = vbsl_f32(mask, minDotO, minDot2); - index2 = vbsl_u32(mask, indexHi, index2); - - *dotResult = vget_lane_f32( minDot2, 0); - return vget_lane_u32(index2, 0); - -} - -#else - #error Unhandled __APPLE__ arch -#endif - -#endif /* __APPLE__ */ - - diff --git a/opencl/parallel_primitives/host/btVector3.h b/opencl/parallel_primitives/host/btVector3.h deleted file mode 100644 index 5001dfa9f..000000000 --- a/opencl/parallel_primitives/host/btVector3.h +++ /dev/null @@ -1,1343 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef BT_VECTOR3_H -#define BT_VECTOR3_H - -//#include -#include "btScalar.h" -#include "btMinMax.h" -#include "btAlignedAllocator.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btVector3Data btVector3DoubleData -#define btVector3DataName "btVector3DoubleData" -#else -#define btVector3Data btVector3FloatData -#define btVector3DataName "btVector3FloatData" -#endif //BT_USE_DOUBLE_PRECISION - -#if defined BT_USE_SSE - -//typedef uint32_t __m128i __attribute__ ((vector_size(16))); - -#ifdef _MSC_VER -#pragma warning(disable: 4556) // value of intrinsic immediate argument '4294967239' is out of range '0 - 255' -#endif - - -#define BT_SHUFFLE(x,y,z,w) ((w)<<6 | (z)<<4 | (y)<<2 | (x)) -//#define bt_pshufd_ps( _a, _mask ) (__m128) _mm_shuffle_epi32((__m128i)(_a), (_mask) ) -#define bt_pshufd_ps( _a, _mask ) _mm_shuffle_ps((_a), (_a), (_mask) ) -#define bt_splat3_ps( _a, _i ) bt_pshufd_ps((_a), BT_SHUFFLE(_i,_i,_i, 3) ) -#define bt_splat_ps( _a, _i ) bt_pshufd_ps((_a), BT_SHUFFLE(_i,_i,_i,_i) ) - -#define btv3AbsiMask (_mm_set_epi32(0x00000000, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF)) -#define btvAbsMask (_mm_set_epi32( 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF)) -#define btvFFF0Mask (_mm_set_epi32(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) -#define btv3AbsfMask btCastiTo128f(btv3AbsiMask) -#define btvFFF0fMask btCastiTo128f(btvFFF0Mask) -#define btvxyzMaskf btvFFF0fMask -#define btvAbsfMask btCastiTo128f(btvAbsMask) - - - -const __m128 ATTRIBUTE_ALIGNED16(btvMzeroMask) = {-0.0f, -0.0f, -0.0f, -0.0f}; -const __m128 ATTRIBUTE_ALIGNED16(v1110) = {1.0f, 1.0f, 1.0f, 0.0f}; -const __m128 ATTRIBUTE_ALIGNED16(vHalf) = {0.5f, 0.5f, 0.5f, 0.5f}; -const __m128 ATTRIBUTE_ALIGNED16(v1_5) = {1.5f, 1.5f, 1.5f, 1.5f}; - -#endif - -#ifdef BT_USE_NEON - -const float32x4_t ATTRIBUTE_ALIGNED16(btvMzeroMask) = (float32x4_t){-0.0f, -0.0f, -0.0f, -0.0f}; -const int32x4_t ATTRIBUTE_ALIGNED16(btvFFF0Mask) = (int32x4_t){0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0}; -const int32x4_t ATTRIBUTE_ALIGNED16(btvAbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF}; -const int32x4_t ATTRIBUTE_ALIGNED16(btv3AbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x0}; - -#endif - -/**@brief btVector3 can be used to represent 3D points and vectors. - * It has an un-used w component to suit 16-byte alignment when btVector3 is stored in containers. This extra component can be used by derived classes (Quaternion?) or by user - * Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers - */ -ATTRIBUTE_ALIGNED16(class) btVector3 -{ -public: - - BT_DECLARE_ALIGNED_ALLOCATOR(); - -#if defined (__SPU__) && defined (__CELLOS_LV2__) - btScalar m_floats[4]; -public: - SIMD_FORCE_INLINE const vec_float4& get128() const - { - return *((const vec_float4*)&m_floats[0]); - } -public: -#else //__CELLOS_LV2__ __SPU__ - #if defined (BT_USE_SSE) || defined(BT_USE_NEON) // _WIN32 || ARM - union { - btSimdFloat4 mVec128; - btScalar m_floats[4]; - }; - SIMD_FORCE_INLINE btSimdFloat4 get128() const - { - return mVec128; - } - SIMD_FORCE_INLINE void set128(btSimdFloat4 v128) - { - mVec128 = v128; - } - #else - btScalar m_floats[4]; - #endif -#endif //__CELLOS_LV2__ __SPU__ - - public: - - /**@brief No initialization constructor */ - SIMD_FORCE_INLINE btVector3() - { - - } - - - - /**@brief Constructor from scalars - * @param x X value - * @param y Y value - * @param z Z value - */ - SIMD_FORCE_INLINE btVector3(const btScalar& _x, const btScalar& _y, const btScalar& _z) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = btScalar(0.f); - } - -#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE) )|| defined (BT_USE_NEON) - // Set Vector - SIMD_FORCE_INLINE btVector3( btSimdFloat4 v) - { - mVec128 = v; - } - - // Copy constructor - SIMD_FORCE_INLINE btVector3(const btVector3& rhs) - { - mVec128 = rhs.mVec128; - } - - // Assignment Operator - SIMD_FORCE_INLINE btVector3& - operator=(const btVector3& v) - { - mVec128 = v.mVec128; - - return *this; - } -#endif // #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON) - -/**@brief Add a vector to this one - * @param The vector to add to this one */ - SIMD_FORCE_INLINE btVector3& operator+=(const btVector3& v) - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - mVec128 = _mm_add_ps(mVec128, v.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vaddq_f32(mVec128, v.mVec128); -#else - m_floats[0] += v.m_floats[0]; - m_floats[1] += v.m_floats[1]; - m_floats[2] += v.m_floats[2]; -#endif - return *this; - } - - - /**@brief Subtract a vector from this one - * @param The vector to subtract */ - SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v) - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - mVec128 = _mm_sub_ps(mVec128, v.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vsubq_f32(mVec128, v.mVec128); -#else - m_floats[0] -= v.m_floats[0]; - m_floats[1] -= v.m_floats[1]; - m_floats[2] -= v.m_floats[2]; -#endif - return *this; - } - - /**@brief Scale the vector - * @param s Scale factor */ - SIMD_FORCE_INLINE btVector3& operator*=(const btScalar& s) - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0x80); // (S S S 0.0) - mVec128 = _mm_mul_ps(mVec128, vs); -#elif defined(BT_USE_NEON) - mVec128 = vmulq_n_f32(mVec128, s); -#else - m_floats[0] *= s; - m_floats[1] *= s; - m_floats[2] *= s; -#endif - return *this; - } - - /**@brief Inversely scale the vector - * @param s Scale factor to divide by */ - SIMD_FORCE_INLINE btVector3& operator/=(const btScalar& s) - { - btFullAssert(s != btScalar(0.0)); - -#if 0 //defined(BT_USE_SSE_IN_API) -// this code is not faster ! - __m128 vs = _mm_load_ss(&s); - vs = _mm_div_ss(v1110, vs); - vs = bt_pshufd_ps(vs, 0x00); // (S S S S) - - mVec128 = _mm_mul_ps(mVec128, vs); - - return *this; -#else - return *this *= btScalar(1.0) / s; -#endif - } - - /**@brief Return the dot product - * @param v The other vector in the dot product */ - SIMD_FORCE_INLINE btScalar dot(const btVector3& v) const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vd = _mm_mul_ps(mVec128, v.mVec128); - __m128 z = _mm_movehl_ps(vd, vd); - __m128 y = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, y); - vd = _mm_add_ss(vd, z); - return _mm_cvtss_f32(vd); -#elif defined(BT_USE_NEON) - float32x4_t vd = vmulq_f32(mVec128, v.mVec128); - float32x2_t x = vpadd_f32(vget_low_f32(vd), vget_low_f32(vd)); - x = vadd_f32(x, vget_high_f32(vd)); - return vget_lane_f32(x, 0); -#else - return m_floats[0] * v.m_floats[0] + - m_floats[1] * v.m_floats[1] + - m_floats[2] * v.m_floats[2]; -#endif - } - - /**@brief Return the length of the vector squared */ - SIMD_FORCE_INLINE btScalar length2() const - { - return dot(*this); - } - - /**@brief Return the length of the vector */ - SIMD_FORCE_INLINE btScalar length() const - { - return btSqrt(length2()); - } - - /**@brief Return the distance squared between the ends of this and another vector - * This is symantically treating the vector like a point */ - SIMD_FORCE_INLINE btScalar distance2(const btVector3& v) const; - - /**@brief Return the distance between the ends of this and another vector - * This is symantically treating the vector like a point */ - SIMD_FORCE_INLINE btScalar distance(const btVector3& v) const; - - SIMD_FORCE_INLINE btVector3& safeNormalize() - { - btVector3 absVec = this->absolute(); - int maxIndex = absVec.maxAxis(); - if (absVec[maxIndex]>0) - { - *this /= absVec[maxIndex]; - return *this /= length(); - } - setValue(1,0,0); - return *this; - } - - /**@brief Normalize this vector - * x^2 + y^2 + z^2 = 1 */ - SIMD_FORCE_INLINE btVector3& normalize() - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - // dot product first - __m128 vd = _mm_mul_ps(mVec128, mVec128); - __m128 z = _mm_movehl_ps(vd, vd); - __m128 y = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, y); - vd = _mm_add_ss(vd, z); - - #if 0 - vd = _mm_sqrt_ss(vd); - vd = _mm_div_ss(v1110, vd); - vd = bt_splat_ps(vd, 0x80); - mVec128 = _mm_mul_ps(mVec128, vd); - #else - - // NR step 1/sqrt(x) - vd is x, y is output - y = _mm_rsqrt_ss(vd); // estimate - - // one step NR - z = v1_5; - vd = _mm_mul_ss(vd, vHalf); // vd * 0.5 - //x2 = vd; - vd = _mm_mul_ss(vd, y); // vd * 0.5 * y0 - vd = _mm_mul_ss(vd, y); // vd * 0.5 * y0 * y0 - z = _mm_sub_ss(z, vd); // 1.5 - vd * 0.5 * y0 * y0 - - y = _mm_mul_ss(y, z); // y0 * (1.5 - vd * 0.5 * y0 * y0) - - y = bt_splat_ps(y, 0x80); - mVec128 = _mm_mul_ps(mVec128, y); - - #endif - - - return *this; -#else - return *this /= length(); -#endif - } - - /**@brief Return a normalized version of this vector */ - SIMD_FORCE_INLINE btVector3 normalized() const; - - /**@brief Return a rotated version of this vector - * @param wAxis The axis to rotate about - * @param angle The angle to rotate by */ - SIMD_FORCE_INLINE btVector3 rotate( const btVector3& wAxis, const btScalar angle ) const; - - /**@brief Return the angle between this and another vector - * @param v The other vector */ - SIMD_FORCE_INLINE btScalar angle(const btVector3& v) const - { - btScalar s = btSqrt(length2() * v.length2()); - btFullAssert(s != btScalar(0.0)); - return btAcos(dot(v) / s); - } - - /**@brief Return a vector will the absolute values of each element */ - SIMD_FORCE_INLINE btVector3 absolute() const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btVector3(_mm_and_ps(mVec128, btv3AbsfMask)); -#elif defined(BT_USE_NEON) - return btVector3(vabsq_f32(mVec128)); -#else - return btVector3( - btFabs(m_floats[0]), - btFabs(m_floats[1]), - btFabs(m_floats[2])); -#endif - } - - /**@brief Return the cross product between this and another vector - * @param v The other vector */ - SIMD_FORCE_INLINE btVector3 cross(const btVector3& v) const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 T, V; - - T = bt_pshufd_ps(mVec128, BT_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - V = bt_pshufd_ps(v.mVec128, BT_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - - V = _mm_mul_ps(V, mVec128); - T = _mm_mul_ps(T, v.mVec128); - V = _mm_sub_ps(V, T); - - V = bt_pshufd_ps(V, BT_SHUFFLE(1, 2, 0, 3)); - return btVector3(V); -#elif defined(BT_USE_NEON) - float32x4_t T, V; - // form (Y, Z, X, _) of mVec128 and v.mVec128 - float32x2_t Tlow = vget_low_f32(mVec128); - float32x2_t Vlow = vget_low_f32(v.mVec128); - T = vcombine_f32(vext_f32(Tlow, vget_high_f32(mVec128), 1), Tlow); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(v.mVec128), 1), Vlow); - - V = vmulq_f32(V, mVec128); - T = vmulq_f32(T, v.mVec128); - V = vsubq_f32(V, T); - Vlow = vget_low_f32(V); - // form (Y, Z, X, _); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(V), 1), Vlow); - V = (float32x4_t)vandq_s32((int32x4_t)V, btvFFF0Mask); - - return btVector3(V); -#else - return btVector3( - m_floats[1] * v.m_floats[2] - m_floats[2] * v.m_floats[1], - m_floats[2] * v.m_floats[0] - m_floats[0] * v.m_floats[2], - m_floats[0] * v.m_floats[1] - m_floats[1] * v.m_floats[0]); -#endif - } - - SIMD_FORCE_INLINE btScalar triple(const btVector3& v1, const btVector3& v2) const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - // cross: - __m128 T = _mm_shuffle_ps(v1.mVec128, v1.mVec128, BT_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - __m128 V = _mm_shuffle_ps(v2.mVec128, v2.mVec128, BT_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - - V = _mm_mul_ps(V, v1.mVec128); - T = _mm_mul_ps(T, v2.mVec128); - V = _mm_sub_ps(V, T); - - V = _mm_shuffle_ps(V, V, BT_SHUFFLE(1, 2, 0, 3)); - - // dot: - V = _mm_mul_ps(V, mVec128); - __m128 z = _mm_movehl_ps(V, V); - __m128 y = _mm_shuffle_ps(V, V, 0x55); - V = _mm_add_ss(V, y); - V = _mm_add_ss(V, z); - return _mm_cvtss_f32(V); - -#elif defined(BT_USE_NEON) - // cross: - float32x4_t T, V; - // form (Y, Z, X, _) of mVec128 and v.mVec128 - float32x2_t Tlow = vget_low_f32(v1.mVec128); - float32x2_t Vlow = vget_low_f32(v2.mVec128); - T = vcombine_f32(vext_f32(Tlow, vget_high_f32(v1.mVec128), 1), Tlow); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(v2.mVec128), 1), Vlow); - - V = vmulq_f32(V, v1.mVec128); - T = vmulq_f32(T, v2.mVec128); - V = vsubq_f32(V, T); - Vlow = vget_low_f32(V); - // form (Y, Z, X, _); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(V), 1), Vlow); - - // dot: - V = vmulq_f32(mVec128, V); - float32x2_t x = vpadd_f32(vget_low_f32(V), vget_low_f32(V)); - x = vadd_f32(x, vget_high_f32(V)); - return vget_lane_f32(x, 0); -#else - return - m_floats[0] * (v1.m_floats[1] * v2.m_floats[2] - v1.m_floats[2] * v2.m_floats[1]) + - m_floats[1] * (v1.m_floats[2] * v2.m_floats[0] - v1.m_floats[0] * v2.m_floats[2]) + - m_floats[2] * (v1.m_floats[0] * v2.m_floats[1] - v1.m_floats[1] * v2.m_floats[0]); -#endif - } - - /**@brief Return the axis with the smallest value - * Note return values are 0,1,2 for x, y, or z */ - SIMD_FORCE_INLINE int minAxis() const - { - return m_floats[0] < m_floats[1] ? (m_floats[0] return this, t=1 => return other) */ - SIMD_FORCE_INLINE btVector3 lerp(const btVector3& v, const btScalar& t) const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vt = _mm_load_ss(&t); // (t 0 0 0) - vt = bt_pshufd_ps(vt, 0x80); // (rt rt rt 0.0) - __m128 vl = _mm_sub_ps(v.mVec128, mVec128); - vl = _mm_mul_ps(vl, vt); - vl = _mm_add_ps(vl, mVec128); - - return btVector3(vl); -#elif defined(BT_USE_NEON) - float32x4_t vl = vsubq_f32(v.mVec128, mVec128); - vl = vmulq_n_f32(vl, t); - vl = vaddq_f32(vl, mVec128); - - return btVector3(vl); -#else - return - btVector3( m_floats[0] + (v.m_floats[0] - m_floats[0]) * t, - m_floats[1] + (v.m_floats[1] - m_floats[1]) * t, - m_floats[2] + (v.m_floats[2] - m_floats[2]) * t); -#endif - } - - /**@brief Elementwise multiply this vector by the other - * @param v The other vector */ - SIMD_FORCE_INLINE btVector3& operator*=(const btVector3& v) - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - mVec128 = _mm_mul_ps(mVec128, v.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vmulq_f32(mVec128, v.mVec128); -#else - m_floats[0] *= v.m_floats[0]; - m_floats[1] *= v.m_floats[1]; - m_floats[2] *= v.m_floats[2]; -#endif - return *this; - } - - /**@brief Return the x value */ - SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; } - /**@brief Return the y value */ - SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; } - /**@brief Return the z value */ - SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; } - /**@brief Set the x value */ - SIMD_FORCE_INLINE void setX(btScalar _x) { m_floats[0] = _x;}; - /**@brief Set the y value */ - SIMD_FORCE_INLINE void setY(btScalar _y) { m_floats[1] = _y;}; - /**@brief Set the z value */ - SIMD_FORCE_INLINE void setZ(btScalar _z) { m_floats[2] = _z;}; - /**@brief Set the w value */ - SIMD_FORCE_INLINE void setW(btScalar _w) { m_floats[3] = _w;}; - /**@brief Return the x value */ - SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; } - /**@brief Return the y value */ - SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; } - /**@brief Return the z value */ - SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; } - /**@brief Return the w value */ - SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; } - - //SIMD_FORCE_INLINE btScalar& operator[](int i) { return (&m_floats[0])[i]; } - //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; } - ///operator btScalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons. - SIMD_FORCE_INLINE operator btScalar *() { return &m_floats[0]; } - SIMD_FORCE_INLINE operator const btScalar *() const { return &m_floats[0]; } - - SIMD_FORCE_INLINE bool operator==(const btVector3& other) const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return (0xf == _mm_movemask_ps((__m128)_mm_cmpeq_ps(mVec128, other.mVec128))); -#else - return ((m_floats[3]==other.m_floats[3]) && - (m_floats[2]==other.m_floats[2]) && - (m_floats[1]==other.m_floats[1]) && - (m_floats[0]==other.m_floats[0])); -#endif - } - - SIMD_FORCE_INLINE bool operator!=(const btVector3& other) const - { - return !(*this == other); - } - - /**@brief Set each element to the max of the current values and the values of another btVector3 - * @param other The other btVector3 to compare with - */ - SIMD_FORCE_INLINE void setMax(const btVector3& other) - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - mVec128 = _mm_max_ps(mVec128, other.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vmaxq_f32(mVec128, other.mVec128); -#else - btSetMax(m_floats[0], other.m_floats[0]); - btSetMax(m_floats[1], other.m_floats[1]); - btSetMax(m_floats[2], other.m_floats[2]); - btSetMax(m_floats[3], other.w()); -#endif - } - - /**@brief Set each element to the min of the current values and the values of another btVector3 - * @param other The other btVector3 to compare with - */ - SIMD_FORCE_INLINE void setMin(const btVector3& other) - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - mVec128 = _mm_min_ps(mVec128, other.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vminq_f32(mVec128, other.mVec128); -#else - btSetMin(m_floats[0], other.m_floats[0]); - btSetMin(m_floats[1], other.m_floats[1]); - btSetMin(m_floats[2], other.m_floats[2]); - btSetMin(m_floats[3], other.w()); -#endif - } - - SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z) - { - m_floats[0]=_x; - m_floats[1]=_y; - m_floats[2]=_z; - m_floats[3] = btScalar(0.f); - } - - void getSkewSymmetricMatrix(btVector3* v0,btVector3* v1,btVector3* v2) const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - - __m128 V = _mm_and_ps(mVec128, btvFFF0fMask); - __m128 V0 = _mm_xor_ps(btvMzeroMask, V); - __m128 V2 = _mm_movelh_ps(V0, V); - - __m128 V1 = _mm_shuffle_ps(V, V0, 0xCE); - - V0 = _mm_shuffle_ps(V0, V, 0xDB); - V2 = _mm_shuffle_ps(V2, V, 0xF9); - - v0->mVec128 = V0; - v1->mVec128 = V1; - v2->mVec128 = V2; -#else - v0->setValue(0. ,-z() ,y()); - v1->setValue(z() ,0. ,-x()); - v2->setValue(-y() ,x() ,0.); -#endif - } - - void setZero() - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - mVec128 = (__m128)_mm_xor_ps(mVec128, mVec128); -#elif defined(BT_USE_NEON) - int32x4_t vi = vdupq_n_s32(0); - mVec128 = vreinterpretq_f32_s32(vi); -#else - setValue(btScalar(0.),btScalar(0.),btScalar(0.)); -#endif - } - - SIMD_FORCE_INLINE bool isZero() const - { - return m_floats[0] == btScalar(0) && m_floats[1] == btScalar(0) && m_floats[2] == btScalar(0); - } - - SIMD_FORCE_INLINE bool fuzzyZero() const - { - return length2() < SIMD_EPSILON; - } - - SIMD_FORCE_INLINE void serialize(struct btVector3Data& dataOut) const; - - SIMD_FORCE_INLINE void deSerialize(const struct btVector3Data& dataIn); - - SIMD_FORCE_INLINE void serializeFloat(struct btVector3FloatData& dataOut) const; - - SIMD_FORCE_INLINE void deSerializeFloat(const struct btVector3FloatData& dataIn); - - SIMD_FORCE_INLINE void serializeDouble(struct btVector3DoubleData& dataOut) const; - - SIMD_FORCE_INLINE void deSerializeDouble(const struct btVector3DoubleData& dataIn); - - /**@brief returns index of maximum dot product between this and vectors in array[] - * @param array The other vectors - * @param array_count The number of other vectors - * @param dotOut The maximum dot product */ - SIMD_FORCE_INLINE long maxDot( const btVector3 *array, long array_count, btScalar &dotOut ) const; - - /**@brief returns index of minimum dot product between this and vectors in array[] - * @param array The other vectors - * @param array_count The number of other vectors - * @param dotOut The minimum dot product */ - SIMD_FORCE_INLINE long minDot( const btVector3 *array, long array_count, btScalar &dotOut ) const; - - /* create a vector as btVector3( this->dot( btVector3 v0 ), this->dot( btVector3 v1), this->dot( btVector3 v2 )) */ - SIMD_FORCE_INLINE btVector3 dot3( const btVector3 &v0, const btVector3 &v1, const btVector3 &v2 ) const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - - __m128 a0 = _mm_mul_ps( v0.mVec128, this->mVec128 ); - __m128 a1 = _mm_mul_ps( v1.mVec128, this->mVec128 ); - __m128 a2 = _mm_mul_ps( v2.mVec128, this->mVec128 ); - __m128 b0 = _mm_unpacklo_ps( a0, a1 ); - __m128 b1 = _mm_unpackhi_ps( a0, a1 ); - __m128 b2 = _mm_unpacklo_ps( a2, _mm_setzero_ps() ); - __m128 r = _mm_movelh_ps( b0, b2 ); - r = _mm_add_ps( r, _mm_movehl_ps( b2, b0 )); - a2 = _mm_and_ps( a2, btvxyzMaskf); - r = _mm_add_ps( r, btCastdTo128f (_mm_move_sd( btCastfTo128d(a2), btCastfTo128d(b1) ))); - return btVector3(r); - -#elif defined(BT_USE_NEON) - static const uint32x4_t xyzMask = (const uint32x4_t){ -1, -1, -1, 0 }; - float32x4_t a0 = vmulq_f32( v0.mVec128, this->mVec128); - float32x4_t a1 = vmulq_f32( v1.mVec128, this->mVec128); - float32x4_t a2 = vmulq_f32( v2.mVec128, this->mVec128); - float32x2x2_t zLo = vtrn_f32( vget_high_f32(a0), vget_high_f32(a1)); - a2 = (float32x4_t) vandq_u32((uint32x4_t) a2, xyzMask ); - float32x2_t b0 = vadd_f32( vpadd_f32( vget_low_f32(a0), vget_low_f32(a1)), zLo.val[0] ); - float32x2_t b1 = vpadd_f32( vpadd_f32( vget_low_f32(a2), vget_high_f32(a2)), vdup_n_f32(0.0f)); - return btVector3( vcombine_f32(b0, b1) ); -#else - return btVector3( dot(v0), dot(v1), dot(v2)); -#endif - } -}; - -/**@brief Return the sum of two vectors (Point symantics)*/ -SIMD_FORCE_INLINE btVector3 -operator+(const btVector3& v1, const btVector3& v2) -{ -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btVector3(_mm_add_ps(v1.mVec128, v2.mVec128)); -#elif defined(BT_USE_NEON) - return btVector3(vaddq_f32(v1.mVec128, v2.mVec128)); -#else - return btVector3( - v1.m_floats[0] + v2.m_floats[0], - v1.m_floats[1] + v2.m_floats[1], - v1.m_floats[2] + v2.m_floats[2]); -#endif -} - -/**@brief Return the elementwise product of two vectors */ -SIMD_FORCE_INLINE btVector3 -operator*(const btVector3& v1, const btVector3& v2) -{ -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btVector3(_mm_mul_ps(v1.mVec128, v2.mVec128)); -#elif defined(BT_USE_NEON) - return btVector3(vmulq_f32(v1.mVec128, v2.mVec128)); -#else - return btVector3( - v1.m_floats[0] * v2.m_floats[0], - v1.m_floats[1] * v2.m_floats[1], - v1.m_floats[2] * v2.m_floats[2]); -#endif -} - -/**@brief Return the difference between two vectors */ -SIMD_FORCE_INLINE btVector3 -operator-(const btVector3& v1, const btVector3& v2) -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - - // without _mm_and_ps this code causes slowdown in Concave moving - __m128 r = _mm_sub_ps(v1.mVec128, v2.mVec128); - return btVector3(_mm_and_ps(r, btvFFF0fMask)); -#elif defined(BT_USE_NEON) - float32x4_t r = vsubq_f32(v1.mVec128, v2.mVec128); - return btVector3((float32x4_t)vandq_s32((int32x4_t)r, btvFFF0Mask)); -#else - return btVector3( - v1.m_floats[0] - v2.m_floats[0], - v1.m_floats[1] - v2.m_floats[1], - v1.m_floats[2] - v2.m_floats[2]); -#endif -} - -/**@brief Return the negative of the vector */ -SIMD_FORCE_INLINE btVector3 -operator-(const btVector3& v) -{ -#if (defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)) - __m128 r = _mm_xor_ps(v.mVec128, btvMzeroMask); - return btVector3(_mm_and_ps(r, btvFFF0fMask)); -#elif defined(BT_USE_NEON) - return btVector3((btSimdFloat4)veorq_s32((int32x4_t)v.mVec128, (int32x4_t)btvMzeroMask)); -#else - return btVector3(-v.m_floats[0], -v.m_floats[1], -v.m_floats[2]); -#endif -} - -/**@brief Return the vector scaled by s */ -SIMD_FORCE_INLINE btVector3 -operator*(const btVector3& v, const btScalar& s) -{ -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0x80); // (S S S 0.0) - return btVector3(_mm_mul_ps(v.mVec128, vs)); -#elif defined(BT_USE_NEON) - float32x4_t r = vmulq_n_f32(v.mVec128, s); - return btVector3((float32x4_t)vandq_s32((int32x4_t)r, btvFFF0Mask)); -#else - return btVector3(v.m_floats[0] * s, v.m_floats[1] * s, v.m_floats[2] * s); -#endif -} - -/**@brief Return the vector scaled by s */ -SIMD_FORCE_INLINE btVector3 -operator*(const btScalar& s, const btVector3& v) -{ - return v * s; -} - -/**@brief Return the vector inversely scaled by s */ -SIMD_FORCE_INLINE btVector3 -operator/(const btVector3& v, const btScalar& s) -{ - btFullAssert(s != btScalar(0.0)); -#if 0 //defined(BT_USE_SSE_IN_API) -// this code is not faster ! - __m128 vs = _mm_load_ss(&s); - vs = _mm_div_ss(v1110, vs); - vs = bt_pshufd_ps(vs, 0x00); // (S S S S) - - return btVector3(_mm_mul_ps(v.mVec128, vs)); -#else - return v * (btScalar(1.0) / s); -#endif -} - -/**@brief Return the vector inversely scaled by s */ -SIMD_FORCE_INLINE btVector3 -operator/(const btVector3& v1, const btVector3& v2) -{ -#if (defined(BT_USE_SSE_IN_API)&& defined (BT_USE_SSE)) - __m128 vec = _mm_div_ps(v1.mVec128, v2.mVec128); - vec = _mm_and_ps(vec, btvFFF0fMask); - return btVector3(vec); -#elif defined(BT_USE_NEON) - float32x4_t x, y, v, m; - - x = v1.mVec128; - y = v2.mVec128; - - v = vrecpeq_f32(y); // v ~ 1/y - m = vrecpsq_f32(y, v); // m = (2-v*y) - v = vmulq_f32(v, m); // vv = v*m ~~ 1/y - m = vrecpsq_f32(y, v); // mm = (2-vv*y) - v = vmulq_f32(v, x); // x*vv - v = vmulq_f32(v, m); // (x*vv)*(2-vv*y) = x*(vv(2-vv*y)) ~~~ x/y - - return btVector3(v); -#else - return btVector3( - v1.m_floats[0] / v2.m_floats[0], - v1.m_floats[1] / v2.m_floats[1], - v1.m_floats[2] / v2.m_floats[2]); -#endif -} - -/**@brief Return the dot product between two vectors */ -SIMD_FORCE_INLINE btScalar -btDot(const btVector3& v1, const btVector3& v2) -{ - return v1.dot(v2); -} - - -/**@brief Return the distance squared between two vectors */ -SIMD_FORCE_INLINE btScalar -btDistance2(const btVector3& v1, const btVector3& v2) -{ - return v1.distance2(v2); -} - - -/**@brief Return the distance between two vectors */ -SIMD_FORCE_INLINE btScalar -btDistance(const btVector3& v1, const btVector3& v2) -{ - return v1.distance(v2); -} - -/**@brief Return the angle between two vectors */ -SIMD_FORCE_INLINE btScalar -btAngle(const btVector3& v1, const btVector3& v2) -{ - return v1.angle(v2); -} - -/**@brief Return the cross product of two vectors */ -SIMD_FORCE_INLINE btVector3 -btCross(const btVector3& v1, const btVector3& v2) -{ - return v1.cross(v2); -} - -SIMD_FORCE_INLINE btScalar -btTriple(const btVector3& v1, const btVector3& v2, const btVector3& v3) -{ - return v1.triple(v2, v3); -} - -/**@brief Return the linear interpolation between two vectors - * @param v1 One vector - * @param v2 The other vector - * @param t The ration of this to v (t = 0 => return v1, t=1 => return v2) */ -SIMD_FORCE_INLINE btVector3 -lerp(const btVector3& v1, const btVector3& v2, const btScalar& t) -{ - return v1.lerp(v2, t); -} - - - -SIMD_FORCE_INLINE btScalar btVector3::distance2(const btVector3& v) const -{ - return (v - *this).length2(); -} - -SIMD_FORCE_INLINE btScalar btVector3::distance(const btVector3& v) const -{ - return (v - *this).length(); -} - -SIMD_FORCE_INLINE btVector3 btVector3::normalized() const -{ -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - btVector3 norm = *this; - - return norm.normalize(); -#else - return *this / length(); -#endif -} - -SIMD_FORCE_INLINE btVector3 btVector3::rotate( const btVector3& wAxis, const btScalar _angle ) const -{ - // wAxis must be a unit lenght vector - -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - - __m128 O = _mm_mul_ps(wAxis.mVec128, mVec128); - btScalar ssin = btSin( _angle ); - __m128 C = wAxis.cross( mVec128 ).mVec128; - O = _mm_and_ps(O, btvFFF0fMask); - btScalar scos = btCos( _angle ); - - __m128 vsin = _mm_load_ss(&ssin); // (S 0 0 0) - __m128 vcos = _mm_load_ss(&scos); // (S 0 0 0) - - __m128 Y = bt_pshufd_ps(O, 0xC9); // (Y Z X 0) - __m128 Z = bt_pshufd_ps(O, 0xD2); // (Z X Y 0) - O = _mm_add_ps(O, Y); - vsin = bt_pshufd_ps(vsin, 0x80); // (S S S 0) - O = _mm_add_ps(O, Z); - vcos = bt_pshufd_ps(vcos, 0x80); // (S S S 0) - - vsin = vsin * C; - O = O * wAxis.mVec128; - __m128 X = mVec128 - O; - - O = O + vsin; - vcos = vcos * X; - O = O + vcos; - - return btVector3(O); -#else - btVector3 o = wAxis * wAxis.dot( *this ); - btVector3 _x = *this - o; - btVector3 _y; - - _y = wAxis.cross( *this ); - - return ( o + _x * btCos( _angle ) + _y * btSin( _angle ) ); -#endif -} - -SIMD_FORCE_INLINE long btVector3::maxDot( const btVector3 *array, long array_count, btScalar &dotOut ) const -{ -#if defined (BT_USE_SSE) || defined (BT_USE_NEON) - #if defined _WIN32 || defined (BT_USE_SSE) - const long scalar_cutoff = 10; - long _maxdot_large( const float *array, const float *vec, unsigned long array_count, float *dotOut ); - #elif defined BT_USE_NEON - const long scalar_cutoff = 4; - extern long (*_maxdot_large)( const float *array, const float *vec, unsigned long array_count, float *dotOut ); - #endif - if( array_count < scalar_cutoff ) -#else - -#endif//BT_USE_SSE || BT_USE_NEON - { - btScalar maxDot = -SIMD_INFINITY; - int i = 0; - int ptIndex = -1; - for( i = 0; i < array_count; i++ ) - { - btScalar dot = array[i].dot(*this); - - if( dot > maxDot ) - { - maxDot = dot; - ptIndex = i; - } - } - - dotOut = maxDot; - return ptIndex; - } -#if defined (BT_USE_SSE) || defined (BT_USE_NEON) - return _maxdot_large( (float*) array, (float*) &m_floats[0], array_count, &dotOut ); -#endif -} - -SIMD_FORCE_INLINE long btVector3::minDot( const btVector3 *array, long array_count, btScalar &dotOut ) const -{ -#if defined (BT_USE_SSE) || defined (BT_USE_NEON) - #if defined BT_USE_SSE - const long scalar_cutoff = 10; - long _mindot_large( const float *array, const float *vec, unsigned long array_count, float *dotOut ); - #elif defined BT_USE_NEON - const long scalar_cutoff = 4; - extern long (*_mindot_large)( const float *array, const float *vec, unsigned long array_count, float *dotOut ); - #else - #error unhandled arch! - #endif - - if( array_count < scalar_cutoff ) -#endif//BT_USE_SSE || BT_USE_NEON - { - btScalar minDot = SIMD_INFINITY; - int i = 0; - int ptIndex = -1; - - for( i = 0; i < array_count; i++ ) - { - btScalar dot = array[i].dot(*this); - - if( dot < minDot ) - { - minDot = dot; - ptIndex = i; - } - } - - dotOut = minDot; - - return ptIndex; - } -#if defined (BT_USE_SSE) || defined (BT_USE_NEON) - return _mindot_large( (float*) array, (float*) &m_floats[0], array_count, &dotOut ); -#endif -} - - -class btVector4 : public btVector3 -{ -public: - - SIMD_FORCE_INLINE btVector4() {} - - - SIMD_FORCE_INLINE btVector4(const btScalar& _x, const btScalar& _y, const btScalar& _z,const btScalar& _w) - : btVector3(_x,_y,_z) - { - m_floats[3] = _w; - } - -#if (defined (BT_USE_SSE_IN_API)&& defined (BT_USE_SSE)) || defined (BT_USE_NEON) - SIMD_FORCE_INLINE btVector4(const btSimdFloat4 vec) - { - mVec128 = vec; - } - - SIMD_FORCE_INLINE btVector4(const btVector3& rhs) - { - mVec128 = rhs.mVec128; - } - - SIMD_FORCE_INLINE btVector4& - operator=(const btVector4& v) - { - mVec128 = v.mVec128; - return *this; - } -#endif // #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON) - - SIMD_FORCE_INLINE btVector4 absolute4() const - { -#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE) - return btVector4(_mm_and_ps(mVec128, btvAbsfMask)); -#elif defined(BT_USE_NEON) - return btVector4(vabsq_f32(mVec128)); -#else - return btVector4( - btFabs(m_floats[0]), - btFabs(m_floats[1]), - btFabs(m_floats[2]), - btFabs(m_floats[3])); -#endif - } - - - btScalar getW() const { return m_floats[3];} - - - SIMD_FORCE_INLINE int maxAxis4() const - { - int maxIndex = -1; - btScalar maxVal = btScalar(-BT_LARGE_FLOAT); - if (m_floats[0] > maxVal) - { - maxIndex = 0; - maxVal = m_floats[0]; - } - if (m_floats[1] > maxVal) - { - maxIndex = 1; - maxVal = m_floats[1]; - } - if (m_floats[2] > maxVal) - { - maxIndex = 2; - maxVal =m_floats[2]; - } - if (m_floats[3] > maxVal) - { - maxIndex = 3; - maxVal = m_floats[3]; - } - - return maxIndex; - } - - - SIMD_FORCE_INLINE int minAxis4() const - { - int minIndex = -1; - btScalar minVal = btScalar(BT_LARGE_FLOAT); - if (m_floats[0] < minVal) - { - minIndex = 0; - minVal = m_floats[0]; - } - if (m_floats[1] < minVal) - { - minIndex = 1; - minVal = m_floats[1]; - } - if (m_floats[2] < minVal) - { - minIndex = 2; - minVal =m_floats[2]; - } - if (m_floats[3] < minVal) - { - minIndex = 3; - minVal = m_floats[3]; - } - - return minIndex; - } - - - SIMD_FORCE_INLINE int closestAxis4() const - { - return absolute4().maxAxis4(); - } - - - - - /**@brief Set x,y,z and zero w - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - - -/* void getValue(btScalar *m) const - { - m[0] = m_floats[0]; - m[1] = m_floats[1]; - m[2] =m_floats[2]; - } -*/ -/**@brief Set the values - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z,const btScalar& _w) - { - m_floats[0]=_x; - m_floats[1]=_y; - m_floats[2]=_z; - m_floats[3]=_w; - } - - -}; - - -///btSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -SIMD_FORCE_INLINE void btSwapScalarEndian(const btScalar& sourceVal, btScalar& destVal) -{ - #ifdef BT_USE_DOUBLE_PRECISION - unsigned char* dest = (unsigned char*) &destVal; - unsigned char* src = (unsigned char*) &sourceVal; - dest[0] = src[7]; - dest[1] = src[6]; - dest[2] = src[5]; - dest[3] = src[4]; - dest[4] = src[3]; - dest[5] = src[2]; - dest[6] = src[1]; - dest[7] = src[0]; -#else - unsigned char* dest = (unsigned char*) &destVal; - unsigned char* src = (unsigned char*) &sourceVal; - dest[0] = src[3]; - dest[1] = src[2]; - dest[2] = src[1]; - dest[3] = src[0]; -#endif //BT_USE_DOUBLE_PRECISION -} -///btSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -SIMD_FORCE_INLINE void btSwapVector3Endian(const btVector3& sourceVec, btVector3& destVec) -{ - for (int i=0;i<4;i++) - { - btSwapScalarEndian(sourceVec[i],destVec[i]); - } - -} - -///btUnSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -SIMD_FORCE_INLINE void btUnSwapVector3Endian(btVector3& vector) -{ - - btVector3 swappedVec; - for (int i=0;i<4;i++) - { - btSwapScalarEndian(vector[i],swappedVec[i]); - } - vector = swappedVec; -} - -template -SIMD_FORCE_INLINE void btPlaneSpace1 (const T& n, T& p, T& q) -{ - if (btFabs(n[2]) > SIMDSQRT12) { - // choose p in y-z plane - btScalar a = n[1]*n[1] + n[2]*n[2]; - btScalar k = btRecipSqrt (a); - p[0] = 0; - p[1] = -n[2]*k; - p[2] = n[1]*k; - // set q = n x p - q[0] = a*k; - q[1] = -n[0]*p[2]; - q[2] = n[0]*p[1]; - } - else { - // choose p in x-y plane - btScalar a = n[0]*n[0] + n[1]*n[1]; - btScalar k = btRecipSqrt (a); - p[0] = -n[1]*k; - p[1] = n[0]*k; - p[2] = 0; - // set q = n x p - q[0] = -n[2]*p[1]; - q[1] = n[2]*p[0]; - q[2] = a*k; - } -} - - -struct btVector3FloatData -{ - float m_floats[4]; -}; - -struct btVector3DoubleData -{ - double m_floats[4]; - -}; - -SIMD_FORCE_INLINE void btVector3::serializeFloat(struct btVector3FloatData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i=0;i<4;i++) - dataOut.m_floats[i] = float(m_floats[i]); -} - -SIMD_FORCE_INLINE void btVector3::deSerializeFloat(const struct btVector3FloatData& dataIn) -{ - for (int i=0;i<4;i++) - m_floats[i] = btScalar(dataIn.m_floats[i]); -} - - -SIMD_FORCE_INLINE void btVector3::serializeDouble(struct btVector3DoubleData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i=0;i<4;i++) - dataOut.m_floats[i] = double(m_floats[i]); -} - -SIMD_FORCE_INLINE void btVector3::deSerializeDouble(const struct btVector3DoubleData& dataIn) -{ - for (int i=0;i<4;i++) - m_floats[i] = btScalar(dataIn.m_floats[i]); -} - - -SIMD_FORCE_INLINE void btVector3::serialize(struct btVector3Data& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i=0;i<4;i++) - dataOut.m_floats[i] = m_floats[i]; -} - -SIMD_FORCE_INLINE void btVector3::deSerialize(const struct btVector3Data& dataIn) -{ - for (int i=0;i<4;i++) - m_floats[i] = dataIn.m_floats[i]; -} - -#endif //BT_VECTOR3_H diff --git a/opencl/parallel_primitives/host/premake4.lua b/opencl/parallel_primitives/host/premake4.lua index 9aaa4692e..cafa03f31 100644 --- a/opencl/parallel_primitives/host/premake4.lua +++ b/opencl/parallel_primitives/host/premake4.lua @@ -8,10 +8,12 @@ function createProject(vendor) initOpenCL(vendor) kind "StaticLib" + targetdir "../../../lib" includedirs { - ".", + ".","../../../src" } + files { "**.cpp", "**.h" diff --git a/opencl/parallel_primitives/test/main.cpp b/opencl/parallel_primitives/test/main.cpp index d659410f1..59efe2871 100644 --- a/opencl/parallel_primitives/test/main.cpp +++ b/opencl/parallel_primitives/test/main.cpp @@ -19,9 +19,9 @@ subject to the following restrictions: #include "../host/btBoundSearchCL.h" #include "../host/btRadixSort32CL.h" #include "../host/btPrefixScanCL.h" -#include "../host/CommandLineArgs.h" +#include "BulletCommon/CommandLineArgs.h" +#include "BulletCommon/btMinMax.h" -#include "../host/btMinMax.h" int g_nPassed = 0; int g_nFailed = 0; bool g_testFailed = 0; diff --git a/opencl/parallel_primitives/test/premake4.lua b/opencl/parallel_primitives/test/premake4.lua index 119087926..1037a61ef 100644 --- a/opencl/parallel_primitives/test/premake4.lua +++ b/opencl/parallel_primitives/test/premake4.lua @@ -11,7 +11,7 @@ function createProject(vendor) kind "ConsoleApp" targetdir "../../../bin" - includedirs {".",".."} + includedirs {".","..","../../../src"} files { @@ -27,9 +27,9 @@ function createProject(vendor) "../host/btPrefixScanCL.h", "../host/btRadixSort32CL.cpp", "../host/btRadixSort32CL.h", - "../host/btAlignedAllocator.cpp", - "../host/btAlignedAllocator.h", - "../host/btAlignedObjectArray.h", + "../../../src/BulletCommon/btAlignedAllocator.cpp", + "../../../src/BulletCommon/btAlignedAllocator.h", + "../../../src/BulletCommon/btAlignedObjectArray.h", } end diff --git a/opencl/reduce/premake4.lua b/opencl/reduce/premake4.lua index 6212b51f2..43d900c45 100644 --- a/opencl/reduce/premake4.lua +++ b/opencl/reduce/premake4.lua @@ -19,13 +19,17 @@ function createProject (vendor) } includedirs { - "../basic_initialize" + "../basic_initialize", + "../../src" } files { "main.cpp", "../basic_initialize/btOpenCLUtils.cpp", - "../basic_initialize/btOpenCLUtils.h" + "../basic_initialize/btOpenCLUtils.h", + "../../src/BulletCommon/btAlignedAllocator.cpp", + "../../src/BulletCommon/btAlignedAllocator.h", + "../../src/BulletCommon/btAlignedObjectArray.h", } end diff --git a/opencl/vector_add_simplified/premake4.lua b/opencl/vector_add_simplified/premake4.lua index c459c16dc..5f41c4f0c 100644 --- a/opencl/vector_add_simplified/premake4.lua +++ b/opencl/vector_add_simplified/premake4.lua @@ -15,17 +15,21 @@ function createProject (vendor) targetdir "../../bin" links { - "OpenCL_lib_parallel_primitives_host_" .. vendor + "OpenCL_lib_parallel_primitives_host_" .. vendor } includedirs { - "../basic_initialize" + "../basic_initialize", + "../../src" } files { "main.cpp", "../basic_initialize/btOpenCLUtils.cpp", - "../basic_initialize/btOpenCLUtils.h" + "../basic_initialize/btOpenCLUtils.h", + "../../src/BulletCommon/btAlignedAllocator.cpp", + "../../src/BulletCommon/btAlignedAllocator.h", + "../../src/BulletCommon/btAlignedObjectArray.h", } end