/*
 * Copyright 2011-2014 Software Freedom Conservancy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* AUTO GENERATED - DO NOT EDIT BY HAND */

#include <stddef.h>  // For NULL.

#include "atoms.h"

namespace webdriver {
namespace atoms {

const char* const CLEAR[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function l(a){return\"string\"==typeof a}function m(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){return\"function\"=",
    "=ca(a)}function fa(a){var b=typeof a;return\"object\"==b&&null!=a||\"fu",
    "nction\"==b}function ha(a,b,c){return a.call.apply(a.bind,arguments)}\n",
    "function ia(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arr",
    "ay.prototype.slice.call(arguments,2);return function(){var c=Array.prot",
    "otype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a",
    ".apply(b,c)}}return function(){return a.apply(b,arguments)}}function ja",
    "(a,b,c){ja=Function.prototype.bind&&-1!=Function.prototype.bind.toStrin",
    "g().indexOf(\"native code\")?ha:ia;return ja.apply(null,arguments)}\nfu",
    "nction ka(a,b){var c=Array.prototype.slice.call(arguments,1);return fun",
    "ction(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b",
    ")}}function p(a,b){function c(){}c.prototype=b.prototype;a.Da=b.prototy",
    "pe;a.prototype=new c;a.prototype.constructor=a;a.Ba=function(a,c,f){for",
    "(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argu",
    "ments[e];return b.prototype[c].apply(a,d)}};var la=window;var ma=String",
    ".prototype.trim?function(a){return a.trim()}:function(a){return a.repla",
    "ce(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function na(a,b){return a<b?-1:a",
    ">b?1:0}function oa(a){return String(a).replace(/\\-([a-z])/g,function(a",
    ",c){return c.toUpperCase()})};function pa(a,b){if(l(a))return l(b)&&1==",
    "b.length?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]==",
    "=b)return c;return-1}function q(a,b){for(var c=a.length,d=l(a)?a.split(",
    "\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function qa(a,b,c){",
    "var d=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function ",
    "r(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&",
    "&b.call(void 0,d[e],e,a))return!0;return!1}\nfunction ra(a,b){for(var c",
    "=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,",
    "d[e],e,a))return!1;return!0}function sa(a){return Array.prototype.conca",
    "t.apply([],arguments)}function ta(a){var b=a.length;if(0<b){for(var c=A",
    "rray(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function ua(a,b,c){retu",
    "rn 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.",
    "slice.call(a,b,c)};var va={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7",
    "\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f",
    "5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\"",
    ",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"",
    "#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d26",
    "91e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\"",
    ",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#",
    "008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#00",
    "6400\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b00",
    "8b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#99",
    "32cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8",
    "f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:",
    "\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:",
    "\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#6969",
    "69\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0",
    "\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\n",
    "ghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#8",
    "08080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",hone",
    "ydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b",
    "0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavende",
    "rblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",light",
    "blue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgold",
    "enrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",li",
    "ghtgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlig",
    "htseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#77889",
    "9\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:",
    "\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",ma",
    "genta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediu",
    "mblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",med",
    "iumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:",
    "\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",mid",
    "nightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoc",
    "casin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#f",
    "df5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",oran",
    "gered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegree",
    "n:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papay",
    "awhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb",
    "\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff",
    "0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b451",
    "3\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nse",
    "ashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87c",
    "eeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\"",
    ",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#",
    "d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquo",
    "ise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",",
    "whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var ",
    "wa=\"backgroundColor borderTopColor borderRightColor borderBottomColor ",
    "borderLeftColor color outlineColor\".split(\" \"),xa=/#([0-9a-fA-F])([0",
    "-9a-fA-F])([0-9a-fA-F])/,ya=/^#(?:[0-9a-f]{3}){1,2}$/i,za=/^(?:rgba)?",
    "\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,Aa",
    "=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0",
    ",2})\\)$/i;function u(a,b){this.code=a;this.state=v[a]||Ba;this.message",
    "=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a",
    ".toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.i",
    "ndexOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a",
    ".name=this.name;this.stack=a.stack||\"\"}p(u,Error);var Ba=\"unknown er",
    "ror\",v={15:\"element not selectable\",11:\"element not visible\"};v[31",
    "]=Ba;v[30]=Ba;v[24]=\"invalid cookie domain\";v[29]=\"invalid element c",
    "oordinates\";v[12]=\"invalid element state\";\nv[32]=\"invalid selector",
    "\";v[51]=\"invalid selector\";v[52]=\"invalid selector\";v[17]=\"javasc",
    "ript error\";v[405]=\"unsupported operation\";v[34]=\"move target out o",
    "f bounds\";v[27]=\"no such alert\";v[7]=\"no such element\";v[8]=\"no s",
    "uch frame\";v[23]=\"no such window\";v[28]=\"script timeout\";v[33]=\"s",
    "ession not created\";v[10]=\"stale element reference\";v[21]=\"timeout",
    "\";v[25]=\"unable to set cookie\";v[26]=\"unexpected alert open\";v[13]",
    "=Ba;v[9]=\"unknown command\";u.prototype.toString=function(){return thi",
    "s.name+\": \"+this.message};var Ca;a:{var Da=aa.navigator;if(Da){var Ea",
    "=Da.userAgent;if(Ea){Ca=Ea;break a}}Ca=\"\"};function Ga(a){var b=Ha;Ob",
    "ject.prototype.hasOwnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))}",
    ";var Ia=-1!=Ca.indexOf(\"Macintosh\"),Ja=-1!=Ca.indexOf(\"Windows\"),Ka",
    ",La=\"\",Ma=/WebKit\\/(\\S+)/.exec(Ca);Ma&&(La=Ma?Ma[1]:\"\");Ka=La;var",
    " Ha={};\nfunction Na(){Ga(function(){for(var a=0,b=ma(String(Ka)).split",
    "(\".\"),c=ma(\"528\").split(\".\"),d=Math.max(b.length,c.length),e=0;0=",
    "=a&&e<d;e++){var f=b[e]||\"\",h=c[e]||\"\";do{f=/(\\d*)(\\D*)(.*)/.exec",
    "(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"",
    "\",\"\"];if(0==f[0].length&&0==h[0].length)break;a=na(0==f[1].length?0:",
    "parseInt(f[1],10),0==h[1].length?0:parseInt(h[1],10))||na(0==f[2].lengt",
    "h,0==h[2].length)||na(f[2],h[2]);f=f[3];h=h[3]}while(0==a)}return 0<=a}",
    ")};function w(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=w.prototype;g.clon",
    "e=function(){return new w(this.x,this.y)};g.toString=function(){return",
    "\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x=Math.ceil(th",
    "is.x);this.y=Math.ceil(this.y);return this};g.floor=function(){this.x=M",
    "ath.floor(this.x);this.y=Math.floor(this.y);return this};g.round=functi",
    "on(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};",
    "\ng.translate=function(a,b){a instanceof w?(this.x+=a.x,this.y+=a.y):(t",
    "his.x+=Number(a),m(b)&&(this.y+=b));return this};g.scale=function(a,b){",
    "b=m(b)?b:a;this.x*=a;this.y*=b;return this};function Oa(a,b){this.width",
    "=a;this.height=b}g=Oa.prototype;g.clone=function(){return new Oa(this.w",
    "idth,this.height)};g.toString=function(){return\"(\"+this.width+\" x \"",
    "+this.height+\")\"};g.aspectRatio=function(){return this.width/this.hei",
    "ght};g.ceil=function(){this.width=Math.ceil(this.width);this.height=Mat",
    "h.ceil(this.height);return this};g.floor=function(){this.width=Math.flo",
    "or(this.width);this.height=Math.floor(this.height);return this};\ng.rou",
    "nd=function(){this.width=Math.round(this.width);this.height=Math.round(",
    "this.height);return this};g.scale=function(a,b){b=m(b)?b:a;this.width*=",
    "a;this.height*=b;return this};function Pa(a,b,c){function d(c){c&&b.app",
    "endChild(l(c)?a.createTextNode(c):c)}for(var e=1;e<c.length;e++){var f=",
    "c[e];!da(f)||fa(f)&&0<f.nodeType?d(f):q(Qa(f)?ta(f):f,d)}}function Ra(a",
    "){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}function Sa(a,b){",
    "if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains",
    "(b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(",
    "a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b=",
    "=a}\nfunction Ta(a,b){if(a==b)return 0;if(a.compareDocumentPosition)ret",
    "urn a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.paren",
    "tNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeT",
    "ype;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.p",
    "arentNode;return e==f?Ua(a,b):!c&&Sa(e,b)?-1*Va(a,b):!d&&Sa(f,a)?Va(b,a",
    "):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=x(a",
    ");c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange();a.",
    "selectNode(b);\na.collapse(!0);return c.compareBoundaryPoints(aa.Range.",
    "START_TO_END,a)}function Va(a,b){var c=a.parentNode;if(c==b)return-1;fo",
    "r(;b.parentNode!=c;)b=b.parentNode;return Ua(b,a)}function Ua(a,b){for(",
    ";b=b.previousSibling;)if(b==a)return-1;return 1}function x(a){return 9=",
    "=a.nodeType?a:a.ownerDocument||a.document}function Qa(a){if(a&&\"number",
    "\"==typeof a.length){if(fa(a))return\"function\"==typeof a.item||\"stri",
    "ng\"==typeof a.item;if(ea(a))return\"function\"==typeof a.item}return!1",
    "}\nfunction Wa(a,b,c){a&&!c&&(a=a.parentNode);for(c=0;a;){if(b(a))retur",
    "n a;a=a.parentNode;c++}return null}function Xa(a){try{return a&&a.activ",
    "eElement}catch(b){}return null}function Ya(a){this.M=a||aa.document||do",
    "cument}g=Ya.prototype;g.getElementsByTagName=function(a,b){return(b||th",
    "is.M).getElementsByTagName(String(a))};g.createElement=function(a){retu",
    "rn this.M.createElement(String(a))};g.createTextNode=function(a){return",
    " this.M.createTextNode(String(a))};g.appendChild=function(a,b){a.append",
    "Child(b)};\ng.append=function(a,b){Pa(x(a),a,arguments)};g.canHaveChild",
    "ren=function(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPL",
    "ET\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAN",
    "D\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT",
    "\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case ",
    "\"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PAR",
    "AM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case",
    " \"WBR\":return!1}return!0};\ng.removeNode=function(a){return a&&a.pare",
    "ntNode?a.parentNode.removeChild(a):null};g.contains=Sa;function Za(a){v",
    "ar b=\"tabindex\";return\"style\"==b?$a(a.style.cssText):(a=a.getAttrib",
    "uteNode(b))&&a.specified?a.value:null}var ab=/[;]+(?=(?:(?:[^\"]*\"){2}",
    ")*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\\([^()]*\\))*[^()]*$",
    ")/;function $a(a){var b=[];q(a.split(ab),function(a){var c=a.indexOf(\"",
    ":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.length&&b.push(a[0].toLow",
    "erCase(),\":\",a[1],\";\"))});b=b.join(\"\");return b=\";\"==b.charAt(b",
    ".length-1)?b:b+\";\"}\nfunction A(a,b){b&&\"string\"!==typeof b&&(b=b.t",
    "oString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};",
    "/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyr",
    "ight (c) 2012 Google Inc.\n\n Permission is hereby granted, free of cha",
    "rge, to any person obtaining a copy\n of this software and associated d",
    "ocumentation files (the \"Software\"), to\n deal in the Software withou",
    "t restriction, including without limitation the\n rights to use, copy, ",
    "modify, merge, publish, distribute, sublicense, and/or\n sell copies of",
    " the Software, and to permit persons to whom the Software is\n furnishe",
    "d to do so, subject to the following conditions:\n\n The above copyrigh",
    "t notice and this permission notice shall be included in\n all copies o",
    "r substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"",
    "AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING ",
    "BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A P",
    "ARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS ",
    "OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABIL",
    "ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FRO",
    "M, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALIN",
    "GS\n IN THE SOFTWARE.\n*/\nfunction bb(a,b,c){this.s=a;this.ya=b||1;thi",
    "s.o=c||1};function cb(a){this.$=a;this.P=0}function db(a){a=a.match(eb)",
    ";for(var b=0;b<a.length;b++)fb.test(a[b])&&a.splice(b,1);return new cb(",
    "a)}var eb=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*",
    "|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']",
    "*'|[!<>]=|\\s+|./g,fb=/^\\s/;function B(a,b){return a.$[a.P+(b||0)]}cb.",
    "prototype.next=function(){return this.$[this.P++]};cb.prototype.back=fu",
    "nction(){this.P--};cb.prototype.empty=function(){return this.$.length<=",
    "this.P};function C(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=",
    "void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"stri",
    "ng\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;c=0",
    ";var d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;wh",
    "ile(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeVa",
    "lue;return\"\"+b}\nfunction gb(a,b,c){if(null===b)return!0;try{if(!a.ge",
    "tAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttribute(b",
    "):a.getAttribute(b,2)==c}function hb(a,b,c,d,e){return ib.call(null,a,b",
    ",l(c)?c:null,l(d)?d:null,e||new D)}\nfunction ib(a,b,c,d,e){b.getElemen",
    "tsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),q(b,function(b){a.ma",
    "tches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.ge",
    "tElementsByClassName(d),q(b,function(b){b.className==d&&a.matches(b)&&e",
    ".add(b)})):a instanceof E?jb(a,b,c,d,e):b.getElementsByTagName&&(b=b.ge",
    "tElementsByTagName(a.getName()),q(b,function(a){gb(a,c,d)&&e.add(a)}));",
    "return e}\nfunction jb(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)",
    "gb(b,c,d)&&a.matches(b)&&e.add(b),jb(a,b,c,d,e)};function D(){this.o=th",
    "is.j=null;this.J=0}function kb(a){this.node=a;this.next=this.F=null}fun",
    "ction lb(a,b){if(!a.j)return b;if(!b.j)return a;var c=a.j;b=b.j;for(var",
    " d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<Ta(c.node,",
    "b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.F=d)?d.next=e:a.j=e,d=e,f++;fo",
    "r(e=c||b;e;)e.F=d,d=d.next=e,f++,e=e.next;a.o=d;a.J=f;return a}D.protot",
    "ype.unshift=function(a){a=new kb(a);a.next=this.j;this.o?this.j.F=a:thi",
    "s.j=this.o=a;this.j=a;this.J++};\nD.prototype.add=function(a){a=new kb(",
    "a);a.F=this.o;this.j?this.o.next=a:this.j=this.o=a;this.o=a;this.J++};f",
    "unction mb(a){return(a=a.j)?a.node:null}D.prototype.v=function(){return",
    " this.J};function nb(a){return(a=mb(a))?C(a):\"\"}D.prototype.iterator=",
    "function(a){return new ob(this,!!a)};function ob(a,b){this.ua=a;this.ca",
    "=(this.H=b)?a.o:a.j;this.X=null}ob.prototype.next=function(){var a=this",
    ".ca;if(null==a)return null;var b=this.X=a;this.ca=this.H?a.F:a.next;ret",
    "urn b.node};\nob.prototype.remove=function(){var a=this.ua,b=this.X;if(",
    "!b)throw Error(\"Next must be called at least once before remove.\");va",
    "r c=b.F;b=b.next;c?c.next=b:a.j=b;b?b.F=c:a.o=c;a.J--;this.X=null};func",
    "tion F(a){this.i=a;this.l=this.A=!1;this.K=null}function H(a){return\"",
    "\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}F.prototype.h=funct",
    "ion(){return this.A};function pb(a,b){a.A=b}function qb(a,b){a.l=b}F.pr",
    "ototype.D=function(){return this.K};function I(a,b){a=a.evaluate(b);ret",
    "urn a instanceof D?+nb(a):+a}function J(a,b){a=a.evaluate(b);return a i",
    "nstanceof D?nb(a):\"\"+a}function rb(a,b){a=a.evaluate(b);return a inst",
    "anceof D?!!a.v():!!a};function sb(a,b,c){F.call(this,a.i);this.Z=a;this",
    ".ga=b;this.la=c;this.A=b.h()||c.h();this.l=b.l||c.l;this.Z==tb&&(c.l||c",
    ".h()||4==c.i||0==c.i||!b.D()?b.l||b.h()||4==b.i||0==b.i||!c.D()||(this.",
    "K={name:c.D().name,I:b}):this.K={name:b.D().name,I:c})}p(sb,F);\nfuncti",
    "on ub(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof ",
    "D&&c instanceof D){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.i",
    "terator(),f=e.next();f;f=e.next())if(a(C(d),C(f)))return!0;return!1}if(",
    "b instanceof D||c instanceof D){b instanceof D?(e=b,d=c):(e=c,d=b);f=e.",
    "iterator();for(var h=typeof d,n=f.next();n;n=f.next()){switch(h){case ",
    "\"number\":n=+C(n);break;case \"boolean\":n=!!C(n);break;case \"string",
    "\":n=C(n);break;default:throw Error(\"Illegal primitive type for compar",
    "ison.\");\n}if(e==b&&a(n,d)||e==c&&a(d,n))return!0}return!1}return e?\"",
    "boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeo",
    "f b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}sb.prototype.evaluat",
    "e=function(a){return this.Z.u(this.ga,this.la,a)};sb.prototype.toString",
    "=function(){var a=\"Binary Expression: \"+this.Z;a+=H(this.ga);return a",
    "+=H(this.la)};function vb(a,b,c,d){this.xa=a;this.ja=b;this.i=c;this.u=",
    "d}vb.prototype.toString=function(){return this.xa};var wb={};\nfunction",
    " K(a,b,c,d){if(wb.hasOwnProperty(a))throw Error(\"Binary operator alrea",
    "dy created: \"+a);a=new vb(a,b,c,d);return wb[a.toString()]=a}K(\"div\"",
    ",6,1,function(a,b,c){return I(a,c)/I(b,c)});K(\"mod\",6,1,function(a,b,",
    "c){return I(a,c)%I(b,c)});K(\"*\",6,1,function(a,b,c){return I(a,c)*I(b",
    ",c)});K(\"+\",5,1,function(a,b,c){return I(a,c)+I(b,c)});K(\"-\",5,1,fu",
    "nction(a,b,c){return I(a,c)-I(b,c)});K(\"<\",4,2,function(a,b,c){return",
    " ub(function(a,b){return a<b},a,b,c)});\nK(\">\",4,2,function(a,b,c){re",
    "turn ub(function(a,b){return a>b},a,b,c)});K(\"<=\",4,2,function(a,b,c)",
    "{return ub(function(a,b){return a<=b},a,b,c)});K(\">=\",4,2,function(a,",
    "b,c){return ub(function(a,b){return a>=b},a,b,c)});var tb=K(\"=\",3,2,f",
    "unction(a,b,c){return ub(function(a,b){return a==b},a,b,c,!0)});K(\"!=",
    "\",3,2,function(a,b,c){return ub(function(a,b){return a!=b},a,b,c,!0)})",
    ";K(\"and\",2,2,function(a,b,c){return rb(a,c)&&rb(b,c)});K(\"or\",1,2,f",
    "unction(a,b,c){return rb(a,c)||rb(b,c)});function xb(a,b){if(b.v()&&4!=",
    "a.i)throw Error(\"Primary expression must evaluate to nodeset if filter",
    " has predicate(s).\");F.call(this,a.i);this.ka=a;this.f=b;this.A=a.h();",
    "this.l=a.l}p(xb,F);xb.prototype.evaluate=function(a){a=this.ka.evaluate",
    "(a);return yb(this.f,a)};xb.prototype.toString=function(){var a=\"Filte",
    "r:\"+H(this.ka);return a+=H(this.f)};function zb(a,b){if(b.length<a.ia)",
    "throw Error(\"Function \"+a.m+\" expects at least\"+a.ia+\" arguments, ",
    "\"+b.length+\" given\");if(null!==a.Y&&b.length>a.Y)throw Error(\"Funct",
    "ion \"+a.m+\" expects at most \"+a.Y+\" arguments, \"+b.length+\" given",
    "\");a.va&&q(b,function(b,d){if(4!=b.i)throw Error(\"Argument \"+d+\" to",
    " function \"+a.m+\" is not of type Nodeset: \"+b);});F.call(this,a.i);t",
    "his.O=a;this.U=b;pb(this,a.A||r(b,function(a){return a.h()}));qb(this,a",
    ".ta&&!b.length||a.sa&&!!b.length||r(b,function(a){return a.l}))}\np(zb,",
    "F);zb.prototype.evaluate=function(a){return this.O.u.apply(null,sa(a,th",
    "is.U))};zb.prototype.toString=function(){var a=\"Function: \"+this.O;if",
    "(this.U.length){var b=qa(this.U,function(a,b){return a+H(b)},\"Argument",
    "s:\");a+=H(b)}return a};function Ab(a,b,c,d,e,f,h,n){this.m=a;this.i=b;",
    "this.A=c;this.ta=d;this.sa=!1;this.u=e;this.ia=f;this.Y=k(h)?h:f;this.v",
    "a=!!n}Ab.prototype.toString=function(){return this.m};var Bb={};\nfunct",
    "ion L(a,b,c,d,e,f,h,n){if(Bb.hasOwnProperty(a))throw Error(\"Function a",
    "lready created: \"+a+\".\");Bb[a]=new Ab(a,b,c,d,e,f,h,n)}L(\"boolean\"",
    ",2,!1,!1,function(a,b){return rb(b,a)},1);L(\"ceiling\",1,!1,!1,functio",
    "n(a,b){return Math.ceil(I(b,a))},1);L(\"concat\",3,!1,!1,function(a,b){",
    "return qa(ua(arguments,1),function(b,d){return b+J(d,a)},\"\")},2,null)",
    ";L(\"contains\",2,!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);return-1!=b.i",
    "ndexOf(a)},2);L(\"count\",1,!1,!1,function(a,b){return b.evaluate(a).v(",
    ")},1,1,!0);\nL(\"false\",2,!1,!1,function(){return!1},0);L(\"floor\",1,",
    "!1,!1,function(a,b){return Math.floor(I(b,a))},1);L(\"id\",4,!1,!1,func",
    "tion(a,b){var c=a.s,d=9==c.nodeType?c:c.ownerDocument;a=J(b,a).split(/",
    "\\s+/);var e=[];q(a,function(a){a=d.getElementById(a);!a||0<=pa(e,a)||e",
    ".push(a)});e.sort(Ta);var f=new D;q(e,function(a){f.add(a)});return f},",
    "1);L(\"lang\",2,!1,!1,function(){return!1},1);L(\"last\",1,!0,!1,functi",
    "on(a){if(1!=arguments.length)throw Error(\"Function last expects ()\");",
    "return a.o},0);\nL(\"local-name\",3,!1,!0,function(a,b){return(a=b?mb(b",
    ".evaluate(a)):a.s)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);",
    "L(\"name\",3,!1,!0,function(a,b){return(a=b?mb(b.evaluate(a)):a.s)?a.no",
    "deName.toLowerCase():\"\"},0,1,!0);L(\"namespace-uri\",3,!0,!1,function",
    "(){return\"\"},0,1,!0);L(\"normalize-space\",3,!1,!0,function(a,b){retu",
    "rn(b?J(b,a):C(a.s)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/",
    "g,\"\")},0,1);L(\"not\",2,!1,!1,function(a,b){return!rb(b,a)},1);\nL(\"",
    "number\",1,!1,!0,function(a,b){return b?I(b,a):+C(a.s)},0,1);L(\"positi",
    "on\",1,!0,!1,function(a){return a.ya},0);L(\"round\",1,!1,!1,function(a",
    ",b){return Math.round(I(b,a))},1);L(\"starts-with\",2,!1,!1,function(a,",
    "b,c){b=J(b,a);a=J(c,a);return 0==b.lastIndexOf(a,0)},2);L(\"string\",3,",
    "!1,!0,function(a,b){return b?J(b,a):C(a.s)},0,1);L(\"string-length\",1,",
    "!1,!0,function(a,b){return(b?J(b,a):C(a.s)).length},0,1);\nL(\"substrin",
    "g\",3,!1,!1,function(a,b,c,d){c=I(c,a);if(isNaN(c)||Infinity==c||-Infin",
    "ity==c)return\"\";d=d?I(d,a):Infinity;if(isNaN(d)||-Infinity===d)return",
    "\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=J(b,a);return Infinity==d?",
    "a.substring(e):a.substring(e,c+Math.round(d))},2,3);L(\"substring-after",
    "\",3,!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);c=b.indexOf(a);return-1==c",
    "?\"\":b.substring(c+a.length)},2);\nL(\"substring-before\",3,!1,!1,func",
    "tion(a,b,c){b=J(b,a);a=J(c,a);a=b.indexOf(a);return-1==a?\"\":b.substri",
    "ng(0,a)},2);L(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();",
    "b=0;for(var c=a.next();c;c=a.next())b+=+C(c);return b},1,1,!0);L(\"tran",
    "slate\",3,!1,!1,function(a,b,c,d){b=J(b,a);c=J(c,a);var e=J(d,a);a={};f",
    "or(d=0;d<c.length;d++){var f=c.charAt(d);f in a||(a[f]=e.charAt(d))}c=",
    "\"\";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f in a?a[f]:f;return c},3)",
    ";L(\"true\",2,!1,!1,function(){return!0},0);function E(a,b){this.na=a;t",
    "his.ha=k(b)?b:null;this.B=null;switch(a){case \"comment\":this.B=8;brea",
    "k;case \"text\":this.B=3;break;case \"processing-instruction\":this.B=7",
    ";break;case \"node\":break;default:throw Error(\"Unexpected argument\")",
    ";}}function Cb(a){return\"comment\"==a||\"text\"==a||\"processing-instr",
    "uction\"==a||\"node\"==a}E.prototype.matches=function(a){return null===",
    "this.B||this.B==a.nodeType};E.prototype.getName=function(){return this.",
    "na};\nE.prototype.toString=function(){var a=\"Kind Test: \"+this.na;nul",
    "l===this.ha||(a+=H(this.ha));return a};function Db(a){F.call(this,3);th",
    "is.ma=a.substring(1,a.length-1)}p(Db,F);Db.prototype.evaluate=function(",
    "){return this.ma};Db.prototype.toString=function(){return\"Literal: \"+",
    "this.ma};function Eb(a,b){this.m=a.toLowerCase();a=\"*\"==this.m?\"*\":",
    "\"http://www.w3.org/1999/xhtml\";this.R=b?b.toLowerCase():a}Eb.prototyp",
    "e.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.loc",
    "alName)?a.localName:a.nodeName;return\"*\"!=this.m&&this.m!=b.toLowerCa",
    "se()?!1:\"*\"==this.R?!0:this.R==(a.namespaceURI?a.namespaceURI.toLower",
    "Case():\"http://www.w3.org/1999/xhtml\")};Eb.prototype.getName=function",
    "(){return this.m};\nEb.prototype.toString=function(){return\"Name Test:",
    " \"+(\"http://www.w3.org/1999/xhtml\"==this.R?\"\":this.R+\":\")+this.m",
    "};function Fb(a){F.call(this,1);this.oa=a}p(Fb,F);Fb.prototype.evaluate",
    "=function(){return this.oa};Fb.prototype.toString=function(){return\"Nu",
    "mber: \"+this.oa};function Gb(a,b){F.call(this,a.i);this.ea=a;this.L=b;",
    "this.A=a.h();this.l=a.l;1==this.L.length&&(a=this.L[0],a.V||a.C!=Hb||(a",
    "=a.T,\"*\"!=a.getName()&&(this.K={name:a.getName(),I:null})))}p(Gb,F);f",
    "unction Ib(){F.call(this,4)}p(Ib,F);Ib.prototype.evaluate=function(a){v",
    "ar b=new D;a=a.s;9==a.nodeType?b.add(a):b.add(a.ownerDocument);return b",
    "};Ib.prototype.toString=function(){return\"Root Helper Expression\"};fu",
    "nction Jb(){F.call(this,4)}p(Jb,F);Jb.prototype.evaluate=function(a){va",
    "r b=new D;b.add(a.s);return b};\nJb.prototype.toString=function(){retur",
    "n\"Context Helper Expression\"};function Kb(a){return\"/\"==a||\"//\"==",
    "a}\nGb.prototype.evaluate=function(a){var b=this.ea.evaluate(a);if(!(b ",
    "instanceof D))throw Error(\"Filter expression must evaluate to nodeset.",
    "\");a=this.L;for(var c=0,d=a.length;c<d&&b.v();c++){var e=a[c],f=b.iter",
    "ator(e.C.H);if(e.h()||e.C!=Lb)if(e.h()||e.C!=Mb){var h=f.next();for(b=e",
    ".evaluate(new bb(h));null!=(h=f.next());)h=e.evaluate(new bb(h)),b=lb(b",
    ",h)}else h=f.next(),b=e.evaluate(new bb(h));else{for(h=f.next();(b=f.ne",
    "xt())&&(!h.contains||h.contains(b))&&b.compareDocumentPosition(h)&8;h=b",
    ");b=e.evaluate(new bb(h))}}return b};\nGb.prototype.toString=function()",
    "{var a=\"Path Expression:\"+H(this.ea);if(this.L.length){var b=qa(this.",
    "L,function(a,b){return a+H(b)},\"Steps:\");a+=H(b)}return a};function N",
    "(a,b){this.f=a;this.H=!!b}function yb(a,b,c){for(c=c||0;c<a.f.length;c+",
    "+)for(var d=a.f[c],e=b.iterator(),f=b.v(),h,n=0;h=e.next();n++){var z=a",
    ".H?f-n:n+1;h=d.evaluate(new bb(h,z,f));if(\"number\"==typeof h)z=z==h;e",
    "lse if(\"string\"==typeof h||\"boolean\"==typeof h)z=!!h;else if(h inst",
    "anceof D)z=0<h.v();else throw Error(\"Predicate.evaluate returned an un",
    "expected type.\");z||e.remove()}return b}N.prototype.D=function(){retur",
    "n 0<this.f.length?this.f[0].D():null};\nN.prototype.h=function(){for(va",
    "r a=0;a<this.f.length;a++){var b=this.f[a];if(b.h()||1==b.i||0==b.i)ret",
    "urn!0}return!1};N.prototype.v=function(){return this.f.length};N.protot",
    "ype.toString=function(){return qa(this.f,function(a,b){return a+H(b)},",
    "\"Predicates:\")};function O(a,b,c,d){F.call(this,4);this.C=a;this.T=b;",
    "this.f=c||new N([]);this.V=!!d;b=this.f.D();a.Aa&&b&&(this.K={name:b.na",
    "me,I:b.I});this.A=this.f.h()}p(O,F);\nO.prototype.evaluate=function(a){",
    "var b=a.s,c=this.D(),d=null,e=null,f=0;c&&(d=c.name,e=c.I?J(c.I,a):null",
    ",f=1);if(this.V)if(this.h()||this.C!=Nb)if(b=(new O(Ob,new E(\"node\"))",
    ").evaluate(a).iterator(),c=b.next())for(a=this.u(c,d,e,f);null!=(c=b.ne",
    "xt());)a=lb(a,this.u(c,d,e,f));else a=new D;else a=hb(this.T,b,d,e),a=y",
    "b(this.f,a,f);else a=this.u(a.s,d,e,f);return a};O.prototype.u=function",
    "(a,b,c,d){a=this.C.O(this.T,a,b,c);return a=yb(this.f,a,d)};\nO.prototy",
    "pe.toString=function(){var a=\"Step:\"+H(\"Operator: \"+(this.V?\"//\":",
    "\"/\"));this.C.m&&(a+=H(\"Axis: \"+this.C));a+=H(this.T);if(this.f.v())",
    "{var b=qa(this.f.f,function(a,b){return a+H(b)},\"Predicates:\");a+=H(b",
    ")}return a};function Pb(a,b,c,d){this.m=a;this.O=b;this.H=c;this.Aa=d}P",
    "b.prototype.toString=function(){return this.m};var Qb={};function P(a,b",
    ",c,d){if(Qb.hasOwnProperty(a))throw Error(\"Axis already created: \"+a)",
    ";b=new Pb(a,b,c,!!d);return Qb[a]=b}\nP(\"ancestor\",function(a,b){for(",
    "var c=new D;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);P(",
    "\"ancestor-or-self\",function(a,b){var c=new D;do a.matches(b)&&c.unshi",
    "ft(b);while(b=b.parentNode);return c},!0);\nvar Hb=P(\"attribute\",func",
    "tion(a,b){var c=new D,d=a.getName();if(b=b.attributes)if(a instanceof E",
    "&&null===a.B||\"*\"==d)for(a=0;d=b[a];a++)c.add(d);else(d=b.getNamedIte",
    "m(d))&&c.add(d);return c},!1),Nb=P(\"child\",function(a,b,c,d,e){c=l(c)",
    "?c:null;d=l(d)?d:null;e=e||new D;for(b=b.firstChild;b;b=b.nextSibling)g",
    "b(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);P(\"descendant\",hb,!",
    "1,!0);\nvar Ob=P(\"descendant-or-self\",function(a,b,c,d){var e=new D;g",
    "b(b,c,d)&&a.matches(b)&&e.add(b);return hb(a,b,c,d,e)},!1,!0),Lb=P(\"fo",
    "llowing\",function(a,b,c,d){var e=new D;do for(var f=b;f=f.nextSibling;",
    ")gb(f,c,d)&&a.matches(f)&&e.add(f),e=hb(a,f,c,d,e);while(b=b.parentNode",
    ");return e},!1,!0);P(\"following-sibling\",function(a,b){for(var c=new ",
    "D;b=b.nextSibling;)a.matches(b)&&c.add(b);return c},!1);P(\"namespace\"",
    ",function(){return new D},!1);\nvar Rb=P(\"parent\",function(a,b){var c",
    "=new D;if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerE",
    "lement),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},!1),Mb=P(\"pr",
    "eceding\",function(a,b,c,d){var e=new D,f=[];do f.unshift(b);while(b=b.",
    "parentNode);for(var h=1,n=f.length;h<n;h++){var z=[];for(b=f[h];b=b.pre",
    "viousSibling;)z.unshift(b);for(var G=0,t=z.length;G<t;G++)b=z[G],gb(b,c",
    ",d)&&a.matches(b)&&e.add(b),e=hb(a,b,c,d,e)}return e},!0,!0);\nP(\"prec",
    "eding-sibling\",function(a,b){for(var c=new D;b=b.previousSibling;)a.ma",
    "tches(b)&&c.unshift(b);return c},!0);var Sb=P(\"self\",function(a,b){va",
    "r c=new D;a.matches(b)&&c.add(b);return c},!1);function Tb(a){F.call(th",
    "is,1);this.da=a;this.A=a.h();this.l=a.l}p(Tb,F);Tb.prototype.evaluate=f",
    "unction(a){return-I(this.da,a)};Tb.prototype.toString=function(){return",
    "\"Unary Expression: -\"+H(this.da)};function Ub(a){F.call(this,4);this.",
    "S=a;pb(this,r(this.S,function(a){return a.h()}));qb(this,r(this.S,funct",
    "ion(a){return a.l}))}p(Ub,F);Ub.prototype.evaluate=function(a){var b=ne",
    "w D;q(this.S,function(c){c=c.evaluate(a);if(!(c instanceof D))throw Err",
    "or(\"Path expression must evaluate to NodeSet.\");b=lb(b,c)});return b}",
    ";Ub.prototype.toString=function(){return qa(this.S,function(a,b){return",
    " a+H(b)},\"Union Expression:\")};function Vb(a,b){this.a=a;this.wa=b}fu",
    "nction Wb(a){for(var b,c=[];;){Q(a,\"Missing right hand side of binary ",
    "expression.\");b=Xb(a);var d=a.a.next();if(!d)break;var e=(d=wb[d]||nul",
    "l)&&d.ja;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].ja;)b=",
    "new sb(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new sb(c.pop(),c",
    ".pop(),b);return b}function Q(a,b){if(a.a.empty())throw Error(b);}funct",
    "ion Yb(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+",
    "b+\" got: \"+a);}\nfunction Zb(a){a=a.a.next();if(\")\"!=a)throw Error(",
    "\"Bad token: \"+a);}function $b(a){a=a.a.next();if(2>a.length)throw Err",
    "or(\"Unclosed literal string\");return new Db(a)}\nfunction ac(a){var b",
    "=[];if(Kb(B(a.a))){var c=a.a.next();var d=B(a.a);if(\"/\"==c&&(a.a.empt",
    "y()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)",
    "))return new Ib;d=new Ib;Q(a,\"Missing next location step.\");c=bc(a,c)",
    ";b.push(c)}else{a:{c=B(a.a);d=c.charAt(0);switch(d){case \"$\":throw Er",
    "ror(\"Variable reference not allowed in HTML XPath\");case \"(\":a.a.ne",
    "xt();c=Wb(a);Q(a,'unclosed \"(\"');Yb(a,\")\");break;case '\"':case \"'",
    "\":c=$b(a);break;default:if(isNaN(+c))if(!Cb(c)&&/(?![0-9])[\\w]/.test(",
    "d)&&\"(\"==B(a.a,\n1)){c=a.a.next();c=Bb[c]||null;a.a.next();for(d=[];",
    "\")\"!=B(a.a);){Q(a,\"Missing function argument list.\");d.push(Wb(a));",
    "if(\",\"!=B(a.a))break;a.a.next()}Q(a,\"Unclosed function argument list",
    ".\");Zb(a);c=new zb(c,d)}else{c=null;break a}else c=new Fb(+a.a.next())",
    "}\"[\"==B(a.a)&&(d=new N(cc(a)),c=new xb(c,d))}if(c)if(Kb(B(a.a)))d=c;e",
    "lse return c;else c=bc(a,\"/\"),d=new Jb,b.push(c)}for(;Kb(B(a.a));)c=a",
    ".a.next(),Q(a,\"Missing next location step.\"),c=bc(a,c),b.push(c);retu",
    "rn new Gb(d,b)}\nfunction bc(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('S",
    "tep op should be \"/\" or \"//\"');if(\".\"==B(a.a)){var c=new O(Sb,new",
    " E(\"node\"));a.a.next();return c}if(\"..\"==B(a.a))return c=new O(Rb,n",
    "ew E(\"node\")),a.a.next(),c;if(\"@\"==B(a.a)){var d=Hb;a.a.next();Q(a,",
    "\"Missing attribute name\")}else if(\"::\"==B(a.a,1)){if(!/(?![0-9])[",
    "\\w]/.test(B(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());va",
    "r e=a.a.next();d=Qb[e]||null;if(!d)throw Error(\"No axis with name: \"+",
    "e);a.a.next();Q(a,\"Missing node name\")}else d=Nb;e=\nB(a.a);if(/(?![0",
    "-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==B(a.a,1)){if(!Cb(e))throw Err",
    "or(\"Invalid node type: \"+e);e=a.a.next();if(!Cb(e))throw Error(\"Inva",
    "lid type name: \"+e);Yb(a,\"(\");Q(a,\"Bad nodetype\");var f=B(a.a).cha",
    "rAt(0),h=null;if('\"'==f||\"'\"==f)h=$b(a);Q(a,\"Bad nodetype\");Zb(a);",
    "e=new E(e,h)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new Eb(e);",
    "else{h=e.substring(0,f);if(\"*\"==h)var n=\"*\";else if(n=a.wa(h),!n)th",
    "row Error(\"Namespace prefix not declared: \"+h);e=e.substr(f+1);e=new ",
    "Eb(e,n)}else throw Error(\"Bad token: \"+\na.a.next());a=new N(cc(a),d.",
    "H);return c||new O(d,e,a,\"//\"==b)}function cc(a){for(var b=[];\"[\"==",
    "B(a.a);){a.a.next();Q(a,\"Missing predicate expression.\");var c=Wb(a);",
    "b.push(c);Q(a,\"Unclosed predicate expression.\");Yb(a,\"]\")}return b}",
    "function Xb(a){if(\"-\"==B(a.a))return a.a.next(),new Tb(Xb(a));var b=a",
    "c(a);if(\"|\"!=B(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Q(a,\"Missi",
    "ng next union location path.\"),b.push(ac(a));a.a.back();a=new Ub(b)}re",
    "turn a};function dc(a){switch(a.nodeType){case 1:return ka(ec,a);case 9",
    ":return dc(a.documentElement);case 11:case 10:case 6:case 12:return fc;",
    "default:return a.parentNode?dc(a.parentNode):fc}}function fc(){return n",
    "ull}function ec(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www",
    ".w3.org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c",
    ".specified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?ec(a.pa",
    "rentNode,b):null};function gc(a,b){if(!a.length)throw Error(\"Empty XPa",
    "th expression.\");a=db(a);if(a.empty())throw Error(\"Invalid XPath expr",
    "ession.\");b?ea(b)||(b=ja(b.lookupNamespaceURI,b)):b=function(){return ",
    "null};var c=Wb(new Vb(a,b));if(!a.empty())throw Error(\"Bad token: \"+a",
    ".next());this.evaluate=function(a,b){a=c.evaluate(new bb(a));return new",
    " R(a,b)}}\nfunction R(a,b){if(0==b)if(a instanceof D)b=4;else if(\"stri",
    "ng\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"",
    "==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2",
    "!=b&&1!=b&&3!=b&&!(a instanceof D))throw Error(\"value could not be con",
    "verted to the specified type\");this.resultType=b;switch(b){case 2:this",
    ".stringValue=a instanceof D?nb(a):\"\"+a;break;case 1:this.numberValue=",
    "a instanceof D?+nb(a):+a;break;case 3:this.booleanValue=a instanceof D?",
    "0<a.v():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var ",
    "d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.v(",
    ");this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue",
    "=mb(a);break;default:throw Error(\"Unknown XPathResult type.\");}var f=",
    "0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext c",
    "alled with wrong result type\");return f>=d.length?null:d[f++]};this.sn",
    "apshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called ",
    "with wrong result type\");return a>=d.length||0>a?null:d[a]}}\nR.ANY_TY",
    "PE=0;R.NUMBER_TYPE=1;R.STRING_TYPE=2;R.BOOLEAN_TYPE=3;R.UNORDERED_NODE_",
    "ITERATOR_TYPE=4;R.ORDERED_NODE_ITERATOR_TYPE=5;R.UNORDERED_NODE_SNAPSHO",
    "T_TYPE=6;R.ORDERED_NODE_SNAPSHOT_TYPE=7;R.ANY_UNORDERED_NODE_TYPE=8;R.F",
    "IRST_ORDERED_NODE_TYPE=9;function hc(a){this.lookupNamespaceURI=dc(a)}",
    "\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Docu",
    "ment.prototype||a.document;if(!c.evaluate||b)a.XPathResult=R,c.evaluate",
    "=function(a,b,c,h){return(new gc(a,c)).evaluate(b,h)},c.createExpressio",
    "n=function(a,b){return new gc(a,b)},c.createNSResolver=function(a){retu",
    "rn new hc(a)}});var S={};S.aa=function(){var a={Ea:\"http://www.w3.org/",
    "2000/svg\"};return function(b){return a[b]||null}}();\nS.u=function(a,b",
    ",c){var d=x(a);if(!d.documentElement)return null;try{for(var e=d.create",
    "NSResolver?d.createNSResolver(d.documentElement):S.aa,f={},h=d.getEleme",
    "ntsByTagName(\"*\"),n=0;n<h.length;++n){var z=h[n],G=z.namespaceURI;if(",
    "G&&!f[G]){var t=z.lookupPrefix(G);if(!t){var y=G.match(\".*/(\\\\w+)/?$",
    "\");t=y?y[1]:\"xhtml\"}f[G]=t}}var M={},T;for(T in f)M[f[T]]=T;e=functi",
    "on(a){return M[a]||null};try{return d.evaluate(b,a,e,c,null)}catch(Fa){",
    "if(\"TypeError\"===Fa.name)return e=d.createNSResolver?d.createNSResolv",
    "er(d.documentElement):\nS.aa,d.evaluate(b,a,e,c,null);throw Fa;}}catch(",
    "Fa){throw new u(32,\"Unable to locate an element with the xpath express",
    "ion \"+b+\" because of the following error:\\n\"+Fa);}};S.ba=function(a",
    ",b){if(!a||1!=a.nodeType)throw new u(32,'The result of the xpath expres",
    "sion \"'+b+'\" is: '+a+\". It should be an element.\");};\nS.za=functio",
    "n(a,b){var c=function(){var c=S.u(b,a,9);return c?c.singleNodeValue||nu",
    "ll:b.selectSingleNode?(c=x(b),c.setProperty&&c.setProperty(\"SelectionL",
    "anguage\",\"XPath\"),b.selectSingleNode(a)):null}();null===c||S.ba(c,a)",
    ";return c};\nS.Ca=function(a,b){var c=function(){var c=S.u(b,a,7);if(c)",
    "{for(var e=c.snapshotLength,f=[],h=0;h<e;++h)f.push(c.snapshotItem(h));",
    "return f}return b.selectNodes?(c=x(b),c.setProperty&&c.setProperty(\"Se",
    "lectionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();q(c,function(b){S.",
    "ba(b,a)});return c};function ic(a,b,c,d){this.top=a;this.right=b;this.b",
    "ottom=c;this.left=d}g=ic.prototype;g.clone=function(){return new ic(thi",
    "s.top,this.right,this.bottom,this.left)};g.toString=function(){return\"",
    "(\"+this.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+",
    "\"l)\"};g.contains=function(a){return this&&a?a instanceof ic?a.left>=t",
    "his.left&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a",
    ".x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\ng",
    ".expand=function(a,b,c,d){fa(a)?(this.top-=a.top,this.right+=a.right,th",
    "is.bottom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(",
    "b),this.bottom+=Number(c),this.left-=Number(d));return this};g.ceil=fun",
    "ction(){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);t",
    "his.bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return",
    " this};\ng.floor=function(){this.top=Math.floor(this.top);this.right=Ma",
    "th.floor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math",
    ".floor(this.left);return this};g.round=function(){this.top=Math.round(t",
    "his.top);this.right=Math.round(this.right);this.bottom=Math.round(this.",
    "bottom);this.left=Math.round(this.left);return this};g.translate=functi",
    "on(a,b){a instanceof w?(this.left+=a.x,this.right+=a.x,this.top+=a.y,th",
    "is.bottom+=a.y):(this.left+=a,this.right+=a,m(b)&&(this.top+=b,this.bot",
    "tom+=b));return this};\ng.scale=function(a,b){b=m(b)?b:a;this.left*=a;t",
    "his.right*=a;this.top*=b;this.bottom*=b;return this};function U(a,b,c,d",
    "){this.left=a;this.top=b;this.width=c;this.height=d}g=U.prototype;g.clo",
    "ne=function(){return new U(this.left,this.top,this.width,this.height)};",
    "g.toString=function(){return\"(\"+this.left+\", \"+this.top+\" - \"+thi",
    "s.width+\"w x \"+this.height+\"h)\"};g.contains=function(a){return a in",
    "stanceof w?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.",
    "y<=this.top+this.height:this.left<=a.left&&this.left+this.width>=a.left",
    "+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a.height};\ng.ce",
    "il=function(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.to",
    "p);this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);",
    "return this};g.floor=function(){this.left=Math.floor(this.left);this.to",
    "p=Math.floor(this.top);this.width=Math.floor(this.width);this.height=Ma",
    "th.floor(this.height);return this};g.round=function(){this.left=Math.ro",
    "und(this.left);this.top=Math.round(this.top);this.width=Math.round(this",
    ".width);this.height=Math.round(this.height);return this};\ng.translate=",
    "function(a,b){a instanceof w?(this.left+=a.x,this.top+=a.y):(this.left+",
    "=a,m(b)&&(this.top+=b));return this};g.scale=function(a,b){b=m(b)?b:a;t",
    "his.left*=a;this.width*=a;this.top*=b;this.height*=b;return this};var j",
    "c=\"function\"===typeof ShadowRoot,kc=\"A AREA BUTTON INPUT LABEL SELEC",
    "T TEXTAREA\".split(\" \");function lc(a){return r(kc,function(b){return",
    " A(a,b)})||null!=Za(a)&&0<=Number(a.tabIndex)||mc(a)}var nc=\"BUTTON IN",
    "PUT OPTGROUP OPTION SELECT TEXTAREA\".split(\" \");\nfunction oc(a){ret",
    "urn r(nc,function(b){return A(a,b)})?a.disabled?!1:a.parentNode&&1==a.p",
    "arentNode.nodeType&&A(a,\"OPTGROUP\")||A(a,\"OPTION\")?oc(a.parentNode)",
    ":!Wa(a,function(a){var b=a.parentNode;if(b&&A(b,\"FIELDSET\")&&b.disabl",
    "ed){if(!A(a,\"LEGEND\"))return!0;for(;a=k(a.previousElementSibling)?a.p",
    "reviousElementSibling:Ra(a.previousSibling);)if(A(a,\"LEGEND\"))return!",
    "0}return!1},!0):!0}var pc=\"text search tel url email password number\"",
    ".split(\" \");\nfunction V(a,b){return A(a,\"INPUT\")?a.type.toLowerCas",
    "e()==b:!1}function qc(a){function b(a){return\"inherit\"==a.contentEdit",
    "able?(a=rc(a))?b(a):!1:\"true\"==a.contentEditable}return k(a.contentEd",
    "itable)?k(a.isContentEditable)?a.isContentEditable:b(a):!1}\nfunction m",
    "c(a){return((A(a,\"TEXTAREA\")?!0:A(a,\"INPUT\")?0<=pa(pc,a.type.toLowe",
    "rCase()):qc(a)?!0:!1)||(A(a,\"INPUT\")?\"file\"==a.type.toLowerCase():!",
    "1)||V(a,\"range\")||V(a,\"date\")||V(a,\"month\")||V(a,\"week\")||V(a,",
    "\"time\")||V(a,\"datetime-local\")||V(a,\"color\"))&&!a.readOnly}functi",
    "on rc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.node",
    "Type;)a=a.parentNode;return A(a)?a:null}\nfunction W(a,b){b=oa(b);if(\"",
    "float\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a:{var c=",
    "b;var d=x(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.def",
    "aultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||\"\"",
    ";break a}c=\"\"}a=c||sc(a,b);if(null===a)a=null;else if(0<=pa(wa,b)){b:",
    "{var e=a.match(za);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),",
    "e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b",
    "=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(Aa))if(b=Number(d[1]),",
    "\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=",
    "d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=va[b.toLower",
    "Case()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&(c=c.replac",
    "e(xa,\"#$1$1$2$2$3$3\")),!ya.test(c))){b=null;break b}b=[parseInt(c.sub",
    "str(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a",
    "=b?\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunction sc(a,b){var c=a",
    ".currentStyle||a.style,d=c[b];!k(d)&&ea(c.getPropertyValue)&&(d=c.getPr",
    "opertyValue(b));return\"inherit\"!=d?k(d)?d:null:(a=rc(a))?sc(a,b):null",
    "}\nfunction tc(a,b,c){function d(a){var b=uc(a);return 0<b.height&&0<b.",
    "width?!0:A(a,\"PATH\")&&(0<b.height||0<b.width)?(a=W(a,\"stroke-width\"",
    "),!!a&&0<parseInt(a,10)):\"hidden\"!=W(a,\"overflow\")&&r(a.childNodes,",
    "function(a){return 3==a.nodeType||A(a)&&d(a)})}function e(a){return vc(",
    "a)==X&&ra(a.childNodes,function(a){return!A(a)||e(a)||!d(a)})}if(!A(a))",
    "throw Error(\"Argument to isShown must be of type Element\");if(A(a,\"B",
    "ODY\"))return!0;var f=rc(a);if(f&&A(f,\"DETAILS\")&&!f.open&&!A(a,\"SUM",
    "MARY\"))return!1;if(A(a,\n\"OPTION\")||A(a,\"OPTGROUP\"))return a=Wa(a,",
    "function(a){return A(a,\"SELECT\")}),!!a&&tc(a,!0,c);if(f=wc(a))return!",
    "!f.fa&&0<f.rect.width&&0<f.rect.height&&tc(f.fa,b,c);if(A(a,\"INPUT\")&",
    "&\"hidden\"==a.type.toLowerCase()||A(a,\"NOSCRIPT\"))return!1;f=W(a,\"v",
    "isibility\");return\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=xc(a))&",
    "&d(a)?!e(a):!1}\nfunction yc(a){function b(a){if(A(a)&&\"none\"==W(a,\"",
    "display\"))return!1;a:{var c=a.parentNode;if(a.getDestinationInsertionP",
    "oints){var e=a.getDestinationInsertionPoints();if(0<e.length){a=e[e.len",
    "gth-1];break a}}a=c&&c.shadowRoot&&void 0!==a.assignedSlot?a.assignedSl",
    "ot?a.assignedSlot.parentNode:null:c}return jc&&a instanceof ShadowRoot|",
    "|a&&(9==a.nodeType||11==a.nodeType)?!0:!!a&&b(a)}return tc(a,!0,b)}var ",
    "X=\"hidden\";\nfunction vc(a){function b(a){function b(a){if(a==h)retur",
    "n!0;var b=W(a,\"display\");return 0==b.lastIndexOf(\"inline\",0)||\"con",
    "tents\"==b||\"absolute\"==c&&\"static\"==W(a,\"position\")?!1:!0}var c=",
    "W(a,\"position\");if(\"fixed\"==c)return G=!0,a==h?null:h;for(a=rc(a);a",
    "&&!b(a);)a=rc(a);return a}function c(a){var b=a;if(\"visible\"==z)if(a=",
    "=h&&n)b=n;else if(a==n)return{x:\"visible\",y:\"visible\"};b={x:W(b,\"o",
    "verflow-x\"),y:W(b,\"overflow-y\")};a==h&&(b.x=\"visible\"==b.x?\"auto",
    "\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y);return b}function d(a){if(a==",
    "\nh){var b=(new Ya(f)).M;a=b.scrollingElement?b.scrollingElement:b.body",
    "||b.documentElement;b=b.parentWindow||b.defaultView;a=new w(b.pageXOffs",
    "et||a.scrollLeft,b.pageYOffset||a.scrollTop)}else a=new w(a.scrollLeft,",
    "a.scrollTop);return a}var e=zc(a),f=x(a),h=f.documentElement,n=f.body,z",
    "=W(h,\"overflow\"),G;for(a=b(a);a;a=b(a)){var t=c(a);if(\"visible\"!=t.",
    "x||\"visible\"!=t.y){var y=uc(a);if(0==y.width||0==y.height)return X;va",
    "r M=e.right<y.left,T=e.bottom<y.top;if(M&&\"hidden\"==t.x||T&&\"hidden",
    "\"==t.y)return X;\nif(M&&\"visible\"!=t.x||T&&\"visible\"!=t.y){M=d(a);",
    "T=e.bottom<y.top-M.y;if(e.right<y.left-M.x&&\"visible\"!=t.x||T&&\"visi",
    "ble\"!=t.x)return X;e=vc(a);return e==X?X:\"scroll\"}M=e.left>=y.left+y",
    ".width;y=e.top>=y.top+y.height;if(M&&\"hidden\"==t.x||y&&\"hidden\"==t.",
    "y)return X;if(M&&\"visible\"!=t.x||y&&\"visible\"!=t.y){if(G&&(t=d(a),e",
    ".left>=h.scrollWidth-t.x||e.right>=h.scrollHeight-t.y))return X;e=vc(a)",
    ";return e==X?X:\"scroll\"}}}return\"none\"}\nfunction uc(a){var b=wc(a)",
    ";if(b)return b.rect;if(A(a,\"HTML\"))return a=x(a),a=((a?a.parentWindow",
    "||a.defaultView:window)||window).document,a=\"CSS1Compat\"==a.compatMod",
    "e?a.documentElement:a.body,a=new Oa(a.clientWidth,a.clientHeight),new U",
    "(0,0,a.width,a.height);try{var c=a.getBoundingClientRect()}catch(d){ret",
    "urn new U(0,0,0,0)}return new U(c.left,c.top,c.right-c.left,c.bottom-c.",
    "top)}\nfunction wc(a){var b=A(a,\"MAP\");if(!b&&!A(a,\"AREA\"))return n",
    "ull;var c=b?a:A(a.parentNode,\"MAP\")?a.parentNode:null,d=null,e=null;c",
    "&&c.name&&(d=S.za('/descendant::*[@usemap = \"#'+c.name+'\"]',x(c)))&&(",
    "e=uc(d),b||\"default\"==a.shape.toLowerCase()||(a=Ac(a),b=Math.min(Math",
    ".max(a.left,0),e.width),c=Math.min(Math.max(a.top,0),e.height),e=new U(",
    "b+e.left,c+e.top,Math.min(a.width,e.width-b),Math.min(a.height,e.height",
    "-c))));return{fa:d,rect:e||new U(0,0,0,0)}}\nfunction Ac(a){var b=a.sha",
    "pe.toLowerCase();a=a.coords.split(\",\");if(\"rect\"==b&&4==a.length){b",
    "=a[0];var c=a[1];return new U(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a",
    ".length)return b=a[2],new U(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.",
    "length){b=a[0];c=a[1];for(var d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(",
    "b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);re",
    "turn new U(b,c,d-b,e-c)}return new U(0,0,0,0)}function zc(a){a=uc(a);re",
    "turn new ic(a.top,a.left+a.width,a.top+a.height,a.left)}\nfunction xc(a",
    "){var b=1,c=W(a,\"opacity\");c&&(b=Number(c));(a=rc(a))&&(b*=xc(a));ret",
    "urn b};Na();Na();function Bc(){this.B=\"change\";this.pa=!0;this.qa=!1}",
    "Bc.prototype.create=function(a){a=x(a).createEvent(\"HTMLEvents\");a.in",
    "itEvent(this.B,this.pa,this.qa);return a};Bc.prototype.toString=functio",
    "n(){return this.B};var Cc=new Bc;function Dc(){this.N=la.document.docum",
    "entElement;var a=Xa(x(this.N));a&&Ec(this,a)}function Ec(a,b){a.N=b;A(b",
    ",\"OPTION\")&&Wa(b,function(a){return A(a,\"SELECT\")})}function Fc(a){",
    "var b=Wa(a.N,function(a){return!!a&&A(a)&&lc(a)},!0);b=b||a.N;a=Xa(x(b)",
    ");if(b!=a){if(a&&ea(a.blur)&&!A(a,\"BODY\"))try{a.blur()}catch(c){throw",
    " c;}ea(b.focus)&&b.focus()}};function Gc(a,b){this.w={};this.g=[];this.",
    "G=0;var c=arguments.length;if(1<c){if(c%2)throw Error(\"Uneven number o",
    "f arguments\");for(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1",
    "])}else a&&this.addAll(a)}function Hc(a){Ic(a);return a.g.concat()}g=Gc",
    ".prototype;g.clear=function(){this.w={};this.G=this.g.length=0};g.remov",
    "e=function(a){return Object.prototype.hasOwnProperty.call(this.w,a)?(de",
    "lete this.w[a],this.G--,this.g.length>2*this.G&&Ic(this),!0):!1};\nfunc",
    "tion Ic(a){if(a.G!=a.g.length){for(var b=0,c=0;b<a.g.length;){var d=a.g",
    "[b];Object.prototype.hasOwnProperty.call(a.w,d)&&(a.g[c++]=d);b++}a.g.l",
    "ength=c}if(a.G!=a.g.length){var e={};for(c=b=0;b<a.g.length;)d=a.g[b],O",
    "bject.prototype.hasOwnProperty.call(e,d)||(a.g[c++]=d,e[d]=1),b++;a.g.l",
    "ength=c}}g.get=function(a,b){return Object.prototype.hasOwnProperty.cal",
    "l(this.w,a)?this.w[a]:b};g.set=function(a,b){Object.prototype.hasOwnPro",
    "perty.call(this.w,a)||(this.G++,this.g.push(a));this.w[a]=b};\ng.addAll",
    "=function(a){if(a instanceof Gc){var b=Hc(a);Ic(a);for(var c=[],d=0;d<a",
    ".g.length;d++)c.push(a.w[a.g[d]]);a=c}else{b=[];d=0;for(var e in a)b[d+",
    "+]=e;d=[];e=0;for(c in a)d[e++]=a[c];a=d}for(c=0;c<b.length;c++)this.se",
    "t(b[c],a[c])};g.forEach=function(a,b){for(var c=Hc(this),d=0;d<c.length",
    ";d++){var e=c[d],f=this.get(e);a.call(b,f,e,this)}};g.clone=function(){",
    "return new Gc(this)};var Jc={};function Y(a,b,c){fa(a)&&(a=a.b);a=new K",
    "c(a);!b||b in Jc&&!c||(Jc[b]={key:a,shift:!1},c&&(Jc[c]={key:a,shift:!0",
    "}));return a}function Kc(a){this.code=a}Y(8);Y(9);Y(13);var Lc=Y(16),Mc",
    "=Y(17),Nc=Y(18);Y(19);Y(20);Y(27);Y(32,\" \");Y(33);Y(34);Y(35);Y(36);Y",
    "(37);Y(38);Y(39);Y(40);Y(44);Y(45);Y(46);Y(48,\"0\",\")\");Y(49,\"1\",",
    "\"!\");Y(50,\"2\",\"@\");Y(51,\"3\",\"#\");Y(52,\"4\",\"$\");Y(53,\"5\"",
    ",\"%\");Y(54,\"6\",\"^\");Y(55,\"7\",\"&\");Y(56,\"8\",\"*\");Y(57,\"9",
    "\",\"(\");Y(65,\"a\",\"A\");Y(66,\"b\",\"B\");Y(67,\"c\",\"C\");Y(68,\"",
    "d\",\"D\");\nY(69,\"e\",\"E\");Y(70,\"f\",\"F\");Y(71,\"g\",\"G\");Y(72",
    ",\"h\",\"H\");Y(73,\"i\",\"I\");Y(74,\"j\",\"J\");Y(75,\"k\",\"K\");Y(7",
    "6,\"l\",\"L\");Y(77,\"m\",\"M\");Y(78,\"n\",\"N\");Y(79,\"o\",\"O\");Y(",
    "80,\"p\",\"P\");Y(81,\"q\",\"Q\");Y(82,\"r\",\"R\");Y(83,\"s\",\"S\");Y",
    "(84,\"t\",\"T\");Y(85,\"u\",\"U\");Y(86,\"v\",\"V\");Y(87,\"w\",\"W\");",
    "Y(88,\"x\",\"X\");Y(89,\"y\",\"Y\");Y(90,\"z\",\"Z\");var Oc=Y(Ja?{c:91",
    ",b:91}:Ia?{c:224,b:91}:{c:0,b:91});Y(Ja?{c:92,b:92}:Ia?{c:224,b:93}:{c:",
    "0,b:92});Y(Ja?{c:93,b:93}:Ia?{c:0,b:0}:{c:93,b:null});Y({c:96,b:96},\"0",
    "\");Y({c:97,b:97},\"1\");\nY({c:98,b:98},\"2\");Y({c:99,b:99},\"3\");Y(",
    "{c:100,b:100},\"4\");Y({c:101,b:101},\"5\");Y({c:102,b:102},\"6\");Y({c",
    ":103,b:103},\"7\");Y({c:104,b:104},\"8\");Y({c:105,b:105},\"9\");Y({c:1",
    "06,b:106},\"*\");Y({c:107,b:107},\"+\");Y({c:109,b:109},\"-\");Y({c:110",
    ",b:110},\".\");Y({c:111,b:111},\"/\");Y(144);Y(112);Y(113);Y(114);Y(115",
    ");Y(116);Y(117);Y(118);Y(119);Y(120);Y(121);Y(122);Y(123);Y({c:107,b:18",
    "7},\"=\",\"+\");Y(108,\",\");Y({c:109,b:189},\"-\",\"_\");Y(188,\",\",",
    "\"<\");Y(190,\".\",\">\");Y(191,\"/\",\"?\");Y(192,\"`\",\"~\");Y(219,",
    "\"[\",\"{\");\nY(220,\"\\\\\",\"|\");Y(221,\"]\",\"}\");Y({c:59,b:186},",
    "\";\",\":\");Y(222,\"'\",'\"');var Pc=new Gc;Pc.set(1,Lc);Pc.set(2,Mc);",
    "Pc.set(4,Nc);Pc.set(8,Oc);(function(a){var b=new Gc;q(Hc(a),function(c)",
    "{b.set(a.get(c).code,c)});return b})(Pc);function Z(){Dc.call(this)}p(Z",
    ",Dc);Z.W=void 0;Z.ra=function(){return Z.W?Z.W:Z.W=new Z};function Qc(a",
    "){var b=Z.ra();Ec(b,a);Fc(b)};ba(\"_\",function(a){if(!yc(a)||!oc(a)||",
    "\"none\"==W(a,\"pointer-events\"))throw new u(12,\"Element is not curre",
    "ntly interactable and may not be manipulated\");if(!mc(a))throw new u(1",
    "2,\"Element must be user-editable in order to clear it.\");if(a.value){",
    "Qc(a);a.value=\"\";var b=Cc.create(a,void 0);\"isTrusted\"in b||(b.isTr",
    "usted=!1);a.dispatchEvent(b);if(b=la.document.body)Qc(b);else throw new",
    " u(13,\"Cannot unfocus element after clearing.\");}else A(a,\"INPUT\")&",
    "&a.getAttribute(\"type\")&&\"number\"==a.getAttribute(\"type\").toLower",
    "Case()&&\n(Qc(a),a.value=\"\");qc(a)&&(Qc(a),a.innerHTML=\" \")});; ret",
    "urn this._.apply(null,arguments);}.apply({navigator:typeof window!='und",
    "efined'?window.navigator:null,document:typeof window!='undefined'?windo",
    "w.document:null}, arguments);}",
    NULL
};

const char* const CLICK[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){return\"function\"=",
    "=ca(a)}function fa(a){var b=typeof a;return\"object\"==b&&null!=a||\"fu",
    "nction\"==b}function ha(a,b,c){return a.call.apply(a.bind,arguments)}\n",
    "function ia(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arr",
    "ay.prototype.slice.call(arguments,2);return function(){var c=Array.prot",
    "otype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a",
    ".apply(b,c)}}return function(){return a.apply(b,arguments)}}function ja",
    "(a,b,c){ja=Function.prototype.bind&&-1!=Function.prototype.bind.toStrin",
    "g().indexOf(\"native code\")?ha:ia;return ja.apply(null,arguments)}\nfu",
    "nction ka(a,b){var c=Array.prototype.slice.call(arguments,1);return fun",
    "ction(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b",
    ")}}function p(a,b){function c(){}c.prototype=b.prototype;a.Na=b.prototy",
    "pe;a.prototype=new c;a.prototype.constructor=a;a.La=function(a,c,f){for",
    "(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argu",
    "ments[e];return b.prototype[c].apply(a,d)}};var la=window;var ma=String",
    ".prototype.trim?function(a){return a.trim()}:function(a){return a.repla",
    "ce(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};\nfunction oa(a,b){var c=0;a=ma(",
    "String(a)).split(\".\");b=ma(String(b)).split(\".\");for(var d=Math.max",
    "(a.length,b.length),e=0;0==c&&e<d;e++){var f=a[e]||\"\",h=b[e]||\"\";do",
    "{f=/(\\d*)(\\D*)(.*)/.exec(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*",
    ")/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==f[0].length&&0==h[0].length)bre",
    "ak;c=pa(0==f[1].length?0:parseInt(f[1],10),0==h[1].length?0:parseInt(h[",
    "1],10))||pa(0==f[2].length,0==h[2].length)||pa(f[2],h[2]);f=f[3];h=h[3]",
    "}while(0==c)}return c}function pa(a,b){return a<b?-1:a>b?1:0}\nfunction",
    " qa(a){return String(a).replace(/\\-([a-z])/g,function(a,c){return c.to",
    "UpperCase()})};function ra(a,b){if(m(a))return m(b)&&1==b.length?a.inde",
    "xOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;ret",
    "urn-1}function r(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c",
    ";e++)e in d&&b.call(void 0,d[e],e,a)}function sa(a,b,c){var d=c;r(a,fun",
    "ction(c,f){d=b.call(void 0,d,c,f,a)});return d}function ta(a,b){for(var",
    " c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0",
    ",d[e],e,a))return!0;return!1}\nfunction ua(a,b){for(var c=a.length,d=m(",
    "a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))retu",
    "rn!1;return!0}function va(a){return Array.prototype.concat.apply([],arg",
    "uments)}function wa(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<",
    "b;d++)c[d]=a[d];return c}return[]}function xa(a,b,c){return 2>=argument",
    "s.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b",
    ",c)};var ya={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#00f",
    "fff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque",
    ":\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"#0000f",
    "f\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cade",
    "tblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"",
    "#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc",
    "143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkg",
    "oldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\",\ndarkg",
    "rey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolive",
    "green:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred",
    ":\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateb",
    "lue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",dar",
    "kturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deep",
    "skyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:",
    "\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:",
    "\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhite:\"#f",
    "8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",green:",
    "\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#f0fff0",
    "\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:",
    "\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:\"#fff",
    "0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e",
    "6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:",
    "\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey:\"#d",
    "3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagreen:",
    "\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lightsl",
    "ategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",",
    "lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff0",
    "0ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#000",
    "0cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagreen:",
    "\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",m",
    "ediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#",
    "191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#ffe4",
    "b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive",
    ":\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff45",
    "00\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\"",
    ",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip:\"#ffef",
    "d5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dd",
    "a0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybr",
    "own:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"",
    "#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:\"#fff",
    "5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slatebl",
    "ue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:\"#fffa",
    "fa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal",
    ":\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0",
    "\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"",
    "#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var za=\"backgrou",
    "ndColor borderTopColor borderRightColor borderBottomColor borderLeftCol",
    "or color outlineColor\".split(\" \"),Aa=/#([0-9a-fA-F])([0-9a-fA-F])([0",
    "-9a-fA-F])/,Ba=/^#(?:[0-9a-f]{3}){1,2}$/i,Ca=/^(?:rgba)?\\((\\d{1,3}),",
    "\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,Da=/^(?:rgb)?\\(",
    "(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$/i;fun",
    "ction t(a,b){this.code=a;this.state=w[a]||Ea;this.message=b||\"\";a=thi",
    "s.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase()",
    ".replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error",
    "\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=this.nam",
    "e;this.stack=a.stack||\"\"}p(t,Error);var Ea=\"unknown error\",w={15:\"",
    "element not selectable\",11:\"element not visible\"};w[31]=Ea;w[30]=Ea;",
    "w[24]=\"invalid cookie domain\";w[29]=\"invalid element coordinates\";w",
    "[12]=\"invalid element state\";\nw[32]=\"invalid selector\";w[51]=\"inv",
    "alid selector\";w[52]=\"invalid selector\";w[17]=\"javascript error\";w",
    "[405]=\"unsupported operation\";w[34]=\"move target out of bounds\";w[2",
    "7]=\"no such alert\";w[7]=\"no such element\";w[8]=\"no such frame\";w[",
    "23]=\"no such window\";w[28]=\"script timeout\";w[33]=\"session not cre",
    "ated\";w[10]=\"stale element reference\";w[21]=\"timeout\";w[25]=\"unab",
    "le to set cookie\";w[26]=\"unexpected alert open\";w[13]=Ea;w[9]=\"unkn",
    "own command\";t.prototype.toString=function(){return this.name+\": \"+t",
    "his.message};var x;a:{var Fa=aa.navigator;if(Fa){var Ga=Fa.userAgent;if",
    "(Ga){x=Ga;break a}}x=\"\"};function Ha(a){var b=Ia;Object.prototype.has",
    "OwnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var Ja=-1!=x.inde",
    "xOf(\"Macintosh\"),Ka=-1!=x.indexOf(\"Windows\"),La,Ma=\"\",Na=/WebKit",
    "\\/(\\S+)/.exec(x);Na&&(Ma=Na?Na[1]:\"\");La=Ma;var Ia={};function Oa()",
    "{Ha(function(){return 0<=oa(La,\"528\")})};function Pa(a){return(a=a.ex",
    "ec(x))?a[1]:\"\"}var Qa=-1!=x.indexOf(\"iPhone\")&&-1==x.indexOf(\"iPod",
    "\")&&-1==x.indexOf(\"iPad\")||-1!=x.indexOf(\"iPad\")||-1!=x.indexOf(\"",
    "iPod\")?Pa(/CriOS\\/([0-9.]+)/):Pa(/Chrome\\/([0-9.]+)/);var Ra=10<=Num",
    "ber(void 0);function z(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=z.prototy",
    "pe;g.clone=function(){return new z(this.x,this.y)};g.toString=function(",
    "){return\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x=Math",
    ".ceil(this.x);this.y=Math.ceil(this.y);return this};g.floor=function(){",
    "this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};g.roun",
    "d=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return",
    " this};\ng.translate=function(a,b){a instanceof z?(this.x+=a.x,this.y+=",
    "a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};g.scale=functio",
    "n(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Sa(a,b){thi",
    "s.width=a;this.height=b}g=Sa.prototype;g.clone=function(){return new Sa",
    "(this.width,this.height)};g.toString=function(){return\"(\"+this.width+",
    "\" x \"+this.height+\")\"};g.aspectRatio=function(){return this.width/t",
    "his.height};g.ceil=function(){this.width=Math.ceil(this.width);this.hei",
    "ght=Math.ceil(this.height);return this};g.floor=function(){this.width=M",
    "ath.floor(this.width);this.height=Math.floor(this.height);return this};",
    "\ng.round=function(){this.width=Math.round(this.width);this.height=Math",
    ".round(this.height);return this};g.scale=function(a,b){b=n(b)?b:a;this.",
    "width*=a;this.height*=b;return this};function Ta(a){return a?a.parentWi",
    "ndow||a.defaultView:window}function Ua(a,b,c){function d(c){c&&b.append",
    "Child(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.length;e++){var f=c[e",
    "];!da(f)||fa(f)&&0<f.nodeType?d(f):r(Va(f)?wa(f):f,d)}}function Wa(a){f",
    "or(;a&&1!=a.nodeType;)a=a.previousSibling;return a}\nfunction Xa(a,b){i",
    "f(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(",
    "b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a",
    ".compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==",
    "a}\nfunction Ya(a,b){if(a==b)return 0;if(a.compareDocumentPosition)retu",
    "rn a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parent",
    "Node&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeTy",
    "pe;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.pa",
    "rentNode;return e==f?Za(a,b):!c&&Xa(e,b)?-1*$a(a,b):!d&&Xa(f,a)?$a(b,a)",
    ":(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=A(a)",
    ";c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange();a.s",
    "electNode(b);\na.collapse(!0);return c.compareBoundaryPoints(aa.Range.S",
    "TART_TO_END,a)}function $a(a,b){var c=a.parentNode;if(c==b)return-1;for",
    "(;b.parentNode!=c;)b=b.parentNode;return Za(b,a)}function Za(a,b){for(;",
    "b=b.previousSibling;)if(b==a)return-1;return 1}function A(a){return 9==",
    "a.nodeType?a:a.ownerDocument||a.document}function Va(a){if(a&&\"number",
    "\"==typeof a.length){if(fa(a))return\"function\"==typeof a.item||\"stri",
    "ng\"==typeof a.item;if(ea(a))return\"function\"==typeof a.item}return!1",
    "}\nfunction ab(a,b,c){a&&!c&&(a=a.parentNode);for(c=0;a;){if(b(a))retur",
    "n a;a=a.parentNode;c++}return null}function bb(a){try{return a&&a.activ",
    "eElement}catch(b){}return null}function cb(a){this.R=a||aa.document||do",
    "cument}g=cb.prototype;g.I=function(){return m(void 0)?this.R.getElement",
    "ById(void 0):void 0};g.getElementsByTagName=function(a,b){return(b||thi",
    "s.R).getElementsByTagName(String(a))};g.createElement=function(a){retur",
    "n this.R.createElement(String(a))};g.createTextNode=function(a){return ",
    "this.R.createTextNode(String(a))};\ng.appendChild=function(a,b){a.appen",
    "dChild(b)};g.append=function(a,b){Ua(A(a),a,arguments)};g.canHaveChildr",
    "en=function(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLE",
    "T\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND",
    "\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT",
    "\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case ",
    "\"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PAR",
    "AM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case",
    " \"WBR\":return!1}return!0};\ng.removeNode=function(a){return a&&a.pare",
    "ntNode?a.parentNode.removeChild(a):null};g.contains=Xa;function db(a){v",
    "ar b=\"tabindex\";return\"style\"==b?eb(a.style.cssText):(a=a.getAttrib",
    "uteNode(b))&&a.specified?a.value:null}var fb=/[;]+(?=(?:(?:[^\"]*\"){2}",
    ")*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\\([^()]*\\))*[^()]*$",
    ")/;function eb(a){var b=[];r(a.split(fb),function(a){var c=a.indexOf(\"",
    ":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.length&&b.push(a[0].toLow",
    "erCase(),\":\",a[1],\";\"))});b=b.join(\"\");return b=\";\"==b.charAt(b",
    ".length-1)?b:b+\";\"}\nfunction B(a,b){b&&\"string\"!==typeof b&&(b=b.t",
    "oString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}f",
    "unction gb(a){return B(a,\"OPTION\")?!0:B(a,\"INPUT\")?(a=a.type.toLowe",
    "rCase(),\"checkbox\"==a||\"radio\"==a):!1}function hb(a){if(!gb(a))thro",
    "w new t(15,\"Element is not selectable\");var b=\"selected\",c=a.type&&",
    "a.type.toLowerCase();if(\"checkbox\"==c||\"radio\"==c)b=\"checked\";ret",
    "urn!!a[b]};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, I",
    "nc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, ",
    "free of charge, to any person obtaining a copy\n of this software and a",
    "ssociated documentation files (the \"Software\"), to\n deal in the Soft",
    "ware without restriction, including without limitation the\n rights to ",
    "use, copy, modify, merge, publish, distribute, sublicense, and/or\n sel",
    "l copies of the Software, and to permit persons to whom the Software is",
    "\n furnished to do so, subject to the following conditions:\n\n The abo",
    "ve copyright notice and this permission notice shall be included in\n a",
    "ll copies or substantial portions of the Software.\n\n THE SOFTWARE IS ",
    "PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED,",
    " INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITN",
    "ESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
    "\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTH",
    "ER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, AR",
    "ISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR O",
    "THER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction ib(a,b,c){this.v=a;this.",
    "Ia=b||1;this.u=c||1};function jb(a){this.ja=a;this.Z=0}function kb(a){a",
    "=a.match(lb);for(var b=0;b<a.length;b++)mb.test(a[b])&&a.splice(b,1);re",
    "turn new jb(a)}var lb=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9",
    "-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^",
    "\"]*\"|'[^']*'|[!<>]=|\\s+|./g,mb=/^\\s/;function C(a,b){return a.ja[a.",
    "Z+(b||0)]}jb.prototype.next=function(){return this.ja[this.Z++]};jb.pro",
    "totype.back=function(){this.Z--};jb.prototype.empty=function(){return t",
    "his.ja.length<=this.Z};function D(a){var b=null,c=a.nodeType;1==c&&(b=a",
    ".textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"",
    "\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a",
    ".firstChild;c=0;var d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeVal",
    "ue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}",
    "else b=a.nodeValue;return\"\"+b}\nfunction nb(a,b,c){if(null===b)return",
    "!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a",
    ".getAttribute(b):a.getAttribute(b,2)==c}function ob(a,b,c,d,e){return p",
    "b.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new E)}\nfunction pb(a,b,c,d",
    ",e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),r(b,f",
    "unction(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"cla",
    "ss\"==c?(b=b.getElementsByClassName(d),r(b,function(b){b.className==d&&",
    "a.matches(b)&&e.add(b)})):a instanceof F?qb(a,b,c,d,e):b.getElementsByT",
    "agName&&(b=b.getElementsByTagName(a.getName()),r(b,function(a){nb(a,c,d",
    ")&&e.add(a)}));return e}\nfunction qb(a,b,c,d,e){for(b=b.firstChild;b;b",
    "=b.nextSibling)nb(b,c,d)&&a.matches(b)&&e.add(b),qb(a,b,c,d,e)};functio",
    "n E(){this.u=this.m=null;this.T=0}function rb(a){this.node=a;this.next=",
    "this.L=null}function sb(a,b){if(!a.m)return b;if(!b.m)return a;var c=a.",
    "m;b=b.m;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.nex",
    "t):0<Ya(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.L=d)?d.next=e:a",
    ".m=e,d=e,f++;for(e=c||b;e;)e.L=d,d=d.next=e,f++,e=e.next;a.u=d;a.T=f;re",
    "turn a}E.prototype.unshift=function(a){a=new rb(a);a.next=this.m;this.u",
    "?this.m.L=a:this.m=this.u=a;this.m=a;this.T++};\nE.prototype.add=functi",
    "on(a){a=new rb(a);a.L=this.u;this.m?this.u.next=a:this.m=this.u=a;this.",
    "u=a;this.T++};function tb(a){return(a=a.m)?a.node:null}E.prototype.A=fu",
    "nction(){return this.T};function ub(a){return(a=tb(a))?D(a):\"\"}E.prot",
    "otype.iterator=function(a){return new vb(this,!!a)};function vb(a,b){th",
    "is.Ea=a;this.oa=(this.O=b)?a.u:a.m;this.ga=null}vb.prototype.next=funct",
    "ion(){var a=this.oa;if(null==a)return null;var b=this.ga=a;this.oa=this",
    ".O?a.L:a.next;return b.node};\nvb.prototype.remove=function(){var a=thi",
    "s.Ea,b=this.ga;if(!b)throw Error(\"Next must be called at least once be",
    "fore remove.\");var c=b.L;b=b.next;c?c.next=b:a.m=b;b?b.L=c:a.u=c;a.T--",
    ";this.ga=null};function G(a){this.l=a;this.o=this.F=!1;this.U=null}func",
    "tion H(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}G",
    ".prototype.i=function(){return this.F};function wb(a,b){a.F=b}function ",
    "xb(a,b){a.o=b}G.prototype.J=function(){return this.U};function I(a,b){a",
    "=a.evaluate(b);return a instanceof E?+ub(a):+a}function K(a,b){a=a.eval",
    "uate(b);return a instanceof E?ub(a):\"\"+a}function yb(a,b){a=a.evaluat",
    "e(b);return a instanceof E?!!a.A():!!a};function zb(a,b,c){G.call(this,",
    "a.l);this.ia=a;this.ta=b;this.ya=c;this.F=b.i()||c.i();this.o=b.o||c.o;",
    "this.ia==Ab&&(c.o||c.i()||4==c.l||0==c.l||!b.J()?b.o||b.i()||4==b.l||0=",
    "=b.l||!c.J()||(this.U={name:c.J().name,P:b}):this.U={name:b.J().name,P:",
    "c})}p(zb,G);\nfunction Bb(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);va",
    "r f;if(b instanceof E&&c instanceof E){b=b.iterator();for(d=b.next();d;",
    "d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a(D(d),D(f)))r",
    "eturn!0;return!1}if(b instanceof E||c instanceof E){b instanceof E?(e=b",
    ",d=c):(e=c,d=b);f=e.iterator();for(var h=typeof d,l=f.next();l;l=f.next",
    "()){switch(h){case \"number\":l=+D(l);break;case \"boolean\":l=!!D(l);b",
    "reak;case \"string\":l=D(l);break;default:throw Error(\"Illegal primiti",
    "ve type for comparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}re",
    "turn!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c)",
    ":\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}zb",
    ".prototype.evaluate=function(a){return this.ia.w(this.ta,this.ya,a)};zb",
    ".prototype.toString=function(){var a=\"Binary Expression: \"+this.ia;a+",
    "=H(this.ta);return a+=H(this.ya)};function Cb(a,b,c,d){this.Ha=a;this.w",
    "a=b;this.l=c;this.w=d}Cb.prototype.toString=function(){return this.Ha};",
    "var Db={};\nfunction L(a,b,c,d){if(Db.hasOwnProperty(a))throw Error(\"B",
    "inary operator already created: \"+a);a=new Cb(a,b,c,d);return Db[a.toS",
    "tring()]=a}L(\"div\",6,1,function(a,b,c){return I(a,c)/I(b,c)});L(\"mod",
    "\",6,1,function(a,b,c){return I(a,c)%I(b,c)});L(\"*\",6,1,function(a,b,",
    "c){return I(a,c)*I(b,c)});L(\"+\",5,1,function(a,b,c){return I(a,c)+I(b",
    ",c)});L(\"-\",5,1,function(a,b,c){return I(a,c)-I(b,c)});L(\"<\",4,2,fu",
    "nction(a,b,c){return Bb(function(a,b){return a<b},a,b,c)});\nL(\">\",4,",
    "2,function(a,b,c){return Bb(function(a,b){return a>b},a,b,c)});L(\"<=\"",
    ",4,2,function(a,b,c){return Bb(function(a,b){return a<=b},a,b,c)});L(\"",
    ">=\",4,2,function(a,b,c){return Bb(function(a,b){return a>=b},a,b,c)});",
    "var Ab=L(\"=\",3,2,function(a,b,c){return Bb(function(a,b){return a==b}",
    ",a,b,c,!0)});L(\"!=\",3,2,function(a,b,c){return Bb(function(a,b){retur",
    "n a!=b},a,b,c,!0)});L(\"and\",2,2,function(a,b,c){return yb(a,c)&&yb(b,",
    "c)});L(\"or\",1,2,function(a,b,c){return yb(a,c)||yb(b,c)});function Eb",
    "(a,b){if(b.A()&&4!=a.l)throw Error(\"Primary expression must evaluate t",
    "o nodeset if filter has predicate(s).\");G.call(this,a.l);this.xa=a;thi",
    "s.f=b;this.F=a.i();this.o=a.o}p(Eb,G);Eb.prototype.evaluate=function(a)",
    "{a=this.xa.evaluate(a);return Fb(this.f,a)};Eb.prototype.toString=funct",
    "ion(){var a=\"Filter:\"+H(this.xa);return a+=H(this.f)};function Gb(a,b",
    "){if(b.length<a.va)throw Error(\"Function \"+a.s+\" expects at least\"+",
    "a.va+\" arguments, \"+b.length+\" given\");if(null!==a.ha&&b.length>a.h",
    "a)throw Error(\"Function \"+a.s+\" expects at most \"+a.ha+\" arguments",
    ", \"+b.length+\" given\");a.Fa&&r(b,function(b,d){if(4!=b.l)throw Error",
    "(\"Argument \"+d+\" to function \"+a.s+\" is not of type Nodeset: \"+b)",
    ";});G.call(this,a.l);this.X=a;this.ea=b;wb(this,a.F||ta(b,function(a){r",
    "eturn a.i()}));xb(this,a.Da&&!b.length||a.Ca&&!!b.length||ta(b,function",
    "(a){return a.o}))}\np(Gb,G);Gb.prototype.evaluate=function(a){return th",
    "is.X.w.apply(null,va(a,this.ea))};Gb.prototype.toString=function(){var ",
    "a=\"Function: \"+this.X;if(this.ea.length){var b=sa(this.ea,function(a,",
    "b){return a+H(b)},\"Arguments:\");a+=H(b)}return a};function Hb(a,b,c,d",
    ",e,f,h,l){this.s=a;this.l=b;this.F=c;this.Da=d;this.Ca=!1;this.w=e;this",
    ".va=f;this.ha=k(h)?h:f;this.Fa=!!l}Hb.prototype.toString=function(){ret",
    "urn this.s};var Ib={};\nfunction M(a,b,c,d,e,f,h,l){if(Ib.hasOwnPropert",
    "y(a))throw Error(\"Function already created: \"+a+\".\");Ib[a]=new Hb(a",
    ",b,c,d,e,f,h,l)}M(\"boolean\",2,!1,!1,function(a,b){return yb(b,a)},1);",
    "M(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(I(b,a))},1);M(\"co",
    "ncat\",3,!1,!1,function(a,b){return sa(xa(arguments,1),function(b,d){re",
    "turn b+K(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b=",
    "K(b,a);a=K(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,function",
    "(a,b){return b.evaluate(a).A()},1,1,!0);\nM(\"false\",2,!1,!1,function(",
    "){return!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(I(b,",
    "a))},1);M(\"id\",4,!1,!1,function(a,b){var c=a.v,d=9==c.nodeType?c:c.ow",
    "nerDocument;a=K(b,a).split(/\\s+/);var e=[];r(a,function(a){a=d.getElem",
    "entById(a);!a||0<=ra(e,a)||e.push(a)});e.sort(Ya);var f=new E;r(e,funct",
    "ion(a){f.add(a)});return f},1);M(\"lang\",2,!1,!1,function(){return!1},",
    "1);M(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Error(\"",
    "Function last expects ()\");return a.u},0);\nM(\"local-name\",3,!1,!0,f",
    "unction(a,b){return(a=b?tb(b.evaluate(a)):a.v)?a.localName||a.nodeName.",
    "toLowerCase():\"\"},0,1,!0);M(\"name\",3,!1,!0,function(a,b){return(a=b",
    "?tb(b.evaluate(a)):a.v)?a.nodeName.toLowerCase():\"\"},0,1,!0);M(\"name",
    "space-uri\",3,!0,!1,function(){return\"\"},0,1,!0);M(\"normalize-space",
    "\",3,!1,!0,function(a,b){return(b?K(b,a):D(a.v)).replace(/[\\s\\xa0]+/g",
    ",\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);M(\"not\",2,!1,!1,function(a",
    ",b){return!yb(b,a)},1);\nM(\"number\",1,!1,!0,function(a,b){return b?I(",
    "b,a):+D(a.v)},0,1);M(\"position\",1,!0,!1,function(a){return a.Ia},0);M",
    "(\"round\",1,!1,!1,function(a,b){return Math.round(I(b,a))},1);M(\"star",
    "ts-with\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return 0==b.lastInd",
    "exOf(a,0)},2);M(\"string\",3,!1,!0,function(a,b){return b?K(b,a):D(a.v)",
    "},0,1);M(\"string-length\",1,!1,!0,function(a,b){return(b?K(b,a):D(a.v)",
    ").length},0,1);\nM(\"substring\",3,!1,!1,function(a,b,c,d){c=I(c,a);if(",
    "isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?I(d,a):Infinity;if(i",
    "sNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0)",
    ";a=K(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(",
    "d))},2,3);M(\"substring-after\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,",
    "a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nM(\"su",
    "bstring-before\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);a=b.indexOf(",
    "a);return-1==a?\"\":b.substring(0,a)},2);M(\"sum\",1,!1,!1,function(a,b",
    "){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+D(",
    "c);return b},1,1,!0);M(\"translate\",3,!1,!1,function(a,b,c,d){b=K(b,a)",
    ";c=K(c,a);var e=K(d,a);a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f",
    " in a||(a[f]=e.charAt(d))}c=\"\";for(d=0;d<b.length;d++)f=b.charAt(d),c",
    "+=f in a?a[f]:f;return c},3);M(\"true\",2,!1,!1,function(){return!0},0)",
    ";function F(a,b){this.Aa=a;this.ua=k(b)?b:null;this.B=null;switch(a){ca",
    "se \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"proce",
    "ssing-instruction\":this.B=7;break;case \"node\":break;default:throw Er",
    "ror(\"Unexpected argument\");}}function Jb(a){return\"comment\"==a||\"t",
    "ext\"==a||\"processing-instruction\"==a||\"node\"==a}F.prototype.matche",
    "s=function(a){return null===this.B||this.B==a.nodeType};F.prototype.get",
    "Name=function(){return this.Aa};\nF.prototype.toString=function(){var a",
    "=\"Kind Test: \"+this.Aa;null===this.ua||(a+=H(this.ua));return a};func",
    "tion Kb(a){G.call(this,3);this.za=a.substring(1,a.length-1)}p(Kb,G);Kb.",
    "prototype.evaluate=function(){return this.za};Kb.prototype.toString=fun",
    "ction(){return\"Literal: \"+this.za};function Lb(a,b){this.s=a.toLowerC",
    "ase();a=\"*\"==this.s?\"*\":\"http://www.w3.org/1999/xhtml\";this.aa=b?",
    "b.toLowerCase():a}Lb.prototype.matches=function(a){var b=a.nodeType;if(",
    "1!=b&&2!=b)return!1;b=k(a.localName)?a.localName:a.nodeName;return\"*\"",
    "!=this.s&&this.s!=b.toLowerCase()?!1:\"*\"==this.aa?!0:this.aa==(a.name",
    "spaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")",
    "};Lb.prototype.getName=function(){return this.s};\nLb.prototype.toStrin",
    "g=function(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==t",
    "his.aa?\"\":this.aa+\":\")+this.s};function Mb(a){G.call(this,1);this.B",
    "a=a}p(Mb,G);Mb.prototype.evaluate=function(){return this.Ba};Mb.prototy",
    "pe.toString=function(){return\"Number: \"+this.Ba};function Nb(a,b){G.c",
    "all(this,a.l);this.ra=a;this.V=b;this.F=a.i();this.o=a.o;1==this.V.leng",
    "th&&(a=this.V[0],a.fa||a.H!=Ob||(a=a.da,\"*\"!=a.getName()&&(this.U={na",
    "me:a.getName(),P:null})))}p(Nb,G);function Pb(){G.call(this,4)}p(Pb,G);",
    "Pb.prototype.evaluate=function(a){var b=new E;a=a.v;9==a.nodeType?b.add",
    "(a):b.add(a.ownerDocument);return b};Pb.prototype.toString=function(){r",
    "eturn\"Root Helper Expression\"};function Qb(){G.call(this,4)}p(Qb,G);Q",
    "b.prototype.evaluate=function(a){var b=new E;b.add(a.v);return b};\nQb.",
    "prototype.toString=function(){return\"Context Helper Expression\"};func",
    "tion Rb(a){return\"/\"==a||\"//\"==a}\nNb.prototype.evaluate=function(a",
    "){var b=this.ra.evaluate(a);if(!(b instanceof E))throw Error(\"Filter e",
    "xpression must evaluate to nodeset.\");a=this.V;for(var c=0,d=a.length;",
    "c<d&&b.A();c++){var e=a[c],f=b.iterator(e.H.O);if(e.i()||e.H!=Sb)if(e.i",
    "()||e.H!=Tb){var h=f.next();for(b=e.evaluate(new ib(h));null!=(h=f.next",
    "());)h=e.evaluate(new ib(h)),b=sb(b,h)}else h=f.next(),b=e.evaluate(new",
    " ib(h));else{for(h=f.next();(b=f.next())&&(!h.contains||h.contains(b))&",
    "&b.compareDocumentPosition(h)&8;h=b);b=e.evaluate(new ib(h))}}return b}",
    ";\nNb.prototype.toString=function(){var a=\"Path Expression:\"+H(this.r",
    "a);if(this.V.length){var b=sa(this.V,function(a,b){return a+H(b)},\"Ste",
    "ps:\");a+=H(b)}return a};function Ub(a,b){this.f=a;this.O=!!b}function ",
    "Fb(a,b,c){for(c=c||0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterator(),f",
    "=b.A(),h,l=0;h=e.next();l++){var u=a.O?f-l:l+1;h=d.evaluate(new ib(h,u,",
    "f));if(\"number\"==typeof h)u=u==h;else if(\"string\"==typeof h||\"bool",
    "ean\"==typeof h)u=!!h;else if(h instanceof E)u=0<h.A();else throw Error",
    "(\"Predicate.evaluate returned an unexpected type.\");u||e.remove()}ret",
    "urn b}Ub.prototype.J=function(){return 0<this.f.length?this.f[0].J():nu",
    "ll};\nUb.prototype.i=function(){for(var a=0;a<this.f.length;a++){var b=",
    "this.f[a];if(b.i()||1==b.l||0==b.l)return!0}return!1};Ub.prototype.A=fu",
    "nction(){return this.f.length};Ub.prototype.toString=function(){return ",
    "sa(this.f,function(a,b){return a+H(b)},\"Predicates:\")};function N(a,b",
    ",c,d){G.call(this,4);this.H=a;this.da=b;this.f=c||new Ub([]);this.fa=!!",
    "d;b=this.f.J();a.Ka&&b&&(this.U={name:b.name,P:b.P});this.F=this.f.i()}",
    "p(N,G);\nN.prototype.evaluate=function(a){var b=a.v,c=this.J(),d=null,e",
    "=null,f=0;c&&(d=c.name,e=c.P?K(c.P,a):null,f=1);if(this.fa)if(this.i()|",
    "|this.H!=Vb)if(b=(new N(Wb,new F(\"node\"))).evaluate(a).iterator(),c=b",
    ".next())for(a=this.w(c,d,e,f);null!=(c=b.next());)a=sb(a,this.w(c,d,e,f",
    "));else a=new E;else a=ob(this.da,b,d,e),a=Fb(this.f,a,f);else a=this.w",
    "(a.v,d,e,f);return a};N.prototype.w=function(a,b,c,d){a=this.H.X(this.d",
    "a,a,b,c);return a=Fb(this.f,a,d)};\nN.prototype.toString=function(){var",
    " a=\"Step:\"+H(\"Operator: \"+(this.fa?\"//\":\"/\"));this.H.s&&(a+=H(",
    "\"Axis: \"+this.H));a+=H(this.da);if(this.f.A()){var b=sa(this.f.f,func",
    "tion(a,b){return a+H(b)},\"Predicates:\");a+=H(b)}return a};function Xb",
    "(a,b,c,d){this.s=a;this.X=b;this.O=c;this.Ka=d}Xb.prototype.toString=fu",
    "nction(){return this.s};var Yb={};function O(a,b,c,d){if(Yb.hasOwnPrope",
    "rty(a))throw Error(\"Axis already created: \"+a);b=new Xb(a,b,c,!!d);re",
    "turn Yb[a]=b}\nO(\"ancestor\",function(a,b){for(var c=new E;b=b.parentN",
    "ode;)a.matches(b)&&c.unshift(b);return c},!0);O(\"ancestor-or-self\",fu",
    "nction(a,b){var c=new E;do a.matches(b)&&c.unshift(b);while(b=b.parentN",
    "ode);return c},!0);\nvar Ob=O(\"attribute\",function(a,b){var c=new E,d",
    "=a.getName();if(b=b.attributes)if(a instanceof F&&null===a.B||\"*\"==d)",
    "for(a=0;d=b[a];a++)c.add(d);else(d=b.getNamedItem(d))&&c.add(d);return ",
    "c},!1),Vb=O(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e",
    "=e||new E;for(b=b.firstChild;b;b=b.nextSibling)nb(b,c,d)&&a.matches(b)&",
    "&e.add(b);return e},!1,!0);O(\"descendant\",ob,!1,!0);\nvar Wb=O(\"desc",
    "endant-or-self\",function(a,b,c,d){var e=new E;nb(b,c,d)&&a.matches(b)&",
    "&e.add(b);return ob(a,b,c,d,e)},!1,!0),Sb=O(\"following\",function(a,b,",
    "c,d){var e=new E;do for(var f=b;f=f.nextSibling;)nb(f,c,d)&&a.matches(f",
    ")&&e.add(f),e=ob(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);O(\"",
    "following-sibling\",function(a,b){for(var c=new E;b=b.nextSibling;)a.ma",
    "tches(b)&&c.add(b);return c},!1);O(\"namespace\",function(){return new ",
    "E},!1);\nvar Zb=O(\"parent\",function(a,b){var c=new E;if(9==b.nodeType",
    ")return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNod",
    "e;a.matches(b)&&c.add(b);return c},!1),Tb=O(\"preceding\",function(a,b,",
    "c,d){var e=new E,f=[];do f.unshift(b);while(b=b.parentNode);for(var h=1",
    ",l=f.length;h<l;h++){var u=[];for(b=f[h];b=b.previousSibling;)u.unshift",
    "(b);for(var y=0,q=u.length;y<q;y++)b=u[y],nb(b,c,d)&&a.matches(b)&&e.ad",
    "d(b),e=ob(a,b,c,d,e)}return e},!0,!0);\nO(\"preceding-sibling\",functio",
    "n(a,b){for(var c=new E;b=b.previousSibling;)a.matches(b)&&c.unshift(b);",
    "return c},!0);var $b=O(\"self\",function(a,b){var c=new E;a.matches(b)&",
    "&c.add(b);return c},!1);function ac(a){G.call(this,1);this.qa=a;this.F=",
    "a.i();this.o=a.o}p(ac,G);ac.prototype.evaluate=function(a){return-I(thi",
    "s.qa,a)};ac.prototype.toString=function(){return\"Unary Expression: -\"",
    "+H(this.qa)};function bc(a){G.call(this,4);this.ba=a;wb(this,ta(this.ba",
    ",function(a){return a.i()}));xb(this,ta(this.ba,function(a){return a.o}",
    "))}p(bc,G);bc.prototype.evaluate=function(a){var b=new E;r(this.ba,func",
    "tion(c){c=c.evaluate(a);if(!(c instanceof E))throw Error(\"Path express",
    "ion must evaluate to NodeSet.\");b=sb(b,c)});return b};bc.prototype.toS",
    "tring=function(){return sa(this.ba,function(a,b){return a+H(b)},\"Union",
    " Expression:\")};function cc(a,b){this.a=a;this.Ga=b}function dc(a){for",
    "(var b,c=[];;){P(a,\"Missing right hand side of binary expression.\");b",
    "=ec(a);var d=a.a.next();if(!d)break;var e=(d=Db[d]||null)&&d.wa;if(!e){",
    "a.a.back();break}for(;c.length&&e<=c[c.length-1].wa;)b=new zb(c.pop(),c",
    ".pop(),b);c.push(b,d)}for(;c.length;)b=new zb(c.pop(),c.pop(),b);return",
    " b}function P(a,b){if(a.a.empty())throw Error(b);}function fc(a,b){a=a.",
    "a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);",
    "}\nfunction gc(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+",
    "a);}function hc(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed li",
    "teral string\");return new Kb(a)}\nfunction ic(a){var b=[];if(Rb(C(a.a)",
    ")){var c=a.a.next();var d=C(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&",
    "\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new Pb",
    ";d=new Pb;P(a,\"Missing next location step.\");c=jc(a,c);b.push(c)}else",
    "{a:{c=C(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable ",
    "reference not allowed in HTML XPath\");case \"(\":a.a.next();c=dc(a);P(",
    "a,'unclosed \"(\"');fc(a,\")\");break;case '\"':case \"'\":c=hc(a);brea",
    "k;default:if(isNaN(+c))if(!Jb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==C(a.",
    "a,\n1)){c=a.a.next();c=Ib[c]||null;a.a.next();for(d=[];\")\"!=C(a.a);){",
    "P(a,\"Missing function argument list.\");d.push(dc(a));if(\",\"!=C(a.a)",
    ")break;a.a.next()}P(a,\"Unclosed function argument list.\");gc(a);c=new",
    " Gb(c,d)}else{c=null;break a}else c=new Mb(+a.a.next())}\"[\"==C(a.a)&&",
    "(d=new Ub(kc(a)),c=new Eb(c,d))}if(c)if(Rb(C(a.a)))d=c;else return c;el",
    "se c=jc(a,\"/\"),d=new Qb,b.push(c)}for(;Rb(C(a.a));)c=a.a.next(),P(a,",
    "\"Missing next location step.\"),c=jc(a,c),b.push(c);return new Nb(d,b)",
    "}\nfunction jc(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should ",
    "be \"/\" or \"//\"');if(\".\"==C(a.a)){var c=new N($b,new F(\"node\"));",
    "a.a.next();return c}if(\"..\"==C(a.a))return c=new N(Zb,new F(\"node\")",
    "),a.a.next(),c;if(\"@\"==C(a.a)){var d=Ob;a.a.next();P(a,\"Missing attr",
    "ibute name\")}else if(\"::\"==C(a.a,1)){if(!/(?![0-9])[\\w]/.test(C(a.a",
    ").charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d",
    "=Yb[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();P(",
    "a,\"Missing node name\")}else d=Vb;e=\nC(a.a);if(/(?![0-9])[\\w\\*]/.te",
    "st(e.charAt(0)))if(\"(\"==C(a.a,1)){if(!Jb(e))throw Error(\"Invalid nod",
    "e type: \"+e);e=a.a.next();if(!Jb(e))throw Error(\"Invalid type name: ",
    "\"+e);fc(a,\"(\");P(a,\"Bad nodetype\");var f=C(a.a).charAt(0),h=null;i",
    "f('\"'==f||\"'\"==f)h=hc(a);P(a,\"Bad nodetype\");gc(a);e=new F(e,h)}el",
    "se if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new Lb(e);else{h=e.substr",
    "ing(0,f);if(\"*\"==h)var l=\"*\";else if(l=a.Ga(h),!l)throw Error(\"Nam",
    "espace prefix not declared: \"+h);e=e.substr(f+1);e=new Lb(e,l)}else th",
    "row Error(\"Bad token: \"+\na.a.next());a=new Ub(kc(a),d.O);return c||n",
    "ew N(d,e,a,\"//\"==b)}function kc(a){for(var b=[];\"[\"==C(a.a);){a.a.n",
    "ext();P(a,\"Missing predicate expression.\");var c=dc(a);b.push(c);P(a,",
    "\"Unclosed predicate expression.\");fc(a,\"]\")}return b}function ec(a)",
    "{if(\"-\"==C(a.a))return a.a.next(),new ac(ec(a));var b=ic(a);if(\"|\"!",
    "=C(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)P(a,\"Missing next union ",
    "location path.\"),b.push(ic(a));a.a.back();a=new bc(b)}return a};functi",
    "on lc(a){switch(a.nodeType){case 1:return ka(mc,a);case 9:return lc(a.d",
    "ocumentElement);case 11:case 10:case 6:case 12:return nc;default:return",
    " a.parentNode?lc(a.parentNode):nc}}function nc(){return null}function m",
    "c(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/x",
    "html\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.v",
    "alue||null:a.parentNode&&9!=a.parentNode.nodeType?mc(a.parentNode,b):nu",
    "ll};function oc(a,b){if(!a.length)throw Error(\"Empty XPath expression.",
    "\");a=kb(a);if(a.empty())throw Error(\"Invalid XPath expression.\");b?e",
    "a(b)||(b=ja(b.lookupNamespaceURI,b)):b=function(){return null};var c=dc",
    "(new cc(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.next());this.",
    "evaluate=function(a,b){a=c.evaluate(new ib(a));return new Q(a,b)}}\nfun",
    "ction Q(a,b){if(0==b)if(a instanceof E)b=4;else if(\"string\"==typeof a",
    ")b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3",
    ";else throw Error(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=",
    "b&&!(a instanceof E))throw Error(\"value could not be converted to the ",
    "specified type\");this.resultType=b;switch(b){case 2:this.stringValue=a",
    " instanceof E?ub(a):\"\"+a;break;case 1:this.numberValue=a instanceof E",
    "?+ub(a):+a;break;case 3:this.booleanValue=a instanceof E?0<a.A():!!a;br",
    "eak;case 4:case 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e",
    "=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.A();this.invalid",
    "IteratorState=!1;break;case 8:case 9:this.singleNodeValue=tb(a);break;d",
    "efault:throw Error(\"Unknown XPathResult type.\");}var f=0;this.iterate",
    "Next=function(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wro",
    "ng result type\");return f>=d.length?null:d[f++]};this.snapshotItem=fun",
    "ction(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong res",
    "ult type\");return a>=d.length||0>a?null:d[a]}}\nQ.ANY_TYPE=0;Q.NUMBER_",
    "TYPE=1;Q.STRING_TYPE=2;Q.BOOLEAN_TYPE=3;Q.UNORDERED_NODE_ITERATOR_TYPE=",
    "4;Q.ORDERED_NODE_ITERATOR_TYPE=5;Q.UNORDERED_NODE_SNAPSHOT_TYPE=6;Q.ORD",
    "ERED_NODE_SNAPSHOT_TYPE=7;Q.ANY_UNORDERED_NODE_TYPE=8;Q.FIRST_ORDERED_N",
    "ODE_TYPE=9;function pc(a){this.lookupNamespaceURI=lc(a)}\nba(\"wgxpath.",
    "install\",function(a,b){a=a||aa;var c=a.Document&&a.Document.prototype|",
    "|a.document;if(!c.evaluate||b)a.XPathResult=Q,c.evaluate=function(a,b,c",
    ",h){return(new oc(a,c)).evaluate(b,h)},c.createExpression=function(a,b)",
    "{return new oc(a,b)},c.createNSResolver=function(a){return new pc(a)}})",
    ";var R={};R.ka=function(){var a={Oa:\"http://www.w3.org/2000/svg\"};ret",
    "urn function(b){return a[b]||null}}();\nR.w=function(a,b,c){var d=A(a);",
    "if(!d.documentElement)return null;try{for(var e=d.createNSResolver?d.cr",
    "eateNSResolver(d.documentElement):R.ka,f={},h=d.getElementsByTagName(\"",
    "*\"),l=0;l<h.length;++l){var u=h[l],y=u.namespaceURI;if(y&&!f[y]){var q",
    "=u.lookupPrefix(y);if(!q){var v=y.match(\".*/(\\\\w+)/?$\");q=v?v[1]:\"",
    "xhtml\"}f[y]=q}}var J={},U;for(U in f)J[f[U]]=U;e=function(a){return J[",
    "a]||null};try{return d.evaluate(b,a,e,c,null)}catch(na){if(\"TypeError",
    "\"===na.name)return e=d.createNSResolver?d.createNSResolver(d.documentE",
    "lement):\nR.ka,d.evaluate(b,a,e,c,null);throw na;}}catch(na){throw new ",
    "t(32,\"Unable to locate an element with the xpath expression \"+b+\" be",
    "cause of the following error:\\n\"+na);}};R.na=function(a,b){if(!a||1!=",
    "a.nodeType)throw new t(32,'The result of the xpath expression \"'+b+'\"",
    " is: '+a+\". It should be an element.\");};\nR.Ja=function(a,b){var c=f",
    "unction(){var c=R.w(b,a,9);return c?c.singleNodeValue||null:b.selectSin",
    "gleNode?(c=A(b),c.setProperty&&c.setProperty(\"SelectionLanguage\",\"XP",
    "ath\"),b.selectSingleNode(a)):null}();null===c||R.na(c,a);return c};\nR",
    ".Ma=function(a,b){var c=function(){var c=R.w(b,a,7);if(c){for(var e=c.s",
    "napshotLength,f=[],h=0;h<e;++h)f.push(c.snapshotItem(h));return f}retur",
    "n b.selectNodes?(c=A(b),c.setProperty&&c.setProperty(\"SelectionLanguag",
    "e\",\"XPath\"),b.selectNodes(a)):[]}();r(c,function(b){R.na(b,a)});retu",
    "rn c};function qc(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.l",
    "eft=d}g=qc.prototype;g.clone=function(){return new qc(this.top,this.rig",
    "ht,this.bottom,this.left)};g.toString=function(){return\"(\"+this.top+",
    "\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"};g.cont",
    "ains=function(a){return this&&a?a instanceof qc?a.left>=this.left&&a.ri",
    "ght<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&",
    "&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\ng.expand=functi",
    "on(a,b,c,d){fa(a)?(this.top-=a.top,this.right+=a.right,this.bottom+=a.b",
    "ottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),this.bottom",
    "+=Number(c),this.left-=Number(d));return this};g.ceil=function(){this.t",
    "op=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Mat",
    "h.ceil(this.bottom);this.left=Math.ceil(this.left);return this};\ng.flo",
    "or=function(){this.top=Math.floor(this.top);this.right=Math.floor(this.",
    "right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.le",
    "ft);return this};g.round=function(){this.top=Math.round(this.top);this.",
    "right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.l",
    "eft=Math.round(this.left);return this};g.translate=function(a,b){a inst",
    "anceof z?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y",
    "):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b));retur",
    "n this};\ng.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;t",
    "his.top*=b;this.bottom*=b;return this};function S(a,b,c,d){this.left=a;",
    "this.top=b;this.width=c;this.height=d}g=S.prototype;g.clone=function(){",
    "return new S(this.left,this.top,this.width,this.height)};g.toString=fun",
    "ction(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.width+\"w x ",
    "\"+this.height+\"h)\"};g.contains=function(a){return a instanceof z?a.x",
    ">=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+th",
    "is.height:this.left<=a.left&&this.left+this.width>=a.left+a.width&&this",
    ".top<=a.top&&this.top+this.height>=a.top+a.height};\ng.ceil=function(){",
    "this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);this.width=",
    "Math.ceil(this.width);this.height=Math.ceil(this.height);return this};g",
    ".floor=function(){this.left=Math.floor(this.left);this.top=Math.floor(t",
    "his.top);this.width=Math.floor(this.width);this.height=Math.floor(this.",
    "height);return this};g.round=function(){this.left=Math.round(this.left)",
    ";this.top=Math.round(this.top);this.width=Math.round(this.width);this.h",
    "eight=Math.round(this.height);return this};\ng.translate=function(a,b){",
    "a instanceof z?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(this",
    ".top+=b));return this};g.scale=function(a,b){b=n(b)?b:a;this.left*=a;th",
    "is.width*=a;this.top*=b;this.height*=b;return this};function rc(a,b){va",
    "r c=A(a);return c.defaultView&&c.defaultView.getComputedStyle&&(a=c.def",
    "aultView.getComputedStyle(a,null))?a[b]||a.getPropertyValue(b)||\"\":\"",
    "\"}function sc(a){var b=a.offsetWidth,c=a.offsetHeight;if((!k(b)||!b&&!",
    "c)&&a.getBoundingClientRect){a:{try{var d=a.getBoundingClientRect()}cat",
    "ch(e){a={left:0,top:0,right:0,bottom:0};break a}a=d}return new Sa(a.rig",
    "ht-a.left,a.bottom-a.top)}return new Sa(b,c)};var tc=\"function\"===typ",
    "eof ShadowRoot;function uc(a){return vc(a)&&wc(a)&&\"none\"!=T(a,\"poin",
    "ter-events\")}var xc=\"A AREA BUTTON INPUT LABEL SELECT TEXTAREA\".spli",
    "t(\" \");\nfunction yc(a){return ta(xc,function(b){return B(a,b)})||nul",
    "l!=db(a)&&0<=Number(a.tabIndex)||((B(a,\"TEXTAREA\")?!0:B(a,\"INPUT\")?",
    "0<=ra(zc,a.type.toLowerCase()):Ac(a)?!0:!1)||(B(a,\"INPUT\")?\"file\"==",
    "a.type.toLowerCase():!1)||Bc(a,\"range\")||Bc(a,\"date\")||Bc(a,\"month",
    "\")||Bc(a,\"week\")||Bc(a,\"time\")||Bc(a,\"datetime-local\")||Bc(a,\"c",
    "olor\"))&&!a.readOnly}var Cc=\"BUTTON INPUT OPTGROUP OPTION SELECT TEXT",
    "AREA\".split(\" \");\nfunction wc(a){return ta(Cc,function(b){return B(",
    "a,b)})?a.disabled?!1:a.parentNode&&1==a.parentNode.nodeType&&B(a,\"OPTG",
    "ROUP\")||B(a,\"OPTION\")?wc(a.parentNode):!ab(a,function(a){var b=a.par",
    "entNode;if(b&&B(b,\"FIELDSET\")&&b.disabled){if(!B(a,\"LEGEND\"))return",
    "!0;for(;a=k(a.previousElementSibling)?a.previousElementSibling:Wa(a.pre",
    "viousSibling);)if(B(a,\"LEGEND\"))return!0}return!1},!0):!0}var zc=\"te",
    "xt search tel url email password number\".split(\" \");\nfunction Bc(a,",
    "b){return B(a,\"INPUT\")?a.type.toLowerCase()==b:!1}function Ac(a){func",
    "tion b(a){return\"inherit\"==a.contentEditable?(a=Dc(a))?b(a):!1:\"true",
    "\"==a.contentEditable}return k(a.contentEditable)?k(a.isContentEditable",
    ")?a.isContentEditable:b(a):!1}function Dc(a){for(a=a.parentNode;a&&1!=a",
    ".nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return B(a)?a:",
    "null}\nfunction T(a,b){b=qa(b);if(\"float\"==b||\"cssFloat\"==b||\"styl",
    "eFloat\"==b)b=\"cssFloat\";a=rc(a,b)||Ec(a,b);if(null===a)a=null;else i",
    "f(0<=ra(za,b)){b:{var c=a.match(Ca);if(c){b=Number(c[1]);var d=Number(c",
    "[2]),e=Number(c[3]);c=Number(c[4]);if(0<=b&&255>=b&&0<=d&&255>=d&&0<=e&",
    "&255>=e&&0<=c&&1>=c){b=[b,d,e,c];break b}}b=null}if(!b)b:{if(e=a.match(",
    "Da))if(b=Number(e[1]),d=Number(e[2]),e=Number(e[3]),0<=b&&255>=b&&0<=d&",
    "&255>=d&&0<=e&&255>=e){b=[b,d,e,1];break b}b=null}if(!b)b:{b=a.toLowerC",
    "ase();d=ya[b.toLowerCase()];\nif(!d&&(d=\"#\"==b.charAt(0)?b:\"#\"+b,4=",
    "=d.length&&(d=d.replace(Aa,\"#$1$1$2$2$3$3\")),!Ba.test(d))){b=null;bre",
    "ak b}b=[parseInt(d.substr(1,2),16),parseInt(d.substr(3,2),16),parseInt(",
    "d.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a}func",
    "tion Ec(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&ea(c.getProper",
    "tyValue)&&(d=c.getPropertyValue(b));return\"inherit\"!=d?k(d)?d:null:(a",
    "=Dc(a))?Ec(a,b):null}\nfunction Fc(a,b,c){function d(a){var b=Gc(a);ret",
    "urn 0<b.height&&0<b.width?!0:B(a,\"PATH\")&&(0<b.height||0<b.width)?(a=",
    "T(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"hidden\"!=T(a,\"overflow",
    "\")&&ta(a.childNodes,function(a){return 3==a.nodeType||B(a)&&d(a)})}fun",
    "ction e(a){return Hc(a)==V&&ua(a.childNodes,function(a){return!B(a)||e(",
    "a)||!d(a)})}if(!B(a))throw Error(\"Argument to isShown must be of type ",
    "Element\");if(B(a,\"BODY\"))return!0;var f=Dc(a);if(f&&B(f,\"DETAILS\")",
    "&&!f.open&&!B(a,\"SUMMARY\"))return!1;if(B(a,\n\"OPTION\")||B(a,\"OPTGR",
    "OUP\"))return a=ab(a,function(a){return B(a,\"SELECT\")}),!!a&&Fc(a,!0,",
    "c);if(f=Ic(a))return!!f.sa&&0<f.rect.width&&0<f.rect.height&&Fc(f.sa,b,",
    "c);if(B(a,\"INPUT\")&&\"hidden\"==a.type.toLowerCase()||B(a,\"NOSCRIPT",
    "\"))return!1;f=T(a,\"visibility\");return\"collapse\"!=f&&\"hidden\"!=f",
    "&&c(a)&&(b||0!=Jc(a))&&d(a)?!e(a):!1}\nfunction vc(a){function b(a){if(",
    "B(a)&&\"none\"==T(a,\"display\"))return!1;a:{var c=a.parentNode;if(a.ge",
    "tDestinationInsertionPoints){var e=a.getDestinationInsertionPoints();if",
    "(0<e.length){a=e[e.length-1];break a}}a=c&&c.shadowRoot&&void 0!==a.ass",
    "ignedSlot?a.assignedSlot?a.assignedSlot.parentNode:null:c}return tc&&a ",
    "instanceof ShadowRoot||a&&(9==a.nodeType||11==a.nodeType)?!0:!!a&&b(a)}",
    "return Fc(a,!0,b)}var V=\"hidden\";\nfunction Hc(a,b){function c(a){fun",
    "ction b(a){if(a==h)return!0;var b=T(a,\"display\");return 0==b.lastInde",
    "xOf(\"inline\",0)||\"contents\"==b||\"absolute\"==c&&\"static\"==T(a,\"",
    "position\")?!1:!0}var c=T(a,\"position\");if(\"fixed\"==c)return y=!0,a",
    "==h?null:h;for(a=Dc(a);a&&!b(a);)a=Dc(a);return a}function d(a){var b=a",
    ";if(\"visible\"==u)if(a==h&&l)b=l;else if(a==l)return{x:\"visible\",y:",
    "\"visible\"};b={x:T(b,\"overflow-x\"),y:T(b,\"overflow-y\")};a==h&&(b.x",
    "=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y);retur",
    "n b}function e(a){if(a==\nh){var b=(new cb(f)).R;a=b.scrollingElement?b",
    ".scrollingElement:b.body||b.documentElement;b=b.parentWindow||b.default",
    "View;a=new z(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)}el",
    "se a=new z(a.scrollLeft,a.scrollTop);return a}b=Kc(a,b);var f=A(a),h=f.",
    "documentElement,l=f.body,u=T(h,\"overflow\"),y;for(a=c(a);a;a=c(a)){var",
    " q=d(a);if(\"visible\"!=q.x||\"visible\"!=q.y){var v=Gc(a);if(0==v.widt",
    "h||0==v.height)return V;var J=b.right<v.left,U=b.bottom<v.top;if(J&&\"h",
    "idden\"==q.x||U&&\"hidden\"==q.y)return V;\nif(J&&\"visible\"!=q.x||U&&",
    "\"visible\"!=q.y){J=e(a);U=b.bottom<v.top-J.y;if(b.right<v.left-J.x&&\"",
    "visible\"!=q.x||U&&\"visible\"!=q.x)return V;b=Hc(a);return b==V?V:\"sc",
    "roll\"}J=b.left>=v.left+v.width;v=b.top>=v.top+v.height;if(J&&\"hidden",
    "\"==q.x||v&&\"hidden\"==q.y)return V;if(J&&\"visible\"!=q.x||v&&\"visib",
    "le\"!=q.y){if(y&&(q=e(a),b.left>=h.scrollWidth-q.x||b.right>=h.scrollHe",
    "ight-q.y))return V;b=Hc(a);return b==V?V:\"scroll\"}}}return\"none\"}\n",
    "function Gc(a){var b=Ic(a);if(b)return b.rect;if(B(a,\"HTML\"))return a",
    "=(Ta(A(a))||window).document,a=\"CSS1Compat\"==a.compatMode?a.documentE",
    "lement:a.body,a=new Sa(a.clientWidth,a.clientHeight),new S(0,0,a.width,",
    "a.height);try{var c=a.getBoundingClientRect()}catch(d){return new S(0,0",
    ",0,0)}return new S(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfuncti",
    "on Ic(a){var b=B(a,\"MAP\");if(!b&&!B(a,\"AREA\"))return null;var c=b?a",
    ":B(a.parentNode,\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=",
    "R.Ja('/descendant::*[@usemap = \"#'+c.name+'\"]',A(c)))&&(e=Gc(d),b||\"",
    "default\"==a.shape.toLowerCase()||(a=Lc(a),b=Math.min(Math.max(a.left,0",
    "),e.width),c=Math.min(Math.max(a.top,0),e.height),e=new S(b+e.left,c+e.",
    "top,Math.min(a.width,e.width-b),Math.min(a.height,e.height-c))));return",
    "{sa:d,rect:e||new S(0,0,0,0)}}\nfunction Lc(a){var b=a.shape.toLowerCas",
    "e();a=a.coords.split(\",\");if(\"rect\"==b&&4==a.length){b=a[0];var c=a",
    "[1];return new S(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)retur",
    "n b=a[2],new S(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){b=a[0",
    "];c=a[1];for(var d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Mat",
    "h.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new S(b,",
    "c,d-b,e-c)}return new S(0,0,0,0)}\nfunction Kc(a,b){a=Gc(a);a=new qc(a.",
    "top,a.left+a.width,a.top+a.height,a.left);b&&(b=b instanceof S?b:new S(",
    "b.x,b.y,1,1),a.left=Math.min(Math.max(a.left+b.left,a.left),a.right),a.",
    "top=Math.min(Math.max(a.top+b.top,a.top),a.bottom),a.right=Math.min(Mat",
    "h.max(a.left+b.width,a.left),a.right),a.bottom=Math.min(Math.max(a.top+",
    "b.height,a.top),a.bottom));return a}function Jc(a){var b=1,c=T(a,\"opac",
    "ity\");c&&(b=Number(c));(a=Dc(a))&&(b*=Jc(a));return b};Oa();Oa();funct",
    "ion Mc(a,b,c){this.B=a;this.la=b;this.ma=c}Mc.prototype.create=function",
    "(a){a=A(a).createEvent(\"HTMLEvents\");a.initEvent(this.B,this.la,this.",
    "ma);return a};Mc.prototype.toString=function(){return this.B};function ",
    "W(a,b,c){Mc.call(this,a,b,c)}p(W,Mc);\nW.prototype.create=function(a,b)",
    "{if(this==Nc)throw new t(9,\"Browser does not support a mouse pixel scr",
    "oll event.\");var c=A(a);a=Ta(c);c=c.createEvent(\"MouseEvents\");this=",
    "=Oc&&(c.wheelDelta=b.wheelDelta);c.initMouseEvent(this.B,this.la,this.m",
    "a,a,1,b.clientX,b.clientY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shif",
    "tKey,b.metaKey,b.button,b.relatedTarget);return c};function X(a,b,c){Mc",
    ".call(this,a,b,c)}p(X,Mc);X.prototype.create=function(){throw new t(9,",
    "\"Browser does not support MSPointer events.\");};\nvar Pc=new Mc(\"cha",
    "nge\",!0,!1),Qc=new W(\"click\",!0,!0),Rc=new W(\"contextmenu\",!0,!0),",
    "Sc=new W(\"dblclick\",!0,!0),Tc=new W(\"mousedown\",!0,!0),Uc=new W(\"m",
    "ousemove\",!0,!1),Vc=new W(\"mouseout\",!0,!0),Wc=new W(\"mouseover\",!",
    "0,!0),Xc=new W(\"mouseup\",!0,!0),Oc=new W(\"mousewheel\",!0,!0),Nc=new",
    " W(\"MozMousePixelScroll\",!0,!0),Yc=new X(\"MSGotPointerCapture\",!0,!",
    "1),Zc=new X(\"MSLostPointerCapture\",!0,!1),$c=new X(\"MSPointerDown\",",
    "!0,!0),ad=new X(\"MSPointerMove\",!0,!0),bd=new X(\"MSPointerOver\",!0,",
    "!0),cd=new X(\"MSPointerOut\",\n!0,!0),dd=new X(\"MSPointerUp\",!0,!0);",
    "function ed(a,b,c){b=b.create(a,c);\"isTrusted\"in b||(b.isTrusted=!1);",
    "return a.dispatchEvent(b)};function fd(a,b){this.g=la.document.document",
    "Element;this.G=null;var c=bb(A(this.g));c&&gd(this,c);this.$=a||new hd;",
    "this.pa=b||new id}fd.prototype.I=function(){return this.g};function gd(",
    "a,b){a.g=b;a.G=B(b,\"OPTION\")?ab(b,function(a){return B(a,\"SELECT\")}",
    "):null}\nfd.prototype.W=function(a,b,c,d,e,f,h,l){if(!f&&!uc(this.g))re",
    "turn!1;if(d&&Wc!=a&&Vc!=a)throw new t(12,\"Event type does not allow re",
    "lated target: \"+a);b={clientX:b.x,clientY:b.y,button:c,altKey:0!=(this",
    ".$.ca&4),ctrlKey:0!=(this.$.ca&2),shiftKey:0!=(this.$.ca&1),metaKey:0!=",
    "(this.$.ca&8),wheelDelta:e||0,relatedTarget:d||null,count:l||1};h=h||1;",
    "c=this.g;a!=Qc&&a!=Tc&&h in jd?c=jd[h]:this.G&&(c=kd(this,a));return c?",
    "this.pa.W(c,a,b):!0};\nfd.prototype.S=function(a,b,c,d,e,f,h,l){if(!l&&",
    "!uc(this.g))return!1;if(h&&bd!=a&&cd!=a)throw new t(12,\"Event type doe",
    "s not allow related target: \"+a);b={clientX:b.x,clientY:b.y,button:c,a",
    "ltKey:!1,ctrlKey:!1,shiftKey:!1,metaKey:!1,relatedTarget:h||null,width:",
    "0,height:0,pressure:0,rotation:0,pointerId:d,tiltX:0,tiltY:0,pointerTyp",
    "e:e,isPrimary:f};c=this.G?kd(this,a):this.g;jd[d]&&(c=jd[d]);d=Ta(A(thi",
    "s.g));if(d&&a==$c){var u=d.Element.prototype.msSetPointerCapture;d.Elem",
    "ent.prototype.msSetPointerCapture=\nfunction(a){jd[a]=this}}a=c?this.pa",
    ".S(c,a,b):!0;u&&(d.Element.prototype.msSetPointerCapture=u);return a};f",
    "unction kd(a,b){switch(b){case Qc:case Xc:return a.G.multiple?a.g:a.G;d",
    "efault:return a.G.multiple?a.g:null}}function ld(a){var b=ab(a.g,functi",
    "on(a){return!!a&&B(a)&&yc(a)},!0);b=b||a.g;a=bb(A(b));if(b!=a){if(a&&ea",
    "(a.blur)&&!B(a,\"BODY\"))try{a.blur()}catch(c){throw c;}ea(b.focus)&&b.",
    "focus()}}function hd(){this.ca=0}var jd={};function id(){}id.prototype.",
    "W=function(a,b,c){return ed(a,b,c)};\nid.prototype.S=function(a,b,c){re",
    "turn ed(a,b,c)};function md(a,b){this.D={};this.h=[];this.M=0;var c=arg",
    "uments.length;if(1<c){if(c%2)throw Error(\"Uneven number of arguments\"",
    ");for(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&th",
    "is.addAll(a)}function nd(a){od(a);return a.h.concat()}g=md.prototype;g.",
    "clear=function(){this.D={};this.M=this.h.length=0};g.remove=function(a)",
    "{return Object.prototype.hasOwnProperty.call(this.D,a)?(delete this.D[a",
    "],this.M--,this.h.length>2*this.M&&od(this),!0):!1};\nfunction od(a){if",
    "(a.M!=a.h.length){for(var b=0,c=0;b<a.h.length;){var d=a.h[b];Object.pr",
    "ototype.hasOwnProperty.call(a.D,d)&&(a.h[c++]=d);b++}a.h.length=c}if(a.",
    "M!=a.h.length){var e={};for(c=b=0;b<a.h.length;)d=a.h[b],Object.prototy",
    "pe.hasOwnProperty.call(e,d)||(a.h[c++]=d,e[d]=1),b++;a.h.length=c}}g.ge",
    "t=function(a,b){return Object.prototype.hasOwnProperty.call(this.D,a)?t",
    "his.D[a]:b};g.set=function(a,b){Object.prototype.hasOwnProperty.call(th",
    "is.D,a)||(this.M++,this.h.push(a));this.D[a]=b};\ng.addAll=function(a){",
    "if(a instanceof md){var b=nd(a);od(a);for(var c=[],d=0;d<a.h.length;d++",
    ")c.push(a.D[a.h[d]]);a=c}else{b=[];d=0;for(var e in a)b[d++]=e;d=[];e=0",
    ";for(c in a)d[e++]=a[c];a=d}for(c=0;c<b.length;c++)this.set(b[c],a[c])}",
    ";g.forEach=function(a,b){for(var c=nd(this),d=0;d<c.length;d++){var e=c",
    "[d],f=this.get(e);a.call(b,f,e,this)}};g.clone=function(){return new md",
    "(this)};var pd={};function Y(a,b,c){fa(a)&&(a=a.b);a=new qd(a);!b||b in",
    " pd&&!c||(pd[b]={key:a,shift:!1},c&&(pd[c]={key:a,shift:!0}));return a}",
    "function qd(a){this.code=a}Y(8);Y(9);Y(13);var rd=Y(16),sd=Y(17),td=Y(1",
    "8);Y(19);Y(20);Y(27);Y(32,\" \");Y(33);Y(34);Y(35);Y(36);Y(37);Y(38);Y(",
    "39);Y(40);Y(44);Y(45);Y(46);Y(48,\"0\",\")\");Y(49,\"1\",\"!\");Y(50,\"",
    "2\",\"@\");Y(51,\"3\",\"#\");Y(52,\"4\",\"$\");Y(53,\"5\",\"%\");Y(54,",
    "\"6\",\"^\");Y(55,\"7\",\"&\");Y(56,\"8\",\"*\");Y(57,\"9\",\"(\");Y(65",
    ",\"a\",\"A\");Y(66,\"b\",\"B\");Y(67,\"c\",\"C\");Y(68,\"d\",\"D\");\nY",
    "(69,\"e\",\"E\");Y(70,\"f\",\"F\");Y(71,\"g\",\"G\");Y(72,\"h\",\"H\");",
    "Y(73,\"i\",\"I\");Y(74,\"j\",\"J\");Y(75,\"k\",\"K\");Y(76,\"l\",\"L\")",
    ";Y(77,\"m\",\"M\");Y(78,\"n\",\"N\");Y(79,\"o\",\"O\");Y(80,\"p\",\"P\"",
    ");Y(81,\"q\",\"Q\");Y(82,\"r\",\"R\");Y(83,\"s\",\"S\");Y(84,\"t\",\"T",
    "\");Y(85,\"u\",\"U\");Y(86,\"v\",\"V\");Y(87,\"w\",\"W\");Y(88,\"x\",\"",
    "X\");Y(89,\"y\",\"Y\");Y(90,\"z\",\"Z\");var ud=Y(Ka?{c:91,b:91}:Ja?{c:",
    "224,b:91}:{c:0,b:91});Y(Ka?{c:92,b:92}:Ja?{c:224,b:93}:{c:0,b:92});Y(Ka",
    "?{c:93,b:93}:Ja?{c:0,b:0}:{c:93,b:null});Y({c:96,b:96},\"0\");Y({c:97,b",
    ":97},\"1\");\nY({c:98,b:98},\"2\");Y({c:99,b:99},\"3\");Y({c:100,b:100}",
    ",\"4\");Y({c:101,b:101},\"5\");Y({c:102,b:102},\"6\");Y({c:103,b:103},",
    "\"7\");Y({c:104,b:104},\"8\");Y({c:105,b:105},\"9\");Y({c:106,b:106},\"",
    "*\");Y({c:107,b:107},\"+\");Y({c:109,b:109},\"-\");Y({c:110,b:110},\".",
    "\");Y({c:111,b:111},\"/\");Y(144);Y(112);Y(113);Y(114);Y(115);Y(116);Y(",
    "117);Y(118);Y(119);Y(120);Y(121);Y(122);Y(123);Y({c:107,b:187},\"=\",\"",
    "+\");Y(108,\",\");Y({c:109,b:189},\"-\",\"_\");Y(188,\",\",\"<\");Y(190",
    ",\".\",\">\");Y(191,\"/\",\"?\");Y(192,\"`\",\"~\");Y(219,\"[\",\"{\");",
    "\nY(220,\"\\\\\",\"|\");Y(221,\"]\",\"}\");Y({c:59,b:186},\";\",\":\");",
    "Y(222,\"'\",'\"');var vd=new md;vd.set(1,rd);vd.set(2,sd);vd.set(4,td);",
    "vd.set(8,ud);(function(a){var b=new md;r(nd(a),function(c){b.set(a.get(",
    "c).code,c)});return b})(vd);function wd(a,b,c){fd.call(this,b,c);this.K",
    "=this.j=null;this.C=new z(0,0);this.Y=this.N=!1;if(a){n(a.buttonPressed",
    ")&&(this.j=a.buttonPressed);try{B(a.elementPressed)&&(this.K=a.elementP",
    "ressed)}catch(d){this.j=null}this.C=new z(a.clientXY.x,a.clientXY.y);th",
    "is.N=!!a.nextClickIsDoubleClick;this.Y=!!a.hasEverInteracted;try{a.elem",
    "ent&&B(a.element)&&gd(this,a.element)}catch(d){this.j=null}}}p(wd,fd);v",
    "ar Z={};Z[Qc]=[0,1,2,null];Z[Rc]=[null,null,2,null];Z[Xc]=[0,1,2,null];",
    "Z[Vc]=[0,1,2,4];Z[Uc]=[0,1,2,4];\nRa&&(Z[$c]=Z[Xc],Z[dd]=Z[Xc],Z[ad]=[-",
    "1,-1,-1,-1],Z[cd]=Z[ad],Z[bd]=Z[ad]);Z[Sc]=Z[Qc];Z[Tc]=Z[Xc];Z[Wc]=Z[Vc",
    "];var xd={};xd[Tc]=$c;xd[Uc]=ad;xd[Vc]=cd;xd[Wc]=bd;xd[Xc]=dd;wd.protot",
    "ype.move=function(a,b){var c=uc(a),d=Gc(a);this.C.x=b.x+d.left;this.C.y",
    "=b.y+d.top;b=this.I();if(a!=b){try{Ta(A(b)).closed&&(b=null)}catch(e){b",
    "=null}b&&(d=b===la.document.documentElement||b===la.document.body,b=!th",
    "is.Y&&d?null:b,yd(this,Vc,a));gd(this,a);yd(this,Wc,b,null,c)}yd(this,U",
    "c,null,null,c);this.N=!1};\nwd.prototype.scroll=function(a){if(0==a)thr",
    "ow new t(13,\"Must scroll a non-zero number of ticks.\");for(var b=0<a?",
    "-120:120,c=0;c<Math.abs(a);c++)yd(this,Oc,null,b)};function yd(a,b,c,d,",
    "e,f){a.Y=!0;if(Ra){var h=xd[b];if(h&&!a.S(h,a.C,zd(a,h),1,MSPointerEven",
    "t.MSPOINTER_TYPE_MOUSE,!0,c,e))return!1}return a.W(b,a.C,zd(a,b),c,d,e,",
    "null,f)}function zd(a,b){if(!(b in Z))return 0;a=Z[b][null===a.j?3:a.j]",
    ";if(null===a)throw new t(13,\"Event does not permit the specified mouse",
    " button.\");return a}\nwd.prototype.getState=function(){return{buttonPr",
    "essed:this.j,elementPressed:this.K,clientXY:{x:this.C.x,y:this.C.y},nex",
    "tClickIsDoubleClick:this.N,hasEverInteracted:this.Y,element:this.I()}};",
    "function Ad(a,b){this.x=a;this.y=b}p(Ad,z);g=Ad.prototype;g.clone=funct",
    "ion(){return new Ad(this.x,this.y)};g.scale=z.prototype.scale;g.normali",
    "ze=function(){return this.scale(1/Math.sqrt(this.x*this.x+this.y*this.y",
    "))};g.add=function(a){this.x+=a.x;this.y+=a.y;return this};g.rotate=fun",
    "ction(a){var b=Math.cos(a);a=Math.sin(a);var c=this.y*b+this.x*a;this.x",
    "=this.x*b-this.y*a;this.y=c;return this};function Bd(a){if(\"none\"!=(r",
    "c(a,\"display\")||(a.currentStyle?a.currentStyle.display:null)||a.style",
    "&&a.style.display))var b=sc(a);else{b=a.style;var c=b.display,d=b.visib",
    "ility,e=b.position;b.visibility=\"hidden\";b.position=\"absolute\";b.di",
    "splay=\"inline\";var f=sc(a);b.display=c;b.position=e;b.visibility=d;b=",
    "f}return 0<b.width&&0<b.height||!a.offsetParent?b:Bd(a.offsetParent)};b",
    "a(\"_\",function(a,b,c,d){if(!vc(a))throw new t(11,\"Element is not cur",
    "rently visible and may not be manipulated\");b:{var e=b||void 0;if(\"sc",
    "roll\"==Hc(a,e)){if(a.scrollIntoView&&(a.scrollIntoView(),\"none\"==Hc(",
    "a,e)))break b;for(var f=Kc(a,e),h=Dc(a);h;h=Dc(h)){var l=h,u=Gc(l);var ",
    "y=l;var q=rc(y,\"borderLeftWidth\");var v=rc(y,\"borderRightWidth\");va",
    "r J=rc(y,\"borderTopWidth\");y=rc(y,\"borderBottomWidth\");v=new qc(par",
    "seFloat(J),parseFloat(v),parseFloat(y),parseFloat(q));q=f.left-u.left-v",
    ".left;u=f.top-u.top-\nv.top;v=l.clientHeight+f.top-f.bottom;l.scrollLef",
    "t+=Math.min(q,Math.max(q-(l.clientWidth+f.left-f.right),0));l.scrollTop",
    "+=Math.min(u,Math.max(u-v,0))}Hc(a,e)}}b?b=new Ad(b.x,b.y):(b=Bd(a),b=n",
    "ew Ad(b.width/2,b.height/2));c=c||new wd;c.move(a,b);if(null!==c.j)thro",
    "w new t(13,\"Cannot press more than one button or an already pressed bu",
    "tton.\");c.j=0;c.K=c.I();if(B(c.I(),\"OPTION\")||B(c.I(),\"SELECT\")||y",
    "d(c,Tc,null,null,!1,void 0))Ra&&0==c.j&&B(c.K,\"OPTION\")&&c.S(Yc,c.C,0",
    ",1,MSPointerEvent.MSPOINTER_TYPE_MOUSE,\n!0),ld(c);if(null===c.j)throw ",
    "new t(13,\"Cannot release a button when no button is pressed.\");c.G&&u",
    "c(c.g)&&(a=c.G,b=hb(c.g),!b||a.multiple)&&(c.g.selected=!b,a.multiple&&",
    "!(0<=oa(Qa,28))||ed(a,Pc));a=uc(c.I());yd(c,Xc,null,null,d,void 0);try{",
    "if(0==c.j&&c.I()==c.K){var U=c.C,na=zd(c,Qc);if(a||uc(c.g))!c.G&&gb(c.g",
    ")&&hb(c.g),c.W(Qc,U,na,null,0,a,void 0);c.N&&yd(c,Sc);c.N=!c.N;Ra&&0==c",
    ".j&&B(c.K,\"OPTION\")&&c.S(Zc,new z(0,0),0,1,MSPointerEvent.MSPOINTER_T",
    "YPE_MOUSE,!1)}else 2==c.j&&yd(c,Rc)}catch(Cd){}jd=\n{};c.j=null;c.K=nul",
    "l});; return this._.apply(null,arguments);}.apply({navigator:typeof win",
    "dow!='undefined'?window.navigator:null,document:typeof window!='undefin",
    "ed'?window.document:null}, arguments);}",
    NULL
};

const char* const EXECUTE_ASYNC_SCRIPT[] = {
    "function(){return function(){function f(a){var b=typeof a;if(\"object\"",
    "==b)if(a){if(a instanceof Array)return\"array\";if(a instanceof Object)",
    "return b;var c=Object.prototype.toString.call(a);if(\"[object Window]\"",
    "==c)return\"object\";if(\"[object Array]\"==c||\"number\"==typeof a.len",
    "gth&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typeof a.propertyIs",
    "Enumerable&&!a.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[o",
    "bject Function]\"==c||\"undefined\"!=typeof a.call&&\"undefined\"!=type",
    "of a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"call\"))return\"fu",
    "nction\"}else return\"null\";\nelse if(\"function\"==b&&\"undefined\"==",
    "typeof a.call)return\"object\";return b}function k(a){var b=f(a);return",
    "\"array\"==b||\"object\"==b&&\"number\"==typeof a.length}function l(a){",
    "var b=typeof a;return\"object\"==b&&null!=a||\"function\"==b}function m",
    "(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){v",
    "ar b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}}var n=",
    "Date.now||function(){return+new Date};\nfunction q(a,b){function c(){}c",
    ".prototype=b.prototype;a.f=b.prototype;a.prototype=new c;a.prototype.co",
    "nstructor=a;a.c=function(a,c,g){for(var d=Array(arguments.length-2),e=2",
    ";e<arguments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply",
    "(a,d)}};function r(a,b){this.code=a;this.state=t[a]||v;this.message=b||",
    "\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toU",
    "pperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.index",
    "Of(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.nam",
    "e=this.name;this.stack=a.stack||\"\"}q(r,Error);var v=\"unknown error\"",
    ",t={15:\"element not selectable\",11:\"element not visible\"};t[31]=v;t",
    "[30]=v;t[24]=\"invalid cookie domain\";t[29]=\"invalid element coordina",
    "tes\";t[12]=\"invalid element state\";\nt[32]=\"invalid selector\";t[51",
    "]=\"invalid selector\";t[52]=\"invalid selector\";t[17]=\"javascript er",
    "ror\";t[405]=\"unsupported operation\";t[34]=\"move target out of bound",
    "s\";t[27]=\"no such alert\";t[7]=\"no such element\";t[8]=\"no such fra",
    "me\";t[23]=\"no such window\";t[28]=\"script timeout\";t[33]=\"session ",
    "not created\";t[10]=\"stale element reference\";t[21]=\"timeout\";t[25]",
    "=\"unable to set cookie\";t[26]=\"unexpected alert open\";t[13]=v;t[9]=",
    "\"unknown command\";r.prototype.toString=function(){return this.name+\"",
    ": \"+this.message};function w(a,b){for(var c=a.length,d=Array(c),e=\"st",
    "ring\"==typeof a?a.split(\"\"):a,g=0;g<c;g++)g in e&&(d[g]=b.call(void ",
    "0,e[g],g,a));return d};function x(a,b){var c={},d;for(d in a)b.call(voi",
    "d 0,a[d],d,a)&&(c[d]=a[d]);return c}function y(a,b){var c={},d;for(d in",
    " a)c[d]=b.call(void 0,a[d],d,a);return c}function z(a,b){return null!==",
    "a&&b in a}function A(a,b){for(var c in a)if(b.call(void 0,a[c],c,a))ret",
    "urn c};function B(){this.a=void 0}\nfunction C(a,b,c){if(null==b)c.push",
    "(\"null\");else{if(\"object\"==typeof b){if(\"array\"==f(b)){var d=b;b=",
    "d.length;c.push(\"[\");for(var e=\"\",g=0;g<b;g++)c.push(e),e=d[g],C(a,",
    "a.a?a.a.call(d,String(g),e):e,c),e=\",\";c.push(\"]\");return}if(b inst",
    "anceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();",
    "else{c.push(\"{\");g=\"\";for(d in b)Object.prototype.hasOwnProperty.ca",
    "ll(b,d)&&(e=b[d],\"function\"!=typeof e&&(c.push(g),D(d,c),c.push(\":\"",
    "),C(a,a.a?a.a.call(b,d,e):e,c),g=\",\"));c.push(\"}\");return}}switch(t",
    "ypeof b){case \"string\":D(b,\nc);break;case \"number\":c.push(isFinite",
    "(b)&&!isNaN(b)?String(b):\"null\");break;case \"boolean\":c.push(String",
    "(b));break;case \"function\":c.push(\"null\");break;default:throw Error",
    "(\"Unknown type: \"+typeof b);}}}var E={'\"':'\\\\\"',\"\\\\\":\"",
    "\\\\\\\\\",\"/\":\"\\\\/\",\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\",\"\\n\":",
    "\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\x0B\":\"\\\\u000b\"},",
    "F=/\\uffff/.test(\"\\uffff\")?/[\\\\\"\\x00-\\x1f\\x7f-\\uffff]/g:/[",
    "\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;\nfunction D(a,b){b.push('\"',a.replace",
    "(F,function(a){var b=E[a];b||(b=\"\\\\u\"+(a.charCodeAt(0)|65536).toStr",
    "ing(16).substr(1),E[a]=b);return b}),'\"')};function G(a){function b(a,",
    "d){switch(f(a)){case \"string\":case \"number\":case \"boolean\":return",
    " a;case \"function\":return a.toString();case \"array\":return w(a,func",
    "tion(a){return b(a,d)});case \"object\":if(0<=d.indexOf(a))throw new r(",
    "17,\"Recursive object cannot be transferred\");if(z(a,\"nodeType\")&&(1",
    "==a.nodeType||9==a.nodeType)){var c={};c.ELEMENT=H(a);return c}if(z(a,",
    "\"document\"))return c={},c.WINDOW=H(a),c;d.push(a);if(k(a))return w(a,",
    "function(a){return b(a,d)});a=x(a,function(a,b){return\"number\"==typeo",
    "f b||\n\"string\"==typeof b});return y(a,function(a){return b(a,d)});de",
    "fault:return null}}return b(a,[])}function K(a,b){return\"array\"==f(a)",
    "?w(a,function(a){return K(a,b)}):l(a)?\"function\"==typeof a?a:z(a,\"EL",
    "EMENT\")?L(a.ELEMENT,b):z(a,\"WINDOW\")?L(a.WINDOW,b):y(a,function(a){r",
    "eturn K(a,b)}):a}function M(a,b){if(\"string\"==typeof a)try{return new",
    " b.Function(a)}catch(c){throw c;}return b==window?a:new b.Function(\"re",
    "turn (\"+a+\").apply(null,arguments);\")}\nfunction N(a){a=a||document;",
    "var b=a.$wdc_;b||(b=a.$wdc_={},b.b=n());b.b||(b.b=n());return b}functio",
    "n H(a){var b=N(a.ownerDocument),c=A(b,function(b){return b==a});c||(c=",
    "\":wdc:\"+b.b++,b[c]=a);return c}\nfunction L(a,b){a=decodeURIComponent",
    "(a);b=b||document;var c=N(b);if(!z(c,a))throw new r(10,\"Element does n",
    "ot exist in cache\");var d=c[a];if(z(d,\"setInterval\")){if(d.closed)th",
    "row delete c[a],new r(23,\"Window has been closed.\");return d}for(var ",
    "e=d;e;){if(e==b.documentElement)return d;e=e.parentNode}delete c[a];thr",
    "ow new r(10,\"Element is no longer attached to the DOM\");};function O(",
    "a,b,c,d,e,g){function p(a,b){J||(h.removeEventListener?h.removeEventLis",
    "tener(\"unload\",u,!0):h.detachEvent(\"onunload\",u),h.clearTimeout(T),",
    "0!=a?(a=new r(a,b.message||b+\"\"),a.stack=b.stack,b={status:z(a,\"code",
    "\")?a.code:13,value:{message:a.message}}):b={status:0,value:G(b)},e&&(a",
    "=[],C(new B,b,a),b=a.join(\"\")),d(b),J=!0)}function u(){p(13,Error(\"D",
    "etected a page unload event; asynchronous script execution does not wor",
    "k across page loads.\"))}var h=g||window,J=!1;g=m(p,13);if(h.closed)g(",
    "\"Unable to execute script; the target window is closed.\");\nelse{a=M(",
    "a,h);b=K(b,h.document);b.push(m(p,0));h.addEventListener?h.addEventList",
    "ener(\"unload\",u,!0):h.attachEvent(\"onunload\",u);var U=n();try{a.app",
    "ly(h,b);var T=h.setTimeout(function(){p(28,Error(\"Timed out waiting fo",
    "r asyncrhonous script result after \"+(n()-U)+\" ms\"))},Math.max(0,c))",
    "}catch(I){p(I.code||13,I)}}}var P=[\"_\"],Q=this;P[0]in Q||!Q.execScrip",
    "t||Q.execScript(\"var \"+P[0]);\nfor(var R;P.length&&(R=P.shift());){va",
    "r S;if(S=!P.length)S=void 0!==O;S?Q[R]=O:Q=Q[R]&&Q[R]!==Object.prototyp",
    "e[R]?Q[R]:Q[R]={}};; return this._.apply(null,arguments);}.apply({navig",
    "ator:typeof window!='undefined'?window.navigator:null,document:typeof w",
    "indow!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const EXECUTE_SCRIPT[] = {
    "function(){return function(){function f(a){var b=typeof a;if(\"object\"",
    "==b)if(a){if(a instanceof Array)return\"array\";if(a instanceof Object)",
    "return b;var c=Object.prototype.toString.call(a);if(\"[object Window]\"",
    "==c)return\"object\";if(\"[object Array]\"==c||\"number\"==typeof a.len",
    "gth&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typeof a.propertyIs",
    "Enumerable&&!a.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[o",
    "bject Function]\"==c||\"undefined\"!=typeof a.call&&\"undefined\"!=type",
    "of a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"call\"))return\"fu",
    "nction\"}else return\"null\";\nelse if(\"function\"==b&&\"undefined\"==",
    "typeof a.call)return\"object\";return b}function h(a){var b=f(a);return",
    "\"array\"==b||\"object\"==b&&\"number\"==typeof a.length}function k(a){",
    "var b=typeof a;return\"object\"==b&&null!=a||\"function\"==b}var l=Date",
    ".now||function(){return+new Date};\nfunction m(a,b){function c(){}c.pro",
    "totype=b.prototype;a.f=b.prototype;a.prototype=new c;a.prototype.constr",
    "uctor=a;a.c=function(a,c,g){for(var d=Array(arguments.length-2),e=2;e<a",
    "rguments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d",
    ")}};var p=window;function q(a,b){this.code=a;this.state=t[a]||u;this.me",
    "ssage=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){ret",
    "urn a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b",
    "||a.indexOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.messa",
    "ge);a.name=this.name;this.stack=a.stack||\"\"}m(q,Error);var u=\"unknow",
    "n error\",t={15:\"element not selectable\",11:\"element not visible\"};",
    "t[31]=u;t[30]=u;t[24]=\"invalid cookie domain\";t[29]=\"invalid element",
    " coordinates\";t[12]=\"invalid element state\";\nt[32]=\"invalid select",
    "or\";t[51]=\"invalid selector\";t[52]=\"invalid selector\";t[17]=\"java",
    "script error\";t[405]=\"unsupported operation\";t[34]=\"move target out",
    " of bounds\";t[27]=\"no such alert\";t[7]=\"no such element\";t[8]=\"no",
    " such frame\";t[23]=\"no such window\";t[28]=\"script timeout\";t[33]=",
    "\"session not created\";t[10]=\"stale element reference\";t[21]=\"timeo",
    "ut\";t[25]=\"unable to set cookie\";t[26]=\"unexpected alert open\";t[1",
    "3]=u;t[9]=\"unknown command\";q.prototype.toString=function(){return th",
    "is.name+\": \"+this.message};function v(a,b){for(var c=a.length,d=Array",
    "(c),e=\"string\"==typeof a?a.split(\"\"):a,g=0;g<c;g++)g in e&&(d[g]=b.",
    "call(void 0,e[g],g,a));return d};function w(a,b){var c={},d;for(d in a)",
    "b.call(void 0,a[d],d,a)&&(c[d]=a[d]);return c}function x(a,b){var c={},",
    "d;for(d in a)c[d]=b.call(void 0,a[d],d,a);return c}function y(a,b){retu",
    "rn null!==a&&b in a}function z(a,b){for(var c in a)if(b.call(void 0,a[c",
    "],c,a))return c};function A(){this.a=void 0}\nfunction B(a,b,c){if(null",
    "==b)c.push(\"null\");else{if(\"object\"==typeof b){if(\"array\"==f(b)){",
    "var d=b;b=d.length;c.push(\"[\");for(var e=\"\",g=0;g<b;g++)c.push(e),e",
    "=d[g],B(a,a.a?a.a.call(d,String(g),e):e,c),e=\",\";c.push(\"]\");return",
    "}if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.",
    "valueOf();else{c.push(\"{\");g=\"\";for(d in b)Object.prototype.hasOwnP",
    "roperty.call(b,d)&&(e=b[d],\"function\"!=typeof e&&(c.push(g),C(d,c),c.",
    "push(\":\"),B(a,a.a?a.a.call(b,d,e):e,c),g=\",\"));c.push(\"}\");return",
    "}}switch(typeof b){case \"string\":C(b,\nc);break;case \"number\":c.pus",
    "h(isFinite(b)&&!isNaN(b)?String(b):\"null\");break;case \"boolean\":c.p",
    "ush(String(b));break;case \"function\":c.push(\"null\");break;default:t",
    "hrow Error(\"Unknown type: \"+typeof b);}}}var D={'\"':'\\\\\"',\"",
    "\\\\\":\"\\\\\\\\\",\"/\":\"\\\\/\",\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\"",
    ",\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\x0B\":\"",
    "\\\\u000b\"},E=/\\uffff/.test(\"\\uffff\")?/[\\\\\"\\x00-\\x1f\\x7f-\\u",
    "ffff]/g:/[\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;\nfunction C(a,b){b.push('\"'",
    ",a.replace(E,function(a){var b=D[a];b||(b=\"\\\\u\"+(a.charCodeAt(0)|65",
    "536).toString(16).substr(1),D[a]=b);return b}),'\"')};function F(a){fun",
    "ction b(a,d){switch(f(a)){case \"string\":case \"number\":case \"boolea",
    "n\":return a;case \"function\":return a.toString();case \"array\":retur",
    "n v(a,function(a){return b(a,d)});case \"object\":if(0<=d.indexOf(a))th",
    "row new q(17,\"Recursive object cannot be transferred\");if(y(a,\"nodeT",
    "ype\")&&(1==a.nodeType||9==a.nodeType)){var c={};c.ELEMENT=G(a);return ",
    "c}if(y(a,\"document\"))return c={},c.WINDOW=G(a),c;d.push(a);if(h(a))re",
    "turn v(a,function(a){return b(a,d)});a=w(a,function(a,b){return\"number",
    "\"==typeof b||\n\"string\"==typeof b});return x(a,function(a){return b(",
    "a,d)});default:return null}}return b(a,[])}function H(a,b){return\"arra",
    "y\"==f(a)?v(a,function(a){return H(a,b)}):k(a)?\"function\"==typeof a?a",
    ":y(a,\"ELEMENT\")?I(a.ELEMENT,b):y(a,\"WINDOW\")?I(a.WINDOW,b):x(a,func",
    "tion(a){return H(a,b)}):a}function J(a){a=a||document;var b=a.$wdc_;b||",
    "(b=a.$wdc_={},b.b=l());b.b||(b.b=l());return b}function G(a){var b=J(a.",
    "ownerDocument),c=z(b,function(b){return b==a});c||(c=\":wdc:\"+b.b++,b[",
    "c]=a);return c}\nfunction I(a,b){a=decodeURIComponent(a);b=b||document;",
    "var c=J(b);if(!y(c,a))throw new q(10,\"Element does not exist in cache",
    "\");var d=c[a];if(y(d,\"setInterval\")){if(d.closed)throw delete c[a],n",
    "ew q(23,\"Window has been closed.\");return d}for(var e=d;e;){if(e==b.d",
    "ocumentElement)return d;e=e.parentNode}delete c[a];throw new q(10,\"Ele",
    "ment is no longer attached to the DOM\");};function K(a,b,c,d){d=d||p;t",
    "ry{a:{var e=a;if(\"string\"==typeof e)try{a=new d.Function(e);break a}c",
    "atch(n){throw n;}a=d==window?e:new d.Function(\"return (\"+e+\").apply(",
    "null,arguments);\")}var g=H(b,d.document);var r={status:0,value:F(a.app",
    "ly(null,g))}}catch(n){r={status:y(n,\"code\")?n.code:13,value:{message:",
    "n.message}}}c&&(a=[],B(new A,r,a),r=a.join(\"\"));return r}var L=[\"_\"",
    "],M=this;L[0]in M||!M.execScript||M.execScript(\"var \"+L[0]);\nfor(var",
    " N;L.length&&(N=L.shift());){var O;if(O=!L.length)O=void 0!==K;O?M[N]=K",
    ":M=M[N]&&M[N]!==Object.prototype[N]?M[N]:M[N]={}};; return this._.apply",
    "(null,arguments);}.apply({navigator:typeof window!='undefined'?window.n",
    "avigator:null,document:typeof window!='undefined'?window.document:null}",
    ", arguments);}",
    NULL
};

const char* const EXECUTE_SQL[] = {
    "function(){return function(){function b(a,c){function e(){}e.prototype=",
    "c.prototype;a.b=c.prototype;a.prototype=new e;a.prototype.constructor=a",
    ";a.a=function(a,e,n){for(var k=Array(arguments.length-2),g=2;g<argument",
    "s.length;g++)k[g-2]=arguments[g];return c.prototype[e].apply(a,k)}};var",
    " d=window;function f(a,c){this.code=a;this.state=h[a]||l;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(f,Error);var l=\"unknown error",
    "\",h={15:\"element not selectable\",11:\"element not visible\"};h[31]=l",
    ";h[30]=l;h[24]=\"invalid cookie domain\";h[29]=\"invalid element coordi",
    "nates\";h[12]=\"invalid element state\";\nh[32]=\"invalid selector\";h[",
    "51]=\"invalid selector\";h[52]=\"invalid selector\";h[17]=\"javascript ",
    "error\";h[405]=\"unsupported operation\";h[34]=\"move target out of bou",
    "nds\";h[27]=\"no such alert\";h[7]=\"no such element\";h[8]=\"no such f",
    "rame\";h[23]=\"no such window\";h[28]=\"script timeout\";h[33]=\"sessio",
    "n not created\";h[10]=\"stale element reference\";h[21]=\"timeout\";h[2",
    "5]=\"unable to set cookie\";h[26]=\"unexpected alert open\";h[13]=l;h[9",
    "]=\"unknown command\";f.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function m(a){this.rows=[];for(var c=0;c<a.rows.le",
    "ngth;c++)this.rows[c]=a.rows.item(c);this.rowsAffected=a.rowsAffected;t",
    "his.insertId=-1;try{this.insertId=a.insertId}catch(e){}};function p(a,c",
    ",e,r,t,n,k){function g(a,c){c=new m(c);r(a,c)}try{var x=d.openDatabase(",
    "a,\"\",a+\"name\",5242880)}catch(w){throw new f(13,w.message);}x.transa",
    "ction(function(a){a.executeSql(c,e,g,k)},t,n)}var q=[\"_\"],u=this;q[0]",
    "in u||!u.execScript||u.execScript(\"var \"+q[0]);for(var v;q.length&&(v",
    "=q.shift());)q.length||void 0===p?u=u[v]&&u[v]!==Object.prototype[v]?u[",
    "v]:u[v]={}:u[v]=p;; return this._.apply(null,arguments);}.apply({naviga",
    "tor:typeof window!='undefined'?window.navigator:null,document:typeof wi",
    "ndow!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const FIND_ELEMENTS[] = {
    "function(){return function(){var h,aa=this;function l(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&l(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function p(a){return\"function\"==",
    "ca(a)}function ea(a){var b=typeof a;return\"object\"==b&&null!=a||\"fun",
    "ction\"==b}function fa(a,b,c){return a.call.apply(a.bind,arguments)}\nf",
    "unction ha(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra",
    "y.prototype.slice.call(arguments,2);return function(){var c=Array.proto",
    "type.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.",
    "apply(b,c)}}return function(){return a.apply(b,arguments)}}function ia(",
    "a,b,c){ia=Function.prototype.bind&&-1!=Function.prototype.bind.toString",
    "().indexOf(\"native code\")?fa:ha;return ia.apply(null,arguments)}\nfun",
    "ction ja(a,b){var c=Array.prototype.slice.call(arguments,1);return func",
    "tion(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)",
    "}}function q(a,b){function c(){}c.prototype=b.prototype;a.xa=b.prototyp",
    "e;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,c,f){for(",
    "var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argum",
    "ents[e];return b.prototype[c].apply(a,d)}};var ka=window;function t(a,b",
    "){this.code=a;this.state=u[a]||la;this.message=b||\"\";a=this.state.rep",
    "lace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase().replace(/^",
    "[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)a+",
    "=\"Error\";this.name=a;a=Error(this.message);a.name=this.name;this.stac",
    "k=a.stack||\"\"}q(t,Error);var la=\"unknown error\",u={15:\"element not",
    " selectable\",11:\"element not visible\"};u[31]=la;u[30]=la;u[24]=\"inv",
    "alid cookie domain\";u[29]=\"invalid element coordinates\";u[12]=\"inva",
    "lid element state\";\nu[32]=\"invalid selector\";u[51]=\"invalid select",
    "or\";u[52]=\"invalid selector\";u[17]=\"javascript error\";u[405]=\"uns",
    "upported operation\";u[34]=\"move target out of bounds\";u[27]=\"no suc",
    "h alert\";u[7]=\"no such element\";u[8]=\"no such frame\";u[23]=\"no su",
    "ch window\";u[28]=\"script timeout\";u[33]=\"session not created\";u[10",
    "]=\"stale element reference\";u[21]=\"timeout\";u[25]=\"unable to set c",
    "ookie\";u[26]=\"unexpected alert open\";u[13]=la;u[9]=\"unknown command",
    "\";t.prototype.toString=function(){return this.name+\": \"+this.message",
    "};var ma;function na(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b",
    ")==b}var oa=String.prototype.trim?function(a){return a.trim()}:function",
    "(a){return a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function pa(a)",
    "{return String(a).replace(/\\-([a-z])/g,function(a,c){return c.toUpperC",
    "ase()})};function qa(a,b){if(m(a))return m(b)&&1==b.length?a.indexOf(b,",
    "0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}",
    "function v(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)e",
    " in d&&b.call(void 0,d[e],e,a)}function ra(a,b){for(var c=a.length,d=[]",
    ",e=0,f=m(a)?a.split(\"\"):a,g=0;g<c;g++)if(g in f){var k=f[g];b.call(vo",
    "id 0,k,g,a)&&(d[e++]=k)}return d}function sa(a,b,c){var d=c;v(a,functio",
    "n(c,f){d=b.call(void 0,d,c,f,a)});return d}\nfunction ta(a,b){for(var c",
    "=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d",
    "[e],e,a))return!0;return!1}function ua(a,b){for(var c=a.length,d=m(a)?a",
    ".split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))return!1",
    ";return!0}function va(a,b){a:{for(var c=a.length,d=m(a)?a.split(\"\"):a",
    ",e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}retur",
    "n 0>b?null:m(a)?a.charAt(b):a[b]}function wa(a){return Array.prototype.",
    "concat.apply([],arguments)}\nfunction xa(a){var b=a.length;if(0<b){for(",
    "var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function ya(a,b,",
    "c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.pro",
    "totype.slice.call(a,b,c)};function x(a,b){this.x=l(a)?a:0;this.y=l(b)?b",
    ":0}h=x.prototype;h.clone=function(){return new x(this.x,this.y)};h.toSt",
    "ring=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function",
    "(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.flo",
    "or=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);retur",
    "n this};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(",
    "this.y);return this};\nh.translate=function(a,b){a instanceof x?(this.x",
    "+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h",
    ".scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};functi",
    "on za(a,b){this.width=a;this.height=b}h=za.prototype;h.clone=function()",
    "{return new za(this.width,this.height)};h.toString=function(){return\"(",
    "\"+this.width+\" x \"+this.height+\")\"};h.aspectRatio=function(){retur",
    "n this.width/this.height};h.ceil=function(){this.width=Math.ceil(this.w",
    "idth);this.height=Math.ceil(this.height);return this};h.floor=function(",
    "){this.width=Math.floor(this.width);this.height=Math.floor(this.height)",
    ";return this};\nh.round=function(){this.width=Math.round(this.width);th",
    "is.height=Math.round(this.height);return this};h.scale=function(a,b){b=",
    "n(b)?b:a;this.width*=a;this.height*=b;return this};function y(a){return",
    " a?new Aa(z(a)):ma||(ma=new Aa)}function Ba(a,b,c){function d(c){c&&b.a",
    "ppendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.length;e++){var ",
    "f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):v(Ca(f)?xa(f):f,d)}}function Da",
    "(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}\nfunction Ea(a",
    ",b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.cont",
    "ains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b|",
    "|!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;retur",
    "n b==a}\nfunction Fa(a,b){if(a==b)return 0;if(a.compareDocumentPosition",
    ")return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.p",
    "arentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.n",
    "odeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f",
    "=b.parentNode;return e==f?Ga(a,b):!c&&Ea(e,b)?-1*Ia(a,b):!d&&Ea(f,a)?Ia",
    "(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d",
    "=z(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange(",
    ");a.selectNode(b);\na.collapse(!0);return c.compareBoundaryPoints(aa.Ra",
    "nge.START_TO_END,a)}function Ia(a,b){var c=a.parentNode;if(c==b)return-",
    "1;for(;b.parentNode!=c;)b=b.parentNode;return Ga(b,a)}function Ga(a,b){",
    "for(;b=b.previousSibling;)if(b==a)return-1;return 1}function z(a){retur",
    "n 9==a.nodeType?a:a.ownerDocument||a.document}function Ca(a){if(a&&\"nu",
    "mber\"==typeof a.length){if(ea(a))return\"function\"==typeof a.item||\"",
    "string\"==typeof a.item;if(p(a))return\"function\"==typeof a.item}retur",
    "n!1}\nfunction Ja(a,b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))retu",
    "rn a;a=a.parentNode;c++}return null}function Aa(a){this.C=a||aa.documen",
    "t||document}h=Aa.prototype;h.getElementsByTagName=function(a,b){return(",
    "b||this.C).getElementsByTagName(String(a))};\nfunction B(a,b,c,d){a=d||",
    "a.C;var e=b&&\"*\"!=b?String(b).toUpperCase():\"\";if(a.querySelectorAl",
    "l&&a.querySelector&&(e||c))c=a.querySelectorAll(e+(c?\".\"+c:\"\"));els",
    "e if(c&&a.getElementsByClassName)if(b=a.getElementsByClassName(c),e){a=",
    "{};for(var f=d=0,g;g=b[f];f++)e==g.nodeName&&(a[d++]=g);a.length=d;c=a}",
    "else c=b;else if(b=a.getElementsByTagName(e||\"*\"),c){a={};for(f=d=0;g",
    "=b[f];f++){e=g.className;var k;if(k=\"function\"==typeof e.split)k=0<=q",
    "a(e.split(/\\s+/),c);k&&(a[d++]=g)}a.length=d;c=a}else c=b;return c}\nh",
    ".createElement=function(a){return this.C.createElement(String(a))};h.cr",
    "eateTextNode=function(a){return this.C.createTextNode(String(a))};h.app",
    "endChild=function(a,b){a.appendChild(b)};h.append=function(a,b){Ba(z(a)",
    ",a,arguments)};h.canHaveChildren=function(a){if(1!=a.nodeType)return!1;",
    "switch(a.tagName){case \"APPLET\":case \"AREA\":case \"BASE\":case \"BR",
    "\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"FRAME\":case \"H",
    "R\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"ISINDEX\":case ",
    "\"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\":case \"MET",
    "A\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case \"SOURCE\":case",
    " \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0};\nh.removeNod",
    "e=function(a){return a&&a.parentNode?a.parentNode.removeChild(a):null};",
    "h.contains=Ea;var Ka={K:function(a){return!(!a.querySelectorAll||!a.que",
    "rySelector)},A:function(a,b){if(!a)throw new t(32,\"No class name speci",
    "fied\");a=oa(a);if(-1!==a.indexOf(\" \"))throw new t(32,\"Compound clas",
    "s names not permitted\");if(Ka.K(b))try{return b.querySelector(\".\"+a.",
    "replace(/\\./g,\"\\\\.\"))||null}catch(c){throw new t(32,\"An invalid o",
    "r illegal class name was specified\");}a=B(y(b),\"*\",a,b);return a.len",
    "gth?a[0]:null},l:function(a,b){if(!a)throw new t(32,\"No class name spe",
    "cified\");a=oa(a);if(-1!==a.indexOf(\" \"))throw new t(32,\n\"Compound ",
    "class names not permitted\");if(Ka.K(b))try{return b.querySelectorAll(",
    "\".\"+a.replace(/\\./g,\"\\\\.\"))}catch(c){throw new t(32,\"An invalid",
    " or illegal class name was specified\");}return B(y(b),\"*\",a,b)}};var",
    " La={A:function(a,b){p(b.querySelector);if(!a)throw new t(32,\"No selec",
    "tor specified\");a=oa(a);try{var c=b.querySelector(a)}catch(d){throw ne",
    "w t(32,\"An invalid or illegal selector was specified\");}return c&&1==",
    "c.nodeType?c:null},l:function(a,b){p(b.querySelectorAll);if(!a)throw ne",
    "w t(32,\"No selector specified\");a=oa(a);try{return b.querySelectorAll",
    "(a)}catch(c){throw new t(32,\"An invalid or illegal selector was specif",
    "ied\");}}};var Ma={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:",
    "\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",",
    "bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"",
    "#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887",
    "\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",c",
    "oral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimso",
    "n:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b",
    "\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\"",
    ",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",d",
    "arkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\"",
    ",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",da",
    "rkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f",
    "4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff149",
    "3\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dod",
    "gerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",fores",
    "tgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhi",
    "te:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",",
    "green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#",
    "f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",i",
    "vory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:",
    "\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"",
    "#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodye",
    "llow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey",
    ":\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagr",
    "een:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lig",
    "htslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe",
    "0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"",
    "#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"",
    "#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagr",
    "een:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a",
    "\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue",
    ":\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#",
    "ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",o",
    "live:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#",
    "ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb",
    "98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip:\"#",
    "ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:",
    "\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",r",
    "osybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salm",
    "on:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:",
    "\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",s",
    "lateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:",
    "\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c",
    "\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"",
    "#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whites",
    "moke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var Na=\"b",
    "ackgroundColor borderTopColor borderRightColor borderBottomColor border",
    "LeftColor color outlineColor\".split(\" \"),Oa=/#([0-9a-fA-F])([0-9a-fA",
    "-F])([0-9a-fA-F])/,Pa=/^#(?:[0-9a-f]{3}){1,2}$/i,Qa=/^(?:rgba)?\\((\\d{",
    "1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,Ra=/^(?:rg",
    "b)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$",
    "/i;function Sa(a,b){b=b.toLowerCase();return\"style\"==b?Ta(a.style.css",
    "Text):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var Ua=/[;]+(",
    "?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*",
    "\\([^()]*\\))*[^()]*$)/;function Ta(a){var b=[];v(a.split(Ua),function(",
    "a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.leng",
    "th&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.join(\"\");retur",
    "n b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction C(a,b){b&&\"string",
    "\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagNam",
    "e.toUpperCase()==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybo",
    "zu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby",
    " granted, free of charge, to any person obtaining a copy\n of this soft",
    "ware and associated documentation files (the \"Software\"), to\n deal i",
    "n the Software without restriction, including without limitation the\n ",
    "rights to use, copy, modify, merge, publish, distribute, sublicense, an",
    "d/or\n sell copies of the Software, and to permit persons to whom the S",
    "oftware is\n furnished to do so, subject to the following conditions:\n",
    "\n The above copyright notice and this permission notice shall be inclu",
    "ded in\n all copies or substantial portions of the Software.\n\n THE SO",
    "FTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
    "\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL",
    "ITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVEN",
    "T SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAM",
    "AGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OT",
    "HERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR T",
    "HE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction Va(a,b,c){thi",
    "s.m=a;this.ua=b||1;this.j=c||1};function Wa(a){this.W=a;this.M=0}functi",
    "on Xa(a){a=a.match(Ya);for(var b=0;b<a.length;b++)Za.test(a[b])&&a.spli",
    "ce(b,1);return new Wa(a)}var Ya=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+)",
    ":)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|",
    "\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Za=/^\\s/;function E(a,b){re",
    "turn a.W[a.M+(b||0)]}Wa.prototype.next=function(){return this.W[this.M+",
    "+]};Wa.prototype.back=function(){this.M--};Wa.prototype.empty=function(",
    "){return this.W.length<=this.M};function F(a){var b=null,c=a.nodeType;1",
    "==c&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||n",
    "ull==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.document",
    "Element:a.firstChild;c=0;var d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=",
    "a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibl",
    "ing););}}else b=a.nodeValue;return\"\"+b}\nfunction $a(a,b,c){if(null==",
    "=b)return!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return nu",
    "ll==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function ab(a,b,c,d,e)",
    "{return bb.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new G)}\nfunction b",
    "b(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName",
    "(d),v(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&",
    "&d&&\"class\"==c?(b=b.getElementsByClassName(d),v(b,function(b){b.class",
    "Name==d&&a.matches(b)&&e.add(b)})):a instanceof H?cb(a,b,c,d,e):b.getEl",
    "ementsByTagName&&(b=b.getElementsByTagName(a.getName()),v(b,function(a)",
    "{$a(a,c,d)&&e.add(a)}));return e}\nfunction cb(a,b,c,d,e){for(b=b.first",
    "Child;b;b=b.nextSibling)$a(b,c,d)&&a.matches(b)&&e.add(b),cb(a,b,c,d,e)",
    "};function G(){this.j=this.g=null;this.H=0}function db(a){this.node=a;t",
    "his.next=this.B=null}function eb(a,b){if(!a.g)return b;if(!b.g)return a",
    ";var c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.nex",
    "t,b=b.next):0<Fa(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.B=d)?d",
    ".next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.B=d,d=d.next=e,f++,e=e.next;a.j=d",
    ";a.H=f;return a}G.prototype.unshift=function(a){a=new db(a);a.next=this",
    ".g;this.j?this.g.B=a:this.g=this.j=a;this.g=a;this.H++};\nG.prototype.a",
    "dd=function(a){a=new db(a);a.B=this.j;this.g?this.j.next=a:this.g=this.",
    "j=a;this.j=a;this.H++};function fb(a){return(a=a.g)?a.node:null}G.proto",
    "type.s=function(){return this.H};function gb(a){return(a=fb(a))?F(a):\"",
    "\"}G.prototype.iterator=function(a){return new hb(this,!!a)};function h",
    "b(a,b){this.qa=a;this.Z=(this.D=b)?a.j:a.g;this.T=null}hb.prototype.nex",
    "t=function(){var a=this.Z;if(null==a)return null;var b=this.T=a;this.Z=",
    "this.D?a.B:a.next;return b.node};\nhb.prototype.remove=function(){var a",
    "=this.qa,b=this.T;if(!b)throw Error(\"Next must be called at least once",
    " before remove.\");var c=b.B;b=b.next;c?c.next=b:a.g=b;b?b.B=c:a.j=c;a.",
    "H--;this.T=null};function I(a){this.f=a;this.h=this.u=!1;this.I=null}fu",
    "nction J(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")",
    "}I.prototype.c=function(){return this.u};function ib(a,b){a.u=b}functio",
    "n jb(a,b){a.h=b}I.prototype.w=function(){return this.I};function K(a,b)",
    "{a=a.evaluate(b);return a instanceof G?+gb(a):+a}function M(a,b){a=a.ev",
    "aluate(b);return a instanceof G?gb(a):\"\"+a}function kb(a,b){a=a.evalu",
    "ate(b);return a instanceof G?!!a.s():!!a};function lb(a,b,c){I.call(thi",
    "s,a.f);this.V=a;this.ca=b;this.ia=c;this.u=b.c()||c.c();this.h=b.h||c.h",
    ";this.V==mb&&(c.h||c.c()||4==c.f||0==c.f||!b.w()?b.h||b.c()||4==b.f||0=",
    "=b.f||!c.w()||(this.I={name:c.w().name,G:b}):this.I={name:b.w().name,G:",
    "c})}q(lb,I);\nfunction nb(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);va",
    "r f;if(b instanceof G&&c instanceof G){b=b.iterator();for(d=b.next();d;",
    "d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a(F(d),F(f)))r",
    "eturn!0;return!1}if(b instanceof G||c instanceof G){b instanceof G?(e=b",
    ",d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,k=f.next();k;k=f.next",
    "()){switch(g){case \"number\":k=+F(k);break;case \"boolean\":k=!!F(k);b",
    "reak;case \"string\":k=F(k);break;default:throw Error(\"Illegal primiti",
    "ve type for comparison.\");\n}if(e==b&&a(k,d)||e==c&&a(d,k))return!0}re",
    "turn!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c)",
    ":\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}lb",
    ".prototype.evaluate=function(a){return this.V.o(this.ca,this.ia,a)};lb.",
    "prototype.toString=function(){var a=\"Binary Expression: \"+this.V;a+=J",
    "(this.ca);return a+=J(this.ia)};function ob(a,b,c,d){this.ta=a;this.ga=",
    "b;this.f=c;this.o=d}ob.prototype.toString=function(){return this.ta};va",
    "r pb={};\nfunction N(a,b,c,d){if(pb.hasOwnProperty(a))throw Error(\"Bin",
    "ary operator already created: \"+a);a=new ob(a,b,c,d);return pb[a.toStr",
    "ing()]=a}N(\"div\",6,1,function(a,b,c){return K(a,c)/K(b,c)});N(\"mod\"",
    ",6,1,function(a,b,c){return K(a,c)%K(b,c)});N(\"*\",6,1,function(a,b,c)",
    "{return K(a,c)*K(b,c)});N(\"+\",5,1,function(a,b,c){return K(a,c)+K(b,c",
    ")});N(\"-\",5,1,function(a,b,c){return K(a,c)-K(b,c)});N(\"<\",4,2,func",
    "tion(a,b,c){return nb(function(a,b){return a<b},a,b,c)});\nN(\">\",4,2,",
    "function(a,b,c){return nb(function(a,b){return a>b},a,b,c)});N(\"<=\",4",
    ",2,function(a,b,c){return nb(function(a,b){return a<=b},a,b,c)});N(\">=",
    "\",4,2,function(a,b,c){return nb(function(a,b){return a>=b},a,b,c)});va",
    "r mb=N(\"=\",3,2,function(a,b,c){return nb(function(a,b){return a==b},a",
    ",b,c,!0)});N(\"!=\",3,2,function(a,b,c){return nb(function(a,b){return ",
    "a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){return kb(a,c)&&kb(b,c)",
    "});N(\"or\",1,2,function(a,b,c){return kb(a,c)||kb(b,c)});function qb(a",
    ",b){if(b.s()&&4!=a.f)throw Error(\"Primary expression must evaluate to ",
    "nodeset if filter has predicate(s).\");I.call(this,a.f);this.ha=a;this.",
    "b=b;this.u=a.c();this.h=a.h}q(qb,I);qb.prototype.evaluate=function(a){a",
    "=this.ha.evaluate(a);return rb(this.b,a)};qb.prototype.toString=functio",
    "n(){var a=\"Filter:\"+J(this.ha);return a+=J(this.b)};function sb(a,b){",
    "if(b.length<a.fa)throw Error(\"Function \"+a.i+\" expects at least\"+a.",
    "fa+\" arguments, \"+b.length+\" given\");if(null!==a.U&&b.length>a.U)th",
    "row Error(\"Function \"+a.i+\" expects at most \"+a.U+\" arguments, \"+",
    "b.length+\" given\");a.ra&&v(b,function(b,d){if(4!=b.f)throw Error(\"Ar",
    "gument \"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b);});I",
    ".call(this,a.f);this.L=a;this.R=b;ib(this,a.u||ta(b,function(a){return ",
    "a.c()}));jb(this,a.pa&&!b.length||a.oa&&!!b.length||ta(b,function(a){re",
    "turn a.h}))}\nq(sb,I);sb.prototype.evaluate=function(a){return this.L.o",
    ".apply(null,wa(a,this.R))};sb.prototype.toString=function(){var a=\"Fun",
    "ction: \"+this.L;if(this.R.length){var b=sa(this.R,function(a,b){return",
    " a+J(b)},\"Arguments:\");a+=J(b)}return a};function tb(a,b,c,d,e,f,g,k)",
    "{this.i=a;this.f=b;this.u=c;this.pa=d;this.oa=!1;this.o=e;this.fa=f;thi",
    "s.U=l(g)?g:f;this.ra=!!k}tb.prototype.toString=function(){return this.i",
    "};var ub={};\nfunction O(a,b,c,d,e,f,g,k){if(ub.hasOwnProperty(a))throw",
    " Error(\"Function already created: \"+a+\".\");ub[a]=new tb(a,b,c,d,e,f",
    ",g,k)}O(\"boolean\",2,!1,!1,function(a,b){return kb(b,a)},1);O(\"ceilin",
    "g\",1,!1,!1,function(a,b){return Math.ceil(K(b,a))},1);O(\"concat\",3,!",
    "1,!1,function(a,b){return sa(ya(arguments,1),function(b,d){return b+M(d",
    ",a)},\"\")},2,null);O(\"contains\",2,!1,!1,function(a,b,c){b=M(b,a);a=M",
    "(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,!1,!1,function(a,b){retu",
    "rn b.evaluate(a).s()},1,1,!0);\nO(\"false\",2,!1,!1,function(){return!1",
    "},0);O(\"floor\",1,!1,!1,function(a,b){return Math.floor(K(b,a))},1);O(",
    "\"id\",4,!1,!1,function(a,b){var c=a.m,d=9==c.nodeType?c:c.ownerDocumen",
    "t;a=M(b,a).split(/\\s+/);var e=[];v(a,function(a){a=d.getElementById(a)",
    ";!a||0<=qa(e,a)||e.push(a)});e.sort(Fa);var f=new G;v(e,function(a){f.a",
    "dd(a)});return f},1);O(\"lang\",2,!1,!1,function(){return!1},1);O(\"las",
    "t\",1,!0,!1,function(a){if(1!=arguments.length)throw Error(\"Function l",
    "ast expects ()\");return a.j},0);\nO(\"local-name\",3,!1,!0,function(a,",
    "b){return(a=b?fb(b.evaluate(a)):a.m)?a.localName||a.nodeName.toLowerCas",
    "e():\"\"},0,1,!0);O(\"name\",3,!1,!0,function(a,b){return(a=b?fb(b.eval",
    "uate(a)):a.m)?a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"namespace-uri",
    "\",3,!0,!1,function(){return\"\"},0,1,!0);O(\"normalize-space\",3,!1,!0",
    ",function(a,b){return(b?M(b,a):F(a.m)).replace(/[\\s\\xa0]+/g,\" \").re",
    "place(/^\\s+|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,!1,function(a,b){return",
    "!kb(b,a)},1);\nO(\"number\",1,!1,!0,function(a,b){return b?K(b,a):+F(a.",
    "m)},0,1);O(\"position\",1,!0,!1,function(a){return a.ua},0);O(\"round\"",
    ",1,!1,!1,function(a,b){return Math.round(K(b,a))},1);O(\"starts-with\",",
    "2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return 0==b.lastIndexOf(a,0)}",
    ",2);O(\"string\",3,!1,!0,function(a,b){return b?M(b,a):F(a.m)},0,1);O(",
    "\"string-length\",1,!1,!0,function(a,b){return(b?M(b,a):F(a.m)).length}",
    ",0,1);\nO(\"substring\",3,!1,!1,function(a,b,c,d){c=K(c,a);if(isNaN(c)|",
    "|Infinity==c||-Infinity==c)return\"\";d=d?K(d,a):Infinity;if(isNaN(d)||",
    "-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=M(b,a)",
    ";return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3)",
    ";O(\"substring-after\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);c=b.in",
    "dexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nO(\"substring-b",
    "efore\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);a=b.indexOf(a);return",
    "-1==a?\"\":b.substring(0,a)},2);O(\"sum\",1,!1,!1,function(a,b){a=b.eva",
    "luate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+F(c);return",
    " b},1,1,!0);O(\"translate\",3,!1,!1,function(a,b,c,d){b=M(b,a);c=M(c,a)",
    ";var e=M(d,a);a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f in a||(a",
    "[f]=e.charAt(d))}c=\"\";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f in a?",
    "a[f]:f;return c},3);O(\"true\",2,!1,!1,function(){return!0},0);function",
    " H(a,b){this.la=a;this.da=l(b)?b:null;this.F=null;switch(a){case \"comm",
    "ent\":this.F=8;break;case \"text\":this.F=3;break;case \"processing-ins",
    "truction\":this.F=7;break;case \"node\":break;default:throw Error(\"Une",
    "xpected argument\");}}function vb(a){return\"comment\"==a||\"text\"==a|",
    "|\"processing-instruction\"==a||\"node\"==a}H.prototype.matches=functio",
    "n(a){return null===this.F||this.F==a.nodeType};H.prototype.getName=func",
    "tion(){return this.la};\nH.prototype.toString=function(){var a=\"Kind T",
    "est: \"+this.la;null===this.da||(a+=J(this.da));return a};function wb(a",
    "){I.call(this,3);this.ka=a.substring(1,a.length-1)}q(wb,I);wb.prototype",
    ".evaluate=function(){return this.ka};wb.prototype.toString=function(){r",
    "eturn\"Literal: \"+this.ka};function xb(a,b){this.i=a.toLowerCase();a=",
    "\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.N=b?b.toLower",
    "Case():a}xb.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!=",
    "b)return!1;b=l(a.localName)?a.localName:a.nodeName;return\"*\"!=this.i&",
    "&this.i!=b.toLowerCase()?!1:\"*\"==this.N?!0:this.N==(a.namespaceURI?a.",
    "namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};xb.protot",
    "ype.getName=function(){return this.i};\nxb.prototype.toString=function(",
    "){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.N?\"\":",
    "this.N+\":\")+this.i};function yb(a){I.call(this,1);this.ma=a}q(yb,I);y",
    "b.prototype.evaluate=function(){return this.ma};yb.prototype.toString=f",
    "unction(){return\"Number: \"+this.ma};function zb(a,b){I.call(this,a.f)",
    ";this.aa=a;this.J=b;this.u=a.c();this.h=a.h;1==this.J.length&&(a=this.J",
    "[0],a.S||a.v!=Ab||(a=a.P,\"*\"!=a.getName()&&(this.I={name:a.getName(),",
    "G:null})))}q(zb,I);function Bb(){I.call(this,4)}q(Bb,I);Bb.prototype.ev",
    "aluate=function(a){var b=new G;a=a.m;9==a.nodeType?b.add(a):b.add(a.own",
    "erDocument);return b};Bb.prototype.toString=function(){return\"Root Hel",
    "per Expression\"};function Cb(){I.call(this,4)}q(Cb,I);Cb.prototype.eva",
    "luate=function(a){var b=new G;b.add(a.m);return b};\nCb.prototype.toStr",
    "ing=function(){return\"Context Helper Expression\"};function Db(a){retu",
    "rn\"/\"==a||\"//\"==a}\nzb.prototype.evaluate=function(a){var b=this.aa",
    ".evaluate(a);if(!(b instanceof G))throw Error(\"Filter expression must ",
    "evaluate to nodeset.\");a=this.J;for(var c=0,d=a.length;c<d&&b.s();c++)",
    "{var e=a[c],f=b.iterator(e.v.D);if(e.c()||e.v!=Eb)if(e.c()||e.v!=Fb){va",
    "r g=f.next();for(b=e.evaluate(new Va(g));null!=(g=f.next());)g=e.evalua",
    "te(new Va(g)),b=eb(b,g)}else g=f.next(),b=e.evaluate(new Va(g));else{fo",
    "r(g=f.next();(b=f.next())&&(!g.contains||g.contains(b))&&b.compareDocum",
    "entPosition(g)&8;g=b);b=e.evaluate(new Va(g))}}return b};\nzb.prototype",
    ".toString=function(){var a=\"Path Expression:\"+J(this.aa);if(this.J.le",
    "ngth){var b=sa(this.J,function(a,b){return a+J(b)},\"Steps:\");a+=J(b)}",
    "return a};function P(a,b){this.b=a;this.D=!!b}function rb(a,b,c){for(c=",
    "c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f=b.s(),g,k=0;g=e",
    ".next();k++){var w=a.D?f-k:k+1;g=d.evaluate(new Va(g,w,f));if(\"number",
    "\"==typeof g)w=w==g;else if(\"string\"==typeof g||\"boolean\"==typeof g",
    ")w=!!g;else if(g instanceof G)w=0<g.s();else throw Error(\"Predicate.ev",
    "aluate returned an unexpected type.\");w||e.remove()}return b}P.prototy",
    "pe.w=function(){return 0<this.b.length?this.b[0].w():null};\nP.prototyp",
    "e.c=function(){for(var a=0;a<this.b.length;a++){var b=this.b[a];if(b.c(",
    ")||1==b.f||0==b.f)return!0}return!1};P.prototype.s=function(){return th",
    "is.b.length};P.prototype.toString=function(){return sa(this.b,function(",
    "a,b){return a+J(b)},\"Predicates:\")};function Q(a,b,c,d){I.call(this,4",
    ");this.v=a;this.P=b;this.b=c||new P([]);this.S=!!d;b=this.b.w();a.va&&b",
    "&&(this.I={name:b.name,G:b.G});this.u=this.b.c()}q(Q,I);\nQ.prototype.e",
    "valuate=function(a){var b=a.m,c=this.w(),d=null,e=null,f=0;c&&(d=c.name",
    ",e=c.G?M(c.G,a):null,f=1);if(this.S)if(this.c()||this.v!=Gb)if(b=(new Q",
    "(Hb,new H(\"node\"))).evaluate(a).iterator(),c=b.next())for(a=this.o(c,",
    "d,e,f);null!=(c=b.next());)a=eb(a,this.o(c,d,e,f));else a=new G;else a=",
    "ab(this.P,b,d,e),a=rb(this.b,a,f);else a=this.o(a.m,d,e,f);return a};Q.",
    "prototype.o=function(a,b,c,d){a=this.v.L(this.P,a,b,c);return a=rb(this",
    ".b,a,d)};\nQ.prototype.toString=function(){var a=\"Step:\"+J(\"Operator",
    ": \"+(this.S?\"//\":\"/\"));this.v.i&&(a+=J(\"Axis: \"+this.v));a+=J(th",
    "is.P);if(this.b.s()){var b=sa(this.b.b,function(a,b){return a+J(b)},\"P",
    "redicates:\");a+=J(b)}return a};function Ib(a,b,c,d){this.i=a;this.L=b;",
    "this.D=c;this.va=d}Ib.prototype.toString=function(){return this.i};var ",
    "Jb={};function R(a,b,c,d){if(Jb.hasOwnProperty(a))throw Error(\"Axis al",
    "ready created: \"+a);b=new Ib(a,b,c,!!d);return Jb[a]=b}\nR(\"ancestor",
    "\",function(a,b){for(var c=new G;b=b.parentNode;)a.matches(b)&&c.unshif",
    "t(b);return c},!0);R(\"ancestor-or-self\",function(a,b){var c=new G;do ",
    "a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);\nvar Ab",
    "=R(\"attribute\",function(a,b){var c=new G,d=a.getName();if(b=b.attribu",
    "tes)if(a instanceof H&&null===a.F||\"*\"==d)for(a=0;d=b[a];a++)c.add(d)",
    ";else(d=b.getNamedItem(d))&&c.add(d);return c},!1),Gb=R(\"child\",funct",
    "ion(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||new G;for(b=b.firstChil",
    "d;b;b=b.nextSibling)$a(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);",
    "R(\"descendant\",ab,!1,!0);\nvar Hb=R(\"descendant-or-self\",function(a",
    ",b,c,d){var e=new G;$a(b,c,d)&&a.matches(b)&&e.add(b);return ab(a,b,c,d",
    ",e)},!1,!0),Eb=R(\"following\",function(a,b,c,d){var e=new G;do for(var",
    " f=b;f=f.nextSibling;)$a(f,c,d)&&a.matches(f)&&e.add(f),e=ab(a,f,c,d,e)",
    ";while(b=b.parentNode);return e},!1,!0);R(\"following-sibling\",functio",
    "n(a,b){for(var c=new G;b=b.nextSibling;)a.matches(b)&&c.add(b);return c",
    "},!1);R(\"namespace\",function(){return new G},!1);\nvar Kb=R(\"parent",
    "\",function(a,b){var c=new G;if(9==b.nodeType)return c;if(2==b.nodeType",
    ")return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);r",
    "eturn c},!1),Fb=R(\"preceding\",function(a,b,c,d){var e=new G,f=[];do f",
    ".unshift(b);while(b=b.parentNode);for(var g=1,k=f.length;g<k;g++){var w",
    "=[];for(b=f[g];b=b.previousSibling;)w.unshift(b);for(var D=0,r=w.length",
    ";D<r;D++)b=w[D],$a(b,c,d)&&a.matches(b)&&e.add(b),e=ab(a,b,c,d,e)}retur",
    "n e},!0,!0);\nR(\"preceding-sibling\",function(a,b){for(var c=new G;b=b",
    ".previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Lb=R(\"s",
    "elf\",function(a,b){var c=new G;a.matches(b)&&c.add(b);return c},!1);fu",
    "nction Mb(a){I.call(this,1);this.$=a;this.u=a.c();this.h=a.h}q(Mb,I);Mb",
    ".prototype.evaluate=function(a){return-K(this.$,a)};Mb.prototype.toStri",
    "ng=function(){return\"Unary Expression: -\"+J(this.$)};function Nb(a){I",
    ".call(this,4);this.O=a;ib(this,ta(this.O,function(a){return a.c()}));jb",
    "(this,ta(this.O,function(a){return a.h}))}q(Nb,I);Nb.prototype.evaluate",
    "=function(a){var b=new G;v(this.O,function(c){c=c.evaluate(a);if(!(c in",
    "stanceof G))throw Error(\"Path expression must evaluate to NodeSet.\");",
    "b=eb(b,c)});return b};Nb.prototype.toString=function(){return sa(this.O",
    ",function(a,b){return a+J(b)},\"Union Expression:\")};function Ob(a,b){",
    "this.a=a;this.sa=b}function Pb(a){for(var b,c=[];;){S(a,\"Missing right",
    " hand side of binary expression.\");b=Qb(a);var d=a.a.next();if(!d)brea",
    "k;var e=(d=pb[d]||null)&&d.ga;if(!e){a.a.back();break}for(;c.length&&e<",
    "=c[c.length-1].ga;)b=new lb(c.pop(),c.pop(),b);c.push(b,d)}for(;c.lengt",
    "h;)b=new lb(c.pop(),c.pop(),b);return b}function S(a,b){if(a.a.empty())",
    "throw Error(b);}function Rb(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad",
    " token, expected: \"+b+\" got: \"+a);}\nfunction Sb(a){a=a.a.next();if(",
    "\")\"!=a)throw Error(\"Bad token: \"+a);}function Tb(a){a=a.a.next();if",
    "(2>a.length)throw Error(\"Unclosed literal string\");return new wb(a)}",
    "\nfunction Ub(a){var b=[];if(Db(E(a.a))){var c=a.a.next();var d=E(a.a);",
    "if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(",
    "?![0-9])[\\w]/.test(d)))return new Bb;d=new Bb;S(a,\"Missing next locat",
    "ion step.\");c=Vb(a,c);b.push(c)}else{a:{c=E(a.a);d=c.charAt(0);switch(",
    "d){case \"$\":throw Error(\"Variable reference not allowed in HTML XPat",
    "h\");case \"(\":a.a.next();c=Pb(a);S(a,'unclosed \"(\"');Rb(a,\")\");br",
    "eak;case '\"':case \"'\":c=Tb(a);break;default:if(isNaN(+c))if(!vb(c)&&",
    "/(?![0-9])[\\w]/.test(d)&&\"(\"==E(a.a,\n1)){c=a.a.next();c=ub[c]||null",
    ";a.a.next();for(d=[];\")\"!=E(a.a);){S(a,\"Missing function argument li",
    "st.\");d.push(Pb(a));if(\",\"!=E(a.a))break;a.a.next()}S(a,\"Unclosed f",
    "unction argument list.\");Sb(a);c=new sb(c,d)}else{c=null;break a}else ",
    "c=new yb(+a.a.next())}\"[\"==E(a.a)&&(d=new P(Wb(a)),c=new qb(c,d))}if(",
    "c)if(Db(E(a.a)))d=c;else return c;else c=Vb(a,\"/\"),d=new Cb,b.push(c)",
    "}for(;Db(E(a.a));)c=a.a.next(),S(a,\"Missing next location step.\"),c=V",
    "b(a,c),b.push(c);return new zb(d,b)}\nfunction Vb(a,b){if(\"/\"!=b&&\"/",
    "/\"!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"==E(a.a",
    ")){var c=new Q(Lb,new H(\"node\"));a.a.next();return c}if(\"..\"==E(a.a",
    "))return c=new Q(Kb,new H(\"node\")),a.a.next(),c;if(\"@\"==E(a.a)){var",
    " d=Ab;a.a.next();S(a,\"Missing attribute name\")}else if(\"::\"==E(a.a,",
    "1)){if(!/(?![0-9])[\\w]/.test(E(a.a).charAt(0)))throw Error(\"Bad token",
    ": \"+a.a.next());var e=a.a.next();d=Jb[e]||null;if(!d)throw Error(\"No ",
    "axis with name: \"+e);a.a.next();S(a,\"Missing node name\")}else d=Gb;e",
    "=\nE(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==E(a.a,1)){",
    "if(!vb(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!vb(e)",
    ")throw Error(\"Invalid type name: \"+e);Rb(a,\"(\");S(a,\"Bad nodetype",
    "\");var f=E(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=Tb(a);S(a,\"Ba",
    "d nodetype\");Sb(a);e=new H(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"",
    "),-1==f)e=new xb(e);else{g=e.substring(0,f);if(\"*\"==g)var k=\"*\";els",
    "e if(k=a.sa(g),!k)throw Error(\"Namespace prefix not declared: \"+g);e=",
    "e.substr(f+1);e=new xb(e,k)}else throw Error(\"Bad token: \"+\na.a.next",
    "());a=new P(Wb(a),d.D);return c||new Q(d,e,a,\"//\"==b)}function Wb(a){",
    "for(var b=[];\"[\"==E(a.a);){a.a.next();S(a,\"Missing predicate express",
    "ion.\");var c=Pb(a);b.push(c);S(a,\"Unclosed predicate expression.\");R",
    "b(a,\"]\")}return b}function Qb(a){if(\"-\"==E(a.a))return a.a.next(),n",
    "ew Mb(Qb(a));var b=Ub(a);if(\"|\"!=E(a.a))a=b;else{for(b=[b];\"|\"==a.a",
    ".next();)S(a,\"Missing next union location path.\"),b.push(Ub(a));a.a.b",
    "ack();a=new Nb(b)}return a};function Xb(a){switch(a.nodeType){case 1:re",
    "turn ja(Yb,a);case 9:return Xb(a.documentElement);case 11:case 10:case ",
    "6:case 12:return Zb;default:return a.parentNode?Xb(a.parentNode):Zb}}fu",
    "nction Zb(){return null}function Yb(a,b){if(a.prefix==b)return a.namesp",
    "aceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"xml",
    "ns:\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.parentN",
    "ode.nodeType?Yb(a.parentNode,b):null};function $b(a,b){if(!a.length)thr",
    "ow Error(\"Empty XPath expression.\");a=Xa(a);if(a.empty())throw Error(",
    "\"Invalid XPath expression.\");b?p(b)||(b=ia(b.lookupNamespaceURI,b)):b",
    "=function(){return null};var c=Pb(new Ob(a,b));if(!a.empty())throw Erro",
    "r(\"Bad token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(ne",
    "w Va(a));return new T(a,b)}}\nfunction T(a,b){if(0==b)if(a instanceof G",
    ")b=4;else if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;",
    "else if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluat",
    "ion result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof G))throw Error(\"val",
    "ue could not be converted to the specified type\");this.resultType=b;sw",
    "itch(b){case 2:this.stringValue=a instanceof G?gb(a):\"\"+a;break;case ",
    "1:this.numberValue=a instanceof G?+gb(a):+a;break;case 3:this.booleanVa",
    "lue=a instanceof G?0<a.s():!!a;break;case 4:case 5:case 6:case 7:var c=",
    "\na.iterator();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.",
    "snapshotLength=a.s();this.invalidIteratorState=!1;break;case 8:case 9:t",
    "his.singleNodeValue=fb(a);break;default:throw Error(\"Unknown XPathResu",
    "lt type.\");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Er",
    "ror(\"iterateNext called with wrong result type\");return f>=d.length?n",
    "ull:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"s",
    "napshotItem called with wrong result type\");return a>=d.length||0>a?nu",
    "ll:d[a]}}\nT.ANY_TYPE=0;T.NUMBER_TYPE=1;T.STRING_TYPE=2;T.BOOLEAN_TYPE=",
    "3;T.UNORDERED_NODE_ITERATOR_TYPE=4;T.ORDERED_NODE_ITERATOR_TYPE=5;T.UNO",
    "RDERED_NODE_SNAPSHOT_TYPE=6;T.ORDERED_NODE_SNAPSHOT_TYPE=7;T.ANY_UNORDE",
    "RED_NODE_TYPE=8;T.FIRST_ORDERED_NODE_TYPE=9;function ac(a){this.lookupN",
    "amespaceURI=Xb(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=",
    "a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathR",
    "esult=T,c.evaluate=function(a,b,c,g){return(new $b(a,c)).evaluate(b,g)}",
    ",c.createExpression=function(a,b){return new $b(a,b)},c.createNSResolve",
    "r=function(a){return new ac(a)}});var U={};U.X=function(){var a={ya:\"h",
    "ttp://www.w3.org/2000/svg\"};return function(b){return a[b]||null}}();",
    "\nU.o=function(a,b,c){var d=z(a);if(!d.documentElement)return null;try{",
    "for(var e=d.createNSResolver?d.createNSResolver(d.documentElement):U.X,",
    "f={},g=d.getElementsByTagName(\"*\"),k=0;k<g.length;++k){var w=g[k],D=w",
    ".namespaceURI;if(D&&!f[D]){var r=w.lookupPrefix(D);if(!r){var A=D.match",
    "(\".*/(\\\\w+)/?$\");r=A?A[1]:\"xhtml\"}f[D]=r}}var L={},W;for(W in f)L",
    "[f[W]]=W;e=function(a){return L[a]||null};try{return d.evaluate(b,a,e,c",
    ",null)}catch(Ha){if(\"TypeError\"===Ha.name)return e=d.createNSResolver",
    "?d.createNSResolver(d.documentElement):\nU.X,d.evaluate(b,a,e,c,null);t",
    "hrow Ha;}}catch(Ha){throw new t(32,\"Unable to locate an element with t",
    "he xpath expression \"+b+\" because of the following error:\\n\"+Ha);}}",
    ";U.Y=function(a,b){if(!a||1!=a.nodeType)throw new t(32,'The result of t",
    "he xpath expression \"'+b+'\" is: '+a+\". It should be an element.\");}",
    ";\nU.A=function(a,b){var c=function(){var c=U.o(b,a,9);return c?c.singl",
    "eNodeValue||null:b.selectSingleNode?(c=z(b),c.setProperty&&c.setPropert",
    "y(\"SelectionLanguage\",\"XPath\"),b.selectSingleNode(a)):null}();null=",
    "==c||U.Y(c,a);return c};\nU.l=function(a,b){var c=function(){var c=U.o(",
    "b,a,7);if(c){for(var e=c.snapshotLength,f=[],g=0;g<e;++g)f.push(c.snaps",
    "hotItem(g));return f}return b.selectNodes?(c=z(b),c.setProperty&&c.setP",
    "roperty(\"SelectionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();v(c,fu",
    "nction(b){U.Y(b,a)});return c};function bc(a,b,c,d){this.top=a;this.rig",
    "ht=b;this.bottom=c;this.left=d}h=bc.prototype;h.clone=function(){return",
    " new bc(this.top,this.right,this.bottom,this.left)};h.toString=function",
    "(){return\"(\"+this.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+",
    "this.left+\"l)\"};h.contains=function(a){return this&&a?a instanceof bc",
    "?a.left>=this.left&&a.right<=this.right&&a.top>=this.top&&a.bottom<=thi",
    "s.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bott",
    "om:!1};\nh.expand=function(a,b,c,d){ea(a)?(this.top-=a.top,this.right+=",
    "a.right,this.bottom+=a.bottom,this.left-=a.left):(this.top-=a,this.righ",
    "t+=Number(b),this.bottom+=Number(c),this.left-=Number(d));return this};",
    "h.ceil=function(){this.top=Math.ceil(this.top);this.right=Math.ceil(thi",
    "s.right);this.bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.le",
    "ft);return this};\nh.floor=function(){this.top=Math.floor(this.top);thi",
    "s.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom);this",
    ".left=Math.floor(this.left);return this};h.round=function(){this.top=Ma",
    "th.round(this.top);this.right=Math.round(this.right);this.bottom=Math.r",
    "ound(this.bottom);this.left=Math.round(this.left);return this};h.transl",
    "ate=function(a,b){a instanceof x?(this.left+=a.x,this.right+=a.x,this.t",
    "op+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this.top+=",
    "b,this.bottom+=b));return this};\nh.scale=function(a,b){b=n(b)?b:a;this",
    ".left*=a;this.right*=a;this.top*=b;this.bottom*=b;return this};function",
    " V(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}h=V.proto",
    "type;h.clone=function(){return new V(this.left,this.top,this.width,this",
    ".height)};h.toString=function(){return\"(\"+this.left+\", \"+this.top+",
    "\" - \"+this.width+\"w x \"+this.height+\"h)\"};h.contains=function(a){",
    "return a instanceof x?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=t",
    "his.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left+this.wi",
    "dth>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a.hei",
    "ght};\nh.ceil=function(){this.left=Math.ceil(this.left);this.top=Math.c",
    "eil(this.top);this.width=Math.ceil(this.width);this.height=Math.ceil(th",
    "is.height);return this};h.floor=function(){this.left=Math.floor(this.le",
    "ft);this.top=Math.floor(this.top);this.width=Math.floor(this.width);thi",
    "s.height=Math.floor(this.height);return this};h.round=function(){this.l",
    "eft=Math.round(this.left);this.top=Math.round(this.top);this.width=Math",
    ".round(this.width);this.height=Math.round(this.height);return this};\nh",
    ".translate=function(a,b){a instanceof x?(this.left+=a.x,this.top+=a.y):",
    "(this.left+=a,n(b)&&(this.top+=b));return this};h.scale=function(a,b){b",
    "=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.height*=b;return ",
    "this};var cc=\"function\"===typeof ShadowRoot;function dc(a){for(a=a.pa",
    "rentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNod",
    "e;return C(a)?a:null}\nfunction X(a,b){b=pa(b);if(\"float\"==b||\"cssFl",
    "oat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a:{var c=b;var d=z(a);if(d.d",
    "efaultView&&d.defaultView.getComputedStyle&&(d=d.defaultView.getCompute",
    "dStyle(a,null))){c=d[c]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c",
    "||ec(a,b);if(null===a)a=null;else if(0<=qa(Na,b)){b:{var e=a.match(Qa);",
    "if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b",
    "&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}",
    "b=null}if(!b)b:{if(d=a.match(Ra))if(b=Number(d[1]),\nc=Number(d[2]),d=N",
    "umber(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break",
    " b}b=null}if(!b)b:{b=a.toLowerCase();c=Ma[b.toLowerCase()];if(!c&&(c=\"",
    "#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&(c=c.replace(Oa,\"#$1$1$2$2$3$3",
    "\")),!Pa.test(c))){b=null;break b}b=[parseInt(c.substr(1,2),16),parseIn",
    "t(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(",
    "\", \")+\")\":a}return a}\nfunction ec(a,b){var c=a.currentStyle||a.sty",
    "le,d=c[b];!l(d)&&p(c.getPropertyValue)&&(d=c.getPropertyValue(b));retur",
    "n\"inherit\"!=d?l(d)?d:null:(a=dc(a))?ec(a,b):null}\nfunction fc(a,b,c)",
    "{function d(a){var b=gc(a);return 0<b.height&&0<b.width?!0:C(a,\"PATH\"",
    ")&&(0<b.height||0<b.width)?(a=X(a,\"stroke-width\"),!!a&&0<parseInt(a,1",
    "0)):\"hidden\"!=X(a,\"overflow\")&&ta(a.childNodes,function(a){return 3",
    "==a.nodeType||C(a)&&d(a)})}function e(a){return hc(a)==Y&&ua(a.childNod",
    "es,function(a){return!C(a)||e(a)||!d(a)})}if(!C(a))throw Error(\"Argume",
    "nt to isShown must be of type Element\");if(C(a,\"BODY\"))return!0;var ",
    "f=dc(a);if(f&&C(f,\"DETAILS\")&&!f.open&&!C(a,\"SUMMARY\"))return!1;if(",
    "C(a,\n\"OPTION\")||C(a,\"OPTGROUP\"))return a=Ja(a,function(a){return C",
    "(a,\"SELECT\")}),!!a&&fc(a,!0,c);if(f=ic(a))return!!f.ba&&0<f.rect.widt",
    "h&&0<f.rect.height&&fc(f.ba,b,c);if(C(a,\"INPUT\")&&\"hidden\"==a.type.",
    "toLowerCase()||C(a,\"NOSCRIPT\"))return!1;f=X(a,\"visibility\");return",
    "\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=jc(a))&&d(a)?!e(a):!1}\nfu",
    "nction kc(a){function b(a){if(C(a)&&\"none\"==X(a,\"display\"))return!1",
    ";a:{var c=a.parentNode;if(a.getDestinationInsertionPoints){var e=a.getD",
    "estinationInsertionPoints();if(0<e.length){a=e[e.length-1];break a}}a=c",
    "&&c.shadowRoot&&void 0!==a.assignedSlot?a.assignedSlot?a.assignedSlot.p",
    "arentNode:null:c}return cc&&a instanceof ShadowRoot||a&&(9==a.nodeType|",
    "|11==a.nodeType)?!0:!!a&&b(a)}return fc(a,!1,b)}var Y=\"hidden\";\nfunc",
    "tion hc(a){function b(a){function b(a){if(a==g)return!0;var b=X(a,\"dis",
    "play\");return 0==b.lastIndexOf(\"inline\",0)||\"contents\"==b||\"absol",
    "ute\"==c&&\"static\"==X(a,\"position\")?!1:!0}var c=X(a,\"position\");i",
    "f(\"fixed\"==c)return D=!0,a==g?null:g;for(a=dc(a);a&&!b(a);)a=dc(a);re",
    "turn a}function c(a){var b=a;if(\"visible\"==w)if(a==g&&k)b=k;else if(a",
    "==k)return{x:\"visible\",y:\"visible\"};b={x:X(b,\"overflow-x\"),y:X(b,",
    "\"overflow-y\")};a==g&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible",
    "\"==b.y?\"auto\":b.y);return b}function d(a){if(a==\ng){var b=(new Aa(f",
    ")).C;a=b.scrollingElement?b.scrollingElement:b.body||b.documentElement;",
    "b=b.parentWindow||b.defaultView;a=new x(b.pageXOffset||a.scrollLeft,b.p",
    "ageYOffset||a.scrollTop)}else a=new x(a.scrollLeft,a.scrollTop);return ",
    "a}var e=lc(a),f=z(a),g=f.documentElement,k=f.body,w=X(g,\"overflow\"),D",
    ";for(a=b(a);a;a=b(a)){var r=c(a);if(\"visible\"!=r.x||\"visible\"!=r.y)",
    "{var A=gc(a);if(0==A.width||0==A.height)return Y;var L=e.right<A.left,W",
    "=e.bottom<A.top;if(L&&\"hidden\"==r.x||W&&\"hidden\"==r.y)return Y;\nif",
    "(L&&\"visible\"!=r.x||W&&\"visible\"!=r.y){L=d(a);W=e.bottom<A.top-L.y;",
    "if(e.right<A.left-L.x&&\"visible\"!=r.x||W&&\"visible\"!=r.x)return Y;e",
    "=hc(a);return e==Y?Y:\"scroll\"}L=e.left>=A.left+A.width;A=e.top>=A.top",
    "+A.height;if(L&&\"hidden\"==r.x||A&&\"hidden\"==r.y)return Y;if(L&&\"vi",
    "sible\"!=r.x||A&&\"visible\"!=r.y){if(D&&(r=d(a),e.left>=g.scrollWidth-",
    "r.x||e.right>=g.scrollHeight-r.y))return Y;e=hc(a);return e==Y?Y:\"scro",
    "ll\"}}}return\"none\"}\nfunction gc(a){var b=ic(a);if(b)return b.rect;i",
    "f(C(a,\"HTML\"))return a=z(a),a=((a?a.parentWindow||a.defaultView:windo",
    "w)||window).document,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a",
    ".body,a=new za(a.clientWidth,a.clientHeight),new V(0,0,a.width,a.height",
    ");try{var c=a.getBoundingClientRect()}catch(d){return new V(0,0,0,0)}re",
    "turn new V(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfunction ic(a)",
    "{var b=C(a,\"MAP\");if(!b&&!C(a,\"AREA\"))return null;var c=b?a:C(a.par",
    "entNode,\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=U.A('/de",
    "scendant::*[@usemap = \"#'+c.name+'\"]',z(c)))&&(e=gc(d),b||\"default\"",
    "==a.shape.toLowerCase()||(a=mc(a),b=Math.min(Math.max(a.left,0),e.width",
    "),c=Math.min(Math.max(a.top,0),e.height),e=new V(b+e.left,c+e.top,Math.",
    "min(a.width,e.width-b),Math.min(a.height,e.height-c))));return{ba:d,rec",
    "t:e||new V(0,0,0,0)}}\nfunction mc(a){var b=a.shape.toLowerCase();a=a.c",
    "oords.split(\",\");if(\"rect\"==b&&4==a.length){b=a[0];var c=a[1];retur",
    "n new V(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],",
    "new V(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){b=a[0];c=a[1];",
    "for(var d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a",
    "[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new V(b,c,d-b,e-c",
    ")}return new V(0,0,0,0)}function lc(a){a=gc(a);return new bc(a.top,a.le",
    "ft+a.width,a.top+a.height,a.left)}\nfunction nc(a){return a.replace(/^[",
    "^\\S\\xa0]+|[^\\S\\xa0]+$/g,\"\")}function oc(a){var b=[];cc?pc(a,b):qc",
    "(a,b);var c=b;a=c.length;b=Array(a);c=m(c)?c.split(\"\"):c;for(var d=0;",
    "d<a;d++)d in c&&(b[d]=nc.call(void 0,c[d]));return nc(b.join(\"\\n\")).",
    "replace(/\\xa0/g,\" \")}\nfunction rc(a,b,c){if(C(a,\"BR\"))b.push(\"\"",
    ");else{var d=C(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=qa(sc,e)),g=l(a.",
    "previousElementSibling)?a.previousElementSibling:Da(a.previousSibling);",
    "g=g?X(g,\"display\"):\"\";var k=X(a,\"float\")||X(a,\"cssFloat\")||X(a,",
    "\"styleFloat\");!f||\"run-in\"==g&&\"none\"==k||/^[\\s\\xa0]*$/.test(b[",
    "b.length-1]||\"\")||b.push(\"\");var w=kc(a),D=null,r=null;w&&(D=X(a,\"",
    "white-space\"),r=X(a,\"text-transform\"));v(a.childNodes,function(a){c(",
    "a,b,w,D,r)});a=b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||na(a)||\n",
    "(b[b.length-1]+=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test(a)&&b.pu",
    "sh(\"\")}}function qc(a,b){rc(a,b,function(a,b,e,f,g){3==a.nodeType&&e?",
    "tc(a,b,f,g):C(a)&&qc(a,b)})}var sc=\"inline inline-block inline-table n",
    "one table-cell table-column table-column-group\".split(\" \");\nfunctio",
    "n tc(a,b,c,d){a=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/g,\"\");a=",
    "a.replace(/(\\r\\n|\\r|\\n)/g,\"\\n\");if(\"normal\"==c||\"nowrap\"==c)",
    "a=a.replace(/\\n/g,\" \");a=\"pre\"==c||\"pre-wrap\"==c?a.replace(/[ ",
    "\\f\\t\\v\\u2028\\u2029]/g,\"\\u00a0\"):a.replace(/[ \\f\\t\\v\\u2028",
    "\\u2029]+/g,\" \");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g,functi",
    "on(a,b,c){return b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUpperCase()",
    ":\"lowercase\"==d&&(a=a.toLowerCase());c=b.pop()||\"\";na(c)&&0==a.last",
    "IndexOf(\" \",0)&&(a=a.substr(1));b.push(c+a)}\nfunction jc(a){var b=1,",
    "c=X(a,\"opacity\");c&&(b=Number(c));(a=dc(a))&&(b*=jc(a));return b}\nfu",
    "nction uc(a,b,c,d,e){if(3==a.nodeType&&c)tc(a,b,d,e);else if(C(a))if(C(",
    "a,\"CONTENT\")||C(a,\"SLOT\")){for(var f=a;f.parentNode;)f=f.parentNode",
    ";f instanceof ShadowRoot?(a=C(a,\"CONTENT\")?a.getDistributedNodes():a.",
    "assignedNodes(),v(a,function(a){uc(a,b,c,d,e)})):pc(a,b)}else if(C(a,\"",
    "SHADOW\")){for(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowR",
    "oot&&(a=f))for(a=a.olderShadowRoot;a;)v(a.childNodes,function(a){uc(a,b",
    ",c,d,e)}),a=a.olderShadowRoot}else pc(a,b)}\nfunction pc(a,b){a.shadowR",
    "oot&&v(a.shadowRoot.childNodes,function(a){uc(a,b,!0,null,null)});rc(a,",
    "b,function(a,b,e,f,g){var c=null;1==a.nodeType?c=a:3==a.nodeType&&(c=a)",
    ";null!=c&&(null!=c.assignedSlot||c.getDestinationInsertionPoints&&0<c.g",
    "etDestinationInsertionPoints().length)||uc(a,b,e,f,g)})};var vc={K:func",
    "tion(a,b){return!(!a.querySelectorAll||!a.querySelector)&&!/^\\d.*/.tes",
    "t(b)},A:function(a,b){var c=y(b),d=m(a)?c.C.getElementById(a):a;return ",
    "d?Sa(d,\"id\")==a&&b!=d&&Ea(b,d)?d:va(B(c,\"*\"),function(c){return Sa(",
    "c,\"id\")==a&&b!=c&&Ea(b,c)}):null},l:function(a,b){if(!a)return[];if(v",
    "c.K(b,a))try{return b.querySelectorAll(\"#\"+vc.na(a))}catch(c){return[",
    "]}b=B(y(b),\"*\",null,b);return ra(b,function(b){return Sa(b,\"id\")==a",
    "})},na:function(a){return a.replace(/([\\s'\"\\\\#.:;,!?+<>=~*^$|%&@`{}",
    "\\-\\/\\[\\]\\(\\)])/g,\n\"\\\\$1\")}};var Z={},wc={};Z.ja=function(a,b",
    ",c){try{var d=La.l(\"a\",b)}catch(e){d=B(y(b),\"A\",null,b)}return va(d",
    ",function(b){b=oc(b);b=b.replace(/^[\\s]+|[\\s]+$/g,\"\");return c&&-1!",
    "=b.indexOf(a)||b==a})};Z.ea=function(a,b,c){try{var d=La.l(\"a\",b)}cat",
    "ch(e){d=B(y(b),\"A\",null,b)}return ra(d,function(b){b=oc(b);b=b.replac",
    "e(/^[\\s]+|[\\s]+$/g,\"\");return c&&-1!=b.indexOf(a)||b==a})};Z.A=func",
    "tion(a,b){return Z.ja(a,b,!1)};Z.l=function(a,b){return Z.ea(a,b,!1)};w",
    "c.A=function(a,b){return Z.ja(a,b,!0)};\nwc.l=function(a,b){return Z.ea",
    "(a,b,!0)};var xc={A:function(a,b){if(\"\"===a)throw new t(32,'Unable to",
    " locate an element with the tagName \"\"');return b.getElementsByTagNam",
    "e(a)[0]||null},l:function(a,b){if(\"\"===a)throw new t(32,'Unable to lo",
    "cate an element with the tagName \"\"');return b.getElementsByTagName(a",
    ")}};var yc={className:Ka,\"class name\":Ka,css:La,\"css selector\":La,i",
    "d:vc,linkText:Z,\"link text\":Z,name:{A:function(a,b){b=B(y(b),\"*\",nu",
    "ll,b);return va(b,function(b){return Sa(b,\"name\")==a})},l:function(a,",
    "b){b=B(y(b),\"*\",null,b);return ra(b,function(b){return Sa(b,\"name\")",
    "==a})}},partialLinkText:wc,\"partial link text\":wc,tagName:xc,\"tag na",
    "me\":xc,xpath:U};ba(\"_\",function(a,b){a:{for(c in a)if(a.hasOwnProper",
    "ty(c))break a;var c=null}if(c){var d=yc[c];if(d&&p(d.l))return d.l(a[c]",
    ",b||ka.document)}throw new t(61,\"Unsupported locator strategy: \"+c);}",
    ");; return this._.apply(null,arguments);}.apply({navigator:typeof windo",
    "w!='undefined'?window.navigator:null,document:typeof window!='undefined",
    "'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_EFFECTIVE_STYLE[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof Array)return\"array\";if(a instanceof Object)return b;var c=Object",
    ".prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";",
    "if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ha(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a,b){function c(){}c.prototype=b.prototype;a.na=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=function(a,",
    "c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};function ia(a){retu",
    "rn String(a).replace(/\\-([a-z])/g,function(a,c){return c.toUpperCase()",
    "})};function ja(a,b){if(h(a))return h(b)&&1==b.length?a.indexOf(b,0):-1",
    ";for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}funct",
    "ion m(a,b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d",
    "&&b.call(void 0,d[e],e,a)}function n(a,b,c){var d=c;m(a,function(c,f){d",
    "=b.call(void 0,d,c,f,a)});return d}function p(a,b){for(var c=a.length,d",
    "=h(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))re",
    "turn!0;return!1}function ka(a){return Array.prototype.concat.apply([],a",
    "rguments)}\nfunction la(a,b,c){return 2>=arguments.length?Array.prototy",
    "pe.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var na={aliceblue",
    ":\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#00ffff\",aquamarine:\"#7f",
    "ffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#",
    "000000\",blanchedalmond:\"#ffebcd\",blue:\"#0000ff\",blueviolet:\"#8a2b",
    "e2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cadetblue:\"#5f9ea0\",char",
    "treuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"#ff7f50\",cornflowerbl",
    "ue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#00ffff",
    "\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",",
    "darkgray:\"#a9a9a9\",darkgreen:\"#006400\",\ndarkgrey:\"#a9a9a9\",darkk",
    "haki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolivegreen:\"#556b2f\",dar",
    "korange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred:\"#8b0000\",darksalm",
    "on:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darks",
    "lategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",darkturquoise:\"#00ced1",
    "\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",",
    "dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:\"#1e90ff\",firebric",
    "k:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:",
    "\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhite:\"#f8f8ff\",gold:\"#ffd7",
    "00\",goldenrod:\"#daa520\",gray:\"#808080\",green:\"#008000\",greenyell",
    "ow:\"#adff2f\",grey:\"#808080\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4",
    "\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#",
    "f0e68c\",lavender:\"#e6e6fa\",lavenderblush:\"#fff0f5\",lawngreen:\"#7c",
    "fc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e6\",lightcoral:\"#f08",
    "080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:\"#fafad2\",lightgray:",
    "\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey:\"#d3d3d3\",lightpink:\"#f",
    "fb6c1\",lightsalmon:\"#ffa07a\",\nlightseagreen:\"#20b2aa\",lightskyblu",
    "e:\"#87cefa\",lightslategray:\"#778899\",lightslategrey:\"#778899\",lig",
    "htsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",lime:\"#00ff00\",limegr",
    "een:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff00ff\",maroon:\"#800000",
    "\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#0000cd\",mediumorchid:\"#",
    "ba55d3\",mediumpurple:\"#9370db\",mediumseagreen:\"#3cb371\",mediumslat",
    "eblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",mediumturquoise:\"#48d1",
    "cc\",mediumvioletred:\"#c71585\",midnightblue:\"#191970\",mintcream:\"#",
    "f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#ffe4b5\",navajowhite:\"#ff",
    "dead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive:\"#808000\",olivedrab",
    ":\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff4500\",orchid:\"#da70d6",
    "\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\",paleturquoise:\"#afe",
    "eee\",palevioletred:\"#db7093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffd",
    "ab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#",
    "b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",royal",
    "blue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"#fa8072\",sandybrown:",
    "\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:\"#fff5ee\",sienna:\"#a0522",
    "d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slateblue:\"#6a5acd\",slateg",
    "ray:\"#708090\",slategrey:\"#708090\",snow:\"#fffafa\",springgreen:\"#0",
    "0ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:",
    "\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\"",
    ",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#f",
    "fff00\",yellowgreen:\"#9acd32\"};var oa=\"backgroundColor borderTopColo",
    "r borderRightColor borderBottomColor borderLeftColor color outlineColor",
    "\".split(\" \"),pa=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,qa=/^#(?:",
    "[0-9a-f]{3}){1,2}$/i,ra=/^(?:rgba)?\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(",
    "\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,sa=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),",
    "\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$/i;function ta(a,b){if(!",
    "a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);",
    "if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.co",
    "mpareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}",
    "\nfunction ua(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return",
    " a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNo",
    "de&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType",
    ";if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.pare",
    "ntNode;return e==f?va(a,b):!c&&ta(e,b)?-1*wa(a,b):!d&&ta(f,a)?wa(b,a):(",
    "c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.n",
    "odeType?a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a)",
    ";c.collapse(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);retu",
    "rn c.compareBoundaryPoints(aa.Range.START_TO_END,a)}function wa(a,b){va",
    "r c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;",
    "return va(b,a)}function va(a,b){for(;b=b.previousSibling;)if(b==a)retur",
    "n-1;return 1};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs",
    ", Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby grante",
    "d, free of charge, to any person obtaining a copy\n of this software an",
    "d associated documentation files (the \"Software\"), to\n deal in the S",
    "oftware without restriction, including without limitation the\n rights ",
    "to use, copy, modify, merge, publish, distribute, sublicense, and/or\n ",
    "sell copies of the Software, and to permit persons to whom the Software",
    " is\n furnished to do so, subject to the following conditions:\n\n The ",
    "above copyright notice and this permission notice shall be included in",
    "\n all copies or substantial portions of the Software.\n\n THE SOFTWARE",
    " IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPL",
    "IED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n ",
    "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL",
    " THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR",
    " OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE",
    ", ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE ",
    "OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction q(a,b,c){this.l=a;th",
    "is.ka=b||1;this.j=c||1};function r(a){this.S=a;this.I=0}function xa(a){",
    "a=a.match(ya);for(var b=0;b<a.length;b++)za.test(a[b])&&a.splice(b,1);r",
    "eturn new r(a)}var ya=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9",
    "-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^",
    "\"]*\"|'[^']*'|[!<>]=|\\s+|./g,za=/^\\s/;function t(a,b){return a.S[a.I",
    "+(b||0)]}r.prototype.next=function(){return this.S[this.I++]};r.prototy",
    "pe.back=function(){this.I--};r.prototype.empty=function(){return this.S",
    ".length<=this.I};function u(a){var b=null,c=a.nodeType;1==c&&(b=a.textC",
    "ontent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);",
    "if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.first",
    "Child;c=0;var d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[",
    "c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b",
    "=a.nodeValue;return\"\"+b}\nfunction v(a,b,c){if(null===b)return!0;try{",
    "if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAtt",
    "ribute(b):a.getAttribute(b,2)==c}function w(a,b,c,d,e){return Aa.call(n",
    "ull,a,b,h(c)?c:null,h(d)?d:null,e||new x)}\nfunction Aa(a,b,c,d,e){b.ge",
    "tElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),m(b,function(",
    "b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?",
    "(b=b.getElementsByClassName(d),m(b,function(b){b.className==d&&a.matche",
    "s(b)&&e.add(b)})):a instanceof y?Ba(a,b,c,d,e):b.getElementsByTagName&&",
    "(b=b.getElementsByTagName(a.getName()),m(b,function(a){v(a,c,d)&&e.add(",
    "a)}));return e}function Ba(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibl",
    "ing)v(b,c,d)&&a.matches(b)&&e.add(b),Ba(a,b,c,d,e)};function x(){this.j",
    "=this.g=null;this.D=0}function Ca(a){this.node=a;this.next=this.w=null}",
    "function Da(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(",
    "var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<ua(c.no",
    "de,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++",
    ";for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}x.pro",
    "totype.unshift=function(a){a=new Ca(a);a.next=this.g;this.j?this.g.w=a:",
    "this.g=this.j=a;this.g=a;this.D++};\nx.prototype.add=function(a){a=new ",
    "Ca(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++",
    "};function A(a){return(a=a.g)?a.node:null}x.prototype.m=function(){retu",
    "rn this.D};function B(a){return(a=A(a))?u(a):\"\"}x.prototype.iterator=",
    "function(a){return new Ea(this,!!a)};function Ea(a,b){this.ga=a;this.T=",
    "(this.A=b)?a.j:a.g;this.O=null}Ea.prototype.next=function(){var a=this.",
    "T;if(null==a)return null;var b=this.O=a;this.T=this.A?a.w:a.next;return",
    " b.node};\nEa.prototype.remove=function(){var a=this.ga,b=this.O;if(!b)",
    "throw Error(\"Next must be called at least once before remove.\");var c",
    "=b.w;b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};functio",
    "n C(a){this.f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n ",
    " \"+a.toString().split(\"\\n\").join(\"\\n  \")}C.prototype.c=function(",
    "){return this.o};function Fa(a,b){a.o=b}function Ga(a,b){a.h=b}C.protot",
    "ype.u=function(){return this.F};function E(a,b){a=a.evaluate(b);return ",
    "a instanceof x?+B(a):+a}function F(a,b){a=a.evaluate(b);return a instan",
    "ceof x?B(a):\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof ",
    "x?!!a.m():!!a};function H(a,b,c){C.call(this,a.f);this.R=a;this.W=b;thi",
    "s.aa=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.R==Ha&&(c.h||c.c()||4==",
    "c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c",
    ".u().name,C:b}):this.F={name:b.u().name,C:c})}k(H,C);\nfunction I(a,b,c",
    ",d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof x&&c instan",
    "ceof x){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f",
    "=e.next();f;f=e.next())if(a(u(d),u(f)))return!0;return!1}if(b instanceo",
    "f x||c instanceof x){b instanceof x?(e=b,d=c):(e=c,d=b);f=e.iterator();",
    "for(var g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l",
    "=+u(l);break;case \"boolean\":l=!!u(l);break;case \"string\":l=u(l);bre",
    "ak;default:throw Error(\"Illegal primitive type for comparison.\");\n}i",
    "f(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==ty",
    "peof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number",
    "\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){",
    "return this.R.v(this.W,this.aa,a)};H.prototype.toString=function(){var ",
    "a=\"Binary Expression: \"+this.R;a+=D(this.W);return a+=D(this.aa)};fun",
    "ction Ia(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}Ia.prototype.toS",
    "tring=function(){return this.ja};var Ja={};\nfunction J(a,b,c,d){if(Ja.",
    "hasOwnProperty(a))throw Error(\"Binary operator already created: \"+a);",
    "a=new Ia(a,b,c,d);return Ja[a.toString()]=a}J(\"div\",6,1,function(a,b,",
    "c){return E(a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E",
    "(b,c)});J(\"*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,",
    "function(a,b,c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){retu",
    "rn E(a,c)-E(b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){r",
    "eturn a<b},a,b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b",
    "){return a>b},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a",
    ",b){return a<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(functio",
    "n(a,b){return a>=b},a,b,c)});var Ha=J(\"=\",3,2,function(a,b,c){return ",
    "I(function(a,b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){r",
    "eturn I(function(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a",
    ",b,c){return G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c",
    ")||G(b,c)});function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expr",
    "ession must evaluate to nodeset if filter has predicate(s).\");C.call(t",
    "his,a.f);this.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K,C);K.prototype.e",
    "valuate=function(a){a=this.$.evaluate(a);return Ka(this.b,a)};K.prototy",
    "pe.toString=function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)}",
    ";function L(a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expec",
    "ts at least\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&",
    "b.length>a.P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\"",
    " arguments, \"+b.length+\" given\");a.ha&&m(b,function(b,d){if(4!=b.f)t",
    "hrow Error(\"Argument \"+d+\" to function \"+a.i+\" is not of type Node",
    "set: \"+b);});C.call(this,a.f);this.H=a;this.M=b;Fa(this,a.o||p(b,funct",
    "ion(a){return a.c()}));Ga(this,a.fa&&!b.length||a.ea&&!!b.length||p(b,f",
    "unction(a){return a.h}))}\nk(L,C);L.prototype.evaluate=function(a){retu",
    "rn this.H.v.apply(null,ka(a,this.M))};L.prototype.toString=function(){v",
    "ar a=\"Function: \"+this.H;if(this.M.length){var b=n(this.M,function(a,",
    "b){return a+D(b)},\"Arguments:\");a+=D(b)}return a};function La(a,b,c,d",
    ",e,f,g,l){this.i=a;this.f=b;this.o=c;this.fa=d;this.ea=!1;this.v=e;this",
    ".Y=f;this.P=void 0!==g?g:f;this.ha=!!l}La.prototype.toString=function()",
    "{return this.i};var Ma={};\nfunction M(a,b,c,d,e,f,g,l){if(Ma.hasOwnPro",
    "perty(a))throw Error(\"Function already created: \"+a+\".\");Ma[a]=new ",
    "La(a,b,c,d,e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},",
    "1);M(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(",
    "\"concat\",3,!1,!1,function(a,b){return n(la(arguments,1),function(b,d)",
    "{return b+F(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c)",
    "{b=F(b,a);a=F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,funct",
    "ion(a,b){return b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,functi",
    "on(){return!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E",
    "(b,a))},1);M(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c",
    ".ownerDocument;a=F(b,a).split(/\\s+/);var e=[];m(a,function(a){a=d.getE",
    "lementById(a);!a||0<=ja(e,a)||e.push(a)});e.sort(ua);var f=new x;m(e,fu",
    "nction(a){f.add(a)});return f},1);M(\"lang\",2,!1,!1,function(){return!",
    "1},1);M(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Error",
    "(\"Function last expects ()\");return a.j},0);\nM(\"local-name\",3,!1,!",
    "0,function(a,b){return(a=b?A(b.evaluate(a)):a.l)?a.localName||a.nodeNam",
    "e.toLowerCase():\"\"},0,1,!0);M(\"name\",3,!1,!0,function(a,b){return(a",
    "=b?A(b.evaluate(a)):a.l)?a.nodeName.toLowerCase():\"\"},0,1,!0);M(\"nam",
    "espace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);M(\"normalize-space",
    "\",3,!1,!0,function(a,b){return(b?F(b,a):u(a.l)).replace(/[\\s\\xa0]+/g",
    ",\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);M(\"not\",2,!1,!1,function(a",
    ",b){return!G(b,a)},1);\nM(\"number\",1,!1,!0,function(a,b){return b?E(b",
    ",a):+u(a.l)},0,1);M(\"position\",1,!0,!1,function(a){return a.ka},0);M(",
    "\"round\",1,!1,!1,function(a,b){return Math.round(E(b,a))},1);M(\"start",
    "s-with\",2,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);return 0==b.lastInde",
    "xOf(a,0)},2);M(\"string\",3,!1,!0,function(a,b){return b?F(b,a):u(a.l)}",
    ",0,1);M(\"string-length\",1,!1,!0,function(a,b){return(b?F(b,a):u(a.l))",
    ".length},0,1);\nM(\"substring\",3,!1,!1,function(a,b,c,d){c=E(c,a);if(i",
    "sNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?E(d,a):Infinity;if(is",
    "NaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);",
    "a=F(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d",
    "))},2,3);M(\"substring-after\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a",
    ");c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nM(\"sub",
    "string-before\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a",
    ");return-1==a?\"\":b.substring(0,a)},2);M(\"sum\",1,!1,!1,function(a,b)",
    "{a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+u(c",
    ");return b},1,1,!0);M(\"translate\",3,!1,!1,function(a,b,c,d){b=F(b,a);",
    "c=F(c,a);var e=F(d,a);a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f ",
    "in a||(a[f]=e.charAt(d))}c=\"\";for(d=0;d<b.length;d++)f=b.charAt(d),c+",
    "=f in a?a[f]:f;return c},3);M(\"true\",2,!1,!1,function(){return!0},0);",
    "function y(a,b){this.ca=a;this.X=void 0!==b?b:null;this.B=null;switch(a",
    "){case \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"p",
    "rocessing-instruction\":this.B=7;break;case \"node\":break;default:thro",
    "w Error(\"Unexpected argument\");}}function Na(a){return\"comment\"==a|",
    "|\"text\"==a||\"processing-instruction\"==a||\"node\"==a}y.prototype.ma",
    "tches=function(a){return null===this.B||this.B==a.nodeType};y.prototype",
    ".getName=function(){return this.ca};\ny.prototype.toString=function(){v",
    "ar a=\"Kind Test: \"+this.ca;null===this.X||(a+=D(this.X));return a};fu",
    "nction N(a){C.call(this,3);this.ba=a.substring(1,a.length-1)}k(N,C);N.p",
    "rototype.evaluate=function(){return this.ba};N.prototype.toString=funct",
    "ion(){return\"Literal: \"+this.ba};function O(a,b){this.i=a.toLowerCase",
    "();a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.J=b?b.to",
    "LowerCase():a}O.prototype.matches=function(a){var b=a.nodeType;if(1!=b&",
    "&2!=b)return!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*",
    "\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.J?!0:this.J==(a.name",
    "spaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")",
    "};O.prototype.getName=function(){return this.i};\nO.prototype.toString=",
    "function(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==thi",
    "s.J?\"\":this.J+\":\")+this.i};function P(a){C.call(this,1);this.da=a}k",
    "(P,C);P.prototype.evaluate=function(){return this.da};P.prototype.toStr",
    "ing=function(){return\"Number: \"+this.da};function Q(a,b){C.call(this,",
    "a.f);this.V=a;this.G=b;this.o=a.c();this.h=a.h;1==this.G.length&&(a=thi",
    "s.G[0],a.N||a.s!=Oa||(a=a.L,\"*\"!=a.getName()&&(this.F={name:a.getName",
    "(),C:null})))}k(Q,C);function R(){C.call(this,4)}k(R,C);R.prototype.eva",
    "luate=function(a){var b=new x;a=a.l;9==a.nodeType?b.add(a):b.add(a.owne",
    "rDocument);return b};R.prototype.toString=function(){return\"Root Helpe",
    "r Expression\"};function S(){C.call(this,4)}k(S,C);S.prototype.evaluate",
    "=function(a){var b=new x;b.add(a.l);return b};\nS.prototype.toString=fu",
    "nction(){return\"Context Helper Expression\"};function Pa(a){return\"/",
    "\"==a||\"//\"==a}\nQ.prototype.evaluate=function(a){var b=this.V.evalua",
    "te(a);if(!(b instanceof x))throw Error(\"Filter expression must evaluat",
    "e to nodeset.\");a=this.G;for(var c=0,d=a.length;c<d&&b.m();c++){var e=",
    "a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=Qa)if(e.c()||e.s!=Ra){var g=f.n",
    "ext();for(b=e.evaluate(new q(g));null!=(g=f.next());)g=e.evaluate(new q",
    "(g)),b=Da(b,g)}else g=f.next(),b=e.evaluate(new q(g));else{for(g=f.next",
    "();(b=f.next())&&(!g.contains||g.contains(b))&&b.compareDocumentPositio",
    "n(g)&8;g=b);b=e.evaluate(new q(g))}}return b};\nQ.prototype.toString=fu",
    "nction(){var a=\"Path Expression:\"+D(this.V);if(this.G.length){var b=n",
    "(this.G,function(a,b){return a+D(b)},\"Steps:\");a+=D(b)}return a};func",
    "tion T(a,b){this.b=a;this.A=!!b}function Ka(a,b,c){for(c=c||0;c<a.b.len",
    "gth;c++)for(var d=a.b[c],e=b.iterator(),f=b.m(),g,l=0;g=e.next();l++){v",
    "ar z=a.A?f-l:l+1;g=d.evaluate(new q(g,z,f));if(\"number\"==typeof g)z=z",
    "==g;else if(\"string\"==typeof g||\"boolean\"==typeof g)z=!!g;else if(g",
    " instanceof x)z=0<g.m();else throw Error(\"Predicate.evaluate returned ",
    "an unexpected type.\");z||e.remove()}return b}T.prototype.u=function(){",
    "return 0<this.b.length?this.b[0].u():null};\nT.prototype.c=function(){f",
    "or(var a=0;a<this.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.",
    "f)return!0}return!1};T.prototype.m=function(){return this.b.length};T.p",
    "rototype.toString=function(){return n(this.b,function(a,b){return a+D(b",
    ")},\"Predicates:\")};function U(a,b,c,d){C.call(this,4);this.s=a;this.L",
    "=b;this.b=c||new T([]);this.N=!!d;b=this.b.u();a.la&&b&&(this.F={name:b",
    ".name,C:b.C});this.o=this.b.c()}k(U,C);\nU.prototype.evaluate=function(",
    "a){var b=a.l,c=this.u(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?F(c.C,a):n",
    "ull,f=1);if(this.N)if(this.c()||this.s!=Sa)if(b=(new U(Ta,new y(\"node",
    "\"))).evaluate(a).iterator(),c=b.next())for(a=this.v(c,d,e,f);null!=(c=",
    "b.next());)a=Da(a,this.v(c,d,e,f));else a=new x;else a=w(this.L,b,d,e),",
    "a=Ka(this.b,a,f);else a=this.v(a.l,d,e,f);return a};U.prototype.v=funct",
    "ion(a,b,c,d){a=this.s.H(this.L,a,b,c);return a=Ka(this.b,a,d)};\nU.prot",
    "otype.toString=function(){var a=\"Step:\"+D(\"Operator: \"+(this.N?\"//",
    "\":\"/\"));this.s.i&&(a+=D(\"Axis: \"+this.s));a+=D(this.L);if(this.b.m",
    "()){var b=n(this.b.b,function(a,b){return a+D(b)},\"Predicates:\");a+=D",
    "(b)}return a};function Ua(a,b,c,d){this.i=a;this.H=b;this.A=c;this.la=d",
    "}Ua.prototype.toString=function(){return this.i};var Va={};function V(a",
    ",b,c,d){if(Va.hasOwnProperty(a))throw Error(\"Axis already created: \"+",
    "a);b=new Ua(a,b,c,!!d);return Va[a]=b}\nV(\"ancestor\",function(a,b){fo",
    "r(var c=new x;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);",
    "V(\"ancestor-or-self\",function(a,b){var c=new x;do a.matches(b)&&c.uns",
    "hift(b);while(b=b.parentNode);return c},!0);\nvar Oa=V(\"attribute\",fu",
    "nction(a,b){var c=new x,d=a.getName();if(b=b.attributes)if(a instanceof",
    " y&&null===a.B||\"*\"==d)for(a=0;d=b[a];a++)c.add(d);else(d=b.getNamedI",
    "tem(d))&&c.add(d);return c},!1),Sa=V(\"child\",function(a,b,c,d,e){c=h(",
    "c)?c:null;d=h(d)?d:null;e=e||new x;for(b=b.firstChild;b;b=b.nextSibling",
    ")v(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);V(\"descendant\",w,!",
    "1,!0);\nvar Ta=V(\"descendant-or-self\",function(a,b,c,d){var e=new x;v",
    "(b,c,d)&&a.matches(b)&&e.add(b);return w(a,b,c,d,e)},!1,!0),Qa=V(\"foll",
    "owing\",function(a,b,c,d){var e=new x;do for(var f=b;f=f.nextSibling;)v",
    "(f,c,d)&&a.matches(f)&&e.add(f),e=w(a,f,c,d,e);while(b=b.parentNode);re",
    "turn e},!1,!0);V(\"following-sibling\",function(a,b){for(var c=new x;b=",
    "b.nextSibling;)a.matches(b)&&c.add(b);return c},!1);V(\"namespace\",fun",
    "ction(){return new x},!1);\nvar Wa=V(\"parent\",function(a,b){var c=new",
    " x;if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerEleme",
    "nt),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},!1),Ra=V(\"preced",
    "ing\",function(a,b,c,d){var e=new x,f=[];do f.unshift(b);while(b=b.pare",
    "ntNode);for(var g=1,l=f.length;g<l;g++){var z=[];for(b=f[g];b=b.previou",
    "sSibling;)z.unshift(b);for(var ma=0,jb=z.length;ma<jb;ma++)b=z[ma],v(b,",
    "c,d)&&a.matches(b)&&e.add(b),e=w(a,b,c,d,e)}return e},!0,!0);\nV(\"prec",
    "eding-sibling\",function(a,b){for(var c=new x;b=b.previousSibling;)a.ma",
    "tches(b)&&c.unshift(b);return c},!0);var Xa=V(\"self\",function(a,b){va",
    "r c=new x;a.matches(b)&&c.add(b);return c},!1);function W(a){C.call(thi",
    "s,1);this.U=a;this.o=a.c();this.h=a.h}k(W,C);W.prototype.evaluate=funct",
    "ion(a){return-E(this.U,a)};W.prototype.toString=function(){return\"Unar",
    "y Expression: -\"+D(this.U)};function X(a){C.call(this,4);this.K=a;Fa(t",
    "his,p(this.K,function(a){return a.c()}));Ga(this,p(this.K,function(a){r",
    "eturn a.h}))}k(X,C);X.prototype.evaluate=function(a){var b=new x;m(this",
    ".K,function(c){c=c.evaluate(a);if(!(c instanceof x))throw Error(\"Path ",
    "expression must evaluate to NodeSet.\");b=Da(b,c)});return b};X.prototy",
    "pe.toString=function(){return n(this.K,function(a,b){return a+D(b)},\"U",
    "nion Expression:\")};function Ya(a,b){this.a=a;this.ia=b}function Za(a)",
    "{for(var b,c=[];;){Y(a,\"Missing right hand side of binary expression.",
    "\");b=$a(a);var d=a.a.next();if(!d)break;var e=(d=Ja[d]||null)&&d.Z;if(",
    "!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].Z;)b=new H(c.pop()",
    ",c.pop(),b);c.push(b,d)}for(;c.length;)b=new H(c.pop(),c.pop(),b);retur",
    "n b}function Y(a,b){if(a.a.empty())throw Error(b);}function ab(a,b){a=a",
    ".a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a)",
    ";}\nfunction bb(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"",
    "+a);}function cb(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed l",
    "iteral string\");return new N(a)}\nfunction db(a){var b=[];if(Pa(t(a.a)",
    ")){var c=a.a.next();var d=t(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&",
    "\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new R;",
    "d=new R;Y(a,\"Missing next location step.\");c=eb(a,c);b.push(c)}else{a",
    ":{c=t(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable re",
    "ference not allowed in HTML XPath\");case \"(\":a.a.next();c=Za(a);Y(a,",
    "'unclosed \"(\"');ab(a,\")\");break;case '\"':case \"'\":c=cb(a);break;",
    "default:if(isNaN(+c))if(!Na(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==t(a.a,",
    "\n1)){c=a.a.next();c=Ma[c]||null;a.a.next();for(d=[];\")\"!=t(a.a);){Y(",
    "a,\"Missing function argument list.\");d.push(Za(a));if(\",\"!=t(a.a))b",
    "reak;a.a.next()}Y(a,\"Unclosed function argument list.\");bb(a);c=new L",
    "(c,d)}else{c=null;break a}else c=new P(+a.a.next())}\"[\"==t(a.a)&&(d=n",
    "ew T(fb(a)),c=new K(c,d))}if(c)if(Pa(t(a.a)))d=c;else return c;else c=e",
    "b(a,\"/\"),d=new S,b.push(c)}for(;Pa(t(a.a));)c=a.a.next(),Y(a,\"Missin",
    "g next location step.\"),c=eb(a,c),b.push(c);return new Q(d,b)}\nfuncti",
    "on eb(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" ",
    "or \"//\"');if(\".\"==t(a.a)){var c=new U(Xa,new y(\"node\"));a.a.next(",
    ");return c}if(\"..\"==t(a.a))return c=new U(Wa,new y(\"node\")),a.a.nex",
    "t(),c;if(\"@\"==t(a.a)){var d=Oa;a.a.next();Y(a,\"Missing attribute nam",
    "e\")}else if(\"::\"==t(a.a,1)){if(!/(?![0-9])[\\w]/.test(t(a.a).charAt(",
    "0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=Va[e]||n",
    "ull;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();Y(a,\"Missi",
    "ng node name\")}else d=Sa;e=\nt(a.a);if(/(?![0-9])[\\w\\*]/.test(e.char",
    "At(0)))if(\"(\"==t(a.a,1)){if(!Na(e))throw Error(\"Invalid node type: ",
    "\"+e);e=a.a.next();if(!Na(e))throw Error(\"Invalid type name: \"+e);ab(",
    "a,\"(\");Y(a,\"Bad nodetype\");var f=t(a.a).charAt(0),g=null;if('\"'==f",
    "||\"'\"==f)g=cb(a);Y(a,\"Bad nodetype\");bb(a);e=new y(e,g)}else if(e=a",
    ".a.next(),f=e.indexOf(\":\"),-1==f)e=new O(e);else{g=e.substring(0,f);i",
    "f(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l)throw Error(\"Namespace pre",
    "fix not declared: \"+g);e=e.substr(f+1);e=new O(e,l)}else throw Error(",
    "\"Bad token: \"+\na.a.next());a=new T(fb(a),d.A);return c||new U(d,e,a,",
    "\"//\"==b)}function fb(a){for(var b=[];\"[\"==t(a.a);){a.a.next();Y(a,",
    "\"Missing predicate expression.\");var c=Za(a);b.push(c);Y(a,\"Unclosed",
    " predicate expression.\");ab(a,\"]\")}return b}function $a(a){if(\"-\"=",
    "=t(a.a))return a.a.next(),new W($a(a));var b=db(a);if(\"|\"!=t(a.a))a=b",
    ";else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing next union location pa",
    "th.\"),b.push(db(a));a.a.back();a=new X(b)}return a};function gb(a){swi",
    "tch(a.nodeType){case 1:return ha(hb,a);case 9:return gb(a.documentEleme",
    "nt);case 11:case 10:case 6:case 12:return ib;default:return a.parentNod",
    "e?gb(a.parentNode):ib}}function ib(){return null}function hb(a,b){if(a.",
    "prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c",
    "=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a",
    ".parentNode&&9!=a.parentNode.nodeType?hb(a.parentNode,b):null};function",
    " kb(a,b){if(!a.length)throw Error(\"Empty XPath expression.\");a=xa(a);",
    "if(a.empty())throw Error(\"Invalid XPath expression.\");b?\"function\"=",
    "=ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=function(){return null};var c=",
    "Za(new Ya(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.next());thi",
    "s.evaluate=function(a,b){a=c.evaluate(new q(a));return new Z(a,b)}}\nfu",
    "nction Z(a,b){if(0==b)if(a instanceof x)b=4;else if(\"string\"==typeof ",
    "a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=",
    "3;else throw Error(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!",
    "=b&&!(a instanceof x))throw Error(\"value could not be converted to the",
    " specified type\");this.resultType=b;switch(b){case 2:this.stringValue=",
    "a instanceof x?B(a):\"\"+a;break;case 1:this.numberValue=a instanceof x",
    "?+B(a):+a;break;case 3:this.booleanValue=a instanceof x?0<a.m():!!a;bre",
    "ak;case 4:case 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=",
    "c.next();e;e=c.next())d.push(e);this.snapshotLength=a.m();this.invalidI",
    "teratorState=!1;break;case 8:case 9:this.singleNodeValue=A(a);break;def",
    "ault:throw Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNe",
    "xt=function(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong",
    " result type\");return f>=d.length?null:d[f++]};this.snapshotItem=funct",
    "ion(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong resul",
    "t type\");return a>=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=0;Z.NUMBER_TY",
    "PE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITERATOR_TYPE=4;",
    "Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_TYPE=6;Z.ORDER",
    "ED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRST_ORDERED_NOD",
    "E_TYPE=9;function lb(a){this.lookupNamespaceURI=gb(a)}\nba(\"wgxpath.in",
    "stall\",function(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a",
    ".document;if(!c.evaluate||b)a.XPathResult=Z,c.evaluate=function(a,b,c,g",
    "){return(new kb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){r",
    "eturn new kb(a,b)},c.createNSResolver=function(a){return new lb(a)}});f",
    "unction mb(a,b){var c=a.currentStyle||a.style,d=c[b];void 0===d&&\"func",
    "tion\"==ca(c.getPropertyValue)&&(d=c.getPropertyValue(b));if(\"inherit",
    "\"!=d)return void 0!==d?d:null;var e;for(a=a.parentNode;a&&1!=a.nodeTyp",
    "e&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;e&&\"string\"!==typeof",
    " e&&(e=e.toString());return(e=!a||1!=a.nodeType||e&&a.tagName.toUpperCa",
    "se()!=e?null:a)?mb(e,b):null};ba(\"_\",function(a,b){b=ia(b);if(\"float",
    "\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a:{var c=b;var",
    " d=9==a.nodeType?a:a.ownerDocument||a.document;if(d.defaultView&&d.defa",
    "ultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){c",
    "=d[c]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c||mb(a,b);if(null=",
    "==a)a=null;else if(0<=ja(oa,b)){b:{var e=a.match(ra);if(e&&(b=Number(e[",
    "1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&25",
    "5>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=\nnull}if(!b)b:{",
    "if(d=a.match(sa))if(b=Number(d[1]),c=Number(d[2]),d=Number(d[3]),0<=b&&",
    "255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:",
    "{b=a.toLowerCase();c=na[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b",
    ":\"#\"+b,4==c.length&&(c=c.replace(pa,\"#$1$1$2$2$3$3\")),!qa.test(c)))",
    "{b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16",
    "),parseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}re",
    "turn a});; return this._.apply(null,arguments);}.apply({navigator:typeo",
    "f window!='undefined'?window.navigator:null,document:typeof window!='un",
    "defined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_LOCATION[] = {
    "function(){return function(){var d,h=this;\nfunction k(a){var b=typeof ",
    "a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";if(a ins",
    "tanceof Object)return b;var e=Object.prototype.toString.call(a);if(\"[o",
    "bject Window]\"==e)return\"object\";if(\"[object Array]\"==e||\"number",
    "\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typ",
    "eof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\"))return",
    "\"array\";if(\"[object Function]\"==e||\"undefined\"!=typeof a.call&&\"",
    "undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"c",
    "all\"))return\"function\"}else return\"null\";else if(\"function\"==\nb",
    "&&\"undefined\"==typeof a.call)return\"object\";return b}function l(a){",
    "var b=k(a);return\"array\"==b||\"object\"==b&&\"number\"==typeof a.leng",
    "th}function m(a){var b=typeof a;return\"object\"==b&&null!=a||\"functio",
    "n\"==b};var n;function q(a,b){for(var e=a.length,c=\"string\"==typeof a",
    "?a.split(\"\"):a,g=0;g<e;g++)g in c&&b.call(void 0,c[g],g,a)}function r",
    "(a){var b=a.length;if(0<b){for(var e=Array(b),c=0;c<b;c++)e[c]=a[c];ret",
    "urn e}return[]};function t(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b",
    "?b:0}d=t.prototype;d.clone=function(){return new t(this.x,this.y)};d.to",
    "String=function(){return\"(\"+this.x+\", \"+this.y+\")\"};d.ceil=functi",
    "on(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};d.f",
    "loor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);ret",
    "urn this};d.round=function(){this.x=Math.round(this.x);this.y=Math.roun",
    "d(this.y);return this};\nd.translate=function(a,b){a instanceof t?(this",
    ".x+=a.x,this.y+=a.y):(this.x+=Number(a),\"number\"==typeof b&&(this.y+=",
    "b));return this};d.scale=function(a,b){this.x*=a;this.y*=\"number\"==ty",
    "peof b?b:a;return this};function u(a,b,e){function c(c){c&&b.appendChil",
    "d(\"string\"==typeof c?a.createTextNode(c):c)}for(var g=1;g<e.length;g+",
    "+){var f=e[g];if(!l(f)||m(f)&&0<f.nodeType)c(f);else{a:{if(f&&\"number",
    "\"==typeof f.length){if(m(f)){var p=\"function\"==typeof f.item||\"stri",
    "ng\"==typeof f.item;break a}if(\"function\"==k(f)){p=\"function\"==type",
    "of f.item;break a}}p=!1}q(p?r(f):f,c)}}}function v(a){return 9==a.nodeT",
    "ype?a:a.ownerDocument||a.document}function w(a){this.a=a||h.document||d",
    "ocument}d=w.prototype;\nd.getElementsByTagName=function(a,b){return(b||",
    "this.a).getElementsByTagName(String(a))};d.createElement=function(a){re",
    "turn this.a.createElement(String(a))};d.createTextNode=function(a){retu",
    "rn this.a.createTextNode(String(a))};d.appendChild=function(a,b){a.appe",
    "ndChild(b)};d.append=function(a,b){u(v(a),a,arguments)};d.canHaveChildr",
    "en=function(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLE",
    "T\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND",
    "\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT",
    "\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case ",
    "\"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PAR",
    "AM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case",
    " \"WBR\":return!1}return!0};\nd.removeNode=function(a){return a&&a.pare",
    "ntNode?a.parentNode.removeChild(a):null};d.contains=function(a,b){if(!a",
    "||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);i",
    "f(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.com",
    "pareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a};f",
    "unction x(a){var b=v(a),e=new t(0,0);if(a==(b?v(b):document).documentEl",
    "ement)return e;a:{try{var c=a.getBoundingClientRect()}catch(g){a={left:",
    "0,top:0,right:0,bottom:0};break a}a=c}c=(b?new w(v(b)):n||(n=new w)).a;",
    "b=c.scrollingElement?c.scrollingElement:c.body||c.documentElement;c=c.p",
    "arentWindow||c.defaultView;b=new t(c.pageXOffset||b.scrollLeft,c.pageYO",
    "ffset||b.scrollTop);e.x=a.left+b.x;e.y=a.top+b.y;return e}var y=[\"_\"]",
    ",z=h;y[0]in z||!z.execScript||z.execScript(\"var \"+y[0]);\nfor(var A;y",
    ".length&&(A=y.shift());)y.length||void 0===x?z=z[A]&&z[A]!==Object.prot",
    "otype[A]?z[A]:z[A]={}:z[A]=x;; return this._.apply(null,arguments);}.ap",
    "ply({navigator:typeof window!='undefined'?window.navigator:null,documen",
    "t:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SIZE[] = {
    "function(){return function(){var c;function d(a,b){this.width=a;this.he",
    "ight=b}c=d.prototype;c.clone=function(){return new d(this.width,this.he",
    "ight)};c.toString=function(){return\"(\"+this.width+\" x \"+this.height",
    "+\")\"};c.aspectRatio=function(){return this.width/this.height};c.ceil=",
    "function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.",
    "height);return this};c.floor=function(){this.width=Math.floor(this.widt",
    "h);this.height=Math.floor(this.height);return this};\nc.round=function(",
    "){this.width=Math.round(this.width);this.height=Math.round(this.height)",
    ";return this};c.scale=function(a,b){this.width*=a;this.height*=\"number",
    "\"==typeof b?b:a;return this};function e(a){var b=a.offsetWidth,h=a.off",
    "setHeight;if((void 0===b||!b&&!h)&&a.getBoundingClientRect){a:{try{var ",
    "k=a.getBoundingClientRect()}catch(m){a={left:0,top:0,right:0,bottom:0};",
    "break a}a=k}return new d(a.right-a.left,a.bottom-a.top)}return new d(b,",
    "h)};function f(a){b:{var b=9==a.nodeType?a:a.ownerDocument||a.document;",
    "if(b.defaultView&&b.defaultView.getComputedStyle&&(b=b.defaultView.getC",
    "omputedStyle(a,null))){b=b.display||b.getPropertyValue(\"display\")||\"",
    "\";break b}b=\"\"}if(\"none\"!=(b||(a.currentStyle?a.currentStyle.displ",
    "ay:null)||a.style&&a.style.display))a=e(a);else{b=a.style;var h=b.displ",
    "ay,k=b.visibility,m=b.position;b.visibility=\"hidden\";b.position=\"abs",
    "olute\";b.display=\"inline\";a=e(a);b.display=h;b.position=m;b.visibili",
    "ty=k}return a}\nvar g=[\"_\"],l=this;g[0]in l||!l.execScript||l.execScr",
    "ipt(\"var \"+g[0]);for(var n;g.length&&(n=g.shift());)g.length||void 0=",
    "==f?l=l[n]&&l[n]!==Object.prototype[n]?l[n]:l[n]={}:l[n]=f;; return thi",
    "s._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'",
    "?window.navigator:null,document:typeof window!='undefined'?window.docum",
    "ent:null}, arguments);}",
    NULL
};

const char* const IS_DISPLAYED[] = {
    "function(){return function(){var h,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ha(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ia(a,b,c){ia=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ha;return",
    " ia.apply(null,arguments)}\nfunction ja(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.pa=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.oa=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ka(a){return String(a).replace(/\\-([a-z])/g,function(a,c){",
    "return c.toUpperCase()})};function la(a,b){if(m(a))return m(b)&&1==b.le",
    "ngth?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)r",
    "eturn c;return-1}function q(a,b){for(var c=a.length,d=m(a)?a.split(\"\"",
    "):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function t(a,b,c){var d",
    "=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function u(a,b",
    "){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.ca",
    "ll(void 0,d[e],e,a))return!0;return!1}\nfunction ma(a,b){for(var c=a.le",
    "ngth,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],",
    "e,a))return!1;return!0}function na(a){return Array.prototype.concat.app",
    "ly([],arguments)}function oa(a){var b=a.length;if(0<b){for(var c=Array(",
    "b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function pa(a,b,c){return 2>",
    "=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice",
    ".call(a,b,c)};var qa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aq",
    "ua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc",
    "\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue",
    ":\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb8",
    "87\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\"",
    ",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crim",
    "son:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8",
    "b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400",
    "\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\"",
    ",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc",
    "\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",",
    "darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f",
    "4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1",
    "493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",d",
    "odgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",for",
    "estgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostw",
    "hite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080",
    "\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:",
    "\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082",
    "\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblu",
    "sh:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue",
    ":\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenro",
    "dyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightg",
    "rey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightse",
    "agreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",",
    "lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ff",
    "ffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta",
    ":\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue",
    ":\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumse",
    "agreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00f",
    "a9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightb",
    "lue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:",
    "\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6",
    "\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered",
    ":\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#",
    "98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip",
    ":\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",pl",
    "um:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000",
    "\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",",
    "salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashe",
    "ll:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb",
    "\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",sn",
    "ow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b",
    "48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise",
    ":\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whi",
    "tesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var ra=",
    "\"backgroundColor borderTopColor borderRightColor borderBottomColor bor",
    "derLeftColor color outlineColor\".split(\" \"),sa=/#([0-9a-fA-F])([0-9a",
    "-fA-F])([0-9a-fA-F])/,ta=/^#(?:[0-9a-f]{3}){1,2}$/i,ua=/^(?:rgba)?\\((",
    "\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,va=/^(",
    "?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})",
    "\\)$/i;function wa(a,b){this.code=a;this.state=v[a]||xa;this.message=b|",
    "|\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.to",
    "UpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.inde",
    "xOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.na",
    "me=this.name;this.stack=a.stack||\"\"}p(wa,Error);var xa=\"unknown erro",
    "r\",v={15:\"element not selectable\",11:\"element not visible\"};v[31]=",
    "xa;v[30]=xa;v[24]=\"invalid cookie domain\";v[29]=\"invalid element coo",
    "rdinates\";v[12]=\"invalid element state\";\nv[32]=\"invalid selector\"",
    ";v[51]=\"invalid selector\";v[52]=\"invalid selector\";v[17]=\"javascri",
    "pt error\";v[405]=\"unsupported operation\";v[34]=\"move target out of ",
    "bounds\";v[27]=\"no such alert\";v[7]=\"no such element\";v[8]=\"no suc",
    "h frame\";v[23]=\"no such window\";v[28]=\"script timeout\";v[33]=\"ses",
    "sion not created\";v[10]=\"stale element reference\";v[21]=\"timeout\";",
    "v[25]=\"unable to set cookie\";v[26]=\"unexpected alert open\";v[13]=xa",
    ";v[9]=\"unknown command\";wa.prototype.toString=function(){return this.",
    "name+\": \"+this.message};function x(a,b){this.x=k(a)?a:0;this.y=k(b)?b",
    ":0}h=x.prototype;h.clone=function(){return new x(this.x,this.y)};h.toSt",
    "ring=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function",
    "(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.flo",
    "or=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);retur",
    "n this};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(",
    "this.y);return this};\nh.translate=function(a,b){a instanceof x?(this.x",
    "+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h",
    ".scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};functi",
    "on ya(a,b){this.width=a;this.height=b}h=ya.prototype;h.clone=function()",
    "{return new ya(this.width,this.height)};h.toString=function(){return\"(",
    "\"+this.width+\" x \"+this.height+\")\"};h.aspectRatio=function(){retur",
    "n this.width/this.height};h.ceil=function(){this.width=Math.ceil(this.w",
    "idth);this.height=Math.ceil(this.height);return this};h.floor=function(",
    "){this.width=Math.floor(this.width);this.height=Math.floor(this.height)",
    ";return this};\nh.round=function(){this.width=Math.round(this.width);th",
    "is.height=Math.round(this.height);return this};h.scale=function(a,b){b=",
    "n(b)?b:a;this.width*=a;this.height*=b;return this};function za(a,b,c){f",
    "unction d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e",
    "<c.length;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):q(Aa(f)?oa(f",
    "):f,d)}}function Ba(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeTyp",
    "e)return a==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocument",
    "Position)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;",
    ")b=b.parentNode;return b==a}\nfunction Ca(a,b){if(a==b)return 0;if(a.co",
    "mpareDocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"s",
    "ourceIndex\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1",
    "==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex",
    ";var e=a.parentNode,f=b.parentNode;return e==f?Da(a,b):!c&&Ba(e,b)?-1*E",
    "a(a,b):!d&&Ba(f,a)?Ea(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceI",
    "ndex:f.sourceIndex)}d=z(a);c=d.createRange();c.selectNode(a);c.collapse",
    "(!0);a=d.createRange();a.selectNode(b);\na.collapse(!0);return c.compar",
    "eBoundaryPoints(aa.Range.START_TO_END,a)}function Ea(a,b){var c=a.paren",
    "tNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Da(b",
    ",a)}function Da(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return ",
    "1}function z(a){return 9==a.nodeType?a:a.ownerDocument||a.document}func",
    "tion Aa(a){if(a&&\"number\"==typeof a.length){if(ea(a))return\"function",
    "\"==typeof a.item||\"string\"==typeof a.item;if(\"function\"==ca(a))ret",
    "urn\"function\"==typeof a.item}return!1}\nfunction Fa(a,b){a&&(a=a.pare",
    "ntNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}return null",
    "}function Ga(a){this.H=a||aa.document||document}h=Ga.prototype;h.getEle",
    "mentsByTagName=function(a,b){return(b||this.H).getElementsByTagName(Str",
    "ing(a))};h.createElement=function(a){return this.H.createElement(String",
    "(a))};h.createTextNode=function(a){return this.H.createTextNode(String(",
    "a))};h.appendChild=function(a,b){a.appendChild(b)};h.append=function(a,",
    "b){za(z(a),a,arguments)};\nh.canHaveChildren=function(a){if(1!=a.nodeTy",
    "pe)return!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"BASE",
    "\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"FRAM",
    "E\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"ISIN",
    "DEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\"",
    ":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case \"SO",
    "URCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0};h.",
    "removeNode=function(a){return a&&a.parentNode?a.parentNode.removeChild(",
    "a):null};\nh.contains=Ba;function A(a,b){b&&\"string\"!==typeof b&&(b=b",
    ".toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)",
    "};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Cop",
    "yright (c) 2012 Google Inc.\n\n Permission is hereby granted, free of c",
    "harge, to any person obtaining a copy\n of this software and associated",
    " documentation files (the \"Software\"), to\n deal in the Software with",
    "out restriction, including without limitation the\n rights to use, copy",
    ", modify, merge, publish, distribute, sublicense, and/or\n sell copies ",
    "of the Software, and to permit persons to whom the Software is\n furnis",
    "hed to do so, subject to the following conditions:\n\n The above copyri",
    "ght notice and this permission notice shall be included in\n all copies",
    " or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED ",
    "\"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDIN",
    "G BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A",
    " PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHOR",
    "S OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIAB",
    "ILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n F",
    "ROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL",
    "INGS\n IN THE SOFTWARE.\n*/\nfunction B(a,b,c){this.l=a;this.ma=b||1;th",
    "is.j=c||1};function Ha(a){this.T=a;this.J=0}function Ia(a){a=a.match(Ja",
    ");for(var b=0;b<a.length;b++)Ka.test(a[b])&&a.splice(b,1);return new Ha",
    "(a)}var Ja=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:",
    "\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[",
    "^']*'|[!<>]=|\\s+|./g,Ka=/^\\s/;function C(a,b){return a.T[a.J+(b||0)]}",
    "Ha.prototype.next=function(){return this.T[this.J++]};Ha.prototype.back",
    "=function(){this.J--};Ha.prototype.empty=function(){return this.T.lengt",
    "h<=this.J};function D(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent",
    ",b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"s",
    "tring\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;",
    "c=0;var d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a",
    ";while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nod",
    "eValue;return\"\"+b}\nfunction F(a,b,c){if(null===b)return!0;try{if(!a.",
    "getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttribute",
    "(b):a.getAttribute(b,2)==c}function La(a,b,c,d,e){return Ma.call(null,a",
    ",b,m(c)?c:null,m(d)?d:null,e||new G)}\nfunction Ma(a,b,c,d,e){b.getElem",
    "entsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),q(b,function(b){a.",
    "matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.",
    "getElementsByClassName(d),q(b,function(b){b.className==d&&a.matches(b)&",
    "&e.add(b)})):a instanceof H?Na(a,b,c,d,e):b.getElementsByTagName&&(b=b.",
    "getElementsByTagName(a.getName()),q(b,function(a){F(a,c,d)&&e.add(a)}))",
    ";return e}function Na(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)F",
    "(b,c,d)&&a.matches(b)&&e.add(b),Na(a,b,c,d,e)};function G(){this.j=this",
    ".g=null;this.D=0}function Oa(a){this.node=a;this.next=this.w=null}funct",
    "ion Pa(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d",
    "=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<Ca(c.node,b.",
    "node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(",
    "e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}G.prototyp",
    "e.unshift=function(a){a=new Oa(a);a.next=this.g;this.j?this.g.w=a:this.",
    "g=this.j=a;this.g=a;this.D++};\nG.prototype.add=function(a){a=new Oa(a)",
    ";a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};fun",
    "ction Qa(a){return(a=a.g)?a.node:null}G.prototype.m=function(){return t",
    "his.D};function Ra(a){return(a=Qa(a))?D(a):\"\"}G.prototype.iterator=fu",
    "nction(a){return new Sa(this,!!a)};function Sa(a,b){this.ia=a;this.U=(t",
    "his.A=b)?a.j:a.g;this.P=null}Sa.prototype.next=function(){var a=this.U;",
    "if(null==a)return null;var b=this.P=a;this.U=this.A?a.w:a.next;return b",
    ".node};\nSa.prototype.remove=function(){var a=this.ia,b=this.P;if(!b)th",
    "row Error(\"Next must be called at least once before remove.\");var c=b",
    ".w;b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.P=null};function ",
    "I(a){this.f=a;this.h=this.o=!1;this.F=null}function K(a){return\"\\n  ",
    "\"+a.toString().split(\"\\n\").join(\"\\n  \")}I.prototype.c=function()",
    "{return this.o};function Ta(a,b){a.o=b}function Ua(a,b){a.h=b}I.prototy",
    "pe.u=function(){return this.F};function L(a,b){a=a.evaluate(b);return a",
    " instanceof G?+Ra(a):+a}function M(a,b){a=a.evaluate(b);return a instan",
    "ceof G?Ra(a):\"\"+a}function O(a,b){a=a.evaluate(b);return a instanceof",
    " G?!!a.m():!!a};function Va(a,b,c){I.call(this,a.f);this.S=a;this.Y=b;t",
    "his.ca=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.S==Wa&&(c.h||c.c()||4",
    "==c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name",
    ":c.u().name,C:b}):this.F={name:b.u().name,C:c})}p(Va,I);\nfunction P(a,",
    "b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof G&&c ins",
    "tanceof G){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(",
    "),f=e.next();f;f=e.next())if(a(D(d),D(f)))return!0;return!1}if(b instan",
    "ceof G||c instanceof G){b instanceof G?(e=b,d=c):(e=c,d=b);f=e.iterator",
    "();for(var g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"number",
    "\":l=+D(l);break;case \"boolean\":l=!!D(l);break;case \"string\":l=D(l)",
    ";break;default:throw Error(\"Illegal primitive type for comparison.\");",
    "\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"",
    "==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"nu",
    "mber\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}Va.prototype.evaluate=functio",
    "n(a){return this.S.v(this.Y,this.ca,a)};Va.prototype.toString=function(",
    "){var a=\"Binary Expression: \"+this.S;a+=K(this.Y);return a+=K(this.ca",
    ")};function Xa(a,b,c,d){this.la=a;this.aa=b;this.f=c;this.v=d}Xa.protot",
    "ype.toString=function(){return this.la};var Ya={};\nfunction Q(a,b,c,d)",
    "{if(Ya.hasOwnProperty(a))throw Error(\"Binary operator already created:",
    " \"+a);a=new Xa(a,b,c,d);return Ya[a.toString()]=a}Q(\"div\",6,1,functi",
    "on(a,b,c){return L(a,c)/L(b,c)});Q(\"mod\",6,1,function(a,b,c){return L",
    "(a,c)%L(b,c)});Q(\"*\",6,1,function(a,b,c){return L(a,c)*L(b,c)});Q(\"+",
    "\",5,1,function(a,b,c){return L(a,c)+L(b,c)});Q(\"-\",5,1,function(a,b,",
    "c){return L(a,c)-L(b,c)});Q(\"<\",4,2,function(a,b,c){return P(function",
    "(a,b){return a<b},a,b,c)});\nQ(\">\",4,2,function(a,b,c){return P(funct",
    "ion(a,b){return a>b},a,b,c)});Q(\"<=\",4,2,function(a,b,c){return P(fun",
    "ction(a,b){return a<=b},a,b,c)});Q(\">=\",4,2,function(a,b,c){return P(",
    "function(a,b){return a>=b},a,b,c)});var Wa=Q(\"=\",3,2,function(a,b,c){",
    "return P(function(a,b){return a==b},a,b,c,!0)});Q(\"!=\",3,2,function(a",
    ",b,c){return P(function(a,b){return a!=b},a,b,c,!0)});Q(\"and\",2,2,fun",
    "ction(a,b,c){return O(a,c)&&O(b,c)});Q(\"or\",1,2,function(a,b,c){retur",
    "n O(a,c)||O(b,c)});function Za(a,b){if(b.m()&&4!=a.f)throw Error(\"Prim",
    "ary expression must evaluate to nodeset if filter has predicate(s).\");",
    "I.call(this,a.f);this.ba=a;this.b=b;this.o=a.c();this.h=a.h}p(Za,I);Za.",
    "prototype.evaluate=function(a){a=this.ba.evaluate(a);return $a(this.b,a",
    ")};Za.prototype.toString=function(){var a=\"Filter:\"+K(this.ba);return",
    " a+=K(this.b)};function ab(a,b){if(b.length<a.$)throw Error(\"Function ",
    "\"+a.i+\" expects at least\"+a.$+\" arguments, \"+b.length+\" given\");",
    "if(null!==a.R&&b.length>a.R)throw Error(\"Function \"+a.i+\" expects at",
    " most \"+a.R+\" arguments, \"+b.length+\" given\");a.ja&&q(b,function(b",
    ",d){if(4!=b.f)throw Error(\"Argument \"+d+\" to function \"+a.i+\" is n",
    "ot of type Nodeset: \"+b);});I.call(this,a.f);this.I=a;this.N=b;Ta(this",
    ",a.o||u(b,function(a){return a.c()}));Ua(this,a.ha&&!b.length||a.ga&&!!",
    "b.length||u(b,function(a){return a.h}))}\np(ab,I);ab.prototype.evaluate",
    "=function(a){return this.I.v.apply(null,na(a,this.N))};ab.prototype.toS",
    "tring=function(){var a=\"Function: \"+this.I;if(this.N.length){var b=t(",
    "this.N,function(a,b){return a+K(b)},\"Arguments:\");a+=K(b)}return a};f",
    "unction bb(a,b,c,d,e,f,g,l){this.i=a;this.f=b;this.o=c;this.ha=d;this.g",
    "a=!1;this.v=e;this.$=f;this.R=k(g)?g:f;this.ja=!!l}bb.prototype.toStrin",
    "g=function(){return this.i};var cb={};\nfunction R(a,b,c,d,e,f,g,l){if(",
    "cb.hasOwnProperty(a))throw Error(\"Function already created: \"+a+\".\"",
    ");cb[a]=new bb(a,b,c,d,e,f,g,l)}R(\"boolean\",2,!1,!1,function(a,b){ret",
    "urn O(b,a)},1);R(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(L(b",
    ",a))},1);R(\"concat\",3,!1,!1,function(a,b){return t(pa(arguments,1),fu",
    "nction(b,d){return b+M(d,a)},\"\")},2,null);R(\"contains\",2,!1,!1,func",
    "tion(a,b,c){b=M(b,a);a=M(c,a);return-1!=b.indexOf(a)},2);R(\"count\",1,",
    "!1,!1,function(a,b){return b.evaluate(a).m()},1,1,!0);\nR(\"false\",2,!",
    "1,!1,function(){return!1},0);R(\"floor\",1,!1,!1,function(a,b){return M",
    "ath.floor(L(b,a))},1);R(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.n",
    "odeType?c:c.ownerDocument;a=M(b,a).split(/\\s+/);var e=[];q(a,function(",
    "a){a=d.getElementById(a);!a||0<=la(e,a)||e.push(a)});e.sort(Ca);var f=n",
    "ew G;q(e,function(a){f.add(a)});return f},1);R(\"lang\",2,!1,!1,functio",
    "n(){return!1},1);R(\"last\",1,!0,!1,function(a){if(1!=arguments.length)",
    "throw Error(\"Function last expects ()\");return a.j},0);\nR(\"local-na",
    "me\",3,!1,!0,function(a,b){return(a=b?Qa(b.evaluate(a)):a.l)?a.localNam",
    "e||a.nodeName.toLowerCase():\"\"},0,1,!0);R(\"name\",3,!1,!0,function(a",
    ",b){return(a=b?Qa(b.evaluate(a)):a.l)?a.nodeName.toLowerCase():\"\"},0,",
    "1,!0);R(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);R(\"no",
    "rmalize-space\",3,!1,!0,function(a,b){return(b?M(b,a):D(a.l)).replace(/",
    "[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);R(\"not\",2,!1,",
    "!1,function(a,b){return!O(b,a)},1);\nR(\"number\",1,!1,!0,function(a,b)",
    "{return b?L(b,a):+D(a.l)},0,1);R(\"position\",1,!0,!1,function(a){retur",
    "n a.ma},0);R(\"round\",1,!1,!1,function(a,b){return Math.round(L(b,a))}",
    ",1);R(\"starts-with\",2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return ",
    "0==b.lastIndexOf(a,0)},2);R(\"string\",3,!1,!0,function(a,b){return b?M",
    "(b,a):D(a.l)},0,1);R(\"string-length\",1,!1,!0,function(a,b){return(b?M",
    "(b,a):D(a.l)).length},0,1);\nR(\"substring\",3,!1,!1,function(a,b,c,d){",
    "c=L(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?L(d,a):I",
    "nfinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=M",
    "ath.max(c,0);a=M(b,a);return Infinity==d?a.substring(e):a.substring(e,c",
    "+Math.round(d))},2,3);R(\"substring-after\",3,!1,!1,function(a,b,c){b=M",
    "(b,a);a=M(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)}",
    ",2);\nR(\"substring-before\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);",
    "a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);R(\"sum\",1,!1,!1,",
    "function(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.n",
    "ext())b+=+D(c);return b},1,1,!0);R(\"translate\",3,!1,!1,function(a,b,c",
    ",d){b=M(b,a);c=M(c,a);var e=M(d,a);a={};for(d=0;d<c.length;d++){var f=c",
    ".charAt(d);f in a||(a[f]=e.charAt(d))}c=\"\";for(d=0;d<b.length;d++)f=b",
    ".charAt(d),c+=f in a?a[f]:f;return c},3);R(\"true\",2,!1,!1,function(){",
    "return!0},0);function H(a,b){this.ea=a;this.Z=k(b)?b:null;this.B=null;s",
    "witch(a){case \"comment\":this.B=8;break;case \"text\":this.B=3;break;c",
    "ase \"processing-instruction\":this.B=7;break;case \"node\":break;defau",
    "lt:throw Error(\"Unexpected argument\");}}function db(a){return\"commen",
    "t\"==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==a}H.proto",
    "type.matches=function(a){return null===this.B||this.B==a.nodeType};H.pr",
    "ototype.getName=function(){return this.ea};\nH.prototype.toString=funct",
    "ion(){var a=\"Kind Test: \"+this.ea;null===this.Z||(a+=K(this.Z));retur",
    "n a};function eb(a){I.call(this,3);this.da=a.substring(1,a.length-1)}p(",
    "eb,I);eb.prototype.evaluate=function(){return this.da};eb.prototype.toS",
    "tring=function(){return\"Literal: \"+this.da};function fb(a,b){this.i=a",
    ".toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";t",
    "his.K=b?b.toLowerCase():a}fb.prototype.matches=function(a){var b=a.node",
    "Type;if(1!=b&&2!=b)return!1;b=k(a.localName)?a.localName:a.nodeName;ret",
    "urn\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.K?!0:this.K==(",
    "a.namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xh",
    "tml\")};fb.prototype.getName=function(){return this.i};\nfb.prototype.t",
    "oString=function(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtm",
    "l\"==this.K?\"\":this.K+\":\")+this.i};function gb(a){I.call(this,1);th",
    "is.fa=a}p(gb,I);gb.prototype.evaluate=function(){return this.fa};gb.pro",
    "totype.toString=function(){return\"Number: \"+this.fa};function hb(a,b)",
    "{I.call(this,a.f);this.W=a;this.G=b;this.o=a.c();this.h=a.h;1==this.G.l",
    "ength&&(a=this.G[0],a.O||a.s!=ib||(a=a.M,\"*\"!=a.getName()&&(this.F={n",
    "ame:a.getName(),C:null})))}p(hb,I);function jb(){I.call(this,4)}p(jb,I)",
    ";jb.prototype.evaluate=function(a){var b=new G;a=a.l;9==a.nodeType?b.ad",
    "d(a):b.add(a.ownerDocument);return b};jb.prototype.toString=function(){",
    "return\"Root Helper Expression\"};function kb(){I.call(this,4)}p(kb,I);",
    "kb.prototype.evaluate=function(a){var b=new G;b.add(a.l);return b};\nkb",
    ".prototype.toString=function(){return\"Context Helper Expression\"};fun",
    "ction lb(a){return\"/\"==a||\"//\"==a}\nhb.prototype.evaluate=function(",
    "a){var b=this.W.evaluate(a);if(!(b instanceof G))throw Error(\"Filter e",
    "xpression must evaluate to nodeset.\");a=this.G;for(var c=0,d=a.length;",
    "c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=mb)if(e.c",
    "()||e.s!=nb){var g=f.next();for(b=e.evaluate(new B(g));null!=(g=f.next(",
    "));)g=e.evaluate(new B(g)),b=Pa(b,g)}else g=f.next(),b=e.evaluate(new B",
    "(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains(b))&&b.",
    "compareDocumentPosition(g)&8;g=b);b=e.evaluate(new B(g))}}return b};\nh",
    "b.prototype.toString=function(){var a=\"Path Expression:\"+K(this.W);if",
    "(this.G.length){var b=t(this.G,function(a,b){return a+K(b)},\"Steps:\")",
    ";a+=K(b)}return a};function S(a,b){this.b=a;this.A=!!b}function $a(a,b,",
    "c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f=b.m(),",
    "g,l=0;g=e.next();l++){var w=a.A?f-l:l+1;g=d.evaluate(new B(g,w,f));if(",
    "\"number\"==typeof g)w=w==g;else if(\"string\"==typeof g||\"boolean\"==",
    "typeof g)w=!!g;else if(g instanceof G)w=0<g.m();else throw Error(\"Pred",
    "icate.evaluate returned an unexpected type.\");w||e.remove()}return b}S",
    ".prototype.u=function(){return 0<this.b.length?this.b[0].u():null};\nS.",
    "prototype.c=function(){for(var a=0;a<this.b.length;a++){var b=this.b[a]",
    ";if(b.c()||1==b.f||0==b.f)return!0}return!1};S.prototype.m=function(){r",
    "eturn this.b.length};S.prototype.toString=function(){return t(this.b,fu",
    "nction(a,b){return a+K(b)},\"Predicates:\")};function T(a,b,c,d){I.call",
    "(this,4);this.s=a;this.M=b;this.b=c||new S([]);this.O=!!d;b=this.b.u();",
    "a.na&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()}p(T,I);\nT.prot",
    "otype.evaluate=function(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c&&(d",
    "=c.name,e=c.C?M(c.C,a):null,f=1);if(this.O)if(this.c()||this.s!=ob)if(b",
    "=(new T(pb,new H(\"node\"))).evaluate(a).iterator(),c=b.next())for(a=th",
    "is.v(c,d,e,f);null!=(c=b.next());)a=Pa(a,this.v(c,d,e,f));else a=new G;",
    "else a=La(this.M,b,d,e),a=$a(this.b,a,f);else a=this.v(a.l,d,e,f);retur",
    "n a};T.prototype.v=function(a,b,c,d){a=this.s.I(this.M,a,b,c);return a=",
    "$a(this.b,a,d)};\nT.prototype.toString=function(){var a=\"Step:\"+K(\"O",
    "perator: \"+(this.O?\"//\":\"/\"));this.s.i&&(a+=K(\"Axis: \"+this.s));",
    "a+=K(this.M);if(this.b.m()){var b=t(this.b.b,function(a,b){return a+K(b",
    ")},\"Predicates:\");a+=K(b)}return a};function qb(a,b,c,d){this.i=a;thi",
    "s.I=b;this.A=c;this.na=d}qb.prototype.toString=function(){return this.i",
    "};var rb={};function U(a,b,c,d){if(rb.hasOwnProperty(a))throw Error(\"A",
    "xis already created: \"+a);b=new qb(a,b,c,!!d);return rb[a]=b}\nU(\"anc",
    "estor\",function(a,b){for(var c=new G;b=b.parentNode;)a.matches(b)&&c.u",
    "nshift(b);return c},!0);U(\"ancestor-or-self\",function(a,b){var c=new ",
    "G;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);\nv",
    "ar ib=U(\"attribute\",function(a,b){var c=new G,d=a.getName();if(b=b.at",
    "tributes)if(a instanceof H&&null===a.B||\"*\"==d)for(a=0;d=b[a];a++)c.a",
    "dd(d);else(d=b.getNamedItem(d))&&c.add(d);return c},!1),ob=U(\"child\",",
    "function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||new G;for(b=b.firs",
    "tChild;b;b=b.nextSibling)F(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,",
    "!0);U(\"descendant\",La,!1,!0);\nvar pb=U(\"descendant-or-self\",functi",
    "on(a,b,c,d){var e=new G;F(b,c,d)&&a.matches(b)&&e.add(b);return La(a,b,",
    "c,d,e)},!1,!0),mb=U(\"following\",function(a,b,c,d){var e=new G;do for(",
    "var f=b;f=f.nextSibling;)F(f,c,d)&&a.matches(f)&&e.add(f),e=La(a,f,c,d,",
    "e);while(b=b.parentNode);return e},!1,!0);U(\"following-sibling\",funct",
    "ion(a,b){for(var c=new G;b=b.nextSibling;)a.matches(b)&&c.add(b);return",
    " c},!1);U(\"namespace\",function(){return new G},!1);\nvar sb=U(\"paren",
    "t\",function(a,b){var c=new G;if(9==b.nodeType)return c;if(2==b.nodeTyp",
    "e)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);",
    "return c},!1),nb=U(\"preceding\",function(a,b,c,d){var e=new G,f=[];do ",
    "f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;g++){var ",
    "w=[];for(b=f[g];b=b.previousSibling;)w.unshift(b);for(var J=0,r=w.lengt",
    "h;J<r;J++)b=w[J],F(b,c,d)&&a.matches(b)&&e.add(b),e=La(a,b,c,d,e)}retur",
    "n e},!0,!0);\nU(\"preceding-sibling\",function(a,b){for(var c=new G;b=b",
    ".previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var tb=U(\"s",
    "elf\",function(a,b){var c=new G;a.matches(b)&&c.add(b);return c},!1);fu",
    "nction ub(a){I.call(this,1);this.V=a;this.o=a.c();this.h=a.h}p(ub,I);ub",
    ".prototype.evaluate=function(a){return-L(this.V,a)};ub.prototype.toStri",
    "ng=function(){return\"Unary Expression: -\"+K(this.V)};function vb(a){I",
    ".call(this,4);this.L=a;Ta(this,u(this.L,function(a){return a.c()}));Ua(",
    "this,u(this.L,function(a){return a.h}))}p(vb,I);vb.prototype.evaluate=f",
    "unction(a){var b=new G;q(this.L,function(c){c=c.evaluate(a);if(!(c inst",
    "anceof G))throw Error(\"Path expression must evaluate to NodeSet.\");b=",
    "Pa(b,c)});return b};vb.prototype.toString=function(){return t(this.L,fu",
    "nction(a,b){return a+K(b)},\"Union Expression:\")};function wb(a,b){thi",
    "s.a=a;this.ka=b}function xb(a){for(var b,c=[];;){V(a,\"Missing right ha",
    "nd side of binary expression.\");b=yb(a);var d=a.a.next();if(!d)break;v",
    "ar e=(d=Ya[d]||null)&&d.aa;if(!e){a.a.back();break}for(;c.length&&e<=c[",
    "c.length-1].aa;)b=new Va(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)",
    "b=new Va(c.pop(),c.pop(),b);return b}function V(a,b){if(a.a.empty())thr",
    "ow Error(b);}function zb(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad to",
    "ken, expected: \"+b+\" got: \"+a);}\nfunction Ab(a){a=a.a.next();if(\")",
    "\"!=a)throw Error(\"Bad token: \"+a);}function Bb(a){a=a.a.next();if(2>",
    "a.length)throw Error(\"Unclosed literal string\");return new eb(a)}\nfu",
    "nction Cb(a){var b=[];if(lb(C(a.a))){var c=a.a.next();var d=C(a.a);if(",
    "\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![",
    "0-9])[\\w]/.test(d)))return new jb;d=new jb;V(a,\"Missing next location",
    " step.\");c=Db(a,c);b.push(c)}else{a:{c=C(a.a);d=c.charAt(0);switch(d){",
    "case \"$\":throw Error(\"Variable reference not allowed in HTML XPath\"",
    ");case \"(\":a.a.next();c=xb(a);V(a,'unclosed \"(\"');zb(a,\")\");break",
    ";case '\"':case \"'\":c=Bb(a);break;default:if(isNaN(+c))if(!db(c)&&/(?",
    "![0-9])[\\w]/.test(d)&&\"(\"==C(a.a,\n1)){c=a.a.next();c=cb[c]||null;a.",
    "a.next();for(d=[];\")\"!=C(a.a);){V(a,\"Missing function argument list.",
    "\");d.push(xb(a));if(\",\"!=C(a.a))break;a.a.next()}V(a,\"Unclosed func",
    "tion argument list.\");Ab(a);c=new ab(c,d)}else{c=null;break a}else c=n",
    "ew gb(+a.a.next())}\"[\"==C(a.a)&&(d=new S(Eb(a)),c=new Za(c,d))}if(c)i",
    "f(lb(C(a.a)))d=c;else return c;else c=Db(a,\"/\"),d=new kb,b.push(c)}fo",
    "r(;lb(C(a.a));)c=a.a.next(),V(a,\"Missing next location step.\"),c=Db(a",
    ",c),b.push(c);return new hb(d,b)}\nfunction Db(a,b){if(\"/\"!=b&&\"//\"",
    "!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"==C(a.a)){",
    "var c=new T(tb,new H(\"node\"));a.a.next();return c}if(\"..\"==C(a.a))r",
    "eturn c=new T(sb,new H(\"node\")),a.a.next(),c;if(\"@\"==C(a.a)){var d=",
    "ib;a.a.next();V(a,\"Missing attribute name\")}else if(\"::\"==C(a.a,1))",
    "{if(!/(?![0-9])[\\w]/.test(C(a.a).charAt(0)))throw Error(\"Bad token: ",
    "\"+a.a.next());var e=a.a.next();d=rb[e]||null;if(!d)throw Error(\"No ax",
    "is with name: \"+e);a.a.next();V(a,\"Missing node name\")}else d=ob;e=",
    "\nC(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==C(a.a,1)){i",
    "f(!db(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!db(e))",
    "throw Error(\"Invalid type name: \"+e);zb(a,\"(\");V(a,\"Bad nodetype\"",
    ");var f=C(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=Bb(a);V(a,\"Bad ",
    "nodetype\");Ab(a);e=new H(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),",
    "-1==f)e=new fb(e);else{g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else ",
    "if(l=a.ka(g),!l)throw Error(\"Namespace prefix not declared: \"+g);e=e.",
    "substr(f+1);e=new fb(e,l)}else throw Error(\"Bad token: \"+\na.a.next()",
    ");a=new S(Eb(a),d.A);return c||new T(d,e,a,\"//\"==b)}function Eb(a){fo",
    "r(var b=[];\"[\"==C(a.a);){a.a.next();V(a,\"Missing predicate expressio",
    "n.\");var c=xb(a);b.push(c);V(a,\"Unclosed predicate expression.\");zb(",
    "a,\"]\")}return b}function yb(a){if(\"-\"==C(a.a))return a.a.next(),new",
    " ub(yb(a));var b=Cb(a);if(\"|\"!=C(a.a))a=b;else{for(b=[b];\"|\"==a.a.n",
    "ext();)V(a,\"Missing next union location path.\"),b.push(Cb(a));a.a.bac",
    "k();a=new vb(b)}return a};function Fb(a){switch(a.nodeType){case 1:retu",
    "rn ja(Gb,a);case 9:return Fb(a.documentElement);case 11:case 10:case 6:",
    "case 12:return Hb;default:return a.parentNode?Fb(a.parentNode):Hb}}func",
    "tion Hb(){return null}function Gb(a,b){if(a.prefix==b)return a.namespac",
    "eURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns",
    ":\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNod",
    "e.nodeType?Gb(a.parentNode,b):null};function Ib(a,b){if(!a.length)throw",
    " Error(\"Empty XPath expression.\");a=Ia(a);if(a.empty())throw Error(\"",
    "Invalid XPath expression.\");b?\"function\"==ca(b)||(b=ia(b.lookupNames",
    "paceURI,b)):b=function(){return null};var c=xb(new wb(a,b));if(!a.empty",
    "())throw Error(\"Bad token: \"+a.next());this.evaluate=function(a,b){a=",
    "c.evaluate(new B(a));return new W(a,b)}}\nfunction W(a,b){if(0==b)if(a ",
    "instanceof G)b=4;else if(\"string\"==typeof a)b=2;else if(\"number\"==t",
    "ypeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpe",
    "cted evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof G))throw",
    " Error(\"value could not be converted to the specified type\");this.res",
    "ultType=b;switch(b){case 2:this.stringValue=a instanceof G?Ra(a):\"\"+a",
    ";break;case 1:this.numberValue=a instanceof G?+Ra(a):+a;break;case 3:th",
    "is.booleanValue=a instanceof G?0<a.m():!!a;break;case 4:case 5:case 6:c",
    "ase 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next())d.p",
    "ush(e);this.snapshotLength=a.m();this.invalidIteratorState=!1;break;cas",
    "e 8:case 9:this.singleNodeValue=Qa(a);break;default:throw Error(\"Unkno",
    "wn XPathResult type.\");}var f=0;this.iterateNext=function(){if(4!=b&&5",
    "!=b)throw Error(\"iterateNext called with wrong result type\");return f",
    ">=d.length?null:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)thr",
    "ow Error(\"snapshotItem called with wrong result type\");return a>=d.le",
    "ngth||0>a?null:d[a]}}\nW.ANY_TYPE=0;W.NUMBER_TYPE=1;W.STRING_TYPE=2;W.B",
    "OOLEAN_TYPE=3;W.UNORDERED_NODE_ITERATOR_TYPE=4;W.ORDERED_NODE_ITERATOR_",
    "TYPE=5;W.UNORDERED_NODE_SNAPSHOT_TYPE=6;W.ORDERED_NODE_SNAPSHOT_TYPE=7;",
    "W.ANY_UNORDERED_NODE_TYPE=8;W.FIRST_ORDERED_NODE_TYPE=9;function Jb(a){",
    "this.lookupNamespaceURI=Fb(a)}\nba(\"wgxpath.install\",function(a,b){a=",
    "a||aa;var c=a.Document&&a.Document.prototype||a.document;if(!c.evaluate",
    "||b)a.XPathResult=W,c.evaluate=function(a,b,c,g){return(new Ib(a,c)).ev",
    "aluate(b,g)},c.createExpression=function(a,b){return new Ib(a,b)},c.cre",
    "ateNSResolver=function(a){return new Jb(a)}});var Kb=function(){var a={",
    "qa:\"http://www.w3.org/2000/svg\"};return function(b){return a[b]||null",
    "}}();\nfunction Lb(a,b){var c=z(a);if(!c.documentElement)return null;tr",
    "y{for(var d=c.createNSResolver?c.createNSResolver(c.documentElement):Kb",
    ",e={},f=c.getElementsByTagName(\"*\"),g=0;g<f.length;++g){var l=f[g],w=",
    "l.namespaceURI;if(w&&!e[w]){var J=l.lookupPrefix(w);if(!J){var r=w.matc",
    "h(\".*/(\\\\w+)/?$\");J=r?r[1]:\"xhtml\"}e[w]=J}}var y={},E;for(E in e)",
    "y[e[E]]=E;d=function(a){return y[a]||null};try{return c.evaluate(b,a,d,",
    "9,null)}catch(N){if(\"TypeError\"===N.name)return d=c.createNSResolver?",
    "c.createNSResolver(c.documentElement):\nKb,c.evaluate(b,a,d,9,null);thr",
    "ow N;}}catch(N){throw new wa(32,\"Unable to locate an element with the ",
    "xpath expression \"+b+\" because of the following error:\\n\"+N);}}\nfu",
    "nction Mb(a,b){var c=function(){var c=Lb(b,a);return c?c.singleNodeValu",
    "e||null:b.selectSingleNode?(c=z(b),c.setProperty&&c.setProperty(\"Selec",
    "tionLanguage\",\"XPath\"),b.selectSingleNode(a)):null}();if(null!==c&&(",
    "!c||1!=c.nodeType))throw new wa(32,'The result of the xpath expression ",
    "\"'+a+'\" is: '+c+\". It should be an element.\");return c};function Nb",
    "(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d}h=Nb.protot",
    "ype;h.clone=function(){return new Nb(this.top,this.right,this.bottom,th",
    "is.left)};h.toString=function(){return\"(\"+this.top+\"t, \"+this.right",
    "+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"};h.contains=function(a){r",
    "eturn this&&a?a instanceof Nb?a.left>=this.left&&a.right<=this.right&&a",
    ".top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&",
    "a.y>=this.top&&a.y<=this.bottom:!1};\nh.expand=function(a,b,c,d){ea(a)?",
    "(this.top-=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a",
    ".left):(this.top-=a,this.right+=Number(b),this.bottom+=Number(c),this.l",
    "eft-=Number(d));return this};h.ceil=function(){this.top=Math.ceil(this.",
    "top);this.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom",
    ");this.left=Math.ceil(this.left);return this};\nh.floor=function(){this",
    ".top=Math.floor(this.top);this.right=Math.floor(this.right);this.bottom",
    "=Math.floor(this.bottom);this.left=Math.floor(this.left);return this};h",
    ".round=function(){this.top=Math.round(this.top);this.right=Math.round(t",
    "his.right);this.bottom=Math.round(this.bottom);this.left=Math.round(thi",
    "s.left);return this};h.translate=function(a,b){a instanceof x?(this.lef",
    "t+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,th",
    "is.right+=a,n(b)&&(this.top+=b,this.bottom+=b));return this};\nh.scale=",
    "function(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;this.top*=b;this.bo",
    "ttom*=b;return this};function X(a,b,c,d){this.left=a;this.top=b;this.wi",
    "dth=c;this.height=d}h=X.prototype;h.clone=function(){return new X(this.",
    "left,this.top,this.width,this.height)};h.toString=function(){return\"(",
    "\"+this.left+\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+\"",
    "h)\"};h.contains=function(a){return a instanceof x?a.x>=this.left&&a.x<",
    "=this.left+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.le",
    "ft<=a.left&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&this",
    ".top+this.height>=a.top+a.height};\nh.ceil=function(){this.left=Math.ce",
    "il(this.left);this.top=Math.ceil(this.top);this.width=Math.ceil(this.wi",
    "dth);this.height=Math.ceil(this.height);return this};h.floor=function()",
    "{this.left=Math.floor(this.left);this.top=Math.floor(this.top);this.wid",
    "th=Math.floor(this.width);this.height=Math.floor(this.height);return th",
    "is};h.round=function(){this.left=Math.round(this.left);this.top=Math.ro",
    "und(this.top);this.width=Math.round(this.width);this.height=Math.round(",
    "this.height);return this};\nh.translate=function(a,b){a instanceof x?(t",
    "his.left+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(this.top+=b));return ",
    "this};h.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;this.",
    "top*=b;this.height*=b;return this};var Ob=\"function\"===typeof ShadowR",
    "oot;function Pb(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&",
    "11!=a.nodeType;)a=a.parentNode;return A(a)?a:null}\nfunction Y(a,b){b=k",
    "a(b);if(\"float\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\"",
    ";a:{var c=b;var d=z(a);if(d.defaultView&&d.defaultView.getComputedStyle",
    "&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValu",
    "e(c)||\"\";break a}c=\"\"}a=c||Qb(a,b);if(null===a)a=null;else if(0<=la",
    "(ra,b)){b:{var e=a.match(ua);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Num",
    "ber(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e",
    "&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(va))if(b=Numb",
    "er(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<",
    "=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=qa[",
    "b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&(c",
    "=c.replace(sa,\"#$1$1$2$2$3$3\")),!ta.test(c))){b=null;break b}b=[parse",
    "Int(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2)",
    ",16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunction Qb(a,b",
    "){var c=a.currentStyle||a.style,d=c[b];!k(d)&&\"function\"==ca(c.getPro",
    "pertyValue)&&(d=c.getPropertyValue(b));return\"inherit\"!=d?k(d)?d:null",
    ":(a=Pb(a))?Qb(a,b):null}\nfunction Rb(a,b,c){function d(a){var b=Sb(a);",
    "return 0<b.height&&0<b.width?!0:A(a,\"PATH\")&&(0<b.height||0<b.width)?",
    "(a=Y(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"hidden\"!=Y(a,\"overf",
    "low\")&&u(a.childNodes,function(a){return 3==a.nodeType||A(a)&&d(a)})}f",
    "unction e(a){return Tb(a)==Z&&ma(a.childNodes,function(a){return!A(a)||",
    "e(a)||!d(a)})}if(!A(a))throw Error(\"Argument to isShown must be of typ",
    "e Element\");if(A(a,\"BODY\"))return!0;var f=Pb(a);if(f&&A(f,\"DETAILS",
    "\")&&!f.open&&!A(a,\"SUMMARY\"))return!1;if(A(a,\n\"OPTION\")||A(a,\"OP",
    "TGROUP\"))return a=Fa(a,function(a){return A(a,\"SELECT\")}),!!a&&Rb(a,",
    "!0,c);if(f=Ub(a))return!!f.X&&0<f.rect.width&&0<f.rect.height&&Rb(f.X,b",
    ",c);if(A(a,\"INPUT\")&&\"hidden\"==a.type.toLowerCase()||A(a,\"NOSCRIPT",
    "\"))return!1;f=Y(a,\"visibility\");return\"collapse\"!=f&&\"hidden\"!=f",
    "&&c(a)&&(b||0!=Vb(a))&&d(a)?!e(a):!1}var Z=\"hidden\";\nfunction Tb(a){",
    "function b(a){function b(a){if(a==g)return!0;var b=Y(a,\"display\");ret",
    "urn 0==b.lastIndexOf(\"inline\",0)||\"contents\"==b||\"absolute\"==c&&",
    "\"static\"==Y(a,\"position\")?!1:!0}var c=Y(a,\"position\");if(\"fixed",
    "\"==c)return J=!0,a==g?null:g;for(a=Pb(a);a&&!b(a);)a=Pb(a);return a}fu",
    "nction c(a){var b=a;if(\"visible\"==w)if(a==g&&l)b=l;else if(a==l)retur",
    "n{x:\"visible\",y:\"visible\"};b={x:Y(b,\"overflow-x\"),y:Y(b,\"overflo",
    "w-y\")};a==g&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?",
    "\"auto\":b.y);return b}function d(a){if(a==\ng){var b=(new Ga(f)).H;a=b",
    ".scrollingElement?b.scrollingElement:b.body||b.documentElement;b=b.pare",
    "ntWindow||b.defaultView;a=new x(b.pageXOffset||a.scrollLeft,b.pageYOffs",
    "et||a.scrollTop)}else a=new x(a.scrollLeft,a.scrollTop);return a}var e=",
    "Wb(a),f=z(a),g=f.documentElement,l=f.body,w=Y(g,\"overflow\"),J;for(a=b",
    "(a);a;a=b(a)){var r=c(a);if(\"visible\"!=r.x||\"visible\"!=r.y){var y=S",
    "b(a);if(0==y.width||0==y.height)return Z;var E=e.right<y.left,N=e.botto",
    "m<y.top;if(E&&\"hidden\"==r.x||N&&\"hidden\"==r.y)return Z;\nif(E&&\"vi",
    "sible\"!=r.x||N&&\"visible\"!=r.y){E=d(a);N=e.bottom<y.top-E.y;if(e.rig",
    "ht<y.left-E.x&&\"visible\"!=r.x||N&&\"visible\"!=r.x)return Z;e=Tb(a);r",
    "eturn e==Z?Z:\"scroll\"}E=e.left>=y.left+y.width;y=e.top>=y.top+y.heigh",
    "t;if(E&&\"hidden\"==r.x||y&&\"hidden\"==r.y)return Z;if(E&&\"visible\"!",
    "=r.x||y&&\"visible\"!=r.y){if(J&&(r=d(a),e.left>=g.scrollWidth-r.x||e.r",
    "ight>=g.scrollHeight-r.y))return Z;e=Tb(a);return e==Z?Z:\"scroll\"}}}r",
    "eturn\"none\"}\nfunction Sb(a){var b=Ub(a);if(b)return b.rect;if(A(a,\"",
    "HTML\"))return a=z(a),a=((a?a.parentWindow||a.defaultView:window)||wind",
    "ow).document,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=",
    "new ya(a.clientWidth,a.clientHeight),new X(0,0,a.width,a.height);try{va",
    "r c=a.getBoundingClientRect()}catch(d){return new X(0,0,0,0)}return new",
    " X(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfunction Ub(a){var b=A",
    "(a,\"MAP\");if(!b&&!A(a,\"AREA\"))return null;var c=b?a:A(a.parentNode,",
    "\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=Mb('/descendant:",
    ":*[@usemap = \"#'+c.name+'\"]',z(c)))&&(e=Sb(d),b||\"default\"==a.shape",
    ".toLowerCase()||(a=Xb(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.",
    "min(Math.max(a.top,0),e.height),e=new X(b+e.left,c+e.top,Math.min(a.wid",
    "th,e.width-b),Math.min(a.height,e.height-c))));return{X:d,rect:e||new X",
    "(0,0,0,0)}}\nfunction Xb(a){var b=a.shape.toLowerCase();a=a.coords.spli",
    "t(\",\");if(\"rect\"==b&&4==a.length){b=a[0];var c=a[1];return new X(b,",
    "c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new X(a[0]",
    "-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){b=a[0];c=a[1];for(var d=",
    "b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Mat",
    "h.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new X(b,c,d-b,e-c)}return n",
    "ew X(0,0,0,0)}function Wb(a){a=Sb(a);return new Nb(a.top,a.left+a.width",
    ",a.top+a.height,a.left)}\nfunction Vb(a){var b=1,c=Y(a,\"opacity\");c&&",
    "(b=Number(c));(a=Pb(a))&&(b*=Vb(a));return b};ba(\"_\",function(a,b){fu",
    "nction c(a){if(A(a)&&\"none\"==Y(a,\"display\"))return!1;a:{var b=a.par",
    "entNode;if(a.getDestinationInsertionPoints){var d=a.getDestinationInser",
    "tionPoints();if(0<d.length){a=d[d.length-1];break a}}a=b&&b.shadowRoot&",
    "&void 0!==a.assignedSlot?a.assignedSlot?a.assignedSlot.parentNode:null:",
    "b}return Ob&&a instanceof ShadowRoot||a&&(9==a.nodeType||11==a.nodeType",
    ")?!0:!!a&&c(a)}return Rb(a,!!b,c)});; return this._.apply(null,argument",
    "s);}.apply({navigator:typeof window!='undefined'?window.navigator:null,",
    "document:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const IS_ENABLED[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof Array)return\"array\";if(a instanceof Object)return b;var c=Object",
    ".prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";",
    "if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ha(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a,b){function c(){}c.prototype=b.prototype;a.na=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=function(a,",
    "c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};function m(a,b){for",
    "(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(void ",
    "0,d[e],e,a)}function n(a,b,c){var d=c;m(a,function(c,f){d=b.call(void 0",
    ",d,c,f,a)});return d}function p(a,b){for(var c=a.length,d=h(a)?a.split(",
    "\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;return!",
    "1}function ia(a){return Array.prototype.concat.apply([],arguments)}func",
    "tion ja(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,",
    "b):Array.prototype.slice.call(a,b,c)};function ka(a){for(;a&&1!=a.nodeT",
    "ype;)a=a.previousSibling;return a}function la(a,b){if(!a||!b)return!1;i",
    "f(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"undefined\"",
    "!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocumentPos",
    "ition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction ma(a,b",
    "){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDocumen",
    "tPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourceIndex",
    "\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a",
    ".sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==",
    "f?oa(a,b):!c&&la(e,b)?-1*pa(a,b):!d&&la(f,a)?pa(b,a):(c?a.sourceIndex:e",
    ".sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType?a:a.owner",
    "Document||a.document;c=d.createRange();c.selectNode(a);c.collapse(!0);",
    "\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.compareBoun",
    "daryPoints(aa.Range.START_TO_END,a)}function pa(a,b){var c=a.parentNode",
    ";if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return oa(b,a)}f",
    "unction oa(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}fun",
    "ction qa(a,b){for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}retur",
    "n null};function q(a,b){b&&\"string\"!==typeof b&&(b=b.toString());retu",
    "rn!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The MIT ",
    "License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 G",
    "oogle Inc.\n\n Permission is hereby granted, free of charge, to any per",
    "son obtaining a copy\n of this software and associated documentation fi",
    "les (the \"Software\"), to\n deal in the Software without restriction, ",
    "including without limitation the\n rights to use, copy, modify, merge, ",
    "publish, distribute, sublicense, and/or\n sell copies of the Software, ",
    "and to permit persons to whom the Software is\n furnished to do so, sub",
    "ject to the following conditions:\n\n The above copyright notice and th",
    "is permission notice shall be included in\n all copies or substantial p",
    "ortions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOU",
    "T WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED",
    " TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPO",
    "SE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HO",
    "LDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN",
    " AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN",
    " CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOF",
    "TWARE.\n*/\nfunction r(a,b,c){this.l=a;this.ka=b||1;this.j=c||1};functi",
    "on t(a){this.S=a;this.I=0}function ra(a){a=a.match(sa);for(var b=0;b<a.",
    "length;b++)ta.test(a[b])&&a.splice(b,1);return new t(a)}var sa=/\\$?(?:",
    "(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/",
    "\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|.",
    "/g,ta=/^\\s/;function u(a,b){return a.S[a.I+(b||0)]}t.prototype.next=fu",
    "nction(){return this.S[this.I++]};t.prototype.back=function(){this.I--}",
    ";t.prototype.empty=function(){return this.S.length<=this.I};function v(",
    "a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?",
    "a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9",
    "==c||1==c){a=9==c?a.documentElement:a.firstChild;c=0;var d=[];for(b=\"",
    "\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild",
    ");for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}",
    "\nfunction w(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!",
    "1}catch(d){return!1}return null==c?!!a.getAttribute(b):a.getAttribute(b",
    ",2)==c}function x(a,b,c,d,e){return ua.call(null,a,b,h(c)?c:null,h(d)?d",
    ":null,e||new y)}\nfunction ua(a,b,c,d,e){b.getElementsByName&&d&&\"name",
    "\"==c?(b=b.getElementsByName(d),m(b,function(b){a.matches(b)&&e.add(b)}",
    ")):b.getElementsByClassName&&d&&\"class\"==c?(b=b.getElementsByClassNam",
    "e(d),m(b,function(b){b.className==d&&a.matches(b)&&e.add(b)})):a instan",
    "ceof A?va(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(",
    "a.getName()),m(b,function(a){w(a,c,d)&&e.add(a)}));return e}function va",
    "(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)w(b,c,d)&&a.matches(b)",
    "&&e.add(b),va(a,b,c,d,e)};function y(){this.j=this.g=null;this.D=0}func",
    "tion wa(a){this.node=a;this.next=this.w=null}function xa(a,b){if(!a.g)r",
    "eturn b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.n",
    "ode==b.node?(e=c,c=c.next,b=b.next):0<ma(c.node,b.node)?(e=b,b=b.next):",
    "(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.n",
    "ext=e,f++,e=e.next;a.j=d;a.D=f;return a}y.prototype.unshift=function(a)",
    "{a=new wa(a);a.next=this.g;this.j?this.g.w=a:this.g=this.j=a;this.g=a;t",
    "his.D++};\ny.prototype.add=function(a){a=new wa(a);a.w=this.j;this.g?th",
    "is.j.next=a:this.g=this.j=a;this.j=a;this.D++};function B(a){return(a=a",
    ".g)?a.node:null}y.prototype.m=function(){return this.D};function C(a){r",
    "eturn(a=B(a))?v(a):\"\"}y.prototype.iterator=function(a){return new ya(",
    "this,!!a)};function ya(a,b){this.ga=a;this.T=(this.A=b)?a.j:a.g;this.O=",
    "null}ya.prototype.next=function(){var a=this.T;if(null==a)return null;v",
    "ar b=this.O=a;this.T=this.A?a.w:a.next;return b.node};\nya.prototype.re",
    "move=function(){var a=this.ga,b=this.O;if(!b)throw Error(\"Next must be",
    " called at least once before remove.\");var c=b.w;b=b.next;c?c.next=b:a",
    ".g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function D(a){this.f=a;this.h=thi",
    "s.o=!1;this.F=null}function E(a){return\"\\n  \"+a.toString().split(\"",
    "\\n\").join(\"\\n  \")}D.prototype.c=function(){return this.o};function",
    " za(a,b){a.o=b}function Aa(a,b){a.h=b}D.prototype.u=function(){return t",
    "his.F};function F(a,b){a=a.evaluate(b);return a instanceof y?+C(a):+a}f",
    "unction G(a,b){a=a.evaluate(b);return a instanceof y?C(a):\"\"+a}functi",
    "on H(a,b){a=a.evaluate(b);return a instanceof y?!!a.m():!!a};function I",
    "(a,b,c){D.call(this,a.f);this.R=a;this.W=b;this.aa=c;this.o=b.c()||c.c(",
    ");this.h=b.h||c.h;this.R==Ba&&(c.h||c.c()||4==c.f||0==c.f||!b.u()?b.h||",
    "b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().name,C:b}):this.F={n",
    "ame:b.u().name,C:c})}k(I,D);\nfunction J(a,b,c,d,e){b=b.evaluate(d);c=c",
    ".evaluate(d);var f;if(b instanceof y&&c instanceof y){b=b.iterator();fo",
    "r(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if",
    "(a(v(d),v(f)))return!0;return!1}if(b instanceof y||c instanceof y){b in",
    "stanceof y?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,l=f.ne",
    "xt();l;l=f.next()){switch(g){case \"number\":l=+v(l);break;case \"boole",
    "an\":l=!!v(l);break;case \"string\":l=v(l);break;default:throw Error(\"",
    "Illegal primitive type for comparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d",
    ",l))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==type",
    "of c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b",
    ",c):a(+b,+c)}I.prototype.evaluate=function(a){return this.R.v(this.W,th",
    "is.aa,a)};I.prototype.toString=function(){var a=\"Binary Expression: \"",
    "+this.R;a+=E(this.W);return a+=E(this.aa)};function Ca(a,b,c,d){this.ja",
    "=a;this.Z=b;this.f=c;this.v=d}Ca.prototype.toString=function(){return t",
    "his.ja};var Da={};\nfunction K(a,b,c,d){if(Da.hasOwnProperty(a))throw E",
    "rror(\"Binary operator already created: \"+a);a=new Ca(a,b,c,d);return ",
    "Da[a.toString()]=a}K(\"div\",6,1,function(a,b,c){return F(a,c)/F(b,c)})",
    ";K(\"mod\",6,1,function(a,b,c){return F(a,c)%F(b,c)});K(\"*\",6,1,funct",
    "ion(a,b,c){return F(a,c)*F(b,c)});K(\"+\",5,1,function(a,b,c){return F(",
    "a,c)+F(b,c)});K(\"-\",5,1,function(a,b,c){return F(a,c)-F(b,c)});K(\"<",
    "\",4,2,function(a,b,c){return J(function(a,b){return a<b},a,b,c)});\nK(",
    "\">\",4,2,function(a,b,c){return J(function(a,b){return a>b},a,b,c)});K",
    "(\"<=\",4,2,function(a,b,c){return J(function(a,b){return a<=b},a,b,c)}",
    ");K(\">=\",4,2,function(a,b,c){return J(function(a,b){return a>=b},a,b,",
    "c)});var Ba=K(\"=\",3,2,function(a,b,c){return J(function(a,b){return a",
    "==b},a,b,c,!0)});K(\"!=\",3,2,function(a,b,c){return J(function(a,b){re",
    "turn a!=b},a,b,c,!0)});K(\"and\",2,2,function(a,b,c){return H(a,c)&&H(b",
    ",c)});K(\"or\",1,2,function(a,b,c){return H(a,c)||H(b,c)});function L(a",
    ",b){if(b.m()&&4!=a.f)throw Error(\"Primary expression must evaluate to ",
    "nodeset if filter has predicate(s).\");D.call(this,a.f);this.$=a;this.b",
    "=b;this.o=a.c();this.h=a.h}k(L,D);L.prototype.evaluate=function(a){a=th",
    "is.$.evaluate(a);return Ea(this.b,a)};L.prototype.toString=function(){v",
    "ar a=\"Filter:\"+E(this.$);return a+=E(this.b)};function M(a,b){if(b.le",
    "ngth<a.Y)throw Error(\"Function \"+a.i+\" expects at least\"+a.Y+\" arg",
    "uments, \"+b.length+\" given\");if(null!==a.P&&b.length>a.P)throw Error",
    "(\"Function \"+a.i+\" expects at most \"+a.P+\" arguments, \"+b.length+",
    "\" given\");a.ha&&m(b,function(b,d){if(4!=b.f)throw Error(\"Argument \"",
    "+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b);});D.call(thi",
    "s,a.f);this.H=a;this.M=b;za(this,a.o||p(b,function(a){return a.c()}));A",
    "a(this,a.fa&&!b.length||a.ea&&!!b.length||p(b,function(a){return a.h}))",
    "}\nk(M,D);M.prototype.evaluate=function(a){return this.H.v.apply(null,i",
    "a(a,this.M))};M.prototype.toString=function(){var a=\"Function: \"+this",
    ".H;if(this.M.length){var b=n(this.M,function(a,b){return a+E(b)},\"Argu",
    "ments:\");a+=E(b)}return a};function Fa(a,b,c,d,e,f,g,l){this.i=a;this.",
    "f=b;this.o=c;this.fa=d;this.ea=!1;this.v=e;this.Y=f;this.P=void 0!==g?g",
    ":f;this.ha=!!l}Fa.prototype.toString=function(){return this.i};var Ga={",
    "};\nfunction N(a,b,c,d,e,f,g,l){if(Ga.hasOwnProperty(a))throw Error(\"F",
    "unction already created: \"+a+\".\");Ga[a]=new Fa(a,b,c,d,e,f,g,l)}N(\"",
    "boolean\",2,!1,!1,function(a,b){return H(b,a)},1);N(\"ceiling\",1,!1,!1",
    ",function(a,b){return Math.ceil(F(b,a))},1);N(\"concat\",3,!1,!1,functi",
    "on(a,b){return n(ja(arguments,1),function(b,d){return b+G(d,a)},\"\")},",
    "2,null);N(\"contains\",2,!1,!1,function(a,b,c){b=G(b,a);a=G(c,a);return",
    "-1!=b.indexOf(a)},2);N(\"count\",1,!1,!1,function(a,b){return b.evaluat",
    "e(a).m()},1,1,!0);\nN(\"false\",2,!1,!1,function(){return!1},0);N(\"flo",
    "or\",1,!1,!1,function(a,b){return Math.floor(F(b,a))},1);N(\"id\",4,!1,",
    "!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDocument;a=G(b,a).s",
    "plit(/\\s+/);var e=[];m(a,function(a){a=d.getElementById(a);var b;if(!(",
    "b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1;else{for(b=0;b<e",
    ".length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.push(a)});e.so",
    "rt(ma);var f=new y;m(e,function(a){f.add(a)});return f},1);N(\"lang\",2",
    ",!1,!1,function(){return!1},1);\nN(\"last\",1,!0,!1,function(a){if(1!=a",
    "rguments.length)throw Error(\"Function last expects ()\");return a.j},0",
    ");N(\"local-name\",3,!1,!0,function(a,b){return(a=b?B(b.evaluate(a)):a.",
    "l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);N(\"name\",3,!1,",
    "!0,function(a,b){return(a=b?B(b.evaluate(a)):a.l)?a.nodeName.toLowerCas",
    "e():\"\"},0,1,!0);N(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,",
    "1,!0);\nN(\"normalize-space\",3,!1,!0,function(a,b){return(b?G(b,a):v(a",
    ".l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);N",
    "(\"not\",2,!1,!1,function(a,b){return!H(b,a)},1);N(\"number\",1,!1,!0,f",
    "unction(a,b){return b?F(b,a):+v(a.l)},0,1);N(\"position\",1,!0,!1,funct",
    "ion(a){return a.ka},0);N(\"round\",1,!1,!1,function(a,b){return Math.ro",
    "und(F(b,a))},1);N(\"starts-with\",2,!1,!1,function(a,b,c){b=G(b,a);a=G(",
    "c,a);return 0==b.lastIndexOf(a,0)},2);N(\"string\",3,!1,!0,function(a,b",
    "){return b?G(b,a):v(a.l)},0,1);\nN(\"string-length\",1,!1,!0,function(a",
    ",b){return(b?G(b,a):v(a.l)).length},0,1);N(\"substring\",3,!1,!1,functi",
    "on(a,b,c,d){c=F(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";",
    "d=d?F(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(",
    "c)-1;var e=Math.max(c,0);a=G(b,a);return Infinity==d?a.substring(e):a.s",
    "ubstring(e,c+Math.round(d))},2,3);N(\"substring-after\",3,!1,!1,functio",
    "n(a,b,c){b=G(b,a);a=G(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(",
    "c+a.length)},2);\nN(\"substring-before\",3,!1,!1,function(a,b,c){b=G(b,",
    "a);a=G(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);N(\"su",
    "m\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.ne",
    "xt();c;c=a.next())b+=+v(c);return b},1,1,!0);N(\"translate\",3,!1,!1,fu",
    "nction(a,b,c,d){b=G(b,a);c=G(c,a);var e=G(d,a);a={};for(d=0;d<c.length;",
    "d++){var f=c.charAt(d);f in a||(a[f]=e.charAt(d))}c=\"\";for(d=0;d<b.le",
    "ngth;d++)f=b.charAt(d),c+=f in a?a[f]:f;return c},3);N(\"true\",2,!1,!1",
    ",function(){return!0},0);function A(a,b){this.ca=a;this.X=void 0!==b?b:",
    "null;this.B=null;switch(a){case \"comment\":this.B=8;break;case \"text",
    "\":this.B=3;break;case \"processing-instruction\":this.B=7;break;case ",
    "\"node\":break;default:throw Error(\"Unexpected argument\");}}function ",
    "Ha(a){return\"comment\"==a||\"text\"==a||\"processing-instruction\"==a|",
    "|\"node\"==a}A.prototype.matches=function(a){return null===this.B||this",
    ".B==a.nodeType};A.prototype.getName=function(){return this.ca};\nA.prot",
    "otype.toString=function(){var a=\"Kind Test: \"+this.ca;null===this.X||",
    "(a+=E(this.X));return a};function O(a){D.call(this,3);this.ba=a.substri",
    "ng(1,a.length-1)}k(O,D);O.prototype.evaluate=function(){return this.ba}",
    ";O.prototype.toString=function(){return\"Literal: \"+this.ba};function ",
    "P(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.org",
    "/1999/xhtml\";this.J=b?b.toLowerCase():a}P.prototype.matches=function(a",
    "){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.localName?a.loca",
    "lName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"=",
    "=this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http:",
    "//www.w3.org/1999/xhtml\")};P.prototype.getName=function(){return this.",
    "i};\nP.prototype.toString=function(){return\"Name Test: \"+(\"http://ww",
    "w.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i};function Q(a){",
    "D.call(this,1);this.da=a}k(Q,D);Q.prototype.evaluate=function(){return ",
    "this.da};Q.prototype.toString=function(){return\"Number: \"+this.da};fu",
    "nction R(a,b){D.call(this,a.f);this.V=a;this.G=b;this.o=a.c();this.h=a.",
    "h;1==this.G.length&&(a=this.G[0],a.N||a.s!=Ia||(a=a.L,\"*\"!=a.getName(",
    ")&&(this.F={name:a.getName(),C:null})))}k(R,D);function S(){D.call(this",
    ",4)}k(S,D);S.prototype.evaluate=function(a){var b=new y;a=a.l;9==a.node",
    "Type?b.add(a):b.add(a.ownerDocument);return b};S.prototype.toString=fun",
    "ction(){return\"Root Helper Expression\"};function T(){D.call(this,4)}k",
    "(T,D);T.prototype.evaluate=function(a){var b=new y;b.add(a.l);return b}",
    ";\nT.prototype.toString=function(){return\"Context Helper Expression\"}",
    ";function Ja(a){return\"/\"==a||\"//\"==a}\nR.prototype.evaluate=functi",
    "on(a){var b=this.V.evaluate(a);if(!(b instanceof y))throw Error(\"Filte",
    "r expression must evaluate to nodeset.\");a=this.G;for(var c=0,d=a.leng",
    "th;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=Ka)if(",
    "e.c()||e.s!=La){var g=f.next();for(b=e.evaluate(new r(g));null!=(g=f.ne",
    "xt());)g=e.evaluate(new r(g)),b=xa(b,g)}else g=f.next(),b=e.evaluate(ne",
    "w r(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains(b))&",
    "&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new r(g))}}return b};",
    "\nR.prototype.toString=function(){var a=\"Path Expression:\"+E(this.V);",
    "if(this.G.length){var b=n(this.G,function(a,b){return a+E(b)},\"Steps:",
    "\");a+=E(b)}return a};function U(a,b){this.b=a;this.A=!!b}function Ea(a",
    ",b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f=b.m",
    "(),g,l=0;g=e.next();l++){var z=a.A?f-l:l+1;g=d.evaluate(new r(g,z,f));i",
    "f(\"number\"==typeof g)z=z==g;else if(\"string\"==typeof g||\"boolean\"",
    "==typeof g)z=!!g;else if(g instanceof y)z=0<g.m();else throw Error(\"Pr",
    "edicate.evaluate returned an unexpected type.\");z||e.remove()}return b",
    "}U.prototype.u=function(){return 0<this.b.length?this.b[0].u():null};\n",
    "U.prototype.c=function(){for(var a=0;a<this.b.length;a++){var b=this.b[",
    "a];if(b.c()||1==b.f||0==b.f)return!0}return!1};U.prototype.m=function()",
    "{return this.b.length};U.prototype.toString=function(){return n(this.b,",
    "function(a,b){return a+E(b)},\"Predicates:\")};function V(a,b,c,d){D.ca",
    "ll(this,4);this.s=a;this.L=b;this.b=c||new U([]);this.N=!!d;b=this.b.u(",
    ");a.la&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()}k(V,D);\nV.pr",
    "ototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c&&",
    "(d=c.name,e=c.C?G(c.C,a):null,f=1);if(this.N)if(this.c()||this.s!=Ma)if",
    "(b=(new V(Na,new A(\"node\"))).evaluate(a).iterator(),c=b.next())for(a=",
    "this.v(c,d,e,f);null!=(c=b.next());)a=xa(a,this.v(c,d,e,f));else a=new ",
    "y;else a=x(this.L,b,d,e),a=Ea(this.b,a,f);else a=this.v(a.l,d,e,f);retu",
    "rn a};V.prototype.v=function(a,b,c,d){a=this.s.H(this.L,a,b,c);return a",
    "=Ea(this.b,a,d)};\nV.prototype.toString=function(){var a=\"Step:\"+E(\"",
    "Operator: \"+(this.N?\"//\":\"/\"));this.s.i&&(a+=E(\"Axis: \"+this.s))",
    ";a+=E(this.L);if(this.b.m()){var b=n(this.b.b,function(a,b){return a+E(",
    "b)},\"Predicates:\");a+=E(b)}return a};function Oa(a,b,c,d){this.i=a;th",
    "is.H=b;this.A=c;this.la=d}Oa.prototype.toString=function(){return this.",
    "i};var Pa={};function W(a,b,c,d){if(Pa.hasOwnProperty(a))throw Error(\"",
    "Axis already created: \"+a);b=new Oa(a,b,c,!!d);return Pa[a]=b}\nW(\"an",
    "cestor\",function(a,b){for(var c=new y;b=b.parentNode;)a.matches(b)&&c.",
    "unshift(b);return c},!0);W(\"ancestor-or-self\",function(a,b){var c=new",
    " y;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);\n",
    "var Ia=W(\"attribute\",function(a,b){var c=new y,d=a.getName();if(b=b.a",
    "ttributes)if(a instanceof A&&null===a.B||\"*\"==d)for(a=0;d=b[a];a++)c.",
    "add(d);else(d=b.getNamedItem(d))&&c.add(d);return c},!1),Ma=W(\"child\"",
    ",function(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new y;for(b=b.fir",
    "stChild;b;b=b.nextSibling)w(b,c,d)&&a.matches(b)&&e.add(b);return e},!1",
    ",!0);W(\"descendant\",x,!1,!0);\nvar Na=W(\"descendant-or-self\",functi",
    "on(a,b,c,d){var e=new y;w(b,c,d)&&a.matches(b)&&e.add(b);return x(a,b,c",
    ",d,e)},!1,!0),Ka=W(\"following\",function(a,b,c,d){var e=new y;do for(v",
    "ar f=b;f=f.nextSibling;)w(f,c,d)&&a.matches(f)&&e.add(f),e=x(a,f,c,d,e)",
    ";while(b=b.parentNode);return e},!1,!0);W(\"following-sibling\",functio",
    "n(a,b){for(var c=new y;b=b.nextSibling;)a.matches(b)&&c.add(b);return c",
    "},!1);W(\"namespace\",function(){return new y},!1);\nvar Qa=W(\"parent",
    "\",function(a,b){var c=new y;if(9==b.nodeType)return c;if(2==b.nodeType",
    ")return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);r",
    "eturn c},!1),La=W(\"preceding\",function(a,b,c,d){var e=new y,f=[];do f",
    ".unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;g++){var z",
    "=[];for(b=f[g];b=b.previousSibling;)z.unshift(b);for(var na=0,eb=z.leng",
    "th;na<eb;na++)b=z[na],w(b,c,d)&&a.matches(b)&&e.add(b),e=x(a,b,c,d,e)}r",
    "eturn e},!0,!0);\nW(\"preceding-sibling\",function(a,b){for(var c=new y",
    ";b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Ra=W",
    "(\"self\",function(a,b){var c=new y;a.matches(b)&&c.add(b);return c},!1",
    ");function X(a){D.call(this,1);this.U=a;this.o=a.c();this.h=a.h}k(X,D);",
    "X.prototype.evaluate=function(a){return-F(this.U,a)};X.prototype.toStri",
    "ng=function(){return\"Unary Expression: -\"+E(this.U)};function Sa(a){D",
    ".call(this,4);this.K=a;za(this,p(this.K,function(a){return a.c()}));Aa(",
    "this,p(this.K,function(a){return a.h}))}k(Sa,D);Sa.prototype.evaluate=f",
    "unction(a){var b=new y;m(this.K,function(c){c=c.evaluate(a);if(!(c inst",
    "anceof y))throw Error(\"Path expression must evaluate to NodeSet.\");b=",
    "xa(b,c)});return b};Sa.prototype.toString=function(){return n(this.K,fu",
    "nction(a,b){return a+E(b)},\"Union Expression:\")};function Ta(a,b){thi",
    "s.a=a;this.ia=b}function Ua(a){for(var b,c=[];;){Y(a,\"Missing right ha",
    "nd side of binary expression.\");b=Va(a);var d=a.a.next();if(!d)break;v",
    "ar e=(d=Da[d]||null)&&d.Z;if(!e){a.a.back();break}for(;c.length&&e<=c[c",
    ".length-1].Z;)b=new I(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=n",
    "ew I(c.pop(),c.pop(),b);return b}function Y(a,b){if(a.a.empty())throw E",
    "rror(b);}function Wa(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token,",
    " expected: \"+b+\" got: \"+a);}\nfunction Xa(a){a=a.a.next();if(\")\"!=",
    "a)throw Error(\"Bad token: \"+a);}function Ya(a){a=a.a.next();if(2>a.le",
    "ngth)throw Error(\"Unclosed literal string\");return new O(a)}\nfunctio",
    "n Za(a){var b=[];if(Ja(u(a.a))){var c=a.a.next();var d=u(a.a);if(\"/\"=",
    "=c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[",
    "\\w]/.test(d)))return new S;d=new S;Y(a,\"Missing next location step.\"",
    ");c=$a(a,c);b.push(c)}else{a:{c=u(a.a);d=c.charAt(0);switch(d){case \"$",
    "\":throw Error(\"Variable reference not allowed in HTML XPath\");case ",
    "\"(\":a.a.next();c=Ua(a);Y(a,'unclosed \"(\"');Wa(a,\")\");break;case '",
    "\"':case \"'\":c=Ya(a);break;default:if(isNaN(+c))if(!Ha(c)&&/(?![0-9])",
    "[\\w]/.test(d)&&\"(\"==u(a.a,\n1)){c=a.a.next();c=Ga[c]||null;a.a.next(",
    ");for(d=[];\")\"!=u(a.a);){Y(a,\"Missing function argument list.\");d.p",
    "ush(Ua(a));if(\",\"!=u(a.a))break;a.a.next()}Y(a,\"Unclosed function ar",
    "gument list.\");Xa(a);c=new M(c,d)}else{c=null;break a}else c=new Q(+a.",
    "a.next())}\"[\"==u(a.a)&&(d=new U(ab(a)),c=new L(c,d))}if(c)if(Ja(u(a.a",
    ")))d=c;else return c;else c=$a(a,\"/\"),d=new T,b.push(c)}for(;Ja(u(a.a",
    "));)c=a.a.next(),Y(a,\"Missing next location step.\"),c=$a(a,c),b.push(",
    "c);return new R(d,b)}\nfunction $a(a,b){if(\"/\"!=b&&\"//\"!=b)throw Er",
    "ror('Step op should be \"/\" or \"//\"');if(\".\"==u(a.a)){var c=new V(",
    "Ra,new A(\"node\"));a.a.next();return c}if(\"..\"==u(a.a))return c=new ",
    "V(Qa,new A(\"node\")),a.a.next(),c;if(\"@\"==u(a.a)){var d=Ia;a.a.next(",
    ");Y(a,\"Missing attribute name\")}else if(\"::\"==u(a.a,1)){if(!/(?![0-",
    "9])[\\w]/.test(u(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next()",
    ");var e=a.a.next();d=Pa[e]||null;if(!d)throw Error(\"No axis with name:",
    " \"+e);a.a.next();Y(a,\"Missing node name\")}else d=Ma;e=\nu(a.a);if(/(",
    "?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==u(a.a,1)){if(!Ha(e))throw",
    " Error(\"Invalid node type: \"+e);e=a.a.next();if(!Ha(e))throw Error(\"",
    "Invalid type name: \"+e);Wa(a,\"(\");Y(a,\"Bad nodetype\");var f=u(a.a)",
    ".charAt(0),g=null;if('\"'==f||\"'\"==f)g=Ya(a);Y(a,\"Bad nodetype\");Xa",
    "(a);e=new A(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new P(",
    "e);else{g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l",
    ")throw Error(\"Namespace prefix not declared: \"+g);e=e.substr(f+1);e=n",
    "ew P(e,l)}else throw Error(\"Bad token: \"+\na.a.next());a=new U(ab(a),",
    "d.A);return c||new V(d,e,a,\"//\"==b)}function ab(a){for(var b=[];\"[\"",
    "==u(a.a);){a.a.next();Y(a,\"Missing predicate expression.\");var c=Ua(a",
    ");b.push(c);Y(a,\"Unclosed predicate expression.\");Wa(a,\"]\")}return ",
    "b}function Va(a){if(\"-\"==u(a.a))return a.a.next(),new X(Va(a));var b=",
    "Za(a);if(\"|\"!=u(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Miss",
    "ing next union location path.\"),b.push(Za(a));a.a.back();a=new Sa(b)}r",
    "eturn a};function bb(a){switch(a.nodeType){case 1:return ha(cb,a);case ",
    "9:return bb(a.documentElement);case 11:case 10:case 6:case 12:return db",
    ";default:return a.parentNode?bb(a.parentNode):db}}function db(){return ",
    "null}function cb(a,b){if(a.prefix==b)return a.namespaceURI||\"http://ww",
    "w.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&",
    "c.specified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?cb(a.p",
    "arentNode,b):null};function fb(a,b){if(!a.length)throw Error(\"Empty XP",
    "ath expression.\");a=ra(a);if(a.empty())throw Error(\"Invalid XPath exp",
    "ression.\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=fun",
    "ction(){return null};var c=Ua(new Ta(a,b));if(!a.empty())throw Error(\"",
    "Bad token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new r(",
    "a));return new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceof y)b=4;",
    "else if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else ",
    "if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation r",
    "esult.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof y))throw Error(\"value co",
    "uld not be converted to the specified type\");this.resultType=b;switch(",
    "b){case 2:this.stringValue=a instanceof y?C(a):\"\"+a;break;case 1:this",
    ".numberValue=a instanceof y?+C(a):+a;break;case 3:this.booleanValue=a i",
    "nstanceof y?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c=\na.ite",
    "rator();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapsho",
    "tLength=a.m();this.invalidIteratorState=!1;break;case 8:case 9:this.sin",
    "gleNodeValue=B(a);break;default:throw Error(\"Unknown XPathResult type.",
    "\");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"it",
    "erateNext called with wrong result type\");return f>=d.length?null:d[f+",
    "+]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotI",
    "tem called with wrong result type\");return a>=d.length||0>a?null:d[a]}",
    "}\nZ.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNOR",
    "DERED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_N",
    "ODE_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE",
    "_TYPE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function gb(a){this.lookupNamespace",
    "URI=bb(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Docume",
    "nt&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Z,",
    "c.evaluate=function(a,b,c,g){return(new fb(a,c)).evaluate(b,g)},c.creat",
    "eExpression=function(a,b){return new fb(a,b)},c.createNSResolver=functi",
    "on(a){return new gb(a)}});var hb=\"BUTTON INPUT OPTGROUP OPTION SELECT ",
    "TEXTAREA\".split(\" \");function ib(a){return p(hb,function(b){return q",
    "(a,b)})?a.disabled?!1:a.parentNode&&1==a.parentNode.nodeType&&q(a,\"OPT",
    "GROUP\")||q(a,\"OPTION\")?ib(a.parentNode):!qa(a,function(a){var b=a.pa",
    "rentNode;if(b&&q(b,\"FIELDSET\")&&b.disabled){if(!q(a,\"LEGEND\"))retur",
    "n!0;for(;a=void 0!==a.previousElementSibling?a.previousElementSibling:k",
    "a(a.previousSibling);)if(q(a,\"LEGEND\"))return!0}return!1}):!0};ba(\"_",
    "\",ib);; return this._.apply(null,arguments);}.apply({navigator:typeof ",
    "window!='undefined'?window.navigator:null,document:typeof window!='unde",
    "fined'?window.document:null}, arguments);}",
    NULL
};

const char* const SUBMIT[] = {
    "function(){return function(){var f,k=this;function l(a){return\"string",
    "\"==typeof a}function aa(a,b){a=a.split(\".\");var c=k;a[0]in c||!c.exe",
    "cScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());",
    ")a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c",
    "[d]=b}\nfunction ba(a){var b=typeof a;if(\"object\"==b)if(a){if(a insta",
    "nceof Array)return\"array\";if(a instanceof Object)return b;var c=Objec",
    "t.prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\"",
    ";if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=",
    "typeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.prope",
    "rtyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c",
    "||\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnume",
    "rable&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function ca(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function da(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction ea(a,b,c){ea=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?ca:da;return ea.apply(null,argumen",
    "ts)}function fa(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction n(a,b){function c(){}c.prototype=b.prototype;a.xa=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,",
    "c,g){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};var ha=window;var i",
    "a=String.prototype.trim?function(a){return a.trim()}:function(a){return",
    " a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ja(a,b){return ",
    "a<b?-1:a>b?1:0};function p(a,b){for(var c=a.length,d=l(a)?a.split(\"\")",
    ":a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function q(a,b,c){var d=",
    "c;p(a,function(c,g){d=b.call(void 0,d,c,g,a)});return d}function r(a,b)",
    "{for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.cal",
    "l(void 0,d[e],e,a))return!0;return!1}function ka(a){return Array.protot",
    "ype.concat.apply([],arguments)}function la(a,b,c){return 2>=arguments.l",
    "ength?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)",
    "};function t(a,b){this.code=a;this.state=u[a]||v;this.message=b||\"\";a",
    "=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCa",
    "se().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"E",
    "rror\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=this",
    ".name;this.stack=a.stack||\"\"}n(t,Error);var v=\"unknown error\",u={15",
    ":\"element not selectable\",11:\"element not visible\"};u[31]=v;u[30]=v",
    ";u[24]=\"invalid cookie domain\";u[29]=\"invalid element coordinates\";",
    "u[12]=\"invalid element state\";\nu[32]=\"invalid selector\";u[51]=\"in",
    "valid selector\";u[52]=\"invalid selector\";u[17]=\"javascript error\";",
    "u[405]=\"unsupported operation\";u[34]=\"move target out of bounds\";u[",
    "27]=\"no such alert\";u[7]=\"no such element\";u[8]=\"no such frame\";u",
    "[23]=\"no such window\";u[28]=\"script timeout\";u[33]=\"session not cr",
    "eated\";u[10]=\"stale element reference\";u[21]=\"timeout\";u[25]=\"una",
    "ble to set cookie\";u[26]=\"unexpected alert open\";u[13]=v;u[9]=\"unkn",
    "own command\";t.prototype.toString=function(){return this.name+\": \"+t",
    "his.message};var w;a:{var ma=k.navigator;if(ma){var na=ma.userAgent;if(",
    "na){w=na;break a}}w=\"\"};function oa(a){var b=pa;Object.prototype.hasO",
    "wnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var qa=-1!=w.index",
    "Of(\"Macintosh\"),ra=-1!=w.indexOf(\"Windows\"),sa,ta=\"\",ua=/WebKit",
    "\\/(\\S+)/.exec(w);ua&&(ta=ua?ua[1]:\"\");sa=ta;var pa={};\nfunction va",
    "(){oa(function(){for(var a=0,b=ia(String(sa)).split(\".\"),c=ia(\"528\"",
    ").split(\".\"),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var g=b",
    "[e]||\"\",h=c[e]||\"\";do{g=/(\\d*)(\\D*)(.*)/.exec(g)||[\"\",\"\",\"\"",
    ",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==g[0].l",
    "ength&&0==h[0].length)break;a=ja(0==g[1].length?0:parseInt(g[1],10),0==",
    "h[1].length?0:parseInt(h[1],10))||ja(0==g[2].length,0==h[2].length)||ja",
    "(g[2],h[2]);g=g[3];h=h[3]}while(0==a)}return 0<=a})};function wa(a,b){i",
    "f(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(",
    "b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a",
    ".compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==",
    "a}\nfunction xa(a,b){if(a==b)return 0;if(a.compareDocumentPosition)retu",
    "rn a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parent",
    "Node&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeTy",
    "pe;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,g=b.pa",
    "rentNode;return e==g?ya(a,b):!c&&wa(e,b)?-1*za(a,b):!d&&wa(g,a)?za(b,a)",
    ":(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:g.sourceIndex)}d=Aa(a",
    ");c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange();a.",
    "selectNode(b);\na.collapse(!0);return c.compareBoundaryPoints(k.Range.S",
    "TART_TO_END,a)}function za(a,b){var c=a.parentNode;if(c==b)return-1;for",
    "(;b.parentNode!=c;)b=b.parentNode;return ya(b,a)}function ya(a,b){for(;",
    "b=b.previousSibling;)if(b==a)return-1;return 1}function Aa(a){return 9=",
    "=a.nodeType?a:a.ownerDocument||a.document}function Ca(a,b,c){a&&!c&&(a=",
    "a.parentNode);for(c=0;a;){if(b(a))return a;a=a.parentNode;c++}return nu",
    "ll};function x(a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!!",
    "a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The MIT Lice",
    "nse\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Googl",
    "e Inc.\n\n Permission is hereby granted, free of charge, to any person ",
    "obtaining a copy\n of this software and associated documentation files ",
    "(the \"Software\"), to\n deal in the Software without restriction, incl",
    "uding without limitation the\n rights to use, copy, modify, merge, publ",
    "ish, distribute, sublicense, and/or\n sell copies of the Software, and ",
    "to permit persons to whom the Software is\n furnished to do so, subject",
    " to the following conditions:\n\n The above copyright notice and this p",
    "ermission notice shall be included in\n all copies or substantial porti",
    "ons of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WA",
    "RRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO ",
    "THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE A",
    "ND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDER",
    "S BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ",
    "ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CON",
    "NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWAR",
    "E.\n*/\nfunction y(a,b,c){this.s=a;this.ua=b||1;this.o=c||1};function D",
    "a(a){this.Y=a;this.N=0}function Ea(a){a=a.match(Fa);for(var b=0;b<a.len",
    "gth;b++)Ga.test(a[b])&&a.splice(b,1);return new Da(a)}var Fa=/\\$?(?:(?",
    "![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|",
    "\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,G",
    "a=/^\\s/;function z(a,b){return a.Y[a.N+(b||0)]}Da.prototype.next=funct",
    "ion(){return this.Y[this.N++]};Da.prototype.back=function(){this.N--};D",
    "a.prototype.empty=function(){return this.Y.length<=this.N};function A(a",
    "){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a",
    ".innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9=",
    "=c||1==c){a=9==c?a.documentElement:a.firstChild;c=0;var d=[];for(b=\"\"",
    ";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);",
    "for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}\nf",
    "unction C(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}c",
    "atch(d){return!1}return null==c?!!a.getAttribute(b):a.getAttribute(b,2)",
    "==c}function D(a,b,c,d,e){return Ha.call(null,a,b,l(c)?c:null,l(d)?d:nu",
    "ll,e||new E)}\nfunction Ha(a,b,c,d,e){b.getElementsByName&&d&&\"name\"=",
    "=c?(b=b.getElementsByName(d),p(b,function(b){a.matches(b)&&e.add(b)})):",
    "b.getElementsByClassName&&d&&\"class\"==c?(b=b.getElementsByClassName(d",
    "),p(b,function(b){b.className==d&&a.matches(b)&&e.add(b)})):a instanceo",
    "f F?Ia(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.g",
    "etName()),p(b,function(a){C(a,c,d)&&e.add(a)}));return e}function Ia(a,",
    "b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)C(b,c,d)&&a.matches(b)&&e",
    ".add(b),Ia(a,b,c,d,e)};function E(){this.o=this.j=null;this.J=0}functio",
    "n Ja(a){this.node=a;this.next=this.F=null}function Ka(a,b){if(!a.j)retu",
    "rn b;if(!b.j)return a;var c=a.j;b=b.j;for(var d=null,e,g=0;c&&b;)c.node",
    "==b.node?(e=c,c=c.next,b=b.next):0<xa(c.node,b.node)?(e=b,b=b.next):(e=",
    "c,c=c.next),(e.F=d)?d.next=e:a.j=e,d=e,g++;for(e=c||b;e;)e.F=d,d=d.next",
    "=e,g++,e=e.next;a.o=d;a.J=g;return a}E.prototype.unshift=function(a){a=",
    "new Ja(a);a.next=this.j;this.o?this.j.F=a:this.j=this.o=a;this.j=a;this",
    ".J++};\nE.prototype.add=function(a){a=new Ja(a);a.F=this.o;this.j?this.",
    "o.next=a:this.j=this.o=a;this.o=a;this.J++};function La(a){return(a=a.j",
    ")?a.node:null}E.prototype.u=function(){return this.J};function Ma(a){re",
    "turn(a=La(a))?A(a):\"\"}E.prototype.iterator=function(a){return new Na(",
    "this,!!a)};function Na(a,b){this.qa=a;this.Z=(this.H=b)?a.o:a.j;this.V=",
    "null}Na.prototype.next=function(){var a=this.Z;if(null==a)return null;v",
    "ar b=this.V=a;this.Z=this.H?a.F:a.next;return b.node};\nNa.prototype.re",
    "move=function(){var a=this.qa,b=this.V;if(!b)throw Error(\"Next must be",
    " called at least once before remove.\");var c=b.F;b=b.next;c?c.next=b:a",
    ".j=b;b?b.F=c:a.o=c;a.J--;this.V=null};function G(a){this.i=a;this.l=thi",
    "s.w=!1;this.K=null}function H(a){return\"\\n  \"+a.toString().split(\"",
    "\\n\").join(\"\\n  \")}G.prototype.h=function(){return this.w};function",
    " Oa(a,b){a.w=b}function Pa(a,b){a.l=b}G.prototype.C=function(){return t",
    "his.K};function I(a,b){a=a.evaluate(b);return a instanceof E?+Ma(a):+a}",
    "function J(a,b){a=a.evaluate(b);return a instanceof E?Ma(a):\"\"+a}func",
    "tion K(a,b){a=a.evaluate(b);return a instanceof E?!!a.u():!!a};function",
    " L(a,b,c){G.call(this,a.i);this.X=a;this.ca=b;this.ha=c;this.w=b.h()||c",
    ".h();this.l=b.l||c.l;this.X==Qa&&(c.l||c.h()||4==c.i||0==c.i||!b.C()?b.",
    "l||b.h()||4==b.i||0==b.i||!c.C()||(this.K={name:c.C().name,I:b}):this.K",
    "={name:b.C().name,I:c})}n(L,G);\nfunction M(a,b,c,d,e){b=b.evaluate(d);",
    "c=c.evaluate(d);var g;if(b instanceof E&&c instanceof E){b=b.iterator()",
    ";for(d=b.next();d;d=b.next())for(e=c.iterator(),g=e.next();g;g=e.next()",
    ")if(a(A(d),A(g)))return!0;return!1}if(b instanceof E||c instanceof E){b",
    " instanceof E?(e=b,d=c):(e=c,d=b);g=e.iterator();for(var h=typeof d,m=g",
    ".next();m;m=g.next()){switch(h){case \"number\":m=+A(m);break;case \"bo",
    "olean\":m=!!A(m);break;case \"string\":m=A(m);break;default:throw Error",
    "(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(m,d)||e==c&&",
    "a(d,m))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==t",
    "ypeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):",
    "a(b,c):a(+b,+c)}L.prototype.evaluate=function(a){return this.X.D(this.c",
    "a,this.ha,a)};L.prototype.toString=function(){var a=\"Binary Expression",
    ": \"+this.X;a+=H(this.ca);return a+=H(this.ha)};function Ra(a,b,c,d){th",
    "is.ta=a;this.fa=b;this.i=c;this.D=d}Ra.prototype.toString=function(){re",
    "turn this.ta};var Sa={};\nfunction N(a,b,c,d){if(Sa.hasOwnProperty(a))t",
    "hrow Error(\"Binary operator already created: \"+a);a=new Ra(a,b,c,d);r",
    "eturn Sa[a.toString()]=a}N(\"div\",6,1,function(a,b,c){return I(a,c)/I(",
    "b,c)});N(\"mod\",6,1,function(a,b,c){return I(a,c)%I(b,c)});N(\"*\",6,1",
    ",function(a,b,c){return I(a,c)*I(b,c)});N(\"+\",5,1,function(a,b,c){ret",
    "urn I(a,c)+I(b,c)});N(\"-\",5,1,function(a,b,c){return I(a,c)-I(b,c)});",
    "N(\"<\",4,2,function(a,b,c){return M(function(a,b){return a<b},a,b,c)})",
    ";\nN(\">\",4,2,function(a,b,c){return M(function(a,b){return a>b},a,b,c",
    ")});N(\"<=\",4,2,function(a,b,c){return M(function(a,b){return a<=b},a,",
    "b,c)});N(\">=\",4,2,function(a,b,c){return M(function(a,b){return a>=b}",
    ",a,b,c)});var Qa=N(\"=\",3,2,function(a,b,c){return M(function(a,b){ret",
    "urn a==b},a,b,c,!0)});N(\"!=\",3,2,function(a,b,c){return M(function(a,",
    "b){return a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){return K(a,c)",
    "&&K(b,c)});N(\"or\",1,2,function(a,b,c){return K(a,c)||K(b,c)});functio",
    "n Ta(a,b){if(b.u()&&4!=a.i)throw Error(\"Primary expression must evalua",
    "te to nodeset if filter has predicate(s).\");G.call(this,a.i);this.ga=a",
    ";this.f=b;this.w=a.h();this.l=a.l}n(Ta,G);Ta.prototype.evaluate=functio",
    "n(a){a=this.ga.evaluate(a);return Ua(this.f,a)};Ta.prototype.toString=f",
    "unction(){var a=\"Filter:\"+H(this.ga);return a+=H(this.f)};function Va",
    "(a,b){if(b.length<a.ea)throw Error(\"Function \"+a.m+\" expects at leas",
    "t\"+a.ea+\" arguments, \"+b.length+\" given\");if(null!==a.W&&b.length>",
    "a.W)throw Error(\"Function \"+a.m+\" expects at most \"+a.W+\" argument",
    "s, \"+b.length+\" given\");a.ra&&p(b,function(b,d){if(4!=b.i)throw Erro",
    "r(\"Argument \"+d+\" to function \"+a.m+\" is not of type Nodeset: \"+b",
    ");});G.call(this,a.i);this.M=a;this.S=b;Oa(this,a.w||r(b,function(a){re",
    "turn a.h()}));Pa(this,a.pa&&!b.length||a.oa&&!!b.length||r(b,function(a",
    "){return a.l}))}\nn(Va,G);Va.prototype.evaluate=function(a){return this",
    ".M.D.apply(null,ka(a,this.S))};Va.prototype.toString=function(){var a=",
    "\"Function: \"+this.M;if(this.S.length){var b=q(this.S,function(a,b){re",
    "turn a+H(b)},\"Arguments:\");a+=H(b)}return a};function Wa(a,b,c,d,e,g,",
    "h,m){this.m=a;this.i=b;this.w=c;this.pa=d;this.oa=!1;this.D=e;this.ea=g",
    ";this.W=void 0!==h?h:g;this.ra=!!m}Wa.prototype.toString=function(){ret",
    "urn this.m};var Xa={};\nfunction O(a,b,c,d,e,g,h,m){if(Xa.hasOwnPropert",
    "y(a))throw Error(\"Function already created: \"+a+\".\");Xa[a]=new Wa(a",
    ",b,c,d,e,g,h,m)}O(\"boolean\",2,!1,!1,function(a,b){return K(b,a)},1);O",
    "(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(I(b,a))},1);O(\"con",
    "cat\",3,!1,!1,function(a,b){return q(la(arguments,1),function(b,d){retu",
    "rn b+J(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1,function(a,b,c){b=J(",
    "b,a);a=J(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,!1,!1,function(a",
    ",b){return b.evaluate(a).u()},1,1,!0);\nO(\"false\",2,!1,!1,function(){",
    "return!1},0);O(\"floor\",1,!1,!1,function(a,b){return Math.floor(I(b,a)",
    ")},1);O(\"id\",4,!1,!1,function(a,b){var c=a.s,d=9==c.nodeType?c:c.owne",
    "rDocument;a=J(b,a).split(/\\s+/);var e=[];p(a,function(a){a=d.getElemen",
    "tById(a);var b;if(!(b=!a)){a:if(l(e))b=l(a)&&1==a.length?e.indexOf(a,0)",
    ":-1;else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b",
    "}b||e.push(a)});e.sort(xa);var g=new E;p(e,function(a){g.add(a)});retur",
    "n g},1);O(\"lang\",2,!1,!1,function(){return!1},1);\nO(\"last\",1,!0,!1",
    ",function(a){if(1!=arguments.length)throw Error(\"Function last expects",
    " ()\");return a.o},0);O(\"local-name\",3,!1,!0,function(a,b){return(a=b",
    "?La(b.evaluate(a)):a.s)?a.localName||a.nodeName.toLowerCase():\"\"},0,1",
    ",!0);O(\"name\",3,!1,!0,function(a,b){return(a=b?La(b.evaluate(a)):a.s)",
    "?a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"namespace-uri\",3,!0,!1,fun",
    "ction(){return\"\"},0,1,!0);\nO(\"normalize-space\",3,!1,!0,function(a,",
    "b){return(b?J(b,a):A(a.s)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+",
    "|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,!1,function(a,b){return!K(b,a)},1);",
    "O(\"number\",1,!1,!0,function(a,b){return b?I(b,a):+A(a.s)},0,1);O(\"po",
    "sition\",1,!0,!1,function(a){return a.ua},0);O(\"round\",1,!1,!1,functi",
    "on(a,b){return Math.round(I(b,a))},1);O(\"starts-with\",2,!1,!1,functio",
    "n(a,b,c){b=J(b,a);a=J(c,a);return 0==b.lastIndexOf(a,0)},2);O(\"string",
    "\",3,!1,!0,function(a,b){return b?J(b,a):A(a.s)},0,1);\nO(\"string-leng",
    "th\",1,!1,!0,function(a,b){return(b?J(b,a):A(a.s)).length},0,1);O(\"sub",
    "string\",3,!1,!1,function(a,b,c,d){c=I(c,a);if(isNaN(c)||Infinity==c||-",
    "Infinity==c)return\"\";d=d?I(d,a):Infinity;if(isNaN(d)||-Infinity===d)r",
    "eturn\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=J(b,a);return Infinit",
    "y==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);O(\"substring-",
    "after\",3,!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);c=b.indexOf(a);return",
    "-1==c?\"\":b.substring(c+a.length)},2);\nO(\"substring-before\",3,!1,!1",
    ",function(a,b,c){b=J(b,a);a=J(c,a);a=b.indexOf(a);return-1==a?\"\":b.su",
    "bstring(0,a)},2);O(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterat",
    "or();b=0;for(var c=a.next();c;c=a.next())b+=+A(c);return b},1,1,!0);O(",
    "\"translate\",3,!1,!1,function(a,b,c,d){b=J(b,a);c=J(c,a);var e=J(d,a);",
    "a={};for(d=0;d<c.length;d++){var g=c.charAt(d);g in a||(a[g]=e.charAt(d",
    "))}c=\"\";for(d=0;d<b.length;d++)g=b.charAt(d),c+=g in a?a[g]:g;return ",
    "c},3);O(\"true\",2,!1,!1,function(){return!0},0);function F(a,b){this.j",
    "a=a;this.da=void 0!==b?b:null;this.A=null;switch(a){case \"comment\":th",
    "is.A=8;break;case \"text\":this.A=3;break;case \"processing-instruction",
    "\":this.A=7;break;case \"node\":break;default:throw Error(\"Unexpected ",
    "argument\");}}function Ya(a){return\"comment\"==a||\"text\"==a||\"proce",
    "ssing-instruction\"==a||\"node\"==a}F.prototype.matches=function(a){ret",
    "urn null===this.A||this.A==a.nodeType};F.prototype.getName=function(){r",
    "eturn this.ja};\nF.prototype.toString=function(){var a=\"Kind Test: \"+",
    "this.ja;null===this.da||(a+=H(this.da));return a};function Za(a){G.call",
    "(this,3);this.ia=a.substring(1,a.length-1)}n(Za,G);Za.prototype.evaluat",
    "e=function(){return this.ia};Za.prototype.toString=function(){return\"L",
    "iteral: \"+this.ia};function P(a,b){this.m=a.toLowerCase();a=\"*\"==thi",
    "s.m?\"*\":\"http://www.w3.org/1999/xhtml\";this.O=b?b.toLowerCase():a}P",
    ".prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;",
    "b=void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=this.m&&this",
    ".m!=b.toLowerCase()?!1:\"*\"==this.O?!0:this.O==(a.namespaceURI?a.names",
    "paceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};P.prototype.ge",
    "tName=function(){return this.m};\nP.prototype.toString=function(){retur",
    "n\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.O?\"\":this.O+",
    "\":\")+this.m};function $a(a){G.call(this,1);this.ka=a}n($a,G);$a.proto",
    "type.evaluate=function(){return this.ka};$a.prototype.toString=function",
    "(){return\"Number: \"+this.ka};function ab(a,b){G.call(this,a.i);this.b",
    "a=a;this.L=b;this.w=a.h();this.l=a.l;1==this.L.length&&(a=this.L[0],a.T",
    "||a.B!=bb||(a=a.R,\"*\"!=a.getName()&&(this.K={name:a.getName(),I:null}",
    ")))}n(ab,G);function Q(){G.call(this,4)}n(Q,G);Q.prototype.evaluate=fun",
    "ction(a){var b=new E;a=a.s;9==a.nodeType?b.add(a):b.add(a.ownerDocument",
    ");return b};Q.prototype.toString=function(){return\"Root Helper Express",
    "ion\"};function cb(){G.call(this,4)}n(cb,G);cb.prototype.evaluate=funct",
    "ion(a){var b=new E;b.add(a.s);return b};\ncb.prototype.toString=functio",
    "n(){return\"Context Helper Expression\"};function db(a){return\"/\"==a|",
    "|\"//\"==a}\nab.prototype.evaluate=function(a){var b=this.ba.evaluate(a",
    ");if(!(b instanceof E))throw Error(\"Filter expression must evaluate to",
    " nodeset.\");a=this.L;for(var c=0,d=a.length;c<d&&b.u();c++){var e=a[c]",
    ",g=b.iterator(e.B.H);if(e.h()||e.B!=eb)if(e.h()||e.B!=fb){var h=g.next(",
    ");for(b=e.evaluate(new y(h));null!=(h=g.next());)h=e.evaluate(new y(h))",
    ",b=Ka(b,h)}else h=g.next(),b=e.evaluate(new y(h));else{for(h=g.next();(",
    "b=g.next())&&(!h.contains||h.contains(b))&&b.compareDocumentPosition(h)",
    "&8;h=b);b=e.evaluate(new y(h))}}return b};\nab.prototype.toString=funct",
    "ion(){var a=\"Path Expression:\"+H(this.ba);if(this.L.length){var b=q(t",
    "his.L,function(a,b){return a+H(b)},\"Steps:\");a+=H(b)}return a};functi",
    "on R(a,b){this.f=a;this.H=!!b}function Ua(a,b,c){for(c=c||0;c<a.f.lengt",
    "h;c++)for(var d=a.f[c],e=b.iterator(),g=b.u(),h,m=0;h=e.next();m++){var",
    " B=a.H?g-m:m+1;h=d.evaluate(new y(h,B,g));if(\"number\"==typeof h)B=B==",
    "h;else if(\"string\"==typeof h||\"boolean\"==typeof h)B=!!h;else if(h i",
    "nstanceof E)B=0<h.u();else throw Error(\"Predicate.evaluate returned an",
    " unexpected type.\");B||e.remove()}return b}R.prototype.C=function(){re",
    "turn 0<this.f.length?this.f[0].C():null};\nR.prototype.h=function(){for",
    "(var a=0;a<this.f.length;a++){var b=this.f[a];if(b.h()||1==b.i||0==b.i)",
    "return!0}return!1};R.prototype.u=function(){return this.f.length};R.pro",
    "totype.toString=function(){return q(this.f,function(a,b){return a+H(b)}",
    ",\"Predicates:\")};function S(a,b,c,d){G.call(this,4);this.B=a;this.R=b",
    ";this.f=c||new R([]);this.T=!!d;b=this.f.C();a.va&&b&&(this.K={name:b.n",
    "ame,I:b.I});this.w=this.f.h()}n(S,G);\nS.prototype.evaluate=function(a)",
    "{var b=a.s,c=this.C(),d=null,e=null,g=0;c&&(d=c.name,e=c.I?J(c.I,a):nul",
    "l,g=1);if(this.T)if(this.h()||this.B!=gb)if(b=(new S(hb,new F(\"node\")",
    ")).evaluate(a).iterator(),c=b.next())for(a=this.D(c,d,e,g);null!=(c=b.n",
    "ext());)a=Ka(a,this.D(c,d,e,g));else a=new E;else a=D(this.R,b,d,e),a=U",
    "a(this.f,a,g);else a=this.D(a.s,d,e,g);return a};S.prototype.D=function",
    "(a,b,c,d){a=this.B.M(this.R,a,b,c);return a=Ua(this.f,a,d)};\nS.prototy",
    "pe.toString=function(){var a=\"Step:\"+H(\"Operator: \"+(this.T?\"//\":",
    "\"/\"));this.B.m&&(a+=H(\"Axis: \"+this.B));a+=H(this.R);if(this.f.u())",
    "{var b=q(this.f.f,function(a,b){return a+H(b)},\"Predicates:\");a+=H(b)",
    "}return a};function ib(a,b,c,d){this.m=a;this.M=b;this.H=c;this.va=d}ib",
    ".prototype.toString=function(){return this.m};var jb={};function T(a,b,",
    "c,d){if(jb.hasOwnProperty(a))throw Error(\"Axis already created: \"+a);",
    "b=new ib(a,b,c,!!d);return jb[a]=b}\nT(\"ancestor\",function(a,b){for(v",
    "ar c=new E;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);T(",
    "\"ancestor-or-self\",function(a,b){var c=new E;do a.matches(b)&&c.unshi",
    "ft(b);while(b=b.parentNode);return c},!0);\nvar bb=T(\"attribute\",func",
    "tion(a,b){var c=new E,d=a.getName();if(b=b.attributes)if(a instanceof F",
    "&&null===a.A||\"*\"==d)for(a=0;d=b[a];a++)c.add(d);else(d=b.getNamedIte",
    "m(d))&&c.add(d);return c},!1),gb=T(\"child\",function(a,b,c,d,e){c=l(c)",
    "?c:null;d=l(d)?d:null;e=e||new E;for(b=b.firstChild;b;b=b.nextSibling)C",
    "(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);T(\"descendant\",D,!1,",
    "!0);\nvar hb=T(\"descendant-or-self\",function(a,b,c,d){var e=new E;C(b",
    ",c,d)&&a.matches(b)&&e.add(b);return D(a,b,c,d,e)},!1,!0),eb=T(\"follow",
    "ing\",function(a,b,c,d){var e=new E;do for(var g=b;g=g.nextSibling;)C(g",
    ",c,d)&&a.matches(g)&&e.add(g),e=D(a,g,c,d,e);while(b=b.parentNode);retu",
    "rn e},!1,!0);T(\"following-sibling\",function(a,b){for(var c=new E;b=b.",
    "nextSibling;)a.matches(b)&&c.add(b);return c},!1);T(\"namespace\",funct",
    "ion(){return new E},!1);\nvar kb=T(\"parent\",function(a,b){var c=new E",
    ";if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerElement",
    "),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},!1),fb=T(\"precedin",
    "g\",function(a,b,c,d){var e=new E,g=[];do g.unshift(b);while(b=b.parent",
    "Node);for(var h=1,m=g.length;h<m;h++){var B=[];for(b=g[h];b=b.previousS",
    "ibling;)B.unshift(b);for(var Ba=0,Gb=B.length;Ba<Gb;Ba++)b=B[Ba],C(b,c,",
    "d)&&a.matches(b)&&e.add(b),e=D(a,b,c,d,e)}return e},!0,!0);\nT(\"preced",
    "ing-sibling\",function(a,b){for(var c=new E;b=b.previousSibling;)a.matc",
    "hes(b)&&c.unshift(b);return c},!0);var lb=T(\"self\",function(a,b){var ",
    "c=new E;a.matches(b)&&c.add(b);return c},!1);function mb(a){G.call(this",
    ",1);this.aa=a;this.w=a.h();this.l=a.l}n(mb,G);mb.prototype.evaluate=fun",
    "ction(a){return-I(this.aa,a)};mb.prototype.toString=function(){return\"",
    "Unary Expression: -\"+H(this.aa)};function nb(a){G.call(this,4);this.P=",
    "a;Oa(this,r(this.P,function(a){return a.h()}));Pa(this,r(this.P,functio",
    "n(a){return a.l}))}n(nb,G);nb.prototype.evaluate=function(a){var b=new ",
    "E;p(this.P,function(c){c=c.evaluate(a);if(!(c instanceof E))throw Error",
    "(\"Path expression must evaluate to NodeSet.\");b=Ka(b,c)});return b};n",
    "b.prototype.toString=function(){return q(this.P,function(a,b){return a+",
    "H(b)},\"Union Expression:\")};function ob(a,b){this.a=a;this.sa=b}funct",
    "ion pb(a){for(var b,c=[];;){U(a,\"Missing right hand side of binary exp",
    "ression.\");b=qb(a);var d=a.a.next();if(!d)break;var e=(d=Sa[d]||null)&",
    "&d.fa;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].fa;)b=new",
    " L(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new L(c.pop(),c.pop(",
    "),b);return b}function U(a,b){if(a.a.empty())throw Error(b);}function r",
    "b(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" ",
    "got: \"+a);}\nfunction sb(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad",
    " token: \"+a);}function tb(a){a=a.a.next();if(2>a.length)throw Error(\"",
    "Unclosed literal string\");return new Za(a)}\nfunction ub(a){var b=[];i",
    "f(db(z(a.a))){var c=a.a.next();var d=z(a.a);if(\"/\"==c&&(a.a.empty()||",
    "\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))ret",
    "urn new Q;d=new Q;U(a,\"Missing next location step.\");c=vb(a,c);b.push",
    "(c)}else{a:{c=z(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"V",
    "ariable reference not allowed in HTML XPath\");case \"(\":a.a.next();c=",
    "pb(a);U(a,'unclosed \"(\"');rb(a,\")\");break;case '\"':case \"'\":c=tb",
    "(a);break;default:if(isNaN(+c))if(!Ya(c)&&/(?![0-9])[\\w]/.test(d)&&\"(",
    "\"==z(a.a,\n1)){c=a.a.next();c=Xa[c]||null;a.a.next();for(d=[];\")\"!=z",
    "(a.a);){U(a,\"Missing function argument list.\");d.push(pb(a));if(\",\"",
    "!=z(a.a))break;a.a.next()}U(a,\"Unclosed function argument list.\");sb(",
    "a);c=new Va(c,d)}else{c=null;break a}else c=new $a(+a.a.next())}\"[\"==",
    "z(a.a)&&(d=new R(wb(a)),c=new Ta(c,d))}if(c)if(db(z(a.a)))d=c;else retu",
    "rn c;else c=vb(a,\"/\"),d=new cb,b.push(c)}for(;db(z(a.a));)c=a.a.next(",
    "),U(a,\"Missing next location step.\"),c=vb(a,c),b.push(c);return new a",
    "b(d,b)}\nfunction vb(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op s",
    "hould be \"/\" or \"//\"');if(\".\"==z(a.a)){var c=new S(lb,new F(\"nod",
    "e\"));a.a.next();return c}if(\"..\"==z(a.a))return c=new S(kb,new F(\"n",
    "ode\")),a.a.next(),c;if(\"@\"==z(a.a)){var d=bb;a.a.next();U(a,\"Missin",
    "g attribute name\")}else if(\"::\"==z(a.a,1)){if(!/(?![0-9])[\\w]/.test",
    "(z(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.ne",
    "xt();d=jb[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.nex",
    "t();U(a,\"Missing node name\")}else d=gb;e=\nz(a.a);if(/(?![0-9])[\\w",
    "\\*]/.test(e.charAt(0)))if(\"(\"==z(a.a,1)){if(!Ya(e))throw Error(\"Inv",
    "alid node type: \"+e);e=a.a.next();if(!Ya(e))throw Error(\"Invalid type",
    " name: \"+e);rb(a,\"(\");U(a,\"Bad nodetype\");var g=z(a.a).charAt(0),h",
    "=null;if('\"'==g||\"'\"==g)h=tb(a);U(a,\"Bad nodetype\");sb(a);e=new F(",
    "e,h)}else if(e=a.a.next(),g=e.indexOf(\":\"),-1==g)e=new P(e);else{h=e.",
    "substring(0,g);if(\"*\"==h)var m=\"*\";else if(m=a.sa(h),!m)throw Error",
    "(\"Namespace prefix not declared: \"+h);e=e.substr(g+1);e=new P(e,m)}el",
    "se throw Error(\"Bad token: \"+\na.a.next());a=new R(wb(a),d.H);return ",
    "c||new S(d,e,a,\"//\"==b)}function wb(a){for(var b=[];\"[\"==z(a.a);){a",
    ".a.next();U(a,\"Missing predicate expression.\");var c=pb(a);b.push(c);",
    "U(a,\"Unclosed predicate expression.\");rb(a,\"]\")}return b}function q",
    "b(a){if(\"-\"==z(a.a))return a.a.next(),new mb(qb(a));var b=ub(a);if(\"",
    "|\"!=z(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)U(a,\"Missing next un",
    "ion location path.\"),b.push(ub(a));a.a.back();a=new nb(b)}return a};fu",
    "nction xb(a){switch(a.nodeType){case 1:return fa(yb,a);case 9:return xb",
    "(a.documentElement);case 11:case 10:case 6:case 12:return zb;default:re",
    "turn a.parentNode?xb(a.parentNode):zb}}function zb(){return null}functi",
    "on yb(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/19",
    "99/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified",
    "?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?yb(a.parentNode,b",
    "):null};function Ab(a,b){if(!a.length)throw Error(\"Empty XPath express",
    "ion.\");a=Ea(a);if(a.empty())throw Error(\"Invalid XPath expression.\")",
    ";b?\"function\"==ba(b)||(b=ea(b.lookupNamespaceURI,b)):b=function(){ret",
    "urn null};var c=pb(new ob(a,b));if(!a.empty())throw Error(\"Bad token: ",
    "\"+a.next());this.evaluate=function(a,b){a=c.evaluate(new y(a));return ",
    "new V(a,b)}}\nfunction V(a,b){if(0==b)if(a instanceof E)b=4;else if(\"s",
    "tring\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolea",
    "n\"==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");i",
    "f(2!=b&&1!=b&&3!=b&&!(a instanceof E))throw Error(\"value could not be ",
    "converted to the specified type\");this.resultType=b;switch(b){case 2:t",
    "his.stringValue=a instanceof E?Ma(a):\"\"+a;break;case 1:this.numberVal",
    "ue=a instanceof E?+Ma(a):+a;break;case 3:this.booleanValue=a instanceof",
    " E?0<a.u():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();v",
    "ar d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a",
    ".u();this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeVa",
    "lue=La(a);break;default:throw Error(\"Unknown XPathResult type.\");}var",
    " g=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNex",
    "t called with wrong result type\");return g>=d.length?null:d[g++]};this",
    ".snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem call",
    "ed with wrong result type\");return a>=d.length||0>a?null:d[a]}}\nV.ANY",
    "_TYPE=0;V.NUMBER_TYPE=1;V.STRING_TYPE=2;V.BOOLEAN_TYPE=3;V.UNORDERED_NO",
    "DE_ITERATOR_TYPE=4;V.ORDERED_NODE_ITERATOR_TYPE=5;V.UNORDERED_NODE_SNAP",
    "SHOT_TYPE=6;V.ORDERED_NODE_SNAPSHOT_TYPE=7;V.ANY_UNORDERED_NODE_TYPE=8;",
    "V.FIRST_ORDERED_NODE_TYPE=9;function Bb(a){this.lookupNamespaceURI=xb(a",
    ")}\naa(\"wgxpath.install\",function(a,b){a=a||k;var c=a.Document&&a.Doc",
    "ument.prototype||a.document;if(!c.evaluate||b)a.XPathResult=V,c.evaluat",
    "e=function(a,b,c,h){return(new Ab(a,c)).evaluate(b,h)},c.createExpressi",
    "on=function(a,b){return new Ab(a,b)},c.createNSResolver=function(a){ret",
    "urn new Bb(a)}});va();va();function Cb(){this.A=\"submit\";this.ma=this",
    ".la=!0}Cb.prototype.create=function(a){a=Aa(a).createEvent(\"HTMLEvents",
    "\");a.initEvent(this.A,this.la,this.ma);return a};Cb.prototype.toString",
    "=function(){return this.A};var Db=new Cb;function Eb(){this.$=ha.docume",
    "nt.documentElement;a:{var a=Aa(this.$);try{var b=a&&a.activeElement;bre",
    "ak a}catch(c){}b=null}b&&Fb(this,b)}function Fb(a,b){a.$=b;x(b,\"OPTION",
    "\")&&Ca(b,function(a){return x(a,\"SELECT\")})}function Hb(a){return x(",
    "a,\"FORM\")};function W(a,b){this.v={};this.g=[];this.G=0;var c=argumen",
    "ts.length;if(1<c){if(c%2)throw Error(\"Uneven number of arguments\");fo",
    "r(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&this.a",
    "ddAll(a)}function Ib(a){Jb(a);return a.g.concat()}f=W.prototype;f.clear",
    "=function(){this.v={};this.G=this.g.length=0};f.remove=function(a){retu",
    "rn Object.prototype.hasOwnProperty.call(this.v,a)?(delete this.v[a],thi",
    "s.G--,this.g.length>2*this.G&&Jb(this),!0):!1};\nfunction Jb(a){if(a.G!",
    "=a.g.length){for(var b=0,c=0;b<a.g.length;){var d=a.g[b];Object.prototy",
    "pe.hasOwnProperty.call(a.v,d)&&(a.g[c++]=d);b++}a.g.length=c}if(a.G!=a.",
    "g.length){var e={};for(c=b=0;b<a.g.length;)d=a.g[b],Object.prototype.ha",
    "sOwnProperty.call(e,d)||(a.g[c++]=d,e[d]=1),b++;a.g.length=c}}f.get=fun",
    "ction(a,b){return Object.prototype.hasOwnProperty.call(this.v,a)?this.v",
    "[a]:b};f.set=function(a,b){Object.prototype.hasOwnProperty.call(this.v,",
    "a)||(this.G++,this.g.push(a));this.v[a]=b};\nf.addAll=function(a){if(a ",
    "instanceof W){var b=Ib(a);Jb(a);for(var c=[],d=0;d<a.g.length;d++)c.pus",
    "h(a.v[a.g[d]]);a=c}else{b=[];d=0;for(var e in a)b[d++]=e;d=[];e=0;for(c",
    " in a)d[e++]=a[c];a=d}for(c=0;c<b.length;c++)this.set(b[c],a[c])};f.for",
    "Each=function(a,b){for(var c=Ib(this),d=0;d<c.length;d++){var e=c[d],g=",
    "this.get(e);a.call(b,g,e,this)}};f.clone=function(){return new W(this)}",
    ";var Kb={};function X(a,b,c){var d=typeof a;(\"object\"==d&&null!=a||\"",
    "function\"==d)&&(a=a.b);a=new Lb(a);!b||b in Kb&&!c||(Kb[b]={key:a,shif",
    "t:!1},c&&(Kb[c]={key:a,shift:!0}));return a}function Lb(a){this.code=a}",
    "X(8);X(9);X(13);var Mb=X(16),Nb=X(17),Ob=X(18);X(19);X(20);X(27);X(32,",
    "\" \");X(33);X(34);X(35);X(36);X(37);X(38);X(39);X(40);X(44);X(45);X(46",
    ");X(48,\"0\",\")\");X(49,\"1\",\"!\");X(50,\"2\",\"@\");X(51,\"3\",\"#",
    "\");X(52,\"4\",\"$\");X(53,\"5\",\"%\");X(54,\"6\",\"^\");X(55,\"7\",\"",
    "&\");X(56,\"8\",\"*\");X(57,\"9\",\"(\");X(65,\"a\",\"A\");\nX(66,\"b\"",
    ",\"B\");X(67,\"c\",\"C\");X(68,\"d\",\"D\");X(69,\"e\",\"E\");X(70,\"f",
    "\",\"F\");X(71,\"g\",\"G\");X(72,\"h\",\"H\");X(73,\"i\",\"I\");X(74,\"",
    "j\",\"J\");X(75,\"k\",\"K\");X(76,\"l\",\"L\");X(77,\"m\",\"M\");X(78,",
    "\"n\",\"N\");X(79,\"o\",\"O\");X(80,\"p\",\"P\");X(81,\"q\",\"Q\");X(82",
    ",\"r\",\"R\");X(83,\"s\",\"S\");X(84,\"t\",\"T\");X(85,\"u\",\"U\");X(8",
    "6,\"v\",\"V\");X(87,\"w\",\"W\");X(88,\"x\",\"X\");X(89,\"y\",\"Y\");X(",
    "90,\"z\",\"Z\");var Pb=X(ra?{c:91,b:91}:qa?{c:224,b:91}:{c:0,b:91});X(r",
    "a?{c:92,b:92}:qa?{c:224,b:93}:{c:0,b:92});X(ra?{c:93,b:93}:qa?{c:0,b:0}",
    ":{c:93,b:null});\nX({c:96,b:96},\"0\");X({c:97,b:97},\"1\");X({c:98,b:9",
    "8},\"2\");X({c:99,b:99},\"3\");X({c:100,b:100},\"4\");X({c:101,b:101},",
    "\"5\");X({c:102,b:102},\"6\");X({c:103,b:103},\"7\");X({c:104,b:104},\"",
    "8\");X({c:105,b:105},\"9\");X({c:106,b:106},\"*\");X({c:107,b:107},\"+",
    "\");X({c:109,b:109},\"-\");X({c:110,b:110},\".\");X({c:111,b:111},\"/\"",
    ");X(144);X(112);X(113);X(114);X(115);X(116);X(117);X(118);X(119);X(120)",
    ";X(121);X(122);X(123);X({c:107,b:187},\"=\",\"+\");X(108,\",\");X({c:10",
    "9,b:189},\"-\",\"_\");X(188,\",\",\"<\");X(190,\".\",\">\");X(191,\"/\"",
    ",\"?\");\nX(192,\"`\",\"~\");X(219,\"[\",\"{\");X(220,\"\\\\\",\"|\");X",
    "(221,\"]\",\"}\");X({c:59,b:186},\";\",\":\");X(222,\"'\",'\"');var Y=n",
    "ew W;Y.set(1,Mb);Y.set(2,Nb);Y.set(4,Ob);Y.set(8,Pb);(function(a){var b",
    "=new W;p(Ib(a),function(c){b.set(a.get(c).code,c)});return b})(Y);funct",
    "ion Z(){Eb.call(this)}n(Z,Eb);Z.U=void 0;Z.na=function(){return Z.U?Z.U",
    ":Z.U=new Z};aa(\"_\",function(a){var b=Ca(a,Hb,!0);if(!b)throw new t(7,",
    "\"Element was not in a form, so could not submit.\");var c=Z.na();Fb(c,",
    "a);if(!Hb(b))throw new t(12,\"Element is not a form, so could not submi",
    "t.\");a=Db.create(b,void 0);\"isTrusted\"in a||(a.isTrusted=!1);b.dispa",
    "tchEvent(a)&&(x(b.submit)?b.constructor.prototype.submit.call(b):b.subm",
    "it())});; return this._.apply(null,arguments);}.apply({navigator:typeof",
    " window!='undefined'?window.navigator:null,document:typeof window!='und",
    "efined'?window.document:null}, arguments);}",
    NULL
};

const char* const FIND_ELEMENT[] = {
    "function(){return function(){var h,aa=this;function l(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&l(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function p(a){return\"function\"==",
    "ca(a)}function ea(a){var b=typeof a;return\"object\"==b&&null!=a||\"fun",
    "ction\"==b}function fa(a,b,c){return a.call.apply(a.bind,arguments)}\nf",
    "unction ha(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra",
    "y.prototype.slice.call(arguments,2);return function(){var c=Array.proto",
    "type.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.",
    "apply(b,c)}}return function(){return a.apply(b,arguments)}}function ia(",
    "a,b,c){ia=Function.prototype.bind&&-1!=Function.prototype.bind.toString",
    "().indexOf(\"native code\")?fa:ha;return ia.apply(null,arguments)}\nfun",
    "ction ja(a,b){var c=Array.prototype.slice.call(arguments,1);return func",
    "tion(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)",
    "}}function q(a,b){function c(){}c.prototype=b.prototype;a.xa=b.prototyp",
    "e;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,c,f){for(",
    "var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argum",
    "ents[e];return b.prototype[c].apply(a,d)}};var ka=window;var la;functio",
    "n ma(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b)==b}var na=Stri",
    "ng.prototype.trim?function(a){return a.trim()}:function(a){return a.rep",
    "lace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function oa(a){return String(a",
    ").replace(/\\-([a-z])/g,function(a,c){return c.toUpperCase()})};functio",
    "n pa(a,b){if(m(a))return m(b)&&1==b.length?a.indexOf(b,0):-1;for(var c=",
    "0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}function t(a,b){",
    "for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(vo",
    "id 0,d[e],e,a)}function qa(a,b){for(var c=a.length,d=[],e=0,f=m(a)?a.sp",
    "lit(\"\"):a,g=0;g<c;g++)if(g in f){var k=f[g];b.call(void 0,k,g,a)&&(d[",
    "e++]=k)}return d}function ra(a,b,c){var d=c;t(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}\nfunction sa(a,b){for(var c=a.length,d=m(a)",
    "?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!",
    "0;return!1}function ta(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e",
    "=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))return!1;return!0}functi",
    "on ua(a,b){a:{for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(",
    "e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return 0>b?null:m(a)?",
    "a.charAt(b):a[b]}function va(a){return Array.prototype.concat.apply([],",
    "arguments)}\nfunction wa(a){var b=a.length;if(0<b){for(var c=Array(b),d",
    "=0;d<b;d++)c[d]=a[d];return c}return[]}function xa(a,b,c){return 2>=arg",
    "uments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.cal",
    "l(a,b,c)};var ya={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:",
    "\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",",
    "bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"",
    "#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887",
    "\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",c",
    "oral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimso",
    "n:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b",
    "\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\"",
    ",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",d",
    "arkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\"",
    ",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",da",
    "rkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f",
    "4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff149",
    "3\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dod",
    "gerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",fores",
    "tgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhi",
    "te:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",",
    "green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#",
    "f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",i",
    "vory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:",
    "\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"",
    "#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodye",
    "llow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey",
    ":\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagr",
    "een:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lig",
    "htslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe",
    "0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"",
    "#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"",
    "#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagr",
    "een:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a",
    "\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue",
    ":\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#",
    "ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",o",
    "live:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#",
    "ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb",
    "98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip:\"#",
    "ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:",
    "\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",r",
    "osybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salm",
    "on:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:",
    "\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",s",
    "lateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:",
    "\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c",
    "\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"",
    "#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whites",
    "moke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var za=\"b",
    "ackgroundColor borderTopColor borderRightColor borderBottomColor border",
    "LeftColor color outlineColor\".split(\" \"),Aa=/#([0-9a-fA-F])([0-9a-fA",
    "-F])([0-9a-fA-F])/,Ba=/^#(?:[0-9a-f]{3}){1,2}$/i,Ca=/^(?:rgba)?\\((\\d{",
    "1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,Da=/^(?:rg",
    "b)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$",
    "/i;function u(a,b){this.code=a;this.state=v[a]||Ea;this.message=b||\"\"",
    ";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpper",
    "Case().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(",
    "\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=t",
    "his.name;this.stack=a.stack||\"\"}q(u,Error);var Ea=\"unknown error\",v",
    "={15:\"element not selectable\",11:\"element not visible\"};v[31]=Ea;v[",
    "30]=Ea;v[24]=\"invalid cookie domain\";v[29]=\"invalid element coordina",
    "tes\";v[12]=\"invalid element state\";\nv[32]=\"invalid selector\";v[51",
    "]=\"invalid selector\";v[52]=\"invalid selector\";v[17]=\"javascript er",
    "ror\";v[405]=\"unsupported operation\";v[34]=\"move target out of bound",
    "s\";v[27]=\"no such alert\";v[7]=\"no such element\";v[8]=\"no such fra",
    "me\";v[23]=\"no such window\";v[28]=\"script timeout\";v[33]=\"session ",
    "not created\";v[10]=\"stale element reference\";v[21]=\"timeout\";v[25]",
    "=\"unable to set cookie\";v[26]=\"unexpected alert open\";v[13]=Ea;v[9]",
    "=\"unknown command\";u.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function w(a,b){this.x=l(a)?a:0;this.y=l(b)?b:0}h=",
    "w.prototype;h.clone=function(){return new w(this.x,this.y)};h.toString=",
    "function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function(){th",
    "is.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.floor=fu",
    "nction(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return thi",
    "s};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.",
    "y);return this};\nh.translate=function(a,b){a instanceof w?(this.x+=a.x",
    ",this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h.scal",
    "e=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Ga",
    "(a,b){this.width=a;this.height=b}h=Ga.prototype;h.clone=function(){retu",
    "rn new Ga(this.width,this.height)};h.toString=function(){return\"(\"+th",
    "is.width+\" x \"+this.height+\")\"};h.aspectRatio=function(){return thi",
    "s.width/this.height};h.ceil=function(){this.width=Math.ceil(this.width)",
    ";this.height=Math.ceil(this.height);return this};h.floor=function(){thi",
    "s.width=Math.floor(this.width);this.height=Math.floor(this.height);retu",
    "rn this};\nh.round=function(){this.width=Math.round(this.width);this.he",
    "ight=Math.round(this.height);return this};h.scale=function(a,b){b=n(b)?",
    "b:a;this.width*=a;this.height*=b;return this};function y(a){return a?ne",
    "w Ha(z(a)):la||(la=new Ha)}function Ia(a,b,c){function d(c){c&&b.append",
    "Child(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.length;e++){var f=c[e",
    "];!da(f)||ea(f)&&0<f.nodeType?d(f):t(Ja(f)?wa(f):f,d)}}function Ka(a){f",
    "or(;a&&1!=a.nodeType;)a=a.previousSibling;return a}\nfunction La(a,b){i",
    "f(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(",
    "b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a",
    ".compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==",
    "a}\nfunction Ma(a,b){if(a==b)return 0;if(a.compareDocumentPosition)retu",
    "rn a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parent",
    "Node&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeTy",
    "pe;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.pa",
    "rentNode;return e==f?Na(a,b):!c&&La(e,b)?-1*Oa(a,b):!d&&La(f,a)?Oa(b,a)",
    ":(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=z(a)",
    ";c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange();a.s",
    "electNode(b);\na.collapse(!0);return c.compareBoundaryPoints(aa.Range.S",
    "TART_TO_END,a)}function Oa(a,b){var c=a.parentNode;if(c==b)return-1;for",
    "(;b.parentNode!=c;)b=b.parentNode;return Na(b,a)}function Na(a,b){for(;",
    "b=b.previousSibling;)if(b==a)return-1;return 1}function z(a){return 9==",
    "a.nodeType?a:a.ownerDocument||a.document}function Ja(a){if(a&&\"number",
    "\"==typeof a.length){if(ea(a))return\"function\"==typeof a.item||\"stri",
    "ng\"==typeof a.item;if(p(a))return\"function\"==typeof a.item}return!1}",
    "\nfunction Pa(a,b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a",
    ";a=a.parentNode;c++}return null}function Ha(a){this.C=a||aa.document||d",
    "ocument}h=Ha.prototype;h.getElementsByTagName=function(a,b){return(b||t",
    "his.C).getElementsByTagName(String(a))};\nfunction B(a,b,c,d){a=d||a.C;",
    "var e=b&&\"*\"!=b?String(b).toUpperCase():\"\";if(a.querySelectorAll&&a",
    ".querySelector&&(e||c))c=a.querySelectorAll(e+(c?\".\"+c:\"\"));else if",
    "(c&&a.getElementsByClassName)if(b=a.getElementsByClassName(c),e){a={};f",
    "or(var f=d=0,g;g=b[f];f++)e==g.nodeName&&(a[d++]=g);a.length=d;c=a}else",
    " c=b;else if(b=a.getElementsByTagName(e||\"*\"),c){a={};for(f=d=0;g=b[f",
    "];f++){e=g.className;var k;if(k=\"function\"==typeof e.split)k=0<=pa(e.",
    "split(/\\s+/),c);k&&(a[d++]=g)}a.length=d;c=a}else c=b;return c}\nh.cre",
    "ateElement=function(a){return this.C.createElement(String(a))};h.create",
    "TextNode=function(a){return this.C.createTextNode(String(a))};h.appendC",
    "hild=function(a,b){a.appendChild(b)};h.append=function(a,b){Ia(z(a),a,a",
    "rguments)};h.canHaveChildren=function(a){if(1!=a.nodeType)return!1;swit",
    "ch(a.tagName){case \"APPLET\":case \"AREA\":case \"BASE\":case \"BR\":c",
    "ase \"COL\":case \"COMMAND\":case \"EMBED\":case \"FRAME\":case \"HR\":",
    "case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"ISINDEX\":case \"KEY",
    "GEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\":case \"META\":c",
    "ase \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case \"SOURCE\":case \"ST",
    "YLE\":case \"TRACK\":case \"WBR\":return!1}return!0};\nh.removeNode=fun",
    "ction(a){return a&&a.parentNode?a.parentNode.removeChild(a):null};h.con",
    "tains=La;function Qa(a,b){b=b.toLowerCase();return\"style\"==b?Ra(a.sty",
    "le.cssText):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var Sa=",
    "/[;]+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[",
    "^()]*\\([^()]*\\))*[^()]*$)/;function Ra(a){var b=[];t(a.split(Sa),func",
    "tion(a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a",
    ".length&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.join(\"\");",
    "return b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction C(a,b){b&&\"s",
    "tring\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.t",
    "agName.toUpperCase()==b)};/*\n\n The MIT License\n\n Copyright (c) 2007",
    " Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is h",
    "ereby granted, free of charge, to any person obtaining a copy\n of this",
    " software and associated documentation files (the \"Software\"), to\n d",
    "eal in the Software without restriction, including without limitation t",
    "he\n rights to use, copy, modify, merge, publish, distribute, sublicens",
    "e, and/or\n sell copies of the Software, and to permit persons to whom ",
    "the Software is\n furnished to do so, subject to the following conditio",
    "ns:\n\n The above copyright notice and this permission notice shall be ",
    "included in\n all copies or substantial portions of the Software.\n\n T",
    "HE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRES",
    "S OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANT",
    "ABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO ",
    "EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,",
    " DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT O",
    "R OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE ",
    "OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction Ta(a,b,c)",
    "{this.m=a;this.ua=b||1;this.j=c||1};function Ua(a){this.W=a;this.M=0}fu",
    "nction Va(a){a=a.match(Wa);for(var b=0;b<a.length;b++)Xa.test(a[b])&&a.",
    "splice(b,1);return new Ua(a)}var Wa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-",
    "\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d",
    "*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Xa=/^\\s/;function E(a,b",
    "){return a.W[a.M+(b||0)]}Ua.prototype.next=function(){return this.W[thi",
    "s.M++]};Ua.prototype.back=function(){this.M--};Ua.prototype.empty=funct",
    "ion(){return this.W.length<=this.M};function F(a){var b=null,c=a.nodeTy",
    "pe;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==",
    "b||null==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.docu",
    "mentElement:a.firstChild;c=0;var d=[];for(b=\"\";a;){do 1!=a.nodeType&&",
    "(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].next",
    "Sibling););}}else b=a.nodeValue;return\"\"+b}\nfunction Ya(a,b,c){if(nu",
    "ll===b)return!0;try{if(!a.getAttribute)return!1}catch(d){return!1}retur",
    "n null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function Za(a,b,c,",
    "d,e){return $a.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new G)}\nfuncti",
    "on $a(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsBy",
    "Name(d),t(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassN",
    "ame&&d&&\"class\"==c?(b=b.getElementsByClassName(d),t(b,function(b){b.c",
    "lassName==d&&a.matches(b)&&e.add(b)})):a instanceof H?ab(a,b,c,d,e):b.g",
    "etElementsByTagName&&(b=b.getElementsByTagName(a.getName()),t(b,functio",
    "n(a){Ya(a,c,d)&&e.add(a)}));return e}\nfunction ab(a,b,c,d,e){for(b=b.f",
    "irstChild;b;b=b.nextSibling)Ya(b,c,d)&&a.matches(b)&&e.add(b),ab(a,b,c,",
    "d,e)};function G(){this.j=this.g=null;this.H=0}function bb(a){this.node",
    "=a;this.next=this.B=null}function cb(a,b){if(!a.g)return b;if(!b.g)retu",
    "rn a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c",
    ".next,b=b.next):0<Ma(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.B=",
    "d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.B=d,d=d.next=e,f++,e=e.next;a",
    ".j=d;a.H=f;return a}G.prototype.unshift=function(a){a=new bb(a);a.next=",
    "this.g;this.j?this.g.B=a:this.g=this.j=a;this.g=a;this.H++};\nG.prototy",
    "pe.add=function(a){a=new bb(a);a.B=this.j;this.g?this.j.next=a:this.g=t",
    "his.j=a;this.j=a;this.H++};function db(a){return(a=a.g)?a.node:null}G.p",
    "rototype.s=function(){return this.H};function eb(a){return(a=db(a))?F(a",
    "):\"\"}G.prototype.iterator=function(a){return new fb(this,!!a)};functi",
    "on fb(a,b){this.qa=a;this.Z=(this.D=b)?a.j:a.g;this.T=null}fb.prototype",
    ".next=function(){var a=this.Z;if(null==a)return null;var b=this.T=a;thi",
    "s.Z=this.D?a.B:a.next;return b.node};\nfb.prototype.remove=function(){v",
    "ar a=this.qa,b=this.T;if(!b)throw Error(\"Next must be called at least ",
    "once before remove.\");var c=b.B;b=b.next;c?c.next=b:a.g=b;b?b.B=c:a.j=",
    "c;a.H--;this.T=null};function I(a){this.f=a;this.h=this.v=!1;this.I=nul",
    "l}function J(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n ",
    " \")}I.prototype.c=function(){return this.v};function gb(a,b){a.v=b}fun",
    "ction hb(a,b){a.h=b}I.prototype.A=function(){return this.I};function K(",
    "a,b){a=a.evaluate(b);return a instanceof G?+eb(a):+a}function M(a,b){a=",
    "a.evaluate(b);return a instanceof G?eb(a):\"\"+a}function ib(a,b){a=a.e",
    "valuate(b);return a instanceof G?!!a.s():!!a};function jb(a,b,c){I.call",
    "(this,a.f);this.V=a;this.ca=b;this.ia=c;this.v=b.c()||c.c();this.h=b.h|",
    "|c.h;this.V==kb&&(c.h||c.c()||4==c.f||0==c.f||!b.A()?b.h||b.c()||4==b.f",
    "||0==b.f||!c.A()||(this.I={name:c.A().name,G:b}):this.I={name:b.A().nam",
    "e,G:c})}q(jb,I);\nfunction lb(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d",
    ");var f;if(b instanceof G&&c instanceof G){b=b.iterator();for(d=b.next(",
    ");d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a(F(d),F(f",
    ")))return!0;return!1}if(b instanceof G||c instanceof G){b instanceof G?",
    "(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,k=f.next();k;k=f.",
    "next()){switch(g){case \"number\":k=+F(k);break;case \"boolean\":k=!!F(",
    "k);break;case \"string\":k=F(k);break;default:throw Error(\"Illegal pri",
    "mitive type for comparison.\");\n}if(e==b&&a(k,d)||e==c&&a(d,k))return!",
    "0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,",
    "!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c",
    ")}jb.prototype.evaluate=function(a){return this.V.o(this.ca,this.ia,a)}",
    ";jb.prototype.toString=function(){var a=\"Binary Expression: \"+this.V;",
    "a+=J(this.ca);return a+=J(this.ia)};function mb(a,b,c,d){this.ta=a;this",
    ".ga=b;this.f=c;this.o=d}mb.prototype.toString=function(){return this.ta",
    "};var nb={};\nfunction N(a,b,c,d){if(nb.hasOwnProperty(a))throw Error(",
    "\"Binary operator already created: \"+a);a=new mb(a,b,c,d);return nb[a.",
    "toString()]=a}N(\"div\",6,1,function(a,b,c){return K(a,c)/K(b,c)});N(\"",
    "mod\",6,1,function(a,b,c){return K(a,c)%K(b,c)});N(\"*\",6,1,function(a",
    ",b,c){return K(a,c)*K(b,c)});N(\"+\",5,1,function(a,b,c){return K(a,c)+",
    "K(b,c)});N(\"-\",5,1,function(a,b,c){return K(a,c)-K(b,c)});N(\"<\",4,2",
    ",function(a,b,c){return lb(function(a,b){return a<b},a,b,c)});\nN(\">\"",
    ",4,2,function(a,b,c){return lb(function(a,b){return a>b},a,b,c)});N(\"<",
    "=\",4,2,function(a,b,c){return lb(function(a,b){return a<=b},a,b,c)});N",
    "(\">=\",4,2,function(a,b,c){return lb(function(a,b){return a>=b},a,b,c)",
    "});var kb=N(\"=\",3,2,function(a,b,c){return lb(function(a,b){return a=",
    "=b},a,b,c,!0)});N(\"!=\",3,2,function(a,b,c){return lb(function(a,b){re",
    "turn a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){return ib(a,c)&&ib",
    "(b,c)});N(\"or\",1,2,function(a,b,c){return ib(a,c)||ib(b,c)});function",
    " ob(a,b){if(b.s()&&4!=a.f)throw Error(\"Primary expression must evaluat",
    "e to nodeset if filter has predicate(s).\");I.call(this,a.f);this.ha=a;",
    "this.b=b;this.v=a.c();this.h=a.h}q(ob,I);ob.prototype.evaluate=function",
    "(a){a=this.ha.evaluate(a);return pb(this.b,a)};ob.prototype.toString=fu",
    "nction(){var a=\"Filter:\"+J(this.ha);return a+=J(this.b)};function qb(",
    "a,b){if(b.length<a.fa)throw Error(\"Function \"+a.i+\" expects at least",
    "\"+a.fa+\" arguments, \"+b.length+\" given\");if(null!==a.U&&b.length>a",
    ".U)throw Error(\"Function \"+a.i+\" expects at most \"+a.U+\" arguments",
    ", \"+b.length+\" given\");a.ra&&t(b,function(b,d){if(4!=b.f)throw Error",
    "(\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b)",
    ";});I.call(this,a.f);this.L=a;this.R=b;gb(this,a.v||sa(b,function(a){re",
    "turn a.c()}));hb(this,a.pa&&!b.length||a.oa&&!!b.length||sa(b,function(",
    "a){return a.h}))}\nq(qb,I);qb.prototype.evaluate=function(a){return thi",
    "s.L.o.apply(null,va(a,this.R))};qb.prototype.toString=function(){var a=",
    "\"Function: \"+this.L;if(this.R.length){var b=ra(this.R,function(a,b){r",
    "eturn a+J(b)},\"Arguments:\");a+=J(b)}return a};function rb(a,b,c,d,e,f",
    ",g,k){this.i=a;this.f=b;this.v=c;this.pa=d;this.oa=!1;this.o=e;this.fa=",
    "f;this.U=l(g)?g:f;this.ra=!!k}rb.prototype.toString=function(){return t",
    "his.i};var sb={};\nfunction O(a,b,c,d,e,f,g,k){if(sb.hasOwnProperty(a))",
    "throw Error(\"Function already created: \"+a+\".\");sb[a]=new rb(a,b,c,",
    "d,e,f,g,k)}O(\"boolean\",2,!1,!1,function(a,b){return ib(b,a)},1);O(\"c",
    "eiling\",1,!1,!1,function(a,b){return Math.ceil(K(b,a))},1);O(\"concat",
    "\",3,!1,!1,function(a,b){return ra(xa(arguments,1),function(b,d){return",
    " b+M(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1,function(a,b,c){b=M(b,",
    "a);a=M(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,!1,!1,function(a,b",
    "){return b.evaluate(a).s()},1,1,!0);\nO(\"false\",2,!1,!1,function(){re",
    "turn!1},0);O(\"floor\",1,!1,!1,function(a,b){return Math.floor(K(b,a))}",
    ",1);O(\"id\",4,!1,!1,function(a,b){var c=a.m,d=9==c.nodeType?c:c.ownerD",
    "ocument;a=M(b,a).split(/\\s+/);var e=[];t(a,function(a){a=d.getElementB",
    "yId(a);!a||0<=pa(e,a)||e.push(a)});e.sort(Ma);var f=new G;t(e,function(",
    "a){f.add(a)});return f},1);O(\"lang\",2,!1,!1,function(){return!1},1);O",
    "(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Error(\"Func",
    "tion last expects ()\");return a.j},0);\nO(\"local-name\",3,!1,!0,funct",
    "ion(a,b){return(a=b?db(b.evaluate(a)):a.m)?a.localName||a.nodeName.toLo",
    "werCase():\"\"},0,1,!0);O(\"name\",3,!1,!0,function(a,b){return(a=b?db(",
    "b.evaluate(a)):a.m)?a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"namespac",
    "e-uri\",3,!0,!1,function(){return\"\"},0,1,!0);O(\"normalize-space\",3,",
    "!1,!0,function(a,b){return(b?M(b,a):F(a.m)).replace(/[\\s\\xa0]+/g,\" ",
    "\").replace(/^\\s+|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,!1,function(a,b){",
    "return!ib(b,a)},1);\nO(\"number\",1,!1,!0,function(a,b){return b?K(b,a)",
    ":+F(a.m)},0,1);O(\"position\",1,!0,!1,function(a){return a.ua},0);O(\"r",
    "ound\",1,!1,!1,function(a,b){return Math.round(K(b,a))},1);O(\"starts-w",
    "ith\",2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return 0==b.lastIndexOf",
    "(a,0)},2);O(\"string\",3,!1,!0,function(a,b){return b?M(b,a):F(a.m)},0,",
    "1);O(\"string-length\",1,!1,!0,function(a,b){return(b?M(b,a):F(a.m)).le",
    "ngth},0,1);\nO(\"substring\",3,!1,!1,function(a,b,c,d){c=K(c,a);if(isNa",
    "N(c)||Infinity==c||-Infinity==c)return\"\";d=d?K(d,a):Infinity;if(isNaN",
    "(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=M",
    "(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d))}",
    ",2,3);O(\"substring-after\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);c",
    "=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nO(\"substr",
    "ing-before\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);a=b.indexOf(a);r",
    "eturn-1==a?\"\":b.substring(0,a)},2);O(\"sum\",1,!1,!1,function(a,b){a=",
    "b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+F(c);r",
    "eturn b},1,1,!0);O(\"translate\",3,!1,!1,function(a,b,c,d){b=M(b,a);c=M",
    "(c,a);var e=M(d,a);a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f in ",
    "a||(a[f]=e.charAt(d))}c=\"\";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f ",
    "in a?a[f]:f;return c},3);O(\"true\",2,!1,!1,function(){return!0},0);fun",
    "ction H(a,b){this.la=a;this.da=l(b)?b:null;this.F=null;switch(a){case ",
    "\"comment\":this.F=8;break;case \"text\":this.F=3;break;case \"processi",
    "ng-instruction\":this.F=7;break;case \"node\":break;default:throw Error",
    "(\"Unexpected argument\");}}function tb(a){return\"comment\"==a||\"text",
    "\"==a||\"processing-instruction\"==a||\"node\"==a}H.prototype.matches=f",
    "unction(a){return null===this.F||this.F==a.nodeType};H.prototype.getNam",
    "e=function(){return this.la};\nH.prototype.toString=function(){var a=\"",
    "Kind Test: \"+this.la;null===this.da||(a+=J(this.da));return a};functio",
    "n ub(a){I.call(this,3);this.ka=a.substring(1,a.length-1)}q(ub,I);ub.pro",
    "totype.evaluate=function(){return this.ka};ub.prototype.toString=functi",
    "on(){return\"Literal: \"+this.ka};function vb(a,b){this.i=a.toLowerCase",
    "();a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.N=b?b.to",
    "LowerCase():a}vb.prototype.matches=function(a){var b=a.nodeType;if(1!=b",
    "&&2!=b)return!1;b=l(a.localName)?a.localName:a.nodeName;return\"*\"!=th",
    "is.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.N?!0:this.N==(a.namespaceU",
    "RI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};vb.p",
    "rototype.getName=function(){return this.i};\nvb.prototype.toString=func",
    "tion(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.N?",
    "\"\":this.N+\":\")+this.i};function wb(a){I.call(this,1);this.ma=a}q(wb",
    ",I);wb.prototype.evaluate=function(){return this.ma};wb.prototype.toStr",
    "ing=function(){return\"Number: \"+this.ma};function xb(a,b){I.call(this",
    ",a.f);this.aa=a;this.J=b;this.v=a.c();this.h=a.h;1==this.J.length&&(a=t",
    "his.J[0],a.S||a.w!=yb||(a=a.P,\"*\"!=a.getName()&&(this.I={name:a.getNa",
    "me(),G:null})))}q(xb,I);function zb(){I.call(this,4)}q(zb,I);zb.prototy",
    "pe.evaluate=function(a){var b=new G;a=a.m;9==a.nodeType?b.add(a):b.add(",
    "a.ownerDocument);return b};zb.prototype.toString=function(){return\"Roo",
    "t Helper Expression\"};function Ab(){I.call(this,4)}q(Ab,I);Ab.prototyp",
    "e.evaluate=function(a){var b=new G;b.add(a.m);return b};\nAb.prototype.",
    "toString=function(){return\"Context Helper Expression\"};function Bb(a)",
    "{return\"/\"==a||\"//\"==a}\nxb.prototype.evaluate=function(a){var b=th",
    "is.aa.evaluate(a);if(!(b instanceof G))throw Error(\"Filter expression ",
    "must evaluate to nodeset.\");a=this.J;for(var c=0,d=a.length;c<d&&b.s()",
    ";c++){var e=a[c],f=b.iterator(e.w.D);if(e.c()||e.w!=Cb)if(e.c()||e.w!=D",
    "b){var g=f.next();for(b=e.evaluate(new Ta(g));null!=(g=f.next());)g=e.e",
    "valuate(new Ta(g)),b=cb(b,g)}else g=f.next(),b=e.evaluate(new Ta(g));el",
    "se{for(g=f.next();(b=f.next())&&(!g.contains||g.contains(b))&&b.compare",
    "DocumentPosition(g)&8;g=b);b=e.evaluate(new Ta(g))}}return b};\nxb.prot",
    "otype.toString=function(){var a=\"Path Expression:\"+J(this.aa);if(this",
    ".J.length){var b=ra(this.J,function(a,b){return a+J(b)},\"Steps:\");a+=",
    "J(b)}return a};function P(a,b){this.b=a;this.D=!!b}function pb(a,b,c){f",
    "or(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f=b.s(),g,k=",
    "0;g=e.next();k++){var x=a.D?f-k:k+1;g=d.evaluate(new Ta(g,x,f));if(\"nu",
    "mber\"==typeof g)x=x==g;else if(\"string\"==typeof g||\"boolean\"==type",
    "of g)x=!!g;else if(g instanceof G)x=0<g.s();else throw Error(\"Predicat",
    "e.evaluate returned an unexpected type.\");x||e.remove()}return b}P.pro",
    "totype.A=function(){return 0<this.b.length?this.b[0].A():null};\nP.prot",
    "otype.c=function(){for(var a=0;a<this.b.length;a++){var b=this.b[a];if(",
    "b.c()||1==b.f||0==b.f)return!0}return!1};P.prototype.s=function(){retur",
    "n this.b.length};P.prototype.toString=function(){return ra(this.b,funct",
    "ion(a,b){return a+J(b)},\"Predicates:\")};function Q(a,b,c,d){I.call(th",
    "is,4);this.w=a;this.P=b;this.b=c||new P([]);this.S=!!d;b=this.b.A();a.v",
    "a&&b&&(this.I={name:b.name,G:b.G});this.v=this.b.c()}q(Q,I);\nQ.prototy",
    "pe.evaluate=function(a){var b=a.m,c=this.A(),d=null,e=null,f=0;c&&(d=c.",
    "name,e=c.G?M(c.G,a):null,f=1);if(this.S)if(this.c()||this.w!=Eb)if(b=(n",
    "ew Q(Fb,new H(\"node\"))).evaluate(a).iterator(),c=b.next())for(a=this.",
    "o(c,d,e,f);null!=(c=b.next());)a=cb(a,this.o(c,d,e,f));else a=new G;els",
    "e a=Za(this.P,b,d,e),a=pb(this.b,a,f);else a=this.o(a.m,d,e,f);return a",
    "};Q.prototype.o=function(a,b,c,d){a=this.w.L(this.P,a,b,c);return a=pb(",
    "this.b,a,d)};\nQ.prototype.toString=function(){var a=\"Step:\"+J(\"Oper",
    "ator: \"+(this.S?\"//\":\"/\"));this.w.i&&(a+=J(\"Axis: \"+this.w));a+=",
    "J(this.P);if(this.b.s()){var b=ra(this.b.b,function(a,b){return a+J(b)}",
    ",\"Predicates:\");a+=J(b)}return a};function Gb(a,b,c,d){this.i=a;this.",
    "L=b;this.D=c;this.va=d}Gb.prototype.toString=function(){return this.i};",
    "var Hb={};function R(a,b,c,d){if(Hb.hasOwnProperty(a))throw Error(\"Axi",
    "s already created: \"+a);b=new Gb(a,b,c,!!d);return Hb[a]=b}\nR(\"ances",
    "tor\",function(a,b){for(var c=new G;b=b.parentNode;)a.matches(b)&&c.uns",
    "hift(b);return c},!0);R(\"ancestor-or-self\",function(a,b){var c=new G;",
    "do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);\nvar",
    " yb=R(\"attribute\",function(a,b){var c=new G,d=a.getName();if(b=b.attr",
    "ibutes)if(a instanceof H&&null===a.F||\"*\"==d)for(a=0;d=b[a];a++)c.add",
    "(d);else(d=b.getNamedItem(d))&&c.add(d);return c},!1),Eb=R(\"child\",fu",
    "nction(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||new G;for(b=b.firstC",
    "hild;b;b=b.nextSibling)Ya(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!",
    "0);R(\"descendant\",Za,!1,!0);\nvar Fb=R(\"descendant-or-self\",functio",
    "n(a,b,c,d){var e=new G;Ya(b,c,d)&&a.matches(b)&&e.add(b);return Za(a,b,",
    "c,d,e)},!1,!0),Cb=R(\"following\",function(a,b,c,d){var e=new G;do for(",
    "var f=b;f=f.nextSibling;)Ya(f,c,d)&&a.matches(f)&&e.add(f),e=Za(a,f,c,d",
    ",e);while(b=b.parentNode);return e},!1,!0);R(\"following-sibling\",func",
    "tion(a,b){for(var c=new G;b=b.nextSibling;)a.matches(b)&&c.add(b);retur",
    "n c},!1);R(\"namespace\",function(){return new G},!1);\nvar Ib=R(\"pare",
    "nt\",function(a,b){var c=new G;if(9==b.nodeType)return c;if(2==b.nodeTy",
    "pe)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b)",
    ";return c},!1),Db=R(\"preceding\",function(a,b,c,d){var e=new G,f=[];do",
    " f.unshift(b);while(b=b.parentNode);for(var g=1,k=f.length;g<k;g++){var",
    " x=[];for(b=f[g];b=b.previousSibling;)x.unshift(b);for(var D=0,r=x.leng",
    "th;D<r;D++)b=x[D],Ya(b,c,d)&&a.matches(b)&&e.add(b),e=Za(a,b,c,d,e)}ret",
    "urn e},!0,!0);\nR(\"preceding-sibling\",function(a,b){for(var c=new G;b",
    "=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Jb=R(",
    "\"self\",function(a,b){var c=new G;a.matches(b)&&c.add(b);return c},!1)",
    ";function Kb(a){I.call(this,1);this.$=a;this.v=a.c();this.h=a.h}q(Kb,I)",
    ";Kb.prototype.evaluate=function(a){return-K(this.$,a)};Kb.prototype.toS",
    "tring=function(){return\"Unary Expression: -\"+J(this.$)};function Lb(a",
    "){I.call(this,4);this.O=a;gb(this,sa(this.O,function(a){return a.c()}))",
    ";hb(this,sa(this.O,function(a){return a.h}))}q(Lb,I);Lb.prototype.evalu",
    "ate=function(a){var b=new G;t(this.O,function(c){c=c.evaluate(a);if(!(c",
    " instanceof G))throw Error(\"Path expression must evaluate to NodeSet.",
    "\");b=cb(b,c)});return b};Lb.prototype.toString=function(){return ra(th",
    "is.O,function(a,b){return a+J(b)},\"Union Expression:\")};function Mb(a",
    ",b){this.a=a;this.sa=b}function Nb(a){for(var b,c=[];;){S(a,\"Missing r",
    "ight hand side of binary expression.\");b=Ob(a);var d=a.a.next();if(!d)",
    "break;var e=(d=nb[d]||null)&&d.ga;if(!e){a.a.back();break}for(;c.length",
    "&&e<=c[c.length-1].ga;)b=new jb(c.pop(),c.pop(),b);c.push(b,d)}for(;c.l",
    "ength;)b=new jb(c.pop(),c.pop(),b);return b}function S(a,b){if(a.a.empt",
    "y())throw Error(b);}function Pb(a,b){a=a.a.next();if(a!=b)throw Error(",
    "\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction Qb(a){a=a.a.next(",
    ");if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Rb(a){a=a.a.next",
    "();if(2>a.length)throw Error(\"Unclosed literal string\");return new ub",
    "(a)}\nfunction Sb(a){var b=[];if(Bb(E(a.a))){var c=a.a.next();var d=E(a",
    ".a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&",
    "&!/(?![0-9])[\\w]/.test(d)))return new zb;d=new zb;S(a,\"Missing next l",
    "ocation step.\");c=Tb(a,c);b.push(c)}else{a:{c=E(a.a);d=c.charAt(0);swi",
    "tch(d){case \"$\":throw Error(\"Variable reference not allowed in HTML ",
    "XPath\");case \"(\":a.a.next();c=Nb(a);S(a,'unclosed \"(\"');Pb(a,\")\"",
    ");break;case '\"':case \"'\":c=Rb(a);break;default:if(isNaN(+c))if(!tb(",
    "c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==E(a.a,\n1)){c=a.a.next();c=sb[c]||",
    "null;a.a.next();for(d=[];\")\"!=E(a.a);){S(a,\"Missing function argumen",
    "t list.\");d.push(Nb(a));if(\",\"!=E(a.a))break;a.a.next()}S(a,\"Unclos",
    "ed function argument list.\");Qb(a);c=new qb(c,d)}else{c=null;break a}e",
    "lse c=new wb(+a.a.next())}\"[\"==E(a.a)&&(d=new P(Ub(a)),c=new ob(c,d))",
    "}if(c)if(Bb(E(a.a)))d=c;else return c;else c=Tb(a,\"/\"),d=new Ab,b.pus",
    "h(c)}for(;Bb(E(a.a));)c=a.a.next(),S(a,\"Missing next location step.\")",
    ",c=Tb(a,c),b.push(c);return new xb(d,b)}\nfunction Tb(a,b){if(\"/\"!=b&",
    "&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"==E",
    "(a.a)){var c=new Q(Jb,new H(\"node\"));a.a.next();return c}if(\"..\"==E",
    "(a.a))return c=new Q(Ib,new H(\"node\")),a.a.next(),c;if(\"@\"==E(a.a))",
    "{var d=yb;a.a.next();S(a,\"Missing attribute name\")}else if(\"::\"==E(",
    "a.a,1)){if(!/(?![0-9])[\\w]/.test(E(a.a).charAt(0)))throw Error(\"Bad t",
    "oken: \"+a.a.next());var e=a.a.next();d=Hb[e]||null;if(!d)throw Error(",
    "\"No axis with name: \"+e);a.a.next();S(a,\"Missing node name\")}else d",
    "=Eb;e=\nE(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==E(a.a",
    ",1)){if(!tb(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!",
    "tb(e))throw Error(\"Invalid type name: \"+e);Pb(a,\"(\");S(a,\"Bad node",
    "type\");var f=E(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=Rb(a);S(a,",
    "\"Bad nodetype\");Qb(a);e=new H(e,g)}else if(e=a.a.next(),f=e.indexOf(",
    "\":\"),-1==f)e=new vb(e);else{g=e.substring(0,f);if(\"*\"==g)var k=\"*",
    "\";else if(k=a.sa(g),!k)throw Error(\"Namespace prefix not declared: \"",
    "+g);e=e.substr(f+1);e=new vb(e,k)}else throw Error(\"Bad token: \"+\na.",
    "a.next());a=new P(Ub(a),d.D);return c||new Q(d,e,a,\"//\"==b)}function ",
    "Ub(a){for(var b=[];\"[\"==E(a.a);){a.a.next();S(a,\"Missing predicate e",
    "xpression.\");var c=Nb(a);b.push(c);S(a,\"Unclosed predicate expression",
    ".\");Pb(a,\"]\")}return b}function Ob(a){if(\"-\"==E(a.a))return a.a.ne",
    "xt(),new Kb(Ob(a));var b=Sb(a);if(\"|\"!=E(a.a))a=b;else{for(b=[b];\"|",
    "\"==a.a.next();)S(a,\"Missing next union location path.\"),b.push(Sb(a)",
    ");a.a.back();a=new Lb(b)}return a};function Vb(a){switch(a.nodeType){ca",
    "se 1:return ja(Wb,a);case 9:return Vb(a.documentElement);case 11:case 1",
    "0:case 6:case 12:return Xb;default:return a.parentNode?Vb(a.parentNode)",
    ":Xb}}function Xb(){return null}function Wb(a,b){if(a.prefix==b)return a",
    ".namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNod",
    "e(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.",
    "parentNode.nodeType?Wb(a.parentNode,b):null};function Yb(a,b){if(!a.len",
    "gth)throw Error(\"Empty XPath expression.\");a=Va(a);if(a.empty())throw",
    " Error(\"Invalid XPath expression.\");b?p(b)||(b=ia(b.lookupNamespaceUR",
    "I,b)):b=function(){return null};var c=Nb(new Mb(a,b));if(!a.empty())thr",
    "ow Error(\"Bad token: \"+a.next());this.evaluate=function(a,b){a=c.eval",
    "uate(new Ta(a));return new T(a,b)}}\nfunction T(a,b){if(0==b)if(a insta",
    "nceof G)b=4;else if(\"string\"==typeof a)b=2;else if(\"number\"==typeof",
    " a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected ",
    "evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof G))throw Erro",
    "r(\"value could not be converted to the specified type\");this.resultTy",
    "pe=b;switch(b){case 2:this.stringValue=a instanceof G?eb(a):\"\"+a;brea",
    "k;case 1:this.numberValue=a instanceof G?+eb(a):+a;break;case 3:this.bo",
    "oleanValue=a instanceof G?0<a.s():!!a;break;case 4:case 5:case 6:case 7",
    ":var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next())d.push(e",
    ");this.snapshotLength=a.s();this.invalidIteratorState=!1;break;case 8:c",
    "ase 9:this.singleNodeValue=db(a);break;default:throw Error(\"Unknown XP",
    "athResult type.\");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)t",
    "hrow Error(\"iterateNext called with wrong result type\");return f>=d.l",
    "ength?null:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Er",
    "ror(\"snapshotItem called with wrong result type\");return a>=d.length|",
    "|0>a?null:d[a]}}\nT.ANY_TYPE=0;T.NUMBER_TYPE=1;T.STRING_TYPE=2;T.BOOLEA",
    "N_TYPE=3;T.UNORDERED_NODE_ITERATOR_TYPE=4;T.ORDERED_NODE_ITERATOR_TYPE=",
    "5;T.UNORDERED_NODE_SNAPSHOT_TYPE=6;T.ORDERED_NODE_SNAPSHOT_TYPE=7;T.ANY",
    "_UNORDERED_NODE_TYPE=8;T.FIRST_ORDERED_NODE_TYPE=9;function Zb(a){this.",
    "lookupNamespaceURI=Vb(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa",
    ";var c=a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a",
    ".XPathResult=T,c.evaluate=function(a,b,c,g){return(new Yb(a,c)).evaluat",
    "e(b,g)},c.createExpression=function(a,b){return new Yb(a,b)},c.createNS",
    "Resolver=function(a){return new Zb(a)}});var U={};U.X=function(){var a=",
    "{ya:\"http://www.w3.org/2000/svg\"};return function(b){return a[b]||nul",
    "l}}();\nU.o=function(a,b,c){var d=z(a);if(!d.documentElement)return nul",
    "l;try{for(var e=d.createNSResolver?d.createNSResolver(d.documentElement",
    "):U.X,f={},g=d.getElementsByTagName(\"*\"),k=0;k<g.length;++k){var x=g[",
    "k],D=x.namespaceURI;if(D&&!f[D]){var r=x.lookupPrefix(D);if(!r){var A=D",
    ".match(\".*/(\\\\w+)/?$\");r=A?A[1]:\"xhtml\"}f[D]=r}}var L={},W;for(W ",
    "in f)L[f[W]]=W;e=function(a){return L[a]||null};try{return d.evaluate(b",
    ",a,e,c,null)}catch(Fa){if(\"TypeError\"===Fa.name)return e=d.createNSRe",
    "solver?d.createNSResolver(d.documentElement):\nU.X,d.evaluate(b,a,e,c,n",
    "ull);throw Fa;}}catch(Fa){throw new u(32,\"Unable to locate an element ",
    "with the xpath expression \"+b+\" because of the following error:\\n\"+",
    "Fa);}};U.Y=function(a,b){if(!a||1!=a.nodeType)throw new u(32,'The resul",
    "t of the xpath expression \"'+b+'\" is: '+a+\". It should be an element",
    ".\");};\nU.u=function(a,b){var c=function(){var c=U.o(b,a,9);return c?c",
    ".singleNodeValue||null:b.selectSingleNode?(c=z(b),c.setProperty&&c.setP",
    "roperty(\"SelectionLanguage\",\"XPath\"),b.selectSingleNode(a)):null}()",
    ";null===c||U.Y(c,a);return c};\nU.l=function(a,b){var c=function(){var ",
    "c=U.o(b,a,7);if(c){for(var e=c.snapshotLength,f=[],g=0;g<e;++g)f.push(c",
    ".snapshotItem(g));return f}return b.selectNodes?(c=z(b),c.setProperty&&",
    "c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();",
    "t(c,function(b){U.Y(b,a)});return c};function $b(a,b,c,d){this.top=a;th",
    "is.right=b;this.bottom=c;this.left=d}h=$b.prototype;h.clone=function(){",
    "return new $b(this.top,this.right,this.bottom,this.left)};h.toString=fu",
    "nction(){return\"(\"+this.top+\"t, \"+this.right+\"r, \"+this.bottom+\"",
    "b, \"+this.left+\"l)\"};h.contains=function(a){return this&&a?a instanc",
    "eof $b?a.left>=this.left&&a.right<=this.right&&a.top>=this.top&&a.botto",
    "m<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=thi",
    "s.bottom:!1};\nh.expand=function(a,b,c,d){ea(a)?(this.top-=a.top,this.r",
    "ight+=a.right,this.bottom+=a.bottom,this.left-=a.left):(this.top-=a,thi",
    "s.right+=Number(b),this.bottom+=Number(c),this.left-=Number(d));return ",
    "this};h.ceil=function(){this.top=Math.ceil(this.top);this.right=Math.ce",
    "il(this.right);this.bottom=Math.ceil(this.bottom);this.left=Math.ceil(t",
    "his.left);return this};\nh.floor=function(){this.top=Math.floor(this.to",
    "p);this.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom",
    ");this.left=Math.floor(this.left);return this};h.round=function(){this.",
    "top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=",
    "Math.round(this.bottom);this.left=Math.round(this.left);return this};h.",
    "translate=function(a,b){a instanceof w?(this.left+=a.x,this.right+=a.x,",
    "this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this",
    ".top+=b,this.bottom+=b));return this};\nh.scale=function(a,b){b=n(b)?b:",
    "a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;return this};fu",
    "nction V(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}h=V",
    ".prototype;h.clone=function(){return new V(this.left,this.top,this.widt",
    "h,this.height)};h.toString=function(){return\"(\"+this.left+\", \"+this",
    ".top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h.contains=functio",
    "n(a){return a instanceof w?a.x>=this.left&&a.x<=this.left+this.width&&a",
    ".y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left+th",
    "is.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+",
    "a.height};\nh.ceil=function(){this.left=Math.ceil(this.left);this.top=M",
    "ath.ceil(this.top);this.width=Math.ceil(this.width);this.height=Math.ce",
    "il(this.height);return this};h.floor=function(){this.left=Math.floor(th",
    "is.left);this.top=Math.floor(this.top);this.width=Math.floor(this.width",
    ");this.height=Math.floor(this.height);return this};h.round=function(){t",
    "his.left=Math.round(this.left);this.top=Math.round(this.top);this.width",
    "=Math.round(this.width);this.height=Math.round(this.height);return this",
    "};\nh.translate=function(a,b){a instanceof w?(this.left+=a.x,this.top+=",
    "a.y):(this.left+=a,n(b)&&(this.top+=b));return this};h.scale=function(a",
    ",b){b=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.height*=b;re",
    "turn this};var ac=\"function\"===typeof ShadowRoot;function bc(a){for(a",
    "=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.pare",
    "ntNode;return C(a)?a:null}\nfunction X(a,b){b=oa(b);if(\"float\"==b||\"",
    "cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a:{var c=b;var d=z(a);i",
    "f(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.defaultView.getCo",
    "mputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||\"\";break a}c=\"",
    "\"}a=c||cc(a,b);if(null===a)a=null;else if(0<=pa(za,b)){b:{var e=a.matc",
    "h(Ca);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]",
    "),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];br",
    "eak b}b=null}if(!b)b:{if(d=a.match(Da))if(b=Number(d[1]),\nc=Number(d[2",
    "]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1]",
    ";break b}b=null}if(!b)b:{b=a.toLowerCase();c=ya[b.toLowerCase()];if(!c&",
    "&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&(c=c.replace(Aa,\"#$1$1$2",
    "$2$3$3\")),!Ba.test(c))){b=null;break b}b=[parseInt(c.substr(1,2),16),p",
    "arseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b",
    ".join(\", \")+\")\":a}return a}\nfunction cc(a,b){var c=a.currentStyle|",
    "|a.style,d=c[b];!l(d)&&p(c.getPropertyValue)&&(d=c.getPropertyValue(b))",
    ";return\"inherit\"!=d?l(d)?d:null:(a=bc(a))?cc(a,b):null}\nfunction dc(",
    "a,b,c){function d(a){var b=ec(a);return 0<b.height&&0<b.width?!0:C(a,\"",
    "PATH\")&&(0<b.height||0<b.width)?(a=X(a,\"stroke-width\"),!!a&&0<parseI",
    "nt(a,10)):\"hidden\"!=X(a,\"overflow\")&&sa(a.childNodes,function(a){re",
    "turn 3==a.nodeType||C(a)&&d(a)})}function e(a){return fc(a)==Y&&ta(a.ch",
    "ildNodes,function(a){return!C(a)||e(a)||!d(a)})}if(!C(a))throw Error(\"",
    "Argument to isShown must be of type Element\");if(C(a,\"BODY\"))return!",
    "0;var f=bc(a);if(f&&C(f,\"DETAILS\")&&!f.open&&!C(a,\"SUMMARY\"))return",
    "!1;if(C(a,\n\"OPTION\")||C(a,\"OPTGROUP\"))return a=Pa(a,function(a){re",
    "turn C(a,\"SELECT\")}),!!a&&dc(a,!0,c);if(f=gc(a))return!!f.ba&&0<f.rec",
    "t.width&&0<f.rect.height&&dc(f.ba,b,c);if(C(a,\"INPUT\")&&\"hidden\"==a",
    ".type.toLowerCase()||C(a,\"NOSCRIPT\"))return!1;f=X(a,\"visibility\");r",
    "eturn\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=hc(a))&&d(a)?!e(a):!1",
    "}\nfunction ic(a){function b(a){if(C(a)&&\"none\"==X(a,\"display\"))ret",
    "urn!1;a:{var c=a.parentNode;if(a.getDestinationInsertionPoints){var e=a",
    ".getDestinationInsertionPoints();if(0<e.length){a=e[e.length-1];break a",
    "}}a=c&&c.shadowRoot&&void 0!==a.assignedSlot?a.assignedSlot?a.assignedS",
    "lot.parentNode:null:c}return ac&&a instanceof ShadowRoot||a&&(9==a.node",
    "Type||11==a.nodeType)?!0:!!a&&b(a)}return dc(a,!1,b)}var Y=\"hidden\";",
    "\nfunction fc(a){function b(a){function b(a){if(a==g)return!0;var b=X(a",
    ",\"display\");return 0==b.lastIndexOf(\"inline\",0)||\"contents\"==b||",
    "\"absolute\"==c&&\"static\"==X(a,\"position\")?!1:!0}var c=X(a,\"positi",
    "on\");if(\"fixed\"==c)return D=!0,a==g?null:g;for(a=bc(a);a&&!b(a);)a=b",
    "c(a);return a}function c(a){var b=a;if(\"visible\"==x)if(a==g&&k)b=k;el",
    "se if(a==k)return{x:\"visible\",y:\"visible\"};b={x:X(b,\"overflow-x\")",
    ",y:X(b,\"overflow-y\")};a==g&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"",
    "visible\"==b.y?\"auto\":b.y);return b}function d(a){if(a==\ng){var b=(n",
    "ew Ha(f)).C;a=b.scrollingElement?b.scrollingElement:b.body||b.documentE",
    "lement;b=b.parentWindow||b.defaultView;a=new w(b.pageXOffset||a.scrollL",
    "eft,b.pageYOffset||a.scrollTop)}else a=new w(a.scrollLeft,a.scrollTop);",
    "return a}var e=jc(a),f=z(a),g=f.documentElement,k=f.body,x=X(g,\"overfl",
    "ow\"),D;for(a=b(a);a;a=b(a)){var r=c(a);if(\"visible\"!=r.x||\"visible",
    "\"!=r.y){var A=ec(a);if(0==A.width||0==A.height)return Y;var L=e.right<",
    "A.left,W=e.bottom<A.top;if(L&&\"hidden\"==r.x||W&&\"hidden\"==r.y)retur",
    "n Y;\nif(L&&\"visible\"!=r.x||W&&\"visible\"!=r.y){L=d(a);W=e.bottom<A.",
    "top-L.y;if(e.right<A.left-L.x&&\"visible\"!=r.x||W&&\"visible\"!=r.x)re",
    "turn Y;e=fc(a);return e==Y?Y:\"scroll\"}L=e.left>=A.left+A.width;A=e.to",
    "p>=A.top+A.height;if(L&&\"hidden\"==r.x||A&&\"hidden\"==r.y)return Y;if",
    "(L&&\"visible\"!=r.x||A&&\"visible\"!=r.y){if(D&&(r=d(a),e.left>=g.scro",
    "llWidth-r.x||e.right>=g.scrollHeight-r.y))return Y;e=fc(a);return e==Y?",
    "Y:\"scroll\"}}}return\"none\"}\nfunction ec(a){var b=gc(a);if(b)return ",
    "b.rect;if(C(a,\"HTML\"))return a=z(a),a=((a?a.parentWindow||a.defaultVi",
    "ew:window)||window).document,a=\"CSS1Compat\"==a.compatMode?a.documentE",
    "lement:a.body,a=new Ga(a.clientWidth,a.clientHeight),new V(0,0,a.width,",
    "a.height);try{var c=a.getBoundingClientRect()}catch(d){return new V(0,0",
    ",0,0)}return new V(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfuncti",
    "on gc(a){var b=C(a,\"MAP\");if(!b&&!C(a,\"AREA\"))return null;var c=b?a",
    ":C(a.parentNode,\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=",
    "U.u('/descendant::*[@usemap = \"#'+c.name+'\"]',z(c)))&&(e=ec(d),b||\"d",
    "efault\"==a.shape.toLowerCase()||(a=kc(a),b=Math.min(Math.max(a.left,0)",
    ",e.width),c=Math.min(Math.max(a.top,0),e.height),e=new V(b+e.left,c+e.t",
    "op,Math.min(a.width,e.width-b),Math.min(a.height,e.height-c))));return{",
    "ba:d,rect:e||new V(0,0,0,0)}}\nfunction kc(a){var b=a.shape.toLowerCase",
    "();a=a.coords.split(\",\");if(\"rect\"==b&&4==a.length){b=a[0];var c=a[",
    "1];return new V(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return",
    " b=a[2],new V(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){b=a[0]",
    ";c=a[1];for(var d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math",
    ".max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new V(b,c",
    ",d-b,e-c)}return new V(0,0,0,0)}function jc(a){a=ec(a);return new $b(a.",
    "top,a.left+a.width,a.top+a.height,a.left)}\nfunction lc(a){return a.rep",
    "lace(/^[^\\S\\xa0]+|[^\\S\\xa0]+$/g,\"\")}function mc(a){var b=[];ac?nc",
    "(a,b):oc(a,b);var c=b;a=c.length;b=Array(a);c=m(c)?c.split(\"\"):c;for(",
    "var d=0;d<a;d++)d in c&&(b[d]=lc.call(void 0,c[d]));return lc(b.join(\"",
    "\\n\")).replace(/\\xa0/g,\" \")}\nfunction pc(a,b,c){if(C(a,\"BR\"))b.p",
    "ush(\"\");else{var d=C(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=pa(qc,e)",
    "),g=l(a.previousElementSibling)?a.previousElementSibling:Ka(a.previousS",
    "ibling);g=g?X(g,\"display\"):\"\";var k=X(a,\"float\")||X(a,\"cssFloat",
    "\")||X(a,\"styleFloat\");!f||\"run-in\"==g&&\"none\"==k||/^[\\s\\xa0]*$",
    "/.test(b[b.length-1]||\"\")||b.push(\"\");var x=ic(a),D=null,r=null;x&&",
    "(D=X(a,\"white-space\"),r=X(a,\"text-transform\"));t(a.childNodes,funct",
    "ion(a){c(a,b,x,D,r)});a=b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||",
    "ma(a)||\n(b[b.length-1]+=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test",
    "(a)&&b.push(\"\")}}function oc(a,b){pc(a,b,function(a,b,e,f,g){3==a.nod",
    "eType&&e?rc(a,b,f,g):C(a)&&oc(a,b)})}var qc=\"inline inline-block inlin",
    "e-table none table-cell table-column table-column-group\".split(\" \");",
    "\nfunction rc(a,b,c,d){a=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/g",
    ",\"\");a=a.replace(/(\\r\\n|\\r|\\n)/g,\"\\n\");if(\"normal\"==c||\"now",
    "rap\"==c)a=a.replace(/\\n/g,\" \");a=\"pre\"==c||\"pre-wrap\"==c?a.repl",
    "ace(/[ \\f\\t\\v\\u2028\\u2029]/g,\"\\u00a0\"):a.replace(/[ \\f\\t\\v",
    "\\u2028\\u2029]+/g,\" \");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g",
    ",function(a,b,c){return b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUppe",
    "rCase():\"lowercase\"==d&&(a=a.toLowerCase());c=b.pop()||\"\";ma(c)&&0=",
    "=a.lastIndexOf(\" \",0)&&(a=a.substr(1));b.push(c+a)}\nfunction hc(a){v",
    "ar b=1,c=X(a,\"opacity\");c&&(b=Number(c));(a=bc(a))&&(b*=hc(a));return",
    " b}\nfunction sc(a,b,c,d,e){if(3==a.nodeType&&c)rc(a,b,d,e);else if(C(a",
    "))if(C(a,\"CONTENT\")||C(a,\"SLOT\")){for(var f=a;f.parentNode;)f=f.par",
    "entNode;f instanceof ShadowRoot?(a=C(a,\"CONTENT\")?a.getDistributedNod",
    "es():a.assignedNodes(),t(a,function(a){sc(a,b,c,d,e)})):nc(a,b)}else if",
    "(C(a,\"SHADOW\")){for(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ",
    "ShadowRoot&&(a=f))for(a=a.olderShadowRoot;a;)t(a.childNodes,function(a)",
    "{sc(a,b,c,d,e)}),a=a.olderShadowRoot}else nc(a,b)}\nfunction nc(a,b){a.",
    "shadowRoot&&t(a.shadowRoot.childNodes,function(a){sc(a,b,!0,null,null)}",
    ");pc(a,b,function(a,b,e,f,g){var c=null;1==a.nodeType?c=a:3==a.nodeType",
    "&&(c=a);null!=c&&(null!=c.assignedSlot||c.getDestinationInsertionPoints",
    "&&0<c.getDestinationInsertionPoints().length)||sc(a,b,e,f,g)})};var tc=",
    "{K:function(a){return!(!a.querySelectorAll||!a.querySelector)},u:functi",
    "on(a,b){if(!a)throw new u(32,\"No class name specified\");a=na(a);if(-1",
    "!==a.indexOf(\" \"))throw new u(32,\"Compound class names not permitted",
    "\");if(tc.K(b))try{return b.querySelector(\".\"+a.replace(/\\./g,\"",
    "\\\\.\"))||null}catch(c){throw new u(32,\"An invalid or illegal class n",
    "ame was specified\");}a=B(y(b),\"*\",a,b);return a.length?a[0]:null},l:",
    "function(a,b){if(!a)throw new u(32,\"No class name specified\");a=na(a)",
    ";if(-1!==a.indexOf(\" \"))throw new u(32,\n\"Compound class names not p",
    "ermitted\");if(tc.K(b))try{return b.querySelectorAll(\".\"+a.replace(/",
    "\\./g,\"\\\\.\"))}catch(c){throw new u(32,\"An invalid or illegal class",
    " name was specified\");}return B(y(b),\"*\",a,b)}};var uc={u:function(a",
    ",b){p(b.querySelector);if(!a)throw new u(32,\"No selector specified\");",
    "a=na(a);try{var c=b.querySelector(a)}catch(d){throw new u(32,\"An inval",
    "id or illegal selector was specified\");}return c&&1==c.nodeType?c:null",
    "},l:function(a,b){p(b.querySelectorAll);if(!a)throw new u(32,\"No selec",
    "tor specified\");a=na(a);try{return b.querySelectorAll(a)}catch(c){thro",
    "w new u(32,\"An invalid or illegal selector was specified\");}}};var vc",
    "={K:function(a,b){return!(!a.querySelectorAll||!a.querySelector)&&!/^",
    "\\d.*/.test(b)},u:function(a,b){var c=y(b),d=m(a)?c.C.getElementById(a)",
    ":a;return d?Qa(d,\"id\")==a&&b!=d&&La(b,d)?d:ua(B(c,\"*\"),function(c){",
    "return Qa(c,\"id\")==a&&b!=c&&La(b,c)}):null},l:function(a,b){if(!a)ret",
    "urn[];if(vc.K(b,a))try{return b.querySelectorAll(\"#\"+vc.na(a))}catch(",
    "c){return[]}b=B(y(b),\"*\",null,b);return qa(b,function(b){return Qa(b,",
    "\"id\")==a})},na:function(a){return a.replace(/([\\s'\"\\\\#.:;,!?+<>=~",
    "*^$|%&@`{}\\-\\/\\[\\]\\(\\)])/g,\n\"\\\\$1\")}};var Z={},wc={};Z.ja=fu",
    "nction(a,b,c){try{var d=uc.l(\"a\",b)}catch(e){d=B(y(b),\"A\",null,b)}r",
    "eturn ua(d,function(b){b=mc(b);b=b.replace(/^[\\s]+|[\\s]+$/g,\"\");ret",
    "urn c&&-1!=b.indexOf(a)||b==a})};Z.ea=function(a,b,c){try{var d=uc.l(\"",
    "a\",b)}catch(e){d=B(y(b),\"A\",null,b)}return qa(d,function(b){b=mc(b);",
    "b=b.replace(/^[\\s]+|[\\s]+$/g,\"\");return c&&-1!=b.indexOf(a)||b==a})",
    "};Z.u=function(a,b){return Z.ja(a,b,!1)};Z.l=function(a,b){return Z.ea(",
    "a,b,!1)};wc.u=function(a,b){return Z.ja(a,b,!0)};\nwc.l=function(a,b){r",
    "eturn Z.ea(a,b,!0)};var xc={u:function(a,b){if(\"\"===a)throw new u(32,",
    "'Unable to locate an element with the tagName \"\"');return b.getElemen",
    "tsByTagName(a)[0]||null},l:function(a,b){if(\"\"===a)throw new u(32,'Un",
    "able to locate an element with the tagName \"\"');return b.getElementsB",
    "yTagName(a)}};var yc={className:tc,\"class name\":tc,css:uc,\"css selec",
    "tor\":uc,id:vc,linkText:Z,\"link text\":Z,name:{u:function(a,b){b=B(y(b",
    "),\"*\",null,b);return ua(b,function(b){return Qa(b,\"name\")==a})},l:f",
    "unction(a,b){b=B(y(b),\"*\",null,b);return qa(b,function(b){return Qa(b",
    ",\"name\")==a})}},partialLinkText:wc,\"partial link text\":wc,tagName:x",
    "c,\"tag name\":xc,xpath:U};function zc(a){for(var b in a)if(a.hasOwnPro",
    "perty(b))return b;return null};var Ac=\"function\"===typeof ShadowRoot;",
    "ba(\"_\",function(a,b){var c;a:{if(c=zc(a)){var d=yc[c];if(d&&p(d.u)){c",
    "=d.u(a[c],b||ka.document);break a}}throw new u(61,\"Unsupported locator",
    " strategy: \"+c);}if(c)return c;if(Ac&&b){for(c=b;c.parentNode;)c=c.par",
    "entNode;if(c instanceof ShadowRoot){a:{if((c=zc(a))&&(d=yc[c])&&p(d.l))",
    "{a=d.l(a[c],b||ka.document);break a}throw new u(61,\"Unsupported locato",
    "r strategy: \"+c);}if(c=a[0])return c}}return null});; return this._.ap",
    "ply(null,arguments);}.apply({navigator:typeof window!='undefined'?windo",
    "w.navigator:null,document:typeof window!='undefined'?window.document:nu",
    "ll}, arguments);}",
    NULL
};

const char* const GET_FIRST_CLIENT_RECT[] = {
    "function(){return function(){var h,aa=this;function k(a){return\"string",
    "\"==typeof a}function m(a){return\"number\"==typeof a}function ba(a,b){",
    "a=a.split(\".\");var c=aa;a[0]in c||!c.execScript||c.execScript(\"var ",
    "\"+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]",
    "&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b}\nfunction ca(a){var b",
    "=typeof a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";",
    "if(a instanceof Object)return b;var c=Object.prototype.toString.call(a)",
    ";if(\"[object Window]\"==c)return\"object\";if(\"[object Array]\"==c||",
    "\"number\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefine",
    "d\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\")",
    ")return\"array\";if(\"[object Function]\"==c||\"undefined\"!=typeof a.c",
    "all&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumera",
    "ble(\"call\"))return\"function\"}else return\"null\";\nelse if(\"functi",
    "on\"==b&&\"undefined\"==typeof a.call)return\"object\";return b}functio",
    "n da(a,b,c){return a.call.apply(a.bind,arguments)}function ea(a,b,c){if",
    "(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.ca",
    "ll(arguments,2);return function(){var c=Array.prototype.slice.call(argu",
    "ments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return f",
    "unction(){return a.apply(b,arguments)}}\nfunction fa(a,b,c){fa=Function",
    ".prototype.bind&&-1!=Function.prototype.bind.toString().indexOf(\"nativ",
    "e code\")?da:ea;return fa.apply(null,arguments)}function ha(a,b){var c=",
    "Array.prototype.slice.call(arguments,1);return function(){var b=c.slice",
    "();b.push.apply(b,arguments);return a.apply(this,b)}}\nfunction n(a,b){",
    "function c(){}c.prototype=b.prototype;a.na=b.prototype;a.prototype=new ",
    "c;a.prototype.constructor=a;a.ma=function(a,c,f){for(var d=Array(argume",
    "nts.length-2),e=2;e<arguments.length;e++)d[e-2]=arguments[e];return b.p",
    "rototype[c].apply(a,d)}};function p(a,b){for(var c=a.length,d=k(a)?a.sp",
    "lit(\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function q(a,b,",
    "c){var d=c;p(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}functi",
    "on r(a,b){for(var c=a.length,d=k(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in",
    " d&&b.call(void 0,d[e],e,a))return!0;return!1}function ia(a){return Arr",
    "ay.prototype.concat.apply([],arguments)}function ja(a,b,c){return 2>=ar",
    "guments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.ca",
    "ll(a,b,c)};function t(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}",
    "h=t.prototype;h.clone=function(){return new t(this.x,this.y)};h.toStrin",
    "g=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function(){",
    "this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.floor=",
    "function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return t",
    "his};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(thi",
    "s.y);return this};\nh.translate=function(a,b){a instanceof t?(this.x+=a",
    ".x,this.y+=a.y):(this.x+=Number(a),m(b)&&(this.y+=b));return this};h.sc",
    "ale=function(a,b){b=m(b)?b:a;this.x*=a;this.y*=b;return this};function ",
    "ka(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.",
    "contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a",
    "==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;r",
    "eturn b==a}\nfunction la(a,b){if(a==b)return 0;if(a.compareDocumentPosi",
    "tion)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a|",
    "|a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1=",
    "=b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNo",
    "de,f=b.parentNode;return e==f?ma(a,b):!c&&ka(e,b)?-1*na(a,b):!d&&ka(f,a",
    ")?na(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceInde",
    "x)}d=9==a.nodeType?a:a.ownerDocument||a.document;c=d.createRange();c.se",
    "lectNode(a);c.collapse(!0);\na=d.createRange();a.selectNode(b);a.collap",
    "se(!0);return c.compareBoundaryPoints(aa.Range.START_TO_END,a)}function",
    " na(a,b){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.",
    "parentNode;return ma(b,a)}function ma(a,b){for(;b=b.previousSibling;)if",
    "(b==a)return-1;return 1};/*\n\n The MIT License\n\n Copyright (c) 2007 ",
    "Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is he",
    "reby granted, free of charge, to any person obtaining a copy\n of this ",
    "software and associated documentation files (the \"Software\"), to\n de",
    "al in the Software without restriction, including without limitation th",
    "e\n rights to use, copy, modify, merge, publish, distribute, sublicense",
    ", and/or\n sell copies of the Software, and to permit persons to whom t",
    "he Software is\n furnished to do so, subject to the following condition",
    "s:\n\n The above copyright notice and this permission notice shall be i",
    "ncluded in\n all copies or substantial portions of the Software.\n\n TH",
    "E SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS",
    " OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTA",
    "BILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO E",
    "VENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ",
    "DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR",
    " OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE O",
    "R THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction u(a,b,c){t",
    "his.l=a;this.ka=b||1;this.j=c||1};function v(a){this.S=a;this.I=0}funct",
    "ion oa(a){a=a.match(qa);for(var b=0;b<a.length;b++)ra.test(a[b])&&a.spl",
    "ice(b,1);return new v(a)}var qa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+)",
    ":)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|",
    "\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,ra=/^\\s/;function w(a,b){re",
    "turn a.S[a.I+(b||0)]}v.prototype.next=function(){return this.S[this.I++",
    "]};v.prototype.back=function(){this.I--};v.prototype.empty=function(){r",
    "eturn this.S.length<=this.I};function x(a){var b=null,c=a.nodeType;1==c",
    "&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null",
    "==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentEle",
    "ment:a.firstChild;c=0;var d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.n",
    "odeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling",
    "););}}else b=a.nodeValue;return\"\"+b}\nfunction y(a,b,c){if(null===b)r",
    "eturn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==",
    "c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function z(a,b,c,d,e){retu",
    "rn sa.call(null,a,b,k(c)?c:null,k(d)?d:null,e||new B)}\nfunction sa(a,b",
    ",c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),p",
    "(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&",
    "\"class\"==c?(b=b.getElementsByClassName(d),p(b,function(b){b.className",
    "==d&&a.matches(b)&&e.add(b)})):a instanceof C?ta(a,b,c,d,e):b.getElemen",
    "tsByTagName&&(b=b.getElementsByTagName(a.getName()),p(b,function(a){y(a",
    ",c,d)&&e.add(a)}));return e}function ta(a,b,c,d,e){for(b=b.firstChild;b",
    ";b=b.nextSibling)y(b,c,d)&&a.matches(b)&&e.add(b),ta(a,b,c,d,e)};functi",
    "on B(){this.j=this.g=null;this.D=0}function ua(a){this.node=a;this.next",
    "=this.w=null}function va(a,b){if(!a.g)return b;if(!b.g)return a;var c=a",
    ".g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.ne",
    "xt):0<la(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:",
    "a.g=e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;r",
    "eturn a}B.prototype.unshift=function(a){a=new ua(a);a.next=this.g;this.",
    "j?this.g.w=a:this.g=this.j=a;this.g=a;this.D++};\nB.prototype.add=funct",
    "ion(a){a=new ua(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this",
    ".j=a;this.D++};function D(a){return(a=a.g)?a.node:null}B.prototype.m=fu",
    "nction(){return this.D};function E(a){return(a=D(a))?x(a):\"\"}B.protot",
    "ype.iterator=function(a){return new wa(this,!!a)};function wa(a,b){this",
    ".ga=a;this.T=(this.A=b)?a.j:a.g;this.O=null}wa.prototype.next=function(",
    "){var a=this.T;if(null==a)return null;var b=this.O=a;this.T=this.A?a.w:",
    "a.next;return b.node};\nwa.prototype.remove=function(){var a=this.ga,b=",
    "this.O;if(!b)throw Error(\"Next must be called at least once before rem",
    "ove.\");var c=b.w;b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=",
    "null};function F(a){this.f=a;this.h=this.o=!1;this.F=null}function G(a)",
    "{return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}F.prototyp",
    "e.c=function(){return this.o};function xa(a,b){a.o=b}function ya(a,b){a",
    ".h=b}F.prototype.u=function(){return this.F};function H(a,b){a=a.evalua",
    "te(b);return a instanceof B?+E(a):+a}function I(a,b){a=a.evaluate(b);re",
    "turn a instanceof B?E(a):\"\"+a}function J(a,b){a=a.evaluate(b);return ",
    "a instanceof B?!!a.m():!!a};function K(a,b,c){F.call(this,a.f);this.R=a",
    ";this.W=b;this.aa=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.R==za&&(c.",
    "h||c.c()||4==c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(t",
    "his.F={name:c.u().name,C:b}):this.F={name:b.u().name,C:c})}n(K,F);\nfun",
    "ction L(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceo",
    "f B&&c instanceof B){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c",
    ".iterator(),f=e.next();f;f=e.next())if(a(x(d),x(f)))return!0;return!1}i",
    "f(b instanceof B||c instanceof B){b instanceof B?(e=b,d=c):(e=c,d=b);f=",
    "e.iterator();for(var g=typeof d,l=f.next();l;l=f.next()){switch(g){case",
    " \"number\":l=+x(l);break;case \"boolean\":l=!!x(l);break;case \"string",
    "\":l=x(l);break;default:throw Error(\"Illegal primitive type for compar",
    "ison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"",
    "boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeo",
    "f b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}K.prototype.evaluate",
    "=function(a){return this.R.v(this.W,this.aa,a)};K.prototype.toString=fu",
    "nction(){var a=\"Binary Expression: \"+this.R;a+=G(this.W);return a+=G(",
    "this.aa)};function Aa(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}Aa.",
    "prototype.toString=function(){return this.ja};var Ba={};\nfunction M(a,",
    "b,c,d){if(Ba.hasOwnProperty(a))throw Error(\"Binary operator already cr",
    "eated: \"+a);a=new Aa(a,b,c,d);return Ba[a.toString()]=a}M(\"div\",6,1,",
    "function(a,b,c){return H(a,c)/H(b,c)});M(\"mod\",6,1,function(a,b,c){re",
    "turn H(a,c)%H(b,c)});M(\"*\",6,1,function(a,b,c){return H(a,c)*H(b,c)})",
    ";M(\"+\",5,1,function(a,b,c){return H(a,c)+H(b,c)});M(\"-\",5,1,functio",
    "n(a,b,c){return H(a,c)-H(b,c)});M(\"<\",4,2,function(a,b,c){return L(fu",
    "nction(a,b){return a<b},a,b,c)});\nM(\">\",4,2,function(a,b,c){return L",
    "(function(a,b){return a>b},a,b,c)});M(\"<=\",4,2,function(a,b,c){return",
    " L(function(a,b){return a<=b},a,b,c)});M(\">=\",4,2,function(a,b,c){ret",
    "urn L(function(a,b){return a>=b},a,b,c)});var za=M(\"=\",3,2,function(a",
    ",b,c){return L(function(a,b){return a==b},a,b,c,!0)});M(\"!=\",3,2,func",
    "tion(a,b,c){return L(function(a,b){return a!=b},a,b,c,!0)});M(\"and\",2",
    ",2,function(a,b,c){return J(a,c)&&J(b,c)});M(\"or\",1,2,function(a,b,c)",
    "{return J(a,c)||J(b,c)});function N(a,b){if(b.m()&&4!=a.f)throw Error(",
    "\"Primary expression must evaluate to nodeset if filter has predicate(s",
    ").\");F.call(this,a.f);this.$=a;this.b=b;this.o=a.c();this.h=a.h}n(N,F)",
    ";N.prototype.evaluate=function(a){a=this.$.evaluate(a);return Ca(this.b",
    ",a)};N.prototype.toString=function(){var a=\"Filter:\"+G(this.$);return",
    " a+=G(this.b)};function O(a,b){if(b.length<a.Y)throw Error(\"Function ",
    "\"+a.i+\" expects at least\"+a.Y+\" arguments, \"+b.length+\" given\");",
    "if(null!==a.P&&b.length>a.P)throw Error(\"Function \"+a.i+\" expects at",
    " most \"+a.P+\" arguments, \"+b.length+\" given\");a.ha&&p(b,function(b",
    ",d){if(4!=b.f)throw Error(\"Argument \"+d+\" to function \"+a.i+\" is n",
    "ot of type Nodeset: \"+b);});F.call(this,a.f);this.H=a;this.M=b;xa(this",
    ",a.o||r(b,function(a){return a.c()}));ya(this,a.fa&&!b.length||a.ea&&!!",
    "b.length||r(b,function(a){return a.h}))}\nn(O,F);O.prototype.evaluate=f",
    "unction(a){return this.H.v.apply(null,ia(a,this.M))};O.prototype.toStri",
    "ng=function(){var a=\"Function: \"+this.H;if(this.M.length){var b=q(thi",
    "s.M,function(a,b){return a+G(b)},\"Arguments:\");a+=G(b)}return a};func",
    "tion Da(a,b,c,d,e,f,g,l){this.i=a;this.f=b;this.o=c;this.fa=d;this.ea=!",
    "1;this.v=e;this.Y=f;this.P=void 0!==g?g:f;this.ha=!!l}Da.prototype.toSt",
    "ring=function(){return this.i};var Ea={};\nfunction P(a,b,c,d,e,f,g,l){",
    "if(Ea.hasOwnProperty(a))throw Error(\"Function already created: \"+a+\"",
    ".\");Ea[a]=new Da(a,b,c,d,e,f,g,l)}P(\"boolean\",2,!1,!1,function(a,b){",
    "return J(b,a)},1);P(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(",
    "H(b,a))},1);P(\"concat\",3,!1,!1,function(a,b){return q(ja(arguments,1)",
    ",function(b,d){return b+I(d,a)},\"\")},2,null);P(\"contains\",2,!1,!1,f",
    "unction(a,b,c){b=I(b,a);a=I(c,a);return-1!=b.indexOf(a)},2);P(\"count\"",
    ",1,!1,!1,function(a,b){return b.evaluate(a).m()},1,1,!0);\nP(\"false\",",
    "2,!1,!1,function(){return!1},0);P(\"floor\",1,!1,!1,function(a,b){retur",
    "n Math.floor(H(b,a))},1);P(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==",
    "c.nodeType?c:c.ownerDocument;a=I(b,a).split(/\\s+/);var e=[];p(a,functi",
    "on(a){a=d.getElementById(a);var b;if(!(b=!a)){a:if(k(e))b=k(a)&&1==a.le",
    "ngth?e.indexOf(a,0):-1;else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)",
    "break a;b=-1}b=0<=b}b||e.push(a)});e.sort(la);var f=new B;p(e,function(",
    "a){f.add(a)});return f},1);P(\"lang\",2,!1,!1,function(){return!1},1);",
    "\nP(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Error(\"F",
    "unction last expects ()\");return a.j},0);P(\"local-name\",3,!1,!0,func",
    "tion(a,b){return(a=b?D(b.evaluate(a)):a.l)?a.localName||a.nodeName.toLo",
    "werCase():\"\"},0,1,!0);P(\"name\",3,!1,!0,function(a,b){return(a=b?D(b",
    ".evaluate(a)):a.l)?a.nodeName.toLowerCase():\"\"},0,1,!0);P(\"namespace",
    "-uri\",3,!0,!1,function(){return\"\"},0,1,!0);\nP(\"normalize-space\",3",
    ",!1,!0,function(a,b){return(b?I(b,a):x(a.l)).replace(/[\\s\\xa0]+/g,\" ",
    "\").replace(/^\\s+|\\s+$/g,\"\")},0,1);P(\"not\",2,!1,!1,function(a,b){",
    "return!J(b,a)},1);P(\"number\",1,!1,!0,function(a,b){return b?H(b,a):+x",
    "(a.l)},0,1);P(\"position\",1,!0,!1,function(a){return a.ka},0);P(\"roun",
    "d\",1,!1,!1,function(a,b){return Math.round(H(b,a))},1);P(\"starts-with",
    "\",2,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a);return 0==b.lastIndexOf(a,",
    "0)},2);P(\"string\",3,!1,!0,function(a,b){return b?I(b,a):x(a.l)},0,1);",
    "\nP(\"string-length\",1,!1,!0,function(a,b){return(b?I(b,a):x(a.l)).len",
    "gth},0,1);P(\"substring\",3,!1,!1,function(a,b,c,d){c=H(c,a);if(isNaN(c",
    ")||Infinity==c||-Infinity==c)return\"\";d=d?H(d,a):Infinity;if(isNaN(d)",
    "||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=I(b,",
    "a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,",
    "3);P(\"substring-after\",3,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a);c=b.",
    "indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nP(\"substring",
    "-before\",3,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a);a=b.indexOf(a);retu",
    "rn-1==a?\"\":b.substring(0,a)},2);P(\"sum\",1,!1,!1,function(a,b){a=b.e",
    "valuate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+x(c);retu",
    "rn b},1,1,!0);P(\"translate\",3,!1,!1,function(a,b,c,d){b=I(b,a);c=I(c,",
    "a);var e=I(d,a);a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f in a||",
    "(a[f]=e.charAt(d))}c=\"\";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f in ",
    "a?a[f]:f;return c},3);P(\"true\",2,!1,!1,function(){return!0},0);functi",
    "on C(a,b){this.ca=a;this.X=void 0!==b?b:null;this.B=null;switch(a){case",
    " \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"process",
    "ing-instruction\":this.B=7;break;case \"node\":break;default:throw Erro",
    "r(\"Unexpected argument\");}}function Fa(a){return\"comment\"==a||\"tex",
    "t\"==a||\"processing-instruction\"==a||\"node\"==a}C.prototype.matches=",
    "function(a){return null===this.B||this.B==a.nodeType};C.prototype.getNa",
    "me=function(){return this.ca};\nC.prototype.toString=function(){var a=",
    "\"Kind Test: \"+this.ca;null===this.X||(a+=G(this.X));return a};functio",
    "n Q(a){F.call(this,3);this.ba=a.substring(1,a.length-1)}n(Q,F);Q.protot",
    "ype.evaluate=function(){return this.ba};Q.prototype.toString=function()",
    "{return\"Literal: \"+this.ba};function R(a,b){this.i=a.toLowerCase();a=",
    "\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.J=b?b.toLower",
    "Case():a}R.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b",
    ")return!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=th",
    "is.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.J?!0:this.J==(a.namespaceU",
    "RI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};R.pr",
    "ototype.getName=function(){return this.i};\nR.prototype.toString=functi",
    "on(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.J?\"",
    "\":this.J+\":\")+this.i};function S(a){F.call(this,1);this.da=a}n(S,F);",
    "S.prototype.evaluate=function(){return this.da};S.prototype.toString=fu",
    "nction(){return\"Number: \"+this.da};function T(a,b){F.call(this,a.f);t",
    "his.V=a;this.G=b;this.o=a.c();this.h=a.h;1==this.G.length&&(a=this.G[0]",
    ",a.N||a.s!=Ga||(a=a.L,\"*\"!=a.getName()&&(this.F={name:a.getName(),C:n",
    "ull})))}n(T,F);function U(){F.call(this,4)}n(U,F);U.prototype.evaluate=",
    "function(a){var b=new B;a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocum",
    "ent);return b};U.prototype.toString=function(){return\"Root Helper Expr",
    "ession\"};function Ha(){F.call(this,4)}n(Ha,F);Ha.prototype.evaluate=fu",
    "nction(a){var b=new B;b.add(a.l);return b};\nHa.prototype.toString=func",
    "tion(){return\"Context Helper Expression\"};function Ia(a){return\"/\"=",
    "=a||\"//\"==a}\nT.prototype.evaluate=function(a){var b=this.V.evaluate(",
    "a);if(!(b instanceof B))throw Error(\"Filter expression must evaluate t",
    "o nodeset.\");a=this.G;for(var c=0,d=a.length;c<d&&b.m();c++){var e=a[c",
    "],f=b.iterator(e.s.A);if(e.c()||e.s!=Ja)if(e.c()||e.s!=Ka){var g=f.next",
    "();for(b=e.evaluate(new u(g));null!=(g=f.next());)g=e.evaluate(new u(g)",
    "),b=va(b,g)}else g=f.next(),b=e.evaluate(new u(g));else{for(g=f.next();",
    "(b=f.next())&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g",
    ")&8;g=b);b=e.evaluate(new u(g))}}return b};\nT.prototype.toString=funct",
    "ion(){var a=\"Path Expression:\"+G(this.V);if(this.G.length){var b=q(th",
    "is.G,function(a,b){return a+G(b)},\"Steps:\");a+=G(b)}return a};functio",
    "n V(a,b){this.b=a;this.A=!!b}function Ca(a,b,c){for(c=c||0;c<a.b.length",
    ";c++)for(var d=a.b[c],e=b.iterator(),f=b.m(),g,l=0;g=e.next();l++){var ",
    "A=a.A?f-l:l+1;g=d.evaluate(new u(g,A,f));if(\"number\"==typeof g)A=A==g",
    ";else if(\"string\"==typeof g||\"boolean\"==typeof g)A=!!g;else if(g in",
    "stanceof B)A=0<g.m();else throw Error(\"Predicate.evaluate returned an ",
    "unexpected type.\");A||e.remove()}return b}V.prototype.u=function(){ret",
    "urn 0<this.b.length?this.b[0].u():null};\nV.prototype.c=function(){for(",
    "var a=0;a<this.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.f)r",
    "eturn!0}return!1};V.prototype.m=function(){return this.b.length};V.prot",
    "otype.toString=function(){return q(this.b,function(a,b){return a+G(b)},",
    "\"Predicates:\")};function W(a,b,c,d){F.call(this,4);this.s=a;this.L=b;",
    "this.b=c||new V([]);this.N=!!d;b=this.b.u();a.la&&b&&(this.F={name:b.na",
    "me,C:b.C});this.o=this.b.c()}n(W,F);\nW.prototype.evaluate=function(a){",
    "var b=a.l,c=this.u(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?I(c.C,a):null",
    ",f=1);if(this.N)if(this.c()||this.s!=La)if(b=(new W(Ma,new C(\"node\"))",
    ").evaluate(a).iterator(),c=b.next())for(a=this.v(c,d,e,f);null!=(c=b.ne",
    "xt());)a=va(a,this.v(c,d,e,f));else a=new B;else a=z(this.L,b,d,e),a=Ca",
    "(this.b,a,f);else a=this.v(a.l,d,e,f);return a};W.prototype.v=function(",
    "a,b,c,d){a=this.s.H(this.L,a,b,c);return a=Ca(this.b,a,d)};\nW.prototyp",
    "e.toString=function(){var a=\"Step:\"+G(\"Operator: \"+(this.N?\"//\":",
    "\"/\"));this.s.i&&(a+=G(\"Axis: \"+this.s));a+=G(this.L);if(this.b.m())",
    "{var b=q(this.b.b,function(a,b){return a+G(b)},\"Predicates:\");a+=G(b)",
    "}return a};function Na(a,b,c,d){this.i=a;this.H=b;this.A=c;this.la=d}Na",
    ".prototype.toString=function(){return this.i};var Oa={};function X(a,b,",
    "c,d){if(Oa.hasOwnProperty(a))throw Error(\"Axis already created: \"+a);",
    "b=new Na(a,b,c,!!d);return Oa[a]=b}\nX(\"ancestor\",function(a,b){for(v",
    "ar c=new B;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);X(",
    "\"ancestor-or-self\",function(a,b){var c=new B;do a.matches(b)&&c.unshi",
    "ft(b);while(b=b.parentNode);return c},!0);\nvar Ga=X(\"attribute\",func",
    "tion(a,b){var c=new B,d=a.getName();if(b=b.attributes)if(a instanceof C",
    "&&null===a.B||\"*\"==d)for(a=0;d=b[a];a++)c.add(d);else(d=b.getNamedIte",
    "m(d))&&c.add(d);return c},!1),La=X(\"child\",function(a,b,c,d,e){c=k(c)",
    "?c:null;d=k(d)?d:null;e=e||new B;for(b=b.firstChild;b;b=b.nextSibling)y",
    "(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);X(\"descendant\",z,!1,",
    "!0);\nvar Ma=X(\"descendant-or-self\",function(a,b,c,d){var e=new B;y(b",
    ",c,d)&&a.matches(b)&&e.add(b);return z(a,b,c,d,e)},!1,!0),Ja=X(\"follow",
    "ing\",function(a,b,c,d){var e=new B;do for(var f=b;f=f.nextSibling;)y(f",
    ",c,d)&&a.matches(f)&&e.add(f),e=z(a,f,c,d,e);while(b=b.parentNode);retu",
    "rn e},!1,!0);X(\"following-sibling\",function(a,b){for(var c=new B;b=b.",
    "nextSibling;)a.matches(b)&&c.add(b);return c},!1);X(\"namespace\",funct",
    "ion(){return new B},!1);\nvar Pa=X(\"parent\",function(a,b){var c=new B",
    ";if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerElement",
    "),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},!1),Ka=X(\"precedin",
    "g\",function(a,b,c,d){var e=new B,f=[];do f.unshift(b);while(b=b.parent",
    "Node);for(var g=1,l=f.length;g<l;g++){var A=[];for(b=f[g];b=b.previousS",
    "ibling;)A.unshift(b);for(var pa=0,eb=A.length;pa<eb;pa++)b=A[pa],y(b,c,",
    "d)&&a.matches(b)&&e.add(b),e=z(a,b,c,d,e)}return e},!0,!0);\nX(\"preced",
    "ing-sibling\",function(a,b){for(var c=new B;b=b.previousSibling;)a.matc",
    "hes(b)&&c.unshift(b);return c},!0);var Qa=X(\"self\",function(a,b){var ",
    "c=new B;a.matches(b)&&c.add(b);return c},!1);function Ra(a){F.call(this",
    ",1);this.U=a;this.o=a.c();this.h=a.h}n(Ra,F);Ra.prototype.evaluate=func",
    "tion(a){return-H(this.U,a)};Ra.prototype.toString=function(){return\"Un",
    "ary Expression: -\"+G(this.U)};function Sa(a){F.call(this,4);this.K=a;x",
    "a(this,r(this.K,function(a){return a.c()}));ya(this,r(this.K,function(a",
    "){return a.h}))}n(Sa,F);Sa.prototype.evaluate=function(a){var b=new B;p",
    "(this.K,function(c){c=c.evaluate(a);if(!(c instanceof B))throw Error(\"",
    "Path expression must evaluate to NodeSet.\");b=va(b,c)});return b};Sa.p",
    "rototype.toString=function(){return q(this.K,function(a,b){return a+G(b",
    ")},\"Union Expression:\")};function Ta(a,b){this.a=a;this.ia=b}function",
    " Ua(a){for(var b,c=[];;){Y(a,\"Missing right hand side of binary expres",
    "sion.\");b=Va(a);var d=a.a.next();if(!d)break;var e=(d=Ba[d]||null)&&d.",
    "Z;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].Z;)b=new K(c.",
    "pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new K(c.pop(),c.pop(),b);",
    "return b}function Y(a,b){if(a.a.empty())throw Error(b);}function Wa(a,b",
    "){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: ",
    "\"+a);}\nfunction Xa(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad toke",
    "n: \"+a);}function Ya(a){a=a.a.next();if(2>a.length)throw Error(\"Unclo",
    "sed literal string\");return new Q(a)}\nfunction Za(a){var b=[];if(Ia(w",
    "(a.a))){var c=a.a.next();var d=w(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!",
    "=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return ne",
    "w U;d=new U;Y(a,\"Missing next location step.\");c=$a(a,c);b.push(c)}el",
    "se{a:{c=w(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variabl",
    "e reference not allowed in HTML XPath\");case \"(\":a.a.next();c=Ua(a);",
    "Y(a,'unclosed \"(\"');Wa(a,\")\");break;case '\"':case \"'\":c=Ya(a);br",
    "eak;default:if(isNaN(+c))if(!Fa(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==w(",
    "a.a,\n1)){c=a.a.next();c=Ea[c]||null;a.a.next();for(d=[];\")\"!=w(a.a);",
    "){Y(a,\"Missing function argument list.\");d.push(Ua(a));if(\",\"!=w(a.",
    "a))break;a.a.next()}Y(a,\"Unclosed function argument list.\");Xa(a);c=n",
    "ew O(c,d)}else{c=null;break a}else c=new S(+a.a.next())}\"[\"==w(a.a)&&",
    "(d=new V(ab(a)),c=new N(c,d))}if(c)if(Ia(w(a.a)))d=c;else return c;else",
    " c=$a(a,\"/\"),d=new Ha,b.push(c)}for(;Ia(w(a.a));)c=a.a.next(),Y(a,\"M",
    "issing next location step.\"),c=$a(a,c),b.push(c);return new T(d,b)}\nf",
    "unction $a(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be ",
    "\"/\" or \"//\"');if(\".\"==w(a.a)){var c=new W(Qa,new C(\"node\"));a.a",
    ".next();return c}if(\"..\"==w(a.a))return c=new W(Pa,new C(\"node\")),a",
    ".a.next(),c;if(\"@\"==w(a.a)){var d=Ga;a.a.next();Y(a,\"Missing attribu",
    "te name\")}else if(\"::\"==w(a.a,1)){if(!/(?![0-9])[\\w]/.test(w(a.a).c",
    "harAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=Oa",
    "[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();Y(a,",
    "\"Missing node name\")}else d=La;e=\nw(a.a);if(/(?![0-9])[\\w\\*]/.test",
    "(e.charAt(0)))if(\"(\"==w(a.a,1)){if(!Fa(e))throw Error(\"Invalid node ",
    "type: \"+e);e=a.a.next();if(!Fa(e))throw Error(\"Invalid type name: \"+",
    "e);Wa(a,\"(\");Y(a,\"Bad nodetype\");var f=w(a.a).charAt(0),g=null;if('",
    "\"'==f||\"'\"==f)g=Ya(a);Y(a,\"Bad nodetype\");Xa(a);e=new C(e,g)}else ",
    "if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new R(e);else{g=e.substring(",
    "0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l)throw Error(\"Namespa",
    "ce prefix not declared: \"+g);e=e.substr(f+1);e=new R(e,l)}else throw E",
    "rror(\"Bad token: \"+\na.a.next());a=new V(ab(a),d.A);return c||new W(d",
    ",e,a,\"//\"==b)}function ab(a){for(var b=[];\"[\"==w(a.a);){a.a.next();",
    "Y(a,\"Missing predicate expression.\");var c=Ua(a);b.push(c);Y(a,\"Uncl",
    "osed predicate expression.\");Wa(a,\"]\")}return b}function Va(a){if(\"",
    "-\"==w(a.a))return a.a.next(),new Ra(Va(a));var b=Za(a);if(\"|\"!=w(a.a",
    "))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing next union locati",
    "on path.\"),b.push(Za(a));a.a.back();a=new Sa(b)}return a};function bb(",
    "a){switch(a.nodeType){case 1:return ha(cb,a);case 9:return bb(a.documen",
    "tElement);case 11:case 10:case 6:case 12:return db;default:return a.par",
    "entNode?bb(a.parentNode):db}}function db(){return null}function cb(a,b)",
    "{if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\"",
    ";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||",
    "null:a.parentNode&&9!=a.parentNode.nodeType?cb(a.parentNode,b):null};fu",
    "nction fb(a,b){if(!a.length)throw Error(\"Empty XPath expression.\");a=",
    "oa(a);if(a.empty())throw Error(\"Invalid XPath expression.\");b?\"funct",
    "ion\"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=function(){return null};",
    "var c=Ua(new Ta(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.next(",
    "));this.evaluate=function(a,b){a=c.evaluate(new u(a));return new Z(a,b)",
    "}}\nfunction Z(a,b){if(0==b)if(a instanceof B)b=4;else if(\"string\"==t",
    "ypeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeo",
    "f a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2!=b&&1!",
    "=b&&3!=b&&!(a instanceof B))throw Error(\"value could not be converted ",
    "to the specified type\");this.resultType=b;switch(b){case 2:this.string",
    "Value=a instanceof B?E(a):\"\"+a;break;case 1:this.numberValue=a instan",
    "ceof B?+E(a):+a;break;case 3:this.booleanValue=a instanceof B?0<a.m():!",
    "!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var d=[];for(",
    "var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.m();this.in",
    "validIteratorState=!1;break;case 8:case 9:this.singleNodeValue=D(a);bre",
    "ak;default:throw Error(\"Unknown XPathResult type.\");}var f=0;this.ite",
    "rateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext called with",
    " wrong result type\");return f>=d.length?null:d[f++]};this.snapshotItem",
    "=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong",
    " result type\");return a>=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=0;Z.NUM",
    "BER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITERATOR_T",
    "YPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_TYPE=6;Z",
    ".ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRST_ORDER",
    "ED_NODE_TYPE=9;function gb(a){this.lookupNamespaceURI=bb(a)}\nba(\"wgxp",
    "ath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Document.protot",
    "ype||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.evaluate=function(a",
    ",b,c,g){return(new fb(a,c)).evaluate(b,g)},c.createExpression=function(",
    "a,b){return new fb(a,b)},c.createNSResolver=function(a){return new gb(a",
    ")}});function hb(a,b,c,d){this.left=a;this.top=b;this.width=c;this.heig",
    "ht=d}h=hb.prototype;h.clone=function(){return new hb(this.left,this.top",
    ",this.width,this.height)};h.toString=function(){return\"(\"+this.left+",
    "\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h.conta",
    "ins=function(a){return a instanceof t?a.x>=this.left&&a.x<=this.left+th",
    "is.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&t",
    "his.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+this.hei",
    "ght>=a.top+a.height};\nh.ceil=function(){this.left=Math.ceil(this.left)",
    ";this.top=Math.ceil(this.top);this.width=Math.ceil(this.width);this.hei",
    "ght=Math.ceil(this.height);return this};h.floor=function(){this.left=Ma",
    "th.floor(this.left);this.top=Math.floor(this.top);this.width=Math.floor",
    "(this.width);this.height=Math.floor(this.height);return this};h.round=f",
    "unction(){this.left=Math.round(this.left);this.top=Math.round(this.top)",
    ";this.width=Math.round(this.width);this.height=Math.round(this.height);",
    "return this};\nh.translate=function(a,b){a instanceof t?(this.left+=a.x",
    ",this.top+=a.y):(this.left+=a,m(b)&&(this.top+=b));return this};h.scale",
    "=function(a,b){b=m(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.h",
    "eight*=b;return this};ba(\"_\",function(a){var b=a.getClientRects();if(",
    "0==b.length)throw Error(\"Element does not have any client rects\");b=b",
    "[0];if(1==a.nodeType){b:{try{var c=a.getBoundingClientRect()}catch(d){a",
    "={left:0,top:0,right:0,bottom:0};break b}a=c}a=new t(a.left,a.top)}else",
    " a=a.changedTouches?a.changedTouches[0]:a,a=new t(a.clientX,a.clientY);",
    "return new hb(b.left-a.x,b.top-a.y,b.right-b.left,b.bottom-b.top)});; r",
    "eturn this._.apply(null,arguments);}.apply({navigator:typeof window!='u",
    "ndefined'?window.navigator:null,document:typeof window!='undefined'?win",
    "dow.document:null}, arguments);}",
    NULL
};

const char* const GET_LOCATION_IN_VIEW[] = {
    "function(){return function(){var h,k=this;function m(a){return\"string",
    "\"==typeof a}function n(a){return\"number\"==typeof a}function aa(a,b){",
    "a=a.split(\".\");var c=k;a[0]in c||!c.execScript||c.execScript(\"var \"",
    "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&",
    "c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b}\nfunction ba(a){var b=t",
    "ypeof a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";if",
    "(a instanceof Object)return b;var c=Object.prototype.toString.call(a);i",
    "f(\"[object Window]\"==c)return\"object\";if(\"[object Array]\"==c||\"n",
    "umber\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefined\"",
    "!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\"))re",
    "turn\"array\";if(\"[object Function]\"==c||\"undefined\"!=typeof a.call",
    "&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable",
    "(\"call\"))return\"function\"}else return\"null\";\nelse if(\"function",
    "\"==b&&\"undefined\"==typeof a.call)return\"object\";return b}function ",
    "ca(a){var b=ba(a);return\"array\"==b||\"object\"==b&&\"number\"==typeof",
    " a.length}function da(a){var b=typeof a;return\"object\"==b&&null!=a||",
    "\"function\"==b}function ea(a,b,c){return a.call.apply(a.bind,arguments",
    ")}\nfunction fa(a,b,c){if(!a)throw Error();if(2<arguments.length){var d",
    "=Array.prototype.slice.call(arguments,2);return function(){var c=Array.",
    "prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);retu",
    "rn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}functio",
    "n ha(a,b,c){ha=Function.prototype.bind&&-1!=Function.prototype.bind.toS",
    "tring().indexOf(\"native code\")?ea:fa;return ha.apply(null,arguments)}",
    "\nfunction ia(a,b){var c=Array.prototype.slice.call(arguments,1);return",
    " function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(th",
    "is,b)}}function p(a,b){function c(){}c.prototype=b.prototype;a.oa=b.pro",
    "totype;a.prototype=new c;a.prototype.constructor=a;a.na=function(a,c,f)",
    "{for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=",
    "arguments[e];return b.prototype[c].apply(a,d)}};var q;function r(a,b){f",
    "or(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(voi",
    "d 0,d[e],e,a)}function t(a,b,c){var d=c;r(a,function(c,f){d=b.call(void",
    " 0,d,c,f,a)});return d}function u(a,b){for(var c=a.length,d=m(a)?a.spli",
    "t(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;retur",
    "n!1}function ja(a){return Array.prototype.concat.apply([],arguments)}fu",
    "nction ka(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<b;d++)c[d]",
    "=a[d];return c}return[]}\nfunction la(a,b,c){return 2>=arguments.length",
    "?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};fun",
    "ction v(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}h=v.prototype;",
    "h.clone=function(){return new v(this.x,this.y)};h.toString=function(){r",
    "eturn\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function(){this.x=Math.ce",
    "il(this.x);this.y=Math.ceil(this.y);return this};h.floor=function(){thi",
    "s.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};h.round=f",
    "unction(){this.x=Math.round(this.x);this.y=Math.round(this.y);return th",
    "is};\nh.translate=function(a,b){a instanceof v?(this.x+=a.x,this.y+=a.y",
    "):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h.scale=function(a",
    ",b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function w(a,b){this.wi",
    "dth=a;this.height=b}h=w.prototype;h.clone=function(){return new w(this.",
    "width,this.height)};h.toString=function(){return\"(\"+this.width+\" x ",
    "\"+this.height+\")\"};h.aspectRatio=function(){return this.width/this.h",
    "eight};h.ceil=function(){this.width=Math.ceil(this.width);this.height=M",
    "ath.ceil(this.height);return this};h.floor=function(){this.width=Math.f",
    "loor(this.width);this.height=Math.floor(this.height);return this};\nh.r",
    "ound=function(){this.width=Math.round(this.width);this.height=Math.roun",
    "d(this.height);return this};h.scale=function(a,b){b=n(b)?b:a;this.width",
    "*=a;this.height*=b;return this};function ma(a,b,c){function d(c){c&&b.a",
    "ppendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.length;e++){var ",
    "f=c[e];!ca(f)||da(f)&&0<f.nodeType?d(f):r(na(f)?ka(f):f,d)}}function oa",
    "(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.co",
    "ntains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a==",
    "b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;ret",
    "urn b==a}\nfunction pa(a,b){if(a==b)return 0;if(a.compareDocumentPositi",
    "on)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a",
    ".parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b",
    ".nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode",
    ",f=b.parentNode;return e==f?qa(a,b):!c&&oa(e,b)?-1*ra(a,b):!d&&oa(f,a)?",
    "ra(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)",
    "}d=x(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRang",
    "e();a.selectNode(b);\na.collapse(!0);return c.compareBoundaryPoints(k.R",
    "ange.START_TO_END,a)}function ra(a,b){var c=a.parentNode;if(c==b)return",
    "-1;for(;b.parentNode!=c;)b=b.parentNode;return qa(b,a)}function qa(a,b)",
    "{for(;b=b.previousSibling;)if(b==a)return-1;return 1}function x(a){retu",
    "rn 9==a.nodeType?a:a.ownerDocument||a.document}function na(a){if(a&&\"n",
    "umber\"==typeof a.length){if(da(a))return\"function\"==typeof a.item||",
    "\"string\"==typeof a.item;if(\"function\"==ba(a))return\"function\"==ty",
    "peof a.item}return!1}\nfunction y(a){this.D=a||k.document||document}h=y",
    ".prototype;h.getElementsByTagName=function(a,b){return(b||this.D).getEl",
    "ementsByTagName(String(a))};function sa(a){a=a.D;a=(a.parentWindow||a.d",
    "efaultView||window).document;a=\"CSS1Compat\"==a.compatMode?a.documentE",
    "lement:a.body;return new w(a.clientWidth,a.clientHeight)}h.createElemen",
    "t=function(a){return this.D.createElement(String(a))};h.createTextNode=",
    "function(a){return this.D.createTextNode(String(a))};h.appendChild=func",
    "tion(a,b){a.appendChild(b)};\nh.append=function(a,b){ma(x(a),a,argument",
    "s)};h.canHaveChildren=function(a){if(1!=a.nodeType)return!1;switch(a.ta",
    "gName){case \"APPLET\":case \"AREA\":case \"BASE\":case \"BR\":case \"C",
    "OL\":case \"COMMAND\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"",
    "IMG\":case \"INPUT\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":c",
    "ase \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"O",
    "BJECT\":case \"PARAM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":c",
    "ase \"TRACK\":case \"WBR\":return!1}return!0};\nh.removeNode=function(a",
    "){return a&&a.parentNode?a.parentNode.removeChild(a):null};h.contains=o",
    "a;/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Cop",
    "yright (c) 2012 Google Inc.\n\n Permission is hereby granted, free of c",
    "harge, to any person obtaining a copy\n of this software and associated",
    " documentation files (the \"Software\"), to\n deal in the Software with",
    "out restriction, including without limitation the\n rights to use, copy",
    ", modify, merge, publish, distribute, sublicense, and/or\n sell copies ",
    "of the Software, and to permit persons to whom the Software is\n furnis",
    "hed to do so, subject to the following conditions:\n\n The above copyri",
    "ght notice and this permission notice shall be included in\n all copies",
    " or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED ",
    "\"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDIN",
    "G BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A",
    " PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHOR",
    "S OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIAB",
    "ILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n F",
    "ROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL",
    "INGS\n IN THE SOFTWARE.\n*/\nfunction z(a,b,c){this.l=a;this.la=b||1;th",
    "is.j=c||1};function A(a){this.T=a;this.J=0}function ta(a){a=a.match(ua)",
    ";for(var b=0;b<a.length;b++)va.test(a[b])&&a.splice(b,1);return new A(a",
    ")}var ua=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|",
    "[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*",
    "'|[!<>]=|\\s+|./g,va=/^\\s/;function C(a,b){return a.T[a.J+(b||0)]}A.pr",
    "ototype.next=function(){return this.T[this.J++]};A.prototype.back=funct",
    "ion(){this.J--};A.prototype.empty=function(){return this.T.length<=this",
    ".J};function D(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void",
    " 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"",
    "!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;c=0;var",
    " d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(",
    "a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;",
    "return\"\"+b}\nfunction E(a,b,c){if(null===b)return!0;try{if(!a.getAttr",
    "ibute)return!1}catch(d){return!1}return null==c?!!a.getAttribute(b):a.g",
    "etAttribute(b,2)==c}function F(a,b,c,d,e){return wa.call(null,a,b,m(c)?",
    "c:null,m(d)?d:null,e||new G)}\nfunction wa(a,b,c,d,e){b.getElementsByNa",
    "me&&d&&\"name\"==c?(b=b.getElementsByName(d),r(b,function(b){a.matches(",
    "b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.getEleme",
    "ntsByClassName(d),r(b,function(b){b.className==d&&a.matches(b)&&e.add(b",
    ")})):a instanceof H?xa(a,b,c,d,e):b.getElementsByTagName&&(b=b.getEleme",
    "ntsByTagName(a.getName()),r(b,function(a){E(a,c,d)&&e.add(a)}));return ",
    "e}function xa(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)E(b,c,d)&",
    "&a.matches(b)&&e.add(b),xa(a,b,c,d,e)};function G(){this.j=this.g=null;",
    "this.F=0}function ya(a){this.node=a;this.next=this.w=null}function Aa(a",
    ",b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,",
    "f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<pa(c.node,b.node)?(e",
    "=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e",
    ";)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.F=f;return a}G.prototype.unshif",
    "t=function(a){a=new ya(a);a.next=this.g;this.j?this.g.w=a:this.g=this.j",
    "=a;this.g=a;this.F++};\nG.prototype.add=function(a){a=new ya(a);a.w=thi",
    "s.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.F++};function I(",
    "a){return(a=a.g)?a.node:null}G.prototype.m=function(){return this.F};fu",
    "nction J(a){return(a=I(a))?D(a):\"\"}G.prototype.iterator=function(a){r",
    "eturn new Ba(this,!!a)};function Ba(a,b){this.ha=a;this.U=(this.A=b)?a.",
    "j:a.g;this.P=null}Ba.prototype.next=function(){var a=this.U;if(null==a)",
    "return null;var b=this.P=a;this.U=this.A?a.w:a.next;return b.node};\nBa",
    ".prototype.remove=function(){var a=this.ha,b=this.P;if(!b)throw Error(",
    "\"Next must be called at least once before remove.\");var c=b.w;b=b.nex",
    "t;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.F--;this.P=null};function K(a){this.",
    "f=a;this.h=this.o=!1;this.G=null}function L(a){return\"\\n  \"+a.toStri",
    "ng().split(\"\\n\").join(\"\\n  \")}K.prototype.c=function(){return thi",
    "s.o};function Ca(a,b){a.o=b}function Da(a,b){a.h=b}K.prototype.u=functi",
    "on(){return this.G};function M(a,b){a=a.evaluate(b);return a instanceof",
    " G?+J(a):+a}function N(a,b){a=a.evaluate(b);return a instanceof G?J(a):",
    "\"\"+a}function O(a,b){a=a.evaluate(b);return a instanceof G?!!a.m():!!",
    "a};function P(a,b,c){K.call(this,a.f);this.S=a;this.X=b;this.ba=c;this.",
    "o=b.c()||c.c();this.h=b.h||c.h;this.S==Ea&&(c.h||c.c()||4==c.f||0==c.f|",
    "|!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.G={name:c.u().name,C:",
    "b}):this.G={name:b.u().name,C:c})}p(P,K);\nfunction Q(a,b,c,d,e){b=b.ev",
    "aluate(d);c=c.evaluate(d);var f;if(b instanceof G&&c instanceof G){b=b.",
    "iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;",
    "f=e.next())if(a(D(d),D(f)))return!0;return!1}if(b instanceof G||c insta",
    "nceof G){b instanceof G?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=ty",
    "peof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+D(l);break",
    ";case \"boolean\":l=!!D(l);break;case \"string\":l=D(l);break;default:t",
    "hrow Error(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(l,",
    "d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||\"bo",
    "olean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c",
    "?a(+b,+c):a(b,c):a(+b,+c)}P.prototype.evaluate=function(a){return this.",
    "S.v(this.X,this.ba,a)};P.prototype.toString=function(){var a=\"Binary E",
    "xpression: \"+this.S;a+=L(this.X);return a+=L(this.ba)};function Fa(a,b",
    ",c,d){this.ka=a;this.$=b;this.f=c;this.v=d}Fa.prototype.toString=functi",
    "on(){return this.ka};var Ga={};\nfunction R(a,b,c,d){if(Ga.hasOwnProper",
    "ty(a))throw Error(\"Binary operator already created: \"+a);a=new Fa(a,b",
    ",c,d);return Ga[a.toString()]=a}R(\"div\",6,1,function(a,b,c){return M(",
    "a,c)/M(b,c)});R(\"mod\",6,1,function(a,b,c){return M(a,c)%M(b,c)});R(\"",
    "*\",6,1,function(a,b,c){return M(a,c)*M(b,c)});R(\"+\",5,1,function(a,b",
    ",c){return M(a,c)+M(b,c)});R(\"-\",5,1,function(a,b,c){return M(a,c)-M(",
    "b,c)});R(\"<\",4,2,function(a,b,c){return Q(function(a,b){return a<b},a",
    ",b,c)});\nR(\">\",4,2,function(a,b,c){return Q(function(a,b){return a>b",
    "},a,b,c)});R(\"<=\",4,2,function(a,b,c){return Q(function(a,b){return a",
    "<=b},a,b,c)});R(\">=\",4,2,function(a,b,c){return Q(function(a,b){retur",
    "n a>=b},a,b,c)});var Ea=R(\"=\",3,2,function(a,b,c){return Q(function(a",
    ",b){return a==b},a,b,c,!0)});R(\"!=\",3,2,function(a,b,c){return Q(func",
    "tion(a,b){return a!=b},a,b,c,!0)});R(\"and\",2,2,function(a,b,c){return",
    " O(a,c)&&O(b,c)});R(\"or\",1,2,function(a,b,c){return O(a,c)||O(b,c)});",
    "function Ha(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression must",
    " evaluate to nodeset if filter has predicate(s).\");K.call(this,a.f);th",
    "is.aa=a;this.b=b;this.o=a.c();this.h=a.h}p(Ha,K);Ha.prototype.evaluate=",
    "function(a){a=this.aa.evaluate(a);return Ia(this.b,a)};Ha.prototype.toS",
    "tring=function(){var a=\"Filter:\"+L(this.aa);return a+=L(this.b)};func",
    "tion Ja(a,b){if(b.length<a.Z)throw Error(\"Function \"+a.i+\" expects a",
    "t least\"+a.Z+\" arguments, \"+b.length+\" given\");if(null!==a.R&&b.le",
    "ngth>a.R)throw Error(\"Function \"+a.i+\" expects at most \"+a.R+\" arg",
    "uments, \"+b.length+\" given\");a.ia&&r(b,function(b,d){if(4!=b.f)throw",
    " Error(\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset:",
    " \"+b);});K.call(this,a.f);this.I=a;this.N=b;Ca(this,a.o||u(b,function(",
    "a){return a.c()}));Da(this,a.ga&&!b.length||a.fa&&!!b.length||u(b,funct",
    "ion(a){return a.h}))}\np(Ja,K);Ja.prototype.evaluate=function(a){return",
    " this.I.v.apply(null,ja(a,this.N))};Ja.prototype.toString=function(){va",
    "r a=\"Function: \"+this.I;if(this.N.length){var b=t(this.N,function(a,b",
    "){return a+L(b)},\"Arguments:\");a+=L(b)}return a};function Ka(a,b,c,d,",
    "e,f,g,l){this.i=a;this.f=b;this.o=c;this.ga=d;this.fa=!1;this.v=e;this.",
    "Z=f;this.R=void 0!==g?g:f;this.ia=!!l}Ka.prototype.toString=function(){",
    "return this.i};var La={};\nfunction S(a,b,c,d,e,f,g,l){if(La.hasOwnProp",
    "erty(a))throw Error(\"Function already created: \"+a+\".\");La[a]=new K",
    "a(a,b,c,d,e,f,g,l)}S(\"boolean\",2,!1,!1,function(a,b){return O(b,a)},1",
    ");S(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(M(b,a))},1);S(\"",
    "concat\",3,!1,!1,function(a,b){return t(la(arguments,1),function(b,d){r",
    "eturn b+N(d,a)},\"\")},2,null);S(\"contains\",2,!1,!1,function(a,b,c){b",
    "=N(b,a);a=N(c,a);return-1!=b.indexOf(a)},2);S(\"count\",1,!1,!1,functio",
    "n(a,b){return b.evaluate(a).m()},1,1,!0);\nS(\"false\",2,!1,!1,function",
    "(){return!1},0);S(\"floor\",1,!1,!1,function(a,b){return Math.floor(M(b",
    ",a))},1);S(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.o",
    "wnerDocument;a=N(b,a).split(/\\s+/);var e=[];r(a,function(a){a=d.getEle",
    "mentById(a);var b;if(!(b=!a)){a:if(m(e))b=m(a)&&1==a.length?e.indexOf(a",
    ",0):-1;else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0",
    "<=b}b||e.push(a)});e.sort(pa);var f=new G;r(e,function(a){f.add(a)});re",
    "turn f},1);S(\"lang\",2,!1,!1,function(){return!1},1);\nS(\"last\",1,!0",
    ",!1,function(a){if(1!=arguments.length)throw Error(\"Function last expe",
    "cts ()\");return a.j},0);S(\"local-name\",3,!1,!0,function(a,b){return(",
    "a=b?I(b.evaluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0",
    ",1,!0);S(\"name\",3,!1,!0,function(a,b){return(a=b?I(b.evaluate(a)):a.l",
    ")?a.nodeName.toLowerCase():\"\"},0,1,!0);S(\"namespace-uri\",3,!0,!1,fu",
    "nction(){return\"\"},0,1,!0);\nS(\"normalize-space\",3,!1,!0,function(a",
    ",b){return(b?N(b,a):D(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s",
    "+|\\s+$/g,\"\")},0,1);S(\"not\",2,!1,!1,function(a,b){return!O(b,a)},1)",
    ";S(\"number\",1,!1,!0,function(a,b){return b?M(b,a):+D(a.l)},0,1);S(\"p",
    "osition\",1,!0,!1,function(a){return a.la},0);S(\"round\",1,!1,!1,funct",
    "ion(a,b){return Math.round(M(b,a))},1);S(\"starts-with\",2,!1,!1,functi",
    "on(a,b,c){b=N(b,a);a=N(c,a);return 0==b.lastIndexOf(a,0)},2);S(\"string",
    "\",3,!1,!0,function(a,b){return b?N(b,a):D(a.l)},0,1);\nS(\"string-leng",
    "th\",1,!1,!0,function(a,b){return(b?N(b,a):D(a.l)).length},0,1);S(\"sub",
    "string\",3,!1,!1,function(a,b,c,d){c=M(c,a);if(isNaN(c)||Infinity==c||-",
    "Infinity==c)return\"\";d=d?M(d,a):Infinity;if(isNaN(d)||-Infinity===d)r",
    "eturn\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=N(b,a);return Infinit",
    "y==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);S(\"substring-",
    "after\",3,!1,!1,function(a,b,c){b=N(b,a);a=N(c,a);c=b.indexOf(a);return",
    "-1==c?\"\":b.substring(c+a.length)},2);\nS(\"substring-before\",3,!1,!1",
    ",function(a,b,c){b=N(b,a);a=N(c,a);a=b.indexOf(a);return-1==a?\"\":b.su",
    "bstring(0,a)},2);S(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterat",
    "or();b=0;for(var c=a.next();c;c=a.next())b+=+D(c);return b},1,1,!0);S(",
    "\"translate\",3,!1,!1,function(a,b,c,d){b=N(b,a);c=N(c,a);var e=N(d,a);",
    "a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f in a||(a[f]=e.charAt(d",
    "))}c=\"\";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f in a?a[f]:f;return ",
    "c},3);S(\"true\",2,!1,!1,function(){return!0},0);function H(a,b){this.d",
    "a=a;this.Y=void 0!==b?b:null;this.B=null;switch(a){case \"comment\":thi",
    "s.B=8;break;case \"text\":this.B=3;break;case \"processing-instruction",
    "\":this.B=7;break;case \"node\":break;default:throw Error(\"Unexpected ",
    "argument\");}}function Ma(a){return\"comment\"==a||\"text\"==a||\"proce",
    "ssing-instruction\"==a||\"node\"==a}H.prototype.matches=function(a){ret",
    "urn null===this.B||this.B==a.nodeType};H.prototype.getName=function(){r",
    "eturn this.da};\nH.prototype.toString=function(){var a=\"Kind Test: \"+",
    "this.da;null===this.Y||(a+=L(this.Y));return a};function Na(a){K.call(t",
    "his,3);this.ca=a.substring(1,a.length-1)}p(Na,K);Na.prototype.evaluate=",
    "function(){return this.ca};Na.prototype.toString=function(){return\"Lit",
    "eral: \"+this.ca};function T(a,b){this.i=a.toLowerCase();a=\"*\"==this.",
    "i?\"*\":\"http://www.w3.org/1999/xhtml\";this.K=b?b.toLowerCase():a}T.p",
    "rototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=",
    "void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=this.i&&this.i",
    "!=b.toLowerCase()?!1:\"*\"==this.K?!0:this.K==(a.namespaceURI?a.namespa",
    "ceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};T.prototype.getN",
    "ame=function(){return this.i};\nT.prototype.toString=function(){return",
    "\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.K?\"\":this.K+",
    "\":\")+this.i};function Oa(a){K.call(this,1);this.ea=a}p(Oa,K);Oa.proto",
    "type.evaluate=function(){return this.ea};Oa.prototype.toString=function",
    "(){return\"Number: \"+this.ea};function Pa(a,b){K.call(this,a.f);this.W",
    "=a;this.H=b;this.o=a.c();this.h=a.h;1==this.H.length&&(a=this.H[0],a.O|",
    "|a.s!=Qa||(a=a.M,\"*\"!=a.getName()&&(this.G={name:a.getName(),C:null})",
    "))}p(Pa,K);function U(){K.call(this,4)}p(U,K);U.prototype.evaluate=func",
    "tion(a){var b=new G;a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument)",
    ";return b};U.prototype.toString=function(){return\"Root Helper Expressi",
    "on\"};function Ra(){K.call(this,4)}p(Ra,K);Ra.prototype.evaluate=functi",
    "on(a){var b=new G;b.add(a.l);return b};\nRa.prototype.toString=function",
    "(){return\"Context Helper Expression\"};function Sa(a){return\"/\"==a||",
    "\"//\"==a}\nPa.prototype.evaluate=function(a){var b=this.W.evaluate(a);",
    "if(!(b instanceof G))throw Error(\"Filter expression must evaluate to n",
    "odeset.\");a=this.H;for(var c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f",
    "=b.iterator(e.s.A);if(e.c()||e.s!=Ta)if(e.c()||e.s!=Ua){var g=f.next();",
    "for(b=e.evaluate(new z(g));null!=(g=f.next());)g=e.evaluate(new z(g)),b",
    "=Aa(b,g)}else g=f.next(),b=e.evaluate(new z(g));else{for(g=f.next();(b=",
    "f.next())&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8",
    ";g=b);b=e.evaluate(new z(g))}}return b};\nPa.prototype.toString=functio",
    "n(){var a=\"Path Expression:\"+L(this.W);if(this.H.length){var b=t(this",
    ".H,function(a,b){return a+L(b)},\"Steps:\");a+=L(b)}return a};function ",
    "V(a,b){this.b=a;this.A=!!b}function Ia(a,b,c){for(c=c||0;c<a.b.length;c",
    "++)for(var d=a.b[c],e=b.iterator(),f=b.m(),g,l=0;g=e.next();l++){var B=",
    "a.A?f-l:l+1;g=d.evaluate(new z(g,B,f));if(\"number\"==typeof g)B=B==g;e",
    "lse if(\"string\"==typeof g||\"boolean\"==typeof g)B=!!g;else if(g inst",
    "anceof G)B=0<g.m();else throw Error(\"Predicate.evaluate returned an un",
    "expected type.\");B||e.remove()}return b}V.prototype.u=function(){retur",
    "n 0<this.b.length?this.b[0].u():null};\nV.prototype.c=function(){for(va",
    "r a=0;a<this.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.f)ret",
    "urn!0}return!1};V.prototype.m=function(){return this.b.length};V.protot",
    "ype.toString=function(){return t(this.b,function(a,b){return a+L(b)},\"",
    "Predicates:\")};function W(a,b,c,d){K.call(this,4);this.s=a;this.M=b;th",
    "is.b=c||new V([]);this.O=!!d;b=this.b.u();a.ma&&b&&(this.G={name:b.name",
    ",C:b.C});this.o=this.b.c()}p(W,K);\nW.prototype.evaluate=function(a){va",
    "r b=a.l,c=this.u(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?N(c.C,a):null,f",
    "=1);if(this.O)if(this.c()||this.s!=Va)if(b=(new W(Wa,new H(\"node\"))).",
    "evaluate(a).iterator(),c=b.next())for(a=this.v(c,d,e,f);null!=(c=b.next",
    "());)a=Aa(a,this.v(c,d,e,f));else a=new G;else a=F(this.M,b,d,e),a=Ia(t",
    "his.b,a,f);else a=this.v(a.l,d,e,f);return a};W.prototype.v=function(a,",
    "b,c,d){a=this.s.I(this.M,a,b,c);return a=Ia(this.b,a,d)};\nW.prototype.",
    "toString=function(){var a=\"Step:\"+L(\"Operator: \"+(this.O?\"//\":\"/",
    "\"));this.s.i&&(a+=L(\"Axis: \"+this.s));a+=L(this.M);if(this.b.m()){va",
    "r b=t(this.b.b,function(a,b){return a+L(b)},\"Predicates:\");a+=L(b)}re",
    "turn a};function Xa(a,b,c,d){this.i=a;this.I=b;this.A=c;this.ma=d}Xa.pr",
    "ototype.toString=function(){return this.i};var Ya={};function X(a,b,c,d",
    "){if(Ya.hasOwnProperty(a))throw Error(\"Axis already created: \"+a);b=n",
    "ew Xa(a,b,c,!!d);return Ya[a]=b}\nX(\"ancestor\",function(a,b){for(var ",
    "c=new G;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);X(\"an",
    "cestor-or-self\",function(a,b){var c=new G;do a.matches(b)&&c.unshift(b",
    ");while(b=b.parentNode);return c},!0);\nvar Qa=X(\"attribute\",function",
    "(a,b){var c=new G,d=a.getName();if(b=b.attributes)if(a instanceof H&&nu",
    "ll===a.B||\"*\"==d)for(a=0;d=b[a];a++)c.add(d);else(d=b.getNamedItem(d)",
    ")&&c.add(d);return c},!1),Va=X(\"child\",function(a,b,c,d,e){c=m(c)?c:n",
    "ull;d=m(d)?d:null;e=e||new G;for(b=b.firstChild;b;b=b.nextSibling)E(b,c",
    ",d)&&a.matches(b)&&e.add(b);return e},!1,!0);X(\"descendant\",F,!1,!0);",
    "\nvar Wa=X(\"descendant-or-self\",function(a,b,c,d){var e=new G;E(b,c,d",
    ")&&a.matches(b)&&e.add(b);return F(a,b,c,d,e)},!1,!0),Ta=X(\"following",
    "\",function(a,b,c,d){var e=new G;do for(var f=b;f=f.nextSibling;)E(f,c,",
    "d)&&a.matches(f)&&e.add(f),e=F(a,f,c,d,e);while(b=b.parentNode);return ",
    "e},!1,!0);X(\"following-sibling\",function(a,b){for(var c=new G;b=b.nex",
    "tSibling;)a.matches(b)&&c.add(b);return c},!1);X(\"namespace\",function",
    "(){return new G},!1);\nvar Za=X(\"parent\",function(a,b){var c=new G;if",
    "(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c",
    ";b=b.parentNode;a.matches(b)&&c.add(b);return c},!1),Ua=X(\"preceding\"",
    ",function(a,b,c,d){var e=new G,f=[];do f.unshift(b);while(b=b.parentNod",
    "e);for(var g=1,l=f.length;g<l;g++){var B=[];for(b=f[g];b=b.previousSibl",
    "ing;)B.unshift(b);for(var za=0,tb=B.length;za<tb;za++)b=B[za],E(b,c,d)&",
    "&a.matches(b)&&e.add(b),e=F(a,b,c,d,e)}return e},!0,!0);\nX(\"preceding",
    "-sibling\",function(a,b){for(var c=new G;b=b.previousSibling;)a.matches",
    "(b)&&c.unshift(b);return c},!0);var $a=X(\"self\",function(a,b){var c=n",
    "ew G;a.matches(b)&&c.add(b);return c},!1);function ab(a){K.call(this,1)",
    ";this.V=a;this.o=a.c();this.h=a.h}p(ab,K);ab.prototype.evaluate=functio",
    "n(a){return-M(this.V,a)};ab.prototype.toString=function(){return\"Unary",
    " Expression: -\"+L(this.V)};function bb(a){K.call(this,4);this.L=a;Ca(t",
    "his,u(this.L,function(a){return a.c()}));Da(this,u(this.L,function(a){r",
    "eturn a.h}))}p(bb,K);bb.prototype.evaluate=function(a){var b=new G;r(th",
    "is.L,function(c){c=c.evaluate(a);if(!(c instanceof G))throw Error(\"Pat",
    "h expression must evaluate to NodeSet.\");b=Aa(b,c)});return b};bb.prot",
    "otype.toString=function(){return t(this.L,function(a,b){return a+L(b)},",
    "\"Union Expression:\")};function cb(a,b){this.a=a;this.ja=b}function db",
    "(a){for(var b,c=[];;){Y(a,\"Missing right hand side of binary expressio",
    "n.\");b=eb(a);var d=a.a.next();if(!d)break;var e=(d=Ga[d]||null)&&d.$;i",
    "f(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].$;)b=new P(c.pop",
    "(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new P(c.pop(),c.pop(),b);ret",
    "urn b}function Y(a,b){if(a.a.empty())throw Error(b);}function fb(a,b){a",
    "=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+",
    "a);}\nfunction gb(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: ",
    "\"+a);}function hb(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed",
    " literal string\");return new Na(a)}\nfunction ib(a){var b=[];if(Sa(C(a",
    ".a))){var c=a.a.next();var d=C(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d",
    "&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new ",
    "U;d=new U;Y(a,\"Missing next location step.\");c=jb(a,c);b.push(c)}else",
    "{a:{c=C(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable ",
    "reference not allowed in HTML XPath\");case \"(\":a.a.next();c=db(a);Y(",
    "a,'unclosed \"(\"');fb(a,\")\");break;case '\"':case \"'\":c=hb(a);brea",
    "k;default:if(isNaN(+c))if(!Ma(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==C(a.",
    "a,\n1)){c=a.a.next();c=La[c]||null;a.a.next();for(d=[];\")\"!=C(a.a);){",
    "Y(a,\"Missing function argument list.\");d.push(db(a));if(\",\"!=C(a.a)",
    ")break;a.a.next()}Y(a,\"Unclosed function argument list.\");gb(a);c=new",
    " Ja(c,d)}else{c=null;break a}else c=new Oa(+a.a.next())}\"[\"==C(a.a)&&",
    "(d=new V(kb(a)),c=new Ha(c,d))}if(c)if(Sa(C(a.a)))d=c;else return c;els",
    "e c=jb(a,\"/\"),d=new Ra,b.push(c)}for(;Sa(C(a.a));)c=a.a.next(),Y(a,\"",
    "Missing next location step.\"),c=jb(a,c),b.push(c);return new Pa(d,b)}",
    "\nfunction jb(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should b",
    "e \"/\" or \"//\"');if(\".\"==C(a.a)){var c=new W($a,new H(\"node\"));a",
    ".a.next();return c}if(\"..\"==C(a.a))return c=new W(Za,new H(\"node\"))",
    ",a.a.next(),c;if(\"@\"==C(a.a)){var d=Qa;a.a.next();Y(a,\"Missing attri",
    "bute name\")}else if(\"::\"==C(a.a,1)){if(!/(?![0-9])[\\w]/.test(C(a.a)",
    ".charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=",
    "Ya[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();Y(a",
    ",\"Missing node name\")}else d=Va;e=\nC(a.a);if(/(?![0-9])[\\w\\*]/.tes",
    "t(e.charAt(0)))if(\"(\"==C(a.a,1)){if(!Ma(e))throw Error(\"Invalid node",
    " type: \"+e);e=a.a.next();if(!Ma(e))throw Error(\"Invalid type name: \"",
    "+e);fb(a,\"(\");Y(a,\"Bad nodetype\");var f=C(a.a).charAt(0),g=null;if(",
    "'\"'==f||\"'\"==f)g=hb(a);Y(a,\"Bad nodetype\");gb(a);e=new H(e,g)}else",
    " if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new T(e);else{g=e.substring",
    "(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ja(g),!l)throw Error(\"Namesp",
    "ace prefix not declared: \"+g);e=e.substr(f+1);e=new T(e,l)}else throw ",
    "Error(\"Bad token: \"+\na.a.next());a=new V(kb(a),d.A);return c||new W(",
    "d,e,a,\"//\"==b)}function kb(a){for(var b=[];\"[\"==C(a.a);){a.a.next()",
    ";Y(a,\"Missing predicate expression.\");var c=db(a);b.push(c);Y(a,\"Unc",
    "losed predicate expression.\");fb(a,\"]\")}return b}function eb(a){if(",
    "\"-\"==C(a.a))return a.a.next(),new ab(eb(a));var b=ib(a);if(\"|\"!=C(a",
    ".a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing next union loca",
    "tion path.\"),b.push(ib(a));a.a.back();a=new bb(b)}return a};function l",
    "b(a){switch(a.nodeType){case 1:return ia(mb,a);case 9:return lb(a.docum",
    "entElement);case 11:case 10:case 6:case 12:return nb;default:return a.p",
    "arentNode?lb(a.parentNode):nb}}function nb(){return null}function mb(a,",
    "b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml",
    "\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value",
    "||null:a.parentNode&&9!=a.parentNode.nodeType?mb(a.parentNode,b):null};",
    "function ob(a,b){if(!a.length)throw Error(\"Empty XPath expression.\");",
    "a=ta(a);if(a.empty())throw Error(\"Invalid XPath expression.\");b?\"fun",
    "ction\"==ba(b)||(b=ha(b.lookupNamespaceURI,b)):b=function(){return null",
    "};var c=db(new cb(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.nex",
    "t());this.evaluate=function(a,b){a=c.evaluate(new z(a));return new Z(a,",
    "b)}}\nfunction Z(a,b){if(0==b)if(a instanceof G)b=4;else if(\"string\"=",
    "=typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"==typ",
    "eof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2!=b&&",
    "1!=b&&3!=b&&!(a instanceof G))throw Error(\"value could not be converte",
    "d to the specified type\");this.resultType=b;switch(b){case 2:this.stri",
    "ngValue=a instanceof G?J(a):\"\"+a;break;case 1:this.numberValue=a inst",
    "anceof G?+J(a):+a;break;case 3:this.booleanValue=a instanceof G?0<a.m()",
    ":!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var d=[];fo",
    "r(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.m();this.",
    "invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue=I(a);b",
    "reak;default:throw Error(\"Unknown XPathResult type.\");}var f=0;this.i",
    "terateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext called wi",
    "th wrong result type\");return f>=d.length?null:d[f++]};this.snapshotIt",
    "em=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called with wro",
    "ng result type\");return a>=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=0;Z.N",
    "UMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITERATOR",
    "_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_TYPE=6",
    ";Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRST_ORD",
    "ERED_NODE_TYPE=9;function pb(a){this.lookupNamespaceURI=lb(a)}\naa(\"wg",
    "xpath.install\",function(a,b){a=a||k;var c=a.Document&&a.Document.proto",
    "type||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.evaluate=function(",
    "a,b,c,g){return(new ob(a,c)).evaluate(b,g)},c.createExpression=function",
    "(a,b){return new ob(a,b)},c.createNSResolver=function(a){return new pb(",
    "a)}});function qb(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.l",
    "eft=d}h=qb.prototype;h.clone=function(){return new qb(this.top,this.rig",
    "ht,this.bottom,this.left)};h.toString=function(){return\"(\"+this.top+",
    "\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"};h.cont",
    "ains=function(a){return this&&a?a instanceof qb?a.left>=this.left&&a.ri",
    "ght<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&",
    "&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\nh.expand=functi",
    "on(a,b,c,d){da(a)?(this.top-=a.top,this.right+=a.right,this.bottom+=a.b",
    "ottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),this.bottom",
    "+=Number(c),this.left-=Number(d));return this};h.ceil=function(){this.t",
    "op=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Mat",
    "h.ceil(this.bottom);this.left=Math.ceil(this.left);return this};\nh.flo",
    "or=function(){this.top=Math.floor(this.top);this.right=Math.floor(this.",
    "right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.le",
    "ft);return this};h.round=function(){this.top=Math.round(this.top);this.",
    "right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.l",
    "eft=Math.round(this.left);return this};h.translate=function(a,b){a inst",
    "anceof v?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y",
    "):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b));retur",
    "n this};\nh.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;t",
    "his.top*=b;this.bottom*=b;return this};function rb(a,b,c,d){this.left=a",
    ";this.top=b;this.width=c;this.height=d}h=rb.prototype;h.clone=function(",
    "){return new rb(this.left,this.top,this.width,this.height)};h.toString=",
    "function(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.width+\"w",
    " x \"+this.height+\"h)\"};h.contains=function(a){return a instanceof v?",
    "a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top",
    "+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.width&&t",
    "his.top<=a.top&&this.top+this.height>=a.top+a.height};\nh.ceil=function",
    "(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);this.wid",
    "th=Math.ceil(this.width);this.height=Math.ceil(this.height);return this",
    "};h.floor=function(){this.left=Math.floor(this.left);this.top=Math.floo",
    "r(this.top);this.width=Math.floor(this.width);this.height=Math.floor(th",
    "is.height);return this};h.round=function(){this.left=Math.round(this.le",
    "ft);this.top=Math.round(this.top);this.width=Math.round(this.width);thi",
    "s.height=Math.round(this.height);return this};\nh.translate=function(a,",
    "b){a instanceof v?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(t",
    "his.top+=b));return this};h.scale=function(a,b){b=n(b)?b:a;this.left*=a",
    ";this.width*=a;this.top*=b;this.height*=b;return this};function sb(a,b)",
    "{var c=x(a);return c.defaultView&&c.defaultView.getComputedStyle&&(a=c.",
    "defaultView.getComputedStyle(a,null))?a[b]||a.getPropertyValue(b)||\"\"",
    ":\"\"}function ub(a){try{var b=a.getBoundingClientRect()}catch(c){retur",
    "n{left:0,top:0,right:0,bottom:0}}return b}\nfunction vb(a){var b=x(a),c",
    "=new v(0,0);if(a==(b?x(b):document).documentElement)return c;a=ub(a);va",
    "r d=(b?new y(x(b)):q||(q=new y)).D;b=d.scrollingElement?d.scrollingElem",
    "ent:d.body||d.documentElement;d=d.parentWindow||d.defaultView;b=new v(d",
    ".pageXOffset||b.scrollLeft,d.pageYOffset||b.scrollTop);c.x=a.left+b.x;c",
    ".y=a.top+b.y;return c}function wb(a){if(1==a.nodeType)return a=ub(a),ne",
    "w v(a.left,a.top);a=a.changedTouches?a.changedTouches[0]:a;return new v",
    "(a.clientX,a.clientY)};var xb=\"function\"===typeof ShadowRoot;function",
    " yb(a,b){b=vb(b);var c=vb(a);b=new v(b.x-c.x,b.y-c.y);var d=sb(a,\"bord",
    "erLeftWidth\");var e=sb(a,\"borderRightWidth\");c=sb(a,\"borderTopWidth",
    "\");a=sb(a,\"borderBottomWidth\");a=new qb(parseFloat(c),parseFloat(e),",
    "parseFloat(a),parseFloat(d));b.x-=a.left;b.y-=a.top;return b}\nfunction",
    " zb(a,b,c){function d(a,b,c,d,e){d=new rb(c.x+d.left,c.y+d.top,d.width,",
    "d.height);c=[0,0];b=[b.width,b.height];var f=[d.left,d.top];d=[d.width,",
    "d.height];for(var g=0;2>g;g++)if(d[g]>b[g])c[g]=e?f[g]+d[g]/2-b[g]/2:f[",
    "g];else{var l=f[g]-b[g]+d[g];0<l?c[g]=l:0>f[g]&&(c[g]=f[g])}e=new v(c[0",
    "],c[1]);a.scrollLeft+=e.x;a.scrollTop+=e.y}function e(a){var b=a.parent",
    "Node;xb&&b instanceof ShadowRoot&&(b=a.host);return b}for(var f=x(a),g=",
    "e(a),l;g&&g!=f.documentElement&&g!=f.body;)l=yb(g,a),d(g,new w(g.client",
    "Width,\ng.clientHeight),l,b,c),g=e(g);l=wb(a);a=sa(a?new y(x(a)):q||(q=",
    "new y));d(f.documentElement,a,l,b,c);f.body&&d(f.body,a,l,b,c)};aa(\"_",
    "\",function(a,b,c){c||(c=new rb(0,0,a.offsetWidth,a.offsetHeight));zb(a",
    ",c,b);a=wb(a);return new v(a.x+c.left,a.y+c.top)});; return this._.appl",
    "y(null,arguments);}.apply({navigator:typeof window!='undefined'?window.",
    "navigator:null,document:typeof window!='undefined'?window.document:null",
    "}, arguments);}",
    NULL
};

const char* const GET_PAGE_ZOOM[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof Array)return\"array\";if(a instanceof Object)return b;var c=Object",
    ".prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";",
    "if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ha(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a,b){function c(){}c.prototype=b.prototype;a.na=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=function(a,",
    "c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};function m(a,b){for",
    "(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(void ",
    "0,d[e],e,a)}function n(a,b,c){var d=c;m(a,function(c,f){d=b.call(void 0",
    ",d,c,f,a)});return d}function p(a,b){for(var c=a.length,d=h(a)?a.split(",
    "\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;return!",
    "1}function ia(a){return Array.prototype.concat.apply([],arguments)}func",
    "tion ja(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,",
    "b):Array.prototype.slice.call(a,b,c)};function ka(a,b){if(!a||!b)return",
    "!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"undefin",
    "ed\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocumen",
    "tPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction la",
    "(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDoc",
    "umentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourceI",
    "ndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)retu",
    "rn a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return",
    " e==f?na(a,b):!c&&ka(e,b)?-1*oa(a,b):!d&&ka(f,a)?oa(b,a):(c?a.sourceInd",
    "ex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType?a:a.o",
    "wnerDocument||a.document;c=d.createRange();c.selectNode(a);c.collapse(!",
    "0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.compareB",
    "oundaryPoints(aa.Range.START_TO_END,a)}function oa(a,b){var c=a.parentN",
    "ode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return na(b,a",
    ")}function na(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}",
    ";/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copy",
    "right (c) 2012 Google Inc.\n\n Permission is hereby granted, free of ch",
    "arge, to any person obtaining a copy\n of this software and associated ",
    "documentation files (the \"Software\"), to\n deal in the Software witho",
    "ut restriction, including without limitation the\n rights to use, copy,",
    " modify, merge, publish, distribute, sublicense, and/or\n sell copies o",
    "f the Software, and to permit persons to whom the Software is\n furnish",
    "ed to do so, subject to the following conditions:\n\n The above copyrig",
    "ht notice and this permission notice shall be included in\n all copies ",
    "or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED ",
    "\"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDIN",
    "G BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A",
    " PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHOR",
    "S OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIAB",
    "ILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n F",
    "ROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL",
    "INGS\n IN THE SOFTWARE.\n*/\nfunction q(a,b,c){this.l=a;this.ka=b||1;th",
    "is.j=c||1};function r(a){this.S=a;this.I=0}function pa(a){a=a.match(qa)",
    ";for(var b=0;b<a.length;b++)ra.test(a[b])&&a.splice(b,1);return new r(a",
    ")}var qa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|",
    "[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*",
    "'|[!<>]=|\\s+|./g,ra=/^\\s/;function t(a,b){return a.S[a.I+(b||0)]}r.pr",
    "ototype.next=function(){return this.S[this.I++]};r.prototype.back=funct",
    "ion(){this.I--};r.prototype.empty=function(){return this.S.length<=this",
    ".I};function u(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void",
    " 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"",
    "!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;c=0;var",
    " d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(",
    "a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;",
    "return\"\"+b}\nfunction v(a,b,c){if(null===b)return!0;try{if(!a.getAttr",
    "ibute)return!1}catch(d){return!1}return null==c?!!a.getAttribute(b):a.g",
    "etAttribute(b,2)==c}function w(a,b,c,d,e){return sa.call(null,a,b,h(c)?",
    "c:null,h(d)?d:null,e||new x)}\nfunction sa(a,b,c,d,e){b.getElementsByNa",
    "me&&d&&\"name\"==c?(b=b.getElementsByName(d),m(b,function(b){a.matches(",
    "b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.getEleme",
    "ntsByClassName(d),m(b,function(b){b.className==d&&a.matches(b)&&e.add(b",
    ")})):a instanceof y?ta(a,b,c,d,e):b.getElementsByTagName&&(b=b.getEleme",
    "ntsByTagName(a.getName()),m(b,function(a){v(a,c,d)&&e.add(a)}));return ",
    "e}function ta(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)v(b,c,d)&",
    "&a.matches(b)&&e.add(b),ta(a,b,c,d,e)};function x(){this.j=this.g=null;",
    "this.D=0}function ua(a){this.node=a;this.next=this.w=null}function va(a",
    ",b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,",
    "f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<la(c.node,b.node)?(e",
    "=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e",
    ";)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}x.prototype.unshif",
    "t=function(a){a=new ua(a);a.next=this.g;this.j?this.g.w=a:this.g=this.j",
    "=a;this.g=a;this.D++};\nx.prototype.add=function(a){a=new ua(a);a.w=thi",
    "s.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};function A(",
    "a){return(a=a.g)?a.node:null}x.prototype.m=function(){return this.D};fu",
    "nction B(a){return(a=A(a))?u(a):\"\"}x.prototype.iterator=function(a){r",
    "eturn new wa(this,!!a)};function wa(a,b){this.ga=a;this.T=(this.A=b)?a.",
    "j:a.g;this.O=null}wa.prototype.next=function(){var a=this.T;if(null==a)",
    "return null;var b=this.O=a;this.T=this.A?a.w:a.next;return b.node};\nwa",
    ".prototype.remove=function(){var a=this.ga,b=this.O;if(!b)throw Error(",
    "\"Next must be called at least once before remove.\");var c=b.w;b=b.nex",
    "t;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function C(a){this.",
    "f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n  \"+a.toStri",
    "ng().split(\"\\n\").join(\"\\n  \")}C.prototype.c=function(){return thi",
    "s.o};function xa(a,b){a.o=b}function ya(a,b){a.h=b}C.prototype.u=functi",
    "on(){return this.F};function E(a,b){a=a.evaluate(b);return a instanceof",
    " x?+B(a):+a}function F(a,b){a=a.evaluate(b);return a instanceof x?B(a):",
    "\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof x?!!a.m():!!",
    "a};function H(a,b,c){C.call(this,a.f);this.R=a;this.W=b;this.aa=c;this.",
    "o=b.c()||c.c();this.h=b.h||c.h;this.R==za&&(c.h||c.c()||4==c.f||0==c.f|",
    "|!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().name,C:",
    "b}):this.F={name:b.u().name,C:c})}k(H,C);\nfunction I(a,b,c,d,e){b=b.ev",
    "aluate(d);c=c.evaluate(d);var f;if(b instanceof x&&c instanceof x){b=b.",
    "iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;",
    "f=e.next())if(a(u(d),u(f)))return!0;return!1}if(b instanceof x||c insta",
    "nceof x){b instanceof x?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=ty",
    "peof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+u(l);break",
    ";case \"boolean\":l=!!u(l);break;case \"string\":l=u(l);break;default:t",
    "hrow Error(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(l,",
    "d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||\"bo",
    "olean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c",
    "?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){return this.",
    "R.v(this.W,this.aa,a)};H.prototype.toString=function(){var a=\"Binary E",
    "xpression: \"+this.R;a+=D(this.W);return a+=D(this.aa)};function Aa(a,b",
    ",c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}Aa.prototype.toString=functi",
    "on(){return this.ja};var Ba={};\nfunction J(a,b,c,d){if(Ba.hasOwnProper",
    "ty(a))throw Error(\"Binary operator already created: \"+a);a=new Aa(a,b",
    ",c,d);return Ba[a.toString()]=a}J(\"div\",6,1,function(a,b,c){return E(",
    "a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E(b,c)});J(\"",
    "*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,function(a,b",
    ",c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){return E(a,c)-E(",
    "b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){return a<b},a",
    ",b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b){return a>b",
    "},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a,b){return a",
    "<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(function(a,b){retur",
    "n a>=b},a,b,c)});var za=J(\"=\",3,2,function(a,b,c){return I(function(a",
    ",b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){return I(func",
    "tion(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a,b,c){return",
    " G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c)||G(b,c)});",
    "function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression must ",
    "evaluate to nodeset if filter has predicate(s).\");C.call(this,a.f);thi",
    "s.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K,C);K.prototype.evaluate=func",
    "tion(a){a=this.$.evaluate(a);return Ca(this.b,a)};K.prototype.toString=",
    "function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)};function L(",
    "a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expects at least",
    "\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&b.length>a.",
    "P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\" arguments,",
    " \"+b.length+\" given\");a.ha&&m(b,function(b,d){if(4!=b.f)throw Error(",
    "\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b);",
    "});C.call(this,a.f);this.H=a;this.M=b;xa(this,a.o||p(b,function(a){retu",
    "rn a.c()}));ya(this,a.fa&&!b.length||a.ea&&!!b.length||p(b,function(a){",
    "return a.h}))}\nk(L,C);L.prototype.evaluate=function(a){return this.H.v",
    ".apply(null,ia(a,this.M))};L.prototype.toString=function(){var a=\"Func",
    "tion: \"+this.H;if(this.M.length){var b=n(this.M,function(a,b){return a",
    "+D(b)},\"Arguments:\");a+=D(b)}return a};function Da(a,b,c,d,e,f,g,l){t",
    "his.i=a;this.f=b;this.o=c;this.fa=d;this.ea=!1;this.v=e;this.Y=f;this.P",
    "=void 0!==g?g:f;this.ha=!!l}Da.prototype.toString=function(){return thi",
    "s.i};var Ea={};\nfunction M(a,b,c,d,e,f,g,l){if(Ea.hasOwnProperty(a))th",
    "row Error(\"Function already created: \"+a+\".\");Ea[a]=new Da(a,b,c,d,",
    "e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},1);M(\"ceil",
    "ing\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(\"concat\",3",
    ",!1,!1,function(a,b){return n(ja(arguments,1),function(b,d){return b+F(",
    "d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b=F(b,a);a=",
    "F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,function(a,b){ret",
    "urn b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,function(){return!",
    "1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E(b,a))},1);M",
    "(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDocume",
    "nt;a=F(b,a).split(/\\s+/);var e=[];m(a,function(a){a=d.getElementById(a",
    ");var b;if(!(b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1;els",
    "e{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.p",
    "ush(a)});e.sort(la);var f=new x;m(e,function(a){f.add(a)});return f},1)",
    ";M(\"lang\",2,!1,!1,function(){return!1},1);\nM(\"last\",1,!0,!1,functi",
    "on(a){if(1!=arguments.length)throw Error(\"Function last expects ()\");",
    "return a.j},0);M(\"local-name\",3,!1,!0,function(a,b){return(a=b?A(b.ev",
    "aluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);M(",
    "\"name\",3,!1,!0,function(a,b){return(a=b?A(b.evaluate(a)):a.l)?a.nodeN",
    "ame.toLowerCase():\"\"},0,1,!0);M(\"namespace-uri\",3,!0,!1,function(){",
    "return\"\"},0,1,!0);\nM(\"normalize-space\",3,!1,!0,function(a,b){retur",
    "n(b?F(b,a):u(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g",
    ",\"\")},0,1);M(\"not\",2,!1,!1,function(a,b){return!G(b,a)},1);M(\"numb",
    "er\",1,!1,!0,function(a,b){return b?E(b,a):+u(a.l)},0,1);M(\"position\"",
    ",1,!0,!1,function(a){return a.ka},0);M(\"round\",1,!1,!1,function(a,b){",
    "return Math.round(E(b,a))},1);M(\"starts-with\",2,!1,!1,function(a,b,c)",
    "{b=F(b,a);a=F(c,a);return 0==b.lastIndexOf(a,0)},2);M(\"string\",3,!1,!",
    "0,function(a,b){return b?F(b,a):u(a.l)},0,1);\nM(\"string-length\",1,!1",
    ",!0,function(a,b){return(b?F(b,a):u(a.l)).length},0,1);M(\"substring\",",
    "3,!1,!1,function(a,b,c,d){c=E(c,a);if(isNaN(c)||Infinity==c||-Infinity=",
    "=c)return\"\";d=d?E(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\"",
    ";c=Math.round(c)-1;var e=Math.max(c,0);a=F(b,a);return Infinity==d?a.su",
    "bstring(e):a.substring(e,c+Math.round(d))},2,3);M(\"substring-after\",3",
    ",!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);c=b.indexOf(a);return-1==c?\"",
    "\":b.substring(c+a.length)},2);\nM(\"substring-before\",3,!1,!1,functio",
    "n(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(",
    "0,a)},2);M(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0",
    ";for(var c=a.next();c;c=a.next())b+=+u(c);return b},1,1,!0);M(\"transla",
    "te\",3,!1,!1,function(a,b,c,d){b=F(b,a);c=F(c,a);var e=F(d,a);a={};for(",
    "d=0;d<c.length;d++){var f=c.charAt(d);f in a||(a[f]=e.charAt(d))}c=\"\"",
    ";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f in a?a[f]:f;return c},3);M(",
    "\"true\",2,!1,!1,function(){return!0},0);function y(a,b){this.ca=a;this",
    ".X=void 0!==b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;br",
    "eak;case \"text\":this.B=3;break;case \"processing-instruction\":this.B",
    "=7;break;case \"node\":break;default:throw Error(\"Unexpected argument",
    "\");}}function Fa(a){return\"comment\"==a||\"text\"==a||\"processing-in",
    "struction\"==a||\"node\"==a}y.prototype.matches=function(a){return null",
    "===this.B||this.B==a.nodeType};y.prototype.getName=function(){return th",
    "is.ca};\ny.prototype.toString=function(){var a=\"Kind Test: \"+this.ca;",
    "null===this.X||(a+=D(this.X));return a};function N(a){C.call(this,3);th",
    "is.ba=a.substring(1,a.length-1)}k(N,C);N.prototype.evaluate=function(){",
    "return this.ba};N.prototype.toString=function(){return\"Literal: \"+thi",
    "s.ba};function O(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"ht",
    "tp://www.w3.org/1999/xhtml\";this.J=b?b.toLowerCase():a}O.prototype.mat",
    "ches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.l",
    "ocalName?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerC",
    "ase()?!1:\"*\"==this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowe",
    "rCase():\"http://www.w3.org/1999/xhtml\")};O.prototype.getName=function",
    "(){return this.i};\nO.prototype.toString=function(){return\"Name Test: ",
    "\"+(\"http://www.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i}",
    ";function P(a){C.call(this,1);this.da=a}k(P,C);P.prototype.evaluate=fun",
    "ction(){return this.da};P.prototype.toString=function(){return\"Number:",
    " \"+this.da};function Q(a,b){C.call(this,a.f);this.V=a;this.G=b;this.o=",
    "a.c();this.h=a.h;1==this.G.length&&(a=this.G[0],a.N||a.s!=Ga||(a=a.L,\"",
    "*\"!=a.getName()&&(this.F={name:a.getName(),C:null})))}k(Q,C);function ",
    "R(){C.call(this,4)}k(R,C);R.prototype.evaluate=function(a){var b=new x;",
    "a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument);return b};R.prototy",
    "pe.toString=function(){return\"Root Helper Expression\"};function S(){C",
    ".call(this,4)}k(S,C);S.prototype.evaluate=function(a){var b=new x;b.add",
    "(a.l);return b};\nS.prototype.toString=function(){return\"Context Helpe",
    "r Expression\"};function Ha(a){return\"/\"==a||\"//\"==a}\nQ.prototype.",
    "evaluate=function(a){var b=this.V.evaluate(a);if(!(b instanceof x))thro",
    "w Error(\"Filter expression must evaluate to nodeset.\");a=this.G;for(v",
    "ar c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c",
    "()||e.s!=Ia)if(e.c()||e.s!=Ja){var g=f.next();for(b=e.evaluate(new q(g)",
    ");null!=(g=f.next());)g=e.evaluate(new q(g)),b=va(b,g)}else g=f.next(),",
    "b=e.evaluate(new q(g));else{for(g=f.next();(b=f.next())&&(!g.contains||",
    "g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new q(",
    "g))}}return b};\nQ.prototype.toString=function(){var a=\"Path Expressio",
    "n:\"+D(this.V);if(this.G.length){var b=n(this.G,function(a,b){return a+",
    "D(b)},\"Steps:\");a+=D(b)}return a};function T(a,b){this.b=a;this.A=!!b",
    "}function Ca(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.it",
    "erator(),f=b.m(),g,l=0;g=e.next();l++){var z=a.A?f-l:l+1;g=d.evaluate(n",
    "ew q(g,z,f));if(\"number\"==typeof g)z=z==g;else if(\"string\"==typeof ",
    "g||\"boolean\"==typeof g)z=!!g;else if(g instanceof x)z=0<g.m();else th",
    "row Error(\"Predicate.evaluate returned an unexpected type.\");z||e.rem",
    "ove()}return b}T.prototype.u=function(){return 0<this.b.length?this.b[0",
    "].u():null};\nT.prototype.c=function(){for(var a=0;a<this.b.length;a++)",
    "{var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};T.prototyp",
    "e.m=function(){return this.b.length};T.prototype.toString=function(){re",
    "turn n(this.b,function(a,b){return a+D(b)},\"Predicates:\")};function U",
    "(a,b,c,d){C.call(this,4);this.s=a;this.L=b;this.b=c||new T([]);this.N=!",
    "!d;b=this.b.u();a.la&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()",
    "}k(U,C);\nU.prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,",
    "e=null,f=0;c&&(d=c.name,e=c.C?F(c.C,a):null,f=1);if(this.N)if(this.c()|",
    "|this.s!=Ka)if(b=(new U(La,new y(\"node\"))).evaluate(a).iterator(),c=b",
    ".next())for(a=this.v(c,d,e,f);null!=(c=b.next());)a=va(a,this.v(c,d,e,f",
    "));else a=new x;else a=w(this.L,b,d,e),a=Ca(this.b,a,f);else a=this.v(a",
    ".l,d,e,f);return a};U.prototype.v=function(a,b,c,d){a=this.s.H(this.L,a",
    ",b,c);return a=Ca(this.b,a,d)};\nU.prototype.toString=function(){var a=",
    "\"Step:\"+D(\"Operator: \"+(this.N?\"//\":\"/\"));this.s.i&&(a+=D(\"Axi",
    "s: \"+this.s));a+=D(this.L);if(this.b.m()){var b=n(this.b.b,function(a,",
    "b){return a+D(b)},\"Predicates:\");a+=D(b)}return a};function Ma(a,b,c,",
    "d){this.i=a;this.H=b;this.A=c;this.la=d}Ma.prototype.toString=function(",
    "){return this.i};var Na={};function V(a,b,c,d){if(Na.hasOwnProperty(a))",
    "throw Error(\"Axis already created: \"+a);b=new Ma(a,b,c,!!d);return Na",
    "[a]=b}\nV(\"ancestor\",function(a,b){for(var c=new x;b=b.parentNode;)a.",
    "matches(b)&&c.unshift(b);return c},!0);V(\"ancestor-or-self\",function(",
    "a,b){var c=new x;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);re",
    "turn c},!0);\nvar Ga=V(\"attribute\",function(a,b){var c=new x,d=a.getN",
    "ame();if(b=b.attributes)if(a instanceof y&&null===a.B||\"*\"==d)for(a=0",
    ";d=b[a];a++)c.add(d);else(d=b.getNamedItem(d))&&c.add(d);return c},!1),",
    "Ka=V(\"child\",function(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new",
    " x;for(b=b.firstChild;b;b=b.nextSibling)v(b,c,d)&&a.matches(b)&&e.add(b",
    ");return e},!1,!0);V(\"descendant\",w,!1,!0);\nvar La=V(\"descendant-or",
    "-self\",function(a,b,c,d){var e=new x;v(b,c,d)&&a.matches(b)&&e.add(b);",
    "return w(a,b,c,d,e)},!1,!0),Ia=V(\"following\",function(a,b,c,d){var e=",
    "new x;do for(var f=b;f=f.nextSibling;)v(f,c,d)&&a.matches(f)&&e.add(f),",
    "e=w(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);V(\"following-sib",
    "ling\",function(a,b){for(var c=new x;b=b.nextSibling;)a.matches(b)&&c.a",
    "dd(b);return c},!1);V(\"namespace\",function(){return new x},!1);\nvar ",
    "Oa=V(\"parent\",function(a,b){var c=new x;if(9==b.nodeType)return c;if(",
    "2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b",
    ")&&c.add(b);return c},!1),Ja=V(\"preceding\",function(a,b,c,d){var e=ne",
    "w x,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g",
    "<l;g++){var z=[];for(b=f[g];b=b.previousSibling;)z.unshift(b);for(var m",
    "a=0,ab=z.length;ma<ab;ma++)b=z[ma],v(b,c,d)&&a.matches(b)&&e.add(b),e=w",
    "(a,b,c,d,e)}return e},!0,!0);\nV(\"preceding-sibling\",function(a,b){fo",
    "r(var c=new x;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c}",
    ",!0);var Pa=V(\"self\",function(a,b){var c=new x;a.matches(b)&&c.add(b)",
    ";return c},!1);function W(a){C.call(this,1);this.U=a;this.o=a.c();this.",
    "h=a.h}k(W,C);W.prototype.evaluate=function(a){return-E(this.U,a)};W.pro",
    "totype.toString=function(){return\"Unary Expression: -\"+D(this.U)};fun",
    "ction X(a){C.call(this,4);this.K=a;xa(this,p(this.K,function(a){return ",
    "a.c()}));ya(this,p(this.K,function(a){return a.h}))}k(X,C);X.prototype.",
    "evaluate=function(a){var b=new x;m(this.K,function(c){c=c.evaluate(a);i",
    "f(!(c instanceof x))throw Error(\"Path expression must evaluate to Node",
    "Set.\");b=va(b,c)});return b};X.prototype.toString=function(){return n(",
    "this.K,function(a,b){return a+D(b)},\"Union Expression:\")};function Qa",
    "(a,b){this.a=a;this.ia=b}function Ra(a){for(var b,c=[];;){Y(a,\"Missing",
    " right hand side of binary expression.\");b=Sa(a);var d=a.a.next();if(!",
    "d)break;var e=(d=Ba[d]||null)&&d.Z;if(!e){a.a.back();break}for(;c.lengt",
    "h&&e<=c[c.length-1].Z;)b=new H(c.pop(),c.pop(),b);c.push(b,d)}for(;c.le",
    "ngth;)b=new H(c.pop(),c.pop(),b);return b}function Y(a,b){if(a.a.empty(",
    "))throw Error(b);}function Ta(a,b){a=a.a.next();if(a!=b)throw Error(\"B",
    "ad token, expected: \"+b+\" got: \"+a);}\nfunction Ua(a){a=a.a.next();i",
    "f(\")\"!=a)throw Error(\"Bad token: \"+a);}function Va(a){a=a.a.next();",
    "if(2>a.length)throw Error(\"Unclosed literal string\");return new N(a)}",
    "\nfunction Wa(a){var b=[];if(Ha(t(a.a))){var c=a.a.next();var d=t(a.a);",
    "if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(",
    "?![0-9])[\\w]/.test(d)))return new R;d=new R;Y(a,\"Missing next locatio",
    "n step.\");c=Xa(a,c);b.push(c)}else{a:{c=t(a.a);d=c.charAt(0);switch(d)",
    "{case \"$\":throw Error(\"Variable reference not allowed in HTML XPath",
    "\");case \"(\":a.a.next();c=Ra(a);Y(a,'unclosed \"(\"');Ta(a,\")\");bre",
    "ak;case '\"':case \"'\":c=Va(a);break;default:if(isNaN(+c))if(!Fa(c)&&/",
    "(?![0-9])[\\w]/.test(d)&&\"(\"==t(a.a,\n1)){c=a.a.next();c=Ea[c]||null;",
    "a.a.next();for(d=[];\")\"!=t(a.a);){Y(a,\"Missing function argument lis",
    "t.\");d.push(Ra(a));if(\",\"!=t(a.a))break;a.a.next()}Y(a,\"Unclosed fu",
    "nction argument list.\");Ua(a);c=new L(c,d)}else{c=null;break a}else c=",
    "new P(+a.a.next())}\"[\"==t(a.a)&&(d=new T(Ya(a)),c=new K(c,d))}if(c)if",
    "(Ha(t(a.a)))d=c;else return c;else c=Xa(a,\"/\"),d=new S,b.push(c)}for(",
    ";Ha(t(a.a));)c=a.a.next(),Y(a,\"Missing next location step.\"),c=Xa(a,c",
    "),b.push(c);return new Q(d,b)}\nfunction Xa(a,b){if(\"/\"!=b&&\"//\"!=b",
    ")throw Error('Step op should be \"/\" or \"//\"');if(\".\"==t(a.a)){var",
    " c=new U(Pa,new y(\"node\"));a.a.next();return c}if(\"..\"==t(a.a))retu",
    "rn c=new U(Oa,new y(\"node\")),a.a.next(),c;if(\"@\"==t(a.a)){var d=Ga;",
    "a.a.next();Y(a,\"Missing attribute name\")}else if(\"::\"==t(a.a,1)){if",
    "(!/(?![0-9])[\\w]/.test(t(a.a).charAt(0)))throw Error(\"Bad token: \"+a",
    ".a.next());var e=a.a.next();d=Na[e]||null;if(!d)throw Error(\"No axis w",
    "ith name: \"+e);a.a.next();Y(a,\"Missing node name\")}else d=Ka;e=\nt(a",
    ".a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==t(a.a,1)){if(!Fa",
    "(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!Fa(e))throw",
    " Error(\"Invalid type name: \"+e);Ta(a,\"(\");Y(a,\"Bad nodetype\");var",
    " f=t(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=Va(a);Y(a,\"Bad nodet",
    "ype\");Ua(a);e=new y(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f",
    ")e=new O(e);else{g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a",
    ".ia(g),!l)throw Error(\"Namespace prefix not declared: \"+g);e=e.substr",
    "(f+1);e=new O(e,l)}else throw Error(\"Bad token: \"+\na.a.next());a=new",
    " T(Ya(a),d.A);return c||new U(d,e,a,\"//\"==b)}function Ya(a){for(var b",
    "=[];\"[\"==t(a.a);){a.a.next();Y(a,\"Missing predicate expression.\");v",
    "ar c=Ra(a);b.push(c);Y(a,\"Unclosed predicate expression.\");Ta(a,\"]\"",
    ")}return b}function Sa(a){if(\"-\"==t(a.a))return a.a.next(),new W(Sa(a",
    "));var b=Wa(a);if(\"|\"!=t(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y",
    "(a,\"Missing next union location path.\"),b.push(Wa(a));a.a.back();a=ne",
    "w X(b)}return a};function Za(a){switch(a.nodeType){case 1:return ha($a,",
    "a);case 9:return Za(a.documentElement);case 11:case 10:case 6:case 12:r",
    "eturn bb;default:return a.parentNode?Za(a.parentNode):bb}}function bb()",
    "{return null}function $a(a,b){if(a.prefix==b)return a.namespaceURI||\"h",
    "ttp://www.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);re",
    "turn c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNode.nodeTyp",
    "e?$a(a.parentNode,b):null};function cb(a,b){if(!a.length)throw Error(\"",
    "Empty XPath expression.\");a=pa(a);if(a.empty())throw Error(\"Invalid X",
    "Path expression.\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b",
    ")):b=function(){return null};var c=Ra(new Qa(a,b));if(!a.empty())throw ",
    "Error(\"Bad token: \"+a.next());this.evaluate=function(a,b){a=c.evaluat",
    "e(new q(a));return new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceo",
    "f x)b=4;else if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b",
    "=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected eval",
    "uation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof x))throw Error(\"",
    "value could not be converted to the specified type\");this.resultType=b",
    ";switch(b){case 2:this.stringValue=a instanceof x?B(a):\"\"+a;break;cas",
    "e 1:this.numberValue=a instanceof x?+B(a):+a;break;case 3:this.booleanV",
    "alue=a instanceof x?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c",
    "=\na.iterator();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this",
    ".snapshotLength=a.m();this.invalidIteratorState=!1;break;case 8:case 9:",
    "this.singleNodeValue=A(a);break;default:throw Error(\"Unknown XPathResu",
    "lt type.\");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Er",
    "ror(\"iterateNext called with wrong result type\");return f>=d.length?n",
    "ull:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"s",
    "napshotItem called with wrong result type\");return a>=d.length||0>a?nu",
    "ll:d[a]}}\nZ.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=",
    "3;Z.UNORDERED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNO",
    "RDERED_NODE_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDE",
    "RED_NODE_TYPE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function db(a){this.lookupN",
    "amespaceURI=Za(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=",
    "a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathR",
    "esult=Z,c.evaluate=function(a,b,c,g){return(new cb(a,c)).evaluate(b,g)}",
    ",c.createExpression=function(a,b){return new cb(a,b)},c.createNSResolve",
    "r=function(a){return new db(a)}});ba(\"_\",function(a){a=9==a.nodeType?",
    "a:a.ownerDocument||a.document;var b=a.documentElement;return a.width/Ma",
    "th.max(b.clientWidth,b.offsetWidth,b.scrollWidth)});; return this._.app",
    "ly(null,arguments);}.apply({navigator:typeof window!='undefined'?window",
    ".navigator:null,document:typeof window!='undefined'?window.document:nul",
    "l}, arguments);}",
    NULL
};

const char* const IS_ELEMENT_CLICKABLE[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof Array)return\"array\";if(a instanceof Object)return b;var c=Object",
    ".prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";",
    "if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ha(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a,b){function c(){}c.prototype=b.prototype;a.na=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=function(a,",
    "c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};function m(a,b){for",
    "(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(void ",
    "0,d[e],e,a)}function n(a,b,c){var d=c;m(a,function(c,f){d=b.call(void 0",
    ",d,c,f,a)});return d}function p(a,b){for(var c=a.length,d=h(a)?a.split(",
    "\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;return!",
    "1}function ia(a){return Array.prototype.concat.apply([],arguments)}func",
    "tion ja(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,",
    "b):Array.prototype.slice.call(a,b,c)};function ka(a,b){if(!a||!b)return",
    "!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"undefin",
    "ed\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocumen",
    "tPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction la",
    "(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDoc",
    "umentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourceI",
    "ndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)retu",
    "rn a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return",
    " e==f?na(a,b):!c&&ka(e,b)?-1*oa(a,b):!d&&ka(f,a)?oa(b,a):(c?a.sourceInd",
    "ex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType?a:a.o",
    "wnerDocument||a.document;c=d.createRange();c.selectNode(a);c.collapse(!",
    "0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.compareB",
    "oundaryPoints(aa.Range.START_TO_END,a)}function oa(a,b){var c=a.parentN",
    "ode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return na(b,a",
    ")}function na(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}",
    ";/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copy",
    "right (c) 2012 Google Inc.\n\n Permission is hereby granted, free of ch",
    "arge, to any person obtaining a copy\n of this software and associated ",
    "documentation files (the \"Software\"), to\n deal in the Software witho",
    "ut restriction, including without limitation the\n rights to use, copy,",
    " modify, merge, publish, distribute, sublicense, and/or\n sell copies o",
    "f the Software, and to permit persons to whom the Software is\n furnish",
    "ed to do so, subject to the following conditions:\n\n The above copyrig",
    "ht notice and this permission notice shall be included in\n all copies ",
    "or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED ",
    "\"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDIN",
    "G BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A",
    " PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHOR",
    "S OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIAB",
    "ILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n F",
    "ROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL",
    "INGS\n IN THE SOFTWARE.\n*/\nfunction q(a,b,c){this.l=a;this.ka=b||1;th",
    "is.j=c||1};function r(a){this.S=a;this.I=0}function pa(a){a=a.match(qa)",
    ";for(var b=0;b<a.length;b++)ra.test(a[b])&&a.splice(b,1);return new r(a",
    ")}var qa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|",
    "[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*",
    "'|[!<>]=|\\s+|./g,ra=/^\\s/;function t(a,b){return a.S[a.I+(b||0)]}r.pr",
    "ototype.next=function(){return this.S[this.I++]};r.prototype.back=funct",
    "ion(){this.I--};r.prototype.empty=function(){return this.S.length<=this",
    ".I};function u(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void",
    " 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"",
    "!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;c=0;var",
    " d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(",
    "a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;",
    "return\"\"+b}\nfunction v(a,b,c){if(null===b)return!0;try{if(!a.getAttr",
    "ibute)return!1}catch(d){return!1}return null==c?!!a.getAttribute(b):a.g",
    "etAttribute(b,2)==c}function w(a,b,c,d,e){return sa.call(null,a,b,h(c)?",
    "c:null,h(d)?d:null,e||new x)}\nfunction sa(a,b,c,d,e){b.getElementsByNa",
    "me&&d&&\"name\"==c?(b=b.getElementsByName(d),m(b,function(b){a.matches(",
    "b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.getEleme",
    "ntsByClassName(d),m(b,function(b){b.className==d&&a.matches(b)&&e.add(b",
    ")})):a instanceof y?ta(a,b,c,d,e):b.getElementsByTagName&&(b=b.getEleme",
    "ntsByTagName(a.getName()),m(b,function(a){v(a,c,d)&&e.add(a)}));return ",
    "e}function ta(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)v(b,c,d)&",
    "&a.matches(b)&&e.add(b),ta(a,b,c,d,e)};function x(){this.j=this.g=null;",
    "this.D=0}function ua(a){this.node=a;this.next=this.w=null}function va(a",
    ",b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,",
    "f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<la(c.node,b.node)?(e",
    "=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e",
    ";)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}x.prototype.unshif",
    "t=function(a){a=new ua(a);a.next=this.g;this.j?this.g.w=a:this.g=this.j",
    "=a;this.g=a;this.D++};\nx.prototype.add=function(a){a=new ua(a);a.w=thi",
    "s.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};function A(",
    "a){return(a=a.g)?a.node:null}x.prototype.m=function(){return this.D};fu",
    "nction B(a){return(a=A(a))?u(a):\"\"}x.prototype.iterator=function(a){r",
    "eturn new wa(this,!!a)};function wa(a,b){this.ga=a;this.T=(this.A=b)?a.",
    "j:a.g;this.O=null}wa.prototype.next=function(){var a=this.T;if(null==a)",
    "return null;var b=this.O=a;this.T=this.A?a.w:a.next;return b.node};\nwa",
    ".prototype.remove=function(){var a=this.ga,b=this.O;if(!b)throw Error(",
    "\"Next must be called at least once before remove.\");var c=b.w;b=b.nex",
    "t;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function C(a){this.",
    "f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n  \"+a.toStri",
    "ng().split(\"\\n\").join(\"\\n  \")}C.prototype.c=function(){return thi",
    "s.o};function xa(a,b){a.o=b}function ya(a,b){a.h=b}C.prototype.u=functi",
    "on(){return this.F};function E(a,b){a=a.evaluate(b);return a instanceof",
    " x?+B(a):+a}function F(a,b){a=a.evaluate(b);return a instanceof x?B(a):",
    "\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof x?!!a.m():!!",
    "a};function H(a,b,c){C.call(this,a.f);this.R=a;this.W=b;this.aa=c;this.",
    "o=b.c()||c.c();this.h=b.h||c.h;this.R==za&&(c.h||c.c()||4==c.f||0==c.f|",
    "|!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().name,C:",
    "b}):this.F={name:b.u().name,C:c})}k(H,C);\nfunction I(a,b,c,d,e){b=b.ev",
    "aluate(d);c=c.evaluate(d);var f;if(b instanceof x&&c instanceof x){b=b.",
    "iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;",
    "f=e.next())if(a(u(d),u(f)))return!0;return!1}if(b instanceof x||c insta",
    "nceof x){b instanceof x?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=ty",
    "peof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+u(l);break",
    ";case \"boolean\":l=!!u(l);break;case \"string\":l=u(l);break;default:t",
    "hrow Error(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(l,",
    "d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||\"bo",
    "olean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c",
    "?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){return this.",
    "R.v(this.W,this.aa,a)};H.prototype.toString=function(){var a=\"Binary E",
    "xpression: \"+this.R;a+=D(this.W);return a+=D(this.aa)};function Aa(a,b",
    ",c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}Aa.prototype.toString=functi",
    "on(){return this.ja};var Ba={};\nfunction J(a,b,c,d){if(Ba.hasOwnProper",
    "ty(a))throw Error(\"Binary operator already created: \"+a);a=new Aa(a,b",
    ",c,d);return Ba[a.toString()]=a}J(\"div\",6,1,function(a,b,c){return E(",
    "a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E(b,c)});J(\"",
    "*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,function(a,b",
    ",c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){return E(a,c)-E(",
    "b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){return a<b},a",
    ",b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b){return a>b",
    "},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a,b){return a",
    "<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(function(a,b){retur",
    "n a>=b},a,b,c)});var za=J(\"=\",3,2,function(a,b,c){return I(function(a",
    ",b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){return I(func",
    "tion(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a,b,c){return",
    " G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c)||G(b,c)});",
    "function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression must ",
    "evaluate to nodeset if filter has predicate(s).\");C.call(this,a.f);thi",
    "s.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K,C);K.prototype.evaluate=func",
    "tion(a){a=this.$.evaluate(a);return Ca(this.b,a)};K.prototype.toString=",
    "function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)};function L(",
    "a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expects at least",
    "\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&b.length>a.",
    "P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\" arguments,",
    " \"+b.length+\" given\");a.ha&&m(b,function(b,d){if(4!=b.f)throw Error(",
    "\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b);",
    "});C.call(this,a.f);this.H=a;this.M=b;xa(this,a.o||p(b,function(a){retu",
    "rn a.c()}));ya(this,a.fa&&!b.length||a.ea&&!!b.length||p(b,function(a){",
    "return a.h}))}\nk(L,C);L.prototype.evaluate=function(a){return this.H.v",
    ".apply(null,ia(a,this.M))};L.prototype.toString=function(){var a=\"Func",
    "tion: \"+this.H;if(this.M.length){var b=n(this.M,function(a,b){return a",
    "+D(b)},\"Arguments:\");a+=D(b)}return a};function Da(a,b,c,d,e,f,g,l){t",
    "his.i=a;this.f=b;this.o=c;this.fa=d;this.ea=!1;this.v=e;this.Y=f;this.P",
    "=void 0!==g?g:f;this.ha=!!l}Da.prototype.toString=function(){return thi",
    "s.i};var Ea={};\nfunction M(a,b,c,d,e,f,g,l){if(Ea.hasOwnProperty(a))th",
    "row Error(\"Function already created: \"+a+\".\");Ea[a]=new Da(a,b,c,d,",
    "e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},1);M(\"ceil",
    "ing\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(\"concat\",3",
    ",!1,!1,function(a,b){return n(ja(arguments,1),function(b,d){return b+F(",
    "d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b=F(b,a);a=",
    "F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,function(a,b){ret",
    "urn b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,function(){return!",
    "1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E(b,a))},1);M",
    "(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDocume",
    "nt;a=F(b,a).split(/\\s+/);var e=[];m(a,function(a){a=d.getElementById(a",
    ");var b;if(!(b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1;els",
    "e{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.p",
    "ush(a)});e.sort(la);var f=new x;m(e,function(a){f.add(a)});return f},1)",
    ";M(\"lang\",2,!1,!1,function(){return!1},1);\nM(\"last\",1,!0,!1,functi",
    "on(a){if(1!=arguments.length)throw Error(\"Function last expects ()\");",
    "return a.j},0);M(\"local-name\",3,!1,!0,function(a,b){return(a=b?A(b.ev",
    "aluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);M(",
    "\"name\",3,!1,!0,function(a,b){return(a=b?A(b.evaluate(a)):a.l)?a.nodeN",
    "ame.toLowerCase():\"\"},0,1,!0);M(\"namespace-uri\",3,!0,!1,function(){",
    "return\"\"},0,1,!0);\nM(\"normalize-space\",3,!1,!0,function(a,b){retur",
    "n(b?F(b,a):u(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g",
    ",\"\")},0,1);M(\"not\",2,!1,!1,function(a,b){return!G(b,a)},1);M(\"numb",
    "er\",1,!1,!0,function(a,b){return b?E(b,a):+u(a.l)},0,1);M(\"position\"",
    ",1,!0,!1,function(a){return a.ka},0);M(\"round\",1,!1,!1,function(a,b){",
    "return Math.round(E(b,a))},1);M(\"starts-with\",2,!1,!1,function(a,b,c)",
    "{b=F(b,a);a=F(c,a);return 0==b.lastIndexOf(a,0)},2);M(\"string\",3,!1,!",
    "0,function(a,b){return b?F(b,a):u(a.l)},0,1);\nM(\"string-length\",1,!1",
    ",!0,function(a,b){return(b?F(b,a):u(a.l)).length},0,1);M(\"substring\",",
    "3,!1,!1,function(a,b,c,d){c=E(c,a);if(isNaN(c)||Infinity==c||-Infinity=",
    "=c)return\"\";d=d?E(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\"",
    ";c=Math.round(c)-1;var e=Math.max(c,0);a=F(b,a);return Infinity==d?a.su",
    "bstring(e):a.substring(e,c+Math.round(d))},2,3);M(\"substring-after\",3",
    ",!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);c=b.indexOf(a);return-1==c?\"",
    "\":b.substring(c+a.length)},2);\nM(\"substring-before\",3,!1,!1,functio",
    "n(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(",
    "0,a)},2);M(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0",
    ";for(var c=a.next();c;c=a.next())b+=+u(c);return b},1,1,!0);M(\"transla",
    "te\",3,!1,!1,function(a,b,c,d){b=F(b,a);c=F(c,a);var e=F(d,a);a={};for(",
    "d=0;d<c.length;d++){var f=c.charAt(d);f in a||(a[f]=e.charAt(d))}c=\"\"",
    ";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f in a?a[f]:f;return c},3);M(",
    "\"true\",2,!1,!1,function(){return!0},0);function y(a,b){this.ca=a;this",
    ".X=void 0!==b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;br",
    "eak;case \"text\":this.B=3;break;case \"processing-instruction\":this.B",
    "=7;break;case \"node\":break;default:throw Error(\"Unexpected argument",
    "\");}}function Fa(a){return\"comment\"==a||\"text\"==a||\"processing-in",
    "struction\"==a||\"node\"==a}y.prototype.matches=function(a){return null",
    "===this.B||this.B==a.nodeType};y.prototype.getName=function(){return th",
    "is.ca};\ny.prototype.toString=function(){var a=\"Kind Test: \"+this.ca;",
    "null===this.X||(a+=D(this.X));return a};function N(a){C.call(this,3);th",
    "is.ba=a.substring(1,a.length-1)}k(N,C);N.prototype.evaluate=function(){",
    "return this.ba};N.prototype.toString=function(){return\"Literal: \"+thi",
    "s.ba};function O(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"ht",
    "tp://www.w3.org/1999/xhtml\";this.J=b?b.toLowerCase():a}O.prototype.mat",
    "ches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.l",
    "ocalName?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerC",
    "ase()?!1:\"*\"==this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowe",
    "rCase():\"http://www.w3.org/1999/xhtml\")};O.prototype.getName=function",
    "(){return this.i};\nO.prototype.toString=function(){return\"Name Test: ",
    "\"+(\"http://www.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i}",
    ";function P(a){C.call(this,1);this.da=a}k(P,C);P.prototype.evaluate=fun",
    "ction(){return this.da};P.prototype.toString=function(){return\"Number:",
    " \"+this.da};function Q(a,b){C.call(this,a.f);this.V=a;this.G=b;this.o=",
    "a.c();this.h=a.h;1==this.G.length&&(a=this.G[0],a.N||a.s!=Ga||(a=a.L,\"",
    "*\"!=a.getName()&&(this.F={name:a.getName(),C:null})))}k(Q,C);function ",
    "R(){C.call(this,4)}k(R,C);R.prototype.evaluate=function(a){var b=new x;",
    "a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument);return b};R.prototy",
    "pe.toString=function(){return\"Root Helper Expression\"};function S(){C",
    ".call(this,4)}k(S,C);S.prototype.evaluate=function(a){var b=new x;b.add",
    "(a.l);return b};\nS.prototype.toString=function(){return\"Context Helpe",
    "r Expression\"};function Ha(a){return\"/\"==a||\"//\"==a}\nQ.prototype.",
    "evaluate=function(a){var b=this.V.evaluate(a);if(!(b instanceof x))thro",
    "w Error(\"Filter expression must evaluate to nodeset.\");a=this.G;for(v",
    "ar c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c",
    "()||e.s!=Ia)if(e.c()||e.s!=Ja){var g=f.next();for(b=e.evaluate(new q(g)",
    ");null!=(g=f.next());)g=e.evaluate(new q(g)),b=va(b,g)}else g=f.next(),",
    "b=e.evaluate(new q(g));else{for(g=f.next();(b=f.next())&&(!g.contains||",
    "g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new q(",
    "g))}}return b};\nQ.prototype.toString=function(){var a=\"Path Expressio",
    "n:\"+D(this.V);if(this.G.length){var b=n(this.G,function(a,b){return a+",
    "D(b)},\"Steps:\");a+=D(b)}return a};function T(a,b){this.b=a;this.A=!!b",
    "}function Ca(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.it",
    "erator(),f=b.m(),g,l=0;g=e.next();l++){var z=a.A?f-l:l+1;g=d.evaluate(n",
    "ew q(g,z,f));if(\"number\"==typeof g)z=z==g;else if(\"string\"==typeof ",
    "g||\"boolean\"==typeof g)z=!!g;else if(g instanceof x)z=0<g.m();else th",
    "row Error(\"Predicate.evaluate returned an unexpected type.\");z||e.rem",
    "ove()}return b}T.prototype.u=function(){return 0<this.b.length?this.b[0",
    "].u():null};\nT.prototype.c=function(){for(var a=0;a<this.b.length;a++)",
    "{var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};T.prototyp",
    "e.m=function(){return this.b.length};T.prototype.toString=function(){re",
    "turn n(this.b,function(a,b){return a+D(b)},\"Predicates:\")};function U",
    "(a,b,c,d){C.call(this,4);this.s=a;this.L=b;this.b=c||new T([]);this.N=!",
    "!d;b=this.b.u();a.la&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()",
    "}k(U,C);\nU.prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,",
    "e=null,f=0;c&&(d=c.name,e=c.C?F(c.C,a):null,f=1);if(this.N)if(this.c()|",
    "|this.s!=Ka)if(b=(new U(La,new y(\"node\"))).evaluate(a).iterator(),c=b",
    ".next())for(a=this.v(c,d,e,f);null!=(c=b.next());)a=va(a,this.v(c,d,e,f",
    "));else a=new x;else a=w(this.L,b,d,e),a=Ca(this.b,a,f);else a=this.v(a",
    ".l,d,e,f);return a};U.prototype.v=function(a,b,c,d){a=this.s.H(this.L,a",
    ",b,c);return a=Ca(this.b,a,d)};\nU.prototype.toString=function(){var a=",
    "\"Step:\"+D(\"Operator: \"+(this.N?\"//\":\"/\"));this.s.i&&(a+=D(\"Axi",
    "s: \"+this.s));a+=D(this.L);if(this.b.m()){var b=n(this.b.b,function(a,",
    "b){return a+D(b)},\"Predicates:\");a+=D(b)}return a};function Ma(a,b,c,",
    "d){this.i=a;this.H=b;this.A=c;this.la=d}Ma.prototype.toString=function(",
    "){return this.i};var Na={};function V(a,b,c,d){if(Na.hasOwnProperty(a))",
    "throw Error(\"Axis already created: \"+a);b=new Ma(a,b,c,!!d);return Na",
    "[a]=b}\nV(\"ancestor\",function(a,b){for(var c=new x;b=b.parentNode;)a.",
    "matches(b)&&c.unshift(b);return c},!0);V(\"ancestor-or-self\",function(",
    "a,b){var c=new x;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);re",
    "turn c},!0);\nvar Ga=V(\"attribute\",function(a,b){var c=new x,d=a.getN",
    "ame();if(b=b.attributes)if(a instanceof y&&null===a.B||\"*\"==d)for(a=0",
    ";d=b[a];a++)c.add(d);else(d=b.getNamedItem(d))&&c.add(d);return c},!1),",
    "Ka=V(\"child\",function(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new",
    " x;for(b=b.firstChild;b;b=b.nextSibling)v(b,c,d)&&a.matches(b)&&e.add(b",
    ");return e},!1,!0);V(\"descendant\",w,!1,!0);\nvar La=V(\"descendant-or",
    "-self\",function(a,b,c,d){var e=new x;v(b,c,d)&&a.matches(b)&&e.add(b);",
    "return w(a,b,c,d,e)},!1,!0),Ia=V(\"following\",function(a,b,c,d){var e=",
    "new x;do for(var f=b;f=f.nextSibling;)v(f,c,d)&&a.matches(f)&&e.add(f),",
    "e=w(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);V(\"following-sib",
    "ling\",function(a,b){for(var c=new x;b=b.nextSibling;)a.matches(b)&&c.a",
    "dd(b);return c},!1);V(\"namespace\",function(){return new x},!1);\nvar ",
    "Oa=V(\"parent\",function(a,b){var c=new x;if(9==b.nodeType)return c;if(",
    "2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b",
    ")&&c.add(b);return c},!1),Ja=V(\"preceding\",function(a,b,c,d){var e=ne",
    "w x,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g",
    "<l;g++){var z=[];for(b=f[g];b=b.previousSibling;)z.unshift(b);for(var m",
    "a=0,ab=z.length;ma<ab;ma++)b=z[ma],v(b,c,d)&&a.matches(b)&&e.add(b),e=w",
    "(a,b,c,d,e)}return e},!0,!0);\nV(\"preceding-sibling\",function(a,b){fo",
    "r(var c=new x;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c}",
    ",!0);var Pa=V(\"self\",function(a,b){var c=new x;a.matches(b)&&c.add(b)",
    ";return c},!1);function W(a){C.call(this,1);this.U=a;this.o=a.c();this.",
    "h=a.h}k(W,C);W.prototype.evaluate=function(a){return-E(this.U,a)};W.pro",
    "totype.toString=function(){return\"Unary Expression: -\"+D(this.U)};fun",
    "ction X(a){C.call(this,4);this.K=a;xa(this,p(this.K,function(a){return ",
    "a.c()}));ya(this,p(this.K,function(a){return a.h}))}k(X,C);X.prototype.",
    "evaluate=function(a){var b=new x;m(this.K,function(c){c=c.evaluate(a);i",
    "f(!(c instanceof x))throw Error(\"Path expression must evaluate to Node",
    "Set.\");b=va(b,c)});return b};X.prototype.toString=function(){return n(",
    "this.K,function(a,b){return a+D(b)},\"Union Expression:\")};function Qa",
    "(a,b){this.a=a;this.ia=b}function Ra(a){for(var b,c=[];;){Y(a,\"Missing",
    " right hand side of binary expression.\");b=Sa(a);var d=a.a.next();if(!",
    "d)break;var e=(d=Ba[d]||null)&&d.Z;if(!e){a.a.back();break}for(;c.lengt",
    "h&&e<=c[c.length-1].Z;)b=new H(c.pop(),c.pop(),b);c.push(b,d)}for(;c.le",
    "ngth;)b=new H(c.pop(),c.pop(),b);return b}function Y(a,b){if(a.a.empty(",
    "))throw Error(b);}function Ta(a,b){a=a.a.next();if(a!=b)throw Error(\"B",
    "ad token, expected: \"+b+\" got: \"+a);}\nfunction Ua(a){a=a.a.next();i",
    "f(\")\"!=a)throw Error(\"Bad token: \"+a);}function Va(a){a=a.a.next();",
    "if(2>a.length)throw Error(\"Unclosed literal string\");return new N(a)}",
    "\nfunction Wa(a){var b=[];if(Ha(t(a.a))){var c=a.a.next();var d=t(a.a);",
    "if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(",
    "?![0-9])[\\w]/.test(d)))return new R;d=new R;Y(a,\"Missing next locatio",
    "n step.\");c=Xa(a,c);b.push(c)}else{a:{c=t(a.a);d=c.charAt(0);switch(d)",
    "{case \"$\":throw Error(\"Variable reference not allowed in HTML XPath",
    "\");case \"(\":a.a.next();c=Ra(a);Y(a,'unclosed \"(\"');Ta(a,\")\");bre",
    "ak;case '\"':case \"'\":c=Va(a);break;default:if(isNaN(+c))if(!Fa(c)&&/",
    "(?![0-9])[\\w]/.test(d)&&\"(\"==t(a.a,\n1)){c=a.a.next();c=Ea[c]||null;",
    "a.a.next();for(d=[];\")\"!=t(a.a);){Y(a,\"Missing function argument lis",
    "t.\");d.push(Ra(a));if(\",\"!=t(a.a))break;a.a.next()}Y(a,\"Unclosed fu",
    "nction argument list.\");Ua(a);c=new L(c,d)}else{c=null;break a}else c=",
    "new P(+a.a.next())}\"[\"==t(a.a)&&(d=new T(Ya(a)),c=new K(c,d))}if(c)if",
    "(Ha(t(a.a)))d=c;else return c;else c=Xa(a,\"/\"),d=new S,b.push(c)}for(",
    ";Ha(t(a.a));)c=a.a.next(),Y(a,\"Missing next location step.\"),c=Xa(a,c",
    "),b.push(c);return new Q(d,b)}\nfunction Xa(a,b){if(\"/\"!=b&&\"//\"!=b",
    ")throw Error('Step op should be \"/\" or \"//\"');if(\".\"==t(a.a)){var",
    " c=new U(Pa,new y(\"node\"));a.a.next();return c}if(\"..\"==t(a.a))retu",
    "rn c=new U(Oa,new y(\"node\")),a.a.next(),c;if(\"@\"==t(a.a)){var d=Ga;",
    "a.a.next();Y(a,\"Missing attribute name\")}else if(\"::\"==t(a.a,1)){if",
    "(!/(?![0-9])[\\w]/.test(t(a.a).charAt(0)))throw Error(\"Bad token: \"+a",
    ".a.next());var e=a.a.next();d=Na[e]||null;if(!d)throw Error(\"No axis w",
    "ith name: \"+e);a.a.next();Y(a,\"Missing node name\")}else d=Ka;e=\nt(a",
    ".a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==t(a.a,1)){if(!Fa",
    "(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!Fa(e))throw",
    " Error(\"Invalid type name: \"+e);Ta(a,\"(\");Y(a,\"Bad nodetype\");var",
    " f=t(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=Va(a);Y(a,\"Bad nodet",
    "ype\");Ua(a);e=new y(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f",
    ")e=new O(e);else{g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a",
    ".ia(g),!l)throw Error(\"Namespace prefix not declared: \"+g);e=e.substr",
    "(f+1);e=new O(e,l)}else throw Error(\"Bad token: \"+\na.a.next());a=new",
    " T(Ya(a),d.A);return c||new U(d,e,a,\"//\"==b)}function Ya(a){for(var b",
    "=[];\"[\"==t(a.a);){a.a.next();Y(a,\"Missing predicate expression.\");v",
    "ar c=Ra(a);b.push(c);Y(a,\"Unclosed predicate expression.\");Ta(a,\"]\"",
    ")}return b}function Sa(a){if(\"-\"==t(a.a))return a.a.next(),new W(Sa(a",
    "));var b=Wa(a);if(\"|\"!=t(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y",
    "(a,\"Missing next union location path.\"),b.push(Wa(a));a.a.back();a=ne",
    "w X(b)}return a};function Za(a){switch(a.nodeType){case 1:return ha($a,",
    "a);case 9:return Za(a.documentElement);case 11:case 10:case 6:case 12:r",
    "eturn bb;default:return a.parentNode?Za(a.parentNode):bb}}function bb()",
    "{return null}function $a(a,b){if(a.prefix==b)return a.namespaceURI||\"h",
    "ttp://www.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);re",
    "turn c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNode.nodeTyp",
    "e?$a(a.parentNode,b):null};function cb(a,b){if(!a.length)throw Error(\"",
    "Empty XPath expression.\");a=pa(a);if(a.empty())throw Error(\"Invalid X",
    "Path expression.\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b",
    ")):b=function(){return null};var c=Ra(new Qa(a,b));if(!a.empty())throw ",
    "Error(\"Bad token: \"+a.next());this.evaluate=function(a,b){a=c.evaluat",
    "e(new q(a));return new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceo",
    "f x)b=4;else if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b",
    "=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected eval",
    "uation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof x))throw Error(\"",
    "value could not be converted to the specified type\");this.resultType=b",
    ";switch(b){case 2:this.stringValue=a instanceof x?B(a):\"\"+a;break;cas",
    "e 1:this.numberValue=a instanceof x?+B(a):+a;break;case 3:this.booleanV",
    "alue=a instanceof x?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c",
    "=\na.iterator();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this",
    ".snapshotLength=a.m();this.invalidIteratorState=!1;break;case 8:case 9:",
    "this.singleNodeValue=A(a);break;default:throw Error(\"Unknown XPathResu",
    "lt type.\");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Er",
    "ror(\"iterateNext called with wrong result type\");return f>=d.length?n",
    "ull:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"s",
    "napshotItem called with wrong result type\");return a>=d.length||0>a?nu",
    "ll:d[a]}}\nZ.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=",
    "3;Z.UNORDERED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNO",
    "RDERED_NODE_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDE",
    "RED_NODE_TYPE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function db(a){this.lookupN",
    "amespaceURI=Za(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=",
    "a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathR",
    "esult=Z,c.evaluate=function(a,b,c,g){return(new cb(a,c)).evaluate(b,g)}",
    ",c.createExpression=function(a,b){return new cb(a,b)},c.createNSResolve",
    "r=function(a){return new db(a)}});ba(\"_\",function(a,b){function c(a,b",
    "){a={clickable:a};b&&(a.message=b);return a}for(var d=a;d.parentNode;)d",
    "=d.parentNode;var e=d.elementFromPoint(b.x,b.y);if(e==a)return c(!0);b=",
    "\"(\"+b.x+\", \"+b.y+\")\";if(null==e)return c(!1,\"Element is not clic",
    "kable at point \"+b);d=e.outerHTML.replace(e.innerHTML,e.hasChildNodes(",
    ")?\"...\":\"\");for(e=e.parentNode;e;){if(e==a)return c(!0,\"Element's ",
    "descendant would receive the click. Consider clicking the descendant in",
    "stead. Descendant: \"+d);e=e.parentNode}a=a.outerHTML.replace(a.innerHT",
    "ML,\na.hasChildNodes()?\"...\":\"\");return c(!1,\"Element \"+a+\" is n",
    "ot clickable at point \"+b+\". Other element would receive the click: ",
    "\"+d)});; return this._.apply(null,arguments);}.apply({navigator:typeof",
    " window!='undefined'?window.navigator:null,document:typeof window!='und",
    "efined'?window.document:null}, arguments);}",
    NULL
};

const char* const IS_ELEMENT_DISPLAYED[] = {
    "function(){return function(){var h,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ha(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ia(a,b,c){ia=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ha;return",
    " ia.apply(null,arguments)}\nfunction ja(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.ta=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.ra=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ka(a){return String(a).replace(/\\-([a-z])/g,function(a,c){",
    "return c.toUpperCase()})};function la(a,b){if(m(a))return m(b)&&1==b.le",
    "ngth?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)r",
    "eturn c;return-1}function r(a,b){for(var c=a.length,d=m(a)?a.split(\"\"",
    "):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function t(a,b,c){var d",
    "=c;r(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function ma(a,",
    "b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.c",
    "all(void 0,d[e],e,a))return!0;return!1}\nfunction na(a,b){for(var c=a.l",
    "ength,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e]",
    ",e,a))return!1;return!0}function oa(a){return Array.prototype.concat.ap",
    "ply([],arguments)}function pa(a){var b=a.length;if(0<b){for(var c=Array",
    "(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function qa(a,b,c){return 2",
    ">=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slic",
    "e.call(a,b,c)};var ra={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",a",
    "qua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5d",
    "c\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blu",
    "e:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb",
    "887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e",
    "\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",cr",
    "imson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008",
    "b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#00640",
    "0\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b",
    "\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932",
    "cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f",
    "\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"",
    "#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#",
    "ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969",
    "\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\"",
    ",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\ngh",
    "ostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808",
    "080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeyd",
    "ew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b00",
    "82\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderb",
    "lush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightbl",
    "ue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgolden",
    "rodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",ligh",
    "tgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlight",
    "seagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899",
    "\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"",
    "#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",mage",
    "nta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumb",
    "lue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediu",
    "mseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#",
    "00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnig",
    "htblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccas",
    "in:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5",
    "e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",oranger",
    "ed:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:",
    "\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayaw",
    "hip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\"",
    ",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff00",
    "00\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513",
    "\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nsea",
    "shell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ce",
    "eb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",",
    "snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d",
    "2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoi",
    "se:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",w",
    "hitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var s",
    "a=\"backgroundColor borderTopColor borderRightColor borderBottomColor b",
    "orderLeftColor color outlineColor\".split(\" \"),ta=/#([0-9a-fA-F])([0-",
    "9a-fA-F])([0-9a-fA-F])/,ua=/^#(?:[0-9a-f]{3}){1,2}$/i,va=/^(?:rgba)?\\(",
    "(\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,wa=/^",
    "(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}",
    ")\\)$/i;function ya(a,b){this.code=a;this.state=u[a]||za;this.message=b",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.ind",
    "exOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}p(ya,Error);var za=\"unknown err",
    "or\",u={15:\"element not selectable\",11:\"element not visible\"};u[31]",
    "=za;u[30]=za;u[24]=\"invalid cookie domain\";u[29]=\"invalid element co",
    "ordinates\";u[12]=\"invalid element state\";\nu[32]=\"invalid selector",
    "\";u[51]=\"invalid selector\";u[52]=\"invalid selector\";u[17]=\"javasc",
    "ript error\";u[405]=\"unsupported operation\";u[34]=\"move target out o",
    "f bounds\";u[27]=\"no such alert\";u[7]=\"no such element\";u[8]=\"no s",
    "uch frame\";u[23]=\"no such window\";u[28]=\"script timeout\";u[33]=\"s",
    "ession not created\";u[10]=\"stale element reference\";u[21]=\"timeout",
    "\";u[25]=\"unable to set cookie\";u[26]=\"unexpected alert open\";u[13]",
    "=za;u[9]=\"unknown command\";ya.prototype.toString=function(){return th",
    "is.name+\": \"+this.message};function v(a,b){this.x=k(a)?a:0;this.y=k(b",
    ")?b:0}h=v.prototype;h.clone=function(){return new v(this.x,this.y)};h.t",
    "oString=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=funct",
    "ion(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.",
    "floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);re",
    "turn this};h.round=function(){this.x=Math.round(this.x);this.y=Math.rou",
    "nd(this.y);return this};\nh.translate=function(a,b){a instanceof v?(thi",
    "s.x+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this",
    "};h.scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};fun",
    "ction Aa(a,b){this.width=a;this.height=b}h=Aa.prototype;h.clone=functio",
    "n(){return new Aa(this.width,this.height)};h.toString=function(){return",
    "\"(\"+this.width+\" x \"+this.height+\")\"};h.aspectRatio=function(){re",
    "turn this.width/this.height};h.ceil=function(){this.width=Math.ceil(thi",
    "s.width);this.height=Math.ceil(this.height);return this};h.floor=functi",
    "on(){this.width=Math.floor(this.width);this.height=Math.floor(this.heig",
    "ht);return this};\nh.round=function(){this.width=Math.round(this.width)",
    ";this.height=Math.round(this.height);return this};h.scale=function(a,b)",
    "{b=n(b)?b:a;this.width*=a;this.height*=b;return this};function Ba(a,b,c",
    "){function d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=",
    "1;e<c.length;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):r(Ca(f)?p",
    "a(f):f,d)}}function Da(a,b){if(!a||!b)return!1;if(a.contains&&1==b.node",
    "Type)return a==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocum",
    "entPosition)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!",
    "=b;)b=b.parentNode;return b==a}\nfunction Ea(a,b){if(a==b)return 0;if(a",
    ".compareDocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if(",
    "\"sourceIndex\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var ",
    "c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIn",
    "dex;var e=a.parentNode,f=b.parentNode;return e==f?Fa(a,b):!c&&Da(e,b)?-",
    "1*Ga(a,b):!d&&Da(f,a)?Ga(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sour",
    "ceIndex:f.sourceIndex)}d=w(a);c=d.createRange();c.selectNode(a);c.colla",
    "pse(!0);a=d.createRange();a.selectNode(b);\na.collapse(!0);return c.com",
    "pareBoundaryPoints(aa.Range.START_TO_END,a)}function Ga(a,b){var c=a.pa",
    "rentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return F",
    "a(b,a)}function Fa(a,b){for(;b=b.previousSibling;)if(b==a)return-1;retu",
    "rn 1}function w(a){return 9==a.nodeType?a:a.ownerDocument||a.document}f",
    "unction Ca(a){if(a&&\"number\"==typeof a.length){if(ea(a))return\"funct",
    "ion\"==typeof a.item||\"string\"==typeof a.item;if(\"function\"==ca(a))",
    "return\"function\"==typeof a.item}return!1}\nfunction Ha(a,b){a&&(a=a.p",
    "arentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}return n",
    "ull}function Ia(a){this.H=a||aa.document||document}h=Ia.prototype;h.get",
    "ElementsByTagName=function(a,b){return(b||this.H).getElementsByTagName(",
    "String(a))};h.createElement=function(a){return this.H.createElement(Str",
    "ing(a))};h.createTextNode=function(a){return this.H.createTextNode(Stri",
    "ng(a))};h.appendChild=function(a,b){a.appendChild(b)};h.append=function",
    "(a,b){Ba(w(a),a,arguments)};\nh.canHaveChildren=function(a){if(1!=a.nod",
    "eType)return!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"B",
    "ASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"F",
    "RAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"I",
    "SINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIP",
    "T\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case ",
    "\"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0",
    "};h.removeNode=function(a){return a&&a.parentNode?a.parentNode.removeCh",
    "ild(a):null};\nh.contains=Da;function z(a,b){b&&\"string\"!==typeof b&&",
    "(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()",
    "==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n",
    " Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, free ",
    "of charge, to any person obtaining a copy\n of this software and associ",
    "ated documentation files (the \"Software\"), to\n deal in the Software ",
    "without restriction, including without limitation the\n rights to use, ",
    "copy, modify, merge, publish, distribute, sublicense, and/or\n sell cop",
    "ies of the Software, and to permit persons to whom the Software is\n fu",
    "rnished to do so, subject to the following conditions:\n\n The above co",
    "pyright notice and this permission notice shall be included in\n all co",
    "pies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVI",
    "DED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCL",
    "UDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS F",
    "OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AU",
    "THORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n ",
    "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING",
    "\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ",
    "DEALINGS\n IN THE SOFTWARE.\n*/\nfunction A(a,b,c){this.l=a;this.oa=b||",
    "1;this.j=c||1};function Ja(a){this.T=a;this.J=0}function Ka(a){a=a.matc",
    "h(La);for(var b=0;b<a.length;b++)Ma.test(a[b])&&a.splice(b,1);return ne",
    "w Ja(a)}var La=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(",
    "?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|",
    "'[^']*'|[!<>]=|\\s+|./g,Ma=/^\\s/;function B(a,b){return a.T[a.J+(b||0)",
    "]}Ja.prototype.next=function(){return this.T[this.J++]};Ja.prototype.ba",
    "ck=function(){this.J--};Ja.prototype.empty=function(){return this.T.len",
    "gth<=this.J};function C(a){var b=null,c=a.nodeType;1==c&&(b=a.textConte",
    "nt,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(",
    "\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChi",
    "ld;c=0;var d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++",
    "]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.",
    "nodeValue;return\"\"+b}\nfunction E(a,b,c){if(null===b)return!0;try{if(",
    "!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttrib",
    "ute(b):a.getAttribute(b,2)==c}function Na(a,b,c,d,e){return Oa.call(nul",
    "l,a,b,m(c)?c:null,m(d)?d:null,e||new F)}\nfunction Oa(a,b,c,d,e){b.getE",
    "lementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),r(b,function(b)",
    "{a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b",
    "=b.getElementsByClassName(d),r(b,function(b){b.className==d&&a.matches(",
    "b)&&e.add(b)})):a instanceof G?Pa(a,b,c,d,e):b.getElementsByTagName&&(b",
    "=b.getElementsByTagName(a.getName()),r(b,function(a){E(a,c,d)&&e.add(a)",
    "}));return e}function Pa(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSiblin",
    "g)E(b,c,d)&&a.matches(b)&&e.add(b),Pa(a,b,c,d,e)};function F(){this.j=t",
    "his.g=null;this.D=0}function Qa(a){this.node=a;this.next=this.w=null}fu",
    "nction Ra(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(va",
    "r d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<Ea(c.node",
    ",b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;f",
    "or(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}F.proto",
    "type.unshift=function(a){a=new Qa(a);a.next=this.g;this.j?this.g.w=a:th",
    "is.g=this.j=a;this.g=a;this.D++};\nF.prototype.add=function(a){a=new Qa",
    "(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};",
    "function Sa(a){return(a=a.g)?a.node:null}F.prototype.o=function(){retur",
    "n this.D};function Ta(a){return(a=Sa(a))?C(a):\"\"}F.prototype.iterator",
    "=function(a){return new Ua(this,!!a)};function Ua(a,b){this.ka=a;this.W",
    "=(this.A=b)?a.j:a.g;this.P=null}Ua.prototype.next=function(){var a=this",
    ".W;if(null==a)return null;var b=this.P=a;this.W=this.A?a.w:a.next;retur",
    "n b.node};\nUa.prototype.remove=function(){var a=this.ka,b=this.P;if(!b",
    ")throw Error(\"Next must be called at least once before remove.\");var ",
    "c=b.w;b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.P=null};functi",
    "on I(a){this.f=a;this.h=this.s=!1;this.F=null}function J(a){return\"\\n",
    "  \"+a.toString().split(\"\\n\").join(\"\\n  \")}I.prototype.c=function",
    "(){return this.s};function Va(a,b){a.s=b}function Wa(a,b){a.h=b}I.proto",
    "type.v=function(){return this.F};function K(a,b){a=a.evaluate(b);return",
    " a instanceof F?+Ta(a):+a}function L(a,b){a=a.evaluate(b);return a inst",
    "anceof F?Ta(a):\"\"+a}function M(a,b){a=a.evaluate(b);return a instance",
    "of F?!!a.o():!!a};function Xa(a,b,c){I.call(this,a.f);this.S=a;this.$=b",
    ";this.ea=c;this.s=b.c()||c.c();this.h=b.h||c.h;this.S==Ya&&(c.h||c.c()|",
    "|4==c.f||0==c.f||!b.v()?b.h||b.c()||4==b.f||0==b.f||!c.v()||(this.F={na",
    "me:c.v().name,C:b}):this.F={name:b.v().name,C:c})}p(Xa,I);\nfunction N(",
    "a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof F&&c i",
    "nstanceof F){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterato",
    "r(),f=e.next();f;f=e.next())if(a(C(d),C(f)))return!0;return!1}if(b inst",
    "anceof F||c instanceof F){b instanceof F?(e=b,d=c):(e=c,d=b);f=e.iterat",
    "or();for(var g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"numbe",
    "r\":l=+C(l);break;case \"boolean\":l=!!C(l);break;case \"string\":l=C(l",
    ");break;default:throw Error(\"Illegal primitive type for comparison.\")",
    ";\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean",
    "\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"",
    "number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}Xa.prototype.evaluate=funct",
    "ion(a){return this.S.m(this.$,this.ea,a)};Xa.prototype.toString=functio",
    "n(){var a=\"Binary Expression: \"+this.S;a+=J(this.$);return a+=J(this.",
    "ea)};function Za(a,b,c,d){this.na=a;this.ca=b;this.f=c;this.m=d}Za.prot",
    "otype.toString=function(){return this.na};var $a={};\nfunction O(a,b,c,",
    "d){if($a.hasOwnProperty(a))throw Error(\"Binary operator already create",
    "d: \"+a);a=new Za(a,b,c,d);return $a[a.toString()]=a}O(\"div\",6,1,func",
    "tion(a,b,c){return K(a,c)/K(b,c)});O(\"mod\",6,1,function(a,b,c){return",
    " K(a,c)%K(b,c)});O(\"*\",6,1,function(a,b,c){return K(a,c)*K(b,c)});O(",
    "\"+\",5,1,function(a,b,c){return K(a,c)+K(b,c)});O(\"-\",5,1,function(a",
    ",b,c){return K(a,c)-K(b,c)});O(\"<\",4,2,function(a,b,c){return N(funct",
    "ion(a,b){return a<b},a,b,c)});\nO(\">\",4,2,function(a,b,c){return N(fu",
    "nction(a,b){return a>b},a,b,c)});O(\"<=\",4,2,function(a,b,c){return N(",
    "function(a,b){return a<=b},a,b,c)});O(\">=\",4,2,function(a,b,c){return",
    " N(function(a,b){return a>=b},a,b,c)});var Ya=O(\"=\",3,2,function(a,b,",
    "c){return N(function(a,b){return a==b},a,b,c,!0)});O(\"!=\",3,2,functio",
    "n(a,b,c){return N(function(a,b){return a!=b},a,b,c,!0)});O(\"and\",2,2,",
    "function(a,b,c){return M(a,c)&&M(b,c)});O(\"or\",1,2,function(a,b,c){re",
    "turn M(a,c)||M(b,c)});function ab(a,b){if(b.o()&&4!=a.f)throw Error(\"P",
    "rimary expression must evaluate to nodeset if filter has predicate(s).",
    "\");I.call(this,a.f);this.da=a;this.b=b;this.s=a.c();this.h=a.h}p(ab,I)",
    ";ab.prototype.evaluate=function(a){a=this.da.evaluate(a);return bb(this",
    ".b,a)};ab.prototype.toString=function(){var a=\"Filter:\"+J(this.da);re",
    "turn a+=J(this.b)};function cb(a,b){if(b.length<a.ba)throw Error(\"Func",
    "tion \"+a.i+\" expects at least\"+a.ba+\" arguments, \"+b.length+\" giv",
    "en\");if(null!==a.R&&b.length>a.R)throw Error(\"Function \"+a.i+\" expe",
    "cts at most \"+a.R+\" arguments, \"+b.length+\" given\");a.la&&r(b,func",
    "tion(b,d){if(4!=b.f)throw Error(\"Argument \"+d+\" to function \"+a.i+",
    "\" is not of type Nodeset: \"+b);});I.call(this,a.f);this.I=a;this.N=b;",
    "Va(this,a.s||ma(b,function(a){return a.c()}));Wa(this,a.ja&&!b.length||",
    "a.ia&&!!b.length||ma(b,function(a){return a.h}))}\np(cb,I);cb.prototype",
    ".evaluate=function(a){return this.I.m.apply(null,oa(a,this.N))};cb.prot",
    "otype.toString=function(){var a=\"Function: \"+this.I;if(this.N.length)",
    "{var b=t(this.N,function(a,b){return a+J(b)},\"Arguments:\");a+=J(b)}re",
    "turn a};function db(a,b,c,d,e,f,g,l){this.i=a;this.f=b;this.s=c;this.ja",
    "=d;this.ia=!1;this.m=e;this.ba=f;this.R=k(g)?g:f;this.la=!!l}db.prototy",
    "pe.toString=function(){return this.i};var eb={};\nfunction P(a,b,c,d,e,",
    "f,g,l){if(eb.hasOwnProperty(a))throw Error(\"Function already created: ",
    "\"+a+\".\");eb[a]=new db(a,b,c,d,e,f,g,l)}P(\"boolean\",2,!1,!1,functio",
    "n(a,b){return M(b,a)},1);P(\"ceiling\",1,!1,!1,function(a,b){return Mat",
    "h.ceil(K(b,a))},1);P(\"concat\",3,!1,!1,function(a,b){return t(qa(argum",
    "ents,1),function(b,d){return b+L(d,a)},\"\")},2,null);P(\"contains\",2,",
    "!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);return-1!=b.indexOf(a)},2);P(\"",
    "count\",1,!1,!1,function(a,b){return b.evaluate(a).o()},1,1,!0);\nP(\"f",
    "alse\",2,!1,!1,function(){return!1},0);P(\"floor\",1,!1,!1,function(a,b",
    "){return Math.floor(K(b,a))},1);P(\"id\",4,!1,!1,function(a,b){var c=a.",
    "l,d=9==c.nodeType?c:c.ownerDocument;a=L(b,a).split(/\\s+/);var e=[];r(a",
    ",function(a){a=d.getElementById(a);!a||0<=la(e,a)||e.push(a)});e.sort(E",
    "a);var f=new F;r(e,function(a){f.add(a)});return f},1);P(\"lang\",2,!1,",
    "!1,function(){return!1},1);P(\"last\",1,!0,!1,function(a){if(1!=argumen",
    "ts.length)throw Error(\"Function last expects ()\");return a.j},0);\nP(",
    "\"local-name\",3,!1,!0,function(a,b){return(a=b?Sa(b.evaluate(a)):a.l)?",
    "a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);P(\"name\",3,!1,!0,",
    "function(a,b){return(a=b?Sa(b.evaluate(a)):a.l)?a.nodeName.toLowerCase(",
    "):\"\"},0,1,!0);P(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,",
    "!0);P(\"normalize-space\",3,!1,!0,function(a,b){return(b?L(b,a):C(a.l))",
    ".replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);P(\"n",
    "ot\",2,!1,!1,function(a,b){return!M(b,a)},1);\nP(\"number\",1,!1,!0,fun",
    "ction(a,b){return b?K(b,a):+C(a.l)},0,1);P(\"position\",1,!0,!1,functio",
    "n(a){return a.oa},0);P(\"round\",1,!1,!1,function(a,b){return Math.roun",
    "d(K(b,a))},1);P(\"starts-with\",2,!1,!1,function(a,b,c){b=L(b,a);a=L(c,",
    "a);return 0==b.lastIndexOf(a,0)},2);P(\"string\",3,!1,!0,function(a,b){",
    "return b?L(b,a):C(a.l)},0,1);P(\"string-length\",1,!1,!0,function(a,b){",
    "return(b?L(b,a):C(a.l)).length},0,1);\nP(\"substring\",3,!1,!1,function",
    "(a,b,c,d){c=K(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=",
    "d?K(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)",
    "-1;var e=Math.max(c,0);a=L(b,a);return Infinity==d?a.substring(e):a.sub",
    "string(e,c+Math.round(d))},2,3);P(\"substring-after\",3,!1,!1,function(",
    "a,b,c){b=L(b,a);a=L(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+",
    "a.length)},2);\nP(\"substring-before\",3,!1,!1,function(a,b,c){b=L(b,a)",
    ";a=L(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);P(\"sum",
    "\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.nex",
    "t();c;c=a.next())b+=+C(c);return b},1,1,!0);P(\"translate\",3,!1,!1,fun",
    "ction(a,b,c,d){b=L(b,a);c=L(c,a);var e=L(d,a);a={};for(d=0;d<c.length;d",
    "++){var f=c.charAt(d);f in a||(a[f]=e.charAt(d))}c=\"\";for(d=0;d<b.len",
    "gth;d++)f=b.charAt(d),c+=f in a?a[f]:f;return c},3);P(\"true\",2,!1,!1,",
    "function(){return!0},0);function G(a,b){this.ga=a;this.aa=k(b)?b:null;t",
    "his.B=null;switch(a){case \"comment\":this.B=8;break;case \"text\":this",
    ".B=3;break;case \"processing-instruction\":this.B=7;break;case \"node\"",
    ":break;default:throw Error(\"Unexpected argument\");}}function fb(a){re",
    "turn\"comment\"==a||\"text\"==a||\"processing-instruction\"==a||\"node",
    "\"==a}G.prototype.matches=function(a){return null===this.B||this.B==a.n",
    "odeType};G.prototype.getName=function(){return this.ga};\nG.prototype.t",
    "oString=function(){var a=\"Kind Test: \"+this.ga;null===this.aa||(a+=J(",
    "this.aa));return a};function gb(a){I.call(this,3);this.fa=a.substring(1",
    ",a.length-1)}p(gb,I);gb.prototype.evaluate=function(){return this.fa};g",
    "b.prototype.toString=function(){return\"Literal: \"+this.fa};function h",
    "b(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.org",
    "/1999/xhtml\";this.K=b?b.toLowerCase():a}hb.prototype.matches=function(",
    "a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.localName)?a.localName",
    ":a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this",
    ".K?!0:this.K==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://www",
    ".w3.org/1999/xhtml\")};hb.prototype.getName=function(){return this.i};",
    "\nhb.prototype.toString=function(){return\"Name Test: \"+(\"http://www.",
    "w3.org/1999/xhtml\"==this.K?\"\":this.K+\":\")+this.i};function ib(a){I",
    ".call(this,1);this.ha=a}p(ib,I);ib.prototype.evaluate=function(){return",
    " this.ha};ib.prototype.toString=function(){return\"Number: \"+this.ha};",
    "function jb(a,b){I.call(this,a.f);this.Y=a;this.G=b;this.s=a.c();this.h",
    "=a.h;1==this.G.length&&(a=this.G[0],a.O||a.u!=kb||(a=a.M,\"*\"!=a.getNa",
    "me()&&(this.F={name:a.getName(),C:null})))}p(jb,I);function lb(){I.call",
    "(this,4)}p(lb,I);lb.prototype.evaluate=function(a){var b=new F;a=a.l;9=",
    "=a.nodeType?b.add(a):b.add(a.ownerDocument);return b};lb.prototype.toSt",
    "ring=function(){return\"Root Helper Expression\"};function mb(){I.call(",
    "this,4)}p(mb,I);mb.prototype.evaluate=function(a){var b=new F;b.add(a.l",
    ");return b};\nmb.prototype.toString=function(){return\"Context Helper E",
    "xpression\"};function nb(a){return\"/\"==a||\"//\"==a}\njb.prototype.ev",
    "aluate=function(a){var b=this.Y.evaluate(a);if(!(b instanceof F))throw ",
    "Error(\"Filter expression must evaluate to nodeset.\");a=this.G;for(var",
    " c=0,d=a.length;c<d&&b.o();c++){var e=a[c],f=b.iterator(e.u.A);if(e.c()",
    "||e.u!=ob)if(e.c()||e.u!=pb){var g=f.next();for(b=e.evaluate(new A(g));",
    "null!=(g=f.next());)g=e.evaluate(new A(g)),b=Ra(b,g)}else g=f.next(),b=",
    "e.evaluate(new A(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.",
    "contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new A(g)",
    ")}}return b};\njb.prototype.toString=function(){var a=\"Path Expression",
    ":\"+J(this.Y);if(this.G.length){var b=t(this.G,function(a,b){return a+J",
    "(b)},\"Steps:\");a+=J(b)}return a};function Q(a,b){this.b=a;this.A=!!b}",
    "function bb(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.ite",
    "rator(),f=b.o(),g,l=0;g=e.next();l++){var y=a.A?f-l:l+1;g=d.evaluate(ne",
    "w A(g,y,f));if(\"number\"==typeof g)y=y==g;else if(\"string\"==typeof g",
    "||\"boolean\"==typeof g)y=!!g;else if(g instanceof F)y=0<g.o();else thr",
    "ow Error(\"Predicate.evaluate returned an unexpected type.\");y||e.remo",
    "ve()}return b}Q.prototype.v=function(){return 0<this.b.length?this.b[0]",
    ".v():null};\nQ.prototype.c=function(){for(var a=0;a<this.b.length;a++){",
    "var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};Q.prototype",
    ".o=function(){return this.b.length};Q.prototype.toString=function(){ret",
    "urn t(this.b,function(a,b){return a+J(b)},\"Predicates:\")};function R(",
    "a,b,c,d){I.call(this,4);this.u=a;this.M=b;this.b=c||new Q([]);this.O=!!",
    "d;b=this.b.v();a.qa&&b&&(this.F={name:b.name,C:b.C});this.s=this.b.c()}",
    "p(R,I);\nR.prototype.evaluate=function(a){var b=a.l,c=this.v(),d=null,e",
    "=null,f=0;c&&(d=c.name,e=c.C?L(c.C,a):null,f=1);if(this.O)if(this.c()||",
    "this.u!=qb)if(b=(new R(rb,new G(\"node\"))).evaluate(a).iterator(),c=b.",
    "next())for(a=this.m(c,d,e,f);null!=(c=b.next());)a=Ra(a,this.m(c,d,e,f)",
    ");else a=new F;else a=Na(this.M,b,d,e),a=bb(this.b,a,f);else a=this.m(a",
    ".l,d,e,f);return a};R.prototype.m=function(a,b,c,d){a=this.u.I(this.M,a",
    ",b,c);return a=bb(this.b,a,d)};\nR.prototype.toString=function(){var a=",
    "\"Step:\"+J(\"Operator: \"+(this.O?\"//\":\"/\"));this.u.i&&(a+=J(\"Axi",
    "s: \"+this.u));a+=J(this.M);if(this.b.o()){var b=t(this.b.b,function(a,",
    "b){return a+J(b)},\"Predicates:\");a+=J(b)}return a};function sb(a,b,c,",
    "d){this.i=a;this.I=b;this.A=c;this.qa=d}sb.prototype.toString=function(",
    "){return this.i};var tb={};function T(a,b,c,d){if(tb.hasOwnProperty(a))",
    "throw Error(\"Axis already created: \"+a);b=new sb(a,b,c,!!d);return tb",
    "[a]=b}\nT(\"ancestor\",function(a,b){for(var c=new F;b=b.parentNode;)a.",
    "matches(b)&&c.unshift(b);return c},!0);T(\"ancestor-or-self\",function(",
    "a,b){var c=new F;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);re",
    "turn c},!0);\nvar kb=T(\"attribute\",function(a,b){var c=new F,d=a.getN",
    "ame();if(b=b.attributes)if(a instanceof G&&null===a.B||\"*\"==d)for(a=0",
    ";d=b[a];a++)c.add(d);else(d=b.getNamedItem(d))&&c.add(d);return c},!1),",
    "qb=T(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||new",
    " F;for(b=b.firstChild;b;b=b.nextSibling)E(b,c,d)&&a.matches(b)&&e.add(b",
    ");return e},!1,!0);T(\"descendant\",Na,!1,!0);\nvar rb=T(\"descendant-o",
    "r-self\",function(a,b,c,d){var e=new F;E(b,c,d)&&a.matches(b)&&e.add(b)",
    ";return Na(a,b,c,d,e)},!1,!0),ob=T(\"following\",function(a,b,c,d){var ",
    "e=new F;do for(var f=b;f=f.nextSibling;)E(f,c,d)&&a.matches(f)&&e.add(f",
    "),e=Na(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);T(\"following-",
    "sibling\",function(a,b){for(var c=new F;b=b.nextSibling;)a.matches(b)&&",
    "c.add(b);return c},!1);T(\"namespace\",function(){return new F},!1);\nv",
    "ar ub=T(\"parent\",function(a,b){var c=new F;if(9==b.nodeType)return c;",
    "if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matche",
    "s(b)&&c.add(b);return c},!1),pb=T(\"preceding\",function(a,b,c,d){var e",
    "=new F,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.lengt",
    "h;g<l;g++){var y=[];for(b=f[g];b=b.previousSibling;)y.unshift(b);for(va",
    "r D=0,q=y.length;D<q;D++)b=y[D],E(b,c,d)&&a.matches(b)&&e.add(b),e=Na(a",
    ",b,c,d,e)}return e},!0,!0);\nT(\"preceding-sibling\",function(a,b){for(",
    "var c=new F;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!",
    "0);var vb=T(\"self\",function(a,b){var c=new F;a.matches(b)&&c.add(b);r",
    "eturn c},!1);function wb(a){I.call(this,1);this.X=a;this.s=a.c();this.h",
    "=a.h}p(wb,I);wb.prototype.evaluate=function(a){return-K(this.X,a)};wb.p",
    "rototype.toString=function(){return\"Unary Expression: -\"+J(this.X)};f",
    "unction xb(a){I.call(this,4);this.L=a;Va(this,ma(this.L,function(a){ret",
    "urn a.c()}));Wa(this,ma(this.L,function(a){return a.h}))}p(xb,I);xb.pro",
    "totype.evaluate=function(a){var b=new F;r(this.L,function(c){c=c.evalua",
    "te(a);if(!(c instanceof F))throw Error(\"Path expression must evaluate ",
    "to NodeSet.\");b=Ra(b,c)});return b};xb.prototype.toString=function(){r",
    "eturn t(this.L,function(a,b){return a+J(b)},\"Union Expression:\")};fun",
    "ction yb(a,b){this.a=a;this.ma=b}function zb(a){for(var b,c=[];;){U(a,",
    "\"Missing right hand side of binary expression.\");b=Ab(a);var d=a.a.ne",
    "xt();if(!d)break;var e=(d=$a[d]||null)&&d.ca;if(!e){a.a.back();break}fo",
    "r(;c.length&&e<=c[c.length-1].ca;)b=new Xa(c.pop(),c.pop(),b);c.push(b,",
    "d)}for(;c.length;)b=new Xa(c.pop(),c.pop(),b);return b}function U(a,b){",
    "if(a.a.empty())throw Error(b);}function Bb(a,b){a=a.a.next();if(a!=b)th",
    "row Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction Cb(a){a",
    "=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Db(a){",
    "a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\");ret",
    "urn new gb(a)}\nfunction Eb(a){var b=[];if(nb(B(a.a))){var c=a.a.next()",
    ";var d=B(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&",
    "&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new lb;d=new lb;U(a,\"Miss",
    "ing next location step.\");c=Fb(a,c);b.push(c)}else{a:{c=B(a.a);d=c.cha",
    "rAt(0);switch(d){case \"$\":throw Error(\"Variable reference not allowe",
    "d in HTML XPath\");case \"(\":a.a.next();c=zb(a);U(a,'unclosed \"(\"');",
    "Bb(a,\")\");break;case '\"':case \"'\":c=Db(a);break;default:if(isNaN(+",
    "c))if(!fb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==B(a.a,\n1)){c=a.a.next()",
    ";c=eb[c]||null;a.a.next();for(d=[];\")\"!=B(a.a);){U(a,\"Missing functi",
    "on argument list.\");d.push(zb(a));if(\",\"!=B(a.a))break;a.a.next()}U(",
    "a,\"Unclosed function argument list.\");Cb(a);c=new cb(c,d)}else{c=null",
    ";break a}else c=new ib(+a.a.next())}\"[\"==B(a.a)&&(d=new Q(Gb(a)),c=ne",
    "w ab(c,d))}if(c)if(nb(B(a.a)))d=c;else return c;else c=Fb(a,\"/\"),d=ne",
    "w mb,b.push(c)}for(;nb(B(a.a));)c=a.a.next(),U(a,\"Missing next locatio",
    "n step.\"),c=Fb(a,c),b.push(c);return new jb(d,b)}\nfunction Fb(a,b){if",
    "(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');i",
    "f(\".\"==B(a.a)){var c=new R(vb,new G(\"node\"));a.a.next();return c}if",
    "(\"..\"==B(a.a))return c=new R(ub,new G(\"node\")),a.a.next(),c;if(\"@",
    "\"==B(a.a)){var d=kb;a.a.next();U(a,\"Missing attribute name\")}else if",
    "(\"::\"==B(a.a,1)){if(!/(?![0-9])[\\w]/.test(B(a.a).charAt(0)))throw Er",
    "ror(\"Bad token: \"+a.a.next());var e=a.a.next();d=tb[e]||null;if(!d)th",
    "row Error(\"No axis with name: \"+e);a.a.next();U(a,\"Missing node name",
    "\")}else d=qb;e=\nB(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"",
    "(\"==B(a.a,1)){if(!fb(e))throw Error(\"Invalid node type: \"+e);e=a.a.n",
    "ext();if(!fb(e))throw Error(\"Invalid type name: \"+e);Bb(a,\"(\");U(a,",
    "\"Bad nodetype\");var f=B(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=",
    "Db(a);U(a,\"Bad nodetype\");Cb(a);e=new G(e,g)}else if(e=a.a.next(),f=e",
    ".indexOf(\":\"),-1==f)e=new hb(e);else{g=e.substring(0,f);if(\"*\"==g)v",
    "ar l=\"*\";else if(l=a.ma(g),!l)throw Error(\"Namespace prefix not decl",
    "ared: \"+g);e=e.substr(f+1);e=new hb(e,l)}else throw Error(\"Bad token:",
    " \"+\na.a.next());a=new Q(Gb(a),d.A);return c||new R(d,e,a,\"//\"==b)}f",
    "unction Gb(a){for(var b=[];\"[\"==B(a.a);){a.a.next();U(a,\"Missing pre",
    "dicate expression.\");var c=zb(a);b.push(c);U(a,\"Unclosed predicate ex",
    "pression.\");Bb(a,\"]\")}return b}function Ab(a){if(\"-\"==B(a.a))retur",
    "n a.a.next(),new wb(Ab(a));var b=Eb(a);if(\"|\"!=B(a.a))a=b;else{for(b=",
    "[b];\"|\"==a.a.next();)U(a,\"Missing next union location path.\"),b.pus",
    "h(Eb(a));a.a.back();a=new xb(b)}return a};function Hb(a){switch(a.nodeT",
    "ype){case 1:return ja(Ib,a);case 9:return Hb(a.documentElement);case 11",
    ":case 10:case 6:case 12:return Jb;default:return a.parentNode?Hb(a.pare",
    "ntNode):Jb}}function Jb(){return null}function Ib(a,b){if(a.prefix==b)r",
    "eturn a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttri",
    "buteNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parentNode",
    "&&9!=a.parentNode.nodeType?Ib(a.parentNode,b):null};function Kb(a,b){if",
    "(!a.length)throw Error(\"Empty XPath expression.\");a=Ka(a);if(a.empty(",
    "))throw Error(\"Invalid XPath expression.\");b?\"function\"==ca(b)||(b=",
    "ia(b.lookupNamespaceURI,b)):b=function(){return null};var c=zb(new yb(a",
    ",b));if(!a.empty())throw Error(\"Bad token: \"+a.next());this.evaluate=",
    "function(a,b){a=c.evaluate(new A(a));return new V(a,b)}}\nfunction V(a,",
    "b){if(0==b)if(a instanceof F)b=4;else if(\"string\"==typeof a)b=2;else ",
    "if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else thro",
    "w Error(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a ins",
    "tanceof F))throw Error(\"value could not be converted to the specified ",
    "type\");this.resultType=b;switch(b){case 2:this.stringValue=a instanceo",
    "f F?Ta(a):\"\"+a;break;case 1:this.numberValue=a instanceof F?+Ta(a):+a",
    ";break;case 3:this.booleanValue=a instanceof F?0<a.o():!!a;break;case 4",
    ":case 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();",
    "e;e=c.next())d.push(e);this.snapshotLength=a.o();this.invalidIteratorSt",
    "ate=!1;break;case 8:case 9:this.singleNodeValue=Sa(a);break;default:thr",
    "ow Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNext=funct",
    "ion(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong result ",
    "type\");return f>=d.length?null:d[f++]};this.snapshotItem=function(a){i",
    "f(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong result type\"",
    ");return a>=d.length||0>a?null:d[a]}}\nV.ANY_TYPE=0;V.NUMBER_TYPE=1;V.S",
    "TRING_TYPE=2;V.BOOLEAN_TYPE=3;V.UNORDERED_NODE_ITERATOR_TYPE=4;V.ORDERE",
    "D_NODE_ITERATOR_TYPE=5;V.UNORDERED_NODE_SNAPSHOT_TYPE=6;V.ORDERED_NODE_",
    "SNAPSHOT_TYPE=7;V.ANY_UNORDERED_NODE_TYPE=8;V.FIRST_ORDERED_NODE_TYPE=9",
    ";function Lb(a){this.lookupNamespaceURI=Hb(a)}\nba(\"wgxpath.install\",",
    "function(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.documen",
    "t;if(!c.evaluate||b)a.XPathResult=V,c.evaluate=function(a,b,c,g){return",
    "(new Kb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){return ne",
    "w Kb(a,b)},c.createNSResolver=function(a){return new Lb(a)}});var W={};",
    "W.U=function(){var a={ua:\"http://www.w3.org/2000/svg\"};return functio",
    "n(b){return a[b]||null}}();\nW.m=function(a,b,c){var d=w(a);if(!d.docum",
    "entElement)return null;try{for(var e=d.createNSResolver?d.createNSResol",
    "ver(d.documentElement):W.U,f={},g=d.getElementsByTagName(\"*\"),l=0;l<g",
    ".length;++l){var y=g[l],D=y.namespaceURI;if(D&&!f[D]){var q=y.lookupPre",
    "fix(D);if(!q){var x=D.match(\".*/(\\\\w+)/?$\");q=x?x[1]:\"xhtml\"}f[D]",
    "=q}}var H={},S;for(S in f)H[f[S]]=S;e=function(a){return H[a]||null};tr",
    "y{return d.evaluate(b,a,e,c,null)}catch(xa){if(\"TypeError\"===xa.name)",
    "return e=d.createNSResolver?d.createNSResolver(d.documentElement):\nW.U",
    ",d.evaluate(b,a,e,c,null);throw xa;}}catch(xa){throw new ya(32,\"Unable",
    " to locate an element with the xpath expression \"+b+\" because of the ",
    "following error:\\n\"+xa);}};W.V=function(a,b){if(!a||1!=a.nodeType)thr",
    "ow new ya(32,'The result of the xpath expression \"'+b+'\" is: '+a+\". ",
    "It should be an element.\");};\nW.pa=function(a,b){var c=function(){var",
    " c=W.m(b,a,9);return c?c.singleNodeValue||null:b.selectSingleNode?(c=w(",
    "b),c.setProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.sele",
    "ctSingleNode(a)):null}();null===c||W.V(c,a);return c};\nW.sa=function(a",
    ",b){var c=function(){var c=W.m(b,a,7);if(c){for(var e=c.snapshotLength,",
    "f=[],g=0;g<e;++g)f.push(c.snapshotItem(g));return f}return b.selectNode",
    "s?(c=w(b),c.setProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\")",
    ",b.selectNodes(a)):[]}();r(c,function(b){W.V(b,a)});return c};function ",
    "Mb(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d}h=Mb.prot",
    "otype;h.clone=function(){return new Mb(this.top,this.right,this.bottom,",
    "this.left)};h.toString=function(){return\"(\"+this.top+\"t, \"+this.rig",
    "ht+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"};h.contains=function(a)",
    "{return this&&a?a instanceof Mb?a.left>=this.left&&a.right<=this.right&",
    "&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right",
    "&&a.y>=this.top&&a.y<=this.bottom:!1};\nh.expand=function(a,b,c,d){ea(a",
    ")?(this.top-=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-",
    "=a.left):(this.top-=a,this.right+=Number(b),this.bottom+=Number(c),this",
    ".left-=Number(d));return this};h.ceil=function(){this.top=Math.ceil(thi",
    "s.top);this.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bott",
    "om);this.left=Math.ceil(this.left);return this};\nh.floor=function(){th",
    "is.top=Math.floor(this.top);this.right=Math.floor(this.right);this.bott",
    "om=Math.floor(this.bottom);this.left=Math.floor(this.left);return this}",
    ";h.round=function(){this.top=Math.round(this.top);this.right=Math.round",
    "(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(t",
    "his.left);return this};h.translate=function(a,b){a instanceof v?(this.l",
    "eft+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,",
    "this.right+=a,n(b)&&(this.top+=b,this.bottom+=b));return this};\nh.scal",
    "e=function(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;this.top*=b;this.",
    "bottom*=b;return this};function X(a,b,c,d){this.left=a;this.top=b;this.",
    "width=c;this.height=d}h=X.prototype;h.clone=function(){return new X(thi",
    "s.left,this.top,this.width,this.height)};h.toString=function(){return\"",
    "(\"+this.left+\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+",
    "\"h)\"};h.contains=function(a){return a instanceof v?a.x>=this.left&&a.",
    "x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.",
    "left<=a.left&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&th",
    "is.top+this.height>=a.top+a.height};\nh.ceil=function(){this.left=Math.",
    "ceil(this.left);this.top=Math.ceil(this.top);this.width=Math.ceil(this.",
    "width);this.height=Math.ceil(this.height);return this};h.floor=function",
    "(){this.left=Math.floor(this.left);this.top=Math.floor(this.top);this.w",
    "idth=Math.floor(this.width);this.height=Math.floor(this.height);return ",
    "this};h.round=function(){this.left=Math.round(this.left);this.top=Math.",
    "round(this.top);this.width=Math.round(this.width);this.height=Math.roun",
    "d(this.height);return this};\nh.translate=function(a,b){a instanceof v?",
    "(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(this.top+=b));retur",
    "n this};h.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;thi",
    "s.top*=b;this.height*=b;return this};var Nb=\"function\"===typeof Shado",
    "wRoot;function Ob(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType",
    "&&11!=a.nodeType;)a=a.parentNode;return z(a)?a:null}\nfunction Y(a,b){b",
    "=ka(b);if(\"float\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat",
    "\";a:{var c=b;var d=w(a);if(d.defaultView&&d.defaultView.getComputedSty",
    "le&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyVa",
    "lue(c)||\"\";break a}c=\"\"}a=c||Pb(a,b);if(null===a)a=null;else if(0<=",
    "la(sa,b)){b:{var e=a.match(va);if(e&&(b=Number(e[1]),c=Number(e[2]),d=N",
    "umber(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<",
    "=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(wa))if(b=Nu",
    "mber(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&",
    "0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=r",
    "a[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&",
    "(c=c.replace(ta,\"#$1$1$2$2$3$3\")),!ua.test(c))){b=null;break b}b=[par",
    "seInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,",
    "2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunction Pb(a",
    ",b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&\"function\"==ca(c.getP",
    "ropertyValue)&&(d=c.getPropertyValue(b));return\"inherit\"!=d?k(d)?d:nu",
    "ll:(a=Ob(a))?Pb(a,b):null}\nfunction Qb(a,b,c){function d(a){var b=Rb(a",
    ");return 0<b.height&&0<b.width?!0:z(a,\"PATH\")&&(0<b.height||0<b.width",
    ")?(a=Y(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"hidden\"!=Y(a,\"ove",
    "rflow\")&&ma(a.childNodes,function(a){return 3==a.nodeType||z(a)&&d(a)}",
    ")}function e(a){return Sb(a)==Z&&na(a.childNodes,function(a){return!z(a",
    ")||e(a)||!d(a)})}if(!z(a))throw Error(\"Argument to isShown must be of ",
    "type Element\");if(z(a,\"BODY\"))return!0;var f=Ob(a);if(f&&z(f,\"DETAI",
    "LS\")&&!f.open&&!z(a,\"SUMMARY\"))return!1;if(z(a,\n\"OPTION\")||z(a,\"",
    "OPTGROUP\"))return a=Ha(a,function(a){return z(a,\"SELECT\")}),!!a&&Qb(",
    "a,!0,c);if(f=Tb(a))return!!f.Z&&0<f.rect.width&&0<f.rect.height&&Qb(f.Z",
    ",b,c);if(z(a,\"INPUT\")&&\"hidden\"==a.type.toLowerCase()||z(a,\"NOSCRI",
    "PT\"))return!1;f=Y(a,\"visibility\");return\"collapse\"!=f&&\"hidden\"!",
    "=f&&c(a)&&(b||0!=Ub(a))&&d(a)?!e(a):!1}\nfunction Vb(a,b){function c(a)",
    "{if(z(a)&&\"none\"==Y(a,\"display\"))return!1;a:{var b=a.parentNode;if(",
    "a.getDestinationInsertionPoints){var d=a.getDestinationInsertionPoints(",
    ");if(0<d.length){a=d[d.length-1];break a}}a=b&&b.shadowRoot&&void 0!==a",
    ".assignedSlot?a.assignedSlot?a.assignedSlot.parentNode:null:b}return Nb",
    "&&a instanceof ShadowRoot||a&&(9==a.nodeType||11==a.nodeType)?!0:!!a&&c",
    "(a)}return Qb(a,!!b,c)}var Z=\"hidden\";\nfunction Sb(a){function b(a){",
    "function b(a){if(a==g)return!0;var b=Y(a,\"display\");return 0==b.lastI",
    "ndexOf(\"inline\",0)||\"contents\"==b||\"absolute\"==c&&\"static\"==Y(a",
    ",\"position\")?!1:!0}var c=Y(a,\"position\");if(\"fixed\"==c)return D=!",
    "0,a==g?null:g;for(a=Ob(a);a&&!b(a);)a=Ob(a);return a}function c(a){var ",
    "b=a;if(\"visible\"==y)if(a==g&&l)b=l;else if(a==l)return{x:\"visible\",",
    "y:\"visible\"};b={x:Y(b,\"overflow-x\"),y:Y(b,\"overflow-y\")};a==g&&(b",
    ".x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y);ret",
    "urn b}function d(a){if(a==\ng){var b=(new Ia(f)).H;a=b.scrollingElement",
    "?b.scrollingElement:b.body||b.documentElement;b=b.parentWindow||b.defau",
    "ltView;a=new v(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)}",
    "else a=new v(a.scrollLeft,a.scrollTop);return a}var e=Wb(a),f=w(a),g=f.",
    "documentElement,l=f.body,y=Y(g,\"overflow\"),D;for(a=b(a);a;a=b(a)){var",
    " q=c(a);if(\"visible\"!=q.x||\"visible\"!=q.y){var x=Rb(a);if(0==x.widt",
    "h||0==x.height)return Z;var H=e.right<x.left,S=e.bottom<x.top;if(H&&\"h",
    "idden\"==q.x||S&&\"hidden\"==q.y)return Z;\nif(H&&\"visible\"!=q.x||S&&",
    "\"visible\"!=q.y){H=d(a);S=e.bottom<x.top-H.y;if(e.right<x.left-H.x&&\"",
    "visible\"!=q.x||S&&\"visible\"!=q.x)return Z;e=Sb(a);return e==Z?Z:\"sc",
    "roll\"}H=e.left>=x.left+x.width;x=e.top>=x.top+x.height;if(H&&\"hidden",
    "\"==q.x||x&&\"hidden\"==q.y)return Z;if(H&&\"visible\"!=q.x||x&&\"visib",
    "le\"!=q.y){if(D&&(q=d(a),e.left>=g.scrollWidth-q.x||e.right>=g.scrollHe",
    "ight-q.y))return Z;e=Sb(a);return e==Z?Z:\"scroll\"}}}return\"none\"}\n",
    "function Rb(a){var b=Tb(a);if(b)return b.rect;if(z(a,\"HTML\"))return a",
    "=w(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,a=",
    "\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new Aa(a.client",
    "Width,a.clientHeight),new X(0,0,a.width,a.height);try{var c=a.getBoundi",
    "ngClientRect()}catch(d){return new X(0,0,0,0)}return new X(c.left,c.top",
    ",c.right-c.left,c.bottom-c.top)}\nfunction Tb(a){var b=z(a,\"MAP\");if(",
    "!b&&!z(a,\"AREA\"))return null;var c=b?a:z(a.parentNode,\"MAP\")?a.pare",
    "ntNode:null,d=null,e=null;c&&c.name&&(d=W.pa('/descendant::*[@usemap = ",
    "\"#'+c.name+'\"]',w(c)))&&(e=Rb(d),b||\"default\"==a.shape.toLowerCase(",
    ")||(a=Xb(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.min(Math.max(",
    "a.top,0),e.height),e=new X(b+e.left,c+e.top,Math.min(a.width,e.width-b)",
    ",Math.min(a.height,e.height-c))));return{Z:d,rect:e||new X(0,0,0,0)}}\n",
    "function Xb(a){var b=a.shape.toLowerCase();a=a.coords.split(\",\");if(",
    "\"rect\"==b&&4==a.length){b=a[0];var c=a[1];return new X(b,c,a[2]-b,a[3",
    "]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new X(a[0]-b,a[1]-b,2*",
    "b,2*b);if(\"poly\"==b&&2<a.length){b=a[0];c=a[1];for(var d=b,e=c,f=2;f+",
    "1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f+",
    "1]),e=Math.max(e,a[f+1]);return new X(b,c,d-b,e-c)}return new X(0,0,0,0",
    ")}function Wb(a){a=Rb(a);return new Mb(a.top,a.left+a.width,a.top+a.hei",
    "ght,a.left)}\nfunction Ub(a){var b=1,c=Y(a,\"opacity\");c&&(b=Number(c)",
    ");(a=Ob(a))&&(b*=Ub(a));return b};var Yb=\"function\"===typeof ShadowRo",
    "ot;function Zb(a,b,c){if(!Vb(a,c))return!1;if(Yb){for(;a.parentNode;)a=",
    "a.parentNode;if(a instanceof ShadowRoot)return Zb(a.host,b)}return!0};b",
    "a(\"_\",Zb);; return this._.apply(null,arguments);}.apply({navigator:ty",
    "peof window!='undefined'?window.navigator:null,document:typeof window!=",
    "'undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const CLEAR_LOCAL_STORAGE[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.localStorage}l.prototype.set",
    "Item=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(13",
    ",g.message);}};l.prototype.getItem=function(a){return this.a.getItem(a)",
    "};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.remov",
    "eItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.proto",
    "type.size=function(){return this.a.length};l.prototype.key=function(a){",
    "return this.a.key(a)};function m(){if(null==(d||d).localStorage)throw n",
    "ew e(13,\"Local storage undefined\");(new l).clear()}var n=[\"_\"],p=th",
    "is;n[0]in p||!p.execScript||p.execScript(\"var \"+n[0]);for(var r;n.len",
    "gth&&(r=n.shift());){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p=p[r]&",
    "&p[r]!==Object.prototype[r]?p[r]:p[r]={}};; return this._.apply(null,ar",
    "guments);}.apply({navigator:typeof window!='undefined'?window.navigator",
    ":null,document:typeof window!='undefined'?window.document:null}, argume",
    "nts);}",
    NULL
};

const char* const CLEAR_SESSION_STORAGE[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.sessionStorage}l.prototype.s",
    "etItem=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(",
    "13,g.message);}};l.prototype.getItem=function(a){return this.a.getItem(",
    "a)};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.rem",
    "oveItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.pro",
    "totype.size=function(){return this.a.length};l.prototype.key=function(a",
    "){return this.a.key(a)};function m(){var a=d||d;if(null!=a.sessionStora",
    "ge&&null!=a.sessionStorage.clear)a=new l;else throw new e(13,\"Session ",
    "storage undefined\");a.clear()}var n=[\"_\"],p=this;n[0]in p||!p.execSc",
    "ript||p.execScript(\"var \"+n[0]);for(var r;n.length&&(r=n.shift());){v",
    "ar t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p=p[r]&&p[r]!==Object.prototy",
    "pe[r]?p[r]:p[r]={}};; return this._.apply(null,arguments);}.apply({navi",
    "gator:typeof window!='undefined'?window.navigator:null,document:typeof ",
    "window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_APPCACHE_STATUS[] = {
    "function(){return function(){function a(b,c){function g(){}g.prototype=",
    "c.prototype;b.b=c.prototype;b.prototype=new g;b.prototype.constructor=b",
    ";b.a=function(b,g,t){for(var p=Array(arguments.length-2),h=2;h<argument",
    "s.length;h++)p[h-2]=arguments[h];return c.prototype[g].apply(b,p)}};var",
    " d=window;function e(b,c){this.code=b;this.state=f[b]||k;this.message=c",
    "||\"\";b=this.state.replace(/((?:^|\\s+)[a-z])/g,function(b){return b.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=b.length-5;if(0>c||b.ind",
    "exOf(\"Error\",c)!=c)b+=\"Error\";this.name=b;b=Error(this.message);b.n",
    "ame=this.name;this.stack=b.stack||\"\"}a(e,Error);var k=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=k",
    ";f[30]=k;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=k;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){if(null!=(d||d).applicationCache)var ",
    "b=d.applicationCache.status;else throw new e(13,\"Undefined application",
    " cache\");return b}var m=[\"_\"],n=this;m[0]in n||!n.execScript||n.exec",
    "Script(\"var \"+m[0]);for(var q;m.length&&(q=m.shift());){var r;if(r=!m",
    ".length)r=void 0!==l;r?n[q]=l:n=n[q]&&n[q]!==Object.prototype[q]?n[q]:n",
    "[q]={}};; return this._.apply(null,arguments);}.apply({navigator:typeof",
    " window!='undefined'?window.navigator:null,document:typeof window!='und",
    "efined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_ATTRIBUTE[] = {
    "function(){return function(){function d(a){return\"string\"==typeof a}f",
    "unction g(a,b){function c(){}c.prototype=b.prototype;a.b=b.prototype;a.",
    "prototype=new c;a.prototype.constructor=a;a.a=function(a,c,k){for(var f",
    "=Array(arguments.length-2),e=2;e<arguments.length;e++)f[e-2]=arguments[",
    "e];return b.prototype[c].apply(a,f)}};function h(a,b){for(var c=a.lengt",
    "h,f=d(a)?a.split(\"\"):a,e=0;e<c;e++)e in f&&b.call(void 0,f[e],e,a)};f",
    "unction l(a,b){this.code=a;this.state=m[a]||n;this.message=b||\"\";a=th",
    "is.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase(",
    ").replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Erro",
    "r\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=this.na",
    "me;this.stack=a.stack||\"\"}g(l,Error);var n=\"unknown error\",m={15:\"",
    "element not selectable\",11:\"element not visible\"};m[31]=n;m[30]=n;m[",
    "24]=\"invalid cookie domain\";m[29]=\"invalid element coordinates\";m[1",
    "2]=\"invalid element state\";\nm[32]=\"invalid selector\";m[51]=\"inval",
    "id selector\";m[52]=\"invalid selector\";m[17]=\"javascript error\";m[4",
    "05]=\"unsupported operation\";m[34]=\"move target out of bounds\";m[27]",
    "=\"no such alert\";m[7]=\"no such element\";m[8]=\"no such frame\";m[23",
    "]=\"no such window\";m[28]=\"script timeout\";m[33]=\"session not creat",
    "ed\";m[10]=\"stale element reference\";m[21]=\"timeout\";m[25]=\"unable",
    " to set cookie\";m[26]=\"unexpected alert open\";m[13]=n;m[9]=\"unknown",
    " command\";l.prototype.toString=function(){return this.name+\": \"+this",
    ".message};function p(a,b){b=b.toLowerCase();return\"style\"==b?q(a.styl",
    "e.cssText):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var r=/[",
    ";]+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^(",
    ")]*\\([^()]*\\))*[^()]*$)/;function q(a){var b=[];h(a.split(r),function",
    "(a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.len",
    "gth&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.join(\"\");retu",
    "rn b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction t(a,b){b&&\"strin",
    "g\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagNa",
    "me.toUpperCase()==b)}function u(a){return t(a,\"OPTION\")?!0:t(a,\"INPU",
    "T\")?(a=a.type.toLowerCase(),\"checkbox\"==a||\"radio\"==a):!1};var v={",
    "\"class\":\"className\",readonly:\"readOnly\"},w=\"allowfullscreen allo",
    "wpaymentrequest allowusermedia async autofocus autoplay checked compact",
    " complete controls declare default defaultchecked defaultselected defer",
    " disabled ended formnovalidate hidden indeterminate iscontenteditable i",
    "smap itemscope loop multiple muted nohref nomodule noresize noshade nov",
    "alidate nowrap open paused playsinline pubdate readonly required revers",
    "ed scoped seamless seeking selected truespeed typemustmatch willvalidat",
    "e\".split(\" \");function x(a,b){var c=b.toLowerCase();if(\"style\"==c)",
    "return(b=a.style)&&!d(b)&&(b=b.cssText),b;if((\"selected\"==c||\"checke",
    "d\"==c)&&u(a)){if(!u(a))throw new l(15,\"Element is not selectable\");b",
    "=\"selected\";var f=a.type&&a.type.toLowerCase();if(\"checkbox\"==f||\"",
    "radio\"==f)b=\"checked\";return a[b]?\"true\":null}var e=t(a,\"A\");if(",
    "t(a,\"IMG\")&&\"src\"==c||e&&\"href\"==c)return(b=p(a,c))&&(b=a[c]),b;i",
    "f(\"spellcheck\"==c){b=p(a,c);if(null!==b){if(\"false\"==b.toLowerCase(",
    "))return\"false\";if(\"true\"==b.toLowerCase())return\"true\"}return a[",
    "c]+\n\"\"}e=v[b]||b;a:if(d(w))c=d(c)&&1==c.length?w.indexOf(c,0):-1;els",
    "e{for(var k=0;k<w.length;k++)if(k in w&&w[k]===c){c=k;break a}c=-1}if(0",
    "<=c)return(b=null!==p(a,b)||a[e])?\"true\":null;try{f=a[e]}catch(C){}(c",
    "=null==f)||(c=typeof f,c=\"object\"==c&&null!=f||\"function\"==c);b=c?p",
    "(a,b):f;return null!=b?b.toString():null}var y=[\"_\"],z=this;y[0]in z|",
    "|!z.execScript||z.execScript(\"var \"+y[0]);\nfor(var A;y.length&&(A=y.",
    "shift());){var B;if(B=!y.length)B=void 0!==x;B?z[A]=x:z=z[A]&&z[A]!==Ob",
    "ject.prototype[A]?z[A]:z[A]={}};; return this._.apply(null,arguments);}",
    ".apply({navigator:typeof window!='undefined'?window.navigator:null,docu",
    "ment:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.localStorage}l.prototype.set",
    "Item=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(13",
    ",g.message);}};l.prototype.getItem=function(a){return this.a.getItem(a)",
    "};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.remov",
    "eItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.proto",
    "type.size=function(){return this.a.length};l.prototype.key=function(a){",
    "return this.a.key(a)};function m(a){if(null==(d||d).localStorage)throw ",
    "new e(13,\"Local storage undefined\");return(new l).getItem(a)}var n=[",
    "\"_\"],p=this;n[0]in p||!p.execScript||p.execScript(\"var \"+n[0]);for(",
    "var r;n.length&&(r=n.shift());){var t;if(t=!n.length)t=void 0!==m;t?p[r",
    "]=m:p=p[r]&&p[r]!==Object.prototype[r]?p[r]:p[r]={}};; return this._.ap",
    "ply(null,arguments);}.apply({navigator:typeof window!='undefined'?windo",
    "w.navigator:null,document:typeof window!='undefined'?window.document:nu",
    "ll}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_KEY[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.localStorage}l.prototype.set",
    "Item=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(13",
    ",g.message);}};l.prototype.getItem=function(a){return this.a.getItem(a)",
    "};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.remov",
    "eItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.proto",
    "type.size=function(){return this.a.length};l.prototype.key=function(a){",
    "return this.a.key(a)};function m(a){if(null==(d||d).localStorage)throw ",
    "new e(13,\"Local storage undefined\");return(new l).key(a)}var n=[\"_\"",
    "],p=this;n[0]in p||!p.execScript||p.execScript(\"var \"+n[0]);for(var r",
    ";n.length&&(r=n.shift());){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p",
    "=p[r]&&p[r]!==Object.prototype[r]?p[r]:p[r]={}};; return this._.apply(n",
    "ull,arguments);}.apply({navigator:typeof window!='undefined'?window.nav",
    "igator:null,document:typeof window!='undefined'?window.document:null}, ",
    "arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_KEYS[] = {
    "function(){return function(){function b(a,c){function e(){}e.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new e;a.prototype.constructor=a",
    ";a.b=function(a,e,u){for(var f=Array(arguments.length-2),l=2;l<argument",
    "s.length;l++)f[l-2]=arguments[l];return c.prototype[e].apply(a,f)}};var",
    " d=window;function g(a,c){this.code=a;this.state=h[a]||k;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(g,Error);var k=\"unknown error",
    "\",h={15:\"element not selectable\",11:\"element not visible\"};h[31]=k",
    ";h[30]=k;h[24]=\"invalid cookie domain\";h[29]=\"invalid element coordi",
    "nates\";h[12]=\"invalid element state\";\nh[32]=\"invalid selector\";h[",
    "51]=\"invalid selector\";h[52]=\"invalid selector\";h[17]=\"javascript ",
    "error\";h[405]=\"unsupported operation\";h[34]=\"move target out of bou",
    "nds\";h[27]=\"no such alert\";h[7]=\"no such element\";h[8]=\"no such f",
    "rame\";h[23]=\"no such window\";h[28]=\"script timeout\";h[33]=\"sessio",
    "n not created\";h[10]=\"stale element reference\";h[21]=\"timeout\";h[2",
    "5]=\"unable to set cookie\";h[26]=\"unexpected alert open\";h[13]=k;h[9",
    "]=\"unknown command\";g.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function m(){this.a=d.localStorage}m.prototype.set",
    "Item=function(a,c){try{this.a.setItem(a,c+\"\")}catch(e){throw new g(13",
    ",e.message);}};m.prototype.getItem=function(a){return this.a.getItem(a)",
    "};m.prototype.removeItem=function(a){var c=this.getItem(a);this.a.remov",
    "eItem(a);return c};m.prototype.clear=function(){this.a.clear()};m.proto",
    "type.size=function(){return this.a.length};m.prototype.key=function(a){",
    "return this.a.key(a)};function n(){if(null==(d||d).localStorage)throw n",
    "ew g(13,\"Local storage undefined\");var a=new m;for(var c=[],e=a.size(",
    "),f=0;f<e;f++)c[f]=a.a.key(f);return c}var p=[\"_\"],q=this;p[0]in q||!",
    "q.execScript||q.execScript(\"var \"+p[0]);for(var r;p.length&&(r=p.shif",
    "t());){var t;if(t=!p.length)t=void 0!==n;t?q[r]=n:q=q[r]&&q[r]!==Object",
    ".prototype[r]?q[r]:q[r]={}};; return this._.apply(null,arguments);}.app",
    "ly({navigator:typeof window!='undefined'?window.navigator:null,document",
    ":typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_SIZE[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.localStorage}l.prototype.set",
    "Item=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(13",
    ",g.message);}};l.prototype.getItem=function(a){return this.a.getItem(a)",
    "};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.remov",
    "eItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.proto",
    "type.size=function(){return this.a.length};l.prototype.key=function(a){",
    "return this.a.key(a)};function m(){if(null==(d||d).localStorage)throw n",
    "ew e(13,\"Local storage undefined\");return(new l).size()}var n=[\"_\"]",
    ",p=this;n[0]in p||!p.execScript||p.execScript(\"var \"+n[0]);for(var r;",
    "n.length&&(r=n.shift());){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p=",
    "p[r]&&p[r]!==Object.prototype[r]?p[r]:p[r]={}};; return this._.apply(nu",
    "ll,arguments);}.apply({navigator:typeof window!='undefined'?window.navi",
    "gator:null,document:typeof window!='undefined'?window.document:null}, a",
    "rguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.sessionStorage}l.prototype.s",
    "etItem=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(",
    "13,g.message);}};l.prototype.getItem=function(a){return this.a.getItem(",
    "a)};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.rem",
    "oveItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.pro",
    "totype.size=function(){return this.a.length};l.prototype.key=function(a",
    "){return this.a.key(a)};function m(a){var c=d||d;if(null!=c.sessionStor",
    "age&&null!=c.sessionStorage.clear)c=new l;else throw new e(13,\"Session",
    " storage undefined\");return c.getItem(a)}var n=[\"_\"],p=this;n[0]in p",
    "||!p.execScript||p.execScript(\"var \"+n[0]);for(var r;n.length&&(r=n.s",
    "hift());){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p=p[r]&&p[r]!==Obj",
    "ect.prototype[r]?p[r]:p[r]={}};; return this._.apply(null,arguments);}.",
    "apply({navigator:typeof window!='undefined'?window.navigator:null,docum",
    "ent:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_KEY[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.sessionStorage}l.prototype.s",
    "etItem=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(",
    "13,g.message);}};l.prototype.getItem=function(a){return this.a.getItem(",
    "a)};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.rem",
    "oveItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.pro",
    "totype.size=function(){return this.a.length};l.prototype.key=function(a",
    "){return this.a.key(a)};function m(a){var c=d||d;if(null!=c.sessionStor",
    "age&&null!=c.sessionStorage.clear)c=new l;else throw new e(13,\"Session",
    " storage undefined\");return c.key(a)}var n=[\"_\"],p=this;n[0]in p||!p",
    ".execScript||p.execScript(\"var \"+n[0]);for(var r;n.length&&(r=n.shift",
    "());){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p=p[r]&&p[r]!==Object.",
    "prototype[r]?p[r]:p[r]={}};; return this._.apply(null,arguments);}.appl",
    "y({navigator:typeof window!='undefined'?window.navigator:null,document:",
    "typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_KEYS[] = {
    "function(){return function(){function b(a,c){function e(){}e.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new e;a.prototype.constructor=a",
    ";a.b=function(a,e,u){for(var f=Array(arguments.length-2),l=2;l<argument",
    "s.length;l++)f[l-2]=arguments[l];return c.prototype[e].apply(a,f)}};var",
    " d=window;function g(a,c){this.code=a;this.state=h[a]||k;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(g,Error);var k=\"unknown error",
    "\",h={15:\"element not selectable\",11:\"element not visible\"};h[31]=k",
    ";h[30]=k;h[24]=\"invalid cookie domain\";h[29]=\"invalid element coordi",
    "nates\";h[12]=\"invalid element state\";\nh[32]=\"invalid selector\";h[",
    "51]=\"invalid selector\";h[52]=\"invalid selector\";h[17]=\"javascript ",
    "error\";h[405]=\"unsupported operation\";h[34]=\"move target out of bou",
    "nds\";h[27]=\"no such alert\";h[7]=\"no such element\";h[8]=\"no such f",
    "rame\";h[23]=\"no such window\";h[28]=\"script timeout\";h[33]=\"sessio",
    "n not created\";h[10]=\"stale element reference\";h[21]=\"timeout\";h[2",
    "5]=\"unable to set cookie\";h[26]=\"unexpected alert open\";h[13]=k;h[9",
    "]=\"unknown command\";g.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function m(){this.a=d.sessionStorage}m.prototype.s",
    "etItem=function(a,c){try{this.a.setItem(a,c+\"\")}catch(e){throw new g(",
    "13,e.message);}};m.prototype.getItem=function(a){return this.a.getItem(",
    "a)};m.prototype.removeItem=function(a){var c=this.getItem(a);this.a.rem",
    "oveItem(a);return c};m.prototype.clear=function(){this.a.clear()};m.pro",
    "totype.size=function(){return this.a.length};m.prototype.key=function(a",
    "){return this.a.key(a)};function n(){var a=d||d;if(null!=a.sessionStora",
    "ge&&null!=a.sessionStorage.clear)a=new m;else throw new g(13,\"Session ",
    "storage undefined\");for(var c=[],e=a.size(),f=0;f<e;f++)c[f]=a.a.key(f",
    ");return c}var p=[\"_\"],q=this;p[0]in q||!q.execScript||q.execScript(",
    "\"var \"+p[0]);for(var r;p.length&&(r=p.shift());){var t;if(t=!p.length",
    ")t=void 0!==n;t?q[r]=n:q=q[r]&&q[r]!==Object.prototype[r]?q[r]:q[r]={}}",
    ";; return this._.apply(null,arguments);}.apply({navigator:typeof window",
    "!='undefined'?window.navigator:null,document:typeof window!='undefined'",
    "?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_SIZE[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.sessionStorage}l.prototype.s",
    "etItem=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(",
    "13,g.message);}};l.prototype.getItem=function(a){return this.a.getItem(",
    "a)};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.rem",
    "oveItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.pro",
    "totype.size=function(){return this.a.length};l.prototype.key=function(a",
    "){return this.a.key(a)};function m(){var a=d||d;if(null!=a.sessionStora",
    "ge&&null!=a.sessionStorage.clear)a=new l;else throw new e(13,\"Session ",
    "storage undefined\");return a.size()}var n=[\"_\"],p=this;n[0]in p||!p.",
    "execScript||p.execScript(\"var \"+n[0]);for(var r;n.length&&(r=n.shift(",
    "));){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p=p[r]&&p[r]!==Object.p",
    "rototype[r]?p[r]:p[r]={}};; return this._.apply(null,arguments);}.apply",
    "({navigator:typeof window!='undefined'?window.navigator:null,document:t",
    "ypeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_TEXT[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function l(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ha(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ia(a,b,c){ia=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ha;return",
    " ia.apply(null,arguments)}\nfunction ja(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.ya=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.wa=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ka(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b)==b}v",
    "ar la=String.prototype.trim?function(a){return a.trim()}:function(a){re",
    "turn a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ma(a,b){ret",
    "urn a<b?-1:a>b?1:0}function na(a){return String(a).replace(/\\-([a-z])/",
    "g,function(a,c){return c.toUpperCase()})};function oa(a,b){if(l(a))retu",
    "rn l(b)&&1==b.length?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c ",
    "in a&&a[c]===b)return c;return-1}function q(a,b){for(var c=a.length,d=l",
    "(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}functio",
    "n r(a,b,c){var d=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return ",
    "d}function pa(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e+",
    "+)if(e in d&&b.call(void 0,d[e],e,a))return!0;return!1}\nfunction qa(a,",
    "b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.",
    "call(void 0,d[e],e,a))return!1;return!0}function ra(a){return Array.pro",
    "totype.concat.apply([],arguments)}function sa(a){var b=a.length;if(0<b)",
    "{for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function ta",
    "(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Arra",
    "y.prototype.slice.call(a,b,c)};var ua={aliceblue:\"#f0f8ff\",antiquewhi",
    "te:\"#faebd7\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff",
    "\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmon",
    "d:\"#ffebcd\",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\"",
    ",burlywood:\"#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",cho",
    "colate:\"#d2691e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsil",
    "k:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\"",
    ",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",da",
    "rkgreen:\"#006400\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkma",
    "genta:\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",dar",
    "korchid:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseag",
    "reen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",da",
    "rkslategrey:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3",
    "\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dim",
    "grey:\"#696969\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhi",
    "te:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"",
    "#dcdcdc\",\nghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520",
    "\",gray:\"#808080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#8",
    "08080\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",",
    "indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6",
    "fa\",lavenderblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#ff",
    "facd\",lightblue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff",
    "\",lightgoldenrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"",
    "#90ee90\",lightgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ff",
    "a07a\",\nlightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslateg",
    "ray:\"#778899\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",l",
    "ightyellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#",
    "faf0e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66c",
    "daa\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9",
    "370db\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumsp",
    "ringgreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c7",
    "1585\",midnightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4",
    "e1\",\nmoccasin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",ol",
    "dlace:\"#fdf5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa",
    "500\",orangered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa",
    "\",palegreen:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7",
    "093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pin",
    "k:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080",
    "\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebr",
    "own:\"#8b4513\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2",
    "e8b57\",\nseashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",sk",
    "yblue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey",
    ":\"#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682",
    "b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6",
    "347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:",
    "\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9a",
    "cd32\"};var va=\"backgroundColor borderTopColor borderRightColor border",
    "BottomColor borderLeftColor color outlineColor\".split(\" \"),wa=/#([0-",
    "9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,xa=/^#(?:[0-9a-f]{3}){1,2}$/i,ya=/",
    "^(?:rgba)?\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*",
    ")\\)$/i,za=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|",
    "[1-9]\\d{0,2})\\)$/i;function Aa(a,b){this.code=a;this.state=u[a]||Ba;t",
    "his.message=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(",
    "a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;",
    "if(0>b||a.indexOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this",
    ".message);a.name=this.name;this.stack=a.stack||\"\"}p(Aa,Error);var Ba=",
    "\"unknown error\",u={15:\"element not selectable\",11:\"element not vis",
    "ible\"};u[31]=Ba;u[30]=Ba;u[24]=\"invalid cookie domain\";u[29]=\"inval",
    "id element coordinates\";u[12]=\"invalid element state\";\nu[32]=\"inva",
    "lid selector\";u[51]=\"invalid selector\";u[52]=\"invalid selector\";u[",
    "17]=\"javascript error\";u[405]=\"unsupported operation\";u[34]=\"move ",
    "target out of bounds\";u[27]=\"no such alert\";u[7]=\"no such element\"",
    ";u[8]=\"no such frame\";u[23]=\"no such window\";u[28]=\"script timeout",
    "\";u[33]=\"session not created\";u[10]=\"stale element reference\";u[21",
    "]=\"timeout\";u[25]=\"unable to set cookie\";u[26]=\"unexpected alert o",
    "pen\";u[13]=Ba;u[9]=\"unknown command\";Aa.prototype.toString=function(",
    "){return this.name+\": \"+this.message};var Da;a:{var Ea=aa.navigator;i",
    "f(Ea){var Fa=Ea.userAgent;if(Fa){Da=Fa;break a}}Da=\"\"};function Ga(a)",
    "{var b=Ha;Object.prototype.hasOwnProperty.call(b,\"528\")||(b[\"528\"]=",
    "a(\"528\"))};var Ia=-1!=Da.indexOf(\"Macintosh\"),Ja=-1!=Da.indexOf(\"W",
    "indows\"),Ka,La=\"\",Ma=/WebKit\\/(\\S+)/.exec(Da);Ma&&(La=Ma?Ma[1]:\"",
    "\");Ka=La;var Ha={};\nfunction Na(){Ga(function(){for(var a=0,b=la(Stri",
    "ng(Ka)).split(\".\"),c=la(\"528\").split(\".\"),d=Math.max(b.length,c.l",
    "ength),e=0;0==a&&e<d;e++){var f=b[e]||\"\",h=c[e]||\"\";do{f=/(\\d*)(",
    "\\D*)(.*)/.exec(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)|",
    "|[\"\",\"\",\"\",\"\"];if(0==f[0].length&&0==h[0].length)break;a=ma(0==",
    "f[1].length?0:parseInt(f[1],10),0==h[1].length?0:parseInt(h[1],10))||ma",
    "(0==f[2].length,0==h[2].length)||ma(f[2],h[2]);f=f[3];h=h[3]}while(0==a",
    ")}return 0<=a})};function v(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=v.pr",
    "ototype;g.clone=function(){return new v(this.x,this.y)};g.toString=func",
    "tion(){return\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x",
    "=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};g.floor=functi",
    "on(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};g",
    ".round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);r",
    "eturn this};\ng.translate=function(a,b){a instanceof v?(this.x+=a.x,thi",
    "s.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};g.scale=fu",
    "nction(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Oa(a,b",
    "){this.width=a;this.height=b}g=Oa.prototype;g.clone=function(){return n",
    "ew Oa(this.width,this.height)};g.toString=function(){return\"(\"+this.w",
    "idth+\" x \"+this.height+\")\"};g.aspectRatio=function(){return this.wi",
    "dth/this.height};g.ceil=function(){this.width=Math.ceil(this.width);thi",
    "s.height=Math.ceil(this.height);return this};g.floor=function(){this.wi",
    "dth=Math.floor(this.width);this.height=Math.floor(this.height);return t",
    "his};\ng.round=function(){this.width=Math.round(this.width);this.height",
    "=Math.round(this.height);return this};g.scale=function(a,b){b=n(b)?b:a;",
    "this.width*=a;this.height*=b;return this};function Pa(a,b,c){function d",
    "(c){c&&b.appendChild(l(c)?a.createTextNode(c):c)}for(var e=1;e<c.length",
    ";e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):q(Qa(f)?sa(f):f,d)}}f",
    "unction Ra(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}funct",
    "ion Sa(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b",
    "||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)retu",
    "rn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNo",
    "de;return b==a}\nfunction Ta(a,b){if(a==b)return 0;if(a.compareDocument",
    "Position)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"i",
    "n a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,",
    "d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.pare",
    "ntNode,f=b.parentNode;return e==f?Ua(a,b):!c&&Sa(e,b)?-1*Va(a,b):!d&&Sa",
    "(f,a)?Va(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.source",
    "Index)}d=w(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.crea",
    "teRange();a.selectNode(b);\na.collapse(!0);return c.compareBoundaryPoin",
    "ts(aa.Range.START_TO_END,a)}function Va(a,b){var c=a.parentNode;if(c==b",
    ")return-1;for(;b.parentNode!=c;)b=b.parentNode;return Ua(b,a)}function ",
    "Ua(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function w(",
    "a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Qa(a){if",
    "(a&&\"number\"==typeof a.length){if(ea(a))return\"function\"==typeof a.",
    "item||\"string\"==typeof a.item;if(\"function\"==ca(a))return\"function",
    "\"==typeof a.item}return!1}\nfunction Wa(a,b){a&&(a=a.parentNode);for(v",
    "ar c=0;a;){if(b(a))return a;a=a.parentNode;c++}return null}function Xa(",
    "a){this.M=a||aa.document||document}g=Xa.prototype;g.getElementsByTagNam",
    "e=function(a,b){return(b||this.M).getElementsByTagName(String(a))};g.cr",
    "eateElement=function(a){return this.M.createElement(String(a))};g.creat",
    "eTextNode=function(a){return this.M.createTextNode(String(a))};g.append",
    "Child=function(a,b){a.appendChild(b)};g.append=function(a,b){Pa(w(a),a,",
    "arguments)};\ng.canHaveChildren=function(a){if(1!=a.nodeType)return!1;s",
    "witch(a.tagName){case \"APPLET\":case \"AREA\":case \"BASE\":case \"BR",
    "\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"FRAME\":case \"H",
    "R\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"ISINDEX\":case ",
    "\"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\":case \"MET",
    "A\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case \"SOURCE\":case",
    " \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0};g.removeNode=",
    "function(a){return a&&a.parentNode?a.parentNode.removeChild(a):null};\n",
    "g.contains=Sa;function y(a,b){b&&\"string\"!==typeof b&&(b=b.toString()",
    ");return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n Th",
    "e MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) ",
    "2012 Google Inc.\n\n Permission is hereby granted, free of charge, to a",
    "ny person obtaining a copy\n of this software and associated documentat",
    "ion files (the \"Software\"), to\n deal in the Software without restric",
    "tion, including without limitation the\n rights to use, copy, modify, m",
    "erge, publish, distribute, sublicense, and/or\n sell copies of the Soft",
    "ware, and to permit persons to whom the Software is\n furnished to do s",
    "o, subject to the following conditions:\n\n The above copyright notice ",
    "and this permission notice shall be included in\n all copies or substan",
    "tial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", ",
    "WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT L",
    "IMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR",
    " PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRI",
    "GHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHET",
    "HER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF",
    " OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN T",
    "HE SOFTWARE.\n*/\nfunction z(a,b,c){this.s=a;this.ta=b||1;this.o=c||1};",
    "function Ya(a){this.Y=a;this.O=0}function Za(a){a=a.match($a);for(var b",
    "=0;b<a.length;b++)ab.test(a[b])&&a.splice(b,1);return new Ya(a)}var $a=",
    "/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]",
    "+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|",
    "\\s+|./g,ab=/^\\s/;function B(a,b){return a.Y[a.O+(b||0)]}Ya.prototype.",
    "next=function(){return this.Y[this.O++]};Ya.prototype.back=function(){t",
    "his.O--};Ya.prototype.empty=function(){return this.Y.length<=this.O};fu",
    "nction D(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b|",
    "|null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=type",
    "of b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;c=0;var d=[];",
    "for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.fi",
    "rstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return",
    "\"\"+b}\nfunction E(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)",
    "return!1}catch(d){return!1}return null==c?!!a.getAttribute(b):a.getAttr",
    "ibute(b,2)==c}function bb(a,b,c,d,e){return cb.call(null,a,b,l(c)?c:nul",
    "l,l(d)?d:null,e||new F)}\nfunction cb(a,b,c,d,e){b.getElementsByName&&d",
    "&&\"name\"==c?(b=b.getElementsByName(d),q(b,function(b){a.matches(b)&&e",
    ".add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.getElementsBy",
    "ClassName(d),q(b,function(b){b.className==d&&a.matches(b)&&e.add(b)})):",
    "a instanceof G?db(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsBy",
    "TagName(a.getName()),q(b,function(a){E(a,c,d)&&e.add(a)}));return e}fun",
    "ction db(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)E(b,c,d)&&a.ma",
    "tches(b)&&e.add(b),db(a,b,c,d,e)};function F(){this.o=this.j=null;this.",
    "J=0}function eb(a){this.node=a;this.next=this.D=null}function fb(a,b){i",
    "f(!a.j)return b;if(!b.j)return a;var c=a.j;b=b.j;for(var d=null,e,f=0;c",
    "&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<Ta(c.node,b.node)?(e=b,b=",
    "b.next):(e=c,c=c.next),(e.D=d)?d.next=e:a.j=e,d=e,f++;for(e=c||b;e;)e.D",
    "=d,d=d.next=e,f++,e=e.next;a.o=d;a.J=f;return a}F.prototype.unshift=fun",
    "ction(a){a=new eb(a);a.next=this.j;this.o?this.j.D=a:this.j=this.o=a;th",
    "is.j=a;this.J++};\nF.prototype.add=function(a){a=new eb(a);a.D=this.o;t",
    "his.j?this.o.next=a:this.j=this.o=a;this.o=a;this.J++};function gb(a){r",
    "eturn(a=a.j)?a.node:null}F.prototype.v=function(){return this.J};functi",
    "on hb(a){return(a=gb(a))?D(a):\"\"}F.prototype.iterator=function(a){ret",
    "urn new ib(this,!!a)};function ib(a,b){this.pa=a;this.aa=(this.G=b)?a.o",
    ":a.j;this.V=null}ib.prototype.next=function(){var a=this.aa;if(null==a)",
    "return null;var b=this.V=a;this.aa=this.G?a.D:a.next;return b.node};\ni",
    "b.prototype.remove=function(){var a=this.pa,b=this.V;if(!b)throw Error(",
    "\"Next must be called at least once before remove.\");var c=b.D;b=b.nex",
    "t;c?c.next=b:a.j=b;b?b.D=c:a.o=c;a.J--;this.V=null};function H(a){this.",
    "i=a;this.l=this.A=!1;this.K=null}function I(a){return\"\\n  \"+a.toStri",
    "ng().split(\"\\n\").join(\"\\n  \")}H.prototype.h=function(){return thi",
    "s.A};function jb(a,b){a.A=b}function kb(a,b){a.l=b}H.prototype.C=functi",
    "on(){return this.K};function J(a,b){a=a.evaluate(b);return a instanceof",
    " F?+hb(a):+a}function K(a,b){a=a.evaluate(b);return a instanceof F?hb(a",
    "):\"\"+a}function M(a,b){a=a.evaluate(b);return a instanceof F?!!a.v():",
    "!!a};function lb(a,b,c){H.call(this,a.i);this.X=a;this.ea=b;this.ja=c;t",
    "his.A=b.h()||c.h();this.l=b.l||c.l;this.X==mb&&(c.l||c.h()||4==c.i||0==",
    "c.i||!b.C()?b.l||b.h()||4==b.i||0==b.i||!c.C()||(this.K={name:c.C().nam",
    "e,I:b}):this.K={name:b.C().name,I:c})}p(lb,H);\nfunction nb(a,b,c,d,e){",
    "b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof F&&c instanceof F",
    "){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.nex",
    "t();f;f=e.next())if(a(D(d),D(f)))return!0;return!1}if(b instanceof F||c",
    " instanceof F){b instanceof F?(e=b,d=c):(e=c,d=b);f=e.iterator();for(va",
    "r h=typeof d,m=f.next();m;m=f.next()){switch(h){case \"number\":m=+D(m)",
    ";break;case \"boolean\":m=!!D(m);break;case \"string\":m=D(m);break;def",
    "ault:throw Error(\"Illegal primitive type for comparison.\");\n}if(e==b",
    "&&a(m,d)||e==c&&a(d,m))return!0}return!1}return e?\"boolean\"==typeof b",
    "||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==ty",
    "peof c?a(+b,+c):a(b,c):a(+b,+c)}lb.prototype.evaluate=function(a){retur",
    "n this.X.u(this.ea,this.ja,a)};lb.prototype.toString=function(){var a=",
    "\"Binary Expression: \"+this.X;a+=I(this.ea);return a+=I(this.ja)};func",
    "tion ob(a,b,c,d){this.sa=a;this.ha=b;this.i=c;this.u=d}ob.prototype.toS",
    "tring=function(){return this.sa};var pb={};\nfunction N(a,b,c,d){if(pb.",
    "hasOwnProperty(a))throw Error(\"Binary operator already created: \"+a);",
    "a=new ob(a,b,c,d);return pb[a.toString()]=a}N(\"div\",6,1,function(a,b,",
    "c){return J(a,c)/J(b,c)});N(\"mod\",6,1,function(a,b,c){return J(a,c)%J",
    "(b,c)});N(\"*\",6,1,function(a,b,c){return J(a,c)*J(b,c)});N(\"+\",5,1,",
    "function(a,b,c){return J(a,c)+J(b,c)});N(\"-\",5,1,function(a,b,c){retu",
    "rn J(a,c)-J(b,c)});N(\"<\",4,2,function(a,b,c){return nb(function(a,b){",
    "return a<b},a,b,c)});\nN(\">\",4,2,function(a,b,c){return nb(function(a",
    ",b){return a>b},a,b,c)});N(\"<=\",4,2,function(a,b,c){return nb(functio",
    "n(a,b){return a<=b},a,b,c)});N(\">=\",4,2,function(a,b,c){return nb(fun",
    "ction(a,b){return a>=b},a,b,c)});var mb=N(\"=\",3,2,function(a,b,c){ret",
    "urn nb(function(a,b){return a==b},a,b,c,!0)});N(\"!=\",3,2,function(a,b",
    ",c){return nb(function(a,b){return a!=b},a,b,c,!0)});N(\"and\",2,2,func",
    "tion(a,b,c){return M(a,c)&&M(b,c)});N(\"or\",1,2,function(a,b,c){return",
    " M(a,c)||M(b,c)});function qb(a,b){if(b.v()&&4!=a.i)throw Error(\"Prima",
    "ry expression must evaluate to nodeset if filter has predicate(s).\");H",
    ".call(this,a.i);this.ia=a;this.f=b;this.A=a.h();this.l=a.l}p(qb,H);qb.p",
    "rototype.evaluate=function(a){a=this.ia.evaluate(a);return rb(this.f,a)",
    "};qb.prototype.toString=function(){var a=\"Filter:\"+I(this.ia);return ",
    "a+=I(this.f)};function sb(a,b){if(b.length<a.ga)throw Error(\"Function ",
    "\"+a.m+\" expects at least\"+a.ga+\" arguments, \"+b.length+\" given\")",
    ";if(null!==a.W&&b.length>a.W)throw Error(\"Function \"+a.m+\" expects a",
    "t most \"+a.W+\" arguments, \"+b.length+\" given\");a.qa&&q(b,function(",
    "b,d){if(4!=b.i)throw Error(\"Argument \"+d+\" to function \"+a.m+\" is ",
    "not of type Nodeset: \"+b);});H.call(this,a.i);this.N=a;this.T=b;jb(thi",
    "s,a.A||pa(b,function(a){return a.h()}));kb(this,a.oa&&!b.length||a.na&&",
    "!!b.length||pa(b,function(a){return a.l}))}\np(sb,H);sb.prototype.evalu",
    "ate=function(a){return this.N.u.apply(null,ra(a,this.T))};sb.prototype.",
    "toString=function(){var a=\"Function: \"+this.N;if(this.T.length){var b",
    "=r(this.T,function(a,b){return a+I(b)},\"Arguments:\");a+=I(b)}return a",
    "};function tb(a,b,c,d,e,f,h,m){this.m=a;this.i=b;this.A=c;this.oa=d;thi",
    "s.na=!1;this.u=e;this.ga=f;this.W=k(h)?h:f;this.qa=!!m}tb.prototype.toS",
    "tring=function(){return this.m};var ub={};\nfunction O(a,b,c,d,e,f,h,m)",
    "{if(ub.hasOwnProperty(a))throw Error(\"Function already created: \"+a+",
    "\".\");ub[a]=new tb(a,b,c,d,e,f,h,m)}O(\"boolean\",2,!1,!1,function(a,b",
    "){return M(b,a)},1);O(\"ceiling\",1,!1,!1,function(a,b){return Math.cei",
    "l(J(b,a))},1);O(\"concat\",3,!1,!1,function(a,b){return r(ta(arguments,",
    "1),function(b,d){return b+K(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1",
    ",function(a,b,c){b=K(b,a);a=K(c,a);return-1!=b.indexOf(a)},2);O(\"count",
    "\",1,!1,!1,function(a,b){return b.evaluate(a).v()},1,1,!0);\nO(\"false",
    "\",2,!1,!1,function(){return!1},0);O(\"floor\",1,!1,!1,function(a,b){re",
    "turn Math.floor(J(b,a))},1);O(\"id\",4,!1,!1,function(a,b){var c=a.s,d=",
    "9==c.nodeType?c:c.ownerDocument;a=K(b,a).split(/\\s+/);var e=[];q(a,fun",
    "ction(a){a=d.getElementById(a);!a||0<=oa(e,a)||e.push(a)});e.sort(Ta);v",
    "ar f=new F;q(e,function(a){f.add(a)});return f},1);O(\"lang\",2,!1,!1,f",
    "unction(){return!1},1);O(\"last\",1,!0,!1,function(a){if(1!=arguments.l",
    "ength)throw Error(\"Function last expects ()\");return a.o},0);\nO(\"lo",
    "cal-name\",3,!1,!0,function(a,b){return(a=b?gb(b.evaluate(a)):a.s)?a.lo",
    "calName||a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"name\",3,!1,!0,func",
    "tion(a,b){return(a=b?gb(b.evaluate(a)):a.s)?a.nodeName.toLowerCase():\"",
    "\"},0,1,!0);O(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);",
    "O(\"normalize-space\",3,!1,!0,function(a,b){return(b?K(b,a):D(a.s)).rep",
    "lace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);O(\"not\"",
    ",2,!1,!1,function(a,b){return!M(b,a)},1);\nO(\"number\",1,!1,!0,functio",
    "n(a,b){return b?J(b,a):+D(a.s)},0,1);O(\"position\",1,!0,!1,function(a)",
    "{return a.ta},0);O(\"round\",1,!1,!1,function(a,b){return Math.round(J(",
    "b,a))},1);O(\"starts-with\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);r",
    "eturn 0==b.lastIndexOf(a,0)},2);O(\"string\",3,!1,!0,function(a,b){retu",
    "rn b?K(b,a):D(a.s)},0,1);O(\"string-length\",1,!1,!0,function(a,b){retu",
    "rn(b?K(b,a):D(a.s)).length},0,1);\nO(\"substring\",3,!1,!1,function(a,b",
    ",c,d){c=J(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?J(",
    "d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;v",
    "ar e=Math.max(c,0);a=K(b,a);return Infinity==d?a.substring(e):a.substri",
    "ng(e,c+Math.round(d))},2,3);O(\"substring-after\",3,!1,!1,function(a,b,",
    "c){b=K(b,a);a=K(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.le",
    "ngth)},2);\nO(\"substring-before\",3,!1,!1,function(a,b,c){b=K(b,a);a=K",
    "(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);O(\"sum\",1,",
    "!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c",
    ";c=a.next())b+=+D(c);return b},1,1,!0);O(\"translate\",3,!1,!1,function",
    "(a,b,c,d){b=K(b,a);c=K(c,a);var e=K(d,a);a={};for(d=0;d<c.length;d++){v",
    "ar f=c.charAt(d);f in a||(a[f]=e.charAt(d))}c=\"\";for(d=0;d<b.length;d",
    "++)f=b.charAt(d),c+=f in a?a[f]:f;return c},3);O(\"true\",2,!1,!1,funct",
    "ion(){return!0},0);function G(a,b){this.la=a;this.fa=k(b)?b:null;this.H",
    "=null;switch(a){case \"comment\":this.H=8;break;case \"text\":this.H=3;",
    "break;case \"processing-instruction\":this.H=7;break;case \"node\":brea",
    "k;default:throw Error(\"Unexpected argument\");}}function vb(a){return",
    "\"comment\"==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==a",
    "}G.prototype.matches=function(a){return null===this.H||this.H==a.nodeTy",
    "pe};G.prototype.getName=function(){return this.la};\nG.prototype.toStri",
    "ng=function(){var a=\"Kind Test: \"+this.la;null===this.fa||(a+=I(this.",
    "fa));return a};function wb(a){H.call(this,3);this.ka=a.substring(1,a.le",
    "ngth-1)}p(wb,H);wb.prototype.evaluate=function(){return this.ka};wb.pro",
    "totype.toString=function(){return\"Literal: \"+this.ka};function xb(a,b",
    "){this.m=a.toLowerCase();a=\"*\"==this.m?\"*\":\"http://www.w3.org/1999",
    "/xhtml\";this.P=b?b.toLowerCase():a}xb.prototype.matches=function(a){va",
    "r b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.localName)?a.localName:a.no",
    "deName;return\"*\"!=this.m&&this.m!=b.toLowerCase()?!1:\"*\"==this.P?!0",
    ":this.P==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.o",
    "rg/1999/xhtml\")};xb.prototype.getName=function(){return this.m};\nxb.p",
    "rototype.toString=function(){return\"Name Test: \"+(\"http://www.w3.org",
    "/1999/xhtml\"==this.P?\"\":this.P+\":\")+this.m};function yb(a){H.call(",
    "this,1);this.ma=a}p(yb,H);yb.prototype.evaluate=function(){return this.",
    "ma};yb.prototype.toString=function(){return\"Number: \"+this.ma};functi",
    "on zb(a,b){H.call(this,a.i);this.ca=a;this.L=b;this.A=a.h();this.l=a.l;",
    "1==this.L.length&&(a=this.L[0],a.U||a.B!=Ab||(a=a.S,\"*\"!=a.getName()&",
    "&(this.K={name:a.getName(),I:null})))}p(zb,H);function Bb(){H.call(this",
    ",4)}p(Bb,H);Bb.prototype.evaluate=function(a){var b=new F;a=a.s;9==a.no",
    "deType?b.add(a):b.add(a.ownerDocument);return b};Bb.prototype.toString=",
    "function(){return\"Root Helper Expression\"};function Cb(){H.call(this,",
    "4)}p(Cb,H);Cb.prototype.evaluate=function(a){var b=new F;b.add(a.s);ret",
    "urn b};\nCb.prototype.toString=function(){return\"Context Helper Expres",
    "sion\"};function Db(a){return\"/\"==a||\"//\"==a}\nzb.prototype.evaluat",
    "e=function(a){var b=this.ca.evaluate(a);if(!(b instanceof F))throw Erro",
    "r(\"Filter expression must evaluate to nodeset.\");a=this.L;for(var c=0",
    ",d=a.length;c<d&&b.v();c++){var e=a[c],f=b.iterator(e.B.G);if(e.h()||e.",
    "B!=Eb)if(e.h()||e.B!=Fb){var h=f.next();for(b=e.evaluate(new z(h));null",
    "!=(h=f.next());)h=e.evaluate(new z(h)),b=fb(b,h)}else h=f.next(),b=e.ev",
    "aluate(new z(h));else{for(h=f.next();(b=f.next())&&(!h.contains||h.cont",
    "ains(b))&&b.compareDocumentPosition(h)&8;h=b);b=e.evaluate(new z(h))}}r",
    "eturn b};\nzb.prototype.toString=function(){var a=\"Path Expression:\"+",
    "I(this.ca);if(this.L.length){var b=r(this.L,function(a,b){return a+I(b)",
    "},\"Steps:\");a+=I(b)}return a};function P(a,b){this.f=a;this.G=!!b}fun",
    "ction rb(a,b,c){for(c=c||0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterat",
    "or(),f=b.v(),h,m=0;h=e.next();m++){var x=a.G?f-m:m+1;h=d.evaluate(new z",
    "(h,x,f));if(\"number\"==typeof h)x=x==h;else if(\"string\"==typeof h||",
    "\"boolean\"==typeof h)x=!!h;else if(h instanceof F)x=0<h.v();else throw",
    " Error(\"Predicate.evaluate returned an unexpected type.\");x||e.remove",
    "()}return b}P.prototype.C=function(){return 0<this.f.length?this.f[0].C",
    "():null};\nP.prototype.h=function(){for(var a=0;a<this.f.length;a++){va",
    "r b=this.f[a];if(b.h()||1==b.i||0==b.i)return!0}return!1};P.prototype.v",
    "=function(){return this.f.length};P.prototype.toString=function(){retur",
    "n r(this.f,function(a,b){return a+I(b)},\"Predicates:\")};function Q(a,",
    "b,c,d){H.call(this,4);this.B=a;this.S=b;this.f=c||new P([]);this.U=!!d;",
    "b=this.f.C();a.va&&b&&(this.K={name:b.name,I:b.I});this.A=this.f.h()}p(",
    "Q,H);\nQ.prototype.evaluate=function(a){var b=a.s,c=this.C(),d=null,e=n",
    "ull,f=0;c&&(d=c.name,e=c.I?K(c.I,a):null,f=1);if(this.U)if(this.h()||th",
    "is.B!=Gb)if(b=(new Q(Hb,new G(\"node\"))).evaluate(a).iterator(),c=b.ne",
    "xt())for(a=this.u(c,d,e,f);null!=(c=b.next());)a=fb(a,this.u(c,d,e,f));",
    "else a=new F;else a=bb(this.S,b,d,e),a=rb(this.f,a,f);else a=this.u(a.s",
    ",d,e,f);return a};Q.prototype.u=function(a,b,c,d){a=this.B.N(this.S,a,b",
    ",c);return a=rb(this.f,a,d)};\nQ.prototype.toString=function(){var a=\"",
    "Step:\"+I(\"Operator: \"+(this.U?\"//\":\"/\"));this.B.m&&(a+=I(\"Axis:",
    " \"+this.B));a+=I(this.S);if(this.f.v()){var b=r(this.f.f,function(a,b)",
    "{return a+I(b)},\"Predicates:\");a+=I(b)}return a};function Ib(a,b,c,d)",
    "{this.m=a;this.N=b;this.G=c;this.va=d}Ib.prototype.toString=function(){",
    "return this.m};var Jb={};function R(a,b,c,d){if(Jb.hasOwnProperty(a))th",
    "row Error(\"Axis already created: \"+a);b=new Ib(a,b,c,!!d);return Jb[a",
    "]=b}\nR(\"ancestor\",function(a,b){for(var c=new F;b=b.parentNode;)a.ma",
    "tches(b)&&c.unshift(b);return c},!0);R(\"ancestor-or-self\",function(a,",
    "b){var c=new F;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);retu",
    "rn c},!0);\nvar Ab=R(\"attribute\",function(a,b){var c=new F,d=a.getNam",
    "e();if(b=b.attributes)if(a instanceof G&&null===a.H||\"*\"==d)for(a=0;d",
    "=b[a];a++)c.add(d);else(d=b.getNamedItem(d))&&c.add(d);return c},!1),Gb",
    "=R(\"child\",function(a,b,c,d,e){c=l(c)?c:null;d=l(d)?d:null;e=e||new F",
    ";for(b=b.firstChild;b;b=b.nextSibling)E(b,c,d)&&a.matches(b)&&e.add(b);",
    "return e},!1,!0);R(\"descendant\",bb,!1,!0);\nvar Hb=R(\"descendant-or-",
    "self\",function(a,b,c,d){var e=new F;E(b,c,d)&&a.matches(b)&&e.add(b);r",
    "eturn bb(a,b,c,d,e)},!1,!0),Eb=R(\"following\",function(a,b,c,d){var e=",
    "new F;do for(var f=b;f=f.nextSibling;)E(f,c,d)&&a.matches(f)&&e.add(f),",
    "e=bb(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);R(\"following-si",
    "bling\",function(a,b){for(var c=new F;b=b.nextSibling;)a.matches(b)&&c.",
    "add(b);return c},!1);R(\"namespace\",function(){return new F},!1);\nvar",
    " Kb=R(\"parent\",function(a,b){var c=new F;if(9==b.nodeType)return c;if",
    "(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(",
    "b)&&c.add(b);return c},!1),Fb=R(\"preceding\",function(a,b,c,d){var e=n",
    "ew F,f=[];do f.unshift(b);while(b=b.parentNode);for(var h=1,m=f.length;",
    "h<m;h++){var x=[];for(b=f[h];b=b.previousSibling;)x.unshift(b);for(var ",
    "C=0,t=x.length;C<t;C++)b=x[C],E(b,c,d)&&a.matches(b)&&e.add(b),e=bb(a,b",
    ",c,d,e)}return e},!0,!0);\nR(\"preceding-sibling\",function(a,b){for(va",
    "r c=new F;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0)",
    ";var Lb=R(\"self\",function(a,b){var c=new F;a.matches(b)&&c.add(b);ret",
    "urn c},!1);function Mb(a){H.call(this,1);this.ba=a;this.A=a.h();this.l=",
    "a.l}p(Mb,H);Mb.prototype.evaluate=function(a){return-J(this.ba,a)};Mb.p",
    "rototype.toString=function(){return\"Unary Expression: -\"+I(this.ba)};",
    "function Nb(a){H.call(this,4);this.R=a;jb(this,pa(this.R,function(a){re",
    "turn a.h()}));kb(this,pa(this.R,function(a){return a.l}))}p(Nb,H);Nb.pr",
    "ototype.evaluate=function(a){var b=new F;q(this.R,function(c){c=c.evalu",
    "ate(a);if(!(c instanceof F))throw Error(\"Path expression must evaluate",
    " to NodeSet.\");b=fb(b,c)});return b};Nb.prototype.toString=function(){",
    "return r(this.R,function(a,b){return a+I(b)},\"Union Expression:\")};fu",
    "nction Ob(a,b){this.a=a;this.ra=b}function Pb(a){for(var b,c=[];;){S(a,",
    "\"Missing right hand side of binary expression.\");b=Qb(a);var d=a.a.ne",
    "xt();if(!d)break;var e=(d=pb[d]||null)&&d.ha;if(!e){a.a.back();break}fo",
    "r(;c.length&&e<=c[c.length-1].ha;)b=new lb(c.pop(),c.pop(),b);c.push(b,",
    "d)}for(;c.length;)b=new lb(c.pop(),c.pop(),b);return b}function S(a,b){",
    "if(a.a.empty())throw Error(b);}function Rb(a,b){a=a.a.next();if(a!=b)th",
    "row Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction Sb(a){a",
    "=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Tb(a){",
    "a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\");ret",
    "urn new wb(a)}\nfunction Ub(a){var b=[];if(Db(B(a.a))){var c=a.a.next()",
    ";var d=B(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&",
    "&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new Bb;d=new Bb;S(a,\"Miss",
    "ing next location step.\");c=Vb(a,c);b.push(c)}else{a:{c=B(a.a);d=c.cha",
    "rAt(0);switch(d){case \"$\":throw Error(\"Variable reference not allowe",
    "d in HTML XPath\");case \"(\":a.a.next();c=Pb(a);S(a,'unclosed \"(\"');",
    "Rb(a,\")\");break;case '\"':case \"'\":c=Tb(a);break;default:if(isNaN(+",
    "c))if(!vb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==B(a.a,\n1)){c=a.a.next()",
    ";c=ub[c]||null;a.a.next();for(d=[];\")\"!=B(a.a);){S(a,\"Missing functi",
    "on argument list.\");d.push(Pb(a));if(\",\"!=B(a.a))break;a.a.next()}S(",
    "a,\"Unclosed function argument list.\");Sb(a);c=new sb(c,d)}else{c=null",
    ";break a}else c=new yb(+a.a.next())}\"[\"==B(a.a)&&(d=new P(Wb(a)),c=ne",
    "w qb(c,d))}if(c)if(Db(B(a.a)))d=c;else return c;else c=Vb(a,\"/\"),d=ne",
    "w Cb,b.push(c)}for(;Db(B(a.a));)c=a.a.next(),S(a,\"Missing next locatio",
    "n step.\"),c=Vb(a,c),b.push(c);return new zb(d,b)}\nfunction Vb(a,b){if",
    "(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');i",
    "f(\".\"==B(a.a)){var c=new Q(Lb,new G(\"node\"));a.a.next();return c}if",
    "(\"..\"==B(a.a))return c=new Q(Kb,new G(\"node\")),a.a.next(),c;if(\"@",
    "\"==B(a.a)){var d=Ab;a.a.next();S(a,\"Missing attribute name\")}else if",
    "(\"::\"==B(a.a,1)){if(!/(?![0-9])[\\w]/.test(B(a.a).charAt(0)))throw Er",
    "ror(\"Bad token: \"+a.a.next());var e=a.a.next();d=Jb[e]||null;if(!d)th",
    "row Error(\"No axis with name: \"+e);a.a.next();S(a,\"Missing node name",
    "\")}else d=Gb;e=\nB(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"",
    "(\"==B(a.a,1)){if(!vb(e))throw Error(\"Invalid node type: \"+e);e=a.a.n",
    "ext();if(!vb(e))throw Error(\"Invalid type name: \"+e);Rb(a,\"(\");S(a,",
    "\"Bad nodetype\");var f=B(a.a).charAt(0),h=null;if('\"'==f||\"'\"==f)h=",
    "Tb(a);S(a,\"Bad nodetype\");Sb(a);e=new G(e,h)}else if(e=a.a.next(),f=e",
    ".indexOf(\":\"),-1==f)e=new xb(e);else{h=e.substring(0,f);if(\"*\"==h)v",
    "ar m=\"*\";else if(m=a.ra(h),!m)throw Error(\"Namespace prefix not decl",
    "ared: \"+h);e=e.substr(f+1);e=new xb(e,m)}else throw Error(\"Bad token:",
    " \"+\na.a.next());a=new P(Wb(a),d.G);return c||new Q(d,e,a,\"//\"==b)}f",
    "unction Wb(a){for(var b=[];\"[\"==B(a.a);){a.a.next();S(a,\"Missing pre",
    "dicate expression.\");var c=Pb(a);b.push(c);S(a,\"Unclosed predicate ex",
    "pression.\");Rb(a,\"]\")}return b}function Qb(a){if(\"-\"==B(a.a))retur",
    "n a.a.next(),new Mb(Qb(a));var b=Ub(a);if(\"|\"!=B(a.a))a=b;else{for(b=",
    "[b];\"|\"==a.a.next();)S(a,\"Missing next union location path.\"),b.pus",
    "h(Ub(a));a.a.back();a=new Nb(b)}return a};function Xb(a){switch(a.nodeT",
    "ype){case 1:return ja(Yb,a);case 9:return Xb(a.documentElement);case 11",
    ":case 10:case 6:case 12:return Zb;default:return a.parentNode?Xb(a.pare",
    "ntNode):Zb}}function Zb(){return null}function Yb(a,b){if(a.prefix==b)r",
    "eturn a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttri",
    "buteNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parentNode",
    "&&9!=a.parentNode.nodeType?Yb(a.parentNode,b):null};function $b(a,b){if",
    "(!a.length)throw Error(\"Empty XPath expression.\");a=Za(a);if(a.empty(",
    "))throw Error(\"Invalid XPath expression.\");b?\"function\"==ca(b)||(b=",
    "ia(b.lookupNamespaceURI,b)):b=function(){return null};var c=Pb(new Ob(a",
    ",b));if(!a.empty())throw Error(\"Bad token: \"+a.next());this.evaluate=",
    "function(a,b){a=c.evaluate(new z(a));return new U(a,b)}}\nfunction U(a,",
    "b){if(0==b)if(a instanceof F)b=4;else if(\"string\"==typeof a)b=2;else ",
    "if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else thro",
    "w Error(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a ins",
    "tanceof F))throw Error(\"value could not be converted to the specified ",
    "type\");this.resultType=b;switch(b){case 2:this.stringValue=a instanceo",
    "f F?hb(a):\"\"+a;break;case 1:this.numberValue=a instanceof F?+hb(a):+a",
    ";break;case 3:this.booleanValue=a instanceof F?0<a.v():!!a;break;case 4",
    ":case 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();",
    "e;e=c.next())d.push(e);this.snapshotLength=a.v();this.invalidIteratorSt",
    "ate=!1;break;case 8:case 9:this.singleNodeValue=gb(a);break;default:thr",
    "ow Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNext=funct",
    "ion(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong result ",
    "type\");return f>=d.length?null:d[f++]};this.snapshotItem=function(a){i",
    "f(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong result type\"",
    ");return a>=d.length||0>a?null:d[a]}}\nU.ANY_TYPE=0;U.NUMBER_TYPE=1;U.S",
    "TRING_TYPE=2;U.BOOLEAN_TYPE=3;U.UNORDERED_NODE_ITERATOR_TYPE=4;U.ORDERE",
    "D_NODE_ITERATOR_TYPE=5;U.UNORDERED_NODE_SNAPSHOT_TYPE=6;U.ORDERED_NODE_",
    "SNAPSHOT_TYPE=7;U.ANY_UNORDERED_NODE_TYPE=8;U.FIRST_ORDERED_NODE_TYPE=9",
    ";function ac(a){this.lookupNamespaceURI=Xb(a)}\nba(\"wgxpath.install\",",
    "function(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.documen",
    "t;if(!c.evaluate||b)a.XPathResult=U,c.evaluate=function(a,b,c,h){return",
    "(new $b(a,c)).evaluate(b,h)},c.createExpression=function(a,b){return ne",
    "w $b(a,b)},c.createNSResolver=function(a){return new ac(a)}});var V={};",
    "V.Z=function(){var a={za:\"http://www.w3.org/2000/svg\"};return functio",
    "n(b){return a[b]||null}}();\nV.u=function(a,b,c){var d=w(a);if(!d.docum",
    "entElement)return null;try{for(var e=d.createNSResolver?d.createNSResol",
    "ver(d.documentElement):V.Z,f={},h=d.getElementsByTagName(\"*\"),m=0;m<h",
    ".length;++m){var x=h[m],C=x.namespaceURI;if(C&&!f[C]){var t=x.lookupPre",
    "fix(C);if(!t){var A=C.match(\".*/(\\\\w+)/?$\");t=A?A[1]:\"xhtml\"}f[C]",
    "=t}}var L={},T;for(T in f)L[f[T]]=T;e=function(a){return L[a]||null};tr",
    "y{return d.evaluate(b,a,e,c,null)}catch(Ca){if(\"TypeError\"===Ca.name)",
    "return e=d.createNSResolver?d.createNSResolver(d.documentElement):\nV.Z",
    ",d.evaluate(b,a,e,c,null);throw Ca;}}catch(Ca){throw new Aa(32,\"Unable",
    " to locate an element with the xpath expression \"+b+\" because of the ",
    "following error:\\n\"+Ca);}};V.$=function(a,b){if(!a||1!=a.nodeType)thr",
    "ow new Aa(32,'The result of the xpath expression \"'+b+'\" is: '+a+\". ",
    "It should be an element.\");};\nV.ua=function(a,b){var c=function(){var",
    " c=V.u(b,a,9);return c?c.singleNodeValue||null:b.selectSingleNode?(c=w(",
    "b),c.setProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.sele",
    "ctSingleNode(a)):null}();null===c||V.$(c,a);return c};\nV.xa=function(a",
    ",b){var c=function(){var c=V.u(b,a,7);if(c){for(var e=c.snapshotLength,",
    "f=[],h=0;h<e;++h)f.push(c.snapshotItem(h));return f}return b.selectNode",
    "s?(c=w(b),c.setProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\")",
    ",b.selectNodes(a)):[]}();q(c,function(b){V.$(b,a)});return c};function ",
    "bc(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d}g=bc.prot",
    "otype;g.clone=function(){return new bc(this.top,this.right,this.bottom,",
    "this.left)};g.toString=function(){return\"(\"+this.top+\"t, \"+this.rig",
    "ht+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"};g.contains=function(a)",
    "{return this&&a?a instanceof bc?a.left>=this.left&&a.right<=this.right&",
    "&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right",
    "&&a.y>=this.top&&a.y<=this.bottom:!1};\ng.expand=function(a,b,c,d){ea(a",
    ")?(this.top-=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-",
    "=a.left):(this.top-=a,this.right+=Number(b),this.bottom+=Number(c),this",
    ".left-=Number(d));return this};g.ceil=function(){this.top=Math.ceil(thi",
    "s.top);this.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bott",
    "om);this.left=Math.ceil(this.left);return this};\ng.floor=function(){th",
    "is.top=Math.floor(this.top);this.right=Math.floor(this.right);this.bott",
    "om=Math.floor(this.bottom);this.left=Math.floor(this.left);return this}",
    ";g.round=function(){this.top=Math.round(this.top);this.right=Math.round",
    "(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(t",
    "his.left);return this};g.translate=function(a,b){a instanceof v?(this.l",
    "eft+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,",
    "this.right+=a,n(b)&&(this.top+=b,this.bottom+=b));return this};\ng.scal",
    "e=function(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;this.top*=b;this.",
    "bottom*=b;return this};function W(a,b,c,d){this.left=a;this.top=b;this.",
    "width=c;this.height=d}g=W.prototype;g.clone=function(){return new W(thi",
    "s.left,this.top,this.width,this.height)};g.toString=function(){return\"",
    "(\"+this.left+\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+",
    "\"h)\"};g.contains=function(a){return a instanceof v?a.x>=this.left&&a.",
    "x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.",
    "left<=a.left&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&th",
    "is.top+this.height>=a.top+a.height};\ng.ceil=function(){this.left=Math.",
    "ceil(this.left);this.top=Math.ceil(this.top);this.width=Math.ceil(this.",
    "width);this.height=Math.ceil(this.height);return this};g.floor=function",
    "(){this.left=Math.floor(this.left);this.top=Math.floor(this.top);this.w",
    "idth=Math.floor(this.width);this.height=Math.floor(this.height);return ",
    "this};g.round=function(){this.left=Math.round(this.left);this.top=Math.",
    "round(this.top);this.width=Math.round(this.width);this.height=Math.roun",
    "d(this.height);return this};\ng.translate=function(a,b){a instanceof v?",
    "(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(this.top+=b));retur",
    "n this};g.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;thi",
    "s.top*=b;this.height*=b;return this};var cc=\"function\"===typeof Shado",
    "wRoot;function dc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType",
    "&&11!=a.nodeType;)a=a.parentNode;return y(a)?a:null}\nfunction X(a,b){b",
    "=na(b);if(\"float\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat",
    "\";a:{var c=b;var d=w(a);if(d.defaultView&&d.defaultView.getComputedSty",
    "le&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyVa",
    "lue(c)||\"\";break a}c=\"\"}a=c||ec(a,b);if(null===a)a=null;else if(0<=",
    "oa(va,b)){b:{var e=a.match(ya);if(e&&(b=Number(e[1]),c=Number(e[2]),d=N",
    "umber(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<",
    "=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(za))if(b=Nu",
    "mber(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&",
    "0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=u",
    "a[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&",
    "(c=c.replace(wa,\"#$1$1$2$2$3$3\")),!xa.test(c))){b=null;break b}b=[par",
    "seInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,",
    "2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunction ec(a",
    ",b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&\"function\"==ca(c.getP",
    "ropertyValue)&&(d=c.getPropertyValue(b));return\"inherit\"!=d?k(d)?d:nu",
    "ll:(a=dc(a))?ec(a,b):null}\nfunction fc(a,b,c){function d(a){var b=gc(a",
    ");return 0<b.height&&0<b.width?!0:y(a,\"PATH\")&&(0<b.height||0<b.width",
    ")?(a=X(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"hidden\"!=X(a,\"ove",
    "rflow\")&&pa(a.childNodes,function(a){return 3==a.nodeType||y(a)&&d(a)}",
    ")}function e(a){return hc(a)==Y&&qa(a.childNodes,function(a){return!y(a",
    ")||e(a)||!d(a)})}if(!y(a))throw Error(\"Argument to isShown must be of ",
    "type Element\");if(y(a,\"BODY\"))return!0;var f=dc(a);if(f&&y(f,\"DETAI",
    "LS\")&&!f.open&&!y(a,\"SUMMARY\"))return!1;if(y(a,\n\"OPTION\")||y(a,\"",
    "OPTGROUP\"))return a=Wa(a,function(a){return y(a,\"SELECT\")}),!!a&&fc(",
    "a,!0,c);if(f=ic(a))return!!f.da&&0<f.rect.width&&0<f.rect.height&&fc(f.",
    "da,b,c);if(y(a,\"INPUT\")&&\"hidden\"==a.type.toLowerCase()||y(a,\"NOSC",
    "RIPT\"))return!1;f=X(a,\"visibility\");return\"collapse\"!=f&&\"hidden",
    "\"!=f&&c(a)&&(b||0!=jc(a))&&d(a)?!e(a):!1}\nfunction kc(a){function b(a",
    "){if(y(a)&&\"none\"==X(a,\"display\"))return!1;a:{var c=a.parentNode;if",
    "(a.getDestinationInsertionPoints){var e=a.getDestinationInsertionPoints",
    "();if(0<e.length){a=e[e.length-1];break a}}a=c&&c.shadowRoot&&void 0!==",
    "a.assignedSlot?a.assignedSlot?a.assignedSlot.parentNode:null:c}return c",
    "c&&a instanceof ShadowRoot||a&&(9==a.nodeType||11==a.nodeType)?!0:!!a&&",
    "b(a)}return fc(a,!1,b)}var Y=\"hidden\";\nfunction hc(a){function b(a){",
    "function b(a){if(a==h)return!0;var b=X(a,\"display\");return 0==b.lastI",
    "ndexOf(\"inline\",0)||\"contents\"==b||\"absolute\"==c&&\"static\"==X(a",
    ",\"position\")?!1:!0}var c=X(a,\"position\");if(\"fixed\"==c)return C=!",
    "0,a==h?null:h;for(a=dc(a);a&&!b(a);)a=dc(a);return a}function c(a){var ",
    "b=a;if(\"visible\"==x)if(a==h&&m)b=m;else if(a==m)return{x:\"visible\",",
    "y:\"visible\"};b={x:X(b,\"overflow-x\"),y:X(b,\"overflow-y\")};a==h&&(b",
    ".x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y);ret",
    "urn b}function d(a){if(a==\nh){var b=(new Xa(f)).M;a=b.scrollingElement",
    "?b.scrollingElement:b.body||b.documentElement;b=b.parentWindow||b.defau",
    "ltView;a=new v(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)}",
    "else a=new v(a.scrollLeft,a.scrollTop);return a}var e=lc(a),f=w(a),h=f.",
    "documentElement,m=f.body,x=X(h,\"overflow\"),C;for(a=b(a);a;a=b(a)){var",
    " t=c(a);if(\"visible\"!=t.x||\"visible\"!=t.y){var A=gc(a);if(0==A.widt",
    "h||0==A.height)return Y;var L=e.right<A.left,T=e.bottom<A.top;if(L&&\"h",
    "idden\"==t.x||T&&\"hidden\"==t.y)return Y;\nif(L&&\"visible\"!=t.x||T&&",
    "\"visible\"!=t.y){L=d(a);T=e.bottom<A.top-L.y;if(e.right<A.left-L.x&&\"",
    "visible\"!=t.x||T&&\"visible\"!=t.x)return Y;e=hc(a);return e==Y?Y:\"sc",
    "roll\"}L=e.left>=A.left+A.width;A=e.top>=A.top+A.height;if(L&&\"hidden",
    "\"==t.x||A&&\"hidden\"==t.y)return Y;if(L&&\"visible\"!=t.x||A&&\"visib",
    "le\"!=t.y){if(C&&(t=d(a),e.left>=h.scrollWidth-t.x||e.right>=h.scrollHe",
    "ight-t.y))return Y;e=hc(a);return e==Y?Y:\"scroll\"}}}return\"none\"}\n",
    "function gc(a){var b=ic(a);if(b)return b.rect;if(y(a,\"HTML\"))return a",
    "=w(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,a=",
    "\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new Oa(a.client",
    "Width,a.clientHeight),new W(0,0,a.width,a.height);try{var c=a.getBoundi",
    "ngClientRect()}catch(d){return new W(0,0,0,0)}return new W(c.left,c.top",
    ",c.right-c.left,c.bottom-c.top)}\nfunction ic(a){var b=y(a,\"MAP\");if(",
    "!b&&!y(a,\"AREA\"))return null;var c=b?a:y(a.parentNode,\"MAP\")?a.pare",
    "ntNode:null,d=null,e=null;c&&c.name&&(d=V.ua('/descendant::*[@usemap = ",
    "\"#'+c.name+'\"]',w(c)))&&(e=gc(d),b||\"default\"==a.shape.toLowerCase(",
    ")||(a=mc(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.min(Math.max(",
    "a.top,0),e.height),e=new W(b+e.left,c+e.top,Math.min(a.width,e.width-b)",
    ",Math.min(a.height,e.height-c))));return{da:d,rect:e||new W(0,0,0,0)}}",
    "\nfunction mc(a){var b=a.shape.toLowerCase();a=a.coords.split(\",\");if",
    "(\"rect\"==b&&4==a.length){b=a[0];var c=a[1];return new W(b,c,a[2]-b,a[",
    "3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new W(a[0]-b,a[1]-b,2",
    "*b,2*b);if(\"poly\"==b&&2<a.length){b=a[0];c=a[1];for(var d=b,e=c,f=2;f",
    "+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f",
    "+1]),e=Math.max(e,a[f+1]);return new W(b,c,d-b,e-c)}return new W(0,0,0,",
    "0)}function lc(a){a=gc(a);return new bc(a.top,a.left+a.width,a.top+a.he",
    "ight,a.left)}\nfunction nc(a){return a.replace(/^[^\\S\\xa0]+|[^\\S\\xa",
    "0]+$/g,\"\")}\nfunction oc(a,b,c){if(y(a,\"BR\"))b.push(\"\");else{var ",
    "d=y(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=oa(pc,e)),h=k(a.previousEle",
    "mentSibling)?a.previousElementSibling:Ra(a.previousSibling);h=h?X(h,\"d",
    "isplay\"):\"\";var m=X(a,\"float\")||X(a,\"cssFloat\")||X(a,\"styleFloa",
    "t\");!f||\"run-in\"==h&&\"none\"==m||/^[\\s\\xa0]*$/.test(b[b.length-1]",
    "||\"\")||b.push(\"\");var x=kc(a),C=null,t=null;x&&(C=X(a,\"white-space",
    "\"),t=X(a,\"text-transform\"));q(a.childNodes,function(a){c(a,b,x,C,t)}",
    ");a=b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||ka(a)||\n(b[b.length",
    "-1]+=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test(a)&&b.push(\"\")}}f",
    "unction qc(a,b){oc(a,b,function(a,b,e,f,h){3==a.nodeType&&e?rc(a,b,f,h)",
    ":y(a)&&qc(a,b)})}var pc=\"inline inline-block inline-table none table-c",
    "ell table-column table-column-group\".split(\" \");\nfunction rc(a,b,c,",
    "d){a=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/g,\"\");a=a.replace(/",
    "(\\r\\n|\\r|\\n)/g,\"\\n\");if(\"normal\"==c||\"nowrap\"==c)a=a.replace",
    "(/\\n/g,\" \");a=\"pre\"==c||\"pre-wrap\"==c?a.replace(/[ \\f\\t\\v\\u2",
    "028\\u2029]/g,\"\\u00a0\"):a.replace(/[ \\f\\t\\v\\u2028\\u2029]+/g,\" ",
    "\");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g,function(a,b,c){retur",
    "n b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUpperCase():\"lowercase\"=",
    "=d&&(a=a.toLowerCase());c=b.pop()||\"\";ka(c)&&0==a.lastIndexOf(\" \",0",
    ")&&(a=a.substr(1));b.push(c+a)}\nfunction jc(a){var b=1,c=X(a,\"opacity",
    "\");c&&(b=Number(c));(a=dc(a))&&(b*=jc(a));return b}\nfunction sc(a,b,c",
    ",d,e){if(3==a.nodeType&&c)rc(a,b,d,e);else if(y(a))if(y(a,\"CONTENT\")|",
    "|y(a,\"SLOT\")){for(var f=a;f.parentNode;)f=f.parentNode;f instanceof S",
    "hadowRoot?(a=y(a,\"CONTENT\")?a.getDistributedNodes():a.assignedNodes()",
    ",q(a,function(a){sc(a,b,c,d,e)})):tc(a,b)}else if(y(a,\"SHADOW\")){for(",
    "f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowRoot&&(a=f))for(",
    "a=a.olderShadowRoot;a;)q(a.childNodes,function(a){sc(a,b,c,d,e)}),a=a.o",
    "lderShadowRoot}else tc(a,b)}\nfunction tc(a,b){a.shadowRoot&&q(a.shadow",
    "Root.childNodes,function(a){sc(a,b,!0,null,null)});oc(a,b,function(a,b,",
    "e,f,h){var c=null;1==a.nodeType?c=a:3==a.nodeType&&(c=a);null!=c&&(null",
    "!=c.assignedSlot||c.getDestinationInsertionPoints&&0<c.getDestinationIn",
    "sertionPoints().length)||sc(a,b,e,f,h)})};Na();Na();function uc(a,b){th",
    "is.w={};this.g=[];this.F=0;var c=arguments.length;if(1<c){if(c%2)throw ",
    "Error(\"Uneven number of arguments\");for(var d=0;d<c;d+=2)this.set(arg",
    "uments[d],arguments[d+1])}else a&&this.addAll(a)}function vc(a){wc(a);r",
    "eturn a.g.concat()}g=uc.prototype;g.clear=function(){this.w={};this.F=t",
    "his.g.length=0};g.remove=function(a){return Object.prototype.hasOwnProp",
    "erty.call(this.w,a)?(delete this.w[a],this.F--,this.g.length>2*this.F&&",
    "wc(this),!0):!1};\nfunction wc(a){if(a.F!=a.g.length){for(var b=0,c=0;b",
    "<a.g.length;){var d=a.g[b];Object.prototype.hasOwnProperty.call(a.w,d)&",
    "&(a.g[c++]=d);b++}a.g.length=c}if(a.F!=a.g.length){var e={};for(c=b=0;b",
    "<a.g.length;)d=a.g[b],Object.prototype.hasOwnProperty.call(e,d)||(a.g[c",
    "++]=d,e[d]=1),b++;a.g.length=c}}g.get=function(a,b){return Object.proto",
    "type.hasOwnProperty.call(this.w,a)?this.w[a]:b};g.set=function(a,b){Obj",
    "ect.prototype.hasOwnProperty.call(this.w,a)||(this.F++,this.g.push(a));",
    "this.w[a]=b};\ng.addAll=function(a){if(a instanceof uc){var b=vc(a);wc(",
    "a);for(var c=[],d=0;d<a.g.length;d++)c.push(a.w[a.g[d]]);a=c}else{b=[];",
    "d=0;for(var e in a)b[d++]=e;d=[];e=0;for(c in a)d[e++]=a[c];a=d}for(c=0",
    ";c<b.length;c++)this.set(b[c],a[c])};g.forEach=function(a,b){for(var c=",
    "vc(this),d=0;d<c.length;d++){var e=c[d],f=this.get(e);a.call(b,f,e,this",
    ")}};g.clone=function(){return new uc(this)};var xc={};function Z(a,b,c)",
    "{ea(a)&&(a=a.b);a=new yc(a);!b||b in xc&&!c||(xc[b]={key:a,shift:!1},c&",
    "&(xc[c]={key:a,shift:!0}));return a}function yc(a){this.code=a}Z(8);Z(9",
    ");Z(13);var zc=Z(16),Ac=Z(17),Bc=Z(18);Z(19);Z(20);Z(27);Z(32,\" \");Z(",
    "33);Z(34);Z(35);Z(36);Z(37);Z(38);Z(39);Z(40);Z(44);Z(45);Z(46);Z(48,\"",
    "0\",\")\");Z(49,\"1\",\"!\");Z(50,\"2\",\"@\");Z(51,\"3\",\"#\");Z(52,",
    "\"4\",\"$\");Z(53,\"5\",\"%\");Z(54,\"6\",\"^\");Z(55,\"7\",\"&\");Z(56",
    ",\"8\",\"*\");Z(57,\"9\",\"(\");Z(65,\"a\",\"A\");Z(66,\"b\",\"B\");Z(6",
    "7,\"c\",\"C\");Z(68,\"d\",\"D\");\nZ(69,\"e\",\"E\");Z(70,\"f\",\"F\");",
    "Z(71,\"g\",\"G\");Z(72,\"h\",\"H\");Z(73,\"i\",\"I\");Z(74,\"j\",\"J\")",
    ";Z(75,\"k\",\"K\");Z(76,\"l\",\"L\");Z(77,\"m\",\"M\");Z(78,\"n\",\"N\"",
    ");Z(79,\"o\",\"O\");Z(80,\"p\",\"P\");Z(81,\"q\",\"Q\");Z(82,\"r\",\"R",
    "\");Z(83,\"s\",\"S\");Z(84,\"t\",\"T\");Z(85,\"u\",\"U\");Z(86,\"v\",\"",
    "V\");Z(87,\"w\",\"W\");Z(88,\"x\",\"X\");Z(89,\"y\",\"Y\");Z(90,\"z\",",
    "\"Z\");var Cc=Z(Ja?{c:91,b:91}:Ia?{c:224,b:91}:{c:0,b:91});Z(Ja?{c:92,b",
    ":92}:Ia?{c:224,b:93}:{c:0,b:92});Z(Ja?{c:93,b:93}:Ia?{c:0,b:0}:{c:93,b:",
    "null});Z({c:96,b:96},\"0\");Z({c:97,b:97},\"1\");\nZ({c:98,b:98},\"2\")",
    ";Z({c:99,b:99},\"3\");Z({c:100,b:100},\"4\");Z({c:101,b:101},\"5\");Z({",
    "c:102,b:102},\"6\");Z({c:103,b:103},\"7\");Z({c:104,b:104},\"8\");Z({c:",
    "105,b:105},\"9\");Z({c:106,b:106},\"*\");Z({c:107,b:107},\"+\");Z({c:10",
    "9,b:109},\"-\");Z({c:110,b:110},\".\");Z({c:111,b:111},\"/\");Z(144);Z(",
    "112);Z(113);Z(114);Z(115);Z(116);Z(117);Z(118);Z(119);Z(120);Z(121);Z(1",
    "22);Z(123);Z({c:107,b:187},\"=\",\"+\");Z(108,\",\");Z({c:109,b:189},\"",
    "-\",\"_\");Z(188,\",\",\"<\");Z(190,\".\",\">\");Z(191,\"/\",\"?\");Z(1",
    "92,\"`\",\"~\");Z(219,\"[\",\"{\");\nZ(220,\"\\\\\",\"|\");Z(221,\"]\",",
    "\"}\");Z({c:59,b:186},\";\",\":\");Z(222,\"'\",'\"');var Dc=new uc;Dc.s",
    "et(1,zc);Dc.set(2,Ac);Dc.set(4,Bc);Dc.set(8,Cc);(function(a){var b=new ",
    "uc;q(vc(a),function(c){b.set(a.get(c).code,c)});return b})(Dc);ba(\"_\"",
    ",function(a){var b=[];cc?tc(a,b):qc(a,b);var c=b;a=c.length;b=Array(a);",
    "c=l(c)?c.split(\"\"):c;for(var d=0;d<a;d++)d in c&&(b[d]=nc.call(void 0",
    ",c[d]));return nc(b.join(\"\\n\")).replace(/\\xa0/g,\" \")});; return t",
    "his._.apply(null,arguments);}.apply({navigator:typeof window!='undefine",
    "d'?window.navigator:null,document:typeof window!='undefined'?window.doc",
    "ument:null}, arguments);}",
    NULL
};

const char* const IS_SELECTED[] = {
    "function(){return function(){var f,k=this;function l(a){return\"string",
    "\"==typeof a}function aa(a,b){a=a.split(\".\");var c=k;a[0]in c||!c.exe",
    "cScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());",
    ")a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c",
    "[d]=b}\nfunction ba(a){var b=typeof a;if(\"object\"==b)if(a){if(a insta",
    "nceof Array)return\"array\";if(a instanceof Object)return b;var c=Objec",
    "t.prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\"",
    ";if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=",
    "typeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.prope",
    "rtyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c",
    "||\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnume",
    "rable&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function ca(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function da(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction ea(a,b,c){ea=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?ca:da;return ea.apply(null,argumen",
    "ts)}function fa(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction n(a,b){function c(){}c.prototype=b.prototype;a.sa=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.ra=function(a,",
    "c,g){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};var ha=String.proto",
    "type.trim?function(a){return a.trim()}:function(a){return a.replace(/^[",
    "\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ia(a,b){return a<b?-1:a>b?1:0",
    "};function p(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++",
    ")e in d&&b.call(void 0,d[e],e,a)}function q(a,b,c){var d=c;p(a,function",
    "(c,g){d=b.call(void 0,d,c,g,a)});return d}function r(a,b){for(var c=a.l",
    "ength,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],",
    "e,a))return!0;return!1}function ja(a){return Array.prototype.concat.app",
    "ly([],arguments)}function ka(a,b,c){return 2>=arguments.length?Array.pr",
    "ototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};function la(",
    "a,b){this.code=a;this.state=t[a]||u;this.message=b||\"\";a=this.state.r",
    "eplace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase().replace(",
    "/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)",
    "a+=\"Error\";this.name=a;a=Error(this.message);a.name=this.name;this.st",
    "ack=a.stack||\"\"}n(la,Error);var u=\"unknown error\",t={15:\"element n",
    "ot selectable\",11:\"element not visible\"};t[31]=u;t[30]=u;t[24]=\"inv",
    "alid cookie domain\";t[29]=\"invalid element coordinates\";t[12]=\"inva",
    "lid element state\";\nt[32]=\"invalid selector\";t[51]=\"invalid select",
    "or\";t[52]=\"invalid selector\";t[17]=\"javascript error\";t[405]=\"uns",
    "upported operation\";t[34]=\"move target out of bounds\";t[27]=\"no suc",
    "h alert\";t[7]=\"no such element\";t[8]=\"no such frame\";t[23]=\"no su",
    "ch window\";t[28]=\"script timeout\";t[33]=\"session not created\";t[10",
    "]=\"stale element reference\";t[21]=\"timeout\";t[25]=\"unable to set c",
    "ookie\";t[26]=\"unexpected alert open\";t[13]=u;t[9]=\"unknown command",
    "\";la.prototype.toString=function(){return this.name+\": \"+this.messag",
    "e};var v;a:{var ma=k.navigator;if(ma){var na=ma.userAgent;if(na){v=na;b",
    "reak a}}v=\"\"};function oa(a){var b=pa;Object.prototype.hasOwnProperty",
    ".call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var qa=-1!=v.indexOf(\"Macin",
    "tosh\"),ra=-1!=v.indexOf(\"Windows\"),sa,ta=\"\",ua=/WebKit\\/(\\S+)/.e",
    "xec(v);ua&&(ta=ua?ua[1]:\"\");sa=ta;var pa={};\nfunction va(){oa(functi",
    "on(){for(var a=0,b=ha(String(sa)).split(\".\"),c=ha(\"528\").split(\".",
    "\"),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var g=b[e]||\"\",h",
    "=c[e]||\"\";do{g=/(\\d*)(\\D*)(.*)/.exec(g)||[\"\",\"\",\"\",\"\"];h=/(",
    "\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==g[0].length&&0==h",
    "[0].length)break;a=ia(0==g[1].length?0:parseInt(g[1],10),0==h[1].length",
    "?0:parseInt(h[1],10))||ia(0==g[2].length,0==h[2].length)||ia(g[2],h[2])",
    ";g=g[3];h=h[3]}while(0==a)}return 0<=a})};function wa(a,b){if(!a||!b)re",
    "turn!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"und",
    "efined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDoc",
    "umentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunctio",
    "n xa(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compar",
    "eDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sou",
    "rceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)",
    "return a.sourceIndex-b.sourceIndex;var e=a.parentNode,g=b.parentNode;re",
    "turn e==g?za(a,b):!c&&wa(e,b)?-1*Aa(a,b):!d&&wa(g,a)?Aa(b,a):(c?a.sourc",
    "eIndex:e.sourceIndex)-(d?b.sourceIndex:g.sourceIndex)}d=9==a.nodeType?a",
    ":a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.collap",
    "se(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.comp",
    "areBoundaryPoints(k.Range.START_TO_END,a)}function Aa(a,b){var c=a.pare",
    "ntNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return za(",
    "b,a)}function za(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return",
    " 1};function Ba(a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!",
    "!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}function Ca(a){retu",
    "rn Ba(a,\"OPTION\")?!0:Ba(a,\"INPUT\")?(a=a.type.toLowerCase(),\"checkb",
    "ox\"==a||\"radio\"==a):!1};/*\n\n The MIT License\n\n Copyright (c) 200",
    "7 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is ",
    "hereby granted, free of charge, to any person obtaining a copy\n of thi",
    "s software and associated documentation files (the \"Software\"), to\n ",
    "deal in the Software without restriction, including without limitation ",
    "the\n rights to use, copy, modify, merge, publish, distribute, sublicen",
    "se, and/or\n sell copies of the Software, and to permit persons to whom",
    " the Software is\n furnished to do so, subject to the following conditi",
    "ons:\n\n The above copyright notice and this permission notice shall be",
    " included in\n all copies or substantial portions of the Software.\n\n ",
    "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRE",
    "SS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHAN",
    "TABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO",
    " EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM",
    ", DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT ",
    "OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE",
    " OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction w(a,b,c)",
    "{this.s=a;this.pa=b||1;this.o=c||1};function x(a){this.X=a;this.N=0}fun",
    "ction Da(a){a=a.match(Ea);for(var b=0;b<a.length;b++)Fa.test(a[b])&&a.s",
    "plice(b,1);return new x(a)}var Ea=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]",
    "+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|",
    "\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Fa=/^\\s/;function y(a,b){re",
    "turn a.X[a.N+(b||0)]}x.prototype.next=function(){return this.X[this.N++",
    "]};x.prototype.back=function(){this.N--};x.prototype.empty=function(){r",
    "eturn this.X.length<=this.N};function z(a){var b=null,c=a.nodeType;1==c",
    "&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null",
    "==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentEle",
    "ment:a.firstChild;c=0;var d=[];for(b=\"\";a;){do 1!=a.nodeType&&(b+=a.n",
    "odeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling",
    "););}}else b=a.nodeValue;return\"\"+b}\nfunction A(a,b,c){if(null===b)r",
    "eturn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==",
    "c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function C(a,b,c,d,e){retu",
    "rn Ga.call(null,a,b,l(c)?c:null,l(d)?d:null,e||new D)}\nfunction Ga(a,b",
    ",c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),p",
    "(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&",
    "\"class\"==c?(b=b.getElementsByClassName(d),p(b,function(b){b.className",
    "==d&&a.matches(b)&&e.add(b)})):a instanceof E?Ha(a,b,c,d,e):b.getElemen",
    "tsByTagName&&(b=b.getElementsByTagName(a.getName()),p(b,function(a){A(a",
    ",c,d)&&e.add(a)}));return e}function Ha(a,b,c,d,e){for(b=b.firstChild;b",
    ";b=b.nextSibling)A(b,c,d)&&a.matches(b)&&e.add(b),Ha(a,b,c,d,e)};functi",
    "on D(){this.o=this.j=null;this.J=0}function Ia(a){this.node=a;this.next",
    "=this.D=null}function Ja(a,b){if(!a.j)return b;if(!b.j)return a;var c=a",
    ".j;b=b.j;for(var d=null,e,g=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.ne",
    "xt):0<xa(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.D=d)?d.next=e:",
    "a.j=e,d=e,g++;for(e=c||b;e;)e.D=d,d=d.next=e,g++,e=e.next;a.o=d;a.J=g;r",
    "eturn a}D.prototype.unshift=function(a){a=new Ia(a);a.next=this.j;this.",
    "o?this.j.D=a:this.j=this.o=a;this.j=a;this.J++};\nD.prototype.add=funct",
    "ion(a){a=new Ia(a);a.D=this.o;this.j?this.o.next=a:this.j=this.o=a;this",
    ".o=a;this.J++};function F(a){return(a=a.j)?a.node:null}D.prototype.u=fu",
    "nction(){return this.J};function G(a){return(a=F(a))?z(a):\"\"}D.protot",
    "ype.iterator=function(a){return new Ka(this,!!a)};function Ka(a,b){this",
    ".la=a;this.Y=(this.G=b)?a.o:a.j;this.U=null}Ka.prototype.next=function(",
    "){var a=this.Y;if(null==a)return null;var b=this.U=a;this.Y=this.G?a.D:",
    "a.next;return b.node};\nKa.prototype.remove=function(){var a=this.la,b=",
    "this.U;if(!b)throw Error(\"Next must be called at least once before rem",
    "ove.\");var c=b.D;b=b.next;c?c.next=b:a.j=b;b?b.D=c:a.o=c;a.J--;this.U=",
    "null};function H(a){this.i=a;this.l=this.w=!1;this.K=null}function I(a)",
    "{return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}H.prototyp",
    "e.h=function(){return this.w};function La(a,b){a.w=b}function Ma(a,b){a",
    ".l=b}H.prototype.B=function(){return this.K};function J(a,b){a=a.evalua",
    "te(b);return a instanceof D?+G(a):+a}function K(a,b){a=a.evaluate(b);re",
    "turn a instanceof D?G(a):\"\"+a}function L(a,b){a=a.evaluate(b);return ",
    "a instanceof D?!!a.u():!!a};function M(a,b,c){H.call(this,a.i);this.W=a",
    ";this.aa=b;this.fa=c;this.w=b.h()||c.h();this.l=b.l||c.l;this.W==Na&&(c",
    ".l||c.h()||4==c.i||0==c.i||!b.B()?b.l||b.h()||4==b.i||0==b.i||!c.B()||(",
    "this.K={name:c.B().name,I:b}):this.K={name:b.B().name,I:c})}n(M,H);\nfu",
    "nction N(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var g;if(b instance",
    "of D&&c instanceof D){b=b.iterator();for(d=b.next();d;d=b.next())for(e=",
    "c.iterator(),g=e.next();g;g=e.next())if(a(z(d),z(g)))return!0;return!1}",
    "if(b instanceof D||c instanceof D){b instanceof D?(e=b,d=c):(e=c,d=b);g",
    "=e.iterator();for(var h=typeof d,m=g.next();m;m=g.next()){switch(h){cas",
    "e \"number\":m=+z(m);break;case \"boolean\":m=!!z(m);break;case \"strin",
    "g\":m=z(m);break;default:throw Error(\"Illegal primitive type for compa",
    "rison.\");\n}if(e==b&&a(m,d)||e==c&&a(d,m))return!0}return!1}return e?",
    "\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typ",
    "eof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}M.prototype.evalua",
    "te=function(a){return this.W.C(this.aa,this.fa,a)};M.prototype.toString",
    "=function(){var a=\"Binary Expression: \"+this.W;a+=I(this.aa);return a",
    "+=I(this.fa)};function Oa(a,b,c,d){this.oa=a;this.da=b;this.i=c;this.C=",
    "d}Oa.prototype.toString=function(){return this.oa};var Pa={};\nfunction",
    " O(a,b,c,d){if(Pa.hasOwnProperty(a))throw Error(\"Binary operator alrea",
    "dy created: \"+a);a=new Oa(a,b,c,d);return Pa[a.toString()]=a}O(\"div\"",
    ",6,1,function(a,b,c){return J(a,c)/J(b,c)});O(\"mod\",6,1,function(a,b,",
    "c){return J(a,c)%J(b,c)});O(\"*\",6,1,function(a,b,c){return J(a,c)*J(b",
    ",c)});O(\"+\",5,1,function(a,b,c){return J(a,c)+J(b,c)});O(\"-\",5,1,fu",
    "nction(a,b,c){return J(a,c)-J(b,c)});O(\"<\",4,2,function(a,b,c){return",
    " N(function(a,b){return a<b},a,b,c)});\nO(\">\",4,2,function(a,b,c){ret",
    "urn N(function(a,b){return a>b},a,b,c)});O(\"<=\",4,2,function(a,b,c){r",
    "eturn N(function(a,b){return a<=b},a,b,c)});O(\">=\",4,2,function(a,b,c",
    "){return N(function(a,b){return a>=b},a,b,c)});var Na=O(\"=\",3,2,funct",
    "ion(a,b,c){return N(function(a,b){return a==b},a,b,c,!0)});O(\"!=\",3,2",
    ",function(a,b,c){return N(function(a,b){return a!=b},a,b,c,!0)});O(\"an",
    "d\",2,2,function(a,b,c){return L(a,c)&&L(b,c)});O(\"or\",1,2,function(a",
    ",b,c){return L(a,c)||L(b,c)});function Qa(a,b){if(b.u()&&4!=a.i)throw E",
    "rror(\"Primary expression must evaluate to nodeset if filter has predic",
    "ate(s).\");H.call(this,a.i);this.ea=a;this.f=b;this.w=a.h();this.l=a.l}",
    "n(Qa,H);Qa.prototype.evaluate=function(a){a=this.ea.evaluate(a);return ",
    "Ra(this.f,a)};Qa.prototype.toString=function(){var a=\"Filter:\"+I(this",
    ".ea);return a+=I(this.f)};function Sa(a,b){if(b.length<a.ca)throw Error",
    "(\"Function \"+a.m+\" expects at least\"+a.ca+\" arguments, \"+b.length",
    "+\" given\");if(null!==a.V&&b.length>a.V)throw Error(\"Function \"+a.m+",
    "\" expects at most \"+a.V+\" arguments, \"+b.length+\" given\");a.ma&&p",
    "(b,function(b,d){if(4!=b.i)throw Error(\"Argument \"+d+\" to function ",
    "\"+a.m+\" is not of type Nodeset: \"+b);});H.call(this,a.i);this.M=a;th",
    "is.S=b;La(this,a.w||r(b,function(a){return a.h()}));Ma(this,a.ka&&!b.le",
    "ngth||a.ja&&!!b.length||r(b,function(a){return a.l}))}\nn(Sa,H);Sa.prot",
    "otype.evaluate=function(a){return this.M.C.apply(null,ja(a,this.S))};Sa",
    ".prototype.toString=function(){var a=\"Function: \"+this.M;if(this.S.le",
    "ngth){var b=q(this.S,function(a,b){return a+I(b)},\"Arguments:\");a+=I(",
    "b)}return a};function Ta(a,b,c,d,e,g,h,m){this.m=a;this.i=b;this.w=c;th",
    "is.ka=d;this.ja=!1;this.C=e;this.ca=g;this.V=void 0!==h?h:g;this.ma=!!m",
    "}Ta.prototype.toString=function(){return this.m};var Ua={};\nfunction P",
    "(a,b,c,d,e,g,h,m){if(Ua.hasOwnProperty(a))throw Error(\"Function alread",
    "y created: \"+a+\".\");Ua[a]=new Ta(a,b,c,d,e,g,h,m)}P(\"boolean\",2,!1",
    ",!1,function(a,b){return L(b,a)},1);P(\"ceiling\",1,!1,!1,function(a,b)",
    "{return Math.ceil(J(b,a))},1);P(\"concat\",3,!1,!1,function(a,b){return",
    " q(ka(arguments,1),function(b,d){return b+K(d,a)},\"\")},2,null);P(\"co",
    "ntains\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return-1!=b.indexOf(",
    "a)},2);P(\"count\",1,!1,!1,function(a,b){return b.evaluate(a).u()},1,1,",
    "!0);\nP(\"false\",2,!1,!1,function(){return!1},0);P(\"floor\",1,!1,!1,f",
    "unction(a,b){return Math.floor(J(b,a))},1);P(\"id\",4,!1,!1,function(a,",
    "b){var c=a.s,d=9==c.nodeType?c:c.ownerDocument;a=K(b,a).split(/\\s+/);v",
    "ar e=[];p(a,function(a){a=d.getElementById(a);var b;if(!(b=!a)){a:if(l(",
    "e))b=l(a)&&1==a.length?e.indexOf(a,0):-1;else{for(b=0;b<e.length;b++)if",
    "(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.push(a)});e.sort(xa);var g=n",
    "ew D;p(e,function(a){g.add(a)});return g},1);P(\"lang\",2,!1,!1,functio",
    "n(){return!1},1);\nP(\"last\",1,!0,!1,function(a){if(1!=arguments.lengt",
    "h)throw Error(\"Function last expects ()\");return a.o},0);P(\"local-na",
    "me\",3,!1,!0,function(a,b){return(a=b?F(b.evaluate(a)):a.s)?a.localName",
    "||a.nodeName.toLowerCase():\"\"},0,1,!0);P(\"name\",3,!1,!0,function(a,",
    "b){return(a=b?F(b.evaluate(a)):a.s)?a.nodeName.toLowerCase():\"\"},0,1,",
    "!0);P(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);\nP(\"no",
    "rmalize-space\",3,!1,!0,function(a,b){return(b?K(b,a):z(a.s)).replace(/",
    "[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);P(\"not\",2,!1,",
    "!1,function(a,b){return!L(b,a)},1);P(\"number\",1,!1,!0,function(a,b){r",
    "eturn b?J(b,a):+z(a.s)},0,1);P(\"position\",1,!0,!1,function(a){return ",
    "a.pa},0);P(\"round\",1,!1,!1,function(a,b){return Math.round(J(b,a))},1",
    ");P(\"starts-with\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return 0=",
    "=b.lastIndexOf(a,0)},2);P(\"string\",3,!1,!0,function(a,b){return b?K(b",
    ",a):z(a.s)},0,1);\nP(\"string-length\",1,!1,!0,function(a,b){return(b?K",
    "(b,a):z(a.s)).length},0,1);P(\"substring\",3,!1,!1,function(a,b,c,d){c=",
    "J(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?J(d,a):Inf",
    "inity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Mat",
    "h.max(c,0);a=K(b,a);return Infinity==d?a.substring(e):a.substring(e,c+M",
    "ath.round(d))},2,3);P(\"substring-after\",3,!1,!1,function(a,b,c){b=K(b",
    ",a);a=K(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2",
    ");\nP(\"substring-before\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);a=",
    "b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);P(\"sum\",1,!1,!1,fu",
    "nction(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.nex",
    "t())b+=+z(c);return b},1,1,!0);P(\"translate\",3,!1,!1,function(a,b,c,d",
    "){b=K(b,a);c=K(c,a);var e=K(d,a);a={};for(d=0;d<c.length;d++){var g=c.c",
    "harAt(d);g in a||(a[g]=e.charAt(d))}c=\"\";for(d=0;d<b.length;d++)g=b.c",
    "harAt(d),c+=g in a?a[g]:g;return c},3);P(\"true\",2,!1,!1,function(){re",
    "turn!0},0);function E(a,b){this.ha=a;this.ba=void 0!==b?b:null;this.H=n",
    "ull;switch(a){case \"comment\":this.H=8;break;case \"text\":this.H=3;br",
    "eak;case \"processing-instruction\":this.H=7;break;case \"node\":break;",
    "default:throw Error(\"Unexpected argument\");}}function Va(a){return\"c",
    "omment\"==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==a}E.",
    "prototype.matches=function(a){return null===this.H||this.H==a.nodeType}",
    ";E.prototype.getName=function(){return this.ha};\nE.prototype.toString=",
    "function(){var a=\"Kind Test: \"+this.ha;null===this.ba||(a+=I(this.ba)",
    ");return a};function Wa(a){H.call(this,3);this.ga=a.substring(1,a.lengt",
    "h-1)}n(Wa,H);Wa.prototype.evaluate=function(){return this.ga};Wa.protot",
    "ype.toString=function(){return\"Literal: \"+this.ga};function Q(a,b){th",
    "is.m=a.toLowerCase();a=\"*\"==this.m?\"*\":\"http://www.w3.org/1999/xht",
    "ml\";this.O=b?b.toLowerCase():a}Q.prototype.matches=function(a){var b=a",
    ".nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.localName?a.localName:a.n",
    "odeName;return\"*\"!=this.m&&this.m!=b.toLowerCase()?!1:\"*\"==this.O?!",
    "0:this.O==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.",
    "org/1999/xhtml\")};Q.prototype.getName=function(){return this.m};\nQ.pr",
    "ototype.toString=function(){return\"Name Test: \"+(\"http://www.w3.org/",
    "1999/xhtml\"==this.O?\"\":this.O+\":\")+this.m};function Xa(a){H.call(t",
    "his,1);this.ia=a}n(Xa,H);Xa.prototype.evaluate=function(){return this.i",
    "a};Xa.prototype.toString=function(){return\"Number: \"+this.ia};functio",
    "n Ya(a,b){H.call(this,a.i);this.$=a;this.L=b;this.w=a.h();this.l=a.l;1=",
    "=this.L.length&&(a=this.L[0],a.T||a.A!=Za||(a=a.R,\"*\"!=a.getName()&&(",
    "this.K={name:a.getName(),I:null})))}n(Ya,H);function R(){H.call(this,4)",
    "}n(R,H);R.prototype.evaluate=function(a){var b=new D;a=a.s;9==a.nodeTyp",
    "e?b.add(a):b.add(a.ownerDocument);return b};R.prototype.toString=functi",
    "on(){return\"Root Helper Expression\"};function $a(){H.call(this,4)}n($",
    "a,H);$a.prototype.evaluate=function(a){var b=new D;b.add(a.s);return b}",
    ";\n$a.prototype.toString=function(){return\"Context Helper Expression\"",
    "};function ab(a){return\"/\"==a||\"//\"==a}\nYa.prototype.evaluate=func",
    "tion(a){var b=this.$.evaluate(a);if(!(b instanceof D))throw Error(\"Fil",
    "ter expression must evaluate to nodeset.\");a=this.L;for(var c=0,d=a.le",
    "ngth;c<d&&b.u();c++){var e=a[c],g=b.iterator(e.A.G);if(e.h()||e.A!=bb)i",
    "f(e.h()||e.A!=cb){var h=g.next();for(b=e.evaluate(new w(h));null!=(h=g.",
    "next());)h=e.evaluate(new w(h)),b=Ja(b,h)}else h=g.next(),b=e.evaluate(",
    "new w(h));else{for(h=g.next();(b=g.next())&&(!h.contains||h.contains(b)",
    ")&&b.compareDocumentPosition(h)&8;h=b);b=e.evaluate(new w(h))}}return b",
    "};\nYa.prototype.toString=function(){var a=\"Path Expression:\"+I(this.",
    "$);if(this.L.length){var b=q(this.L,function(a,b){return a+I(b)},\"Step",
    "s:\");a+=I(b)}return a};function S(a,b){this.f=a;this.G=!!b}function Ra",
    "(a,b,c){for(c=c||0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterator(),g=b",
    ".u(),h,m=0;h=e.next();m++){var B=a.G?g-m:m+1;h=d.evaluate(new w(h,B,g))",
    ";if(\"number\"==typeof h)B=B==h;else if(\"string\"==typeof h||\"boolean",
    "\"==typeof h)B=!!h;else if(h instanceof D)B=0<h.u();else throw Error(\"",
    "Predicate.evaluate returned an unexpected type.\");B||e.remove()}return",
    " b}S.prototype.B=function(){return 0<this.f.length?this.f[0].B():null};",
    "\nS.prototype.h=function(){for(var a=0;a<this.f.length;a++){var b=this.",
    "f[a];if(b.h()||1==b.i||0==b.i)return!0}return!1};S.prototype.u=function",
    "(){return this.f.length};S.prototype.toString=function(){return q(this.",
    "f,function(a,b){return a+I(b)},\"Predicates:\")};function T(a,b,c,d){H.",
    "call(this,4);this.A=a;this.R=b;this.f=c||new S([]);this.T=!!d;b=this.f.",
    "B();a.qa&&b&&(this.K={name:b.name,I:b.I});this.w=this.f.h()}n(T,H);\nT.",
    "prototype.evaluate=function(a){var b=a.s,c=this.B(),d=null,e=null,g=0;c",
    "&&(d=c.name,e=c.I?K(c.I,a):null,g=1);if(this.T)if(this.h()||this.A!=db)",
    "if(b=(new T(eb,new E(\"node\"))).evaluate(a).iterator(),c=b.next())for(",
    "a=this.C(c,d,e,g);null!=(c=b.next());)a=Ja(a,this.C(c,d,e,g));else a=ne",
    "w D;else a=C(this.R,b,d,e),a=Ra(this.f,a,g);else a=this.C(a.s,d,e,g);re",
    "turn a};T.prototype.C=function(a,b,c,d){a=this.A.M(this.R,a,b,c);return",
    " a=Ra(this.f,a,d)};\nT.prototype.toString=function(){var a=\"Step:\"+I(",
    "\"Operator: \"+(this.T?\"//\":\"/\"));this.A.m&&(a+=I(\"Axis: \"+this.A",
    "));a+=I(this.R);if(this.f.u()){var b=q(this.f.f,function(a,b){return a+",
    "I(b)},\"Predicates:\");a+=I(b)}return a};function fb(a,b,c,d){this.m=a;",
    "this.M=b;this.G=c;this.qa=d}fb.prototype.toString=function(){return thi",
    "s.m};var gb={};function U(a,b,c,d){if(gb.hasOwnProperty(a))throw Error(",
    "\"Axis already created: \"+a);b=new fb(a,b,c,!!d);return gb[a]=b}\nU(\"",
    "ancestor\",function(a,b){for(var c=new D;b=b.parentNode;)a.matches(b)&&",
    "c.unshift(b);return c},!0);U(\"ancestor-or-self\",function(a,b){var c=n",
    "ew D;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);",
    "\nvar Za=U(\"attribute\",function(a,b){var c=new D,d=a.getName();if(b=b",
    ".attributes)if(a instanceof E&&null===a.H||\"*\"==d)for(a=0;d=b[a];a++)",
    "c.add(d);else(d=b.getNamedItem(d))&&c.add(d);return c},!1),db=U(\"child",
    "\",function(a,b,c,d,e){c=l(c)?c:null;d=l(d)?d:null;e=e||new D;for(b=b.f",
    "irstChild;b;b=b.nextSibling)A(b,c,d)&&a.matches(b)&&e.add(b);return e},",
    "!1,!0);U(\"descendant\",C,!1,!0);\nvar eb=U(\"descendant-or-self\",func",
    "tion(a,b,c,d){var e=new D;A(b,c,d)&&a.matches(b)&&e.add(b);return C(a,b",
    ",c,d,e)},!1,!0),bb=U(\"following\",function(a,b,c,d){var e=new D;do for",
    "(var g=b;g=g.nextSibling;)A(g,c,d)&&a.matches(g)&&e.add(g),e=C(a,g,c,d,",
    "e);while(b=b.parentNode);return e},!1,!0);U(\"following-sibling\",funct",
    "ion(a,b){for(var c=new D;b=b.nextSibling;)a.matches(b)&&c.add(b);return",
    " c},!1);U(\"namespace\",function(){return new D},!1);\nvar hb=U(\"paren",
    "t\",function(a,b){var c=new D;if(9==b.nodeType)return c;if(2==b.nodeTyp",
    "e)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);",
    "return c},!1),cb=U(\"preceding\",function(a,b,c,d){var e=new D,g=[];do ",
    "g.unshift(b);while(b=b.parentNode);for(var h=1,m=g.length;h<m;h++){var ",
    "B=[];for(b=g[h];b=b.previousSibling;)B.unshift(b);for(var ya=0,zb=B.len",
    "gth;ya<zb;ya++)b=B[ya],A(b,c,d)&&a.matches(b)&&e.add(b),e=C(a,b,c,d,e)}",
    "return e},!0,!0);\nU(\"preceding-sibling\",function(a,b){for(var c=new ",
    "D;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var ib=",
    "U(\"self\",function(a,b){var c=new D;a.matches(b)&&c.add(b);return c},!",
    "1);function jb(a){H.call(this,1);this.Z=a;this.w=a.h();this.l=a.l}n(jb,",
    "H);jb.prototype.evaluate=function(a){return-J(this.Z,a)};jb.prototype.t",
    "oString=function(){return\"Unary Expression: -\"+I(this.Z)};function kb",
    "(a){H.call(this,4);this.P=a;La(this,r(this.P,function(a){return a.h()})",
    ");Ma(this,r(this.P,function(a){return a.l}))}n(kb,H);kb.prototype.evalu",
    "ate=function(a){var b=new D;p(this.P,function(c){c=c.evaluate(a);if(!(c",
    " instanceof D))throw Error(\"Path expression must evaluate to NodeSet.",
    "\");b=Ja(b,c)});return b};kb.prototype.toString=function(){return q(thi",
    "s.P,function(a,b){return a+I(b)},\"Union Expression:\")};function lb(a,",
    "b){this.a=a;this.na=b}function mb(a){for(var b,c=[];;){V(a,\"Missing ri",
    "ght hand side of binary expression.\");b=nb(a);var d=a.a.next();if(!d)b",
    "reak;var e=(d=Pa[d]||null)&&d.da;if(!e){a.a.back();break}for(;c.length&",
    "&e<=c[c.length-1].da;)b=new M(c.pop(),c.pop(),b);c.push(b,d)}for(;c.len",
    "gth;)b=new M(c.pop(),c.pop(),b);return b}function V(a,b){if(a.a.empty()",
    ")throw Error(b);}function ob(a,b){a=a.a.next();if(a!=b)throw Error(\"Ba",
    "d token, expected: \"+b+\" got: \"+a);}\nfunction pb(a){a=a.a.next();if",
    "(\")\"!=a)throw Error(\"Bad token: \"+a);}function qb(a){a=a.a.next();i",
    "f(2>a.length)throw Error(\"Unclosed literal string\");return new Wa(a)}",
    "\nfunction rb(a){var b=[];if(ab(y(a.a))){var c=a.a.next();var d=y(a.a);",
    "if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(",
    "?![0-9])[\\w]/.test(d)))return new R;d=new R;V(a,\"Missing next locatio",
    "n step.\");c=sb(a,c);b.push(c)}else{a:{c=y(a.a);d=c.charAt(0);switch(d)",
    "{case \"$\":throw Error(\"Variable reference not allowed in HTML XPath",
    "\");case \"(\":a.a.next();c=mb(a);V(a,'unclosed \"(\"');ob(a,\")\");bre",
    "ak;case '\"':case \"'\":c=qb(a);break;default:if(isNaN(+c))if(!Va(c)&&/",
    "(?![0-9])[\\w]/.test(d)&&\"(\"==y(a.a,\n1)){c=a.a.next();c=Ua[c]||null;",
    "a.a.next();for(d=[];\")\"!=y(a.a);){V(a,\"Missing function argument lis",
    "t.\");d.push(mb(a));if(\",\"!=y(a.a))break;a.a.next()}V(a,\"Unclosed fu",
    "nction argument list.\");pb(a);c=new Sa(c,d)}else{c=null;break a}else c",
    "=new Xa(+a.a.next())}\"[\"==y(a.a)&&(d=new S(tb(a)),c=new Qa(c,d))}if(c",
    ")if(ab(y(a.a)))d=c;else return c;else c=sb(a,\"/\"),d=new $a,b.push(c)}",
    "for(;ab(y(a.a));)c=a.a.next(),V(a,\"Missing next location step.\"),c=sb",
    "(a,c),b.push(c);return new Ya(d,b)}\nfunction sb(a,b){if(\"/\"!=b&&\"//",
    "\"!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"==y(a.a)",
    "){var c=new T(ib,new E(\"node\"));a.a.next();return c}if(\"..\"==y(a.a)",
    ")return c=new T(hb,new E(\"node\")),a.a.next(),c;if(\"@\"==y(a.a)){var ",
    "d=Za;a.a.next();V(a,\"Missing attribute name\")}else if(\"::\"==y(a.a,1",
    ")){if(!/(?![0-9])[\\w]/.test(y(a.a).charAt(0)))throw Error(\"Bad token:",
    " \"+a.a.next());var e=a.a.next();d=gb[e]||null;if(!d)throw Error(\"No a",
    "xis with name: \"+e);a.a.next();V(a,\"Missing node name\")}else d=db;e=",
    "\ny(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==y(a.a,1)){i",
    "f(!Va(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!Va(e))",
    "throw Error(\"Invalid type name: \"+e);ob(a,\"(\");V(a,\"Bad nodetype\"",
    ");var g=y(a.a).charAt(0),h=null;if('\"'==g||\"'\"==g)h=qb(a);V(a,\"Bad ",
    "nodetype\");pb(a);e=new E(e,h)}else if(e=a.a.next(),g=e.indexOf(\":\"),",
    "-1==g)e=new Q(e);else{h=e.substring(0,g);if(\"*\"==h)var m=\"*\";else i",
    "f(m=a.na(h),!m)throw Error(\"Namespace prefix not declared: \"+h);e=e.s",
    "ubstr(g+1);e=new Q(e,m)}else throw Error(\"Bad token: \"+\na.a.next());",
    "a=new S(tb(a),d.G);return c||new T(d,e,a,\"//\"==b)}function tb(a){for(",
    "var b=[];\"[\"==y(a.a);){a.a.next();V(a,\"Missing predicate expression.",
    "\");var c=mb(a);b.push(c);V(a,\"Unclosed predicate expression.\");ob(a,",
    "\"]\")}return b}function nb(a){if(\"-\"==y(a.a))return a.a.next(),new j",
    "b(nb(a));var b=rb(a);if(\"|\"!=y(a.a))a=b;else{for(b=[b];\"|\"==a.a.nex",
    "t();)V(a,\"Missing next union location path.\"),b.push(rb(a));a.a.back(",
    ");a=new kb(b)}return a};function ub(a){switch(a.nodeType){case 1:return",
    " fa(vb,a);case 9:return ub(a.documentElement);case 11:case 10:case 6:ca",
    "se 12:return wb;default:return a.parentNode?ub(a.parentNode):wb}}functi",
    "on wb(){return null}function vb(a,b){if(a.prefix==b)return a.namespaceU",
    "RI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:",
    "\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNode",
    ".nodeType?vb(a.parentNode,b):null};function xb(a,b){if(!a.length)throw ",
    "Error(\"Empty XPath expression.\");a=Da(a);if(a.empty())throw Error(\"I",
    "nvalid XPath expression.\");b?\"function\"==ba(b)||(b=ea(b.lookupNamesp",
    "aceURI,b)):b=function(){return null};var c=mb(new lb(a,b));if(!a.empty(",
    "))throw Error(\"Bad token: \"+a.next());this.evaluate=function(a,b){a=c",
    ".evaluate(new w(a));return new W(a,b)}}\nfunction W(a,b){if(0==b)if(a i",
    "nstanceof D)b=4;else if(\"string\"==typeof a)b=2;else if(\"number\"==ty",
    "peof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpec",
    "ted evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof D))throw ",
    "Error(\"value could not be converted to the specified type\");this.resu",
    "ltType=b;switch(b){case 2:this.stringValue=a instanceof D?G(a):\"\"+a;b",
    "reak;case 1:this.numberValue=a instanceof D?+G(a):+a;break;case 3:this.",
    "booleanValue=a instanceof D?0<a.u():!!a;break;case 4:case 5:case 6:case",
    " 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next())d.push",
    "(e);this.snapshotLength=a.u();this.invalidIteratorState=!1;break;case 8",
    ":case 9:this.singleNodeValue=F(a);break;default:throw Error(\"Unknown X",
    "PathResult type.\");}var g=0;this.iterateNext=function(){if(4!=b&&5!=b)",
    "throw Error(\"iterateNext called with wrong result type\");return g>=d.",
    "length?null:d[g++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw E",
    "rror(\"snapshotItem called with wrong result type\");return a>=d.length",
    "||0>a?null:d[a]}}\nW.ANY_TYPE=0;W.NUMBER_TYPE=1;W.STRING_TYPE=2;W.BOOLE",
    "AN_TYPE=3;W.UNORDERED_NODE_ITERATOR_TYPE=4;W.ORDERED_NODE_ITERATOR_TYPE",
    "=5;W.UNORDERED_NODE_SNAPSHOT_TYPE=6;W.ORDERED_NODE_SNAPSHOT_TYPE=7;W.AN",
    "Y_UNORDERED_NODE_TYPE=8;W.FIRST_ORDERED_NODE_TYPE=9;function yb(a){this",
    ".lookupNamespaceURI=ub(a)}\naa(\"wgxpath.install\",function(a,b){a=a||k",
    ";var c=a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a",
    ".XPathResult=W,c.evaluate=function(a,b,c,h){return(new xb(a,c)).evaluat",
    "e(b,h)},c.createExpression=function(a,b){return new xb(a,b)},c.createNS",
    "Resolver=function(a){return new yb(a)}});va();va();function X(a,b){this",
    ".v={};this.g=[];this.F=0;var c=arguments.length;if(1<c){if(c%2)throw Er",
    "ror(\"Uneven number of arguments\");for(var d=0;d<c;d+=2)this.set(argum",
    "ents[d],arguments[d+1])}else a&&this.addAll(a)}function Ab(a){Bb(a);ret",
    "urn a.g.concat()}f=X.prototype;f.clear=function(){this.v={};this.F=this",
    ".g.length=0};f.remove=function(a){return Object.prototype.hasOwnPropert",
    "y.call(this.v,a)?(delete this.v[a],this.F--,this.g.length>2*this.F&&Bb(",
    "this),!0):!1};\nfunction Bb(a){if(a.F!=a.g.length){for(var b=0,c=0;b<a.",
    "g.length;){var d=a.g[b];Object.prototype.hasOwnProperty.call(a.v,d)&&(a",
    ".g[c++]=d);b++}a.g.length=c}if(a.F!=a.g.length){var e={};for(c=b=0;b<a.",
    "g.length;)d=a.g[b],Object.prototype.hasOwnProperty.call(e,d)||(a.g[c++]",
    "=d,e[d]=1),b++;a.g.length=c}}f.get=function(a,b){return Object.prototyp",
    "e.hasOwnProperty.call(this.v,a)?this.v[a]:b};f.set=function(a,b){Object",
    ".prototype.hasOwnProperty.call(this.v,a)||(this.F++,this.g.push(a));thi",
    "s.v[a]=b};\nf.addAll=function(a){if(a instanceof X){var b=Ab(a);Bb(a);f",
    "or(var c=[],d=0;d<a.g.length;d++)c.push(a.v[a.g[d]]);a=c}else{b=[];d=0;",
    "for(var e in a)b[d++]=e;d=[];e=0;for(c in a)d[e++]=a[c];a=d}for(c=0;c<b",
    ".length;c++)this.set(b[c],a[c])};f.forEach=function(a,b){for(var c=Ab(t",
    "his),d=0;d<c.length;d++){var e=c[d],g=this.get(e);a.call(b,g,e,this)}};",
    "f.clone=function(){return new X(this)};var Cb={};function Y(a,b,c){var ",
    "d=typeof a;(\"object\"==d&&null!=a||\"function\"==d)&&(a=a.b);a=new Db(",
    "a);!b||b in Cb&&!c||(Cb[b]={key:a,shift:!1},c&&(Cb[c]={key:a,shift:!0})",
    ");return a}function Db(a){this.code=a}Y(8);Y(9);Y(13);var Eb=Y(16),Fb=Y",
    "(17),Gb=Y(18);Y(19);Y(20);Y(27);Y(32,\" \");Y(33);Y(34);Y(35);Y(36);Y(3",
    "7);Y(38);Y(39);Y(40);Y(44);Y(45);Y(46);Y(48,\"0\",\")\");Y(49,\"1\",\"!",
    "\");Y(50,\"2\",\"@\");Y(51,\"3\",\"#\");Y(52,\"4\",\"$\");Y(53,\"5\",\"",
    "%\");Y(54,\"6\",\"^\");Y(55,\"7\",\"&\");Y(56,\"8\",\"*\");Y(57,\"9\",",
    "\"(\");Y(65,\"a\",\"A\");\nY(66,\"b\",\"B\");Y(67,\"c\",\"C\");Y(68,\"d",
    "\",\"D\");Y(69,\"e\",\"E\");Y(70,\"f\",\"F\");Y(71,\"g\",\"G\");Y(72,\"",
    "h\",\"H\");Y(73,\"i\",\"I\");Y(74,\"j\",\"J\");Y(75,\"k\",\"K\");Y(76,",
    "\"l\",\"L\");Y(77,\"m\",\"M\");Y(78,\"n\",\"N\");Y(79,\"o\",\"O\");Y(80",
    ",\"p\",\"P\");Y(81,\"q\",\"Q\");Y(82,\"r\",\"R\");Y(83,\"s\",\"S\");Y(8",
    "4,\"t\",\"T\");Y(85,\"u\",\"U\");Y(86,\"v\",\"V\");Y(87,\"w\",\"W\");Y(",
    "88,\"x\",\"X\");Y(89,\"y\",\"Y\");Y(90,\"z\",\"Z\");var Hb=Y(ra?{c:91,b",
    ":91}:qa?{c:224,b:91}:{c:0,b:91});Y(ra?{c:92,b:92}:qa?{c:224,b:93}:{c:0,",
    "b:92});Y(ra?{c:93,b:93}:qa?{c:0,b:0}:{c:93,b:null});\nY({c:96,b:96},\"0",
    "\");Y({c:97,b:97},\"1\");Y({c:98,b:98},\"2\");Y({c:99,b:99},\"3\");Y({c",
    ":100,b:100},\"4\");Y({c:101,b:101},\"5\");Y({c:102,b:102},\"6\");Y({c:1",
    "03,b:103},\"7\");Y({c:104,b:104},\"8\");Y({c:105,b:105},\"9\");Y({c:106",
    ",b:106},\"*\");Y({c:107,b:107},\"+\");Y({c:109,b:109},\"-\");Y({c:110,b",
    ":110},\".\");Y({c:111,b:111},\"/\");Y(144);Y(112);Y(113);Y(114);Y(115);",
    "Y(116);Y(117);Y(118);Y(119);Y(120);Y(121);Y(122);Y(123);Y({c:107,b:187}",
    ",\"=\",\"+\");Y(108,\",\");Y({c:109,b:189},\"-\",\"_\");Y(188,\",\",\"<",
    "\");Y(190,\".\",\">\");Y(191,\"/\",\"?\");\nY(192,\"`\",\"~\");Y(219,\"",
    "[\",\"{\");Y(220,\"\\\\\",\"|\");Y(221,\"]\",\"}\");Y({c:59,b:186},\";",
    "\",\":\");Y(222,\"'\",'\"');var Z=new X;Z.set(1,Eb);Z.set(2,Fb);Z.set(4",
    ",Gb);Z.set(8,Hb);(function(a){var b=new X;p(Ab(a),function(c){b.set(a.g",
    "et(c).code,c)});return b})(Z);aa(\"_\",function(a){if(Ca(a)){if(!Ca(a))",
    "throw new la(15,\"Element is not selectable\");var b=\"selected\",c=a.t",
    "ype&&a.type.toLowerCase();if(\"checkbox\"==c||\"radio\"==c)b=\"checked",
    "\";a=!!a[b]}else a=!1;return a});; return this._.apply(null,arguments);",
    "}.apply({navigator:typeof window!='undefined'?window.navigator:null,doc",
    "ument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const REMOVE_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.localStorage}l.prototype.set",
    "Item=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(13",
    ",g.message);}};l.prototype.getItem=function(a){return this.a.getItem(a)",
    "};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.remov",
    "eItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.proto",
    "type.size=function(){return this.a.length};l.prototype.key=function(a){",
    "return this.a.key(a)};function m(a){if(null==(d||d).localStorage)throw ",
    "new e(13,\"Local storage undefined\");return(new l).removeItem(a)}var n",
    "=[\"_\"],p=this;n[0]in p||!p.execScript||p.execScript(\"var \"+n[0]);fo",
    "r(var r;n.length&&(r=n.shift());){var t;if(t=!n.length)t=void 0!==m;t?p",
    "[r]=m:p=p[r]&&p[r]!==Object.prototype[r]?p[r]:p[r]={}};; return this._.",
    "apply(null,arguments);}.apply({navigator:typeof window!='undefined'?win",
    "dow.navigator:null,document:typeof window!='undefined'?window.document:",
    "null}, arguments);}",
    NULL
};

const char* const REMOVE_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.sessionStorage}l.prototype.s",
    "etItem=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(",
    "13,g.message);}};l.prototype.getItem=function(a){return this.a.getItem(",
    "a)};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.rem",
    "oveItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.pro",
    "totype.size=function(){return this.a.length};l.prototype.key=function(a",
    "){return this.a.key(a)};function m(a){var c=d||d;if(null!=c.sessionStor",
    "age&&null!=c.sessionStorage.clear)c=new l;else throw new e(13,\"Session",
    " storage undefined\");return c.removeItem(a)}var n=[\"_\"],p=this;n[0]i",
    "n p||!p.execScript||p.execScript(\"var \"+n[0]);for(var r;n.length&&(r=",
    "n.shift());){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p=p[r]&&p[r]!==",
    "Object.prototype[r]?p[r]:p[r]={}};; return this._.apply(null,arguments)",
    ";}.apply({navigator:typeof window!='undefined'?window.navigator:null,do",
    "cument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const SET_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){function b(a,c){function g(){}g.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new g;a.prototype.constructor=a",
    ";a.b=function(a,g,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[g].apply(a,q)}};var",
    " d=window;function e(a,c){this.code=a;this.state=f[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(e,Error);var h=\"unknown error",
    "\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]=h",
    ";f[30]=h;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coordi",
    "nates\";f[12]=\"invalid element state\";\nf[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";f[52]=\"invalid selector\";f[17]=\"javascript ",
    "error\";f[405]=\"unsupported operation\";f[34]=\"move target out of bou",
    "nds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such f",
    "rame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sessio",
    "n not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f[2",
    "5]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=h;f[9",
    "]=\"unknown command\";e.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=d.localStorage}l.prototype.set",
    "Item=function(a,c){try{this.a.setItem(a,c+\"\")}catch(g){throw new e(13",
    ",g.message);}};l.prototype.getItem=function(a){return this.a.getItem(a)",
    "};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.remov",
    "eItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.proto",
    "type.size=function(){return this.a.length};l.prototype.key=function(a){",
    "return this.a.key(a)};function m(a,c){if(null==(d||d).localStorage)thro",
    "w new e(13,\"Local storage undefined\");(new l).setItem(a,c)}var n=[\"_",
    "\"],p=this;n[0]in p||!p.execScript||p.execScript(\"var \"+n[0]);for(var",
    " r;n.length&&(r=n.shift());){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m",
    ":p=p[r]&&p[r]!==Object.prototype[r]?p[r]:p[r]={}};; return this._.apply",
    "(null,arguments);}.apply({navigator:typeof window!='undefined'?window.n",
    "avigator:null,document:typeof window!='undefined'?window.document:null}",
    ", arguments);}",
    NULL
};

const char* const SET_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){function b(a,c){function d(){}d.prototype=",
    "c.prototype;a.c=c.prototype;a.prototype=new d;a.prototype.constructor=a",
    ";a.b=function(a,d,u){for(var q=Array(arguments.length-2),k=2;k<argument",
    "s.length;k++)q[k-2]=arguments[k];return c.prototype[d].apply(a,q)}};var",
    " e=window;function f(a,c){this.code=a;this.state=g[a]||h;this.message=c",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});c=a.length-5;if(0>c||a.ind",
    "exOf(\"Error\",c)!=c)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}b(f,Error);var h=\"unknown error",
    "\",g={15:\"element not selectable\",11:\"element not visible\"};g[31]=h",
    ";g[30]=h;g[24]=\"invalid cookie domain\";g[29]=\"invalid element coordi",
    "nates\";g[12]=\"invalid element state\";\ng[32]=\"invalid selector\";g[",
    "51]=\"invalid selector\";g[52]=\"invalid selector\";g[17]=\"javascript ",
    "error\";g[405]=\"unsupported operation\";g[34]=\"move target out of bou",
    "nds\";g[27]=\"no such alert\";g[7]=\"no such element\";g[8]=\"no such f",
    "rame\";g[23]=\"no such window\";g[28]=\"script timeout\";g[33]=\"sessio",
    "n not created\";g[10]=\"stale element reference\";g[21]=\"timeout\";g[2",
    "5]=\"unable to set cookie\";g[26]=\"unexpected alert open\";g[13]=h;g[9",
    "]=\"unknown command\";f.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function l(){this.a=e.sessionStorage}l.prototype.s",
    "etItem=function(a,c){try{this.a.setItem(a,c+\"\")}catch(d){throw new f(",
    "13,d.message);}};l.prototype.getItem=function(a){return this.a.getItem(",
    "a)};l.prototype.removeItem=function(a){var c=this.getItem(a);this.a.rem",
    "oveItem(a);return c};l.prototype.clear=function(){this.a.clear()};l.pro",
    "totype.size=function(){return this.a.length};l.prototype.key=function(a",
    "){return this.a.key(a)};function m(a,c){var d=e||e;if(null!=d.sessionSt",
    "orage&&null!=d.sessionStorage.clear)d=new l;else throw new f(13,\"Sessi",
    "on storage undefined\");d.setItem(a,c)}var n=[\"_\"],p=this;n[0]in p||!",
    "p.execScript||p.execScript(\"var \"+n[0]);for(var r;n.length&&(r=n.shif",
    "t());){var t;if(t=!n.length)t=void 0!==m;t?p[r]=m:p=p[r]&&p[r]!==Object",
    ".prototype[r]?p[r]:p[r]={}};; return this._.apply(null,arguments);}.app",
    "ly({navigator:typeof window!='undefined'?window.navigator:null,document",
    ":typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

}  // namespace atoms
}  // namespace webdriver

