Best JavaScript code snippet using playwright-internal
keys.js
Source:keys.js  
1var predefinedDecHash = new Map();2var predefinedEncHash = new Map();34predefinedDecHash.set(0, "D");5predefinedDecHash.set(1, "q");6predefinedDecHash.set(2, "6");7predefinedDecHash.set(3, "/");8predefinedDecHash.set(4, "V");9predefinedDecHash.set(5, "G");10predefinedDecHash.set(6, "h");11predefinedDecHash.set(7, "l");12predefinedDecHash.set(8, "I");13predefinedDecHash.set(9, "F");14predefinedDecHash.set(10, "F");15predefinedDecHash.set(11, "1");16predefinedDecHash.set(12, "a");17predefinedDecHash.set(13, "W");18predefinedDecHash.set(14, "N");19predefinedDecHash.set(15, "r");20predefinedDecHash.set(16, "I");21predefinedDecHash.set(17, "F");22predefinedDecHash.set(18, "J");23predefinedDecHash.set(19, "l");24predefinedDecHash.set(20, "Z");25predefinedDecHash.set(21, "C");26predefinedDecHash.set(22, "B");27predefinedDecHash.set(23, "G");28predefinedDecHash.set(24, "b");29predefinedDecHash.set(25, "3");30predefinedDecHash.set(26, "g");31predefinedDecHash.set(27, "g");32predefinedDecHash.set(28, "S");33predefinedDecHash.set(29, "n");34predefinedDecHash.set(30, "V");35predefinedDecHash.set(31, "t");36predefinedDecHash.set(32, "c");37predefinedDecHash.set(33, "G");38predefinedDecHash.set(34, "V");39predefinedDecHash.set(35, "k");40predefinedDecHash.set(36, "I");41predefinedDecHash.set(37, "E");42predefinedDecHash.set(38, "9");43predefinedDecHash.set(39, "2");44predefinedDecHash.set(40, "Z");45predefinedDecHash.set(41, "X");46predefinedDecHash.set(42, "I");47predefinedDecHash.set(43, "g");48predefinedDecHash.set(44, "d");49predefinedDecHash.set(45, "G");50predefinedDecHash.set(46, "h");51predefinedDecHash.set(47, "l");52predefinedDecHash.set(48, "I");53predefinedDecHash.set(49, "E");54predefinedDecHash.set(50, "x");55predefinedDecHash.set(51, "h");56predefinedDecHash.set(52, "e");57predefinedDecHash.set(53, "n");58predefinedDecHash.set(54, "k");59predefinedDecHash.set(55, "g");60predefinedDecHash.set(56, "Q");61predefinedDecHash.set(57, "n");62predefinedDecHash.set(58, "J");63predefinedDecHash.set(59, "v");64predefinedDecHash.set(60, "d");65predefinedDecHash.set(61, "2");66predefinedDecHash.set(62, "4");67predefinedDecHash.set(63, "g");68predefinedDecHash.set(64, "R");69predefinedDecHash.set(65, "G");70predefinedDecHash.set(66, "9");71predefinedDecHash.set(67, "n");72predefinedDecHash.set(68, "L");73predefinedDecHash.set(69, "i");74predefinedDecHash.set(70, "A");75predefinedDecHash.set(71, "8");76predefinedDecHash.set(72, "P");77predefinedDecHash.set(73, "i");78predefinedDecHash.set(74, "w");79predefinedDecHash.set(75, "u");80predefinedDecHash.set(76, "P");81predefinedDecHash.set(77, "z");82predefinedDecHash.set(78, "o");83predefinedDecHash.set(79, "7");84predefinedDecHash.set(80, "f");85predefinedDecHash.set(81, "H");86predefinedDecHash.set(82, "t");87predefinedDecHash.set(83, "9");88predefinedDecHash.set(84, "W");89predefinedDecHash.set(85, "1");90predefinedDecHash.set(86, "1");91predefinedDecHash.set(87, "+");92predefinedDecHash.set(88, "I");93predefinedDecHash.set(89, "U");94predefinedDecHash.set(90, "A");95predefinedDecHash.set(91, "j");96predefinedDecHash.set(92, "J");97predefinedDecHash.set(93, "C");98predefinedDecHash.set(94, "V");99predefinedDecHash.set(95, "e");100predefinedDecHash.set(96, "J");101predefinedDecHash.set(97, "i");102predefinedDecHash.set(98, "o");103predefinedDecHash.set(99, "o");104predefinedDecHash.set(100, "K");105predefinedDecHash.set(101, "V");106predefinedDecHash.set(102, "8");107predefinedDecHash.set(103, "r");108predefinedDecHash.set(104, "P");109predefinedDecHash.set(105, "S");110predefinedDecHash.set(106, "0");111predefinedDecHash.set(107, "w");112predefinedDecHash.set(108, "O");113predefinedDecHash.set(109, "T");114predefinedDecHash.set(110, "g");115predefinedDecHash.set(111, "3");116predefinedDecHash.set(112, "N");117predefinedDecHash.set(113, "j");118predefinedDecHash.set(114, "U");119predefinedDecHash.set(115, "0");120predefinedDecHash.set(116, "M");121predefinedDecHash.set(117, "z");122predefinedDecHash.set(118, "I");123predefinedDecHash.set(119, "x");124predefinedDecHash.set(120, "Y");125predefinedDecHash.set(121, "E");126predefinedDecHash.set(122, "x");127predefinedDecHash.set(123, "v");128predefinedDecHash.set(124, "c");129predefinedDecHash.set(125, "m");130predefinedDecHash.set(126, "V");131predefinedDecHash.set(127, "t");132predefinedDecHash.set(128, "I");133predefinedDecHash.set(129, "G");134predefinedDecHash.set(130, "l");135predefinedDecHash.set(131, "w");136predefinedDecHash.set(132, "c");137predefinedDecHash.set(133, "3");138predefinedDecHash.set(134, "V");139predefinedDecHash.set(135, "t");140predefinedDecHash.set(136, "I");141predefinedDecHash.set(137, "G");142predefinedDecHash.set(138, "R");143predefinedDecHash.set(139, "v");144predefinedDecHash.set(140, "b");145predefinedDecHash.set(141, "G");146predefinedDecHash.set(142, "9");147predefinedDecHash.set(143, "y");148predefinedDecHash.set(144, "I");149predefinedDecHash.set(145, "H");150predefinedDecHash.set(146, "N");151predefinedDecHash.set(147, "p");152predefinedDecHash.set(148, "d");153predefinedDecHash.set(149, "C");154predefinedDecHash.set(150, "B");155predefinedDecHash.set(151, "h");156predefinedDecHash.set(152, "b");157predefinedDecHash.set(153, "W");158predefinedDecHash.set(154, "V");159predefinedDecHash.set(155, "0");160predefinedDecHash.set(156, "L");161predefinedDecHash.set(157, "C");162predefinedDecHash.set(158, "B");163predefinedDecHash.set(159, "j");164predefinedDecHash.set(160, "b");165predefinedDecHash.set(161, "2");166predefinedDecHash.set(162, "5");167predefinedDecHash.set(163, "z");168predefinedDecHash.set(164, "Z");169predefinedDecHash.set(165, "W");170predefinedDecHash.set(166, "N");171predefinedDecHash.set(167, "0");172predefinedDecHash.set(168, "Z");173predefinedDecHash.set(169, "X");174predefinedDecHash.set(170, "R");175predefinedDecHash.set(171, "1");176predefinedDecHash.set(172, "c");177predefinedDecHash.set(173, "i");178predefinedDecHash.set(174, "B");179predefinedDecHash.set(175, "h");180predefinedDecHash.set(176, "Z");181predefinedDecHash.set(177, "G");182predefinedDecHash.set(178, "l");183predefinedDecHash.set(179, "w");184predefinedDecHash.set(180, "a");185predefinedDecHash.set(181, "X");186predefinedDecHash.set(182, "N");187predefinedDecHash.set(183, "j");188predefinedDecHash.set(184, "a");189predefinedDecHash.set(185, "W");190predefinedDecHash.set(186, "5");191predefinedDecHash.set(187, "n");192predefinedDecHash.set(188, "I");193predefinedDecHash.set(189, "G");194predefinedDecHash.set(190, "V");195predefinedDecHash.set(191, "s");196predefinedDecHash.set(192, "a");197predefinedDecHash.set(193, "X");198predefinedDecHash.set(194, "Q");199predefinedDecHash.set(195, "s");200predefinedDecHash.set(196, "I");201predefinedDecHash.set(197, "H");202predefinedDecHash.set(198, "N");203predefinedDecHash.set(199, "l");204predefinedDecHash.set(200, "Z");205predefinedDecHash.set(201, "C");206predefinedDecHash.set(202, "B");207predefinedDecHash.set(203, "k");208predefinedDecHash.set(204, "b");209predefinedDecHash.set(205, "y");210predefinedDecHash.set(206, "B");211predefinedDecHash.set(207, "l");212predefinedDecHash.set(208, "a");213predefinedDecHash.set(209, "X");214predefinedDecHash.set(210, "V");215predefinedDecHash.set(211, "z");216predefinedDecHash.set(212, "b");217predefinedDecHash.set(213, "W");218predefinedDecHash.set(214, "9");219predefinedDecHash.set(215, "k");220predefinedDecHash.set(216, "I");221predefinedDecHash.set(217, "H");222predefinedDecHash.set(218, "R");223predefinedDecHash.set(219, "l");224predefinedDecHash.set(220, "b");225predefinedDecHash.set(221, "X");226predefinedDecHash.set(222, "B");227predefinedDecHash.set(223, "v");228predefinedDecHash.set(224, "c");229predefinedDecHash.set(225, "i");230predefinedDecHash.set(226, "B");231predefinedDecHash.set(227, "p");232predefinedDecHash.set(228, "b");233predefinedDecHash.set(229, "m");234predefinedDecHash.set(230, "N");235predefinedDecHash.set(231, "p");236predefinedDecHash.set(232, "Z");237predefinedDecHash.set(233, "G");238predefinedDecHash.set(234, "l");239predefinedDecHash.set(235, "k");240predefinedDecHash.set(236, "d");241predefinedDecHash.set(237, "W");242predefinedDecHash.set(238, "5");243predefinedDecHash.set(239, "0");244predefinedDecHash.set(240, "I");245predefinedDecHash.set(241, "H");246predefinedDecHash.set(242, "V");247predefinedDecHash.set(243, "0");248predefinedDecHash.set(244, "I");249predefinedDecHash.set(245, "G");250predefinedDecHash.set(246, "x");251predefinedDecHash.set(247, "h");252predefinedDecHash.set(248, "Y");253predefinedDecHash.set(249, "m");254predefinedDecHash.set(250, "9");255predefinedDecHash.set(251, "y");256predefinedDecHash.set(252, "Z");257predefinedDecHash.set(253, "S");258predefinedDecHash.set(254, "B");259predefinedDecHash.set(255, "l");260predefinedDecHash.set(256, "d");261predefinedDecHash.set(257, "C");262predefinedDecHash.set(258, "B");263predefinedDecHash.set(259, "k");264predefinedDecHash.set(260, "b");265predefinedDecHash.set(261, "2");266predefinedDecHash.set(262, "x");267predefinedDecHash.set(263, "v");268predefinedDecHash.set(264, "c");269predefinedDecHash.set(265, "m");270predefinedDecHash.set(266, "U");271predefinedDecHash.set(267, "g");272predefinedDecHash.set(268, "b");273predefinedDecHash.set(269, "W");274predefinedDecHash.set(270, "F");275predefinedDecHash.set(271, "n");276predefinedDecHash.set(272, "b");277predefinedDecHash.set(273, "m");278predefinedDecHash.set(274, "E");279predefinedDecHash.set(275, "g");280predefinedDecHash.set(276, "Y");281predefinedDecHash.set(277, "W");282predefinedDecHash.set(278, "x");283predefinedDecHash.set(279, "p");284predefinedDecHash.set(280, "c");285predefinedDecHash.set(281, "X");286predefinedDecHash.set(282, "V");287predefinedDecHash.set(283, "h");288predefinedDecHash.set(284, "L");289predefinedDecHash.set(285, "i");290predefinedDecHash.set(286, "B");291predefinedDecHash.set(287, "V");292predefinedDecHash.set(288, "d");293predefinedDecHash.set(289, "C");294predefinedDecHash.set(290, "B");295predefinedDecHash.set(291, "l");296predefinedDecHash.set(292, "b");297predefinedDecHash.set(293, "m");298predefinedDecHash.set(294, "l");299predefinedDecHash.set(295, "t");300predefinedDecHash.set(296, "I");301predefinedDecHash.set(297, "G");302predefinedDecHash.set(298, "F");303predefinedDecHash.set(299, "k");304predefinedDecHash.set(300, "I");305predefinedDecHash.set(301, "G");306predefinedDecHash.set(302, "1");307predefinedDecHash.set(303, "p");308predefinedDecHash.set(304, "b");309predefinedDecHash.set(305, "m");310predefinedDecHash.set(306, "l");311predefinedDecHash.set(307, "t");312predefinedDecHash.set(308, "I");313predefinedDecHash.set(309, "H");314predefinedDecHash.set(310, "Z");315predefinedDecHash.set(311, "l");316predefinedDecHash.set(312, "b");317predefinedDecHash.set(313, "m");318predefinedDecHash.set(314, "l");319predefinedDecHash.set(315, "h");320predefinedDecHash.set(316, "b");321predefinedDecHash.set(317, "S");322predefinedDecHash.set(318, "w");323predefinedDecHash.set(319, "g");324predefinedDecHash.set(320, "c");325predefinedDecHash.set(321, "X");326predefinedDecHash.set(322, "V");327predefinedDecHash.set(323, "p");328predefinedDecHash.set(324, "c");329predefinedDecHash.set(325, "y");330predefinedDecHash.set(326, "B");331predefinedDecHash.set(327, "u");332predefinedDecHash.set(328, "b");333predefinedDecHash.set(329, "3");334predefinedDecHash.set(330, "N");335predefinedDecHash.set(331, "0");336predefinedDecHash.set(332, "c");337predefinedDecHash.set(333, "n");338predefinedDecHash.set(334, "V");339predefinedDecHash.set(335, "k");340predefinedDecHash.set(336, "I");341predefinedDecHash.set(337, "G");342predefinedDecHash.set(338, "V");343predefinedDecHash.set(339, "4");344predefinedDecHash.set(340, "Z");345predefinedDecHash.set(341, "X");346predefinedDecHash.set(342, "J");347predefinedDecHash.set(343, "j");348predefinedDecHash.set(344, "a");349predefinedDecHash.set(345, "X");350predefinedDecHash.set(346, "R");351predefinedDecHash.set(347, "h");352predefinedDecHash.set(348, "d");353predefinedDecHash.set(349, "G");354predefinedDecHash.set(350, "l");355predefinedDecHash.set(351, "v");356predefinedDecHash.set(352, "b");357predefinedDecHash.set(353, "i");358predefinedDecHash.set(354, "B");359predefinedDecHash.set(355, "1");360predefinedDecHash.set(356, "b");361predefinedDecHash.set(357, "G");362predefinedDecHash.set(358, "x");363predefinedDecHash.set(359, "h");364predefinedDecHash.set(360, "b");365predefinedDecHash.set(361, "W");366predefinedDecHash.set(362, "N");367predefinedDecHash.set(363, "v");368predefinedDecHash.set(364, "I");369predefinedDecHash.set(365, "G");370predefinedDecHash.set(366, "x");371predefinedDecHash.set(367, "h");372predefinedDecHash.set(368, "Y");373predefinedDecHash.set(369, "m");374predefinedDecHash.set(370, "9");375predefinedDecHash.set(371, "y");376predefinedDecHash.set(372, "a");377predefinedDecHash.set(373, "X");378predefinedDecHash.set(374, "M");379predefinedDecHash.set(375, "g");380predefinedDecHash.set(376, "b");381predefinedDecHash.set(377, "m");382predefinedDecHash.set(378, "l");383predefinedDecHash.set(379, "z");384predefinedDecHash.set(380, "a");385predefinedDecHash.set(381, "S");386predefinedDecHash.set(382, "B");387predefinedDecHash.set(383, "1");388predefinedDecHash.set(384, "d");389predefinedDecHash.set(385, "C");390predefinedDecHash.set(386, "B");391predefinedDecHash.set(387, "h");392predefinedDecHash.set(388, "b");393predefinedDecHash.set(389, "G");394predefinedDecHash.set(390, "l");395predefinedDecHash.set(391, "x");396predefinedDecHash.set(392, "d");397predefinedDecHash.set(393, "W");398predefinedDecHash.set(394, "l");399predefinedDecHash.set(395, "w");400predefinedDecHash.set(396, "I");401predefinedDecHash.set(397, "G");402predefinedDecHash.set(398, "V");403predefinedDecHash.set(399, "4");404predefinedDecHash.set(400, "I");405predefinedDecHash.set(401, "G");406predefinedDecHash.set(402, "V");407predefinedDecHash.set(403, "h");408predefinedDecHash.set(404, "I");409predefinedDecHash.set(405, "G");410predefinedDecHash.set(406, "N");411predefinedDecHash.set(407, "v");412predefinedDecHash.set(408, "b");413predefinedDecHash.set(409, "W");414predefinedDecHash.set(410, "1");415predefinedDecHash.set(411, "v");416predefinedDecHash.set(412, "Z");417predefinedDecHash.set(413, "G");418predefinedDecHash.set(414, "8");419predefinedDecHash.set(415, "g");420predefinedDecHash.set(416, "Y");421predefinedDecHash.set(417, "2");422predefinedDecHash.set(418, "9");423predefinedDecHash.set(419, "u");424predefinedDecHash.set(420, "c");425predefinedDecHash.set(421, "2");426predefinedDecHash.set(422, "V");427predefinedDecHash.set(423, "x");428predefinedDecHash.set(424, "d");429predefinedDecHash.set(425, "W");430predefinedDecHash.set(426, "F");431predefinedDecHash.set(427, "0");432predefinedDecHash.set(428, "L");433predefinedDecHash.set(429, "i");434predefinedDecHash.set(430, "B");435predefinedDecHash.set(431, "E");436predefinedDecHash.set(432, "d");437predefinedDecHash.set(433, "W");438predefinedDecHash.set(434, "l");439predefinedDecHash.set(435, "z");440predefinedDecHash.set(436, "I");441predefinedDecHash.set(437, "G");442predefinedDecHash.set(438, "F");443predefinedDecHash.set(439, "1");444predefinedDecHash.set(440, "d");445predefinedDecHash.set(441, "G");446predefinedDecHash.set(442, "U");447predefinedDecHash.set(443, "g");448predefinedDecHash.set(444, "a");449predefinedDecHash.set(445, "X");450predefinedDecHash.set(446, "J");451predefinedDecHash.set(447, "1");452predefinedDecHash.set(448, "c");453predefinedDecHash.set(449, "m");454predefinedDecHash.set(450, "U");455predefinedDecHash.set(451, "g");456predefinedDecHash.set(452, "Z");457predefinedDecHash.set(453, "G");458predefinedDecHash.set(454, "9");459predefinedDecHash.set(455, "s");460predefinedDecHash.set(456, "b");461predefinedDecHash.set(457, "3");462predefinedDecHash.set(458, "I");463predefinedDecHash.set(459, "g");464predefinedDecHash.set(460, "a");465predefinedDecHash.set(461, "W");466predefinedDecHash.set(462, "4");467predefinedDecHash.set(463, "g");468predefinedDecHash.set(464, "c");469predefinedDecHash.set(465, "m");470predefinedDecHash.set(466, "V");471predefinedDecHash.set(467, "w");472predefinedDecHash.set(468, "c");473predefinedDecHash.set(469, "m");474predefinedDecHash.set(470, "V");475predefinedDecHash.set(471, "o");476predefinedDecHash.set(472, "Z");477predefinedDecHash.set(473, "W");478predefinedDecHash.set(474, "5");479predefinedDecHash.set(475, "k");480predefinedDecHash.set(476, "Z");481predefinedDecHash.set(477, "X");482predefinedDecHash.set(478, "J");483predefinedDecHash.set(479, "p");484predefinedDecHash.set(480, "d");485predefinedDecHash.set(481, "C");486predefinedDecHash.set(482, "B");487predefinedDecHash.set(483, "p");488predefinedDecHash.set(484, "b");489predefinedDecHash.set(485, "i");490predefinedDecHash.set(486, "B");491predefinedDecHash.set(487, "2");492predefinedDecHash.set(488, "b");493predefinedDecHash.set(489, "2");494predefinedDecHash.set(490, "x");495predefinedDecHash.set(491, "1");496predefinedDecHash.set(492, "c");497predefinedDecHash.set(493, "H");498predefinedDecHash.set(494, "R");499predefinedDecHash.set(495, "h");500predefinedDecHash.set(496, "d");501predefinedDecHash.set(497, "G");502predefinedDecHash.set(498, "U");503predefinedDecHash.set(499, "g");504predefinedDecHash.set(500, "d");505predefinedDecHash.set(501, "m");506predefinedDecHash.set(502, "V");507predefinedDecHash.set(503, "s");508predefinedDecHash.set(504, "a");509predefinedDecHash.set(505, "X");510predefinedDecHash.set(506, "Q");511predefinedDecHash.set(507, "g");512predefinedDecHash.set(508, "Z");513predefinedDecHash.set(509, "X");514predefinedDecHash.set(510, "N");515predefinedDecHash.set(511, "z");516predefinedDecHash.set(512, "Z");517predefinedDecHash.set(513, "S");518predefinedDecHash.set(514, "B");519predefinedDecHash.set(515, "j");520predefinedDecHash.set(516, "a");521predefinedDecHash.set(517, "W");522predefinedDecHash.set(518, "x");523predefinedDecHash.set(519, "s");524predefinedDecHash.set(520, "d");525predefinedDecHash.set(521, "W");526predefinedDecHash.set(522, "0");527predefinedDecHash.set(523, "g");528predefinedDecHash.set(524, "Z");529predefinedDecHash.set(525, "G");530predefinedDecHash.set(526, "9");531predefinedDecHash.set(527, "s");532predefinedDecHash.set(528, "b");533predefinedDecHash.set(529, "3");534predefinedDecHash.set(530, "J");535predefinedDecHash.set(531, "l");536predefinedDecHash.set(532, "I");537predefinedDecHash.set(533, "G");538predefinedDecHash.set(534, "V");539predefinedDecHash.set(535, "1");540predefinedDecHash.set(536, "I");541predefinedDecHash.set(537, "G");542predefinedDecHash.set(538, "Z");543predefinedDecHash.set(539, "1");544predefinedDecHash.set(540, "Z");545predefinedDecHash.set(541, "2");546predefinedDecHash.set(542, "l");547predefinedDecHash.set(543, "h");548predefinedDecHash.set(544, "d");549predefinedDecHash.set(545, "C");550predefinedDecHash.set(546, "B");551predefinedDecHash.set(547, "u");552predefinedDecHash.set(548, "d");553predefinedDecHash.set(549, "W");554predefinedDecHash.set(550, "x");555predefinedDecHash.set(551, "s");556predefinedDecHash.set(552, "Y");557predefinedDecHash.set(553, "S");558predefinedDecHash.set(554, "B");559predefinedDecHash.set(555, "w");560predefinedDecHash.set(556, "Y");561predefinedDecHash.set(557, "X");562predefinedDecHash.set(558, "J");563predefinedDecHash.set(559, "p");564predefinedDecHash.set(560, "Y");565predefinedDecHash.set(561, "X");566predefinedDecHash.set(562, "R");567predefinedDecHash.set(563, "1");568predefinedDecHash.set(564, "c");569predefinedDecHash.set(565, "i");570predefinedDecHash.set(566, "4");571predefinedDecHash.set(567, "g");572predefinedDecHash.set(568, "R");573predefinedDecHash.set(569, "X");574predefinedDecHash.set(570, "h");575predefinedDecHash.set(571, "j");576predefinedDecHash.set(572, "Z");577predefinedDecHash.set(573, "X");578predefinedDecHash.set(574, "B");579predefinedDecHash.set(575, "0");580predefinedDecHash.set(576, "Z");581predefinedDecHash.set(577, "X");582predefinedDecHash.set(578, "V");583predefinedDecHash.set(579, "y");584predefinedDecHash.set(580, "I");585predefinedDecHash.set(581, "H");586predefinedDecHash.set(582, "N");587predefinedDecHash.set(583, "p");588predefinedDecHash.set(584, "b");589predefinedDecHash.set(585, "n");590predefinedDecHash.set(586, "Q");591predefinedDecHash.set(587, "g");592predefinedDecHash.set(588, "b");593predefinedDecHash.set(589, "2");594predefinedDecHash.set(590, "N");595predefinedDecHash.set(591, "j");596predefinedDecHash.set(592, "Y");597predefinedDecHash.set(593, "W");598predefinedDecHash.set(594, "V");599predefinedDecHash.set(595, "j");600predefinedDecHash.set(596, "Y");601predefinedDecHash.set(597, "X");602predefinedDecHash.set(598, "Q");603predefinedDecHash.set(599, "g");604predefinedDecHash.set(600, "Y");605predefinedDecHash.set(601, "3");606predefinedDecHash.set(602, "V");607predefinedDecHash.set(603, "w");608predefinedDecHash.set(604, "a");609predefinedDecHash.set(605, "W");610predefinedDecHash.set(606, "R");611predefinedDecHash.set(607, "h");612predefinedDecHash.set(608, "d");613predefinedDecHash.set(609, "G");614predefinedDecHash.set(610, "F");615predefinedDecHash.set(611, "0");616predefinedDecHash.set(612, "I");617predefinedDecHash.set(613, "G");618predefinedDecHash.set(614, "5");619predefinedDecHash.set(615, "v");620predefinedDecHash.set(616, "b");621predefinedDecHash.set(617, "i");622predefinedDecHash.set(618, "B");623predefinedDecHash.set(619, "w");624predefinedDecHash.set(620, "c");625predefinedDecHash.set(621, "m");626predefinedDecHash.set(622, "9");627predefinedDecHash.set(623, "p");628predefinedDecHash.set(624, "Z");629predefinedDecHash.set(625, "G");630predefinedDecHash.set(626, "V");631predefinedDecHash.set(627, "u");632predefinedDecHash.set(628, "d");633predefinedDecHash.set(629, "C");634predefinedDecHash.set(630, "w");635predefinedDecHash.set(631, "g");636predefinedDecHash.set(632, "c");637predefinedDecHash.set(633, "3");638predefinedDecHash.set(634, "V");639predefinedDecHash.set(635, "u");640predefinedDecHash.set(636, "d");641predefinedDecHash.set(637, "C");642predefinedDecHash.set(638, "B");643predefinedDecHash.set(639, "p");644predefinedDecHash.set(640, "b");645predefinedDecHash.set(641, "i");646predefinedDecHash.set(642, "B");647predefinedDecHash.set(643, "j");648predefinedDecHash.set(644, "d");649predefinedDecHash.set(645, "W");650predefinedDecHash.set(646, "x");651predefinedDecHash.set(647, "w");652predefinedDecHash.set(648, "Y");653predefinedDecHash.set(649, "S");654predefinedDecHash.set(650, "B");655predefinedDecHash.set(651, "x");656predefinedDecHash.set(652, "d");657predefinedDecHash.set(653, "W");658predefinedDecHash.set(654, "k");659predefinedDecHash.set(655, "g");660predefinedDecHash.set(656, "b");661predefinedDecHash.set(657, "2");662predefinedDecHash.set(658, "Z");663predefinedDecHash.set(659, "m");664predefinedDecHash.set(660, "a");665predefinedDecHash.set(661, "W");666predefinedDecHash.set(662, "N");667predefinedDecHash.set(663, "p");668predefinedDecHash.set(664, "Y");669predefinedDecHash.set(665, "S");670predefinedDecHash.set(666, "B");671predefinedDecHash.set(667, "k");672predefinedDecHash.set(668, "Z");673predefinedDecHash.set(669, "X");674predefinedDecHash.set(670, "N");675predefinedDecHash.set(671, "l");676predefinedDecHash.set(672, "c");677predefinedDecHash.set(673, "n");678predefinedDecHash.set(674, "V");679predefinedDecHash.set(675, "u");680predefinedDecHash.set(676, "d");681predefinedDecHash.set(677, "C");682predefinedDecHash.set(678, "B");683predefinedDecHash.set(679, "t");684predefinedDecHash.set(680, "b");685predefinedDecHash.set(681, "2");686predefinedDecHash.set(682, "x");687predefinedDecHash.set(683, "s");688predefinedDecHash.set(684, "a");689predefinedDecHash.set(685, "X");690predefinedDecHash.set(686, "Q");691predefinedDecHash.set(687, "g");692predefinedDecHash.set(688, "Y");693predefinedDecHash.set(689, "W");694predefinedDecHash.set(690, "5");695predefinedDecHash.set(691, "p");696predefinedDecHash.set(692, "b");697predefinedDecHash.set(693, "S");698predefinedDecHash.set(694, "B");699predefinedDecHash.set(695, "p");700predefinedDecHash.set(696, "Z");701predefinedDecHash.set(697, "C");702predefinedDecHash.set(698, "B");703predefinedDecHash.set(699, "l");704predefinedDecHash.set(700, "c");705predefinedDecHash.set(701, "3");706predefinedDecHash.set(702, "Q");707predefinedDecHash.set(703, "g");708predefinedDecHash.set(704, "b");709predefinedDecHash.set(705, "G");710predefinedDecHash.set(706, "F");711predefinedDecHash.set(707, "i");712predefinedDecHash.set(708, "b");713predefinedDecHash.set(709, "3");714predefinedDecHash.set(710, "J");715predefinedDecHash.set(711, "1");716predefinedDecHash.set(712, "b");717predefinedDecHash.set(713, "S");718predefinedDecHash.set(714, "4");719predefinedDecHash.set(715, "D");720predefinedDecHash.set(716, "q");721predefinedDecHash.set(717, "6");722predefinedDecHash.set(718, "/");723724predefinedEncHash.set("A", [70,90]);725predefinedEncHash.set("B", [22,150,158,174,202,206,222,226,254,258,286,290,326,354,382,386,430,482,486,514,546,554,574,618,638,642,650,666,678,694,698]);726predefinedEncHash.set("C", [21,93,149,157,201,257,289,385,481,545,629,637,677,697]);727predefinedEncHash.set("D", [0,715]);728predefinedEncHash.set("E", [37,49,121,274,431]);729predefinedEncHash.set("F", [9,10,17,270,298,426,438,610,706]);730predefinedEncHash.set("G", [5,23,33,45,65,129,137,141,177,189,233,245,297,301,337,349,357,365,389,397,401,405,413,437,441,453,497,525,533,537,609,613,625,705]);731predefinedEncHash.set("H", [81,145,197,217,241,309,493,581]);732predefinedEncHash.set("I", [8,16,36,42,48,88,118,128,136,144,188,196,216,240,244,296,300,308,336,364,396,400,404,436,458,532,536,580,612]);733predefinedEncHash.set("J", [18,58,92,96,342,446,478,530,558,710]);734predefinedEncHash.set("K", [100]);735predefinedEncHash.set("L", [68,156,284,428]);736predefinedEncHash.set("M", [116,374]);737predefinedEncHash.set("N", [14,112,146,166,182,198,230,330,362,406,510,582,590,662,670]);738predefinedEncHash.set("O", [108]);739predefinedEncHash.set("P", [72,76,104]);740predefinedEncHash.set("Q", [56,194,506,586,598,686,702]);741predefinedEncHash.set("R", [64,138,170,218,346,494,562,568,606]);742predefinedEncHash.set("S", [28,105,253,317,381,513,553,649,665,693,713]);743predefinedEncHash.set("T", [109]);744predefinedEncHash.set("U", [89,114,266,442,450,498]);745predefinedEncHash.set("V", [4,30,34,94,101,126,134,154,190,210,242,282,287,322,334,338,398,402,422,466,470,502,534,578,594,602,626,634,674]);746predefinedEncHash.set("W", [13,84,153,165,185,213,237,269,277,361,393,409,425,433,461,473,517,521,549,593,605,645,653,661,689]);747predefinedEncHash.set("X", [41,169,181,193,209,221,281,321,341,345,373,445,477,505,509,557,561,569,573,577,597,669,685]);748predefinedEncHash.set("Y", [120,248,276,368,416,552,556,560,592,596,600,648,664,688]);749predefinedEncHash.set("Z", [20,40,164,168,176,200,232,252,310,340,412,452,472,476,508,512,524,538,540,572,576,624,658,668,696]);750predefinedEncHash.set("a", [12,180,184,192,208,344,372,380,444,460,504,516,604,660,684]);751predefinedEncHash.set("b", [24,140,152,160,204,212,220,228,260,268,272,292,304,312,316,328,352,356,360,376,388,408,456,484,488,528,584,588,616,640,656,680,692,704,708,712]);752predefinedEncHash.set("c", [32,124,132,172,224,264,280,320,324,332,420,448,464,468,492,564,620,632,672,700]);753predefinedEncHash.set("d", [44,60,148,236,256,288,348,384,392,424,432,440,480,496,500,520,544,548,608,628,636,644,652,676]);754predefinedEncHash.set("e", [52,95]);755predefinedEncHash.set("f", [80]);756predefinedEncHash.set("g", [26,27,43,55,63,110,267,275,319,375,415,443,451,459,463,499,507,523,567,587,599,631,655,687,703]);757predefinedEncHash.set("h", [6,46,51,151,175,247,283,315,347,359,367,387,403,495,543,570,607]);758predefinedEncHash.set("i", [69,73,97,173,225,285,353,429,485,565,617,641,707]);759predefinedEncHash.set("j", [91,113,159,183,343,515,571,591,595,643]);760predefinedEncHash.set("k", [35,54,203,215,235,259,299,335,475,654,667]);761predefinedEncHash.set("l", [7,19,47,130,178,199,207,219,234,255,291,294,306,311,314,350,378,390,394,434,531,542,671,699]);762predefinedEncHash.set("m", [125,229,249,265,273,293,305,313,369,377,449,465,469,501,621,659]);763predefinedEncHash.set("n", [29,53,57,67,187,271,333,585,673]);764predefinedEncHash.set("o", [78,98,99,471]);765predefinedEncHash.set("p", [147,227,231,279,303,323,479,483,559,583,623,639,663,691,695]);766predefinedEncHash.set("q", [1,716]);767predefinedEncHash.set("r", [15,103]);768predefinedEncHash.set("s", [191,195,455,503,519,527,551,683]);769predefinedEncHash.set("t", [31,82,127,135,295,307,679]);770predefinedEncHash.set("u", [75,327,419,547,627,635,675]);771predefinedEncHash.set("v", [59,123,139,223,263,351,363,407,411,615]);772predefinedEncHash.set("w", [74,107,131,179,318,395,467,555,603,619,630,647]);773predefinedEncHash.set("x", [50,119,122,246,262,278,358,366,391,423,490,518,550,646,651,682]);774predefinedEncHash.set("y", [143,205,251,325,371,579]);775predefinedEncHash.set("z", [77,117,163,211,379,435,511]);776predefinedEncHash.set("0", [106,115,155,167,239,243,331,427,522,575,611]);777predefinedEncHash.set("1", [11,85,86,171,302,355,383,410,439,447,491,535,539,563,711]);778predefinedEncHash.set("2", [39,61,161,261,417,421,487,489,541,589,657,681]);779predefinedEncHash.set("3", [25,111,133,329,457,529,601,633,701,709]);780predefinedEncHash.set("4", [62,339,399,462,566,714]);781predefinedEncHash.set("5", [162,186,238,474,614,690]);782predefinedEncHash.set("6", [2,717]);783predefinedEncHash.set("7", [79]);784predefinedEncHash.set("8", [71,102,414]);785predefinedEncHash.set("9", [38,66,83,142,214,250,370,418,454,526,622]);786predefinedEncHash.set("+", [87]);
...history-hash-debug.js
Source:history-hash-debug.js  
1/*2YUI 3.17.2 (build 9c3c78e)3Copyright 2014 Yahoo! Inc. All rights reserved.4Licensed under the BSD License.5http://yuilibrary.com/license/6*/7YUI.add('history-hash', function (Y, NAME) {8/**9 * Provides browser history management backed by10 * <code>window.location.hash</code>, as well as convenience methods for working11 * with the location hash and a synthetic <code>hashchange</code> event that12 * normalizes differences across browsers.13 *14 * @module history15 * @submodule history-hash16 * @since 3.2.017 * @class HistoryHash18 * @extends HistoryBase19 * @constructor20 * @param {Object} config (optional) Configuration object. See the HistoryBase21 *   documentation for details.22 */23var HistoryBase = Y.HistoryBase,24    Lang        = Y.Lang,25    YArray      = Y.Array,26    YObject     = Y.Object,27    GlobalEnv   = YUI.namespace('Env.HistoryHash'),28    SRC_HASH    = 'hash',29    hashNotifiers,30    oldHash,31    oldUrl,32    win             = Y.config.win,33    useHistoryHTML5 = Y.config.useHistoryHTML5;34function HistoryHash() {35    HistoryHash.superclass.constructor.apply(this, arguments);36}37Y.extend(HistoryHash, HistoryBase, {38    // -- Initialization -------------------------------------------------------39    _init: function (config) {40        var bookmarkedState = HistoryHash.parseHash();41        // If an initialState was provided, merge the bookmarked state into it42        // (the bookmarked state wins).43        config = config || {};44        this._initialState = config.initialState ?45                Y.merge(config.initialState, bookmarkedState) : bookmarkedState;46        // Subscribe to the synthetic hashchange event (defined below) to handle47        // changes.48        Y.after('hashchange', Y.bind(this._afterHashChange, this), win);49        HistoryHash.superclass._init.apply(this, arguments);50    },51    // -- Protected Methods ----------------------------------------------------52    _change: function (src, state, options) {53        // Stringify all values to ensure that comparisons don't fail after54        // they're coerced to strings in the location hash.55        YObject.each(state, function (value, key) {56            if (Lang.isValue(value)) {57                state[key] = value.toString();58            }59        });60        return HistoryHash.superclass._change.call(this, src, state, options);61    },62    _storeState: function (src, newState) {63        var decode  = HistoryHash.decode,64            newHash = HistoryHash.createHash(newState);65        HistoryHash.superclass._storeState.apply(this, arguments);66        // Update the location hash with the changes, but only if the new hash67        // actually differs from the current hash (this avoids creating multiple68        // history entries for a single state).69        //70        // We always compare decoded hashes, since it's possible that the hash71        // could be set incorrectly to a non-encoded value outside of72        // HistoryHash.73        if (src !== SRC_HASH && decode(HistoryHash.getHash()) !== decode(newHash)) {74            HistoryHash[src === HistoryBase.SRC_REPLACE ? 'replaceHash' : 'setHash'](newHash);75        }76    },77    // -- Protected Event Handlers ---------------------------------------------78    /**79     * Handler for hashchange events.80     *81     * @method _afterHashChange82     * @param {Event} e83     * @protected84     */85    _afterHashChange: function (e) {86        this._resolveChanges(SRC_HASH, HistoryHash.parseHash(e.newHash), {});87    }88}, {89    // -- Public Static Properties ---------------------------------------------90    NAME: 'historyHash',91    /**92     * Constant used to identify state changes originating from93     * <code>hashchange</code> events.94     *95     * @property SRC_HASH96     * @type String97     * @static98     * @final99     */100    SRC_HASH: SRC_HASH,101    /**102     * <p>103     * Prefix to prepend when setting the hash fragment. For example, if the104     * prefix is <code>!</code> and the hash fragment is set to105     * <code>#foo=bar&baz=quux</code>, the final hash fragment in the URL will106     * become <code>#!foo=bar&baz=quux</code>. This can be used to help make an107     * Ajax application crawlable in accordance with Google's guidelines at108     * <a href="http://code.google.com/web/ajaxcrawling/">http://code.google.com/web/ajaxcrawling/</a>.109     * </p>110     *111     * <p>112     * Note that this prefix applies to all HistoryHash instances. It's not113     * possible for individual instances to use their own prefixes since they114     * all operate on the same URL.115     * </p>116     *117     * @property hashPrefix118     * @type String119     * @default ''120     * @static121     */122    hashPrefix: '',123    // -- Protected Static Properties ------------------------------------------124    /**125     * Regular expression used to parse location hash/query strings.126     *127     * @property _REGEX_HASH128     * @type RegExp129     * @protected130     * @static131     * @final132     */133    _REGEX_HASH: /([^\?#&=]+)=?([^&=]*)/g,134    // -- Public Static Methods ------------------------------------------------135    /**136     * Creates a location hash string from the specified object of key/value137     * pairs.138     *139     * @method createHash140     * @param {Object} params object of key/value parameter pairs141     * @return {String} location hash string142     * @static143     */144    createHash: function (params) {145        var encode = HistoryHash.encode,146            hash   = [];147        YObject.each(params, function (value, key) {148            if (Lang.isValue(value)) {149                hash.push(encode(key) + '=' + encode(value));150            }151        });152        return hash.join('&');153    },154    /**155     * Wrapper around <code>decodeURIComponent()</code> that also converts +156     * chars into spaces.157     *158     * @method decode159     * @param {String} string string to decode160     * @return {String} decoded string161     * @static162     */163    decode: function (string) {164        return decodeURIComponent(string.replace(/\+/g, ' '));165    },166    /**167     * Wrapper around <code>encodeURIComponent()</code> that converts spaces to168     * + chars.169     *170     * @method encode171     * @param {String} string string to encode172     * @return {String} encoded string173     * @static174     */175    encode: function (string) {176        return encodeURIComponent(string).replace(/%20/g, '+');177    },178    /**179     * Gets the raw (not decoded) current location hash, minus the preceding '#'180     * character and the hashPrefix (if one is set).181     *182     * @method getHash183     * @return {String} current location hash184     * @static185     */186    getHash: (Y.UA.gecko ? function () {187        // Gecko's window.location.hash returns a decoded string and we want all188        // encoding untouched, so we need to get the hash value from189        // window.location.href instead. We have to use UA sniffing rather than190        // feature detection, since the only way to detect this would be to191        // actually change the hash.192        var location = Y.getLocation(),193            matches  = /#(.*)$/.exec(location.href),194            hash     = matches && matches[1] || '',195            prefix   = HistoryHash.hashPrefix;196        return prefix && hash.indexOf(prefix) === 0 ?197                    hash.replace(prefix, '') : hash;198    } : function () {199        var location = Y.getLocation(),200            hash     = location.hash.substring(1),201            prefix   = HistoryHash.hashPrefix;202        // Slight code duplication here, but execution speed is of the essence203        // since getHash() is called every 50ms to poll for changes in browsers204        // that don't support native onhashchange. An additional function call205        // would add unnecessary overhead.206        return prefix && hash.indexOf(prefix) === 0 ?207                    hash.replace(prefix, '') : hash;208    }),209    /**210     * Gets the current bookmarkable URL.211     *212     * @method getUrl213     * @return {String} current bookmarkable URL214     * @static215     */216    getUrl: function () {217        return location.href;218    },219    /**220     * Parses a location hash string into an object of key/value parameter221     * pairs. If <i>hash</i> is not specified, the current location hash will222     * be used.223     *224     * @method parseHash225     * @param {String} hash (optional) location hash string226     * @return {Object} object of parsed key/value parameter pairs227     * @static228     */229    parseHash: function (hash) {230        var decode = HistoryHash.decode,231            i,232            len,233            match,234            matches,235            param,236            params = {},237            prefix = HistoryHash.hashPrefix,238            prefixIndex;239        hash = Lang.isValue(hash) ? hash : HistoryHash.getHash();240        if (prefix) {241            prefixIndex = hash.indexOf(prefix);242            if (prefixIndex === 0 || (prefixIndex === 1 && hash.charAt(0) === '#')) {243                hash = hash.replace(prefix, '');244            }245        }246        matches = hash.match(HistoryHash._REGEX_HASH) || [];247        for (i = 0, len = matches.length; i < len; ++i) {248            match = matches[i];249            param = match.split('=');250            if (param.length > 1) {251                params[decode(param[0])] = decode(param[1]);252            } else {253                params[decode(match)] = '';254            }255        }256        return params;257    },258    /**259     * Replaces the browser's current location hash with the specified hash260     * and removes all forward navigation states, without creating a new browser261     * history entry. Automatically prepends the <code>hashPrefix</code> if one262     * is set.263     *264     * @method replaceHash265     * @param {String} hash new location hash266     * @static267     */268    replaceHash: function (hash) {269        var location = Y.getLocation(),270            base     = location.href.replace(/#.*$/, '');271        if (hash.charAt(0) === '#') {272            hash = hash.substring(1);273        }274        location.replace(base + '#' + (HistoryHash.hashPrefix || '') + hash);275    },276    /**277     * Sets the browser's location hash to the specified string. Automatically278     * prepends the <code>hashPrefix</code> if one is set.279     *280     * @method setHash281     * @param {String} hash new location hash282     * @static283     */284    setHash: function (hash) {285        var location = Y.getLocation();286        if (hash.charAt(0) === '#') {287            hash = hash.substring(1);288        }289        location.hash = (HistoryHash.hashPrefix || '') + hash;290    }291});292// -- Synthetic hashchange Event -----------------------------------------------293// TODO: YUIDoc currently doesn't provide a good way to document synthetic DOM294// events. For now, we're just documenting the hashchange event on the YUI295// object, which is about the best we can do until enhancements are made to296// YUIDoc.297/**298Synthetic <code>window.onhashchange</code> event that normalizes differences299across browsers and provides support for browsers that don't natively support300<code>onhashchange</code>.301This event is provided by the <code>history-hash</code> module.302@example303    YUI().use('history-hash', function (Y) {304      Y.on('hashchange', function (e) {305        // Handle hashchange events on the current window.306      }, Y.config.win);307    });308@event hashchange309@param {EventFacade} e Event facade with the following additional310  properties:311<dl>312  <dt>oldHash</dt>313  <dd>314    Previous hash fragment value before the change.315  </dd>316  <dt>oldUrl</dt>317  <dd>318    Previous URL (including the hash fragment) before the change.319  </dd>320  <dt>newHash</dt>321  <dd>322    New hash fragment value after the change.323  </dd>324  <dt>newUrl</dt>325  <dd>326    New URL (including the hash fragment) after the change.327  </dd>328</dl>329@for YUI330@since 3.2.0331**/332hashNotifiers = GlobalEnv._notifiers;333if (!hashNotifiers) {334    hashNotifiers = GlobalEnv._notifiers = [];335}336Y.Event.define('hashchange', {337    on: function (node, subscriber, notifier) {338        // Ignore this subscription if the node is anything other than the339        // window or document body, since those are the only elements that340        // should support the hashchange event. Note that the body could also be341        // a frameset, but that's okay since framesets support hashchange too.342        if (node.compareTo(win) || node.compareTo(Y.config.doc.body)) {343            hashNotifiers.push(notifier);344        }345    },346    detach: function (node, subscriber, notifier) {347        var index = YArray.indexOf(hashNotifiers, notifier);348        if (index !== -1) {349            hashNotifiers.splice(index, 1);350        }351    }352});353oldHash = HistoryHash.getHash();354oldUrl  = HistoryHash.getUrl();355if (HistoryBase.nativeHashChange) {356    // Wrap the browser's native hashchange event if there's not already a357    // global listener.358    if (!GlobalEnv._hashHandle) {359        GlobalEnv._hashHandle = Y.Event.attach('hashchange', function (e) {360            var newHash = HistoryHash.getHash(),361                newUrl  = HistoryHash.getUrl();362            // Iterate over a copy of the hashNotifiers array since a subscriber363            // could detach during iteration and cause the array to be re-indexed.364            YArray.each(hashNotifiers.concat(), function (notifier) {365                notifier.fire({366                    _event : e,367                    oldHash: oldHash,368                    oldUrl : oldUrl,369                    newHash: newHash,370                    newUrl : newUrl371                });372            });373            oldHash = newHash;374            oldUrl  = newUrl;375        }, win);376    }377} else {378    // Begin polling for location hash changes if there's not already a global379    // poll running.380    if (!GlobalEnv._hashPoll) {381        GlobalEnv._hashPoll = Y.later(50, null, function () {382            var newHash = HistoryHash.getHash(),383                facade, newUrl;384            if (oldHash !== newHash) {385                newUrl = HistoryHash.getUrl();386                facade = {387                    oldHash: oldHash,388                    oldUrl : oldUrl,389                    newHash: newHash,390                    newUrl : newUrl391                };392                oldHash = newHash;393                oldUrl  = newUrl;394                YArray.each(hashNotifiers.concat(), function (notifier) {395                    notifier.fire(facade);396                });397            }398        }, null, true);399    }400}401Y.HistoryHash = HistoryHash;402// HistoryHash will never win over HistoryHTML5 unless useHistoryHTML5 is false.403if (useHistoryHTML5 === false || (!Y.History && useHistoryHTML5 !== true &&404        (!HistoryBase.html5 || !Y.HistoryHTML5))) {405    Y.History = HistoryHash;406}...history-hash.js
Source:history-hash.js  
1/*2YUI 3.17.2 (build 9c3c78e)3Copyright 2014 Yahoo! Inc. All rights reserved.4Licensed under the BSD License.5http://yuilibrary.com/license/6*/7YUI.add('history-hash', function (Y, NAME) {8/**9 * Provides browser history management backed by10 * <code>window.location.hash</code>, as well as convenience methods for working11 * with the location hash and a synthetic <code>hashchange</code> event that12 * normalizes differences across browsers.13 *14 * @module history15 * @submodule history-hash16 * @since 3.2.017 * @class HistoryHash18 * @extends HistoryBase19 * @constructor20 * @param {Object} config (optional) Configuration object. See the HistoryBase21 *   documentation for details.22 */23var HistoryBase = Y.HistoryBase,24    Lang        = Y.Lang,25    YArray      = Y.Array,26    YObject     = Y.Object,27    GlobalEnv   = YUI.namespace('Env.HistoryHash'),28    SRC_HASH    = 'hash',29    hashNotifiers,30    oldHash,31    oldUrl,32    win             = Y.config.win,33    useHistoryHTML5 = Y.config.useHistoryHTML5;34function HistoryHash() {35    HistoryHash.superclass.constructor.apply(this, arguments);36}37Y.extend(HistoryHash, HistoryBase, {38    // -- Initialization -------------------------------------------------------39    _init: function (config) {40        var bookmarkedState = HistoryHash.parseHash();41        // If an initialState was provided, merge the bookmarked state into it42        // (the bookmarked state wins).43        config = config || {};44        this._initialState = config.initialState ?45                Y.merge(config.initialState, bookmarkedState) : bookmarkedState;46        // Subscribe to the synthetic hashchange event (defined below) to handle47        // changes.48        Y.after('hashchange', Y.bind(this._afterHashChange, this), win);49        HistoryHash.superclass._init.apply(this, arguments);50    },51    // -- Protected Methods ----------------------------------------------------52    _change: function (src, state, options) {53        // Stringify all values to ensure that comparisons don't fail after54        // they're coerced to strings in the location hash.55        YObject.each(state, function (value, key) {56            if (Lang.isValue(value)) {57                state[key] = value.toString();58            }59        });60        return HistoryHash.superclass._change.call(this, src, state, options);61    },62    _storeState: function (src, newState) {63        var decode  = HistoryHash.decode,64            newHash = HistoryHash.createHash(newState);65        HistoryHash.superclass._storeState.apply(this, arguments);66        // Update the location hash with the changes, but only if the new hash67        // actually differs from the current hash (this avoids creating multiple68        // history entries for a single state).69        //70        // We always compare decoded hashes, since it's possible that the hash71        // could be set incorrectly to a non-encoded value outside of72        // HistoryHash.73        if (src !== SRC_HASH && decode(HistoryHash.getHash()) !== decode(newHash)) {74            HistoryHash[src === HistoryBase.SRC_REPLACE ? 'replaceHash' : 'setHash'](newHash);75        }76    },77    // -- Protected Event Handlers ---------------------------------------------78    /**79     * Handler for hashchange events.80     *81     * @method _afterHashChange82     * @param {Event} e83     * @protected84     */85    _afterHashChange: function (e) {86        this._resolveChanges(SRC_HASH, HistoryHash.parseHash(e.newHash), {});87    }88}, {89    // -- Public Static Properties ---------------------------------------------90    NAME: 'historyHash',91    /**92     * Constant used to identify state changes originating from93     * <code>hashchange</code> events.94     *95     * @property SRC_HASH96     * @type String97     * @static98     * @final99     */100    SRC_HASH: SRC_HASH,101    /**102     * <p>103     * Prefix to prepend when setting the hash fragment. For example, if the104     * prefix is <code>!</code> and the hash fragment is set to105     * <code>#foo=bar&baz=quux</code>, the final hash fragment in the URL will106     * become <code>#!foo=bar&baz=quux</code>. This can be used to help make an107     * Ajax application crawlable in accordance with Google's guidelines at108     * <a href="http://code.google.com/web/ajaxcrawling/">http://code.google.com/web/ajaxcrawling/</a>.109     * </p>110     *111     * <p>112     * Note that this prefix applies to all HistoryHash instances. It's not113     * possible for individual instances to use their own prefixes since they114     * all operate on the same URL.115     * </p>116     *117     * @property hashPrefix118     * @type String119     * @default ''120     * @static121     */122    hashPrefix: '',123    // -- Protected Static Properties ------------------------------------------124    /**125     * Regular expression used to parse location hash/query strings.126     *127     * @property _REGEX_HASH128     * @type RegExp129     * @protected130     * @static131     * @final132     */133    _REGEX_HASH: /([^\?#&=]+)=?([^&=]*)/g,134    // -- Public Static Methods ------------------------------------------------135    /**136     * Creates a location hash string from the specified object of key/value137     * pairs.138     *139     * @method createHash140     * @param {Object} params object of key/value parameter pairs141     * @return {String} location hash string142     * @static143     */144    createHash: function (params) {145        var encode = HistoryHash.encode,146            hash   = [];147        YObject.each(params, function (value, key) {148            if (Lang.isValue(value)) {149                hash.push(encode(key) + '=' + encode(value));150            }151        });152        return hash.join('&');153    },154    /**155     * Wrapper around <code>decodeURIComponent()</code> that also converts +156     * chars into spaces.157     *158     * @method decode159     * @param {String} string string to decode160     * @return {String} decoded string161     * @static162     */163    decode: function (string) {164        return decodeURIComponent(string.replace(/\+/g, ' '));165    },166    /**167     * Wrapper around <code>encodeURIComponent()</code> that converts spaces to168     * + chars.169     *170     * @method encode171     * @param {String} string string to encode172     * @return {String} encoded string173     * @static174     */175    encode: function (string) {176        return encodeURIComponent(string).replace(/%20/g, '+');177    },178    /**179     * Gets the raw (not decoded) current location hash, minus the preceding '#'180     * character and the hashPrefix (if one is set).181     *182     * @method getHash183     * @return {String} current location hash184     * @static185     */186    getHash: (Y.UA.gecko ? function () {187        // Gecko's window.location.hash returns a decoded string and we want all188        // encoding untouched, so we need to get the hash value from189        // window.location.href instead. We have to use UA sniffing rather than190        // feature detection, since the only way to detect this would be to191        // actually change the hash.192        var location = Y.getLocation(),193            matches  = /#(.*)$/.exec(location.href),194            hash     = matches && matches[1] || '',195            prefix   = HistoryHash.hashPrefix;196        return prefix && hash.indexOf(prefix) === 0 ?197                    hash.replace(prefix, '') : hash;198    } : function () {199        var location = Y.getLocation(),200            hash     = location.hash.substring(1),201            prefix   = HistoryHash.hashPrefix;202        // Slight code duplication here, but execution speed is of the essence203        // since getHash() is called every 50ms to poll for changes in browsers204        // that don't support native onhashchange. An additional function call205        // would add unnecessary overhead.206        return prefix && hash.indexOf(prefix) === 0 ?207                    hash.replace(prefix, '') : hash;208    }),209    /**210     * Gets the current bookmarkable URL.211     *212     * @method getUrl213     * @return {String} current bookmarkable URL214     * @static215     */216    getUrl: function () {217        return location.href;218    },219    /**220     * Parses a location hash string into an object of key/value parameter221     * pairs. If <i>hash</i> is not specified, the current location hash will222     * be used.223     *224     * @method parseHash225     * @param {String} hash (optional) location hash string226     * @return {Object} object of parsed key/value parameter pairs227     * @static228     */229    parseHash: function (hash) {230        var decode = HistoryHash.decode,231            i,232            len,233            match,234            matches,235            param,236            params = {},237            prefix = HistoryHash.hashPrefix,238            prefixIndex;239        hash = Lang.isValue(hash) ? hash : HistoryHash.getHash();240        if (prefix) {241            prefixIndex = hash.indexOf(prefix);242            if (prefixIndex === 0 || (prefixIndex === 1 && hash.charAt(0) === '#')) {243                hash = hash.replace(prefix, '');244            }245        }246        matches = hash.match(HistoryHash._REGEX_HASH) || [];247        for (i = 0, len = matches.length; i < len; ++i) {248            match = matches[i];249            param = match.split('=');250            if (param.length > 1) {251                params[decode(param[0])] = decode(param[1]);252            } else {253                params[decode(match)] = '';254            }255        }256        return params;257    },258    /**259     * Replaces the browser's current location hash with the specified hash260     * and removes all forward navigation states, without creating a new browser261     * history entry. Automatically prepends the <code>hashPrefix</code> if one262     * is set.263     *264     * @method replaceHash265     * @param {String} hash new location hash266     * @static267     */268    replaceHash: function (hash) {269        var location = Y.getLocation(),270            base     = location.href.replace(/#.*$/, '');271        if (hash.charAt(0) === '#') {272            hash = hash.substring(1);273        }274        location.replace(base + '#' + (HistoryHash.hashPrefix || '') + hash);275    },276    /**277     * Sets the browser's location hash to the specified string. Automatically278     * prepends the <code>hashPrefix</code> if one is set.279     *280     * @method setHash281     * @param {String} hash new location hash282     * @static283     */284    setHash: function (hash) {285        var location = Y.getLocation();286        if (hash.charAt(0) === '#') {287            hash = hash.substring(1);288        }289        location.hash = (HistoryHash.hashPrefix || '') + hash;290    }291});292// -- Synthetic hashchange Event -----------------------------------------------293// TODO: YUIDoc currently doesn't provide a good way to document synthetic DOM294// events. For now, we're just documenting the hashchange event on the YUI295// object, which is about the best we can do until enhancements are made to296// YUIDoc.297/**298Synthetic <code>window.onhashchange</code> event that normalizes differences299across browsers and provides support for browsers that don't natively support300<code>onhashchange</code>.301This event is provided by the <code>history-hash</code> module.302@example303    YUI().use('history-hash', function (Y) {304      Y.on('hashchange', function (e) {305        // Handle hashchange events on the current window.306      }, Y.config.win);307    });308@event hashchange309@param {EventFacade} e Event facade with the following additional310  properties:311<dl>312  <dt>oldHash</dt>313  <dd>314    Previous hash fragment value before the change.315  </dd>316  <dt>oldUrl</dt>317  <dd>318    Previous URL (including the hash fragment) before the change.319  </dd>320  <dt>newHash</dt>321  <dd>322    New hash fragment value after the change.323  </dd>324  <dt>newUrl</dt>325  <dd>326    New URL (including the hash fragment) after the change.327  </dd>328</dl>329@for YUI330@since 3.2.0331**/332hashNotifiers = GlobalEnv._notifiers;333if (!hashNotifiers) {334    hashNotifiers = GlobalEnv._notifiers = [];335}336Y.Event.define('hashchange', {337    on: function (node, subscriber, notifier) {338        // Ignore this subscription if the node is anything other than the339        // window or document body, since those are the only elements that340        // should support the hashchange event. Note that the body could also be341        // a frameset, but that's okay since framesets support hashchange too.342        if (node.compareTo(win) || node.compareTo(Y.config.doc.body)) {343            hashNotifiers.push(notifier);344        }345    },346    detach: function (node, subscriber, notifier) {347        var index = YArray.indexOf(hashNotifiers, notifier);348        if (index !== -1) {349            hashNotifiers.splice(index, 1);350        }351    }352});353oldHash = HistoryHash.getHash();354oldUrl  = HistoryHash.getUrl();355if (HistoryBase.nativeHashChange) {356    // Wrap the browser's native hashchange event if there's not already a357    // global listener.358    if (!GlobalEnv._hashHandle) {359        GlobalEnv._hashHandle = Y.Event.attach('hashchange', function (e) {360            var newHash = HistoryHash.getHash(),361                newUrl  = HistoryHash.getUrl();362            // Iterate over a copy of the hashNotifiers array since a subscriber363            // could detach during iteration and cause the array to be re-indexed.364            YArray.each(hashNotifiers.concat(), function (notifier) {365                notifier.fire({366                    _event : e,367                    oldHash: oldHash,368                    oldUrl : oldUrl,369                    newHash: newHash,370                    newUrl : newUrl371                });372            });373            oldHash = newHash;374            oldUrl  = newUrl;375        }, win);376    }377} else {378    // Begin polling for location hash changes if there's not already a global379    // poll running.380    if (!GlobalEnv._hashPoll) {381        GlobalEnv._hashPoll = Y.later(50, null, function () {382            var newHash = HistoryHash.getHash(),383                facade, newUrl;384            if (oldHash !== newHash) {385                newUrl = HistoryHash.getUrl();386                facade = {387                    oldHash: oldHash,388                    oldUrl : oldUrl,389                    newHash: newHash,390                    newUrl : newUrl391                };392                oldHash = newHash;393                oldUrl  = newUrl;394                YArray.each(hashNotifiers.concat(), function (notifier) {395                    notifier.fire(facade);396                });397            }398        }, null, true);399    }400}401Y.HistoryHash = HistoryHash;402// HistoryHash will never win over HistoryHTML5 unless useHistoryHTML5 is false.403if (useHistoryHTML5 === false || (!Y.History && useHistoryHTML5 !== true &&404        (!HistoryBase.html5 || !Y.HistoryHTML5))) {405    Y.History = HistoryHash;406}...html.js
Source:html.js  
1/*==================================================2 *  HTML Utility Functions3 *==================================================4 */5SimileAjax.HTML = new Object();6SimileAjax.HTML._e2uHash = {};7(function() {8    var e2uHash = SimileAjax.HTML._e2uHash;9    e2uHash['nbsp']= '\u00A0[space]';10    e2uHash['iexcl']= '\u00A1';11    e2uHash['cent']= '\u00A2';12    e2uHash['pound']= '\u00A3';13    e2uHash['curren']= '\u00A4';14    e2uHash['yen']= '\u00A5';15    e2uHash['brvbar']= '\u00A6';16    e2uHash['sect']= '\u00A7';17    e2uHash['uml']= '\u00A8';18    e2uHash['copy']= '\u00A9';19    e2uHash['ordf']= '\u00AA';20    e2uHash['laquo']= '\u00AB';21    e2uHash['not']= '\u00AC';22    e2uHash['shy']= '\u00AD';23    e2uHash['reg']= '\u00AE';24    e2uHash['macr']= '\u00AF';25    e2uHash['deg']= '\u00B0';26    e2uHash['plusmn']= '\u00B1';27    e2uHash['sup2']= '\u00B2';28    e2uHash['sup3']= '\u00B3';29    e2uHash['acute']= '\u00B4';30    e2uHash['micro']= '\u00B5';31    e2uHash['para']= '\u00B6';32    e2uHash['middot']= '\u00B7';33    e2uHash['cedil']= '\u00B8';34    e2uHash['sup1']= '\u00B9';35    e2uHash['ordm']= '\u00BA';36    e2uHash['raquo']= '\u00BB';37    e2uHash['frac14']= '\u00BC';38    e2uHash['frac12']= '\u00BD';39    e2uHash['frac34']= '\u00BE';40    e2uHash['iquest']= '\u00BF';41    e2uHash['Agrave']= '\u00C0';42    e2uHash['Aacute']= '\u00C1';43    e2uHash['Acirc']= '\u00C2';44    e2uHash['Atilde']= '\u00C3';45    e2uHash['Auml']= '\u00C4';46    e2uHash['Aring']= '\u00C5';47    e2uHash['AElig']= '\u00C6';48    e2uHash['Ccedil']= '\u00C7';49    e2uHash['Egrave']= '\u00C8';50    e2uHash['Eacute']= '\u00C9';51    e2uHash['Ecirc']= '\u00CA';52    e2uHash['Euml']= '\u00CB';53    e2uHash['Igrave']= '\u00CC';54    e2uHash['Iacute']= '\u00CD';55    e2uHash['Icirc']= '\u00CE';56    e2uHash['Iuml']= '\u00CF';57    e2uHash['ETH']= '\u00D0';58    e2uHash['Ntilde']= '\u00D1';59    e2uHash['Ograve']= '\u00D2';60    e2uHash['Oacute']= '\u00D3';61    e2uHash['Ocirc']= '\u00D4';62    e2uHash['Otilde']= '\u00D5';63    e2uHash['Ouml']= '\u00D6';64    e2uHash['times']= '\u00D7';65    e2uHash['Oslash']= '\u00D8';66    e2uHash['Ugrave']= '\u00D9';67    e2uHash['Uacute']= '\u00DA';68    e2uHash['Ucirc']= '\u00DB';69    e2uHash['Uuml']= '\u00DC';70    e2uHash['Yacute']= '\u00DD';71    e2uHash['THORN']= '\u00DE';72    e2uHash['szlig']= '\u00DF';73    e2uHash['agrave']= '\u00E0';74    e2uHash['aacute']= '\u00E1';75    e2uHash['acirc']= '\u00E2';76    e2uHash['atilde']= '\u00E3';77    e2uHash['auml']= '\u00E4';78    e2uHash['aring']= '\u00E5';79    e2uHash['aelig']= '\u00E6';80    e2uHash['ccedil']= '\u00E7';81    e2uHash['egrave']= '\u00E8';82    e2uHash['eacute']= '\u00E9';83    e2uHash['ecirc']= '\u00EA';84    e2uHash['euml']= '\u00EB';85    e2uHash['igrave']= '\u00EC';86    e2uHash['iacute']= '\u00ED';87    e2uHash['icirc']= '\u00EE';88    e2uHash['iuml']= '\u00EF';89    e2uHash['eth']= '\u00F0';90    e2uHash['ntilde']= '\u00F1';91    e2uHash['ograve']= '\u00F2';92    e2uHash['oacute']= '\u00F3';93    e2uHash['ocirc']= '\u00F4';94    e2uHash['otilde']= '\u00F5';95    e2uHash['ouml']= '\u00F6';96    e2uHash['divide']= '\u00F7';97    e2uHash['oslash']= '\u00F8';98    e2uHash['ugrave']= '\u00F9';99    e2uHash['uacute']= '\u00FA';100    e2uHash['ucirc']= '\u00FB';101    e2uHash['uuml']= '\u00FC';102    e2uHash['yacute']= '\u00FD';103    e2uHash['thorn']= '\u00FE';104    e2uHash['yuml']= '\u00FF';105    e2uHash['quot']= '\u0022';106    e2uHash['amp']= '\u0026';107    e2uHash['lt']= '\u003C';108    e2uHash['gt']= '\u003E';109    e2uHash['OElig']= '';110    e2uHash['oelig']= '\u0153';111    e2uHash['Scaron']= '\u0160';112    e2uHash['scaron']= '\u0161';113    e2uHash['Yuml']= '\u0178';114    e2uHash['circ']= '\u02C6';115    e2uHash['tilde']= '\u02DC';116    e2uHash['ensp']= '\u2002';117    e2uHash['emsp']= '\u2003';118    e2uHash['thinsp']= '\u2009';119    e2uHash['zwnj']= '\u200C';120    e2uHash['zwj']= '\u200D';121    e2uHash['lrm']= '\u200E';122    e2uHash['rlm']= '\u200F';123    e2uHash['ndash']= '\u2013';124    e2uHash['mdash']= '\u2014';125    e2uHash['lsquo']= '\u2018';126    e2uHash['rsquo']= '\u2019';127    e2uHash['sbquo']= '\u201A';128    e2uHash['ldquo']= '\u201C';129    e2uHash['rdquo']= '\u201D';130    e2uHash['bdquo']= '\u201E';131    e2uHash['dagger']= '\u2020';132    e2uHash['Dagger']= '\u2021';133    e2uHash['permil']= '\u2030';134    e2uHash['lsaquo']= '\u2039';135    e2uHash['rsaquo']= '\u203A';136    e2uHash['euro']= '\u20AC';137    e2uHash['fnof']= '\u0192';138    e2uHash['Alpha']= '\u0391';139    e2uHash['Beta']= '\u0392';140    e2uHash['Gamma']= '\u0393';141    e2uHash['Delta']= '\u0394';142    e2uHash['Epsilon']= '\u0395';143    e2uHash['Zeta']= '\u0396';144    e2uHash['Eta']= '\u0397';145    e2uHash['Theta']= '\u0398';146    e2uHash['Iota']= '\u0399';147    e2uHash['Kappa']= '\u039A';148    e2uHash['Lambda']= '\u039B';149    e2uHash['Mu']= '\u039C';150    e2uHash['Nu']= '\u039D';151    e2uHash['Xi']= '\u039E';152    e2uHash['Omicron']= '\u039F';153    e2uHash['Pi']= '\u03A0';154    e2uHash['Rho']= '\u03A1';155    e2uHash['Sigma']= '\u03A3';156    e2uHash['Tau']= '\u03A4';157    e2uHash['Upsilon']= '\u03A5';158    e2uHash['Phi']= '\u03A6';159    e2uHash['Chi']= '\u03A7';160    e2uHash['Psi']= '\u03A8';161    e2uHash['Omega']= '\u03A9';162    e2uHash['alpha']= '\u03B1';163    e2uHash['beta']= '\u03B2';164    e2uHash['gamma']= '\u03B3';165    e2uHash['delta']= '\u03B4';166    e2uHash['epsilon']= '\u03B5';167    e2uHash['zeta']= '\u03B6';168    e2uHash['eta']= '\u03B7';169    e2uHash['theta']= '\u03B8';170    e2uHash['iota']= '\u03B9';171    e2uHash['kappa']= '\u03BA';172    e2uHash['lambda']= '\u03BB';173    e2uHash['mu']= '\u03BC';174    e2uHash['nu']= '\u03BD';175    e2uHash['xi']= '\u03BE';176    e2uHash['omicron']= '\u03BF';177    e2uHash['pi']= '\u03C0';178    e2uHash['rho']= '\u03C1';179    e2uHash['sigmaf']= '\u03C2';180    e2uHash['sigma']= '\u03C3';181    e2uHash['tau']= '\u03C4';182    e2uHash['upsilon']= '\u03C5';183    e2uHash['phi']= '\u03C6';184    e2uHash['chi']= '\u03C7';185    e2uHash['psi']= '\u03C8';186    e2uHash['omega']= '\u03C9';187    e2uHash['thetasym']= '\u03D1';188    e2uHash['upsih']= '\u03D2';189    e2uHash['piv']= '\u03D6';190    e2uHash['bull']= '\u2022';191    e2uHash['hellip']= '\u2026';192    e2uHash['prime']= '\u2032';193    e2uHash['Prime']= '\u2033';194    e2uHash['oline']= '\u203E';195    e2uHash['frasl']= '\u2044';196    e2uHash['weierp']= '\u2118';197    e2uHash['image']= '\u2111';198    e2uHash['real']= '\u211C';199    e2uHash['trade']= '\u2122';200    e2uHash['alefsym']= '\u2135';201    e2uHash['larr']= '\u2190';202    e2uHash['uarr']= '\u2191';203    e2uHash['rarr']= '\u2192';204    e2uHash['darr']= '\u2193';205    e2uHash['harr']= '\u2194';206    e2uHash['crarr']= '\u21B5';207    e2uHash['lArr']= '\u21D0';208    e2uHash['uArr']= '\u21D1';209    e2uHash['rArr']= '\u21D2';210    e2uHash['dArr']= '\u21D3';211    e2uHash['hArr']= '\u21D4';212    e2uHash['forall']= '\u2200';213    e2uHash['part']= '\u2202';214    e2uHash['exist']= '\u2203';215    e2uHash['empty']= '\u2205';216    e2uHash['nabla']= '\u2207';217    e2uHash['isin']= '\u2208';218    e2uHash['notin']= '\u2209';219    e2uHash['ni']= '\u220B';220    e2uHash['prod']= '\u220F';221    e2uHash['sum']= '\u2211';222    e2uHash['minus']= '\u2212';223    e2uHash['lowast']= '\u2217';224    e2uHash['radic']= '\u221A';225    e2uHash['prop']= '\u221D';226    e2uHash['infin']= '\u221E';227    e2uHash['ang']= '\u2220';228    e2uHash['and']= '\u2227';229    e2uHash['or']= '\u2228';230    e2uHash['cap']= '\u2229';231    e2uHash['cup']= '\u222A';232    e2uHash['int']= '\u222B';233    e2uHash['there4']= '\u2234';234    e2uHash['sim']= '\u223C';235    e2uHash['cong']= '\u2245';236    e2uHash['asymp']= '\u2248';237    e2uHash['ne']= '\u2260';238    e2uHash['equiv']= '\u2261';239    e2uHash['le']= '\u2264';240    e2uHash['ge']= '\u2265';241    e2uHash['sub']= '\u2282';242    e2uHash['sup']= '\u2283';243    e2uHash['nsub']= '\u2284';244    e2uHash['sube']= '\u2286';245    e2uHash['supe']= '\u2287';246    e2uHash['oplus']= '\u2295';247    e2uHash['otimes']= '\u2297';248    e2uHash['perp']= '\u22A5';249    e2uHash['sdot']= '\u22C5';250    e2uHash['lceil']= '\u2308';251    e2uHash['rceil']= '\u2309';252    e2uHash['lfloor']= '\u230A';253    e2uHash['rfloor']= '\u230B';254    e2uHash['lang']= '\u2329';255    e2uHash['rang']= '\u232A';256    e2uHash['loz']= '\u25CA';257    e2uHash['spades']= '\u2660';258    e2uHash['clubs']= '\u2663';259    e2uHash['hearts']= '\u2665';260    e2uHash['diams']= '\u2666'; 261})();262SimileAjax.HTML.deEntify = function(s) {263    var e2uHash = SimileAjax.HTML._e2uHash;264    265    var re = /&(\w+?);/;266    while (re.test(s)) {267        var m = s.match(re);268        s = s.replace(re, e2uHash[m[1]]);269    }270    return s;...hash.spec.js
Source:hash.spec.js  
1'use strict'2/*3 * adonis-framework4 *5 * (c) Harminder Virk <virk@adonisjs.com>6 *7 * For the full copyright and license information, please view the LICENSE8 * file that was distributed with this source code.9*/10const test = require('japa')11const { ioc } = require('@adonisjs/fold')12const { Config } = require('@adonisjs/sink')13const BcryptDriver = require('../../src/Hash/Drivers').bcrypt14const ArgonDriver = require('../../src/Hash/Drivers').argon15const Hash = require('../../src/Hash')16const HashManager = require('../../src/Hash/Manager')17const HashFacade = require('../../src/Hash/Facade')18const HashMock = require('../../src/Hash/Mock')19test.group('Hash | Bcrypt Driver', (group) => {20  test('hash value', async (assert) => {21    const Hash = new BcryptDriver()22    const hashed = await Hash.make('foo')23    assert.isDefined(hashed)24  })25  test('return true when hash matches', async (assert) => {26    const Hash = new BcryptDriver()27    const hashed = await Hash.make('foo')28    const verified = await Hash.verify('foo', hashed)29    assert.isTrue(verified)30  })31  test('return false when hash does not match', async (assert) => {32    const Hash = new BcryptDriver()33    const hashed = await Hash.make('foo')34    const verified = await Hash.verify('bar', hashed)35    assert.isFalse(verified)36  })37  test('return false instead of throwing exception', async (assert) => {38    const Hash = new BcryptDriver()39    const hashed = await Hash.make('foo')40    const verified = await Hash.verify(undefined, hashed)41    assert.isFalse(verified)42  })43})44test.group('Hash | Argon Driver', (group) => {45  test('hash value', async (assert) => {46    const Hash = new ArgonDriver()47    const hashed = await Hash.make('foo')48    assert.isDefined(hashed)49  })50  test('return true when hash matches', async (assert) => {51    const Hash = new ArgonDriver()52    const hashed = await Hash.make('foo')53    const verified = await Hash.verify('foo', hashed)54    assert.isTrue(verified)55  })56  test('return false when hash does not match', async (assert) => {57    const Hash = new ArgonDriver()58    const hashed = await Hash.make('foo')59    const verified = await Hash.verify('bar', hashed)60    assert.isFalse(verified)61  })62  test('return false instead of throwing exception', async (assert) => {63    const Hash = new ArgonDriver()64    const hashed = await Hash.make('foo')65    const verified = await Hash.verify(undefined, hashed)66    assert.isFalse(verified)67  })68})69test.group('Hash | Fake', () => {70  test('return string as it is from mock', async (assert) => {71    const hashed = await HashMock.make('foo')72    assert.equal(hashed, 'foo')73  })74  test('return false when strings aren\'t equal', async (assert) => {75    const verified = await HashMock.verify('foo', 'bar')76    assert.isFalse(verified)77  })78  test('return true when strings are equal', async (assert) => {79    const verified = await HashMock.verify('foo', 'foo')80    assert.isTrue(verified)81  })82})83test.group('Hash | Instance', () => {84  test('hash password using defined driver', async (assert) => {85    const Bcrypt = new BcryptDriver()86    const hash = new Hash(Bcrypt)87    const hashed = await hash.make('foo')88    assert.isDefined(hashed)89  })90  test('verify hash using defined driver', async (assert) => {91    const Bcrypt = new BcryptDriver()92    const hash = new Hash(Bcrypt)93    const hashed = await hash.make('foo')94    const verified = await hash.verify('foo', hashed)95    assert.isTrue(verified)96  })97})98test.group('Hash | Manager', (group) => {99  group.before(() => {100    ioc.fake('Adonis/Src/Config', () => new Config())101  })102  test('extend hasher by adding drivers', (assert) => {103    const myDriver = {}104    HashManager.extend('myDriver', myDriver)105    assert.deepEqual(HashManager._drivers, { myDriver })106  })107  test('throw error when trying to access invalid driver', (assert) => {108    const fn = () => HashManager.driver('foo')109    assert.throw(fn, 'E_INVALID_HASHER_DRIVER: Hash driver foo does not exists')110  })111  test('return driver instance for a given driver', (assert) => {112    const bcryptDriver = HashManager.driver('bcrypt')113    assert.instanceOf(bcryptDriver, BcryptDriver)114  })115})116test.group('Hash | Facade', (group) => {117  group.before(() => {118    ioc.fake('Adonis/Src/Config', () => new Config())119  })120  test('return hasher instance with selected driver', (assert) => {121    const config = new Config()122    config.set('hash', {123      driver: 'bcrypt',124      bcrypt: {}125    })126    const hasher = new HashFacade(config)127    assert.instanceOf(hasher.driver('bcrypt'), Hash)128    assert.instanceOf(hasher.driver('bcrypt').driver, BcryptDriver)129  })130  test('return hasher instance with extended driver', (assert) => {131    const myDriver = {132      make () {},133      setConfig () {}134    }135    HashManager.extend('mydriver', myDriver)136    const config = new Config()137    config.set('hash', {138      driver: 'mydriver',139      mydriver: {}140    })141    const hasher = new HashFacade(config)142    assert.instanceOf(hasher.driver('mydriver'), Hash)143    assert.deepEqual(hasher.driver('mydriver').driver, myDriver)144  })145  test('create singleton hasher instances', (assert) => {146    const config = new Config()147    config.set('hash', {148      driver: 'bcrypt',149      bcrypt: {},150      anotherFile: {}151    })152    const hasher = new HashFacade(config)153    hasher.driver('bcrypt')154    assert.lengthOf(Object.keys(hasher._hasherInstances), 1)155    hasher.driver('bcrypt')156    assert.lengthOf(Object.keys(hasher._hasherInstances), 1)157  })158  test('create different instance when hasher is different', (assert) => {159    const config = new Config()160    config.set('hash', {161      driver: 'bcrypt',162      bcrypt: {},163      argon: {}164    })165    const hasher = new HashFacade(config)166    hasher.driver('bcrypt')167    assert.lengthOf(Object.keys(hasher._hasherInstances), 1)168    hasher.driver('argon')169    assert.lengthOf(Object.keys(hasher._hasherInstances), 2)170  })171  test('proxy hasher instance methods', async (assert) => {172    const config = new Config()173    config.set('hash', {174      driver: 'bcrypt',175      bcrypt: {176        round: 10177      }178    })179    const hasher = new HashFacade(config)180    const hashed = await hasher.make('foo')181    assert.isDefined(hashed)182  })183  test('use bcrypt when no driver is defined', async (assert) => {184    const config = new Config()185    config.set('hash', {186    })187    const hasher = new HashFacade(config)188    const hashed = await hasher.make('foo')189    assert.isDefined(hashed)190  })...history-hash-ie-debug.js
Source:history-hash-ie-debug.js  
1/*2YUI 3.17.2 (build 9c3c78e)3Copyright 2014 Yahoo! Inc. All rights reserved.4Licensed under the BSD License.5http://yuilibrary.com/license/6*/7YUI.add('history-hash-ie', function (Y, NAME) {8/**9 * Improves IE6/7 support in history-hash by using a hidden iframe to create10 * entries in IE's browser history. This module is only needed if IE6/7 support11 * is necessary; it's not needed for any other browser.12 *13 * @module history14 * @submodule history-hash-ie15 * @since 3.2.016 */17// Combination of a UA sniff to ensure this is IE (or a browser that wants us to18// treat it like IE) and feature detection for native hashchange support (false19// for IE < 8 or IE8/9 in IE7 mode).20if (Y.UA.ie && !Y.HistoryBase.nativeHashChange) {21    var Do          = Y.Do,22        GlobalEnv   = YUI.namespace('Env.HistoryHash'),23        HistoryHash = Y.HistoryHash,24        iframe = GlobalEnv._iframe,25        win    = Y.config.win;26    /**27     * Gets the raw (not decoded) current location hash from the IE iframe,28     * minus the preceding '#' character and the hashPrefix (if one is set).29     *30     * @method getIframeHash31     * @return {String} current iframe hash32     * @static33     */34    HistoryHash.getIframeHash = function () {35        if (!iframe || !iframe.contentWindow) {36            return '';37        }38        var prefix = HistoryHash.hashPrefix,39            hash   = iframe.contentWindow.location.hash.substr(1);40        return prefix && hash.indexOf(prefix) === 0 ?41                    hash.replace(prefix, '') : hash;42    };43    /**44     * Updates the history iframe with the specified hash.45     *46     * @method _updateIframe47     * @param {String} hash location hash48     * @param {Boolean} replace (optional) if <code>true</code>, the current49     *   history state will be replaced without adding a new history entry50     * @protected51     * @static52     * @for HistoryHash53     */54    HistoryHash._updateIframe = function (hash, replace) {55        var iframeDoc      = iframe && iframe.contentWindow && iframe.contentWindow.document,56            iframeLocation = iframeDoc && iframeDoc.location;57        if (!iframeDoc || !iframeLocation) {58            return;59        }60        Y.log('updating history iframe: ' + hash + ', replace: ' + !!replace, 'info', 'history');61        if (replace) {62            iframeLocation.replace(hash.charAt(0) === '#' ? hash : '#' + hash);63        } else {64            iframeDoc.open().close();65            iframeLocation.hash = hash;66        }67    };68    Do.before(HistoryHash._updateIframe, HistoryHash, 'replaceHash', HistoryHash, true);69    if (!iframe) {70        Y.on('domready', function () {71            var lastUrlHash = HistoryHash.getHash();72            // Create a hidden iframe to store history state, following the73            // iframe-hiding recommendations from74            // http://www.paciellogroup.com/blog/?p=604.75            //76            // This iframe will allow history navigation within the current page77            // context. After navigating to another page, all but the most78            // recent history state will be lost.79            //80            // Earlier versions of the YUI History Utility attempted to work81            // around this limitation by having the iframe load a static82            // resource. This workaround was extremely fragile and tended to83            // break frequently (and silently) since it was entirely dependent84            // on IE's inconsistent handling of iframe history.85            //86            // Since this workaround didn't work much of the time anyway and87            // added significant complexity, it has been removed, and IE6 and 788            // now get slightly degraded history support.89            Y.log('creating dynamic history iframe', 'info', 'history');90            iframe = GlobalEnv._iframe = Y.Node.getDOMNode(Y.Node.create(91                '<iframe src="javascript:0" style="display:none" height="0" width="0" tabindex="-1" title="empty"/>'92            ));93            // Append the iframe to the documentElement rather than the body.94            // Keeping it outside the body prevents scrolling on the initial95            // page load (hat tip to Ben Alman and jQuery BBQ for this96            // technique).97            Y.config.doc.documentElement.appendChild(iframe);98            // Update the iframe with the initial location hash, if any. This99            // will create an initial history entry that the user can return to100            // after the state has changed.101            HistoryHash._updateIframe(lastUrlHash || '#');102            // Listen for hashchange events and keep the iframe's hash in sync103            // with the parent frame's hash.104            Y.on('hashchange', function (e) {105                lastUrlHash = e.newHash;106                if (HistoryHash.getIframeHash() !== lastUrlHash) {107                    Y.log('updating iframe hash to match URL hash', 'info', 'history');108                    HistoryHash._updateIframe(lastUrlHash);109                }110            }, win);111            // Watch the iframe hash in order to detect back/forward navigation.112            Y.later(50, null, function () {113                var iframeHash = HistoryHash.getIframeHash();114                if (iframeHash !== lastUrlHash) {115                    Y.log('updating URL hash to match iframe hash', 'info', 'history');116                    HistoryHash.setHash(iframeHash);117                }118            }, null, true);119        });120    }121}...HashTable.js
Source:HashTable.js  
1//-------------------------------------------------------------------------------2// Requires3//-------------------------------------------------------------------------------4var Class = require('./Class');5var HashTableNode = require('./HashTableNode');6var Obj = require('./Obj');7//-------------------------------------------------------------------------------8// Declare Class9//-------------------------------------------------------------------------------10var HashTable = Class.extend(Obj, {11    //-------------------------------------------------------------------------------12    // Constructor13    //-------------------------------------------------------------------------------14    _constructor: function() {15        this._super();16        //-------------------------------------------------------------------------------17        // Declare Variables18        //-------------------------------------------------------------------------------19        /**20         * @private21         * @type {number}22         */23        this.count = 0;24        /**25         * @private26         * @type {Object}27         */28        this.hashTableNodeObject = {};29    },30    //-------------------------------------------------------------------------------31    // Getters and Setters32    //-------------------------------------------------------------------------------33    /**34     * @return {number}35     */36    getCount: function() {37        return this.count;38    },39    //-------------------------------------------------------------------------------40    // Public Methods41    //-------------------------------------------------------------------------------42    /**43     * @param {*} key44     * @return {boolean}45     */46    containsKey: function(key) {47        var keyHashCode = Obj.hashCode(key);48        var hashTableNode = this.hashTableNodeObject[keyHashCode];49        if (hashTableNode) {50            return hashTableNode.containsKey(key);51        }52        return false;53    },54    /**55     * @param {*} value56     * @return {boolean}57     */58    containsValue: function(value) {59        // NOTE BRN: The for in operator will only enumerate over our own properties, not the object's built in60        // properties. So it should be safe to access this.valueObject[key]61        for (var keyHashCode in this.hashTableNodeObject) {62            var hashTableNode = this.hashTableNodeObject[keyHashCode];63            if (hashTableNode.containsValue(value)) {64                return true;65            }66        }67        return false;68    },69    /**70     * @param {function(*)} func71     */72    forEach: function(func) {73        for (var keyHashCode in this.hashTableNodeObject) {74            var hashTableNode = this.hashTableNodeObject[keyHashCode];75            hashTableNode.getValueArray().forEach(function(value) {76                func(value);77            });78        }79    },80    /**81     * @param {*} key82     * @return {*}83     */84    get: function(key) {85        var keyHashCode = Obj.hashCode(key);86        var hashTableNode = this.hashTableNodeObject[keyHashCode];87        if (hashTableNode) {88            return hashTableNode.get(key);89        }90        return undefined;91    },92    /**93     * @return {Array<*>}94     */95    getKeyArray: function() {96        var keysArray = [];97        for (var keyHashCode in this.hashTableNodeObject) {98            var hashTableNode = this.hashTableNodeObject[keyHashCode];99            keysArray = keysArray.concat(hashTableNode.getKeyArray());100        }101        return keysArray;102    },103    /**104     * @return {Array<*>}105     */106    getValueArray: function() {107        var valuesArray = [];108        for (var keyHashCode in this.hashTableNodeObject) {109            var hashTableNode = this.hashTableNodeObject[keyHashCode];110            valuesArray = valuesArray.concat(hashTableNode.getValueArray());111        }112        return valuesArray;113    },114    /**115     * @return {boolean}116     */117    isEmpty: function() {118        return (this.count === 0);119    },120    /**121     * @param {*} key122     * @param {*} value123     * @return {*} Returns undefined if no value already existed at this key124     */125    put: function(key, value) {126        var keyHashCode = Obj.hashCode(key);127        var hashTableNode = this.hashTableNodeObject[keyHashCode];128        if (!hashTableNode) {129            hashTableNode = new HashTableNode();130            this.hashTableNodeObject[keyHashCode] = hashTableNode;131        }132        var returnValue = hashTableNode.put(key, value);133        if (returnValue === undefined) {134            this.count++;135        }136        return returnValue;137    },138    /**139     * @param {*} key140     * @return {*} Returns undefined if no value already existed at this key141     */142    remove: function(key) {143        var keyHashCode = Obj.hashCode(key);144        var hashTableNode = this.hashTableNodeObject[keyHashCode];145        var returnValue = undefined;146        if (hashTableNode) {147            returnValue = hashTableNode.remove(key);148            if (returnValue !== undefined) {149                this.count--;150                if (hashTableNode.getCount() === 0) {151                    delete this.hashTableNodeObject[keyHashCode];152                }153            }154        }155        return returnValue;156    }157});158//-------------------------------------------------------------------------------159// Module Export160//-------------------------------------------------------------------------------...HashStore.js
Source:HashStore.js  
1//-------------------------------------------------------------------------------2// Requires3//-------------------------------------------------------------------------------4var Class = require('./Class');5var HashStoreNode = require('./HashStoreNode');6var Obj = require('./Obj');7//-------------------------------------------------------------------------------8// Declare Class9//-------------------------------------------------------------------------------10var HashStore = Class.extend(Obj, {11    //-------------------------------------------------------------------------------12    // Constructor13    //-------------------------------------------------------------------------------14    _constructor: function() {15        this._super();16        //-------------------------------------------------------------------------------17        // Declare Variables18        //-------------------------------------------------------------------------------19        this.hashStoreNodeObject = {};20    },21    //-------------------------------------------------------------------------------22    // Public Methods23    //-------------------------------------------------------------------------------24    /**25     * @param {*} value26     */27    addValue: function(value) {28        var valueHashCode = Obj.hashCode(value);29        var hashStoreNode = this.hashStoreNodeObject[valueHashCode];30        if (!hashStoreNode) {31            hashStoreNode = new HashStoreNode();32            this.hashStoreNodeObject[valueHashCode] = hashStoreNode;33        }34        hashStoreNode.addValue(value);35    },36    /**37     * @param {function(*)} func38     */39    forEach: function(func) {40        for (var valueHashCode in this.hashStoreNodeObject) {41            var hashStoreNode = this.hashStoreNodeObject[valueHashCode];42            hashStoreNode.getValueArray().forEach(function(value) {43                func(value);44            });45        }46    },47    /**48     * @return {Array}49     */50    getValueArray: function() {51        var valueArray = [];52        for (var valueHashCode in this.hashStoreNodeObject) {53            var hashStoreNode = this.hashStoreNodeObject[valueHashCode];54            valueArray = valueArray.concat(hashStoreNode.getValueArray());55        }56        return valueArray;57    },58    /**59     * @param {*} value60     * @return {boolean}61     */62    hasValue: function(value) {63        var valueHashCode = Obj.hashCode(value);64        var hashStoreNode = this.hashStoreNodeObject[valueHashCode];65        if (hashStoreNode) {66            return hashStoreNode.containsValue(value);67        }68        return false;69    },70    /**71     * @param {*} value72     * @return {boolean}73     */74    removeValue: function(value) {75        var valueHashCode = Obj.hashCode(value);76        var hashStoreNode = this.hashStoreNodeObject[valueHashCode];77        var result = false;78        if (hashStoreNode) {79            result = hashStoreNode.removeValue(value);80            if (result) {81                if (hashStoreNode.getCount() === 0) {82                    delete this.hashStoreNodeObject[valueHashCode];83                }84            }85        }86        return result;87    }88});89//-------------------------------------------------------------------------------90// Module Export91//-------------------------------------------------------------------------------...Using AI Code Generation
1const { hash } = require('playwright/lib/utils/utils');2const hash = require('playwright/lib/utils/utils').hash;3const { hash } = require('playwright/lib/utils/utils');4const hash = require('playwright/lib/utils/utils').hash;5const { hash } = require('playwright/lib/utils/utils');6const hash = require('playwright/lib/utils/utils').hash;7const { hash } = require('playwright/lib/utils/utils');8const hash = require('playwright/lib/utils/utils').hash;9const { hash } = require('playwright/lib/utils/utils');10const hash = require('playwright/lib/utils/utils').hash;11const { hash } = require('playwright/lib/utils/utils');12const hash = require('playwright/lib/utils/utils').hash;13const { hash } = require('playwright/lib/utils/utils');14const hash = require('playwright/lib/utils/utils').hash;15const { hash } = require('playwright/lib/utils/utils');16const hash = require('playwright/lib/utils/utils').hash;17const { hash } = require('playwright/lib/utils/utils');18const hash = require('playwright/lib/utils/utils').hash;19const { hash } = require('playwright/lib/utils/utils');20const hash = require('playwright/lib/utils/utils').hash;21const { hash } = require('playwright/lib/utils/utils');22const hash = require('playwright/lib/utils/utils').hash;23const { hash } = require('playwright/lib/utils/utils');24const hash = require('playwright/lib/utils/utils').hash;25const { hash } = require('playwright/lib/utils/utils');26const hash = require('playwright/lib/utils/utils').hash;27const { hash } = require('playwright/lib/utils/utils');Using AI Code Generation
1const { hash } = require('playwright/lib/utils/utils');2const hash1 = hash('a');3console.log(hash1);4const hash2 = hash('a');5console.log(hash2);6const hash3 = hash('b');7console.log(hash3);8const hash4 = hash('a');9console.log(hash4);10const hash5 = hash('b');11console.log(hash5);12const hash6 = hash('c');13console.log(hash6);14const { hash } = require('playwright/lib/utils/utils');15const hash1 = hash('a');16console.log(hash1);17const hash2 = hash('a');18console.log(hash2);19const hash3 = hash('b');20console.log(hash3);21const hash4 = hash('a');22console.log(hash4);23const hash5 = hash('b');24console.log(hash5);25const hash6 = hash('c');26console.log(hash6);27const { hash } = require('playwright/lib/utils/utils');28const hash1 = hash('a');29console.log(hash1);30const hash2 = hash('a');31console.log(hash2);32const hash3 = hash('b');33console.log(hash3);34const hash4 = hash('a');35console.log(hash4);36const hash5 = hash('b');37console.log(hash5);38const hash6 = hash('c');39console.log(hash6);40const { hash } = require('playwright/lib/utils/utils');41const hash1 = hash('a');42console.log(hash1);43const hash2 = hash('a');44console.log(hash2);45const hash3 = hash('b');46console.log(hash3);47const hash4 = hash('a');48console.log(hash4);49const hash5 = hash('b');50console.log(hash5);51const hash6 = hash('c');52console.log(hash6);Using AI Code Generation
1const { hash } = require('playwright/lib/utils/utils');2const { hash } = require('playwright/lib/utils/utils');3async function test() {4  const hash1 = await hash('test');5  const hash2 = await hash('test');6  console.log(hash1 === hash2);7}8test();Using AI Code Generation
1const { hash } = require('@playwright/test');2const myHash = hash('my string');3console.log(myHash);4const { test } = require('@playwright/test');5test('test', async ({page}) => {6  const hash = await page.evaluate(() => window.__PW_TEST_HASH);7  console.log(hash);8});9The hash() method is available in the test file and the test.spec.js file. You can use it to createUsing AI Code Generation
1const { chromium, webkit, firefox } = require("playwright");2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const hash = await page.evaluate(async (url) => {7    const response = await fetch(url);8    const buffer = await response.buffer();9    const hash = await window.crypto.subtle.digest("SHA-256", buffer);10    return Array.from(new Uint8Array(hash))11      .map((b) => b.toString(16).padStart(2, "0"))12      .join("");13  console.log(hUsing AI Code Generation
1const { hash } = require('@playwright/test');2const { test, expect } = require('@playwright/test');3const { click, typeText, goto, press } = require('@playwright/test');4test('Test 1', async ({ page }) => {5  await page.click('text=Docs');6  await page.click('text=API');7  await page.click('text=Page');8  await page.click('text=page.check');9  await page.click('text=page.click');10  await page.click('text=page.dblclick');11  await page.click('text=page.fill');12  await page.click('text=page.focus');13  await page.click('text=page.goto');14  await page.click('text=page.hover');15  await page.click('text=page.keyboard');16  await page.click('text=page.mainFrame');17  await page.click('text=page.mouse');18  await page.click('text=page.press');19  await page.click('text=page.screenshot');20  await page.click('text=page.selectOption');21  await page.click('text=page.setContent');22  await page.click('text=page.setExtraHTTPHeaders');23  await page.click('text=page.setGeolocation');24  await page.click('text=page.setHTTPCredentials');25  await page.click('text=page.setOfflineMode');26  await page.click('text=page.setViewportSize');27  await page.click('text=page.tap');28  await page.click('text=page.title');29  await page.click('text=page.type');30  await page.click('text=page.url');31  await page.click('text=page.viewportSize');32  await page.click('text=page.waitForEvent');33  await page.click('text=page.waitForFunction');34  await page.click('text=page.waitForLoadState');35  await page.click('text=page.waitForNavigation');36  await page.click('text=page.waitForRequest');37  await page.click('text=page.waitForResponse');38  await page.click('text=page.waitForSelector');39  await page.click('text=page.waitForTimeout');40  await page.click('text=page.waitForURL');41  await page.click('text=page.waitForWorker');42  await page.click('text=page.workers');43  await page.click('text=page.$');44  await page.click('text=page.$$');45  await page.click('text=pageUsing AI Code Generation
1const { hash } = require('playwright/lib/utils/utils'); 2const hashValue = hash('test');3console.log(hashValue);4const { hash } = require('playwright/lib/utils/utils'); 5const hashValue = hash('test');6console.log(hashValue);7const { hash } = require('playwright/lib/utils/utils'); 8const hashValue = hash('test');9console.log(hashValue);10const { hash } = require('playwright/lib/utils/utils'); 11const hashValue = hash('test');12console.log(hashValue);13const { hash } = require('playwright/lib/utils/utils'); 14const hashValue = hash('test');15console.log(hashValue);16const { hash } = require('playwright/lib/utils/utils'); 17const hashValue = hash('test');18console.log(hashValue);19const { hash } = require('playwright/lib/utils/utils'); 20const hashValue = hash('test');21console.log(hashValue);22const { hash } = require('playwright/lib/utils/utils'); 23const hashValue = hash('test');24console.log(hashValue);25const { hash } = require('playwright/lib/utils/utils'); 26const hashValue = hash('test');27console.log(hashValue);28const { hash } = require('playwright/lib/utils/utils'); 29const hashValue = hash('test');30console.log(hashValue);31const { hash } = require('playwright/lib/utils/utils'); 32const hashValue = hash('test');33console.log(hashValue);LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
