diff options
author | Stefan Eissing <icing@apache.org> | 2021-08-20 18:07:44 +0200 |
---|---|---|
committer | Stefan Eissing <icing@apache.org> | 2021-08-20 18:07:44 +0200 |
commit | 9438c6497a6653d3f118cbc8d042fd71e22d91fb (patch) | |
tree | d853b8ccf333adaccb6a7a8707d116d36fe6c890 /test/modules | |
parent | core: follow up to r1891148: WC bucket defaulting to FLUSH bucket. (diff) | |
download | apache2-9438c6497a6653d3f118cbc8d042fd71e22d91fb.tar.xz apache2-9438c6497a6653d3f118cbc8d042fd71e22d91fb.zip |
* test/module/http2: test suite from github mod_h2 repository
slightly adapted to run in a source build. usage:
> make install # to have httpd, apxs etc. in place
> cd test
> pytest
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1892476 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'test/modules')
93 files changed, 12745 insertions, 0 deletions
diff --git a/test/modules/http2/.gitignore b/test/modules/http2/.gitignore new file mode 100644 index 0000000000..d68cd09332 --- /dev/null +++ b/test/modules/http2/.gitignore @@ -0,0 +1,3 @@ +gen +config.ini +__pycache__ diff --git a/test/modules/http2/Makefile.in b/test/modules/http2/Makefile.in new file mode 100644 index 0000000000..15d404d208 --- /dev/null +++ b/test/modules/http2/Makefile.in @@ -0,0 +1,20 @@ + +# no targets: we don't want to build anything by default. if you want the +# test programs, then "make test" +TARGETS = + +bin_PROGRAMS = + +PROGRAM_LDADD = $(EXTRA_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) +PROGRAM_DEPENDENCIES = \ + $(top_srcdir)/srclib/apr-util/libaprutil.la \ + $(top_srcdir)/srclib/apr/libapr.la + +include $(top_builddir)/build/rules.mk + +test: $(bin_PROGRAMS) + +# example for building a test proggie +# dbu_OBJECTS = dbu.lo +# dbu: $(dbu_OBJECTS) +# $(LINK) $(dbu_OBJECTS) $(PROGRAM_LDADD) diff --git a/test/modules/http2/conf/httpd.conf.template b/test/modules/http2/conf/httpd.conf.template new file mode 100644 index 0000000000..bd0606b402 --- /dev/null +++ b/test/modules/http2/conf/httpd.conf.template @@ -0,0 +1,53 @@ +ServerName localhost +ServerRoot "${server_dir}" + +Include "conf/modules.conf" + +DocumentRoot "${server_dir}/htdocs" + +<IfModule log_config_module> + LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %k" combined + LogFormat "%h %l %u %t \"%r\" %>s %b" common + CustomLog "logs/access_log" combined + +</IfModule> + +TypesConfig "${gen_dir}/apache/conf/mime.types" + +Listen ${http_port} +Listen ${https_port} + +# Insert our test specific configuration before the first vhost, +# so that its vhosts can be the default one. This is relevant in +# certain behaviours, such as protocol selection during SSL ALPN +# negotiation. +# +Include "conf/test.conf" + +RequestReadTimeout header=10 body=10 + +<IfModule deflate_module> + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css +</IfModule> +<IfModule brotli_module> + AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css +</IfModule> + +<VirtualHost *:${http_port}> + ServerName not-forbidden.org + ServerAlias www.not-forbidden.org + + DocumentRoot "${server_dir}/htdocs" +</VirtualHost> + +<Directory "${server_dir}/htdocs/cgi"> + Options Indexes FollowSymLinks + AllowOverride None + Require all granted + + AddHandler cgi-script .py + AddHandler cgi-script .cgi + Options +ExecCGI +</Directory> + + diff --git a/test/modules/http2/conf/mime.types b/test/modules/http2/conf/mime.types new file mode 100644 index 0000000000..b90b165876 --- /dev/null +++ b/test/modules/http2/conf/mime.types @@ -0,0 +1,1588 @@ +# This file maps Internet media types to unique file extension(s). +# Although created for httpd, this file is used by many software systems +# and has been placed in the public domain for unlimited redisribution. +# +# The table below contains both registered and (common) unregistered types. +# A type that has no unique extension can be ignored -- they are listed +# here to guide configurations toward known types and to make it easier to +# identify "new" types. File extensions are also commonly used to indicate +# content languages and encodings, so choose them carefully. +# +# Internet media types should be registered as described in RFC 4288. +# The registry is at <http://www.iana.org/assignments/media-types/>. +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpp-ims+xml +# application/activemessage +application/andrew-inset ez +# application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomicmail +application/atomsvc+xml atomsvc +# application/auth-policy+xml +# application/batch-smtp +# application/beep+xml +# application/calendar+xml +# application/cals-1840 +# application/ccmp+xml +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cnrp+xml +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csta+xml +# application/cstadata+xml +application/cu-seeme cu +# application/cybercash +application/davmount+xml davmount +# application/dca-rft +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +application/emma+xml emma +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/jsonml+json jsonml +# application/kpml-request+xml +# application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +# application/mathml-content+xml +# application/mathml-presentation+xml +application/mathml+xml mathml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media_control+xml +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/tve-trigger +# application/ulpfec +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.collection+json +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +# application/vnd.fujixerox.hbpl +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printing.printticket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.quobject-quoxdocument +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +application/vnd.palm pdb pqa oprc +# application/vnd.paos.xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +# application/vnd.sun.wadl+xml +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.wsc +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-conference nsc +# application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/x-font-woff woff +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info-diff+xml +# application/xcon-conference-info+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/example +# audio/fwdred +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu-wb +# audio/pcmu +# audio/prs.sid +# audio/qcelp +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv0 +# audio/smv-qcp +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.dvb.subtitle sub +image/vnd.djvu djvu djv +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# model/example +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +model/vnd.mts mts +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/directory +# text/dns +# text/ecmascript +# text/enriched +# text/example +# text/fwdred +text/html html htm +# text/javascript +text/n3 n3 +# text/parityfec +text/plain txt text conf def list log in +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/vnd.radisys.msml-basic-layout +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.scurl scurl +text/vnd.curl.mcurl mcurl +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-opml opml +text/x-pascal p pas +text/x-nfo nfo +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raw +# video/rtp-enc-aescm128 +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/test/modules/http2/conf/modules.conf.template b/test/modules/http2/conf/modules.conf.template new file mode 100644 index 0000000000..233b1a92ec --- /dev/null +++ b/test/modules/http2/conf/modules.conf.template @@ -0,0 +1,43 @@ +LoadModule log_config_module "${libexec_dir}/mod_log_config.so" +LoadModule logio_module "${libexec_dir}/mod_logio.so" +LoadModule unixd_module "${libexec_dir}/mod_unixd.so" +LoadModule version_module "${libexec_dir}/mod_version.so" +LoadModule watchdog_module "${libexec_dir}/mod_watchdog.so" +LoadModule authn_core_module "${libexec_dir}/mod_authn_core.so" +LoadModule authz_host_module "${libexec_dir}/mod_authz_host.so" +LoadModule authz_groupfile_module "${libexec_dir}/mod_authz_groupfile.so" +LoadModule authz_user_module "${libexec_dir}/mod_authz_user.so" +LoadModule authz_core_module "${libexec_dir}/mod_authz_core.so" +LoadModule access_compat_module "${libexec_dir}/mod_access_compat.so" +LoadModule auth_basic_module "${libexec_dir}/mod_auth_basic.so" +LoadModule cache_module "${libexec_dir}/mod_cache.so" +LoadModule cache_disk_module "${libexec_dir}/mod_cache_disk.so" +LoadModule cache_socache_module "${libexec_dir}/mod_cache_socache.so" +LoadModule socache_shmcb_module "${libexec_dir}/mod_socache_shmcb.so" +LoadModule dumpio_module "${libexec_dir}/mod_dumpio.so" +LoadModule reqtimeout_module "${libexec_dir}/mod_reqtimeout.so" +LoadModule filter_module "${libexec_dir}/mod_filter.so" +LoadModule mime_module "${libexec_dir}/mod_mime.so" +LoadModule env_module "${libexec_dir}/mod_env.so" +LoadModule headers_module "${libexec_dir}/mod_headers.so" +LoadModule setenvif_module "${libexec_dir}/mod_setenvif.so" +LoadModule slotmem_shm_module "${libexec_dir}/mod_slotmem_shm.so" +LoadModule ssl_module "${libexec_dir}/mod_ssl.so" +LoadModule status_module "${libexec_dir}/mod_status.so" +LoadModule autoindex_module "${libexec_dir}/mod_autoindex.so" +LoadModule cgid_module "${libexec_dir}/mod_cgid.so" +LoadModule dir_module "${libexec_dir}/mod_dir.so" +LoadModule alias_module "${libexec_dir}/mod_alias.so" +LoadModule rewrite_module "${libexec_dir}/mod_rewrite.so" +LoadModule deflate_module "${libexec_dir}/mod_deflate.so" +LoadModule proxy_module "${libexec_dir}/mod_proxy.so" +LoadModule proxy_http_module "${libexec_dir}/mod_proxy_http.so" +LoadModule proxy_balancer_module "${libexec_dir}/mod_proxy_balancer.so" +LoadModule proxy_hcheck_module "${libexec_dir}/mod_proxy_hcheck.so" + +LoadModule http2_module "${libexec_dir}/mod_http2.so" +LoadModule proxy_http2_module "${libexec_dir}/mod_proxy_http2.so" + +# Load the local test module also into the server +LoadModule h2test_module "${test_dir}/mod_h2test/.libs/mod_h2test.so" + diff --git a/test/modules/http2/conf/test.conf b/test/modules/http2/conf/test.conf new file mode 100644 index 0000000000..7534af6c87 --- /dev/null +++ b/test/modules/http2/conf/test.conf @@ -0,0 +1 @@ +# empty placeholder for test specific configurations diff --git a/test/modules/http2/config.ini.in b/test/modules/http2/config.ini.in new file mode 100644 index 0000000000..b89f4938bc --- /dev/null +++ b/test/modules/http2/config.ini.in @@ -0,0 +1,31 @@ +[global] +curl_bin = curl +nghttp = nghttp +h2load = h2load + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +libdir = @libdir@ +libexecdir = @libexecdir@ + +apr_bindir = @APR_BINDIR@ +apxs = @APR_BINDIR@/apxs +apachectl = @sbindir@/apachectl +mpm_modules = @MPM_MODULES@ +enabled_mpm_module = @ENABLED_MPM_MODULE@ +dso_modules = @DSO_MODULES@ + +[httpd] +version = @HTTPD_VERSION@ +name = @progname@ + +[test] +http_port = 40001 +https_port = 40002 +http_tld = tests.httpd.apache.org +test_dir = @abs_srcdir@ +test_src_dir = @abs_srcdir@ +server_dir = @abs_srcdir@/gen/apache +gen_dir = @abs_srcdir@/gen diff --git a/test/modules/http2/conftest.py b/test/modules/http2/conftest.py new file mode 100644 index 0000000000..2b8bb057f2 --- /dev/null +++ b/test/modules/http2/conftest.py @@ -0,0 +1,52 @@ +import logging +import os + +import pytest + +from h2_certs import CertificateSpec, H2TestCA +from h2_env import H2TestEnv + + +class Dummy: + pass + + +def pytest_report_header(config, startdir): + env = H2TestEnv() + return "mod_h2 [apache: {aversion}({prefix}), mpm: {mpm}]".format( + prefix=env.prefix, + aversion=env.get_httpd_version(), + mpm=env.mpm_type + ) + + +@pytest.fixture(scope="session") +def env(pytestconfig) -> H2TestEnv: + level = logging.INFO + console = logging.StreamHandler() + console.setLevel(level) + console.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) + logging.getLogger('').addHandler(console) + logging.getLogger('').setLevel(level=level) + env = H2TestEnv(pytestconfig=pytestconfig) + env.apache_error_log_clear() + cert_specs = [ + CertificateSpec(domains=env.domains, key_type='rsa4096'), + CertificateSpec(domains=env.domains_noh2, key_type='rsa2048'), + ] + ca = H2TestCA.create_root(name=env.http_tld, + store_dir=os.path.join(env.server_dir, 'ca'), key_type="rsa4096") + ca.issue_certs(cert_specs) + env.set_ca(ca) + return env + + +@pytest.fixture(autouse=True, scope="session") +def _session_scope(env): + yield + assert env.apache_stop() == 0 + errors, warnings = env.apache_errors_and_warnings() + assert (len(errors), len(warnings)) == (0, 0),\ + f"apache logged {len(errors)} errors and {len(warnings)} warnings: \n"\ + "{0}\n{1}\n".format("\n".join(errors), "\n".join(warnings)) + diff --git a/test/modules/http2/data/nghttp-output-100k-1.txt b/test/modules/http2/data/nghttp-output-100k-1.txt new file mode 100644 index 0000000000..1889877e6e --- /dev/null +++ b/test/modules/http2/data/nghttp-output-100k-1.txt @@ -0,0 +1,1153 @@ +execute: /usr/bin/nghttp -v --header=host: cgi.tests.httpd.apache.org:42002 --data=/home/ylavic/src/apache/mod_h2/test/gen/data-100k https://127.0.0.1:42002//echo.py +stderr: [WARNING] Certificate verification failed: unable to verify the first certificate + +stdout: [ 0.001] Connected +The negotiated protocol: h2 +[ 0.003] send SETTINGS frame <length=12, flags=0x00, stream_id=0> + (niv=2) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] + [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] +[ 0.003] send PRIORITY frame <length=5, flags=0x00, stream_id=3> + (dep_stream_id=0, weight=201, exclusive=0) +[ 0.003] send PRIORITY frame <length=5, flags=0x00, stream_id=5> + (dep_stream_id=0, weight=101, exclusive=0) +[ 0.003] send PRIORITY frame <length=5, flags=0x00, stream_id=7> + (dep_stream_id=0, weight=1, exclusive=0) +[ 0.003] send PRIORITY frame <length=5, flags=0x00, stream_id=9> + (dep_stream_id=7, weight=1, exclusive=0) +[ 0.003] send PRIORITY frame <length=5, flags=0x00, stream_id=11> + (dep_stream_id=3, weight=1, exclusive=0) +[ 0.003] send HEADERS frame <length=78, flags=0x24, stream_id=13> + ; END_HEADERS | PRIORITY + (padlen=0, dep_stream_id=11, weight=16, exclusive=0) + ; Open new stream + :method: POST + :path: //echo.py + :scheme: https + :authority: 127.0.0.1:42002 + accept: */* + accept-encoding: gzip, deflate + user-agent: nghttp2/1.36.0 + content-length: 100000 + host: cgi.tests.httpd.apache.org:42002 +[ 0.003] send DATA frame <length=16384, flags=0x00, stream_id=13> +[ 0.003] send DATA frame <length=16384, flags=0x00, stream_id=13> +[ 0.003] send DATA frame <length=16384, flags=0x00, stream_id=13> +[ 0.003] send DATA frame <length=16383, flags=0x00, stream_id=13> +[ 0.006] recv SETTINGS frame <length=6, flags=0x00, stream_id=0> + (niv=1) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] +[ 0.006] recv SETTINGS frame <length=0, flags=0x01, stream_id=0> + ; ACK + (niv=0) +[ 0.006] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0> + (window_size_increment=2147418112) +[ 0.006] send SETTINGS frame <length=0, flags=0x01, stream_id=0> + ; ACK + (niv=0) +[ 0.007] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=13> + (window_size_increment=65535) +[ 0.007] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=13> + (window_size_increment=65536) +[ 0.007] send DATA frame <length=16384, flags=0x00, stream_id=13> +[ 0.007] send DATA frame <length=16384, flags=0x00, stream_id=13> +[ 0.007] send DATA frame <length=1697, flags=0x01, stream_id=13> + ; END_STREAM +[ 0.023] recv (stream_id=13) :status: 200 +[ 0.023] recv (stream_id=13) date: Wed, 13 Feb 2019 17:42:49 GMT +[ 0.023] recv (stream_id=13) server: Apache/2.5.1-dev (Unix) OpenSSL/1.1.1a +[ 0.023] recv (stream_id=13) content-type: application/data +[ 0.023] recv HEADERS frame <length=69, flags=0x04, stream_id=13> + ; END_HEADERS + (padlen=0) + ; First response header +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.023] recv DATA frame <length=1291, flags=0x00, stream_id=13> +12345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.023] recv DATA frame <length=1291, flags=0x00, stream_id=13> +23456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.023] recv DATA frame <length=1291, flags=0x00, stream_id=13> +34567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123[ 0.023] recv DATA frame <length=1291, flags=0x00, stream_id=13> +45678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234[ 0.024] recv DATA frame <length=1291, flags=0x00, stream_id=13> +56789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345[ 0.024] recv DATA frame <length=1291, flags=0x00, stream_id=13> +67890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456[ 0.024] recv DATA frame <length=1291, flags=0x00, stream_id=13> +78901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567[ 0.024] recv DATA frame <length=1291, flags=0x00, stream_id=13> +89012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678[ 0.024] recv DATA frame <length=1291, flags=0x00, stream_id=13> +90123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789[ 0.024] recv DATA frame <length=1291, flags=0x00, stream_id=13> +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0[ 0.024] recv DATA frame <length=1291, flags=0x00, stream_id=13> +12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +2345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456789012[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +3456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +4567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +5678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +6789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +7890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +8901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +9012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +0123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +2345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.025] recv DATA frame <length=1291, flags=0x00, stream_id=13> +567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +[ 0.026] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0> + (window_size_increment=33566) +[ 0.026] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=13> + (window_size_increment=33566) +678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +45678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +56789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +67890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +78901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +89012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +90123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +01234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +12345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901[ 0.026] recv DATA frame <length=1291, flags=0x00, stream_id=13> +23456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012[ 0.027] recv DATA frame <length=1291, flags=0x00, stream_id=13> +34567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123[ 0.027] recv DATA frame <length=1291, flags=0x00, stream_id=13> +45678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.027] recv DATA frame <length=1291, flags=0x00, stream_id=13> +5678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345[ 0.027] recv DATA frame <length=1291, flags=0x00, stream_id=13> +6789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456[ 0.027] recv DATA frame <length=1291, flags=0x00, stream_id=13> +7890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567[ 0.027] recv DATA frame <length=1291, flags=0x00, stream_id=13> +8901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678[ 0.027] recv DATA frame <length=1291, flags=0x00, stream_id=13> +9012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789[ 0.027] recv DATA frame <length=1291, flags=0x00, stream_id=13> +0123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234[ 0.028] recv DATA frame <length=985, flags=0x00, stream_id=13> +5678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +6789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012[ 0.028] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0> + (window_size_increment=33260) +[ 0.028] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=13> + (window_size_increment=33260) +3456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +7890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +8901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> + +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345[ 0.028] recv DATA frame <length=1291, flags=0x00, stream_id=13> +678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +12345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +23456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +34567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +45678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +56789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +67890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +78901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +89012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +90123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0[ 0.029] recv DATA frame <length=1291, flags=0x00, stream_id=13> +12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +[ 0.029] recv DATA frame <length=899, flags=0x01, stream_id=13> + ; END_STREAM +[ 0.029] send GOAWAY frame <length=8, flags=0x00, stream_id=0> + (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) + diff --git a/test/modules/http2/data/nghttp-output-10k-1.txt b/test/modules/http2/data/nghttp-output-10k-1.txt new file mode 100644 index 0000000000..fe19b46fbb --- /dev/null +++ b/test/modules/http2/data/nghttp-output-10k-1.txt @@ -0,0 +1,166 @@ +stderr: [WARNING] Certificate verification failed: unable to verify the first certificate + +stdout: [ 0.002] Connected +The negotiated protocol: h2 +[ 0.004] send SETTINGS frame <length=12, flags=0x00, stream_id=0> + (niv=2) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] + [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=3> + (dep_stream_id=0, weight=201, exclusive=0) +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=5> + (dep_stream_id=0, weight=101, exclusive=0) +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=7> + (dep_stream_id=0, weight=1, exclusive=0) +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=9> + (dep_stream_id=7, weight=1, exclusive=0) +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=11> + (dep_stream_id=3, weight=1, exclusive=0) +[ 0.004] send HEADERS frame <length=78, flags=0x24, stream_id=13> + ; END_HEADERS | PRIORITY + (padlen=0, dep_stream_id=11, weight=16, exclusive=0) + ; Open new stream + :method: POST + :path: //echo.py + :scheme: https + :authority: 127.0.0.1:42002 + accept: */* + accept-encoding: gzip, deflate + user-agent: nghttp2/1.33.0 + content-length: 10000 + host: cgi.tests.httpd.apache.org:42002 +[ 0.004] send DATA frame <length=10000, flags=0x01, stream_id=13> + ; END_STREAM +[ 0.005] recv SETTINGS frame <length=6, flags=0x00, stream_id=0> + (niv=1) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] +[ 0.005] recv SETTINGS frame <length=0, flags=0x01, stream_id=0> + ; ACK + (niv=0) +[ 0.005] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0> + (window_size_increment=2147418112) +[ 0.005] send SETTINGS frame <length=0, flags=0x01, stream_id=0> + ; ACK + (niv=0) +[ 0.038] recv (stream_id=13) :status: 200 +[ 0.038] recv (stream_id=13) date: Thu, 14 Feb 2019 11:50:20 GMT +[ 0.038] recv (stream_id=13) server: Apache/2.4.39-dev (Unix) OpenSSL/1.1.1 +[ 0.038] recv (stream_id=13) content-type: application/data +[ 0.038] recv HEADERS frame <length=70, flags=0x04, stream_id=13> + ; END_HEADERS + (padlen=0) + ; First response header +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.038] recv DATA frame <length=1291, flags=0x00, stream_id=13> +12345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.038] recv DATA frame <length=1291, flags=0x00, stream_id=13> +23456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.038] recv DATA frame <length=1291, flags=0x00, stream_id=13> +34567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123[ 0.038] recv DATA frame <length=1291, flags=0x00, stream_id=13> +45678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234[ 0.038] recv DATA frame <length=1291, flags=0x00, stream_id=13> +56789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345[ 0.038] recv DATA frame <length=1291, flags=0x00, stream_id=13> +67890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567[ 0.038] recv DATA frame <length=402, flags=0x00, stream_id=13> +890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678[ 0.039] recv DATA frame <length=1291, flags=0x00, stream_id=13> +901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +[ 0.039] recv DATA frame <length=561, flags=0x00, stream_id=13> +[ 0.039] recv DATA frame <length=0, flags=0x01, stream_id=13> + ; END_STREAM +[ 0.039] send GOAWAY frame <length=8, flags=0x00, stream_id=0> + (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) + diff --git a/test/modules/http2/data/nghttp-output-1k-1.txt b/test/modules/http2/data/nghttp-output-1k-1.txt new file mode 100644 index 0000000000..de9964c7ca --- /dev/null +++ b/test/modules/http2/data/nghttp-output-1k-1.txt @@ -0,0 +1,68 @@ +stderr: [WARNING] Certificate verification failed: unable to verify the first certificate + +stdout: [ 0.002] Connected +The negotiated protocol: h2 +[ 0.004] send SETTINGS frame <length=12, flags=0x00, stream_id=0> + (niv=2) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] + [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=3> + (dep_stream_id=0, weight=201, exclusive=0) +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=5> + (dep_stream_id=0, weight=101, exclusive=0) +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=7> + (dep_stream_id=0, weight=1, exclusive=0) +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=9> + (dep_stream_id=7, weight=1, exclusive=0) +[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=11> + (dep_stream_id=3, weight=1, exclusive=0) +[ 0.004] send HEADERS frame <length=77, flags=0x24, stream_id=13> + ; END_HEADERS | PRIORITY + (padlen=0, dep_stream_id=11, weight=16, exclusive=0) + ; Open new stream + :method: POST + :path: //echo.py + :scheme: https + :authority: 127.0.0.1:42002 + accept: */* + accept-encoding: gzip, deflate + user-agent: nghttp2/1.33.0 + content-length: 1000 + host: cgi.tests.httpd.apache.org:42002 +[ 0.004] send DATA frame <length=1000, flags=0x01, stream_id=13> + ; END_STREAM +[ 0.005] recv SETTINGS frame <length=6, flags=0x00, stream_id=0> + (niv=1) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] +[ 0.005] recv SETTINGS frame <length=0, flags=0x01, stream_id=0> + ; ACK + (niv=0) +[ 0.005] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0> + (window_size_increment=2147418112) +[ 0.005] send SETTINGS frame <length=0, flags=0x01, stream_id=0> + ; ACK + (niv=0) +[ 0.048] recv (stream_id=13) :status: 200 +[ 0.048] recv (stream_id=13) date: Thu, 14 Feb 2019 11:48:18 GMT +[ 0.048] recv (stream_id=13) server: Apache/2.4.39-dev (Unix) OpenSSL/1.1.1 +[ 0.048] recv (stream_id=13) content-type: application/data +[ 0.048] recv HEADERS frame <length=70, flags=0x04, stream_id=13> + ; END_HEADERS + (padlen=0) + ; First response header +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +[ 0.048] recv DATA frame <length=1000, flags=0x00, stream_id=13> +[ 0.048] recv DATA frame <length=0, flags=0x01, stream_id=13> + ; END_STREAM +[ 0.048] send GOAWAY frame <length=8, flags=0x00, stream_id=0> + (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) + diff --git a/test/modules/http2/h2_certs.py b/test/modules/http2/h2_certs.py new file mode 100644 index 0000000000..42f8836021 --- /dev/null +++ b/test/modules/http2/h2_certs.py @@ -0,0 +1,447 @@ +import os +import re +from datetime import timedelta, datetime +from typing import List, Any, Optional + +from cryptography import x509 +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric import ec, rsa +from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePrivateKey +from cryptography.hazmat.primitives.asymmetric.rsa import RSAPrivateKey +from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption, load_pem_private_key +from cryptography.x509 import ExtendedKeyUsageOID, NameOID + + +EC_SUPPORTED = {} +EC_SUPPORTED.update([(curve.name.upper(), curve) for curve in [ + ec.BrainpoolP256R1, + ec.BrainpoolP384R1, + ec.BrainpoolP512R1, + ec.SECP192R1, + ec.SECP224R1, + ec.SECP256R1, + ec.SECP384R1, +]]) + + +def _private_key(key_type): + if isinstance(key_type, str): + key_type = key_type.upper() + m = re.match(r'^(RSA)?(\d+)$', key_type) + if m: + key_type = int(m.group(2)) + + if isinstance(key_type, int): + return rsa.generate_private_key( + public_exponent=65537, + key_size=key_type, + backend=default_backend() + ) + if not isinstance(key_type, ec.EllipticCurve) and key_type in EC_SUPPORTED: + key_type = EC_SUPPORTED[key_type] + return ec.generate_private_key( + curve=key_type, + backend=default_backend() + ) + + +class CertificateSpec: + + def __init__(self, name: str = None, domains: List[str] = None, + email: str = None, + key_type: str = None, single_file: bool = False, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + client: bool = False, + sub_specs: List['CertificateSpec'] = None): + self._name = name + self.domains = domains + self.client = client + self.email = email + self.key_type = key_type + self.single_file = single_file + self.valid_from = valid_from + self.valid_to = valid_to + self.sub_specs = sub_specs + + @property + def name(self) -> Optional[str]: + if self._name: + return self._name + elif self.domains: + return self.domains[0] + return None + + +class Credentials: + + def __init__(self, name: str, cert: Any, pkey: Any): + self._name = name + self._cert = cert + self._pkey = pkey + self._cert_file = None + self._pkey_file = None + self._store = None + + @property + def name(self) -> str: + return self._name + + @property + def subject(self) -> x509.Name: + return self._cert.subject + + @property + def key_type(self): + if isinstance(self._pkey, RSAPrivateKey): + return f"rsa{self._pkey.key_size}" + elif isinstance(self._pkey, EllipticCurvePrivateKey): + return f"{self._pkey.curve.name}" + else: + raise Exception(f"unknown key type: {self._pkey}") + + @property + def private_key(self) -> Any: + return self._pkey + + @property + def certificate(self) -> Any: + return self._cert + + @property + def cert_pem(self) -> bytes: + return self._cert.public_bytes(Encoding.PEM) + + @property + def pkey_pem(self) -> bytes: + return self._pkey.private_bytes( + Encoding.PEM, + PrivateFormat.TraditionalOpenSSL if self.key_type.startswith('rsa') else PrivateFormat.PKCS8, + NoEncryption()) + + def set_store(self, store: 'CertStore'): + self._store = store + + def set_files(self, cert_file: str, pkey_file: str = None): + self._cert_file = cert_file + self._pkey_file = pkey_file + + @property + def cert_file(self) -> str: + return self._cert_file + + @property + def pkey_file(self) -> Optional[str]: + return self._pkey_file + + def get_first(self, name) -> Optional['Credentials']: + creds = self._store.get_credentials_for_name(name) if self._store else [] + return creds[0] if len(creds) else None + + def get_credentials_for_name(self, name) -> List['Credentials']: + return self._store.get_credentials_for_name(name) if self._store else [] + + def issue_certs(self, specs: List[CertificateSpec], + chain: List['Credentials'] = None) -> List['Credentials']: + return [self.issue_cert(spec=spec, chain=chain) for spec in specs] + + def issue_cert(self, spec: CertificateSpec, chain: List['Credentials'] = None) -> 'Credentials': + key_type = spec.key_type if spec.key_type else self.key_type + creds = self._store.load_credentials(name=spec.name, key_type=key_type, single_file=spec.single_file) \ + if self._store else None + if creds is None: + creds = H2TestCA.create_credentials(spec=spec, issuer=self, key_type=key_type, + valid_from=spec.valid_from, valid_to=spec.valid_to) + if self._store: + self._store.save(creds, single_file=spec.single_file) + + if spec.sub_specs: + if self._store: + sub_store = CertStore(fpath=os.path.join(self._store.path, creds.name)) + creds.set_store(sub_store) + subchain = chain.copy() if chain else [] + subchain.append(self) + creds.issue_certs(spec.sub_specs, chain=subchain) + return creds + + +class CertStore: + + def __init__(self, fpath: str): + self._store_dir = fpath + if not os.path.exists(self._store_dir): + os.makedirs(self._store_dir) + self._creds_by_name = {} + + @property + def path(self) -> str: + return self._store_dir + + def save(self, creds: Credentials, name: str = None, + chain: List[Credentials] = None, + single_file: bool = False) -> None: + name = name if name is not None else creds.name + cert_file = self.get_cert_file(name=name, key_type=creds.key_type) + pkey_file = self.get_pkey_file(name=name, key_type=creds.key_type) + if single_file: + pkey_file = None + with open(cert_file, "wb") as fd: + fd.write(creds.cert_pem) + if chain: + for c in chain: + fd.write(c.cert_pem) + if pkey_file is None: + fd.write(creds.pkey_pem) + if pkey_file is not None: + with open(pkey_file, "wb") as fd: + fd.write(creds.pkey_pem) + creds.set_files(cert_file, pkey_file) + self._add_credentials(name, creds) + + def _add_credentials(self, name: str, creds: Credentials): + if name not in self._creds_by_name: + self._creds_by_name[name] = [] + self._creds_by_name[name].append(creds) + + def get_credentials_for_name(self, name) -> List[Credentials]: + return self._creds_by_name[name] if name in self._creds_by_name else [] + + def get_cert_file(self, name: str, key_type=None) -> str: + key_infix = ".{0}".format(key_type) if key_type is not None else "" + return os.path.join(self._store_dir, f'{name}{key_infix}.cert.pem') + + def get_pkey_file(self, name: str, key_type=None) -> str: + key_infix = ".{0}".format(key_type) if key_type is not None else "" + return os.path.join(self._store_dir, f'{name}{key_infix}.pkey.pem') + + def load_pem_cert(self, fpath: str) -> x509.Certificate: + with open(fpath) as fd: + return x509.load_pem_x509_certificate("".join(fd.readlines()).encode()) + + def load_pem_pkey(self, fpath: str): + with open(fpath) as fd: + return load_pem_private_key("".join(fd.readlines()).encode(), password=None) + + def load_credentials(self, name: str, key_type=None, single_file: bool = False): + cert_file = self.get_cert_file(name=name, key_type=key_type) + pkey_file = cert_file if single_file else self.get_pkey_file(name=name, key_type=key_type) + if os.path.isfile(cert_file) and os.path.isfile(pkey_file): + cert = self.load_pem_cert(cert_file) + pkey = self.load_pem_pkey(pkey_file) + creds = Credentials(name=name, cert=cert, pkey=pkey) + creds.set_store(self) + creds.set_files(cert_file, pkey_file) + self._add_credentials(name, creds) + return creds + return None + + +class H2TestCA: + + @classmethod + def create_root(cls, name: str, store_dir: str, key_type: str = "rsa2048") -> Credentials: + store = CertStore(fpath=store_dir) + creds = store.load_credentials(name="ca", key_type=key_type) + if creds is None: + creds = H2TestCA._make_ca_credentials(name=name, key_type=key_type) + store.save(creds, name="ca") + creds.set_store(store) + return creds + + @staticmethod + def create_credentials(spec: CertificateSpec, issuer: Credentials, key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + """Create a certificate signed by this CA for the given domains. + :returns: the certificate and private key PEM file paths + """ + if spec.domains and len(spec.domains): + creds = H2TestCA._make_server_credentials(name=spec.name, domains=spec.domains, + issuer=issuer, valid_from=valid_from, + valid_to=valid_to, key_type=key_type) + elif spec.client: + creds = H2TestCA._make_client_credentials(name=spec.name, issuer=issuer, + email=spec.email, valid_from=valid_from, + valid_to=valid_to, key_type=key_type) + elif spec.name: + creds = H2TestCA._make_ca_credentials(name=spec.name, issuer=issuer, + valid_from=valid_from, valid_to=valid_to, + key_type=key_type) + else: + raise Exception(f"unrecognized certificate specification: {spec}") + return creds + + @staticmethod + def _make_x509_name(org_name: str = None, common_name: str = None, parent: x509.Name = None) -> x509.Name: + name_pieces = [] + if org_name: + oid = NameOID.ORGANIZATIONAL_UNIT_NAME if parent else NameOID.ORGANIZATION_NAME + name_pieces.append(x509.NameAttribute(oid, org_name)) + elif common_name: + name_pieces.append(x509.NameAttribute(NameOID.COMMON_NAME, common_name)) + if parent: + name_pieces.extend([rdn for rdn in parent]) + return x509.Name(name_pieces) + + @staticmethod + def _make_csr( + subject: x509.Name, + pkey: Any, + issuer_subject: Optional[Credentials], + valid_from_delta: timedelta = None, + valid_until_delta: timedelta = None + ): + pubkey = pkey.public_key() + issuer_subject = issuer_subject if issuer_subject is not None else subject + + valid_from = datetime.now() + if valid_until_delta is not None: + valid_from += valid_from_delta + valid_until = datetime.now() + if valid_until_delta is not None: + valid_until += valid_until_delta + + return ( + x509.CertificateBuilder() + .subject_name(subject) + .issuer_name(issuer_subject) + .public_key(pubkey) + .not_valid_before(valid_from) + .not_valid_after(valid_until) + .serial_number(x509.random_serial_number()) + .add_extension( + x509.SubjectKeyIdentifier.from_public_key(pubkey), + critical=False, + ) + ) + + @staticmethod + def _add_ca_usages(csr: Any) -> Any: + return csr.add_extension( + x509.BasicConstraints(ca=True, path_length=9), + critical=True, + ).add_extension( + x509.KeyUsage( + digital_signature=True, + content_commitment=False, + key_encipherment=False, + data_encipherment=False, + key_agreement=False, + key_cert_sign=True, + crl_sign=True, + encipher_only=False, + decipher_only=False), + critical=True + ).add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.CLIENT_AUTH, + ExtendedKeyUsageOID.SERVER_AUTH, + ExtendedKeyUsageOID.CODE_SIGNING, + ]), + critical=True + ) + + @staticmethod + def _add_leaf_usages(csr: Any, domains: List[str], issuer: Credentials) -> Any: + return csr.add_extension( + x509.BasicConstraints(ca=False, path_length=None), + critical=True, + ).add_extension( + x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier( + issuer.certificate.extensions.get_extension_for_class( + x509.SubjectKeyIdentifier).value), + critical=False + ).add_extension( + x509.SubjectAlternativeName([x509.DNSName(domain) for domain in domains]), + critical=True, + ).add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.SERVER_AUTH, + ]), + critical=True + ) + + @staticmethod + def _add_client_usages(csr: Any, issuer: Credentials, rfc82name: str = None) -> Any: + cert = csr.add_extension( + x509.BasicConstraints(ca=False, path_length=None), + critical=True, + ).add_extension( + x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier( + issuer.certificate.extensions.get_extension_for_class( + x509.SubjectKeyIdentifier).value), + critical=False + ) + if rfc82name: + cert.add_extension( + x509.SubjectAlternativeName([x509.RFC822Name(rfc82name)]), + critical=True, + ) + cert.add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.CLIENT_AUTH, + ]), + critical=True + ) + return cert + + @staticmethod + def _make_ca_credentials(name, key_type: Any, + issuer: Credentials = None, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + pkey = _private_key(key_type=key_type) + if issuer is not None: + issuer_subject = issuer.certificate.subject + issuer_key = issuer.private_key + else: + issuer_subject = None + issuer_key = pkey + subject = H2TestCA._make_x509_name(org_name=name, parent=issuer.subject if issuer else None) + csr = H2TestCA._make_csr(subject=subject, + issuer_subject=issuer_subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = H2TestCA._add_ca_usages(csr) + cert = csr.sign(private_key=issuer_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey) + + @staticmethod + def _make_server_credentials(name: str, domains: List[str], issuer: Credentials, + key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + name = name + pkey = _private_key(key_type=key_type) + subject = H2TestCA._make_x509_name(common_name=name, parent=issuer.subject) + csr = H2TestCA._make_csr(subject=subject, + issuer_subject=issuer.certificate.subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = H2TestCA._add_leaf_usages(csr, domains=domains, issuer=issuer) + cert = csr.sign(private_key=issuer.private_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey) + + @staticmethod + def _make_client_credentials(name: str, + issuer: Credentials, email: Optional[str], + key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + pkey = _private_key(key_type=key_type) + subject = H2TestCA._make_x509_name(common_name=name, parent=issuer.subject) + csr = H2TestCA._make_csr(subject=subject, + issuer_subject=issuer.certificate.subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = H2TestCA._add_client_usages(csr, issuer=issuer, rfc82name=email) + cert = csr.sign(private_key=issuer.private_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey) diff --git a/test/modules/http2/h2_conf.py b/test/modules/http2/h2_conf.py new file mode 100644 index 0000000000..743ccc8c43 --- /dev/null +++ b/test/modules/http2/h2_conf.py @@ -0,0 +1,147 @@ +import os + + +class HttpdConf(object): + + def __init__(self, env, path=None): + self.env = env + self._lines = [] + self._has_ssl_vhost = False + + def install(self): + if not self._has_ssl_vhost: + self.add_vhost_test1() + self.env.install_test_conf(self._lines) + + def add(self, line): + if isinstance(line, list): + self._lines.extend(line) + else: + self._lines.append(line) + return self + + def add_vhost(self, port, name, aliases=None, doc_root="htdocs", with_ssl=True): + self.start_vhost(port, name, aliases, doc_root, with_ssl) + self.end_vhost() + return self + + def start_vhost(self, port, name, aliases=None, doc_root="htdocs", with_ssl=True): + server_domain = f"{name}.{self.env.http_tld}" + lines = [ + f"<VirtualHost *:{port}>", + f" ServerName {server_domain}" + ] + if aliases: + lines.extend([ + f" ServerAlias {alias}.{self.env.http_tld}" for alias in aliases]) + lines.append(f" DocumentRoot {doc_root}") + if with_ssl: + self._has_ssl_vhost = True + lines.append(" SSLEngine on") + for cred in self.env.get_credentials_for_name(server_domain): + lines.extend([ + f"SSLCertificateFile {cred.cert_file}", + f"SSLCertificateKeyFile {cred.pkey_file}", + ]) + return self.add(lines) + + def end_vhost(self): + self.add("</VirtualHost>") + return self + + def add_proxies(self, host, proxy_self=False, h2proxy_self=False): + if proxy_self or h2proxy_self: + self.add(" ProxyPreserveHost on") + if proxy_self: + self.add(f""" + ProxyPass /proxy/ http://127.0.0.1:{self.env.http_port}/ + ProxyPassReverse /proxy/ http://{host}.{self.env.http_tld}:{self.env.http_port}/ + """) + if h2proxy_self: + self.add(f""" + ProxyPass /h2proxy/ h2://127.0.0.1:{self.env.https_port}/ + ProxyPassReverse /h2proxy/ https://{host}.{self.env.http_tld}:self.env.https_port/ + """) + return self + + def add_vhost_test1(self, proxy_self=False, h2proxy_self=False, extras=None): + domain = f"test1.{self.env.http_tld}" + if extras and 'base' in extras: + self.add(extras['base']) + self.start_vhost( + self.env.http_port, "test1", aliases=["www1"], doc_root="htdocs/test1", with_ssl=False + ).add( + " Protocols h2c http/1.1" + ).end_vhost() + self.start_vhost( + self.env.https_port, "test1", aliases=["www1"], doc_root="htdocs/test1", with_ssl=True) + self.add(f""" + Protocols h2 http/1.1 + <Location /006> + Options +Indexes + HeaderName /006/header.html + </Location> + {extras[domain] if extras and domain in extras else ""} + """) + self.add_proxies("test1", proxy_self, h2proxy_self) + self.end_vhost() + return self + + def add_vhost_test2(self): + self.start_vhost(self.env.http_port, "test2", aliases=["www2"], doc_root="htdocs/test2", with_ssl=False) + self.add(" Protocols http/1.1 h2c") + self.end_vhost() + self.start_vhost(self.env.https_port, "test2", aliases=["www2"], doc_root="htdocs/test2", with_ssl=True) + self.add(""" + Protocols http/1.1 h2 + <Location /006> + Options +Indexes + HeaderName /006/header.html + </Location>""") + self.end_vhost() + return self + + def add_vhost_cgi(self, proxy_self=False, h2proxy_self=False): + if proxy_self: + self.add_proxy_setup() + if h2proxy_self: + self.add(" SSLProxyEngine on") + self.add(" SSLProxyCheckPeerName off") + self.start_vhost(self.env.https_port, "cgi", aliases=["cgi-alias"], doc_root="htdocs/cgi", with_ssl=True) + self.add(""" + Protocols h2 http/1.1 + SSLOptions +StdEnvVars + AddHandler cgi-script .py + <Location \"/.well-known/h2/state\"> + SetHandler http2-status + </Location>""") + self.add_proxies("cgi", proxy_self, h2proxy_self) + self.add(" <Location \"/h2test/echo\">") + self.add(" SetHandler h2test-echo") + self.add(" </Location>") + self.end_vhost() + self.start_vhost(self.env.http_port, "cgi", aliases=["cgi-alias"], doc_root="htdocs/cgi", with_ssl=False) + self.add(" AddHandler cgi-script .py") + self.end_vhost() + self.add(" LogLevel proxy:info") + self.add(" LogLevel proxy_http:info") + return self + + def add_vhost_noh2(self): + self.start_vhost(self.env.https_port, "noh2", aliases=["noh2-alias"], doc_root="htdocs/noh2", with_ssl=True) + self.add(f""" + Protocols http/1.1 + SSLOptions +StdEnvVars""") + self.end_vhost() + self.start_vhost(self.env.http_port, "noh2", aliases=["noh2-alias"], doc_root="htdocs/noh2", with_ssl=False) + self.add(" Protocols http/1.1") + self.add(" SSLOptions +StdEnvVars") + self.end_vhost() + return self + + def add_proxy_setup(self): + self.add("ProxyStatus on") + self.add("ProxyTimeout 5") + self.add("SSLProxyEngine on") + self.add("SSLProxyVerify none") + return self diff --git a/test/modules/http2/h2_env.py b/test/modules/http2/h2_env.py new file mode 100644 index 0000000000..b3e98520d2 --- /dev/null +++ b/test/modules/http2/h2_env.py @@ -0,0 +1,543 @@ +import inspect +import logging +import re +import os +import shutil +import stat +import subprocess +import sys +import time +from datetime import datetime, timedelta +from string import Template +from typing import List + +import requests + +from configparser import ConfigParser, ExtendedInterpolation +from urllib.parse import urlparse + +from h2_certs import Credentials +from h2_nghttp import Nghttp +from h2_result import ExecResult + + +log = logging.getLogger(__name__) + + +class Dummy: + pass + + +class H2TestSetup: + + def __init__(self, env: 'H2TestEnv'): + self.env = env + + def make(self): + self._make_dirs() + self._make_conf() + self._make_htdocs() + self._make_h2test() + + def _make_dirs(self): + if os.path.exists(self.env.gen_dir): + shutil.rmtree(self.env.gen_dir) + os.makedirs(self.env.gen_dir) + if not os.path.exists(self.env.server_logs_dir): + os.makedirs(self.env.server_logs_dir) + + def _make_conf(self): + conf_src_dir = os.path.join(self.env.test_dir, 'conf') + conf_dest_dir = os.path.join(self.env.server_dir, 'conf') + if not os.path.exists(conf_dest_dir): + os.makedirs(conf_dest_dir) + for name in os.listdir(conf_src_dir): + src_path = os.path.join(conf_src_dir, name) + m = re.match(r'(.+).template', name) + if m: + self._make_template(src_path, os.path.join(conf_dest_dir, m.group(1))) + elif os.path.isfile(src_path): + shutil.copy(src_path, os.path.join(conf_dest_dir, name)) + + def _make_template(self, src, dest): + var_map = dict() + for name, value in self.env.__class__.__dict__.items(): + if isinstance(value, property): + var_map[name] = value.fget(self.env) + t = Template(''.join(open(src).readlines())) + with open(dest, 'w') as fd: + fd.write(t.substitute(var_map)) + + def _make_htdocs(self): + if not os.path.exists(self.env.server_docs_dir): + os.makedirs(self.env.server_docs_dir) + shutil.copytree(os.path.join(self.env.test_dir, 'htdocs'), + os.path.join(self.env.server_dir, 'htdocs'), + dirs_exist_ok=True) + cgi_dir = os.path.join(self.env.server_dir, 'htdocs/cgi') + for name in os.listdir(cgi_dir): + if re.match(r'.+\.py', name): + cgi_file = os.path.join(cgi_dir, name) + st = os.stat(cgi_file) + os.chmod(cgi_file, st.st_mode | stat.S_IEXEC) + + def _make_h2test(self): + subprocess.run([self.env.apxs, '-c', 'mod_h2test.c'], + capture_output=True, check=True, + cwd=os.path.join(self.env.test_dir, 'mod_h2test')) + + +class H2TestEnv: + + def __init__(self, pytestconfig=None): + our_dir = os.path.dirname(inspect.getfile(Dummy)) + self.config = ConfigParser(interpolation=ExtendedInterpolation()) + self.config.read(os.path.join(our_dir, 'config.ini')) + + self._apxs = self.config.get('global', 'apxs') + self._prefix = self.config.get('global', 'prefix') + self._apachectl = self.config.get('global', 'apachectl') + self._libexec_dir = self.get_apxs_var('LIBEXECDIR') + + self._curl = self.config.get('global', 'curl_bin') + self._nghttp = self.config.get('global', 'nghttp') + self._h2load = self.config.get('global', 'h2load') + self._ca = None + + self._http_port = int(self.config.get('test', 'http_port')) + self._https_port = int(self.config.get('test', 'https_port')) + self._http_tld = self.config.get('test', 'http_tld') + self._test_dir = self.config.get('test', 'test_dir') + self._test_src_dir = self.config.get('test', 'test_src_dir') + self._gen_dir = self.config.get('test', 'gen_dir') + self._server_dir = self.config.get('test', 'server_dir') + self._server_conf_dir = os.path.join(self._server_dir, "conf") + self._server_docs_dir = os.path.join(self._server_dir, "htdocs") + self._server_logs_dir = os.path.join(self.server_dir, "logs") + self._server_error_log = os.path.join(self._server_logs_dir, "error_log") + self._domains = [ + f"test1.{self._http_tld}", + f"test2.{self._http_tld}", + f"test3.{self._http_tld}", + f"cgi.{self._http_tld}", + f"push.{self._http_tld}", + f"hints.{self._http_tld}", + f"ssl.{self._http_tld}", + f"pad0.{self._http_tld}", + f"pad1.{self._http_tld}", + f"pad2.{self._http_tld}", + f"pad3.{self._http_tld}", + f"pad8.{self._http_tld}", + ] + self._domains_noh2 = [ + f"noh2.{self._http_tld}", + ] + self._mpm_type = os.environ['MPM'] if 'MPM' in os.environ else 'event' + + self._httpd_addr = "127.0.0.1" + self._http_base = f"http://{self._httpd_addr}:{self.http_port}" + self._https_base = f"https://{self._httpd_addr}:{self.https_port}" + + self._test_conf = os.path.join(self._server_conf_dir, "test.conf") + self._httpd_base_conf = f""" + LoadModule mpm_{self.mpm_type}_module \"{self.libexec_dir}/mod_mpm_{self.mpm_type}.so\" + H2MinWorkers 1 + H2MaxWorkers 64 + SSLSessionCache "shmcb:ssl_gcache_data(32000)" + """ + py_verbosity = pytestconfig.option.verbose if pytestconfig is not None else 0 + if py_verbosity >= 2: + self._httpd_base_conf += f""" + LogLevel http2:trace2 proxy_http2:info + LogLevel core:trace5 mpm_{self.mpm_type}:trace5 + """ + if py_verbosity >= 1: + self._httpd_base_conf += "LogLevel http2:debug proxy_http2:debug" + else: + self._httpd_base_conf += "LogLevel http2:info proxy_http2:info" + + self._verify_certs = False + self._setup = H2TestSetup(env=self) + self._setup.make() + + @property + def apxs(self) -> str: + return self._apxs + + @property + def prefix(self) -> str: + return self._prefix + + @property + def mpm_type(self) -> str: + return self._mpm_type + + @property + def http_port(self) -> int: + return self._http_port + + @property + def https_port(self) -> int: + return self._https_port + + @property + def http_tld(self) -> str: + return self._http_tld + + @property + def domain_test1(self) -> str: + return self._domains[0] + + @property + def domains(self) -> List[str]: + return self._domains + + @property + def domains_noh2(self) -> List[str]: + return self._domains_noh2 + + @property + def http_base_url(self) -> str: + return self._http_base + + @property + def https_base_url(self) -> str: + return self._https_base + + @property + def gen_dir(self) -> str: + return self._gen_dir + + @property + def test_dir(self) -> str: + return self._test_dir + + @property + def test_src_dir(self) -> str: + return self._test_src_dir + + @property + def server_dir(self) -> str: + return self._server_dir + + @property + def server_logs_dir(self) -> str: + return self._server_logs_dir + + @property + def libexec_dir(self) -> str: + return self._libexec_dir + + @property + def server_conf_dir(self) -> str: + return self._server_conf_dir + + @property + def server_docs_dir(self) -> str: + return self._server_docs_dir + + @property + def httpd_base_conf(self) -> str: + return self._httpd_base_conf + + @property + def h2load(self) -> str: + return self._h2load + + @property + def ca(self) -> Credentials: + return self._ca + + def set_ca(self, ca: Credentials): + self._ca = ca + + def get_credentials_for_name(self, dns_name) -> List['Credentials']: + for domains in [self._domains, self._domains_noh2]: + if dns_name in domains: + return self.ca.get_credentials_for_name(domains[0]) + return [] + + def has_h2load(self): + return self._h2load != "" + + def has_nghttp(self): + return self._nghttp != "" + + def has_nghttp_get_assets(self): + if not self.has_nghttp(): + return False + args = [self._nghttp, "-a"] + p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + rv = p.returncode + if rv != 0: + return False + return p.stderr == "" + + def get_apxs_var(self, name: str) -> str: + p = subprocess.run([self._apxs, "-q", name], capture_output=True, text=True) + if p.returncode != 0: + return "" + return p.stdout.strip() + + def get_httpd_version(self) -> str: + return self.get_apxs_var("HTTPD_VERSION") + + def mkpath(self, path): + if not os.path.exists(path): + return os.makedirs(path) + + def test_src(self, path): + return os.path.join(self._test_src_dir, path) + + def run(self, args) -> ExecResult: + log.debug("execute: %s", " ".join(args)) + start = datetime.now() + p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + return ExecResult(exit_code=p.returncode, stdout=p.stdout, stderr=p.stderr, + duration=datetime.now() - start) + + def mkurl(self, scheme, hostname, path='/'): + port = self.https_port if scheme == 'https' else self.http_port + return "%s://%s.%s:%s%s" % (scheme, hostname, self.http_tld, port, path) + + def install_test_conf(self, conf: List[str]): + with open(self._test_conf, 'w') as fd: + fd.write(f"{self.httpd_base_conf}\n") + for line in conf: + fd.write(f"{line}\n") + + def is_live(self, url, timeout: timedelta = None): + s = requests.Session() + if not timeout: + timeout = timedelta(seconds=10) + try_until = datetime.now() + timeout + log.debug("checking reachability of %s", url) + while datetime.now() < try_until: + try: + req = requests.Request('HEAD', url).prepare() + s.send(req, verify=self._verify_certs, timeout=timeout.total_seconds()) + return True + except IOError: + log.debug("connect error: %s", sys.exc_info()[0]) + time.sleep(.2) + except: + log.warning("Unexpected error: %s", sys.exc_info()[0]) + time.sleep(.2) + log.debug(f"Unable to contact '{url}' after {timeout} sec") + return False + + def is_dead(self, url, timeout: timedelta = None): + s = requests.Session() + if not timeout: + timeout = timedelta(seconds=10) + try_until = datetime.now() + timeout + log.debug("checking reachability of %s", url) + while datetime.now() < try_until: + try: + req = requests.Request('HEAD', url).prepare() + s.send(req, verify=self._verify_certs, timeout=timeout) + time.sleep(.2) + except IOError: + return True + except: + return True + log.debug("Server still responding after %d sec", timeout) + return False + + def apachectl(self, cmd, check_live=True): + args = [self._apachectl, + "-d", self.server_dir, + "-f", os.path.join(self._server_dir, 'conf/httpd.conf'), + "-k", cmd] + log.debug("execute: %s", " ".join(args)) + p = subprocess.run(args, capture_output=True, text=True) + rv = p.returncode + if rv == 0: + timeout = timedelta(seconds=10) + if check_live: + rv = 0 if self.is_live(self._http_base, timeout=timeout) else -1 + else: + rv = 0 if self.is_dead(self._http_base, timeout=timeout) else -1 + log.debug("waited for a apache.is_dead, rv=%d", rv) + else: + log.warning(f"exit {rv}, stdout: {p.stdout}, stderr: {p.stderr}") + return rv + + def apache_restart(self): + return self.apachectl("graceful") + + def apache_start(self): + return self.apachectl("start") + + def apache_stop(self): + return self.apachectl("stop", check_live=False) + + def apache_error_log_clear(self): + if os.path.isfile(self._server_error_log): + os.remove(self._server_error_log) + + RE_APLOGNO = re.compile(r'.*\[(?P<module>[^:]+):(error|warn)].* (?P<aplogno>AH\d+): .+') + RE_SSL_LIB_ERR = re.compile(r'.*\[ssl:error].* SSL Library Error: error:(?P<errno>\S+):.+') + RE_ERRLOG_ERROR = re.compile(r'.*\[(?P<module>[^:]+):error].*') + RE_ERRLOG_WARN = re.compile(r'.*\[(?P<module>[^:]+):warn].*') + + def apache_errors_and_warnings(self): + errors = [] + warnings = [] + + if os.path.isfile(self._server_error_log): + for line in open(self._server_error_log): + m = self.RE_APLOGNO.match(line) + if m and m.group('aplogno') in [ + 'AH02032', + 'AH01276', + 'AH01630', + 'AH00135', + 'AH02261', # Re-negotiation handshake failed (our test_101 + ]: + # we know these happen normally in our tests + continue + m = self.RE_SSL_LIB_ERR.match(line) + if m and m.group('errno') in [ + '1417A0C1', # cipher suite mismatch, test_101 + '1417C0C7', # client cert not accepted, test_101 + ]: + # we know these happen normally in our tests + continue + m = self.RE_ERRLOG_ERROR.match(line) + if m and m.group('module') not in ['cgid']: + errors.append(line) + continue + m = self.RE_ERRLOG_WARN.match(line) + if m: + warnings.append(line) + continue + return errors, warnings + + def curl_complete_args(self, urls, timeout, options): + if not isinstance(urls, list): + urls = [urls] + u = urlparse(urls[0]) + assert u.hostname, f"hostname not in url: {urls[0]}" + assert u.port, f"port not in url: {urls[0]}" + headerfile = ("%s/curl.headers" % self.gen_dir) + if os.path.isfile(headerfile): + os.remove(headerfile) + + args = [ + self._curl, + "--cacert", self.ca.cert_file, + "-s", "-D", headerfile, + "--resolve", ("%s:%s:%s" % (u.hostname, u.port, self._httpd_addr)), + "--connect-timeout", ("%d" % timeout) + ] + if options: + args.extend(options) + args += urls + return args, headerfile + + def curl_raw(self, urls, timeout, options): + args, headerfile = self.curl_complete_args(urls, timeout, options) + r = self.run(args) + if r.exit_code == 0: + lines = open(headerfile).readlines() + exp_stat = True + header = {} + for line in lines: + if exp_stat: + log.debug("reading 1st response line: %s", line) + m = re.match(r'^(\S+) (\d+) (.*)$', line) + assert m + r.add_response({ + "protocol": m.group(1), + "status": int(m.group(2)), + "description": m.group(3), + "body": r.outraw + }) + exp_stat = False + header = {} + elif re.match(r'^$', line): + exp_stat = True + else: + log.debug("reading header line: %s", line) + m = re.match(r'^([^:]+):\s*(.*)$', line) + assert m + header[m.group(1).lower()] = m.group(2) + r.response["header"] = header + if r.json: + r.response["json"] = r.json + return r + + def curl_get(self, url, timeout=5, options=None): + return self.curl_raw([url], timeout=timeout, options=options) + + def curl_upload(self, url, fpath, timeout=5, options=None): + if not options: + options = [] + options.extend([ + "--form", ("file=@%s" % fpath) + ]) + return self.curl_raw([url], timeout, options) + + def curl_post_data(self, url, data="", timeout=5, options=None): + if not options: + options = [] + options.extend(["--data", "%s" % data]) + return self.curl_raw(url, timeout, options) + + def curl_post_value(self, url, key, value, timeout=5, options=None): + if not options: + options = [] + options.extend(["--form", "{0}={1}".format(key, value)]) + return self.curl_raw(url, timeout, options) + + def curl_protocol_version(self, url, timeout=5, options=None): + if not options: + options = [] + options.extend(["-w", "%{http_version}\n", "-o", "/dev/null"]) + r = self.curl_raw(url, timeout=timeout, options=options) + if r.exit_code == 0 and r.response: + return r.response["body"].decode('utf-8').rstrip() + return -1 + + def nghttp(self): + return Nghttp(self._nghttp, connect_addr=self._httpd_addr, tmp_dir=self.gen_dir) + + def h2load_status(self, run: ExecResult): + stats = {} + m = re.search( + r'requests: (\d+) total, (\d+) started, (\d+) done, (\d+) succeeded' + r', (\d+) failed, (\d+) errored, (\d+) timeout', run.stdout) + if m: + stats["requests"] = { + "total": int(m.group(1)), + "started": int(m.group(2)), + "done": int(m.group(3)), + "succeeded": int(m.group(4)) + } + m = re.search(r'status codes: (\d+) 2xx, (\d+) 3xx, (\d+) 4xx, (\d+) 5xx', + run.stdout) + if m: + stats["status"] = { + "2xx": int(m.group(1)), + "3xx": int(m.group(2)), + "4xx": int(m.group(3)), + "5xx": int(m.group(4)) + } + run.add_results({"h2load": stats}) + return run + + def setup_data_1k_1m(self): + s100 = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\n" + with open(os.path.join(self.gen_dir, "data-1k"), 'w') as f: + for i in range(10): + f.write(s100) + with open(os.path.join(self.gen_dir, "data-10k"), 'w') as f: + for i in range(100): + f.write(s100) + with open(os.path.join(self.gen_dir, "data-100k"), 'w') as f: + for i in range(1000): + f.write(s100) + with open(os.path.join(self.gen_dir, "data-1m"), 'w') as f: + for i in range(10000): + f.write(s100) diff --git a/test/modules/http2/h2_nghttp.py b/test/modules/http2/h2_nghttp.py new file mode 100644 index 0000000000..d06798e868 --- /dev/null +++ b/test/modules/http2/h2_nghttp.py @@ -0,0 +1,288 @@ +import re +import os +import subprocess +from datetime import datetime +from typing import Dict + +from urllib.parse import urlparse + +from h2_result import ExecResult + + +def _get_path(x): + return x["path"] + + +class Nghttp: + + def __init__(self, path, connect_addr=None, tmp_dir="/tmp"): + self.NGHTTP = path + self.CONNECT_ADDR = connect_addr + self.TMP_DIR = tmp_dir + + @staticmethod + def get_stream(streams, sid): + sid = int(sid) + if sid not in streams: + streams[sid] = { + "id": sid, + "header": {}, + "request": { + "id": sid, + "body": b'' + }, + "response": { + "id": sid, + "body": b'' + }, + "paddings": [], + "promises": [] + } + return streams[sid] if sid in streams else None + + def run(self, urls, timeout, options): + return self._baserun(urls, timeout, options) + + def complete_args(self, url, _timeout, options: [str]) -> [str]: + if not isinstance(url, list): + url = [url] + u = urlparse(url[0]) + args = [self.NGHTTP] + if self.CONNECT_ADDR: + connect_host = self.CONNECT_ADDR + args.append("--header=host: %s:%s" % (u.hostname, u.port)) + else: + connect_host = u.hostname + if options: + args.extend(options) + for xurl in url: + xu = urlparse(xurl) + nurl = "%s://%s:%s/%s" % (u.scheme, connect_host, xu.port, xu.path) + if xu.query: + nurl = "%s?%s" % (nurl, xu.query) + args.append(nurl) + return args + + def _baserun(self, url, timeout, options): + return self._run(self.complete_args(url, timeout, options)) + + def parse_output(self, btext) -> Dict: + # getting meta data and response body out of nghttp's output + # is a bit tricky. Without '-v' we just get the body. With '-v' meta + # data and timings in both directions are listed. + # We rely on response :status: to be unique and on + # response body not starting with space. + # Something not good enough for general purpose, but for these tests. + output = {} + body = '' + streams = {} + skip_indents = True + # chunk output into lines. nghttp mixes text + # meta output with bytes from the response body. + lines = [l.decode() for l in btext.split(b'\n')] + for lidx, l in enumerate(lines): + if len(l) == 0: + body += '\n' + continue + m = re.match(r'\[.*] recv \(stream_id=(\d+)\) (\S+): (\S*)', l) + if m: + s = self.get_stream(streams, m.group(1)) + hname = m.group(2) + hval = m.group(3) + print("stream %d header %s: %s" % (s["id"], hname, hval)) + header = s["header"] + if hname in header: + header[hname] += ", %s" % hval + else: + header[hname] = hval + body = '' + continue + + m = re.match(r'\[.*] recv HEADERS frame <.* stream_id=(\d+)>', l) + if m: + s = self.get_stream(streams, m.group(1)) + if s: + print("stream %d: recv %d header" % (s["id"], len(s["header"]))) + response = s["response"] + hkey = "header" + if "header" in response: + h = response["header"] + if ":status" in h and int(h[":status"]) >= 200: + hkey = "trailer" + else: + prev = { + "header": h + } + if "previous" in response: + prev["previous"] = response["previous"] + response["previous"] = prev + response[hkey] = s["header"] + s["header"] = {} + body = '' + continue + + m = re.match(r'(.*)\[.*] recv DATA frame <length=(\d+), .*stream_id=(\d+)>', l) + if m: + s = self.get_stream(streams, m.group(3)) + body += m.group(1) + blen = int(m.group(2)) + if s: + print("stream %d: %d DATA bytes added" % (s["id"], blen)) + padlen = 0 + if len(lines) > lidx + 2: + mpad = re.match(r' +\(padlen=(\d+)\)', lines[lidx+2]) + if mpad: + padlen = int(mpad.group(1)) + s["paddings"].append(padlen) + blen -= padlen + s["response"]["body"] += body[-blen:].encode() + body = '' + skip_indents = True + continue + + m = re.match(r'\[.*] recv PUSH_PROMISE frame <.* stream_id=(\d+)>', l) + if m: + s = self.get_stream(streams, m.group(1)) + if s: + # headers we have are request headers for the PUSHed stream + # these have been received on the originating stream, the promised + # stream id it mentioned in the following lines + print("stream %d: %d PUSH_PROMISE header" % (s["id"], len(s["header"]))) + if len(lines) > lidx+2: + m2 = re.match(r'\s+\(.*promised_stream_id=(\d+)\)', lines[lidx+2]) + if m2: + s2 = self.get_stream(streams, m2.group(1)) + s2["request"]["header"] = s["header"] + s["promises"].append(s2) + s["header"] = {} + continue + + m = re.match(r'(.*)\[.*] recv (\S+) frame <length=(\d+), .*stream_id=(\d+)>', l) + if m: + print("recv frame %s on stream %s" % (m.group(2), m.group(4))) + body += m.group(1) + skip_indents = True + continue + + m = re.match(r'(.*)\[.*] send (\S+) frame <length=(\d+), .*stream_id=(\d+)>', l) + if m: + print("send frame %s on stream %s" % (m.group(2), m.group(4))) + body += m.group(1) + skip_indents = True + continue + + if skip_indents and l.startswith(' '): + continue + + if '[' != l[0]: + skip_indents = None + body += l + '\n' + + # the main request is done on the lowest odd numbered id + main_stream = 99999999999 + for sid in streams: + s = streams[sid] + if ":status" in s["response"]["header"]: + s["response"]["status"] = int(s["response"]["header"][":status"]) + if (sid % 2) == 1 and sid < main_stream: + main_stream = sid + + output["streams"] = streams + if main_stream in streams: + output["response"] = streams[main_stream]["response"] + output["paddings"] = streams[main_stream]["paddings"] + return output + + def _raw(self, url, timeout, options): + args = ["-v"] + if options: + args.extend(options) + r = self._baserun(url, timeout, args) + if 0 == r.exit_code: + r.add_results(self.parse_output(r.outraw)) + return r + + def get(self, url, timeout=5, options=None): + return self._raw(url, timeout, options) + + def assets(self, url, timeout=5, options=None): + if not options: + options = [] + options.extend(["-ans"]) + r = self._baserun(url, timeout, options) + assets = [] + if 0 == r.exit_code: + lines = re.findall(r'[^\n]*\n', r.stdout, re.MULTILINE) + for lidx, l in enumerate(lines): + m = re.match(r'\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+/(.*)', l) + if m: + assets.append({ + "path": m.group(7), + "status": int(m.group(5)), + "size": m.group(6) + }) + assets.sort(key=_get_path) + r.add_assets(assets) + return r + + def post_data(self, url, data, timeout=5, options=None): + reqbody = ("%s/nghttp.req.body" % self.TMP_DIR) + with open(reqbody, 'wb') as f: + f.write(data.encode('utf-8')) + if not options: + options = [] + options.extend(["--data=%s" % reqbody]) + return self._raw(url, timeout, options) + + def post_name(self, url, name, timeout=5, options=None): + reqbody = ("%s/nghttp.req.body" % self.TMP_DIR) + with open(reqbody, 'w') as f: + f.write("--DSAJKcd9876\n") + f.write("Content-Disposition: form-data; name=\"value\"; filename=\"xxxxx\"\n") + f.write("Content-Type: text/plain\n") + f.write("\n%s\n" % name) + f.write("--DSAJKcd9876\n") + if not options: + options = [] + options.extend(["--data=%s" % reqbody]) + return self._raw(url, timeout, options) + + def upload(self, url, fpath, timeout=5, options=None): + if not options: + options = [] + options.extend(["--data=%s" % fpath]) + return self._raw(url, timeout, options) + + def upload_file(self, url, fpath, timeout=5, options=None): + fname = os.path.basename(fpath) + reqbody = ("%s/nghttp.req.body" % self.TMP_DIR) + with open(fpath, 'rb') as fin: + with open(reqbody, 'wb') as f: + f.write(("""--DSAJKcd9876 +Content-Disposition: form-data; name="xxx"; filename="xxxxx" +Content-Type: text/plain + +testing mod_h2 +--DSAJKcd9876 +Content-Disposition: form-data; name="file"; filename="%s" +Content-Type: application/octet-stream +Content-Transfer-Encoding: binary + +""" % fname).encode('utf-8')) + f.write(fin.read()) + f.write(""" +--DSAJKcd9876""".encode('utf-8')) + if not options: + options = [] + options.extend([ + "--data=%s" % reqbody, + "--expect-continue", + "-HContent-Type: multipart/form-data; boundary=DSAJKcd9876"]) + return self._raw(url, timeout, options) + + def _run(self, args) -> ExecResult: + print(("execute: %s" % " ".join(args))) + start = datetime.now() + p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + return ExecResult(exit_code=p.returncode, stdout=p.stdout, stderr=p.stderr, + duration=datetime.now() - start) diff --git a/test/modules/http2/h2_result.py b/test/modules/http2/h2_result.py new file mode 100644 index 0000000000..06fc9e5300 --- /dev/null +++ b/test/modules/http2/h2_result.py @@ -0,0 +1,71 @@ +import json +from datetime import timedelta +from typing import Optional, Dict, List + + +class ExecResult: + + def __init__(self, exit_code: int, stdout: bytes, stderr: bytes = None, duration: timedelta = None): + self._exit_code = exit_code + self._raw = stdout if stdout else b'' + self._stdout = stdout.decode() if stdout is not None else "" + self._stderr = stderr.decode() if stderr is not None else "" + self._duration = duration if duration is not None else timedelta() + self._response = None + self._results = {} + self._assets = [] + # noinspection PyBroadException + try: + self._json_out = json.loads(self._stdout) + except: + self._json_out = None + + @property + def exit_code(self) -> int: + return self._exit_code + + @property + def outraw(self) -> bytes: + return self._raw + + @property + def stdout(self) -> str: + return self._stdout + + @property + def json(self) -> Optional[Dict]: + """Output as JSON dictionary or None if not parseable.""" + return self._json_out + + @property + def stderr(self) -> str: + return self._stderr + + @property + def duration(self) -> timedelta: + return self._duration + + @property + def response(self) -> Optional[Dict]: + return self._response + + @property + def results(self) -> Dict: + return self._results + + @property + def assets(self) -> List: + return self._assets + + def add_response(self, resp: Dict): + if self._response: + resp['previous'] = self._response + self._response = resp + + def add_results(self, results: Dict): + self._results.update(results) + if 'response' in results: + self.add_response(results['response']) + + def add_assets(self, assets: List): + self._assets.extend(assets) diff --git a/test/modules/http2/htdocs/alive.json b/test/modules/http2/htdocs/alive.json new file mode 100644 index 0000000000..2239ee2ee7 --- /dev/null +++ b/test/modules/http2/htdocs/alive.json @@ -0,0 +1,4 @@ +{ + "host" : "generic", + "alive" : true +} diff --git a/test/modules/http2/htdocs/cgi/echo.py b/test/modules/http2/htdocs/cgi/echo.py new file mode 100644 index 0000000000..5ffe6ed823 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/echo.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +import sys, cgi, os + +status = '200 Ok' + +content = '' +for line in sys.stdin: + content += line + +# Just echo what we get +print("Status: 200") +print("Content-Type: application/data\n") +sys.stdout.write(content) + diff --git a/test/modules/http2/htdocs/cgi/echohd.py b/test/modules/http2/htdocs/cgi/echohd.py new file mode 100644 index 0000000000..371ae8b0f7 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/echohd.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +import cgi, os +import cgitb; cgitb.enable() + +status = '200 Ok' + +form = cgi.FieldStorage() +name = form.getvalue('name') + +if name: + print("Status: 200") + print("""\ +Content-Type: text/plain\n""") + print("""%s: %s""" % (name, os.environ['HTTP_'+name])) +else: + print("Status: 400 Parameter Missing") + print("""\ +Content-Type: text/html\n +<html><body> +<p>No name was specified</p> +</body></html>""") + + diff --git a/test/modules/http2/htdocs/cgi/env.py b/test/modules/http2/htdocs/cgi/env.py new file mode 100644 index 0000000000..5c9c0b1adb --- /dev/null +++ b/test/modules/http2/htdocs/cgi/env.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +import cgi, os +import cgitb; cgitb.enable() + +status = '200 Ok' + +try: + form = cgi.FieldStorage() + input = form['name'] + + # Test if the file was uploaded + if input.value is not None: + val = os.environ[input.value] if input.value in os.environ else "" + print("Status: 200") + print("""\ +Content-Type: text/plain\n""") + print("{0}={1}".format(input.value, val)) + + else: + print("Status: 400 Parameter Missing") + print("""\ +Content-Type: text/html\n + <html><body> + <p>No name was specified: %s</p> + </body></html>""" % (count.value)) + +except KeyError: + print("Status: 200 Ok") + print("""\ +Content-Type: text/html\n + <html><body> + Echo <form method="POST" enctype="application/x-www-form-urlencoded"> + <input type="text" name="name"> + <button type="submit">submit</button></form> + </body></html>""") + pass + + + diff --git a/test/modules/http2/htdocs/cgi/files/empty.txt b/test/modules/http2/htdocs/cgi/files/empty.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/files/empty.txt diff --git a/test/modules/http2/htdocs/cgi/hecho.py b/test/modules/http2/htdocs/cgi/hecho.py new file mode 100644 index 0000000000..5c1f79a302 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/hecho.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import cgi, os +import cgitb; cgitb.enable() + +status = '200 Ok' + +try: + form = cgi.FieldStorage() + + # A nested FieldStorage instance holds the file + name = form['name'].value + value = '' + + try: + value = form['value'].value + except KeyError: + value = os.environ.get("HTTP_"+name, "unset") + + # Test if a value was given + if name: + print("Status: 200") + print("%s: %s" % (name, value,)) + print ("""\ +Content-Type: text/plain\n""") + + else: + print("Status: 400 Parameter Missing") + print("""\ +Content-Type: text/html\n + <html><body> + <p>No name and value was specified: %s %s</p> + </body></html>""" % (name, value)) + +except KeyError: + print("Status: 200 Ok") + print("""\ +Content-Type: text/html\n + <html><body> + Echo <form method="POST" enctype="application/x-www-form-urlencoded"> + <input type="text" name="name"> + <input type="text" name="value"> + <button type="submit">Echo</button></form> + </body></html>""") + pass + + diff --git a/test/modules/http2/htdocs/cgi/hello.py b/test/modules/http2/htdocs/cgi/hello.py new file mode 100644 index 0000000000..191acb2fed --- /dev/null +++ b/test/modules/http2/htdocs/cgi/hello.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + +import os + +print("Content-Type: application/json") +print() +print("{") +print(" \"https\" : \"%s\"," % (os.getenv('HTTPS', ''))) +print(" \"host\" : \"%s\"," % (os.getenv('SERVER_NAME', ''))) +print(" \"protocol\" : \"%s\"," % (os.getenv('SERVER_PROTOCOL', ''))) +print(" \"ssl_protocol\" : \"%s\"," % (os.getenv('SSL_PROTOCOL', ''))) +print(" \"h2\" : \"%s\"," % (os.getenv('HTTP2', ''))) +print(" \"h2push\" : \"%s\"" % (os.getenv('H2PUSH', ''))) +print("}") + diff --git a/test/modules/http2/htdocs/cgi/mnot164.py b/test/modules/http2/htdocs/cgi/mnot164.py new file mode 100644 index 0000000000..949b0f195b --- /dev/null +++ b/test/modules/http2/htdocs/cgi/mnot164.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +import cgi +import cgitb; cgitb.enable() +import os +import sys + +try: + form = cgi.FieldStorage() + count = form['count'].value + text = form['text'].value +except KeyError: + text="a" + count=77784 + + +print("Status: 200 OK") +print("Content-Type: text/html") +print() +sys.stdout.write(text*int(count)) + diff --git a/test/modules/http2/htdocs/cgi/necho.py b/test/modules/http2/htdocs/cgi/necho.py new file mode 100644 index 0000000000..b9249b8969 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/necho.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +import cgi, os +import time +import cgitb; cgitb.enable() + +status = '200 Ok' + +try: + form = cgi.FieldStorage() + count = form['count'] + text = form['text'] + + waitsec = float(form['wait1'].value) if 'wait1' in form else 0.0 + if waitsec > 0: + time.sleep(waitsec) + + if int(count.value): + print("Status: 200") + print("""\ +Content-Type: text/plain\n""") + + waitsec = float(form['wait2'].value) if 'wait2' in form else 0.0 + if waitsec > 0: + time.sleep(waitsec) + + i = 0; + for i in range(0, int(count.value)): + print("%s" % (text.value)) + + waitsec = float(form['wait3'].value) if 'wait3' in form else 0.0 + if waitsec > 0: + time.sleep(waitsec) + + else: + print("Status: 400 Parameter Missing") + print("""\ +Content-Type: text/html\n + <html><body> + <p>No count was specified: %s</p> + </body></html>""" % (count.value)) + +except KeyError: + print("Status: 200 Ok") + print("""\ +Content-Type: text/html\n + <html><body> + Echo <form method="POST" enctype="application/x-www-form-urlencoded"> + <input type="text" name="count"> + <input type="text" name="text"> + <button type="submit">Echo</button></form> + </body></html>""") + pass + + diff --git a/test/modules/http2/htdocs/cgi/upload.py b/test/modules/http2/htdocs/cgi/upload.py new file mode 100644 index 0000000000..2c8d63aa10 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/upload.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +import cgi, os +import cgitb +cgitb.enable() + +status = '200 Ok' + +try: # Windows needs stdio set for binary mode. + import msvcrt + msvcrt.setmode (0, os.O_BINARY) # stdin = 0 + msvcrt.setmode (1, os.O_BINARY) # stdout = 1 +except ImportError: + pass + +form = cgi.FieldStorage() + +# Test if the file was uploaded +if 'file' in form: + fileitem = form['file'] + # strip leading path from file name to avoid directory traversal attacks + fn = os.path.basename(fileitem.filename) + f = open(('%s/files/%s' % (os.environ["DOCUMENT_ROOT"], fn)), 'wb'); + f.write(fileitem.file.read()) + f.close() + message = "The file %s was uploaded successfully" % (fn) + print("Status: 201 Created") + print("Content-Type: text/html") + print("Location: %s://%s/files/%s" % (os.environ["REQUEST_SCHEME"], os.environ["HTTP_HOST"], fn)) + print("") + print("<html><body><p>%s</p></body></html>" % (message)) + +elif 'remove' in form: + remove = form['remove'].value + try: + fn = os.path.basename(remove) + os.remove('./files/' + fn) + message = 'The file "' + fn + '" was removed successfully' + except OSError as e: + message = 'Error removing ' + fn + ': ' + e.strerror + status = '404 File Not Found' + print("Status: %s" % (status)) + print(""" +Content-Type: text/html + +<html><body> +<p>%s</p> +</body></html>""" % (message)) + +else: + message = '''\ + Upload File<form method="POST" enctype="multipart/form-data"> + <input type="file" name="file"> + <button type="submit">Upload</button></form> + ''' + print("Status: %s" % (status)) + print("""\ +Content-Type: text/html + +<html><body> +<p>%s</p> +</body></html>""" % (message)) + diff --git a/test/modules/http2/htdocs/forbidden.html b/test/modules/http2/htdocs/forbidden.html new file mode 100644 index 0000000000..e186310c73 --- /dev/null +++ b/test/modules/http2/htdocs/forbidden.html @@ -0,0 +1,11 @@ +<html> + <head> + <title>403 - Forbidden</title> + </head> + <body> + <h1>403 - Forbidden</h1> + <p> + An example of an error document. + </p> + </body> +</html> diff --git a/test/modules/http2/htdocs/index.html b/test/modules/http2/htdocs/index.html new file mode 100644 index 0000000000..3c07626144 --- /dev/null +++ b/test/modules/http2/htdocs/index.html @@ -0,0 +1,9 @@ +<html> + <head> + <title>mod_h2 test site generic</title> + </head> + <body> + <h1>mod_h2 test site generic</h1> + </body> +</html> + diff --git a/test/modules/http2/htdocs/noh2/alive.json b/test/modules/http2/htdocs/noh2/alive.json new file mode 100644 index 0000000000..7b54893ee5 --- /dev/null +++ b/test/modules/http2/htdocs/noh2/alive.json @@ -0,0 +1,5 @@ +{ + "host" : "noh2", + "alive" : true +} + diff --git a/test/modules/http2/htdocs/noh2/index.html b/test/modules/http2/htdocs/noh2/index.html new file mode 100644 index 0000000000..696068e9dc --- /dev/null +++ b/test/modules/http2/htdocs/noh2/index.html @@ -0,0 +1,9 @@ +<html> + <head> + <title>mod_h2 test site noh2</title> + </head> + <body> + <h1>mod_h2 test site noh2</h1> + </body> +</html> + diff --git a/test/modules/http2/htdocs/test1/001.html b/test/modules/http2/htdocs/test1/001.html new file mode 100644 index 0000000000..184952d28c --- /dev/null +++ b/test/modules/http2/htdocs/test1/001.html @@ -0,0 +1,10 @@ +<!DOCTYPE HTML>
+ <html>
+ <head>
+ <title>HTML/2.0 Test File: 001</title>
+ </head>
+ <body>
+ <p><h1>HTML/2.0 Test File: 001</h1></p>
+ <p>This file only contains a simple HTML structure with plain text.</p>
+ </body>
+</html>
diff --git a/test/modules/http2/htdocs/test1/002.jpg b/test/modules/http2/htdocs/test1/002.jpg Binary files differnew file mode 100644 index 0000000000..3feefb070a --- /dev/null +++ b/test/modules/http2/htdocs/test1/002.jpg diff --git a/test/modules/http2/htdocs/test1/003.html b/test/modules/http2/htdocs/test1/003.html new file mode 100644 index 0000000000..d5b08c52bb --- /dev/null +++ b/test/modules/http2/htdocs/test1/003.html @@ -0,0 +1,11 @@ +<!DOCTYPE HTML>
+ <html>
+ <head>
+ <title>HTML/2.0 Test File: 003</title>
+ </head>
+ <body>
+ <p><h1>HTML/2.0 Test File: 003</h1></p>
+ <p>This is a text HTML file with a big image:</p>
+ <p><img src="003/003_img.jpg" alt="GSMA Logo" style="width:269px;height:249px"></p>
+ </body>
+</html>
diff --git a/test/modules/http2/htdocs/test1/003/003_img.jpg b/test/modules/http2/htdocs/test1/003/003_img.jpg Binary files differnew file mode 100644 index 0000000000..3feefb070a --- /dev/null +++ b/test/modules/http2/htdocs/test1/003/003_img.jpg diff --git a/test/modules/http2/htdocs/test1/004.html b/test/modules/http2/htdocs/test1/004.html new file mode 100644 index 0000000000..768cb825b4 --- /dev/null +++ b/test/modules/http2/htdocs/test1/004.html @@ -0,0 +1,23 @@ +<html>
+ <head>
+ <title>HTML/2.0 Test File: 004</title>
+ </head>
+ <body>
+ <p><h1>HTML/2.0 Test File: 004</h1>
+ This file contains plain text with a bunch of images.<br>
+ <img src="004/gophertiles_142.jpg" height="32" width="32"><img src="004/gophertiles_084.jpg" height="32" width="32"><img src="004/gophertiles_052.jpg" height="32" width="32"><img src="004/gophertiles_077.jpg" height="32" width="32"><img src="004/gophertiles_030.jpg" height="32" width="32"><img src="004/gophertiles_027.jpg" height="32" width="32"><img src="004/gophertiles_039.jpg" height="32" width="32"><img src="004/gophertiles_025.jpg" height="32" width="32"><img src="004/gophertiles_017.jpg" height="32" width="32"><img src="004/gophertiles_179.jpg" height="32" width="32"><img src="004/gophertiles_032.jpg" height="32" width="32"><img src="004/gophertiles_161.jpg" height="32" width="32"><img src="004/gophertiles_088.jpg" height="32" width="32"><img src="004/gophertiles_022.jpg" height="32" width="32"><img src="004/gophertiles_146.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_102.jpg" height="32" width="32"><img src="004/gophertiles_009.jpg" height="32" width="32"><img src="004/gophertiles_132.jpg" height="32" width="32"><img src="004/gophertiles_137.jpg" height="32" width="32"><img src="004/gophertiles_055.jpg" height="32" width="32"><img src="004/gophertiles_036.jpg" height="32" width="32"><img src="004/gophertiles_127.jpg" height="32" width="32"><img src="004/gophertiles_145.jpg" height="32" width="32"><img src="004/gophertiles_147.jpg" height="32" width="32"><img src="004/gophertiles_153.jpg" height="32" width="32"><img src="004/gophertiles_105.jpg" height="32" width="32"><img src="004/gophertiles_103.jpg" height="32" width="32"><img src="004/gophertiles_033.jpg" height="32" width="32"><img src="004/gophertiles_054.jpg" height="32" width="32"><img src="004/gophertiles_015.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_016.jpg" height="32" width="32"><img src="004/gophertiles_072.jpg" height="32" width="32"><img src="004/gophertiles_115.jpg" height="32" width="32"><img src="004/gophertiles_108.jpg" height="32" width="32"><img src="004/gophertiles_148.jpg" height="32" width="32"><img src="004/gophertiles_070.jpg" height="32" width="32"><img src="004/gophertiles_083.jpg" height="32" width="32"><img src="004/gophertiles_118.jpg" height="32" width="32"><img src="004/gophertiles_053.jpg" height="32" width="32"><img src="004/gophertiles_021.jpg" height="32" width="32"><img src="004/gophertiles_059.jpg" height="32" width="32"><img src="004/gophertiles_130.jpg" height="32" width="32"><img src="004/gophertiles_163.jpg" height="32" width="32"><img src="004/gophertiles_098.jpg" height="32" width="32"><img src="004/gophertiles_064.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_018.jpg" height="32" width="32"><img src="004/gophertiles_058.jpg" height="32" width="32"><img src="004/gophertiles_167.jpg" height="32" width="32"><img src="004/gophertiles_082.jpg" height="32" width="32"><img src="004/gophertiles_056.jpg" height="32" width="32"><img src="004/gophertiles_180.jpg" height="32" width="32"><img src="004/gophertiles_046.jpg" height="32" width="32"><img src="004/gophertiles_093.jpg" height="32" width="32"><img src="004/gophertiles_106.jpg" height="32" width="32"><img src="004/gophertiles_065.jpg" height="32" width="32"><img src="004/gophertiles_175.jpg" height="32" width="32"><img src="004/gophertiles_139.jpg" height="32" width="32"><img src="004/gophertiles_101.jpg" height="32" width="32"><img src="004/gophertiles_099.jpg" height="32" width="32"><img src="004/gophertiles_051.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_140.jpg" height="32" width="32"><img src="004/gophertiles_134.jpg" height="32" width="32"><img src="004/gophertiles_149.jpg" height="32" width="32"><img src="004/gophertiles_049.jpg" height="32" width="32"><img src="004/gophertiles_095.jpg" height="32" width="32"><img src="004/gophertiles_075.jpg" height="32" width="32"><img src="004/gophertiles_066.jpg" height="32" width="32"><img src="004/gophertiles_090.jpg" height="32" width="32"><img src="004/gophertiles_035.jpg" height="32" width="32"><img src="004/gophertiles_114.jpg" height="32" width="32"><img src="004/gophertiles_160.jpg" height="32" width="32"><img src="004/gophertiles_079.jpg" height="32" width="32"><img src="004/gophertiles_062.jpg" height="32" width="32"><img src="004/gophertiles_096.jpg" height="32" width="32"><img src="004/gophertiles_100.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_104.jpg" height="32" width="32"><img src="004/gophertiles_057.jpg" height="32" width="32"><img src="004/gophertiles_037.jpg" height="32" width="32"><img src="004/gophertiles_086.jpg" height="32" width="32"><img src="004/gophertiles_168.jpg" height="32" width="32"><img src="004/gophertiles_138.jpg" height="32" width="32"><img src="004/gophertiles_045.jpg" height="32" width="32"><img src="004/gophertiles_141.jpg" height="32" width="32"><img src="004/gophertiles_029.jpg" height="32" width="32"><img src="004/gophertiles_165.jpg" height="32" width="32"><img src="004/gophertiles_110.jpg" height="32" width="32"><img src="004/gophertiles_063.jpg" height="32" width="32"><img src="004/gophertiles_158.jpg" height="32" width="32"><img src="004/gophertiles_122.jpg" height="32" width="32"><img src="004/gophertiles_068.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_170.jpg" height="32" width="32"><img src="004/gophertiles_120.jpg" height="32" width="32"><img src="004/gophertiles_117.jpg" height="32" width="32"><img src="004/gophertiles_031.jpg" height="32" width="32"><img src="004/gophertiles_113.jpg" height="32" width="32"><img src="004/gophertiles_074.jpg" height="32" width="32"><img src="004/gophertiles_129.jpg" height="32" width="32"><img src="004/gophertiles_019.jpg" height="32" width="32"><img src="004/gophertiles_060.jpg" height="32" width="32"><img src="004/gophertiles_109.jpg" height="32" width="32"><img src="004/gophertiles_080.jpg" height="32" width="32"><img src="004/gophertiles_097.jpg" height="32" width="32"><img src="004/gophertiles_116.jpg" height="32" width="32"><img src="004/gophertiles_085.jpg" height="32" width="32"><img src="004/gophertiles_050.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_151.jpg" height="32" width="32"><img src="004/gophertiles_094.jpg" height="32" width="32"><img src="004/gophertiles_067.jpg" height="32" width="32"><img src="004/gophertiles_128.jpg" height="32" width="32"><img src="004/gophertiles_034.jpg" height="32" width="32"><img src="004/gophertiles_135.jpg" height="32" width="32"><img src="004/gophertiles_012.jpg" height="32" width="32"><img src="004/gophertiles_010.jpg" height="32" width="32"><img src="004/gophertiles_152.jpg" height="32" width="32"><img src="004/gophertiles_171.jpg" height="32" width="32"><img src="004/gophertiles_087.jpg" height="32" width="32"><img src="004/gophertiles_126.jpg" height="32" width="32"><img src="004/gophertiles_048.jpg" height="32" width="32"><img src="004/gophertiles_023.jpg" height="32" width="32"><img src="004/gophertiles_078.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_071.jpg" height="32" width="32"><img src="004/gophertiles_131.jpg" height="32" width="32"><img src="004/gophertiles_073.jpg" height="32" width="32"><img src="004/gophertiles_143.jpg" height="32" width="32"><img src="004/gophertiles_173.jpg" height="32" width="32"><img src="004/gophertiles_154.jpg" height="32" width="32"><img src="004/gophertiles_061.jpg" height="32" width="32"><img src="004/gophertiles_178.jpg" height="32" width="32"><img src="004/gophertiles_013.jpg" height="32" width="32"><img src="004/gophertiles_028.jpg" height="32" width="32"><img src="004/gophertiles_157.jpg" height="32" width="32"><img src="004/gophertiles_038.jpg" height="32" width="32"><img src="004/gophertiles_069.jpg" height="32" width="32"><img src="004/gophertiles_174.jpg" height="32" width="32"><img src="004/gophertiles_076.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_155.jpg" height="32" width="32"><img src="004/gophertiles_107.jpg" height="32" width="32"><img src="004/gophertiles_136.jpg" height="32" width="32"><img src="004/gophertiles_144.jpg" height="32" width="32"><img src="004/gophertiles_091.jpg" height="32" width="32"><img src="004/gophertiles_024.jpg" height="32" width="32"><img src="004/gophertiles_014.jpg" height="32" width="32"><img src="004/gophertiles_159.jpg" height="32" width="32"><img src="004/gophertiles_011.jpg" height="32" width="32"><img src="004/gophertiles_176.jpg" height="32" width="32"><img src="004/gophertiles_162.jpg" height="32" width="32"><img src="004/gophertiles_156.jpg" height="32" width="32"><img src="004/gophertiles_081.jpg" height="32" width="32"><img src="004/gophertiles_119.jpg" height="32" width="32"><img src="004/gophertiles_026.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_133.jpg" height="32" width="32"><img src="004/gophertiles_020.jpg" height="32" width="32"><img src="004/gophertiles_044.jpg" height="32" width="32"><img src="004/gophertiles_125.jpg" height="32" width="32"><img src="004/gophertiles_150.jpg" height="32" width="32"><img src="004/gophertiles_172.jpg" height="32" width="32"><img src="004/gophertiles_002.jpg" height="32" width="32"><img src="004/gophertiles_169.jpg" height="32" width="32"><img src="004/gophertiles_007.jpg" height="32" width="32"><img src="004/gophertiles_008.jpg" height="32" width="32"><img src="004/gophertiles_042.jpg" height="32" width="32"><img src="004/gophertiles_041.jpg" height="32" width="32"><img src="004/gophertiles_166.jpg" height="32" width="32"><img src="004/gophertiles_005.jpg" height="32" width="32"><img src="004/gophertiles_089.jpg" height="32" width="32"><br>
+ <img src="004/gophertiles_177.jpg" height="32" width="32"><img src="004/gophertiles_092.jpg" height="32" width="32"><img src="004/gophertiles_043.jpg" height="32" width="32"><img src="004/gophertiles_111.jpg" height="32" width="32"><img src="004/gophertiles_047.jpg" height="32" width="32"><img src="004/gophertiles.jpg" height="32" width="32"><img src="004/gophertiles_006.jpg" height="32" width="32"><img src="004/gophertiles_121.jpg" height="32" width="32"><img src="004/gophertiles_004.jpg" height="32" width="32"><img src="004/gophertiles_124.jpg" height="32" width="32"><img src="004/gophertiles_123.jpg" height="32" width="32"><img src="004/gophertiles_112.jpg" height="32" width="32"><img src="004/gophertiles_040.jpg" height="32" width="32"><img src="004/gophertiles_164.jpg" height="32" width="32"><img src="004/gophertiles_003.jpg" height="32" width="32"><br>
+ <hr>This page is developed using this template:<a href="https://http2.golang.org/">HTTP/2 demo server</a>
+ </p>
+ </body>
+</html>
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/004/gophertiles.jpg b/test/modules/http2/htdocs/test1/004/gophertiles.jpg Binary files differnew file mode 100644 index 0000000000..e45ac3b02b --- /dev/null +++ b/test/modules/http2/htdocs/test1/004/gophertiles.jpg diff --git a/test/modules/http2/htdocs/test1/006.html b/test/modules/http2/htdocs/test1/006.html new file mode 100644 index 0000000000..6b730255a1 --- /dev/null +++ b/test/modules/http2/htdocs/test1/006.html @@ -0,0 +1,23 @@ +<!DOCTYPE HTML>
+ <html>
+ <head>
+ <title>HTML/2.0 Test File: 006</title>
+ <link rel="stylesheet" type="text/css" href="006/006.css">
+ <script type="text/javascript" src="006/006.js"></script>
+ </head>
+ <body>
+ <h1>HTML/2.0 Test File: 006</h1>
+ <div class="listTitle">This page contains:
+ <ul class="listElements">
+ <li>HTML
+ <li>CSS
+ <li>JavaScript
+ </ul>
+ </div>
+ <div class="listTitle">
+ <script type="text/javascript">
+ mainJavascript();
+ </script>
+ </div>
+ </body>
+</html>
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/006/006.css b/test/modules/http2/htdocs/test1/006/006.css new file mode 100644 index 0000000000..de6aa5fd18 --- /dev/null +++ b/test/modules/http2/htdocs/test1/006/006.css @@ -0,0 +1,21 @@ +@CHARSET "ISO-8859-1";
+body{
+ background:HoneyDew;
+}
+p{
+color:#0000FF;
+text-align:left;
+}
+
+h1{
+color:#FF0000;
+text-align:center;
+}
+
+.listTitle{
+ font-size:large;
+}
+
+.listElements{
+ color:#3366FF
+}
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/006/006.js b/test/modules/http2/htdocs/test1/006/006.js new file mode 100644 index 0000000000..b450067b53 --- /dev/null +++ b/test/modules/http2/htdocs/test1/006/006.js @@ -0,0 +1,31 @@ +/**
+ * JavaScript Functions File
+ */
+function returnDate()
+{
+ var currentDate;
+ currentDate=new Date();
+ var dateString=(currentDate.getMonth()+1)+'/'+currentDate.getDate()+'/'+currentDate.getFullYear();
+ return dateString;
+}
+
+function returnHour()
+{
+ var currentDate;
+ currentDate=new Date();
+ var hourString=currentDate.getHours()+':'+currentDate.getMinutes()+':'+currentDate.getSeconds();
+ return hourString;
+}
+
+function javaScriptMessage(){
+ return 'This section is generated under JavaScript:<br>';
+}
+
+function mainJavascript(){
+ document.write(javaScriptMessage())
+ document.write('<ul class="listElements">');
+ document.write('<li>Current date (dd/mm/yyyy): ' + returnDate());
+ document.write('<br>');
+ document.write('<li>Current time (hh:mm:ss): '+returnHour());
+ document.write('</ul>');
+}
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/006/header.html b/test/modules/http2/htdocs/test1/006/header.html new file mode 100644 index 0000000000..bace20ee88 --- /dev/null +++ b/test/modules/http2/htdocs/test1/006/header.html @@ -0,0 +1 @@ +<title>My Header Title</title> diff --git a/test/modules/http2/htdocs/test1/007.html b/test/modules/http2/htdocs/test1/007.html new file mode 100644 index 0000000000..4db93e4c5a --- /dev/null +++ b/test/modules/http2/htdocs/test1/007.html @@ -0,0 +1,21 @@ +<!DOCTYPE html>
+<html>
+<head>
+<meta charset="ISO-8859-1">
+<title>HTML/2.0 Test File: 007</title>
+</head>
+<body>
+ <h1>HTML/2.0 Test File: 007</h1>
+ <div><p>This page is used to send data from the client to the server:</p>
+ <FORM ACTION="007/007.py" METHOD="post" ENCTYPE="multipart/form-data">
+ <input type="hidden" name="pageName" value="007.html">
+ Name:<input type="text" name="pName" value="Write your name here." size="30" maxlength="30"><br>
+ Age:<input type="text" name="pAge" value="00" size="2" maxlength="2"><br>
+ Gender: Male<input type="radio" name="pGender" VALUE="Male">
+ Female<input type="radio" name="pGender" VALUE="Female"><br>
+ <input type="submit" name="userForm" value="Send">
+ <input type="reset" value="Clear">
+ </FORM>
+ </div>
+</body>
+</html>
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/007/007.py b/test/modules/http2/htdocs/test1/007/007.py new file mode 100644 index 0000000000..02b5466f96 --- /dev/null +++ b/test/modules/http2/htdocs/test1/007/007.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import cgi, sys +import cgitb; cgitb.enable() + +print "Content-Type: text/html;charset=UTF-8" +print + +print """\ + <!DOCTYPE html><html><head> + <title>HTML/2.0 Test File: 007 (received data)</title></head> + <body><h1>HTML/2.0 Test File: 007</h1>""" + +# alternative output: parsed form params <-> plain POST body +parseContent = True # <-> False + +if parseContent: + print '<h2>Data processed:</h2><ul>' + form = cgi.FieldStorage() + for name in form: + print '<li>', name, ': ', form[name].value, '</li>' + print '</ul>' +else: + print '<h2>POST data output:</h2><div><pre>' + data = sys.stdin.read() + print data + print '</pre></div>' + +print '</body></html>'
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/009.py b/test/modules/http2/htdocs/test1/009.py new file mode 100644 index 0000000000..8fd9095af3 --- /dev/null +++ b/test/modules/http2/htdocs/test1/009.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import cgi, sys, time +import cgitb; cgitb.enable() + +print "Content-Type: text/html;charset=UTF-8" +print + +print """\ + <!DOCTYPE html><html><head> + <title>HTML/2.0 Test File: 009 (server time)</title></head> + <body><h1>HTML/2.0 Test File: 009</h1> + <p>60 seconds of server time, one by one.</p>""" + +for i in range(60): + s = time.strftime("%Y-%m-%d %H:%M:%S") + print "<div>", s, "</div>" + sys.stdout.flush() + time.sleep(1) + +print "<p>done.</p></body></html>"
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/alive.json b/test/modules/http2/htdocs/test1/alive.json new file mode 100644 index 0000000000..93e7f95972 --- /dev/null +++ b/test/modules/http2/htdocs/test1/alive.json @@ -0,0 +1,5 @@ +{ + "host" : "test1", + "alive" : true +} + diff --git a/test/modules/http2/htdocs/test1/apache.org-files/ant.jpg b/test/modules/http2/htdocs/test1/apache.org-files/ant.jpg Binary files differnew file mode 100644 index 0000000000..2ebd7ad717 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/ant.jpg diff --git a/test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png b/test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png Binary files differnew file mode 100644 index 0000000000..07c0113c7b --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png diff --git a/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js b/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js new file mode 100644 index 0000000000..eee04abfaf --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js @@ -0,0 +1,278 @@ +if(!window['googleNDT_']){window['googleNDT_']=(new Date()).getTime();}(function() {window.googleAltLoader=4;var version_='3.0';var hash_='1ac79f060b1e0868a225f2a9999fbf89c251fdf3';var module_='ads';var packages_='search';var googleApisBase_='//ajax.googleapis.com/ajax';var serviceBase_='//cse.google.com/uds';var serviceHost_='cse.google.com';var k;var aa=this,ba=function(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&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; +else if("function"==b&&"undefined"==typeof a.call)return"object";return b},ca=function(a){return null!=a},da=function(a){return"string"==typeof a},ea=function(a,b,c){return a.call.apply(a.bind,arguments)},fa=function(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);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}},ga=function(a,b,c){ga= +Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?ea:fa;return ga.apply(null,arguments)},ha=function(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)}},ia=Date.now||function(){return+new Date},ja=function(a,b){function c(){}c.prototype=b.prototype;a.Hk=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.Ck=function(a,c,f){for(var g=Array(arguments.length-2),h=2;h<arguments.length;h++)g[h- +2]=arguments[h];return b.prototype[c].apply(a,g)}};var ma=["iPhone OS 5_","iPhone OS 4_","SC-02C Build/GINGERBREAD"],na=window.navigator?window.navigator.userAgent:"",ra=function(){return 5==oa(pa)||6==oa(pa)||7==oa(pa)},pa=/MSIE\s+(\d+)\./,sa=/Opera\/.*Version\/(\d+)\./,ta=/Firefox\/(\d+)\./,va=/Version\/(\d+)\..*Safari/,oa=function(a){a=(a=a.exec(na))?a[1]:"";return 0<a.length&&(a=parseInt(a,10))?a:null},wa=function(){for(var a=0;a<ma.length;a++)if(-1!=na.indexOf(ma[a]))return!0;return!1};var xa=function(a){a=String(a);if(/^\s*$/.test(a)?0:/^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\\["\\\/bfnrtu]/g,"@").replace(/(?:"[^"\\\n\r\u2028\u2029\x00-\x08\x0a-\x1f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)[\s\u2028\u2029]*(?=:|,|]|}|$)/g,"]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g,"")))try{return eval("("+a+")")}catch(b){}throw Error("Invalid JSON string: "+a);},ya=function(){this.Jd=void 0},za=function(a,b,c){if(null==b)c.push("null");else{if("object"==typeof b){if("array"== +ba(b)){var d=b;b=d.length;c.push("[");for(var e="",f=0;f<b;f++)c.push(e),e=d[f],za(a,a.Jd?a.Jd.call(d,String(f),e):e,c),e=",";c.push("]");return}if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();else{c.push("{");f="";for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(e=b[d],"function"!=typeof e&&(c.push(f),Aa(d,c),c.push(":"),za(a,a.Jd?a.Jd.call(b,d,e):e,c),f=","));c.push("}");return}}switch(typeof b){case "string":Aa(b,c);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);}}},Ba={'"':'\\"',"\\":"\\\\","/":"\\/","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\x0B":"\\u000b"},Ca=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g,Aa=function(a,b){b.push('"',a.replace(Ca,function(a){var b=Ba[a];b||(b="\\u"+(a.charCodeAt(0)|65536).toString(16).substr(1),Ba[a]=b);return b}),'"')};var Ea=function(a,b){var c=b||new Image;c.onload=c.onerror=Da(c);c.src=a},Fa=function(a){for(var b=0;b<a.length;b++)Ea(a[b])},Da=function(a){return function(){a.onload=a.onerror=null}};var Ga=function(a,b){this.Fc=Math.ceil(a);this.Ec=Math.floor(b)};Ga.prototype.ka=function(){return this.Fc+"px - "+this.Ec+"px"};Ga.prototype.X=function(a){a=parseInt(a,10);return isNaN(a)?null:Math.max(this.Fc,Math.min(this.Ec,a))};Ga.prototype.ja=function(a){return this.X(a)};var Ha=(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com/uds",Ia=(window._googCsaAlwaysHttps?"https:":"")+"//ads.google.com/uds",Ja=(window._googCsaAlwaysHttps?"https:":"")+"//afs.googlesyndication.com/uds",Ka=function(){if("undefined"!=typeof gwsHost_)return gwsHost_;if("undefined"!=typeof serviceHost_)return(window._googCsaAlwaysHttps?"https://":"//")+serviceHost_;var a="";"undefined"!=typeof serviceBase_?a=serviceBase_:window.google&&window.google.loader&&window.google.loader.ServiceBase&& +(a=window.google.loader.ServiceBase);1==window.googleSynd&&a==Ja&&(a=Ia);a=a?a:Ha;return a.match(/(.+)\/uds$/)[1]};var La=function(a,b,c,d,e){this.vj=a;this.Bj=b;this.kj=c;this.version=d;this.Se=e};Ka();var Ma={}; +La.prototype.log=function(a,b){var c;if(!0===window.IS_GOOGLE_AFS_IFRAME_&&window.parent==window)c=!1;else{c=(window.google&&window.google.loader&&window.google.loader.GoogleApisBase?window.google.loader.GoogleApisBase:googleApisBase_?googleApisBase_:(window._googCsaAlwaysHttps?"https:":"")+"//ajax.googleapis.com/ajax")+"/services/js/error";var d={};d.mn=this.vj+"."+this.Bj;d.vh=this.kj;d.v=this.version;d.em=a.message;d.cem=b;var e=[],f;for(f in d)d.hasOwnProperty(f)&&d[f]&&e.push([f,encodeURIComponent(d[f])].join("=")); +d=document.createElement("img");c=c+"?"+e.join("&");Ma[c]?c=!1:(d.src=[c,"&nc",(new Date).getTime()].join(""),c=Ma[c]=!0)}return c};var Oa=function(a,b){var c=Na;return function(){var d=Array.prototype.slice.call(arguments,0)||[];try{return a.apply(this,d)}catch(f){d=f;"string"==(typeof d).toLowerCase()&&(d={message:d});var e=d.message;b&&-1==e.indexOf(c.Se)&&c.log(d,b);throw-1!=e.indexOf(c.Se)?e:c.Se+e;}}},Pa=function(a){return"google.ads.search.Ads: "+a},Sa="unknown"; +if(window.google&&window.google.ads){var Ta=window.google.ads;if(Ta&&Ta.LoadArgs)var Ua=Ta.LoadArgs.match(/file=([^&]*)/),Sa=Ua&&Ua[1]?Ua[1]:"";else Sa=""}else"undefined"!=typeof module_&&(Sa=module_);var Va="unknown";if(window.google&&window.google.ads){var Wa=window.google.ads;if(Wa&&Wa.LoadArgs)var Xa=Wa.LoadArgs.match(/packages=([^&]*)/),Va=Xa&&Xa[1]?Xa[1]:"";else Va=""}else"undefined"!=typeof packages_&&(Va=packages_);var Ya="unknown"; +window.google&&window.google.ads?Ya=window.google.ads.JSHash:"undefined"!=typeof hash_&&(Ya=hash_);var Za="unknown";window.google&&window.google.ads?Za=window.google.ads.Version:"undefined"!=typeof version_&&(Za=version_);var Na=new La(Sa,Va,Ya,Za,"google.ads.search.Ads: "),m=function(a,b){return b?Oa(a,b):Oa(a)};var $a=function(a){this.Pd=[];this.ne=[];a=a.split("#");this.pg=a[0];this.ld=1<a.length?decodeURI(a[1]):"";this.maxLength=1999},n=function(a,b,c,d){(c||0===c||!1===c)&&(d?a.Pd:a.ne).push([encodeURIComponent(b),encodeURIComponent(""+c)])},ab=function(a){var b=a.pg,c=-1!=a.pg.indexOf("?"),d;for(d=0;d<a.ne.length;d++){var e=(c?"&":"?")+a.ne[d].join("=");e.length+b.length<=a.maxLength&&(b+=e,c=!0)}for(d=0;d<a.Pd.length;d++)a.Pd[d][0].length+3+b.length<=a.maxLength&&(b+=(c?"&":"?")+a.Pd[d].join("="),c= +!0);b=b.substring(0,a.maxLength);b=b.replace(/%\w?$/,"");a.ld&&(b+="#"+encodeURI(a.ld));return b};var bb=(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com",cb=/^https?:\/\//,db=function(a){return cb.test(a)?a:"/"==a.charAt(0)?bb+a:bb+"/"+a},gb=/\/aclk\?.*/,hb={ads:0,plas:1,singleProduct:2,relatedsearch:3},ib=(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com/csi?s=csa&v=3&action=",jb=42==Math.floor(100*Math.random()),kb={},lb=function(a,b){this.th=b||(new Date).getTime();this.action=a};lb.prototype.clone=function(a){return new lb(a,this.th)}; +var mb=function(a,b){p&&jb&&(kb[a.action]=kb[a.action]||[],kb[a.action].push([b,(new Date).getTime()-a.th].join(".")))},nb=function(a){var b=p;b.action=b.action?b.action+(","+a):a},ob=function(){if(p&&jb&&"//afs.googlesyndication.com"!=Ka()){var a=kb;kb={};for(var b in a)if(a.hasOwnProperty(b)){var c=a[b];c&&0<c.length&&Ea([ib,b,"&rt=",c.join(",")].join(""))}}},p=null; +4040473==window._googCsaExp?p=new lb("althpe",window._googCsa&&window._googCsa.t?window._googCsa.t:window.googleNDT_):4040472!=window._googCsaExp&&(window._googCsa&&window._googCsa.t?p=new lb("ppla",window._googCsa.t):window.googleNDT_&&!window.googleLT_?p=new lb("pplnd",window.googleNDT_):window.googleLT_&&(p=new lb("pplal",window.googleLT_))); +var pb={"google-hotels":!0},qb=window.caps_&&window.caps_.largeFonts,rb=!window.IS_GOOGLE_AFS_IFRAME_||qb?8:6,tb=!window.IS_GOOGLE_AFS_IFRAME_||qb?24:16,ub=new Ga(8,tb),vb=function(a,b){var c=a.g.X(b);if(null==c&&!a.L)throw Pa(a.key+" has an invalid value. Valid input values: ["+a.g.ka()+"].");return c},wb=function(a,b){for(var c=0;c<b.length;c++)a[b[c].key]=b[c]},Ab=function(){var a=xb(),b=yb();return zb(a,function(a,d){return b.hasOwnProperty(d)})},Bb=function(a){var b=8==oa(pa),c=oa(sa),d=oa(ta), +e=oa(va);return!!(q.X(a.waitForAds)&&!b&&(null==c||11<c)&&(null==d||3<d)&&(null==e||4<e))},Cb=function(a){return(a=a.match(/slave-(\d+)-/))?parseInt(a[1],10)+1:1},Db=function(a,b,c){for(var d=[],e=0,f;f=c[e];e++)f=new $a(f),n(f,a,b),d.push(ab(f));return d},Eb=function(a){for(var b=[],c=0;c<a.length;c++){var d=new $a(a[c]);n(d,"nc",[Math.round(9E6*Math.random()),(new Date).getTime()].join(""));b.push(ab(d))}return b},Fb=function(a){var b=a.pubId;return/^pub-.*/.test(b)||"gcsc"in a||b in pb},Gb=function(a){"on"== +a.adtest&&a.testgl&&(a.gl=a.testgl,a.glp="1")};var Hb=null,t=null,w=function(a){this.sessionId=a;this.state={};this.Ua=null;this.U=!1},w=m(w,"fsI");k=w.prototype;k.uc=function(a){return this.state.hasOwnProperty(a)?this.state[a].value:null};k.uc=m(w.prototype.uc,"fsiGS");k.Zb=function(a,b){this.state.hasOwnProperty(a)||(this.state[a]=new Ib);this.Bb(a,b)};k.Zb=m(w.prototype.Zb,"fsiSS");k.ye=function(a){return this.state[a].value};k.ye=m(w.prototype.ye,"fsiGI");k.Yb=function(a,b){this.state.hasOwnProperty(a)||(this.state[a]=new x);this.Bb(a,b)}; +k.Yb=m(w.prototype.Yb,"fsiSI");k.Xb=function(a,b){this.state.hasOwnProperty(a)||(this.state[a]=new Jb);this.Bb(a,b)};k.Xb=m(w.prototype.Xb,"fsiSB");k.ba=function(a,b,c){null==Hb&&Kb();if(Hb!=z||b!=Ib)this.state.hasOwnProperty(a)||(this.state[a]=new b),b=this.state[a],b.lb=c||null,b.lb&&null!=b.value&&b.lb(this,this.sessionId,a,b.value)};k.ba=m(w.prototype.ba,"fsiSTC");k.Rb=function(){return!!(this.Ua&&this.Ua.parentNode&&this.Ua.contentWindow)};k.Rb=m(w.prototype.Rb,"fsiHVI"); +k.Bb=function(a,b){var c=this.state[a];b=c.Ga(a,b);null!=b&&c.value!=b&&(c=this.state[a],c.value=b,this.U=c.U=!0)};k.Bb=m(w.prototype.Bb,"fsiS");k.Fd=function(){if(this.U){for(var a in this.state)if(this.state.hasOwnProperty(a)){var b=this.state[a];b.U&&(b.U=!1,b.lb&&b.lb(this,this.sessionId,a,b.value))}this.U=!1}};k.Fd=m(w.prototype.Fd,"fsiNC"); +k.rd=function(a){var b=["FSXDC"],c;for(c in this.state)if(this.state.hasOwnProperty(c)){var d=this.state[c];if(a||d.U){var e=d.Ra();b.push([encodeURIComponent(c),d.Td,e].join(":"));d.U=!1}}this.U=!1;return b.join(",")};k.rd=m(w.prototype.rd,"fsiGCM"); +k.nd=function(a){if(a&&a.split&&(a=a.split(","),"FSXDC"==a[0])){for(var b=1;b<a.length;b++){var c=a[b].split(":"),d=decodeURIComponent(c[0]);this.state.hasOwnProperty(d)||(this.state[d]=new (Lb[parseInt(c[1],10)]));c=this.state[d].Oa(c[2]);this.Bb(d,c)}this.Fd()}};k.nd=m(w.prototype.nd,"fsiECM");var Mb=function(a,b){Na.log({message:a},b)},Mb=m(Mb,"fsLE"),Jb=function(){this.lb=this.value=null;this.U=!1},Jb=m(Jb,"fsB");k=Jb.prototype;k.Td=0;k.Tc=1;k.Ga=function(a,b){return!!b}; +k.Ga=m(Jb.prototype.Ga,"fsbGVV");k.Db=function(){return this.value?1:0};k.Db=m(Jb.prototype.Db,"fsbTB");k.Ub=function(a){return!!a};k.Ub=m(Jb.prototype.Ub,"fsbPFB");k.Ra=function(){return this.value?"t":"f"};k.Ra=m(Jb.prototype.Ra,"fsbTES");k.Oa=function(a){return"t"==a};k.Oa=m(Jb.prototype.Oa,"fsbPES");var x=function(){this.lb=this.value=null;this.U=!1},x=m(x,"fsSI");k=x.prototype;k.Td=1;k.Tc=14;k.Mf=(1<<x.prototype.Tc)-1; +k.Ga=function(a,b){var c=parseInt(b,10);if(isNaN(c))return Mb("Tried to set int value to a non-number ( "+a+" = "+b+")","sIGVV"),null;c>this.Mf&&(Mb("Tried to set int value to a number too large ( "+a+" = "+b+")","sIGVV"),c=this.Mf);0>c&&(Mb("Tried to set int value to a number too small ( "+a+" = "+b+")","sIGVV"),c=0);return c};k.Ga=m(x.prototype.Ga,"fssiGVV");k.Db=function(){return this.value||0};k.Db=m(x.prototype.Db,"fssiTB");k.Ub=function(a){return a};k.Ub=m(x.prototype.Ub,"fssiPFB"); +k.Ra=function(){return this.value+""};k.Ra=m(x.prototype.Ra,"fssiTES");k.Oa=function(a){return parseInt(a,10)};k.Oa=m(x.prototype.Oa,"fssiPES");var Ib=function(){this.lb=this.value=null;this.U=!1},Ib=m(Ib,"fsES");k=Ib.prototype;k.Td=2;k.Ga=function(a,b){return b=b?b.toString():""};k.Ga=m(Ib.prototype.Ga,"fsesGVV");k.Ra=function(){return this.value?encodeURIComponent(this.value):""};k.Ra=m(Ib.prototype.Ra,"fsesTES");k.Oa=function(a){return decodeURIComponent(a)};k.Oa=m(Ib.prototype.Oa,"fsesPES"); +var Lb=[Jb,x,Ib],Nb=function(a){null==Hb&&Kb();return Hb.Qa(a)},Nb=m(Nb,"fsSC"),Pb=function(a,b){null==Hb&&Kb();null==t&&(t={},Ob());a.Ua=b;t[a.sessionId]=a},Pb=m(Pb,"fsLFC"),Ob=function(){window.setInterval(Qb,500);Hb.Ha()},Ob=m(Ob,"fsIL"),Qb=function(){for(var a in t)if(t.hasOwnProperty(a)){var b=t[a];b.Rb()||(b.Ua=null,delete t[a])}},Qb=m(Qb,"fsCDI"),Kb=function(){A.Oe();Hb=A.af?A:ra()?z:B},Kb=m(Kb,"fsLT"),z={Jf:"exists",Qa:function(a){if(!a.U)return!0;for(var b in a.state)if(a.state.hasOwnProperty(b)){var c= +a.state[b];if(c.U&&c.Db){var d=c.Tc,e=c.Db(),f=b+":";z.Md(f+z.Jf);for(var g=0,h=1;g<d;g++,h<<=1){var l=f+g;e&h?z.Md(l):z.ce(l)}c.U=!1}}a.U=!1;return!0}};z.Qa=m(z.Qa,"fsnbtSC");z.Ha=function(){window.setInterval(z.ia,50)};z.Ha=m(z.Ha,"fsnbtIL");z.ia=function(){for(var a in t)if(t.hasOwnProperty(a)){var b=t[a];if(b.Rb()){var c=b.Ua.contentWindow,d;for(d in b.state)b.state.hasOwnProperty(d)&&z.rf(b,d,c);b.Fd()}}};z.ia=m(z.ia,"fsnbtEC"); +z.rf=function(a,b,c){var d=z.Be,e=b+":";if(d(c,e+z.Jf)){for(var f=a.state[b],g=f.Tc,h=0,l=0,r=1;l<g;l++,r<<=1){var u=d(c,e+l);if(null===u)return;u&&(h+=r)}c=f.Ub(h);a.Bb(b,c)}};z.rf=m(z.rf,"fsnbtSV");z.Be=function(a,b){var c=null;try{c=b in a}catch(d){Mb(b,"fsnbtGSB2")}return c};z.Be=m(z.Be,"fsnbtGSB");z.Md=function(a){if(!document.getElementById(a)){var b=document.createElement("img");b.name=a;b.id=a;b.height=0;b.width=0;document.body.appendChild(b)}};z.Md=m(z.Md,"fsnbtSSB"); +z.ce=function(a){(a=document.getElementById(a))&&a.parentNode.removeChild(a)};z.ce=m(z.ce,"fsnbtCSB");var A={Qa:function(a){if(a.U){if(!A.af)return!1;A.af.postMessage(a.rd(!1),"*")}return!0}};A.Qa=m(A.Qa,"fspmtSC");A.Ha=function(){window.attachEvent?window.attachEvent("onmessage",A.ia):window.addEventListener&&window.addEventListener("message",A.ia,!1)};A.Ha=m(A.Ha,"fspmtIL"); +A.ia=function(a){if(a=a?a:window.event)for(var b in t)if(t.hasOwnProperty(b)){var c=t[b];if(c.Rb()&&a.source==c.Ua.contentWindow){c.nd(a.data);break}}};A.ia=m(A.ia,"fspmtEC");A.Oe=function(){var a=window.parent;try{var b=a.postMessage?a:a.document.postMessage?a.document:null;b&&b.postMessage&&(A.af=b)}catch(c){}};A.Oe=m(A.Oe,"fspmtLPM");var B={Qa:function(a){if(a.U){if(!window.relay)return!1;B.he(window.relay,a.rd(!0))}return!0}};B.Qa=m(B.Qa,"fsnitSC");B.Ha=function(){window.setInterval(B.ia,5)}; +B.Ha=m(B.Ha,"fsnitIL");B.ia=function(){for(var a in t)if(t.hasOwnProperty(a)){var b=t[a],c=B.ze(b);c&&b.nd(c)}};B.ia=m(B.ia,"fsnitEC");B.ze=function(a){try{if(a.Rb()){var b=a.Ua.contentWindow;if(b.frames&&b.frames.length&&0<b.frames.length&&b.frames[b.frames.length-1].name)return b.frames[b.frames.length-1].name}}catch(c){}return null};B.ze=m(B.ze,"fsnitGM"); +B.he=function(a,b){var c=document.createElement("iframe");c.style.position="absolute";c.style.top="0";c.style.left="0";c.style.display="none";c.width="0";c.height="0";c.src=a+"crossdomain.xml";c.name=b;c.onload=function(){B.le(this,100)};document.body.appendChild(c)};B.he=m(B.he,"fsnitCRI");B.le=function(a,b){window.setTimeout(function(){a.parentNode.removeChild(a)},b)};B.le=m(B.le,"fsnitDMI");if(window.IS_GOOGLE_AFS_IFRAME_)var Rb=function(a){return function(b,c){return"undefined"==typeof a[b]?c||null:a[b]}},Sb=function(a){return function(b,c){if(a.hasOwnProperty(b)){for(var d=a[b].split(","),e=0;e<d.length;e++)if(d[e]==c)return!0;return!1}return!0}},Tb=function(a,b){return!b.clickBg&&!b.mclickBg||!a.clickableBackgrounds||b.isHighendMobile&&!b.mclickBg?!1:!0},Ub=function(a){return 6==oa(pa)?!0:"_blank"==(a.linkTarget?a.linkTarget:"_top")},Vb=function(a,b){return 1==(!0===a.heightConstrained&& +!!b.mayLimitHeight)};var Wb;var Xb=String.prototype.trim?function(a){return a.trim()}:function(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},ec=function(a){if(!Yb.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(Zb,"&"));-1!=a.indexOf("<")&&(a=a.replace($b,"<"));-1!=a.indexOf(">")&&(a=a.replace(ac,">"));-1!=a.indexOf('"')&&(a=a.replace(bc,"""));-1!=a.indexOf("'")&&(a=a.replace(cc,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(dc,"�"));return a},Zb=/&/g,$b=/</g,ac=/>/g,bc=/"/g,cc=/'/g,dc=/\x00/g,Yb=/[\x00&<>"']/, +fc=function(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^ia()).toString(36)},gc=function(a,b){return a<b?-1:a>b?1:0};var hc=Array.prototype.filter?function(a,b,c){return Array.prototype.filter.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=[],f=0,g=da(a)?a.split(""):a,h=0;h<d;h++)if(h in g){var l=g[h];b.call(c,l,h,a)&&(e[f++]=l)}return e},ic=Array.prototype.map?function(a,b,c){return Array.prototype.map.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=Array(d),f=da(a)?a.split(""):a,g=0;g<d;g++)g in f&&(e[g]=b.call(c,f[g],g,a));return e};var zb=function(a,b){var c={},d;for(d in a)b.call(void 0,a[d],d,a)&&(c[d]=a[d]);return c};var jc=/<[^>]*>|&[^;]+;/g,kc=function(a,b){return b?a.replace(jc,""):a},lc=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]"),mc=RegExp("^[^A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]*[\u0591-\u06ef\u06fa-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc]"),nc=/^http:\/\/.*/,oc=/\s+/,pc=/[\d\u06f0-\u06f9]/;var rc=function(){this.Kj="";this.$h=qc},qc={};var tc=function(){this.df="";this.ai=sc};tc.prototype.ve=function(){return 1};var uc=function(a){return a instanceof tc&&a.constructor===tc&&a.ai===sc?a.df:"type_error:SafeUrl"},sc={};var wc=function(){this.Lj="";this.bi=vc};wc.prototype.ve=function(){return 1};var xc=function(a){return a instanceof wc&&a.constructor===wc&&a.bi===vc?a.Lj:"type_error:TrustedResourceUrl"},vc={};var zc=function(){this.df="";this.Zh=yc;this.Ii=null};zc.prototype.ve=function(){return this.Ii};var yc={};var Ac=function(){return null},Bc=function(a){var b=arguments,c=b.length;return function(){for(var a,e=0;e<c;e++)a=b[e].apply(this,arguments);return a}};var Cc=function(a,b,c){return a+c*(b-a)};var Dc;a:{var Ec=aa.navigator;if(Ec){var Fc=Ec.userAgent;if(Fc){Dc=Fc;break a}}Dc=""}var D=function(a){return-1!=Dc.indexOf(a)};var Gc=function(){return D("Opera")||D("OPR")},Hc=function(){return(D("Chrome")||D("CriOS"))&&!Gc()&&!D("Edge")};var Ic=function(){return D("iPhone")&&!D("iPod")&&!D("iPad")};var Jc=Gc(),E=D("Trident")||D("MSIE"),Kc=D("Edge"),Lc=D("Gecko")&&!(-1!=Dc.toLowerCase().indexOf("webkit")&&!D("Edge"))&&!(D("Trident")||D("MSIE"))&&!D("Edge"),Mc=-1!=Dc.toLowerCase().indexOf("webkit")&&!D("Edge"),Nc=function(){var a=Dc;if(Lc)return/rv\:([^\);]+)(\)|;)/.exec(a);if(Kc)return/Edge\/([\d\.]+)/.exec(a);if(E)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Mc)return/WebKit\/(\S+)/.exec(a)},Oc=function(){var a=aa.document;return a?a.documentMode:void 0},Pc=function(){if(Jc&&aa.opera){var a; +var b=aa.opera.version;try{a=b()}catch(c){a=b}return a}a="";(b=Nc())&&(a=b?b[1]:"");return E&&(b=Oc(),b>parseFloat(a))?String(b):a}(),Qc={},Rc=function(a){var b;if(!(b=Qc[a])){b=0;for(var c=Xb(String(Pc)).split("."),d=Xb(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f<e;f++){var g=c[f]||"",h=d[f]||"",l=RegExp("(\\d*)(\\D*)","g"),r=RegExp("(\\d*)(\\D*)","g");do{var u=l.exec(g)||["","",""],y=r.exec(h)||["","",""];if(0==u[0].length&&0==y[0].length)break;b=gc(0==u[1].length?0:parseInt(u[1], +10),0==y[1].length?0:parseInt(y[1],10))||gc(0==u[2].length,0==y[2].length)||gc(u[2],y[2])}while(0==b)}b=Qc[a]=0<=b}return b},Tc=aa.document,Uc=Tc&&E?Oc()||("CSS1Compat"==Tc.compatMode?parseInt(Pc,10):5):void 0;var Vc=function(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0};Vc.prototype.clone=function(){return new Vc(this.x,this.y)};Vc.prototype.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};Vc.prototype.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};Vc.prototype.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};var Wc=function(a,b){this.width=a;this.height=b};Wc.prototype.clone=function(){return new Wc(this.width,this.height)};Wc.prototype.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};Wc.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};Wc.prototype.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};!Lc&&!E||E&&9<=Uc||Lc&&Rc("1.9.1");E&&Rc("9");var Zc=function(a){return a?new Xc(Yc(a)):Wb||(Wb=new Xc)},Yc=function(a){return 9==a.nodeType?a:a.ownerDocument||a.document},Xc=function(a){this.qc=a||aa.document||document};Xc.prototype.vg=function(a){return da(a)?this.qc.getElementById(a):a};Xc.prototype.createElement=function(a){return this.qc.createElement(a)}; +var $c=function(a,b){var c=a.qc,d=c.createElement("DIV");E?(d.innerHTML="<br>"+b,d.removeChild(d.firstChild)):d.innerHTML=b;if(1==d.childNodes.length)d=d.removeChild(d.firstChild);else{for(c=c.createDocumentFragment();d.firstChild;)c.appendChild(d.firstChild);d=c}return d};Xc.prototype.appendChild=function(a,b){a.appendChild(b)}; +Xc.prototype.contains=function(a,b){if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a};E&&Rc(8);var ad={},bd={},cd={},dd={},ed={},fd={},gd=function(){throw Error("Do not instantiate directly");};gd.prototype.Ba=null;gd.prototype.toString=function(){return this.content};var hd=function(){gd.call(this)};ja(hd,gd);var id=function(a,b){return null!=a&&a.Ya===b},jd=function(a){if(null!=a)switch(a.Ba){case 1:return 1;case -1:return-1;case 0:return 0}return null},kd=function(){gd.call(this)};ja(kd,gd);kd.prototype.Ya=ad;var G=function(a){return null!=a&&a.Ya===ad?a:a instanceof zc?F(a instanceof zc&&a.constructor===zc&&a.Zh===yc?a.df:"type_error:SafeHtml",a.ve()):F(ec(String(String(a))),jd(a))},ld=function(){gd.call(this)};ja(ld,gd);ld.prototype.Ya={};ld.prototype.Ba=1;var md=function(){gd.call(this)};ja(md,gd); +md.prototype.Ya=bd;md.prototype.Ba=1;var nd=function(){gd.call(this)};ja(nd,gd);nd.prototype.Ya=cd;nd.prototype.Ba=1;var od=function(){gd.call(this)};ja(od,gd);od.prototype.Ya=dd;od.prototype.Ba=1;var pd=function(){gd.call(this)};ja(pd,gd);pd.prototype.Ya=ed;pd.prototype.Ba=1;var qd=function(a,b){this.content=String(a);this.Ba=null!=b?b:null};ja(qd,hd);qd.prototype.Ya=fd; +var rd=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a){return new b(String(a))}},F=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a,d){var e=new b(String(a));void 0!==d&&(e.Ba=d);return e}}(kd);rd(ld);var sd=rd(md);rd(nd); +var td=rd(od),ud=rd(pd),vd=function(a,b){function c(){}c.prototype=a;var d=new c,e;for(e in b)d[e]=b[e];return d},wd=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a){return(a=String(a))?new b(a):""}},xd=function(a){return(a=String(a))?new qd(a,void 0):""},I=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a,d){var e=String(a);if(!e)return"";e=new b(e);void 0!==d&&(e.Ba=d);return e}}(kd);wd(ld);wd(nd);wd(md);wd(od); +var yd=wd(pd),K=function(a){return G(a)},zd=function(a){return a.replace(/<\//g,"<\\/").replace(/\]\]>/g,"]]\\>")},M=function(a){return id(a,ad)?(a=String(a.content).replace(Ad,"").replace(Bd,"<"),String(a).replace(Cd,Dd)):ec(String(a))},Fd=function(a){if(id(a,dd))return a.content.replace(/([^"'\s])$/,"$1 ");a=String(a);a=Ed.test(a)?a:"zSoyz";return a},Id=function(a){return String(a).replace(Gd,Hd)},O=function(a){if(id(a,bd)||id(a,cd))return String(a).replace(Gd,Hd);a instanceof tc?a=Id(uc(a)): +a instanceof wc?a=Id(xc(a)):(a=String(a),a=Jd.test(a)?a.replace(Gd,Hd):"#zSoyz");return a},Ld=function(a){if(id(a,bd)||id(a,cd))return String(a).replace(Gd,Hd);a instanceof tc?a=Id(uc(a)):a instanceof wc?a=Id(xc(a)):(a=String(a),a=Kd.test(a)?a.replace(Gd,Hd):"about:invalid#zSoyz");return a},P=function(a){if(id(a,ed))return zd(a.content);null==a?a="":a instanceof rc?(a=a instanceof rc&&a.constructor===rc&&a.$h===qc?a.Kj:"type_error:SafeStyle",a=zd(a)):(a=String(a),a=Md.test(a)?a:"zSoyz");return a}, +Q=function(a){return id(a,fd)?"zSoyz":a},Nd=function(a){var b=jd(a);if(null==b){var c=b=0,d=!1;a=kc(a+"",id(a,ad)).split(oc);for(var e=0;e<a.length;e++){var f=a[e];mc.test(kc(f,void 0))?(b++,c++):nc.test(f)?d=!0:lc.test(kc(f,void 0))?c++:pc.test(f)&&(d=!0)}b=0==c?d?1:0:.4<b/c?-1:1}return b},Od={"\x00":"�","\t":"	","\n":" ","\x0B":"","\f":"","\r":" "," ":" ",'"':""","&":"&","'":"'","-":"-","/":"/","<":"<","=":"=",">":">","`":"`","\u0085":"…", +"\u00a0":" ","\u2028":"
","\u2029":"
"},Dd=function(a){return Od[a]},Pd={"\x00":"%00","\u0001":"%01","\u0002":"%02","\u0003":"%03","\u0004":"%04","\u0005":"%05","\u0006":"%06","\u0007":"%07","\b":"%08","\t":"%09","\n":"%0A","\x0B":"%0B","\f":"%0C","\r":"%0D","\u000e":"%0E","\u000f":"%0F","\u0010":"%10","\u0011":"%11","\u0012":"%12","\u0013":"%13","\u0014":"%14","\u0015":"%15","\u0016":"%16","\u0017":"%17","\u0018":"%18","\u0019":"%19","\u001a":"%1A","\u001b":"%1B","\u001c":"%1C", +"\u001d":"%1D","\u001e":"%1E","\u001f":"%1F"," ":"%20",'"':"%22","'":"%27","(":"%28",")":"%29","<":"%3C",">":"%3E","\\":"%5C","{":"%7B","}":"%7D","\u007f":"%7F","\u0085":"%C2%85","\u00a0":"%C2%A0","\u2028":"%E2%80%A8","\u2029":"%E2%80%A9","\uff01":"%EF%BC%81","\uff03":"%EF%BC%83","\uff04":"%EF%BC%84","\uff06":"%EF%BC%86","\uff07":"%EF%BC%87","\uff08":"%EF%BC%88","\uff09":"%EF%BC%89","\uff0a":"%EF%BC%8A","\uff0b":"%EF%BC%8B","\uff0c":"%EF%BC%8C","\uff0f":"%EF%BC%8F","\uff1a":"%EF%BC%9A","\uff1b":"%EF%BC%9B", +"\uff1d":"%EF%BC%9D","\uff1f":"%EF%BC%9F","\uff20":"%EF%BC%A0","\uff3b":"%EF%BC%BB","\uff3d":"%EF%BC%BD"},Hd=function(a){return Pd[a]},Cd=/[\x00\x22\x27\x3c\x3e]/g,Gd=/[\x00- \x22\x27-\x29\x3c\x3e\\\x7b\x7d\x7f\x85\xa0\u2028\u2029\uff01\uff03\uff04\uff06-\uff0c\uff0f\uff1a\uff1b\uff1d\uff1f\uff20\uff3b\uff3d]/g,Md=/^(?!-*(?:expression|(?:moz-)?binding))(?:[.#]?-?(?:[_a-z0-9-]+)(?:-[_a-z0-9-]+)*-?|-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[a-z]{1,2}|%)?|!important|)$/i,Jd=/^(?![^#?]*\/(?:\.|%2E){2}(?:[\/?#]|$))(?:(?:https?|mailto):|[^&:\/?#]*(?:[\/?#]|$))/i, +Kd=/^[^&:\/?#]*(?:[\/?#]|$)|^https?:|^data:image\/[a-z0-9+]+;base64,[a-z0-9+\/]+=*$|^blob:/i,Ed=/^(?!on|src|(?:style|action|archive|background|cite|classid|codebase|data|dsync|href|longdesc|usemap)\s*$)(?:[a-z0-9_$:-]*)$/i,Ad=/<(?:!|\/?([a-zA-Z][a-zA-Z0-9:\-]*))(?:[^>'"]|"[^"]*"|'[^']*')*>/g,Bd=/</g;var Qd=function(){return ud("display: -moz-inline-box; display:inline-block; zoom: 1; *display: inline;")},Rd=function(a){return ud("-webkit-box-shadow: "+P(a.value)+"; -moz-box-shadow: "+P(a.value)+"; box-shadow: "+P(a.value)+";")};var Sd=function(a){return F('<a href="'+M(O(a.href))+'" target="'+(a.A?"_blank":"_top")+'"'+(a.Za?'id="'+M(a.Za)+'"':"")+" "+(a.qa?'class="'+M(a.qa)+'"':"")+">"+G(a.content)+"</a>")};if(window.IS_GOOGLE_AFS_IFRAME_){var Td=1,R=function(){return"e"+Td++},Ud=function(a){this.Cb=a};Ud.prototype.j=function(){return this.Cb};var S=new Ud("");S.G=function(){return[]}};if(window.IS_GOOGLE_AFS_IFRAME_)var Vd=function(a,b,c,d,e,f,g,h,l,r,u,y,C,H,J){this.eb=a;this.za=b;this.xi=c;this.Jb=d;this.me=e;this.Te=f;this.yb=g;this.xk=h;this.f=l;this.A=r;this.yj=u;this.bk=y;this.Y=C;this.ac=H;this.xg=!1;this.sg=J};var Wd=function(a,b){if(a.classList)return a.classList.contains(b);for(var c=a.className.split(" "),d=0;d<c.length;d++)if(c[d]==b)return!0;return!1},Xd=function(a,b){if(a.classList)a.classList.remove(b);else{for(var c=a.className.split(" "),d=[],e=0;e<c.length;e++)c[e]!=b&&d.push(c[e]);a.className=d.join(" ")}},Yd=function(a,b){a.classList?a.classList.add(b):a.className?Wd(a,b)||(a.className+=" "+b):a.className=b},Zd=function(a,b,c){var d=[];if("getElementsByClassName"in document){a=a.getElementsByClassName(c); +for(var e=0,f;f=a[e];e++)f.nodeName&&f.nodeName.toLowerCase()==b&&d.push(f)}else for(a=a.getElementsByTagName(b),e=0;f=a[e];e++)Wd(f,c)&&d.push(f);return d},T=function(a,b){var c=a.getElementById(b);if(!c)throw"Could not find element with id: "+b;return c},$d=function(a,b,c){return(a=a.defaultView||{},a.getComputedStyle)?(b=a.getComputedStyle(b,!1))?b.getPropertyValue(c):null:(b=b.currentStyle)?b[c]:null},ae=function(a){var b=document.createElement("div");a=da(a)?a:a.content;b.innerHTML="<table><tbody>"+ +a+"</tbody></table>";var c;try{c=b.firstChild.firstChild.firstChild}catch(d){return null}return 1==c.nodeType&&"tr"==c.tagName.toLowerCase()?c:null},be=function(a){var b=a.parentNode,c=a.nextSibling,d=document.createElement("div");d.appendChild(a);b&&(c?b.insertBefore(d,c):b.appendChild(d));return d};var U=function(a,b,c){if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent)a.attachEvent("on"+b,c);else{var d=a["on"+b];a["on"+b]=null!=d?Bc(c,d):c}},ce=function(a,b){U(a,"mousedown",b);U(a,"mousedown",function(a,b,e){var f=!1;return function(){f||(a.removeEventListener?a.removeEventListener(b,e,!1):a.detachEvent&&a.detachEvent("on"+b,e),f=!0)}}(a,"mousedown",b))};var de=function(a){de[" "](a);return a};de[" "]=function(){};E&&Rc("9");!Mc||Rc("528");Lc&&Rc("1.9b")||E&&Rc("8")||Jc&&Rc("9.5")||Mc&&Rc("528");Lc&&!Rc("8")||E&&Rc("9");var ee=function(a,b,c,d,e,f,g,h){this.Rc=a;this.Ef=b;this.Cf=c;this.Ff=d;this.Df=e;this.Gf=f;this.Rd=g;this.Hf=h};ee.prototype.clone=function(){return new ee(this.Rc,this.Ef,this.Cf,this.Ff,this.Df,this.Gf,this.Rd,this.Hf)}; +var fe=function(a,b){if(0==b)return a.Rc;if(1==b)return a.Rd;var c=Cc(a.Rc,a.Cf,b),d=Cc(a.Cf,a.Df,b),e=Cc(a.Df,a.Rd,b),c=Cc(c,d,b),d=Cc(d,e,b);return Cc(c,d,b)},he=function(a){var b=ge,c=(a-b.Rc)/(b.Rd-b.Rc);if(0>=c)return 0;if(1<=c)return 1;for(var d=0,e=1,f=0;8>f;f++){var g=fe(b,c),h=(fe(b,c+1E-6)-g)/1E-6;if(1E-6>Math.abs(g-a))return c;if(1E-6>Math.abs(h))break;else g<a?d=c:e=c,c-=(g-a)/h}for(f=0;1E-6<Math.abs(g-a)&&8>f;f++)g<a?(d=c,c=(c+e)/2):(e=c,c=(c+d)/2),g=fe(b,c);return c};var ge=new ee(0,0,.25,.1,.25,1,1,1),ie=function(a){a=he(a);if(0==a)a=ge.Ef;else if(1==a)a=ge.Hf;else{var b=Cc(ge.Ef,ge.Ff,a),c=Cc(ge.Ff,ge.Gf,a),d=Cc(ge.Gf,ge.Hf,a),b=Cc(b,c,a),c=Cc(c,d,a);a=Cc(b,c,a)}return a},je=function(a,b,c){var d=c-b;return function(c){a.style.left=b+c*d+"px"}},ke=function(a){this.Gb=void 0;this.ng=a;this.$a=!1;this.lk=ie;this.Ig=0},le=function(a){if(a.$a||!a.Gb)return!1;a.$a=!0;var b=a.Gb,c=ga(function(a,c){var d=this.lk(a);c?d=0:1<=a&&(d=1);b(d)},a);if(window.requestAnimationFrame&& +window.performance){var d=window.performance.now(),e=!0,f=ga(function(a){a=(a-d)/this.ng;c(a,e);e=!1;1<=a?(b(1),this.$a=!1):window.requestAnimationFrame(f)},a);window.requestAnimationFrame(f)}else d=(new Date).getTime(),e=!0,f=ga(function(){var a=((new Date).getTime()-d)/this.ng;c(a,e);e=!1;1<=a&&(b(1),this.$a=!1,window.clearInterval(this.Ig))},a),a.Ig=window.setInterval(f,1E3/60);return!0};var me=function(a){return td('target="'+(a.A?"_blank":"_top")+'"')};var oe=function(a){return F(ne({text:a.text.c,Ia:a.text.rtl,f:a.f}))},pe=function(a){return F(ne({text:a.text,Ia:0>Nd(a.text),f:a.f}))},ne=function(a){return F(0<a.text.toString().length?'<span dir="'+(a.Ia?"rtl":"ltr")+'">'+G(a.text)+"</span>"+(a.f?"‏":"‎"):"")};var qe=function(a){return F('<a id="'+M(a.uid)+'" href="'+M(O(a.url))+'" class="test_titleLink d_"'+Fd(me(a))+">"+K(oe(a))+"</a>")},re=function(a){return F('<div class="ctcT"><img src="//www.google.com/images/mobile_ad/phone_icon-lb32.png" class="ctcCOI" /><a id="'+M(a.uid)+'" href="'+M(O(a.url))+'"'+Fd(me(a))+">"+K(ne({text:a.Hd,Ia:!1,f:a.f}))+"</a>"+(a.mg?'<span class="ctcLD"> ('+K(pe({text:a.mg,f:a.f}))+")</span>":"")+"</div>"+(a.Zi?"":'<span class="ctcCO">'+K(oe(a))+"</span>"))},se=function(a){return F('<a id="'+ +M(a.uid)+'" href="'+M(O(a.url))+'" class="test_domainLink e_"'+Fd(me(a))+">"+K(ne({text:a.text,Ia:!1,f:a.f}))+"</a>")},te=function(a){var b=F,c;c=a.wh;var d=a.xh;a=a.f;var e="";if(d&&0<d.c.toString().length)var f=c.rtl||d.rtl,e=e+ne({Ia:f,f:a,text:I(oe({text:c,f:f})+" "+oe({text:d,f:f}))});else e+=oe({text:c,f:a});c=F(e);return b('<span class="descText">'+G(c)+"</span>")},ue=function(a){return F('<a id="'+M(a.uid)+'" href="'+M(O(a.url))+'" class="textLink"'+Fd(me(a))+">"+te(a)+"</a>")},ve=function(a){return F("<div>"+ +G(a.Ka)+"</div>"+G(a.La)+"<br />"+G(a.Ad))},we=function(a){return F("<div>"+G(a.Ka)+"</div>"+G(a.La))},xe=function(a){var b,c="",d=b=a.eb,e=typeof d;switch("object"==e&&null!=d||"function"==e?b.toString():b){case 1:c+="oneLine";break;case 2:c+="twoLine";break;case 3:c+="threeLine"}c=xd(c);a=""+('<div class="adStd '+M(c)+'"'+(a.za?'data-click-s="'+M(a.url)+'"'+Fd(td('data-click-trg="'+(a.A?"_blank":"_top")+'"')):"")+">"+G(a.content)+"</div>");return F(a)};var ye=function(a){var b=Yc(a),c=new Vc(0,0),d;d=b?Yc(b):document;var e;(e=!E||9<=Uc)||(e="CSS1Compat"==Zc(d).qc.compatMode);if(a==(e?d.documentElement:d.body))return c;var f;a:{try{f=a.getBoundingClientRect()}catch(g){f={left:0,top:0,right:0,bottom:0};break a}E&&a.ownerDocument.body&&(a=a.ownerDocument,f.left-=a.documentElement.clientLeft+a.body.clientLeft,f.top-=a.documentElement.clientTop+a.body.clientTop)}a=Zc(b).qc;b=a.scrollingElement?a.scrollingElement:Mc||"CSS1Compat"!=a.compatMode?a.body|| +a.documentElement:a.documentElement;a=a.parentWindow||a.defaultView;b=E&&Rc("10")&&a.pageYOffset!=b.scrollTop?new Vc(b.scrollLeft,b.scrollTop):new Vc(a.pageXOffset||b.scrollLeft,a.pageYOffset||b.scrollTop);c.x=f.left+b.x;c.y=f.top+b.y;return c};var ze=function(a){return F("<span class='individualLabel "+(a.ca?M(a.ca):"")+"'>"+G(a.text)+"</span>")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ae=function(a,b){this.ki=a;this.D=b||ze};Ae.prototype.j=function(){return this.D({text:this.ki,ca:null})}};var Be=function(a){var b="";a=a.elements;for(var c=a.length,d=0;d<c;d++)b+=G(a[d]);return F(b)},Ce=function(a){var b='<div id="'+M(a.uid)+'">';a=a.Jc;for(var c=a.length,d=0;d<c;d++)b+=G(a[d]);return F(b+"</div>")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ee=function(a,b){this.F=R();this.qb=a;this.D=b||De};Ee.prototype.j=function(){for(var a=[],b=0;b<this.qb.length;b++)a.push(this.qb[b].j());return this.D({uid:this.F,Jc:a})};Ee.prototype.G=function(a){for(var b=[],c=0;c<this.qb.length;c++)this.qb[c].G&&(b=b.concat(this.qb[c].G(a)));return b};Ee.prototype.M=function(a,b){for(var c=0;c<this.qb.length;c++){var d=this.qb[c];d.M&&d.M(a,b)}};var De=function(a){return Be({elements:a.Jc})}};var Fe=null,Ge=function(){if(null!=Fe)return Fe;var a=document.createElement("div");a.style.width="1px";a.style.height="1px";a.style.border="1px solid black";a.style.padding="1px";a.style.visibility="hidden";document.body.appendChild(a);var b=a.offsetWidth;document.body.removeChild(a);return Fe=5==b};function He(a){return parseFloat(a.replace("px",""))||0} +function Ie(a,b){"string"==typeof a&&(a=document.getElementById(a));var c=document.defaultView||{},d=b?a.offsetHeight:a.offsetWidth,e=b?["Top","Bottom"]:["Right","Left"],f;f=Ge()?["margin"]:["border","margin","padding"];var g=f.length,h=e.length;if(c&&c.getComputedStyle)for(var l=c.getComputedStyle(a,!1),c=0;c<g;c++)for(var r=0;r<h;r++)d+=He(l.getPropertyValue([f[c],e[r].toLowerCase()].join("-")));else{l=a.currentStyle;if(!Ge())for(r=0;r<h;r++)d+=He(l[["border",e[r],"Width"].join("")]);for(c=0;c< +g;c++)if("border"!=f[c])for(r=0;r<h;r++)d+=He(l[[f[c],e[r]].join("")])}return d} +var Je=function(a){return Ie(a,!0)},Ke=function(a){return a.replace(/<[^>^<]*>/g,"")},Le=function(a){var b=a.offsetWidth;if(!Ge())return b;var c=document.defaultView||{};c&&c.getComputedStyle?(a=c.getComputedStyle(a,!1),b-=He(a.getPropertyValue("padding-left"))+He(a.getPropertyValue("padding-right"))):(a=a.currentStyle,b-=He(a.paddingLeft)+He(a.paddingRight));return b},Me=function(a){var b=a.cloneNode(!0);b.style.visibility="hidden";b.style.position="absolute";if(ra()){var c=a.ownerDocument.createElement("div"); +c.style.visibility="hidden";c.style.position="relative";c.style.width="9999px";c.appendChild(b);a.parentNode.appendChild(c)}else b.style.top="0",b.style.whiteSpace="nowrap",a.parentNode.appendChild(b);a=new Wc(b.offsetWidth,b.offsetHeight);ra()?c.parentNode.removeChild(c):b.parentNode.removeChild(b);return a},Ne=function(){var a=document.createElement("div");a.innerHTML="<svg/>";return"http://www.w3.org/2000/svg"==(a.firstChild&&a.firstChild.namespaceURI)};var Oe=/([?|&]{1}nm=)([\d]{1,})/,Pe=/(\?|&)clkt=-?[\d]*/g,Qe=/[&\?]nb=\d/,Re=/(\?|&)nx=-?[\d]+/g,Se=/(\?|&)ny=-?[\d]+/g,Ue=function(a){return function(){for(var b=0;b<a.length;b++){var c=a[b],d=c.element.href,e=d.match(Oe);e?3==e.length&&(d=d.replace(Oe,e[1]+(parseInt(e[2],10)+1))):d+=(-1==d.indexOf("?")?"?":"&")+"nm=1";Te(c,d)}}},Ve=function(a){return function(){if(a.Re){var b="&clkt="+((new Date).getTime()-a.Re),c=a.element.href,c=c.replace(Pe,"");Te(a,c+b)}}},We=function(a){return function(b){a.Re= +(new Date).getTime();var c=ye(a.element),d=Math.round(b.clientX-c.x);b=Math.round(b.clientY-c.y);c=a.element.href;c=c.replace(Re,"");c=c.replace(Se,"");c=c+("&nx="+d)+("&ny="+b);Te(a,c)}},Xe=function(a,b,c){return-1==a.indexOf(b)&&1950>a.length+b.length&&(a+=b+encodeURIComponent(c),1950<a.length)?a.substring(0,1950):a},Ye=function(a,b){ce(a.element,function(){var c,d;try{c=Je(b),d=Ie(b,!1)}catch(f){}if(c&&d){var e=a.element.href,e=Xe(e,"&is=",[d,c].join("x"));Te(a,e)}})},Ze=function(a,b){this.wi= +b;this.element=a;this.Re=null},Te=function(a,b){var c=a.element;if(!(2E3<b.length)){for(var d=[],e=c.innerHTML,f=c.firstChild;f;f=f.nextSibling)d.push(f.cloneNode(!0));c.href=b;if(E&&c.innerHTML!=e)for(c.innerHTML="",e=0;e<d.length;e++)c.appendChild(d[e])}};Ze.prototype.Zd=function(){U(this.element,"mouseover",Ue([this]));U(this.element,"mousedown",We(this));U(this.element,"mouseup",Ve(this));var a=this.element.href,a=a.replace(Qe,""),a=a+this.wi;Te(this,a)}; +var $e=function(a,b,c,d){for(var e=0;e<a.length;e++){var f=a[e];f.Zd();Ye(f,c);if(void 0!=d.resultUrl){var g=d.resultUrl,g=void 0==g?document.location.href:g;if(""!=g){var h=f.element.href,h=Xe(h,"&res_url=",g);Te(f,h)}}void 0!=d.refererUrl&&(g=d.refererUrl,g=void 0==g?document.referrer:g,""!=g&&(h=f.element.href,h=Xe(h,"&rurl=",g),Te(f,h)))}0<a.length&&U(b,"mouseover",Ue(a))};if(window.IS_GOOGLE_AFS_IFRAME_){var af=function(a,b,c,d){this.bd=a;this.gc=b;this.ef=c;this.fa=d||xe};af.prototype.j=function(){return this.fa({content:this.bd.j(),url:this.gc.u,za:this.ef.za,A:this.ef.A,eb:this.ef.eb})};af.prototype.G=function(a){return this.bd.G(a)};af.prototype.M=function(a,b){this.bd.M&&this.bd.M(a,b)};var df=function(a,b){return a.ctc&&a.ctc.coa?new bf(F(a.tr.c),a.ctc.u,b.A,a.tr.rtl,b.f,a.ctc.ph,!!a.ctc.ht,a.ctc.d,void 0):new cf(F(a.tr.c),a.u,b.A,a.tr.rtl,b.f,void 0)},gf=function(a, +b){var c=F(a.l1r&&a.l1r.c?a.l1r.c:""),d=F(a.l2r&&a.l2r.c?a.l2r.c:""),e=a.l1r&&a.l1r.rtl?a.l1r.rtl:!1;return b.xi&&!b.za?new ef(c,d,e,b.f,a.u,b.A,void 0):new ff(c,d,e,b.f,void 0)},jf=function(a,b){var c=a.ctd&&a.ctd.as?a.ctd.as:F(a.v);return new hf(c,a.u,b.A,b.f,void 0)},cf=function(a,b,c,d,e,f){this.F=R();this.wf=a;this.va=b;this.W=c;this.Le=d;this.I=e;this.D=f||qe};cf.prototype.j=function(){return this.D({uid:this.F,text:{c:this.wf,rtl:this.Le},url:this.va,A:this.W,f:this.I})};cf.prototype.G=function(a){return[new Ze(T(a, +this.F),"&nb=0")]};var bf=function(a,b,c,d,e,f,g,h,l){this.F=R();this.wf=a;this.va=b;this.W=c;this.Le=d;this.I=e;this.Ic=f;this.$i=g;this.Ji=h||"";this.D=l||re};bf.prototype.j=function(){return this.D({uid:this.F,text:{c:this.wf,rtl:this.Le},Hd:this.Ic,mg:this.Ji,url:this.va,A:this.W,f:this.I,Zi:this.$i})};bf.prototype.G=function(a){return[new Ze(T(a,this.F),"&nb=0")]};var hf=function(a,b,c,d,e){this.F=R();this.R=a;this.va=b;this.W=c;this.I=d;this.D=e||se};hf.prototype.j=function(){return this.D({uid:this.F, +text:this.R,url:this.va,A:this.W,f:this.I})};hf.prototype.G=function(a){return[new Ze(T(a,this.F),"&nb=1")]};var ff=function(a,b,c,d,e){this.tf=a;this.uf=b;this.Je=c;this.I=d;this.D=e||te};ff.prototype.j=function(){return this.D({wh:{c:this.tf,rtl:this.Je},xh:{c:this.uf},f:this.I})};ff.prototype.G=function(){return[]};var ef=function(a,b,c,d,e,f,g){this.F=R();this.tf=a;this.uf=b;this.Je=c;this.I=d;this.va=e;this.W=f;this.D=g||ue};ef.prototype.j=function(){return this.D({wh:{c:this.tf,rtl:this.Je}, +xh:{c:this.uf},f:this.I,uid:this.F,url:this.va,A:this.W})};ef.prototype.G=function(a){return[new Ze(T(a,this.F),"&nb=7")]}};var kf=function(a){var b="";if(a.Jc){for(var b=b+('<div class="buttonsWrapper" id="'+M(a.uid)+'">'),c=a.Jc,d=c.length,e=0;e<d;e++)var f=c[e],b=b+('<div style="width: '+M(P(Math.floor(1/a.Jc.length*100)))+'%;" class="inlineButton'+(0==e?" firstButton":"")+'">'+G(f)+"</div>");b+="</div>"}return F(b)},lf=function(a){var b=F;if("jfkButton"==a.Y){var c=a.ij,d=a.text;a=F(K(Sd({href:a.url,A:a.A,qa:"grayJfkButton",content:I((c?'<img class="buttonImage jfkButtonImage" src="'+M(Ld(c))+'" height="18" width="18"/>': +"")+'<span class="jfkButtonText">'+G(d)+"</span>")})))}else a='<div class="button" id="'+M(a.uid)+'"><div class="buttonImageWrapper"'+(a.Y?'style="margin-top:0"':"")+'><a href="'+M(O(a.url))+'" '+Fd(me(a))+">"+("svgIconCtc"==a.Y?a.f?'<svg xmlns="http://www.w3.org/2000/svg" class="svgButton" viewBox="15 -15 48 48"><path fill="none" d="M63,33H15v-48h48V33z"/><path d="M45.4,2.2c-0.5-0.6-0.7-1.3-0.5-2C45.6-2.1,46-4.5,46-7c0-1.1,0.9-2,2-2h7c1.1,0,2,0.9,2,2c0,18.8-15.2,34-34,34 c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2c2.5,0,4.9-0.4,7.1-1.1c0.7-0.2,1.5-0.1,2,0.5l4.4,4.4c5.7-2.9,10.3-7.5,13.2-13.2L45.4,2.2z"/></svg>': +'<svg xmlns="http://www.w3.org/2000/svg" class="svgButton" viewBox="0 0 48 48"><path d="M0 0h48v48h-48z" fill="none"/><path d="M13.25 21.59c2.88 5.66 7.51 10.29 13.18 13.17l4.4-4.41c.55-.55 1.34-.71 2.03-.49 2.24.74 4.65 1.14 7.14 1.14 1.11 0 2 .89 2 2v7c0 1.11-.89 2-2 2-18.78 0-34-15.22-34-34 0-1.11.9-2 2-2h7c1.11 0 2 .89 2 2 0 2.49.4 4.9 1.14 7.14.22.69.06 1.48-.49 2.03l-4.4 4.42z"/></svg>':"svgIconCtd"==a.Y?'<svg xmlns="http://www.w3.org/2000/svg" class="svgButton" viewBox="0 0 48 48"><path d="M38 18h-8V6H18v12h-8l14 14 14-14zM10 36v4h28v-4H10z"/><path d="M0 0h48v48H0z" fill="none"/></svg>': +a.zg?'<img class="buttonImage" src="'+M(Ld(a.zg))+'" width="28" height="28">':"")+'</a></div><div class="buttonTextWrapper"><a href="'+M(O(a.url))+'" class="buttonText'+("svgIconCtc"==a.Y||"svgIconCtd"==a.Y?" svgButtonText":"")+'"'+Fd(me(a))+">"+G(a.text)+"</a></div></div>";return b(a)};var mf=function(a){var b=a.rb?"right":"left";a=""+('<div style="overflow: hidden;"><div style="float: '+M(P(b))+"; width: "+M(P(a.Z+"px"))+';">'+G(a.Da)+'</div><div style="margin-'+M(P(b))+": "+M(P(a.Z+a.ga+"px"))+';">'+G(a.Ea)+"</div></div>");return F(a)},nf=function(a){var b=a.rb?"right":"left";return a=""+('<div style="overflow: hidden;"><div style="float: '+Q(b)+"; width: "+Q(a.Z+"px")+';">'+Q(a.Da)+'</div><div style="margin-'+Q(b)+": "+Q(a.Z+a.ga+"px")+';">'+Q(a.Ea)+"</div></div>")},of=function(a){var b= +a.f?"right":"left";a=""+('<table style="border-collapse: collapse; border-spacing: 0; width: 100%; table-layout: fixed;"><tr><td style="vertical-align: middle; padding-'+M(P(a.f?"left":"right"))+": "+M(P(a.ga))+'px;">'+G(a.Ea)+'</td><td style="width: '+M(P(a.Z))+"px; vertical-align: "+M(P(a.Li))+";"+(a.borderColor?"border-"+M(P(b))+": 1px solid "+M(P(a.borderColor)):"")+'">'+G(a.Da)+"</td></tr></table>");return F(a)};if(window.IS_GOOGLE_AFS_IFRAME_){var pf=function(a,b,c,d,e,f,g,h){this.F=R();this.va=a;this.aj=b;this.jj=c;this.Cb=d;this.ui=e;this.I=f;this.W=g;this.D=h||lf};pf.prototype.j=function(){return this.D({uid:this.F,url:this.va,zg:this.aj,ij:this.jj,text:this.Cb,Y:this.ui,f:this.I,A:this.W})};var qf=function(a,b,c,d,e){"svgIcon"==c&&(c=Ne()?c+"Ctc":"pngIcon");return new pf(a,(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com/images/afs/mobile/button_ctc.png",(window._googCsaAlwaysHttps?"https:": +"")+"//www.google.com/images/afs/mobile/gray_phone_icon.png",b,c,d,e,void 0)},rf=function(a,b,c,d,e){"svgIcon"==c&&(c=Ne()?c+"Ctd":"pngIcon");return new pf(a,(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com/images/afs/mobile/"+(c?"ctd_get_app.png":"ctd-dl-icon.png"),"",b,c,e,d,void 0)},sf=function(a,b){var c=[];a.ctc&&c.push(qf(a.ctc.u,a.ctc.bt,b.Y,b.f,b.A));a.ctd&&c.push(rf(a.u,a.ctd.ps,b.Y,b.f,b.A));!(1<=c.length)||b.Y||a.ctc&&a.ctc.coa||a.ctd||c.push(new pf(a.u,(window._googCsaAlwaysHttps? +"https:":"")+"//www.google.com/images/afs/mobile/button_visit_site.png","",b.xk,"",b.f,b.A,void 0));return c},tf=function(a,b,c,d){this.Nc=a;this.jc=b;this.o=c;this.D=d||of};tf.prototype.j=function(){var a={Da:this.jc.j(),Ea:this.Nc.j(),Z:this.o.ac?60:78,Li:"jfkButton"==this.o.Y?"top":"middle",ga:12,borderColor:"jfkButton"==this.o.Y||this.o.ac?"":"#DDDDDD",f:this.o.f};return this.D(a)};tf.prototype.M=function(a,b){this.Nc.M&&this.Nc.M(a,b);this.jc.M&&this.jc.M(a,b)};tf.prototype.G=function(a){var b= +[];this.Nc.G&&(b=b.concat(this.Nc.G(a)));this.jc.G&&(b=b.concat(this.jc.G(a)));return b};var uf=function(a,b,c){b=sf(b,c);return 1==b.length?new tf(a,b[0],c,void 0):a},vf=function(a,b){var c=sf(a,b);return 1<c.length?new Ee(c,kf):S}};var wf=function(a,b,c){return function(){300<=a.innerWidth?(T(a.document,b).style.display="block",T(a.document,c).style.display="none"):(T(a.document,b).style.display="none",T(a.document,c).style.display="block")}},xf=function(a,b,c,d){var e=Je(b),f=be(b);f.style.overflow="hidden";f.style.position="relative";c||(f.style.height="0px",Yd(b,"collapsed"),d&&Yd(d,"collapsed"));var g=a.document.getElementById("adBlock"),h=function(a){var b=2*(a-.5),c=a/.8;.5>a?b=0:.8<a&&(c=1);a=g?g.offsetHeight:null;f.style.height= +c*e+"px";g&&a&&g.offsetHeight>a&&(.2>=c&&(g.style.paddingBottom="3px"),.95<=c?g.style.paddingBottom="1px":.85<=c&&(g.style.paddingBottom="2px"));g&&1==c&&(g.style.paddingBottom="");if(window.onresize)window.onresize();f.style.opacity=b},l=function(a){var b=2*(.5-a);.5<a&&(b=0);var c=(1-a)/.8;.2>a&&(c=1);f.style.height=e*c+"px";f.style.opacity=b;if(window.onresize)window.onresize()},r=new ke(350);return function(){r.$a||(Wd(b,"collapsed")?(r.Gb=h,Xd(b,"collapsed"),d&&Xd(d,"collapsed")):(r.Gb=l,Yd(b, +"collapsed"),d&&Yd(d,"collapsed")),le(r))}};var Af=function(a){return F('<div id="'+M(a.Eb)+'" style="display:'+M(P(a.Lc?"none":"block"))+';"><div>'+G(a.Ka)+"</div>"+yf({content:I('<div class="ctd-td-cr">'+(!a.J||!a.O||a.$&&a.V?"":zf({J:a.J,O:a.O,xd:!0}))+G(a.La)+'<div class="ctd-text" id="'+M(a.oc)+'">'+G(a.Ad)+"</div></div>"),f:a.f,$:a.$,V:a.V,sa:a.sa,ra:a.ra,Z:a.$&&a.V?45:0,ga:0,rb:a.f,J:a.J,O:a.O})+"</div>")},Bf=function(a){return F('<div id="'+M(a.Eb)+'" style="display:'+M(P(a.Lc?"none":"block"))+';"><div>'+G(a.Ka)+"</div>"+yf({content:I('<div class="ctd-td-cr">'+ +(!a.J||!a.O||a.$&&a.V?"":zf({J:a.J,O:a.O,xd:!0}))+'<div class="ctd-text" id="'+M(a.oc)+'">'+G(a.La)+"</div></div>"),f:a.f,$:a.$,V:a.V,sa:a.sa,ra:a.ra,Z:a.$&&a.V?45:0,ga:0,rb:a.f,J:a.J,O:a.O})+"</div>")},Cf=function(a){return F("<div>"+(a.$&&a.V?'<a class="ctd-i-mini" href="'+M(O(a.sa))+'"><img class="ctd-ico'+(a.ra?" rc-mini":"")+'" style="'+M(P(a.V))+': inherit; vertical-align: text-bottom;" src="'+M(Ld(a.$))+'"></a>':"")+G(a.nj)+(a.J&&a.O?" "+zf({J:a.J,O:a.O,xd:!0}):"")+G(a.oj)+"</div>")},yf=function(a){return F(K(mf({Da:I(""+ +(a.$&&a.V?'<div class="ctd-itd"><a class="ctd-il" href="'+M(O(a.sa))+'"><span class="ctd-ico-s"></span><img class="ctd-ico'+(a.ra?" rc":"")+'" '+Fd(a.V)+'="45" src="'+M(Ld(a.$))+'" alt></a>'+(a.J&&a.O?zf({J:a.J,O:a.O,xd:!1}):"")+"</div>":"")),Ea:I(""+G(a.content)),Z:a.Z,ga:a.ga,rb:a.f})))},zf=function(a){return F('<div class="ctd-rate"><div class="ctd-rate-bg"><div class="ctd-rate-fg" style="width: '+M(P(a.J/5*100))+'%;"></div></div><div class="ctd-rate-txt'+(a.xd?" inline":"")+'">(<span class="ctd-usr-ico"></span>'+ +G(a.O)+")</div></div>")};var Df=function(a){return F('<img class="adIcon" src="'+M(Ld(a.ya))+'"/>')},Ef=function(a){return F('<iframe class="adIcon" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowTransparency="true" sandbox="" src="'+M(O(a.ya))+'"></iframe>')};if(window.IS_GOOGLE_AFS_IFRAME_){var Gf=function(a){return a.adIconUrl&&"title-right"==a.adIconLocation?new Ff(a.adIconUrl,a.img?Df:Ef):S},Ff=function(a,b){this.ek=a;this.D=b};Ff.prototype.j=function(){return this.D({ya:this.ek})}};var Hf=function(a){return F((a.Ng?F('<span class="aa_"> </span>'):"")+'<div class="ba_"><span class="z_">'+K(pe({text:a.Hd,f:a.f}))+"</span></div>")};if(window.IS_GOOGLE_AFS_IFRAME_){var If=function(a,b,c){this.Ic=a;this.I=b;this.D=c||Hf};If.prototype.j=function(){return this.D({Hd:this.Ic,f:this.I,Ng:!0})}};var Kf=function(a){return""+Jf({text:a.text.c,Ia:a.text.rtl,f:a.f})},Jf=function(a){return'<span dir="'+(a.Ia?"rtl":"ltr")+'">'+Q(a.text)+"</span>"+(a.f?"‏":"‎")};var Lf=function(a){return F(a.Ne?"<div class='location'>"+K(pe({text:a.Ne,f:a.f}))+"</div>":"")};if(window.IS_GOOGLE_AFS_IFRAME_){var Mf=function(a,b,c){this.F=R();this.Cb=a;this.I=b;this.D=c||Lf};Mf.prototype.j=function(){return this.D({uid:this.F,Ne:this.Cb,f:this.I})};var Nf=function(a,b){return a.location?new Mf(a.location,b.f):S}};if(window.IS_GOOGLE_AFS_IFRAME_){var Pf=function(a,b,c,d){this.F=R();this.xa=a;this.Ce=b;this.zk=c;this.D=d||Of};Pf.prototype.j=function(){return this.D({uid:this.F,Gd:this.xa,tb:this.Ce,Hh:this.zk})};var Qf=function(a,b){var c=a.gt&&"oh"==a.gt.r&&a.gt.t?a.gt.t:null;return a.oh&&0<a.oh.length||c?new Pf(a.oh,c,b.yj):S}};var Rf=function(a){var b="";if(a.$e){for(var b=b+"<div class='plus-ones'>",c=a.$e,d=c.length,e=0;e<d;e++)var f=c[e],b=b+("TARGET"==f?K(F('target="'+(a.A?"_blank":"_top")+'"')):G(f));b+="</div>"}return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var Sf=function(a,b,c,d){this.F=R();this.jk=a;this.W=b;this.I=c;this.D=d||Rf};Sf.prototype.j=function(){return this.D({uid:this.F,$e:this.jk,A:this.W,f:this.I})};var Uf=function(a,b){return a.plus_ones?new Sf(Tf(a),b.A,b.f):S},Tf=function(a){var b=[];if(a.plus_ones)for(var c=0,d=a.plus_ones.length;c<d;c++)b.push(F(a.plus_ones[c]));return b}};var Wf=function(a){return F(a.Mc?Vf({J:a.Mc.r,wk:!0})+'<span class="sr-p"> </span><span class="sr-gt"> ('+K(Sd({href:a.Mc.u,content:Math.round(10*a.Mc.r)/10,A:a.A,qa:"sr-gt sr-gl"}))+")</span>":"")},Xf=function(a){for(var b='<div class="sr-div">',c=a.ik,d=c.length,e=0;e<d;e++)var f=c[e],b=b+("RATING"==f?Vf({J:a.r})+'<span class="sr-p"> </span>':"LINK_START"==f?'<a href="'+M(O(a.vk))+'" class="sr-rl"'+Fd(me(a))+">":"LINK_END"==f?"</a>":"NUM_START"==f?'<span class="sr-number">':"NUM_END"== +f?"</span> ":K(pe({text:f,f:a.f})));return F(b+"</div>")},Vf=function(a){return F('<div class="sr-nsc"><img src="//www.google.com/images/sr-star-off.png" class="sr-star"/><img src="//www.google.com/images/sr-star-on'+(a.wk?"-gray":"")+'.png" class="sr-star" style="clip: rect(0px, '+M(P(13.2*a.J))+'px, 13px, 0px);"/></div>')};if(window.IS_GOOGLE_AFS_IFRAME_){var Yf=function(a,b,c,d,e,f){this.F=R();this.Cb=a;this.W=b;this.Pa=c;this.va=d;this.I=e;this.D=f||Xf};Yf.prototype.j=function(){return this.D({uid:this.F,ik:this.Cb,A:this.W,r:this.Pa,vk:this.va,f:this.I})};var Zf=function(a,b){if(a.ctd&&a.ctd.r&&a.ctd.nr&&b.ac){var c=a.ctd.r;return new Yf(["NUM_START",c,"NUM_END","RATING"," ","("+a.ctd.nr+")"],!1,c,"",b.f)}return a.sr&&a.sr.nt&&a.sr.r&&a.sr.u?new Yf(a.sr.nt,b.A,a.sr.r,a.sr.u,b.f):S}};var ag=function(a){var b="";if(a.qf&&0<a.qf.length){for(var b=b+('<table class="sl-table" cellspacing="0" cellpadding="0" id="'+M(a.uid)+'"><tbody><tr><td>'),c=a.qf,d=c.length,e=0;e<d;e++)b+=$f({position:"left",Od:c[e],A:a.A,f:a.f});b+="</td><td>";c=a.ck;d=c.length;for(e=0;e<d;e++)b+=$f({position:"right",Od:c[e],A:a.A,f:a.f});b+="</td></tr></tbody></table>";if(a.Te&&a.na&&0<a.na.length){b+='<div class="g_">';c=a.na;d=c.length;for(e=0;e<d;e++)b+=$f({position:"left",Od:c[e],A:a.A,f:a.f});b+="</div>"}}return F(b)}, +$f=function(a){return F("<div class='sl-"+M(a.position)+"'><a href=\""+M(O(a.Od.u))+'" class="sl" '+Fd(me(a))+">"+K(pe({text:a.Od.t,f:a.f}))+"</a></div>")},bg=function(a){for(var b='<ul class="sitelinks">',c=a.na,d=c.length,e=0;e<d;e++)var f=c[e],b=b+('<li class="'+(2==a.ig?"twoColSitelink ":"")+M(a.pf)+'"><div class="sitelink-spacer'+(1==e?" dc_":"")+'"><div class="sitelink-nowrap" style="direction: '+(0>Nd(f.t)?"rtl":"ltr")+';"><a href="'+M(O(f.u))+'" class="'+M(a.pf)+'" '+Fd(me(a))+">"+G(f.t)+ +"</a></div></div></li>");return F(b+"</ul>")},cg=function(a){return F('<div class="sitelinksWrapper_js '+M(a.Ih)+'" '+(a.uid?' id="'+M(a.uid)+'" ':"")+'><div class="wideSitelinksWrapper_js">'+bg({na:a.na,A:a.A,ig:2,pf:a.qh})+'</div><div class="narrowSitelinksWrapper_js" style="display: none;">'+bg({na:a.na.slice(0,3),A:a.A,ig:1,pf:a.nh})+"</div></div>")},dg=function(a){return F('<div class="cc_">'+cg({uid:a.uid,na:a.na,A:a.A,qh:"sitelinksTruncatedWide",nh:"sitelinksTruncatedNarrow",Ih:"nonSfblSitelinksWrapper"})+ +"</div>")};if(window.IS_GOOGLE_AFS_IFRAME_){var eg=function(a,b,c,d,e){this.F=R();this.$b=a;this.W=b;this.Qj=c;this.I=d;this.D=e||ag};eg.prototype.j=function(){for(var a=[],b=[],c=0;c<this.$b.length;c++)0==c%2?a.push(this.$b[c]):b.push(this.$b[c]);return this.D({uid:this.F,na:this.$b,qf:a,ck:b,A:this.W,Te:this.Qj,f:this.I})};eg.prototype.G=function(a){return fg(a,this.F)};var fg=function(a,b){for(var c=[],d=T(a,b).getElementsByTagName("a"),e=0,f;f=d[e];e++)c.push(new Ze(f,"&nb=6"));return c},hg=function(a,b){return a.sls&& +0<a.sls.length?b.bk?new gg(a.sls,b.A):new eg(a.sls,b.A,b.Te,b.f):S},gg=function(a,b,c){this.F=R();this.$b=a;this.W=b;this.D=c||dg};gg.prototype.j=function(){return this.D({uid:this.F,na:this.$b,A:this.W})};gg.prototype.G=function(a){return fg(a,this.F)}};var ig=function(a){var b="";if(a.be){for(var b=b+'<div class="r_ p_">',c=a.be,d=c.length,e=0;e<d;e++)b+=(0!=e?" ":"")+'<span class="y_">'+(0!=e?"· ":"")+K(pe({text:c[e],f:a.f}))+"</span>";b+="</div>"}return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var jg=function(a,b,c){this.vi=a;this.I=b;this.D=c||ig};jg.prototype.j=function(){return this.D({be:this.vi,f:this.I})};var kg=function(a,b){return a.cos&&0<a.cos.length?new jg(a.cos,b.f):S}};var lg=function(a,b){if(!a)return!1;if(3==a.nodeType&&a.nodeValue&&(b&&(a.nodeValue+=" ..."),4<a.nodeValue.length)){var c=a.nodeValue,d=a.nodeValue.length-1;c.length>d&&(c=c.substring(0,d-3)+"...");a.nodeValue=c;return!1}c=a.textContent||a.innerText;if(!c||c.length<=(b?0:4))return a.parentNode.removeChild(a),!0;for(c=lg(a.lastChild,b);c;)c=lg(a.lastChild,c);return!1},mg=function(a,b){if(!(0>=b)){for(var c=a.innerHTML.length;0<c&&a.offsetHeight>b;c--)for(var d=a,e=lg(d.lastChild,!1);e;)e=lg(d.lastChild, +e);a.offsetHeight>b&&(a.innerHTML="")}},ng=function(a,b){var c=a.style.whiteSpace,d=a.style.wordWrap;a.style.whiteSpace="nowrap";a.style.wordWrap="normal";var e=a.offsetHeight;a.style.whiteSpace=c;a.style.wordWrap=d;mg(a,e*b+b)},og=function(a,b,c,d,e){var f=a.offsetHeight;if(!(f<=b)){var g=be(a);a=be(g);g.style.overflow="hidden";g.style.position="relative";var h=document.createElement("div");try{h.style.backgroundImage="linear-gradient(to bottom, rgba(255,255,255,0), #ffffff)"}catch(L){}h.style.height= +"30px";h.style.position="absolute";h.style.bottom=0;h.style.width="100%";h.style.pointerEvents="none";g.appendChild(h);var l=document.createElement("div");l.innerHTML=c;l.className="expander";l.style.textAlign="center";l.style.color=e;l.style.cursor="pointer";l.style.fontSize="11px";a.appendChild(l);var r=b-l.offsetHeight;g.style.height=r+"px";var u=f-r,y=document.getElementById("adBlock"),C=function(a){var b=y?y.offsetHeight:null;g.style.height=r+a*u+"px";.8<=a&&(l.innerHTML=d,h.style.background= +"");y&&b&&y.offsetHeight>b&&(y&&.2>=a&&(y.style.paddingBottom="4px"),y&&.98<=a?y.style.paddingBottom="1px":y&&.97<=a?y.style.paddingBottom="2px":y&&.96<=a&&(y.style.paddingBottom="3px"));y&&1==a&&(y.style.paddingBottom="");if(window.onresize)window.onresize()},H=function(a){g.style.height=f-a*u+"px";if(.2>=a)try{h.style.backgroundImage="linear-gradient(to bottom, rgba(255,255,255,0), #ffffff)"}catch(b){}.8<=a&&(l.innerHTML=c);if(window.onresize)window.onresize()},J=new ke(400);U(l,"click",function(){J.$a|| +l.innerHTML!=c?J.$a||(J.Gb=H,le(J)):(J.Gb=C,le(J))})}};if(window.IS_GOOGLE_AFS_IFRAME_){var pg=function(a,b,c){ng(T(a.document,b),2);U(a,"resize",function(){var d=T(a.document,b);d.innerHTML=c;ng(d,2)})},qg=function(a,b,c,d,e,f,g,h,l,r,u,y,C,H){this.F=R();this.P=a;this.T=b;this.ob=R();this.R=c;this.zc=d;this.vb=e;this.oa=f;this.vc=g;this.Dc=h;this.Cc=l;this.Ac=r;this.Pa=u;this.zb=y;this.I=C;this.fa=H||Af;this.Fb=R();this.Ca=R()};qg.prototype.j=function(){var a=Be({elements:[this.oa.j(),this.R.j()]}),b=Be({elements:[this.P.j(),this.vb.j()]}),c=this.zc? +a:this.T.j(),d=this.zc?this.T.j():a,a=this.fa({Ka:b,La:c,Ad:d,Eb:this.F,oc:this.ob,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb,Lc:!1,f:this.I}),b=this.fa({Ka:b,La:c,Ad:d,Eb:this.Fb,oc:this.Ca,J:this.Pa,O:this.zb,Lc:!0,f:this.I});return Be({elements:[a,b]})};qg.prototype.M=function(a){var b=T(a.document,this.ob).innerHTML;pg(a,this.ob,b);this.Ca&&(b=T(a.document,this.Ca).innerHTML,pg(a,this.Ca,b));this.Fb&&U(a,"resize",wf(a,this.F,this.Fb))};qg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))}; +var rg=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.F=R();this.P=a;this.T=b;this.ob=R();this.R=c;this.vb=d;this.oa=e;this.vc=f;this.Dc=g;this.Cc=h;this.Ac=l;this.Pa=r;this.zb=u;this.I=y;this.fa=C||Bf;this.Fb=R();this.Ca=R()};rg.prototype.j=function(){var a=Be({elements:[this.P.j(),this.vb.j()]}),b=Be({elements:[this.oa.j()," ",this.R.j()," ",this.T.j()]}),c=this.fa({Ka:a,La:b,Eb:this.F,oc:this.ob,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb,Lc:!1,f:this.I}),a=this.fa({Ka:a,La:b,Eb:this.Fb, +oc:this.Ca,J:this.Pa,O:this.zb,Lc:!0,f:this.I});return Be({elements:[c,a]})};rg.prototype.M=function(a){var b=T(a.document,this.ob).innerHTML;pg(a,this.ob,b);this.Ca&&(b=T(a.document,this.Ca).innerHTML,pg(a,this.Ca,b));this.Fb&&U(a,"resize",wf(a,this.F,this.Fb))};rg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))};var sg=function(a,b,c,d,e,f,g,h,l,r,u){this.P=a;this.T=b;this.R=c;this.oa=d;this.vc=e;this.Dc=f;this.Cc=g;this.Ac=h;this.Pa=l;this.zb=r;this.fa=u||Cf};sg.prototype.j=function(){var a= +Be({elements:[this.oa.j()," ",this.P.j()," "]}),b=Be({elements:[" ",this.T.j()," ",this.R.j()]});return this.fa({nj:a,oj:b,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb})};sg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))}};if(window.IS_GOOGLE_AFS_IFRAME_){var yg=function(a,b,c,d,e){this.F=R();this.gc=a;this.caps_=b;this.o=c;this.D=e||tg;d=[];c.Y&&1!=c.eb&&(e=df(a,c),e=new Ee([e,Gf(a)]),d.push(new af(e,a,c)));e=c.Y&&1!=c.eb?S:df(a,c);var f=c.Y&&1!=c.eb?S:Gf(a),g=jf(a,c),h=gf(a,c);if(a.ctd){var l=a.ctd.iu;if(l)var r=a.ctd.ih>a.ctd.iw?"height":"width",u=a.u,y=a.ctd.ir;else y=u=r=void 0;var C=a.ctd.r,H=a.ctd.nr;switch(c.eb){case 1:e=new sg(e,h,g,c.yb,l,r,u,y,C,H);break;case 2:e=new rg(e,h,g,f,c.yb,l,r,u,y,C,H,c.f);break; +default:e=new qg(e,h,g,c.me,f,c.yb,l,r,u,y,C,H,c.f)}}else switch(c.eb){case 1:e=new ug(e,h,g,c.yb);break;case 2:e=new vg(e,h,g,f,c.yb);break;default:e=new wg(e,h,g,a.pn?new If(a.pn,c.f):S,c.me,f,c.yb)}e=new af(e,a,c);b=xg(a,b,c);c.Y?(b=new Ee([e].concat(b)),d.push(uf(b,a,c))):(d.push(uf(e,a,c)),d=d.concat(b));this.$c=new Ee(d);this.Wf=R()};yg.prototype.j=function(){var a={uid:this.F,B:this.gc,A:this.o.A,fi:this.$c.j(),Jb:this.o.za||this.o.Jb,Vf:this.Wf,kk:null,jh:null};return this.D(a)};yg.prototype.M= +function(a,b){var c=this.$c.G(a.document),d=document.getElementById(this.Wf);d&&c.push(new Ze(d,"&nb=18"));for(d=T(a.document,this.F);null!=d&&!Wd(d,"a_");)d=d.parentElement;d&&$e(c,d,T(a.document,"adBlock"),b);this.$c.M&&this.$c.M(a,b)};var wg=function(a,b,c,d,e,f,g,h){this.P=a;this.T=b;this.R=c;this.Ic=d;this.zc=e;this.vb=f;this.oa=g;this.fa=h||ve};wg.prototype.j=function(){var a=Be({elements:[this.oa.j(),this.R.j(),this.Ic.j()]});return this.fa({Ka:Be({elements:[this.P.j(),this.vb.j()]}),La:this.zc? +a:this.T.j(),Ad:this.zc?this.T.j():a})};wg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))};var vg=function(a,b,c,d,e,f){this.P=a;this.T=b;this.R=c;this.vb=d;this.oa=e;this.fa=f||we};vg.prototype.j=function(){var a=Be({elements:[this.P.j(),this.vb.j()]}),b=Be({elements:[this.oa.j(),this.R.j(),this.T.j()]});return this.fa({Ka:a,La:b})};vg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))};var ug=function(a,b,c,d){this.P=a;this.T=b; +this.R=c;this.oa=d};ug.prototype.j=function(){return Be({elements:[this.oa.j(),this.P.j(),this.T.j(),F("<wbr>"),this.R.j()]})};ug.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))}};var zg=function(a,b,c,d,e){this.gg=a;this.tg=b;this.hh=c;this.Oj=d;this.Nj=e||""};zg.prototype.$j=function(a){var b=new $a("https:"+Ka()+"/afs/gen_204");n(b,"client",this.gg);n(b,"zx",this.tg());n(b,"aqid",this.Nj);n(b,"action",a);this.hh(ab(b))};var Ag={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400", +darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc", +ghostwhite:"#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",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a", +lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1", +moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57", +seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};var Fg=function(a){var b={};a=String(a);var c="#"==a.charAt(0)?a:"#"+a;if(Bg.test(c))return b.ud=Cg(c),b.type="hex",b;a:{var d=a.match(Dg);if(d){var c=Number(d[1]),e=Number(d[2]),d=Number(d[3]);if(0<=c&&255>=c&&0<=e&&255>=e&&0<=d&&255>=d){c=[c,e,d];break a}}c=[]}if(c.length)return b.ud=Eg(c[0],c[1],c[2]),b.type="rgb",b;if(Ag&&(c=Ag[a.toLowerCase()]))return b.ud=c,b.type="named",b;throw Error(a+" is not a valid color string");},Gg=/#(.)(.)(.)/,Cg=function(a){if(!Bg.test(a))throw Error("'"+a+"' is not a valid hex color"); +4==a.length&&(a=a.replace(Gg,"#$1$1$2$2$3$3"));return a.toLowerCase()},Eg=function(a,b,c){a=Number(a);b=Number(b);c=Number(c);if(isNaN(a)||0>a||255<a||isNaN(b)||0>b||255<b||isNaN(c)||0>c||255<c)throw Error('"('+a+","+b+","+c+'") is not a valid RGB color');a=Hg(a.toString(16));b=Hg(b.toString(16));c=Hg(c.toString(16));return"#"+a+b+c},Bg=/^#(?:[0-9a-f]{3}){1,2}$/i,Dg=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i,Hg=function(a){return 1==a.length?"0"+a:a},Kg=function(a,b){for(var c= +[],d=0;d<b.length;d++)c.push({color:b[d],lg:Math.abs(Ig(b[d])-Ig(a))+Jg(b[d],a)});c.sort(function(a,b){return b.lg-a.lg});return c[0].color},Ig=function(a){return Math.round((299*a[0]+587*a[1]+114*a[2])/1E3)},Jg=function(a,b){return Math.abs(a[0]-b[0])+Math.abs(a[1]-b[1])+Math.abs(a[2]-b[2])};var Lg=function(a){this.Yf=a};Lg.prototype.ka=function(){var a="A CSS color";this.Yf&&(a+=" including 'transparent'");return a};Lg.prototype.X=function(a){if(this.Yf&&da(a)&&"transparent"==a.toLowerCase())return"transparent";try{return Fg(""+a).ud}catch(b){return null}};Lg.prototype.ja=Ac;var V=new Lg(!1);var Mg=function(a){var b="";a=a.Rj;for(var c=a.length,d=0;d<c;d++)b+='<div class="ad'+(0==d?" f":"")+(d==c-1?" l":"")+' a_">'+Q(a[d])+"</div>";return b};var Ng=function(a){return F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&a.B.img?(a.kc?'<a href="'+M(O(a.B.u))+'" '+Fd(me(a))+'id="'+M(a.Kg)+'">':"")+'<img class="adIcon" src="'+M(Ld(a.B.adIconUrl))+'"/>'+(a.kc?"</a>":""):"")},Og=function(a){return F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&!a.B.img?'<iframe class="adIcon" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowTransparency="true" sandbox="" src="'+M(O(a.B.adIconUrl))+'"></iframe>':"")};var Qg=function(a){var b=F,c='<div class="wb_" id="'+M(a.Eb)+'"><div class="xb_">',d;if(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&a.B.img&&a.B.adIconWidth){d=I(""+K(Ng({B:a.B,kc:a.Jb,A:a.A,Kg:a.Bk})));var e=I(""+Pg(a)),f=a.B.adIconSpacingAfter?a.B.adIconSpacingAfter:12,g=a.f?"right":"left";d=""+('<table style="border-collapse: collapse; border-spacing: 0; width: 100%; table-layout: fixed;"><tr><td style="width: '+M(P(a.B.adIconWidth))+"px; vertical-align: "+M(P("baseline"))+';">'+G(d)+'</td><td style="vertical-align: middle; padding-'+ +M(P(g))+": "+M(P(f))+'px;">'+G(e)+"</td></tr></table>");d=F(d);d=G(d)}else d=Pg(a);c=c+d+"</div>";d=a.expansion;d=F(d&&""!=d?'<div class="q_">'+G(d)+"</div>":"");return b(c+d+(a.ii?F('<div style="position: absolute; width: 20px; height: 20px; bottom: 0px; right: 0px;" class="zb_">'+(a.Fh?'<svg class="ac_" width="20" height="20" viewBox="0 0 41 41" xmlns="http://www.w3.org/2000/svg"><g sketch:type="MSLayerGroup" fill="none"><path d="M16.205 40.505c8.264-.004 13.546.073 17.743.06 1.705-.005 3.898.112 5.049-.944 1.543-1.637 1.405-2.956 1.417-4.645.075-10.863.187-24.306.125-34.811-3.306 3.346-6.694 6.285-10 9.632l-30.351 30.72s7.754-.008 16.018-.012z" opacity=".658" fill="#D5D5D5" sketch:type="MSShapeGroup"/><path d="M34.833 25.463l-6.495 6.495-6.495-6.495-2.005 2.005 8.5 8.5 8.5-8.5-2.005-2.005z" fill="#9B9B9B" sketch:type="MSShapeGroup"/></g></svg>': +'<div class="ac_" style="position: absolute; width: 20px; height: 20px; background-image: url(//www.google.com/images/afs/mobile/card_expansion_button.png); background-size: 200% 100%;"></div>')+'</div><div style="position: absolute; width: 20px; height: 20px; bottom: 0px; right: 0px;" class="zb_">'+(a.Fh?'<svg class="bc_" width="20" height="20" viewBox="0 0 41 41" xmlns="http://www.w3.org/2000/svg"><g sketch:type="MSLayerGroup" fill="none"><path d="M16.205 40.505c8.264-.004 13.546.073 17.743.06 1.705-.005 3.898.112 5.049-.944 1.543-1.637 1.405-2.956 1.417-4.645.075-10.863.187-24.306.125-34.811-3.306 3.346-6.694 6.285-10 9.632l-30.351 30.72s7.754-.008 16.018-.012z" opacity=".658" fill="#D5D5D5" sketch:type="MSShapeGroup"/><path d="M21.843 35.969l6.495-6.495 6.495 6.495 2.005-2.005-8.5-8.5-8.5 8.5 2.005 2.005z" fill="#9B9B9B" sketch:type="MSShapeGroup"/></g></svg>': +'<div class="bc_" style="position: absolute; width: 20px; height: 20px; background-image: url(//www.google.com/images/afs/mobile/card_expansion_button.png); background-size: 200% 100%; background-position: 20px 0px;"></div>')+"</div>"):"")+"</div>")},Pg=function(a){return F(G(a.li)+G(a.tk)+(a.Fg&&a.V?K(yf({content:a.eg,f:a.f,$:a.Fg,V:a.V,sa:a.sa,ra:a.ra,Z:45,ga:12,rb:a.f})):'<div class="yb_">'+G(a.eg)+"</div>"))};if(window.IS_GOOGLE_AFS_IFRAME_){var Rg=function(a,b,c,d){this.gc=a;this.F=R();this.lj=R();var e=df(a,c),e=new Ee([e,Gf(a)]);this.Ah=new af(e,a,c);var f=jf(a,c),g=Zf(a,c),e=gf(a,c),f=new Ee([f,g],Ce),e=c.me?new Ee([f,e]):new Ee([e,f]),e=new Ee([new af(e,a,c),kg(a,c)]);this.fg=uf(e,a,c);this.qg=new Ee(xg(a,b,c));this.gj=!c.xg;c.xg=!0;this.o=c;this.Wi=a.ctc||a.ctd;this.Mg="collapse"==c.ac;a.ctd&&(this.Di=a.ctd.iu,this.Fi=a.ctd.ih>a.ctd.iw?"height":"width",this.Ei=a.u,this.fj=a.ctd.ir);this.D=d||Qg}; +Rg.prototype.j=function(){var a={tk:this.Ah.j(),li:this.o.yb.j(),eg:this.fg.j(),expansion:this.qg.j(),Eb:this.F,f:this.o.f,Fg:this.Di,V:this.Fi,sa:this.Ei,ra:this.fj,B:this.gc,Jb:this.o.za||this.o.Jb,A:this.o.A,Vf:this.lj,ii:this.Mg,Fh:Ne()};return this.D(a)};Rg.prototype.M=function(a,b){this.Ah.M(a,b);this.fg.M(a,b);this.qg.M(a,b);var c=T(a.document,this.F),d=c.parentNode;this.Wi||Yd(c,"n_");var e=Zd(c,"a","e_");0<e.length&&ng(e[0],1);e=Zd(c,"span","descText");0<e.length&&ng(e[0],2);if(this.Mg){var e= +[],f=Zd(c,"div","sr-div");0<f.length&&e.push(f[0]);f=Zd(c,"div","p_");0<f.length&&e.push(f[0]);f=Zd(c,"div","q_");0<f.length&&e.push(f[0]);if(0<e.length)for(Yd(c,"o_"),f=0;f<e.length;f++){var g=xf(a,e[f],this.gj,0==f?c:null);U(d,"click",Sg(g,this.o))}c=ga(this.o.sg.$j,this.o.sg,"toggle");U(d,"click",Sg(c,this.o))}};var Sg=function(a,b){return function(c){if(c&&(c=c.target||c.srcElement)){3==c.nodeType&&(c=c.parentNode);a:{for(;c&&!Wd(c,"ad")&&!Wd(c,"cardAd");){if("a"==c.nodeName.toLowerCase()||"div"== +c.nodeName.toLowerCase()&&Wd(c,"adStd")&&b.za){c=!0;break a}c=c.parentNode}c=!1}c||a()}}}};if(window.IS_GOOGLE_AFS_IFRAME_){var Tg=function(a,b){this.dd=a;this.hk=b};Tg.prototype.j=function(){for(var a=[],b=0;b<this.dd.length;b++)a.push(this.dd[b].j());return this.hk({Rj:a})};Tg.prototype.M=function(a,b){for(var c=0;c<this.dd.length;c++)this.dd[c].M(a,b)}};var Ug=function(a){return""+(a.$d?'<span class="'+(a.ca?G(a.ca):"")+'" id="attribution">'+(a.gd?'<a href="'+G(a.gd)+'" target="_blank">':"")+G(a.$d)+(a.gd?"</a>":"")+"</span>":"")},Vg=function(a){return""+(a.Bc?'<span class="'+(a.ca?G(a.ca):"")+'" id="'+G(a.id)+'">'+Q(a.Bc)+"</span>":"")};var tg=function(a){var b=(a.jh?"":Og(a))+'<div class="b_ c_'+(a.B.rais&&0<a.B.rais.length?" raiDiv":"")+'" id="'+Q(a.uid)+'">'+(a.jh?"":Ng({B:a.B,kc:a.Jb,A:a.A,Kg:a.Vf}))+'<div class="adD'+(a.Gk?" nesWrapper":"")+(a.B.topad?" k_":"")+'">',c;c=a.kk?F('<a href="'+M(O(a.B.u))+'" class="thumbicon" style="background-image:url(\''+M(Ld(a.B.kodachrome.u))+"');\""+Fd(me(a))+"></a>"):"";return b+c+Q(a.fi)+"</div></div>"+F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&!a.B.img?'<div style="clear: both;"></div>': +"")};var Wg=function(a){return F(a.text?'<div class="t_">'+G(a.text)+"</div>":"")};var Xg=function(a){var b="";if(a.Kd&&0<a.Kd.length){for(var b=b+'<div class="apareviews">',c=a.Kd,d=c.length,e=0;e<d;e++)var f=c[e],f={text:f.t,source:f.s,rh:f.su,f:a.f},f=F(f.text?'<div class="apareview">'+K(pe(f))+" - "+(f.rh?'<a href="'+M(O(f.rh))+'" class="reviewlink"'+Fd(me({A:!0}))+">"+K(pe({text:f.source,f:f.f}))+"</a>":K(pe({text:f.source,f:f.f})))+"</div>":""),b=b+f;b+="</div>"}else a.tb&&(b+=K(Wg({text:a.tb})));return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var Yg=function(a,b,c,d){this.F=R();this.Tj=a;this.Ce=b;this.I=c;this.D=d||Xg};Yg.prototype.j=function(){return this.D({uid:this.F,Kd:this.Tj,tb:this.Ce,f:this.I})};var Zg=function(a,b){var c=a.gt&&"ar"==a.gt.r&&a.gt.t?a.gt.t:null;return a.ar&&0<a.ar.length||c?new Yg(a.ar,c,b.f):S}};var Of=function(a){var b="";if(a.Gd&&0<a.Gd.length){b+='<div class="u_">'+(a.Hh?'<img class="x_" src="//www.google.com/images/afs/offer_tag_light.png" />':"");a=a.Gd;for(var c=a.length,d=0;d<c;d++)b+='<span class="v_">'+(0!=d?"· ":"")+'<span class="w_">'+G(a[d].t)+"</span> </span>";b+="</div>"}else a.tb&&(b+=K(Wg({text:a.tb})));return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_)var xg=function(a,b,c){return b.isHighendMobile?c.ac?[Nf(a,c),hg(a,c)]:b.reviewUnderSellerRating?[kg(a,c),hg(a,c),Zf(a,c),Zg(a,c),Uf(a,c),Nf(a,c),Qf(a,c),vf(a,c)]:[kg(a,c),Zg(a,c),hg(a,c),Zf(a,c),Uf(a,c),Nf(a,c),Qf(a,c),vf(a,c)]:b.reviewUnderSellerRating?[kg(a,c),Uf(a,c),Nf(a,c),hg(a,c),Zf(a,c),Zg(a,c),Qf(a,c)]:[kg(a,c),Zg(a,c),Uf(a,c),Nf(a,c),hg(a,c),Zf(a,c),Qf(a,c)]},ch=function(a,b,c,d,e){var f=Rb(d),g=Sb(d),h=f("type")||"ads",l=a.linkColorSchemeVisUrlLinkColor|| +"#008000",r=a.linkColorSchemeTitleLinkColor||"#0000CC";a.isHighendMobile&&a.mobileUiFormat?(l="#006621",r="#1a0dab"):$g(d,a)&&(r=l="#4272db");var l=f("colorDomainLink",l),r=f("colorTitleLink",r),u=e.adBadgeColor||l,y="0.85em",C=f("fontSizeDomainLink");C&&(y=.85*C+"px");var H;H=(H=d.width)&&"auto"!=H?H:"100%";var J={Qb:!1,Ud:null,ae:null};if(d.verticalSpacing){var L=d.verticalSpacing/2;J.Qb=!0;J.Ud=Math.floor(L);J.ae=Math.ceil(L)}var L=(L=f("colorAdSeparator"))?L:a.isHighendMobile||a.isTablet?"#E6E6E6": +null,ua=f("colorAdBackground"),ka=f("colorAdBorder"),la=f("colorText"),qa=f("colorBackground"),eb=f("colorBorder"),sb=f("colorAttribution"),fb=f("colorPlusOnes"),qk=f("colorKeyword"),rk=f("colorLocation"),sk=f("colorAnnotation"),Qa;Qa=[[0,0,0],[255,255,255]];if(l){var Sc;Sc=Cg(l);Qa=Kg([parseInt(Sc.substr(1,2),16),parseInt(Sc.substr(3,2),16),parseInt(Sc.substr(5,2),16)],Qa);Qa=Eg(Qa[0],Qa[1],Qa[2])}else Qa=null;a={C:a,ti:H,Ta:J,fc:L,Va:ua,S:ka,da:la,mb:r,Mb:l,Lb:qa,Aa:eb,Kb:sb,hd:fb,hg:qk,Wa:rk,N:sk, +yi:u,zi:Qa,fontFamily:f("fontFamily"),qe:f("fontFamilyAttribution"),sb:f("fontSizeTitle"),wa:f("fontSizeDescription"),rc:C,Pb:f("fontSizeAttribution"),qd:f("fontSizePlusOnes"),od:f("fontSizeLocation"),K:f("fontSizeAnnotation"),Ni:y,mk:f("titleBold"),sk:e.titleInlineBlock,Uj:f("rolloverLinkBold"),fh:f("rolloverLinkColor"),eh:f("rolloverLinkBackgroundColor"),Vj:f("rolloverLinkUnderline"),dh:f("rolloverAdBackgroundColor"),Pg:f("noTitleUnderline"),zh:ah(a),Xc:g("adBorderSelections","left"),cc:g("adBorderSelections", +"right"),Yc:g("adBorderSelections","top"),Wc:g("adBorderSelections","bottom"),pi:g("borderSelections","left"),ag:g("borderSelections","right"),ri:g("borderSelections","top"),oi:g("borderSelections","bottom"),za:Tb(d,a),Tb:f("lineHeightTitle"),aa:f("lineHeightDescription"),ab:f("lineHeightDomainLink"),Zf:f("attributionSpacingBelow"),hj:$g(d,a),De:e.hasButtonRight};f("adIconUrl")?(a.Ib=f("adIconWidth"),a.kb=f("adIconHeight"),a.Hb=f("adIconLocation"),a.dc=f("adIconSpacingAbove"),a.ec=f("adIconSpacingBefore"), +a.Uf=f("adIconSpacingAfter"),a.ad=f("adIconSpacingBelow"),a.Vd=!0):f("adIconPageUrl")&&(a.Ib=f("adIconPageWidth"),a.kb=f("adIconPageHeight"),a.Hb=f("adIconPageLocation"),a.dc=f("adIconPageSpacingAbove"),a.ec=f("adIconPageSpacingBefore"),a.Uf=f("adIconPageSpacingAfter"),a.Vd=!1);"relatedsearch"==h&&(a.type="relatedsearch",a.Nb=f("columnSpacing"),a.vd=f("horizontalFlow"),a.ub=f("horizontalAlignment"));var v,h=a.C.isRtl?"right":"left";d=a.C.isRtl?"left":"right";f="";e="<style>"+(a.C.isHighendMobile&& +a.C.uiExp1?"div {max-height: 999999px;}":"")+"body {"+(a.C.isHighendMobile?"-webkit-text-size-adjust: 100%;":"")+"color: "+(a.da?Q(a.da):"black")+"; font-family: "+(a.Qc?"'"+Q(a.Qc)+"',":"")+(a.fontFamily?Q(a.fontFamily):"arial")+", sans-serif; font-size: "+(a.C.isHighendMobile||a.C.isTablet?"14":"12")+"px; width: "+Q(a.ti)+"; padding: 0px; margin: 0px;"+(a.Aa&&(a.ag||a.cc)?"padding-right: 2px;":"")+"}body {-webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-tap-highlight-color: transparent;}a {-webkit-tap-highlight-color: initial;}.ad {padding: 2px 0; margin: 0px; word-wrap: break-word;"+ +(a.Ta.Qb?"padding-top: "+Q(a.Ta.Ud)+"px; padding-bottom: "+Q(a.Ta.ae)+"px;":a.C.isHighendMobile||a.C.isTablet?"padding: 7px 0;":"")+(a.fc?"border-bottom: 1px solid "+Q(a.fc)+";":"")+"}"+(a.dh?".b_:hover {background-color: "+Q(a.dh)+";}":"")+".ad.f {"+(a.Ta.Qb?"padding-top:2px;":"")+"}.ad.fr {"+(a.Ta.Qb?"padding-top:2px;":"")+"}.ad.l {"+(a.Ta.Qb?"padding-bottom:2px;":"")+(a.fc?"border-bottom: 0px;":"")+"}.ad.lr {"+(a.Ta.Qb?"padding-bottom:2px;":"")+"}#adBlock b {"+(a.C.adbold?"":"font-weight: normal;")+ +(a.C.keywordColor&&a.hg?"color: "+Q(a.hg)+";":"")+"}.descText, .ctcCO {"+(a.wa?"font-size: "+Q(a.wa)+"px;":"")+"}.sr-div, .sl-table-ol td, .sl-table td, .g_ {"+(a.K?"font-size: "+Q(a.K)+"px;":a.wa?"font-size: "+Q(a.wa)+"px;":"")+"}"+(a.aa||a.C.isHighendMobile||a.C.isTablet?".descText {line-height: "+(a.aa?Q(a.aa)+"px":"1.5em")+";}":"")+".b_ {padding: 4px 4px; position: relative;"+(a.Va?"background-color: "+Q(a.Va)+";":"")+(a.S&&a.Xc?"border-left: 1px solid "+Q(a.S)+";":"")+(a.S&&a.cc?"border-right: 1px solid "+ +Q(a.S)+";":"")+(a.S&&a.Yc?"border-top: 1px solid "+Q(a.S)+";":"")+(a.S&&a.Wc?"border-bottom: 1px solid "+Q(a.S)+";":"")+"}.ad span {_width: 99%;}"+(a.za?".adStd {cursor: pointer; width: 100%;}":"")+"#adBlock {background: #FFFFFF none repeat scroll 0 0; margin: 0; padding: 0;"+(a.Lb?"background-color: "+Q(a.Lb)+";":"")+(a.Aa&&a.pi?"border-left: 1px solid "+Q(a.Aa)+";":"")+(a.Aa&&a.ag?"border-right: 1px solid "+Q(a.Aa)+";":"")+(a.Aa&&a.ri?"border-top: 1px solid "+Q(a.Aa)+";":"")+(a.Aa&&a.oi?"border-bottom: 1px solid "+ +Q(a.Aa)+";":"")+"}#adBlock h2 {font-size: "+(a.Pb?Q(a.Pb):a.C.isTablet?"15":"13")+"px; font-weight: normal;"+(a.Zf?"padding-bottom: "+Q(a.Zf)+"px;":"padding: 0;")+"margin: 0;"+(a.qe||a.Gh?"font-family: "+(a.Gh?"'"+Q(a.Gh)+"',":"")+(a.qe?Q(a.qe)+",":"")+" sans-serif;":"")+(a.C.isCse?"text-align: "+Q(h)+";":"")+"}#adBlock span.lhHeader {margin: 3px 4px 0;}#adBlock span.rhHeader {margin: 0 4px; float: "+Q(d)+";"+(a.C.isHighendMobile?"display: inline;":"")+"position: relative; z-index: 1;}#adBlock h2 a, #adBlock h2 {color: "+ +(a.Kb?Q(a.Kb):"#676767")+"; text-decoration: none;}.d_, .sl-table a, .sl-table-ol a, .g_ a, .nonSfblSitelinksWrapper {color: "+Q(a.mb)+";}.d_, .ctcT a {"+(a.sb?"font-size: "+Q(a.sb)+"px;":a.C.isHighendMobile?"font-size: 18px;":"")+"font-weight: "+(a.mk?"bold":"normal")+";}.d_ {"+(a.sk?Qd():"")+"line-height: "+(a.Tb?Q(a.Tb)+"px":"1.4em")+";"+(a.Pg?"text-decoration: none;":"")+(a.zh?"letter-spacing: "+Q(a.zh)+";":"")+"margin: 0; padding: 0;}"+(a.Vj?".d_:hover, .e_:hover, .sr-rl:hover {text-decoration: underline;}a {text-decoration: none;}": +"")+"h2 a:hover {color: "+(a.Kb?Q(a.Kb):"#676767")+"; text-decoration: none; font-weight: normal; background-color: transparent;}.e_ {"+(a.ab?"line-height: "+Q(a.ab)+"px;":a.C.isHighendMobile||a.C.isTablet?"line-height: 1.5em;":"")+"color: "+Q(a.Mb)+"; font-style: normal; font-weight: normal;"+(a.rc?"font-size: "+Q(a.rc)+"px;":"")+"text-decoration: none;}.invisible {display: none;}.adStd.oneLine .descText {margin: 0 4px;}.adStd.twoLine .e_ {margin-"+Q(d)+": 8px;}.textLink {color: "+(a.da?Q(a.da): +"black")+"; text-decoration: none;}.individualLabel {background-color: "+Q(a.yi)+"; color: "+Q(a.zi)+"; font-size: "+Q(a.Ni)+"; border-radius: 2px; padding: 0 2px; margin-"+Q(d)+": 7px; vertical-align: baseline;}.sl-table, .g_ {visibility: hidden; margin-top: "+(a.C.isHighendMobile||a.C.isTablet?"0px":"4px")+";}.sl-table-ol a, .sl-table a, .g_ a {text-decoration: none;}.sl-table-ol td {vertical-align: top; padding: 0px;}.sl-table a:hover, .g_ a:hover, .sl-table-ol a:hover {text-decoration: underline;}.sl-table td {vertical-align: top; padding: 0px;}.sl-right {"+ +(a.C.isHighendMobile?"margin: 4px 0 4px; margin-"+Q(h)+": 8px;":"margin-"+Q(h)+": 13px;")+"}.sl-left {"+(a.C.isHighendMobile?"margin: 4px 0 4px; margin-"+Q(d)+": 8px;":"margin-"+Q(h)+": 12px;")+"}"+(a.C.isTablet?"":".sl-table, .g_ {line-height: 1.5;}")+(a.C.isHighendMobile||a.C.isTablet?".sl.l {margin-"+Q(d)+": 5px;}.sl.r {margin-"+Q(h)+": 5px;}":"")+".sitelinks {margin: 0; padding: 0; list-style-type: none; overflow: hidden;}.twoColSitelink {float: "+Q(h)+"; width: 49%;}.sitelink-spacer {padding-"+ +Q(d)+": 10px;}.sitelink-nowrap {white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: "+Q(h)+";}.plus-ones, .plus-ones a {text-decoration: none; color: "+(a.hd?Q(a.hd):a.N?Q(a.N):"#666666")+";"+(a.qd?"font-size: "+Q(a.qd)+"px;":a.K?"font-size: "+Q(a.K)+"px;":"")+"}.plus-ones a:hover {text-decoration: underline;}.apareview, .reviewlink {"+(a.K?"font-size: "+Q(a.K)+"px;":"")+"color: "+Q(null==(v=a.N)?"#666666":v)+";}.reviewlink {text-decoration: none;}.reviewlink:hover {text-decoration: underline;}.sr-div, .sr-rl {color: "+ +(a.N?Q(a.N):a.da?Q(a.da):"#666666")+";}.sr-rl {text-decoration: none;}.sr-rl:hover {text-decoration: underline;}.sr-gt {color: "+Q(null==(v=a.N)?"#777777":v)+";}.sr-gl {text-decoration: none;}.sr-gl:hover {text-decoration: underline;}.sr-p {padding-right: 62px;}.sr-nsc {display: inline; position: relative;}.sr-star {position: absolute;"+P(h)+": 0px;}.sr-number {color: #F99B00;}a:hover {"+(a.Uj?"font-weight: bold;":"")+(a.fh?"color: "+Q(a.fh)+";":"")+(a.eh?"background-color: "+Q(a.eh)+";":"")+"}.ctcLD {color: #676767; font-size: 80%;}.ctcI {width: 10px; height: 10px; margin-"+ +Q(d)+": 1px;}.ctcCOI {width: 16px; height:16px;"+(a.C.isRtl?'-moz-transform: scaleX(-1); -o-transform: scaleX(-1); -webkit-transform: scaleX(-1); transform: scaleX(-1); filter: FlipH; -ms-filter: "FlipH";':"")+"}.ctcT {margin: 4px 0px 2px;}.ctcT a {"+(a.C.isHighendMobile&&!a.Pg?"text-decoration: underline;":"text-decoration: none;")+"}.ctcCO {font-weight: bold;}.ctd-tbl {border-collapse: collapse; border-spacing: 0; width: 100%; table-layout: fixed;}.ctd-td-cr {vertical-align: top; padding-"+Q(d)+ +": 12px; padding-"+Q(h)+": 6px;}.ctd-itd {width: 45px;}.ctd-i-mini {margin-top: 5px; margin-"+Q(d)+": 1px; margin-bottom: 0px; margin-"+Q(h)+": 1px; width: 16px; height: 16px;}.ctd-il {width: 45px; height: 45px; display: block; margin: auto;}.ctd-ico {border:none; vertical-align: middle;}.ctd-ico-s {"+Qd()+"height: 100%; vertical-align: middle;}.ctd-ico.rc {border-radius:8px;}.ctd-ico.rc-mini {border-radius:4px;}.ctd-rate {color: #8d8d8d;"+Qd()+"font-weight: 300; margin-top:2px;}.ctd-rate-bg {background: url(//www.google.com/images/afs/mobile/ctd-star-off.png); height: 13px; width: 65px;"+ +Qd()+"vertical-align: top; white-space: nowrap;}.ctd-rate-fg {background: url(//www.google.com/images/afs/mobile/ctd-star-on.png) "+Q(h)+" bottom; height: 13px;}.ctd-rate-txt {"+Qd()+"vertical-align: top; white-space: nowrap;}.ctd-rate-txt.inline {margin-"+Q(h)+": 4px; margin-"+Q(d)+": 4px;}.ctd-usr-ico {background: url(//www.google.com/images/afs/mobile/ctd-user-icon.png); background-position: center; background-repeat: no-repeat;"+Qd()+"width: 13px; height: 13px; position: relative; top: 1px; margin-"+ +Q(h)+":2px; margin-"+Q(d)+":4px;}"+(a.Ib&&a.kb&&a.C.customAdIcons?".adIcon {visibility: visible; width: "+Q(a.Ib)+"px; height: "+Q(a.kb)+"px; border: none;"+("title-right"==a.Hb?"padding-left: 2px; padding-right: 2px;":"float: "+Q(h)+"; margin-"+Q(h)+": "+Q(null==(v=a.ec)?0:v)+"px; margin-"+Q(d)+": "+Q(null==(v=a.Uf)?4:v)+"px; margin-top: "+Q(null==(v=a.dc)?4:v)+"px; margin-bottom: "+Q(null==(v=a.ad)?0:v)+"px;")+"}"+("ad-left"==a.Hb?(a.Vd?".adD, ":"")+".b_ {display: block; overflow: hidden;"+(a.Vd? +"":"margin-"+Q(h)+": "+Q(a.Ib)+"px;")+"}":""):"")+".location {color: "+(a.Wa?Q(a.Wa):a.N?Q(a.N):"#666666")+";"+(a.od?"font-size: "+Q(a.od)+"px;":a.K?"font-size: "+Q(a.K)+"px;":"")+"}"+(a.C.isHighendMobile||a.C.isTablet?".sr-div, .sl-table-ol, .sl-left, .sl-right, .apareview {margin-top: 12px;}.location, .plus-ones, .t_, .u_ {margin-top: 10px;}":"")+(a.C.isHighendMobile?".adStd {clear: "+Q(d)+";}":"")+".u_ {overflow: hidden; height: 1.2em; white-space: nowrap; text-overflow: ellipsis; word-wrap: normal; color: "+ +Q(null==(v=a.N)?"#666666":v)+";"+(a.K?"font-size: "+Q(a.K)+"px;":"")+"}.v_ {white-space: normal;}.w_ {white-space: nowrap;}.x_ {width: 1em; height: 1em; vertical-align: text-bottom; margin-bottom: 1px; margin-"+Q(d)+": 5px;}.t_ {color: "+Q(null==(v=a.N)?"#666666":v)+";"+(a.K?"font-size: "+Q(a.K)+"px;":"")+"}"+("relatedsearch"==a.type?".radlinkC {"+(a.vd&&a.sb<a.Pb?"padding: "+P(1+(a.Pb-a.sb))+"px 4px;":"padding: 1px 4px;")+"}.col {"+(a.ub?"text-align:"+("right"==h&&"left"==a.ub?"right":"right"==h&& +"right"==a.ub?"left":Q(a.ub))+";":"")+(a.vd?"border-"+Q(d)+": 1px solid "+Q(a.fc)+";":"")+"vertical-align: top;"+(a.Nb?a.vd&&a.ub?"center"==a.ub?"padding-right: "+P(Math.floor(a.Nb/2))+"px; padding-left: "+P(Math.floor(a.Nb/2))+"px;":"right"==a.ub?"padding-"+Q(h)+": "+Q(a.Nb)+"px;":"padding-"+Q(d)+": "+Q(a.Nb)+"px;":"padding-right: "+Q(a.Nb)+"px;":"")+"}"+(a.vd?"#adBlock h2 {float: "+Q(h)+"; line-height: 1.4em; vertical-align: top;"+(a.sb>=a.Pb?"padding: "+P(3+(a.sb-a.Pb))+"px 4px;":"padding: 3px 4px;")+ +"}.ad {border-bottom: none;}.col.l {border-"+Q(d)+": none;}":"#adBlock h2 {text-align: "+Q(h)+";}"):"")+".raiDiv {margin-bottom: 20px;}.raiImg {margin-right: 5px; margin-top: 10px; margin-bottom: 0px; border: 1px solid #CCCCCC;}.nowrap {white-space: nowrap;}";v=a.C.isRtl;g=a.mb;l=v?"right":"left";v=""+(".buttonsWrapper {margin-top: 10px; white-space: nowrap;}.inlineButton {"+K(Qd())+"box-sizing: border-box; text-align: center; border-"+G(l)+": 1px solid #DDDDDD; vertical-align: top;}.inlineButton.firstButton {border-"+ +G(l)+": none;}.button {text-align: center;}.buttonImageWrapper {margin-top: 10px; line-height: 0;}.buttonTextWrapper {margin-top: 7px;}.buttonText {text-decoration: none; color: #5897F1; font-size: 12px;}.grayJfkButton {"+K(Qd())+"line-height: 31px; text-align: center; white-space: nowrap; border: 1px solid #dcdcdc; border-radius:2px; color: #333; background: #f5f5f5; text-decoration:none; min-width: 66px; padding: 0 2px; margin-top: 5px;}.jfkButtonText {margin: 0 4px;}.jfkButtonImage {vertical-align: middle;}"+ +(v?'.buttonImage {-moz-transform: scaleX(-1); -o-transform: scaleX(-1); -webkit-transform: scaleX(-1); transform: scaleX(-1); filter: FlipH; -ms-filter: "FlipH";}':"")+".buttonText.svgButtonText {color: "+G(g)+";}.svgButton {fill: "+G(g)+"; height: 28px; width: 28px;}");v=F(v);v=e+v;if(a.hj){var N;e=".sfblAd {padding: "+K(null==(N=a.Ta.Ud)?17:N)+"px 0 "+K(null==(N=a.Ta.ae)?17:N)+"px 0;}.sfblAd.notLast {border-bottom: 1px solid "+K(null==(N=a.fc)?"#E1E1E1":N)+";}.sfblNarrowPadder {padding-top: 4px;}.sfblFavicon {vertical-align: top; width: 16px; height: 16px; padding: 0 1px;}.sfblSellerNameWrapper {overflow: hidden; text-overflow: ellipsis; color: "+ +G(a.Mb)+"; font-size: "+K(null==(N=a.rc)?"13":N)+"px;}.sfblSellerNameLink {text-decoration: none; color: "+G(a.Mb)+";}.sfblSellerNameLink:hover {text-decoration: underline;}.sfblSellerRatingsWrapper {padding-top: 3px;}.sfblTitleLink {font-size: "+K(null==(N=a.sb)?"15":N)+"px; font-weight: bold; text-decoration: none; color: "+G(a.mb)+";}.sfblTitleLink:hover {text-decoration: underline;}.sfblDescriptionWrapper, .r_ {padding-top: 3px; color: "+K(null==(N=a.da)?"#333333":N)+"; font-size: "+K(null==(N= +a.wa)?"13":N)+"px;}.r_ {padding-top: 0px;}.sfblSitelinksWrapper {padding-top: 4px; max-width: 450px; font-size: "+K(null==(N=a.wa)?"13":N)+"px;}.sfblSitelink {text-decoration: none; line-height: 17px; color: "+G(a.mb)+";}.sfblSitelink:hover {text-decoration: underline;}.plus-ones, .plus-ones a {color: "+(a.hd?G(a.hd):a.N?G(a.N):"#777777")+"; font-size: "+(a.qd?G(a.qd):a.K?G(a.K):"13")+"px; line-height: 1.3;}.location {color: "+(a.Wa?G(a.Wa):a.N?G(a.N):"#777777")+"; font-size: "+(a.od?G(a.od):a.K? +G(a.K):"13")+"px; line-height: 1.3;}.z_ {color: #777777;}.apareview, .t_, .u_ {font-size: "+K(null==(N=a.K)?"13":N)+"px; color: "+K(null==(N=a.N)?"#777777":N)+"; line-height: 1.3;}.b_ {padding: 0;}"}else e="";N=v+e+".nonSfblSitelinksWrapper {"+(a.C.isHighendMobile||a.C.isTablet?"margin-top: 0px;":"margin-top: 4px;")+(a.C.isHighendMobile?"":"margin-left: 12px;")+"max-width: 450px;}.sitelinksTruncatedNarrow, .sitelinksTruncatedWide {"+(a.K?"font-size: "+Q(a.K)+"px;":a.wa?"font-size: "+Q(a.wa)+"px;": +"")+"text-decoration: none; line-height: 1.5; color: "+Q(a.mb)+";"+(a.C.isHighendMobile||a.C.isTablet?"margin-top: 12px;":"margin-top: 0px;")+"word-wrap: normal;}.sitelinksTruncatedWide {"+(a.C.isTablet||a.C.isHighendMobile?"line-height: normal;":"")+"}.r_ {overflow: hidden; height: "+Q(a.aa?a.aa+"px":"1.5em")+"; text-overflow: ellipsis; line-height: "+Q(a.aa?a.aa+"px":"1.5em")+"; word-wrap: normal;"+(a.wa?"font-size: "+Q(a.wa)+"px;":"")+"}.y_ {white-space: nowrap;}.z_ {"+(a.ab?"line-height: "+Q(a.ab)+ +"px;":a.C.isTablet?"line-height: 1.5em;":"")+(a.rc?"font-size: "+Q(a.rc)+"px;":"")+"}.aa_ {white-space: nowrap;}.ba_ {"+Qd()+"}";var Ra;a.C.mobileUiFormat&&a.C.isHighendMobile?(v={left:h,right:d,Qc:a.Qc,fontFamily:a.fontFamily,Va:a.Va,S:a.S,Xc:a.Xc,cc:a.cc,Yc:a.Yc,Wc:a.Wc,da:a.da,mb:a.mb,Mb:a.Mb,Lb:a.Lb,Wa:a.Wa,N:a.N,Tb:a.Tb,aa:a.aa,ab:a.ab,K:a.K,Ib:a.kb,kb:a.kb,Hb:a.Hb,dc:a.dc,ec:a.ec,ad:a.ad,Gi:a.C.customAdIcons,De:a.De,xf:a.C.mobileUiFormat},h="collapse"==v.xf||"card"==v.xf,v=""+("body {font-family: "+ +(v.Qc?"'"+G(v.Qc)+"', ":"")+(v.fontFamily?G(v.fontFamily)+", ":"")+'"Roboto", "Helvetica Neue", arial, sans-serif;}.sitelinksWrapper_js {padding: '+(h?"12px":"7px")+" 6px;}.location, .sitelinksWrapper_js {width: 100%;}.sr-div {padding: 2px 0px; margin-top: 0px;}"+(h?".wb_ {border-radius: 2px; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);}.ad {margin: 0px; padding: 0px 8px; padding-bottom: 10px; border-bottom: none;}.ad.f {margin-top: 0px;}.ad.l {margin-bottom: 0px;}#adBlock {background-color: "+(v.Lb? +G(v.Lb):"#F1F1F1")+"; padding-top: 10px; padding-bottom: 1px;}.location, .cc_ {border-top: 1px solid #EBEBEB;}"+("collapse"==v.xf?".wb_ {padding-bottom: 7px;}":""):".ad {margin: 0px 4px;}")+".wb_ {background-color: "+(v.Va?G(v.Va):"#FFFFFF")+";"+(v.S&&v.Xc?"border-left: 1px solid "+G(v.S)+";":"")+(v.S&&v.cc?"border-right: 1px solid "+G(v.S)+";":"")+(v.S&&v.Yc?"border-top: 1px solid "+G(v.S)+";":"")+(v.S&&v.Wc?"border-bottom: 1px solid "+G(v.S)+";":"")+"}.xb_ {padding-top: 10px; padding-bottom: 8px; padding-"+ +G(v.left)+": 16px;}.d_ {text-decoration: none; padding-"+G(v.right)+": 16px; line-height: "+(v.Tb?G(v.Tb):"20")+"px;}.descText {display: block; line-height: "+(v.aa?G(v.aa):"20")+"px;}.sr-div, .sr-rl {color: "+(v.N?G(v.N):v.da?G(v.da):"#808080")+";}.location {margin-top: 0px; padding: "+(h?"12px":"7px")+" 16px; color: "+(v.Wa?G(v.Wa):v.N?G(v.N):"#808080")+";}.descText, .r_ {color: "+(v.da?G(v.da):"#222222")+";}.e_ {line-height:"+(v.ab?G(v.ab):"20")+"px; color: "+G(v.Mb)+";}.o_ {position: relative;}.o_ .dc_ {margin-right: 10px;}td {padding: 0px;}.r_ {height: "+ +G(v.aa?v.aa+"px":"20px")+"; line-height: "+G(v.aa?v.aa+"px":"20px")+";}.nonSfblSitelinksWrapper {"+(v.K?"font-size: "+G(v.K)+"px;":"")+"}.sitelinksTruncatedWide, .sitelinksTruncatedNarrow {margin-top: 0px;}.sitelink-nowrap > a {text-decoration: none;}.sitelink-spacer {padding: 0px 10px;}.buttonTextWrapper {margin-top: -3px; font-weight: bold;}.ctd-ico {padding-top: 4px;}.n_ .d_ {padding-"+G(v.right)+": 0px;}.n_ .adStd, .n_ .r_ {padding-"+G(v.right)+": 16px;}.individualLabel {background-color: "+(v.Va? +G(v.Va):"#FFFFFF")+"; color: "+(v.Kb?G(v.Kb):"#808080")+"; float: "+G(v.right)+"; font-size: 10px; margin-"+G(v.right)+": 5px; margin-top: -3px;}.adStd {clear: none;}.zb_ {overflow: hidden; display: none;}.o_ .zb_ {display: initial;}.ac_ {display: none;}.collapsed .ac_ {display: initial;}.collapsed .bc_ {display: none;}"+(v.Ib&&v.kb&&v.Gi&&"title-right"!=v.Hb?".adIcon {float: none; margin-top: "+K(null==(Ra=v.dc)?0:Ra)+"px; margin-bottom: "+K(null==(Ra=v.ad)?0:Ra)+"px; margin-"+G(v.left)+": 0px;}.xb_ {padding-"+ +G(v.left)+": "+K(null==(Ra=v.ec)?16:Ra)+"px; padding-top: 16px;}":"")+".adStd {clear: none;}"+(v.De?".yb_ {max-height: 999px;}":"")),Ra=F(v)):Ra="";bh(f+(N+Ra+"</style>"),b,c)},dh=function(a,b,c,d,e,f,g,h,l){a="<h2 "+(l?' class="'+G(l)+'" ':"")+" id='attrHeader'>"+(f?a?ze({text:a,ca:"rhHeader"})+"<br />":Ug({$d:c,gd:b,ca:"rhHeader"})+(e?Vg({Bc:e,ca:"rhHeader",id:"megaLabel"}):Vg({Bc:d,ca:"lhHeader",id:"adsLabel"})):a?ze({text:a,ca:"lhHeader"}):(e?Vg({Bc:e,ca:"lhHeader",id:"megaLabel"}):Vg({Bc:d,ca:"rhHeader", +id:"adsLabel"}))+Ug({$d:c,gd:b,ca:"lhHeader"}))+"</h2>";bh(a,g,h)},bh=function(a,b,c){da(a)||(a=a.toString());ra()?b.populate(a):c.appendChild($c(Zc(),a))};if(window.IS_GOOGLE_AFS_IFRAME_)var eh=/^((https?):)?\/\/afs.googleusercontent.com\//,fh=/^\/\/afs.googleusercontent.com\//,gh=function(a,b,c,d,e,f,g){if(!d||eh.test(b))for(var h=0;h<a.length;h++)e&&"http:"==b.substring(0,5)&&eh.test(b)?b="https:"+b.substring(5):d&&fh.test(b)&&(b=(e?"https:":"http:")+b),a[h].adIconUrl=b,a[h].adIconLocation=c,a[h].img=d,f&&(a[h].adIconWidth=f),g&&(a[h].adIconSpacingAfter=g)},gh=m(gh,"aiIID");if(window.IS_GOOGLE_AFS_IFRAME_)var jh=function(a,b,c,d){if((a=hh(a,d,"https"==window.location.protocol))&&0<a.length)if(d.adClicktracking){c=Db("block",""+c,a);d=Zd(b,"div","c_");d=d.concat(Zd(b,"tr","c_"));b=0;for(var e;e=d[b];b++)a=c,a=Db("ad",""+(b+1),a),ih(e,a)}else ih(b,a)},hh=function(a,b,c){var d=[];a=a.clicktrackUrl;if(b.clicktracking&&a&&0<a.length){b=0;for(var e;e=a[b];b++)0==e.indexOf("http://metrics.target.com")?(e=e.replace("http://metrics.target.com","https://smetrics.target.com"), +d.push(e)):c&&0==e.indexOf("http:")||d.push(e)}return d},ih=function(a,b){for(var c=a.getElementsByTagName("a"),d=0;d<c.length;d++){var e=c[d];gb.test(e.href)&&("ontouchstart"in document.documentElement?(U(e,"touchstart",kh),U(e,"touchmove",lh),U(e,"touchend",function(){mh&&Fa(Eb(b));mh=!1})):U(e,"mousedown",function(a){var c=!1;(c=a.which?2>a.which:2>a.button)&&Fa(Eb(b))}))}},nh,oh,mh=!1,kh=function(a){mh=!1;a=a.touches;1==a.length&&(a=a[0],nh=a.clientX,oh=a.clientY,mh=!0)},lh=function(a){a=a.touches[0]; +if(10<Math.abs(a.clientX-nh)||10<Math.abs(a.clientY-oh))mh=!1};if(window.IS_GOOGLE_AFS_IFRAME_)var ph=function(a){var b=[];a=Zd(a,"div","a_");for(var c=0,d;d=a[c];c++){d=Zd(d,"div","adStd");for(var e=0,f;f=d[e];e++)f.style["-webkit-tap-highlight-color"]="initial",b.push(f)}return b},ph=m(ph,"fCE"),rh=function(a,b,c){var d=a.getAttribute("data-click-s"),e=a.getAttribute("data-click-trg");d&&e&&U(a,"click",qh(d,e,c&&0<c.length?Eb(Db("ad",""+(b+1),c)):null))},rh=m(rh,"aCB"),sh=function(a,b,c,d){b&&0<b.length&&(b=Db("block",""+c,b));a=ph(a,d);for(c=0;d=a[c];c++)rh(d, +c,b)},sh=m(sh,"cbACB"),qh=function(a,b,c){return function(d){d&&(d=d.target||d.srcElement)&&(3==d.nodeType&&(d=d.parentNode),th(d)||(c&&Fa(c),a+="&nb=2","_blank"==b?window.open(a):window.top.location.href=a))}},qh=m(qh,"cbBCH"),th=function(a){for(;a&&!Wd(a,"adStd");){if("a"==a.nodeName.toLowerCase())return!0;a=a.parentNode}return!1},th=m(th,"cbLTOCH");if(window.IS_GOOGLE_AFS_IFRAME_){var uh=function(a,b,c,d,e,f,g){this.Me=db(a);this.Qe=b;this.cf=c;this.Nd=d;this.Qd=e;this.Xe=f;this.D=g;this.Cd=R()};uh.prototype.j=function(){return this.D({Ja:this.Me,Wb:this.cf,Ed:this.Qe,Dd:this.Cd,ma:this.Nd,ua:this.Qd,Ma:this.Xe})}};var vh=function(a){return F(a.Og?'<table style="width: 100%"><tr class="i_"><td class="j_">'+G(a.Og)+"</td></tr></table>":'<div id="'+M(a.zj)+'" class="qb_"><div id="'+M(a.Yj)+'" class="rb_"></div><div class="sb_" id="'+M(a.Dj)+'"><span class="tb_" id="'+M(a.Ej)+'"></span><div class="left ub_ lb_" id="'+M(a.Wj)+'"><img width="21" height="21" class="vb_" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAXklEQVQ4y2P4//8/A7Uxw6ih2CWwAwMgvg+iqWUoyMD3QAySvE8NQ5ENfE8Nl2IYCBKkxFCsBlJiKE4DKTH0PtRAEE5AD+RB5VKahCnNYp9m6ZRmOYo6eX+0kCYbAwBPgxTnnBag1wAAAABJRU5ErkJggg==" /></div><div class="right ub_ lb_" id="'+ +M(a.Xj)+'"><img width="21" height="21" class="vb_" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAXElEQVQ4y2P4//8/A7Uxw6ihuCUZGAyA+D6UxgDkGgoyEMR4j81gSlz6HpfB5BqK12BKDMVpMKWGYjWYGoaCQALUUBC+PyhdSvUwpXrs0ySd0ixHUTfvjxbSZGEA/QcU5yLp498AAAAASUVORK5CYII=" /></div></div></div>')},wh=function(a){return ud(".sb_ {padding-top: 10px; text-align: right; height: 29px; font-size: 12px; color: #666666; line-height: 29px; margin-bottom: 2px;}.tb_ {padding-right: 10px; height: 100%; display: inline-block;}.lb_ {display: inline-block; text-align: center; border-radius: 2px; background: white; border: 1px solid #f3f3f3; cursor: default; white-space: nowrap; text-decoration: none; color: #444444; font-size: 11px; font-weight: bold; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;}.ub_.lb_ {height: 100%; width: 34px; font-size: inherit; position: relative;}.lb_.s_ {border: 1px solid #dcdcdc; background: #f5f5f5; z-index: 10;}.lb_.s_:active {-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); box-shadow: inset 0 1px 2px rgba(0,0,0,.1); background: #f8f8f8; color: #333;}.lb_.s_:hover {border: 1px solid #c6c6c6; z-index: 20;}.left.lb_ {border-top-right-radius: 0; border-bottom-right-radius: 0;}.right.lb_ {border-top-left-radius: 0; border-bottom-left-radius: 0; margin-left: -1px;}.vb_ {margin-top: -3px; vertical-align: middle; filter: alpha(opacity=33); opacity: .333;}.lb_.s_:hover > .vb_ {filter: alpha(opacity=90); opacity: .9;}.lb_.s_ > .vb_ {filter: alpha(opacity=55); opacity: .55;}table {font-size: "+ +P(a.fontSize)+"px; border-collapse: collapse; display: inline-table; white-space: normal; margin-right: 10px; vertical-align: top; border-top: 1px solid #ebebeb;}.qb_ {position: relative; overflow: hidden;}.rb_ {white-space: nowrap; position: relative; left: 0px;}.j_ {color: #777777;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var xh=function(a,b,c,d,e){this.xa=a;this.Fj=b;this.ak=c;this.xj=d;this.nb=0;this.Hc=[];this.D=e;this.Yd=new ke(300);this.Qg=R();this.kf=R();this.Sg=R();this.hf=R();this.jf=R();this.Tg=R()};k=xh.prototype;k.j=function(){return this.D({zj:this.Qg,Yj:this.kf,Dj:this.Sg,Wj:this.hf,Xj:this.jf,Ej:this.Tg,Og:0==this.xa.length?this.xj:""})};k.ug=function(a,b){return a==b?this.ak.replace("%1$d",""+a).replace("%2$d",""+this.xa.length):this.Fj.replace("%1$d",""+a).replace("%2$d", +""+b).replace("%3$d",""+this.xa.length)};k.Cj=function(a,b){if(0!=this.xa.length){var c=T(a,this.Qg);b-=c.offsetHeight;var d=T(a,this.kf),c=c.offsetWidth,e=a.createElement("table");e.style.width=c+"px";d.appendChild(e);for(var f=0,g=0;g<this.xa.length;g++)if(e.appendChild(ae(this.xa[g].j())),e.offsetHeight>b){var h=e.removeChild(e.lastChild);0==f&&(b=e.offsetHeight);this.Hc.push(this.ug(f+1,g));e=a.createElement("table");e.style.width=c+"px";d.appendChild(e);e.appendChild(h);f=g}this.Hc.push(this.ug(f+ +1,this.xa.length));this.Eh(a)}};k.cg=function(){return 0<this.nb};k.dg=function(){return this.nb<this.Hc.length-1};k.Eh=function(a){if(1==this.Hc.length)T(a,this.Sg).style.display="none";else{var b=T(a,this.hf);this.cg()?Yd(b,"s_"):Xd(b,"s_");b=T(a,this.jf);this.dg()?Yd(b,"s_"):Xd(b,"s_");T(a,this.Tg).innerHTML=this.Hc[this.nb]}};k.gh=function(a,b){if(!this.Yd.$a&&0<a.getElementsByTagName("table").length){var c=T(a,this.kf),d=Ie(a.getElementsByTagName("table")[0],!1),e=d*this.nb*-1;b?this.nb--:this.nb++; +this.Yd.Gb=je(c,e,d*this.nb*-1);if(!le(this.Yd))throw"Animator got out of sync with page state.";this.Eh(a)}};k.Qi=function(a){return ga(function(){this.cg()&&this.gh(a,!0)},this)};k.Si=function(a){return ga(function(){this.dg()&&this.gh(a,!1)},this)};k.Zd=function(a){if(0!=this.xa.length){var b=T(a,this.hf);U(b,"click",this.Qi(a));b=T(a,this.jf);U(b,"click",this.Si(a))}}};var yh=function(a){for(var b='<div style="display: none;" id="_googAFShSingleProduct"></div><style>',c=a.uh,d=c.length,e=0;e<d;e++)b+=P(c[e]);b+='</style><div class="xa_"><div id="'+M(a.Rf)+'">';c='<div class="h_" id="'+M(a.Oc)+'">'+G(a.title)+"</div>"+(a.ha?'<div class="cb_">'+G(a.ha)+"</div>":"");c=I(c);b+=(a.xb?K(mf({Da:I('<div class="za_"><img class="ab_" src="'+M(Ld(a.xb))+'"></div>'),Ea:I(""+G(c)),Z:69,ga:10})):G(c))+'<div class="bb_">'+G(a.sh)+"</div></div>"+G(a.ah)+"</div>";return F(b)},zh= +function(a){for(var b='<div style="display: none;" id="_googAFShSingleProduct"></div><style>#adBlock {width: '+P(a.si)+"px;}",c=a.uh,d=c.length,e=0;e<d;e++)b+=P(c[e]);b+='</style><div class="xa_">';c='<div id="'+M(a.Xi)+'"><div id="'+M(a.Rf)+'"><div class="db_"><div class="h_" id="'+M(a.Oc)+'">'+G(a.title)+'</div><div class="cb_">'+G(a.ha)+'</div></div><div class="bb_">'+G(a.sh)+"</div></div>"+G(a.ah)+"</div>";c=I(c);b+=(a.xb?K(mf({Da:I('<div class="za_" id="'+M(a.ei)+'"><img src="'+M(Ld(a.xb))+'" class="ab_"/></div>'+ +(a.description?'<div class="eb_" id="'+M(a.Hi)+'">'+G(a.description)+"</div>":"")),Ea:I(""+G(c)),Z:224,ga:20})):G(c))+"</div>";return F(b)};var Bh=function(a){var b;return F('<tr class="i_">'+Ah(a)+"<td>"+K(null==(b=a.ma)?"":b)+'</td><td class="fb_">'+G(a.Wb)+"</td></tr>")},Ah=function(a){return F('<td class="gb_"><div style="position: relative;"><div style="position: absolute; max-width: 100%; white-space: nowrap;">'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("hb_"),Za:a.Dd}))+"</div><div> </div></div></td>")},Ch=function(a){var b;return F('<tr class="i_">'+Ah(a)+"<td>"+K(null==(b=a.ma)?"":b)+"</td><td><div>"+G(a.Wb)+'</div><div class="ib_">'+ +G(a.ua)+'</div></td><td class="jb_">'+K(Sd({href:a.Ja,content:"Buy",A:a.Ma,qa:xd("s_ kb_ lb_")}))+"</td></tr>")},Dh=function(a){return ud(".i_ {border-bottom: 1px solid #ebebeb; vertical-align: middle;}.i_ td {padding: 7px 4px 7px 0;}.gb_ {width: 40%;}.i_ .fb_ {text-align: right; padding: 7px 0; font-weight: bold;}.hb_ {text-decoration: none; color: "+P(a.linkColor)+"; display: block; overflow: hidden; text-overflow: ellipsis;}.hb_:hover {text-decoration: underline;}")},Eh=function(a){var b;a=a|| +{};return F('<tr class="i_">'+Ah(a)+'<td class="fb_"><div class="mb_">'+G(a.Wb)+'</div><div class="ib_">'+K(null==(b=a.ua)?"":b)+'</div></td><td class="nb_"><div class="ob_">'+K(null==(b=a.ma)?"":b)+"</div></td></tr>")},Fh=function(a){return ud(".i_ {border-bottom: 1px solid #ebebeb; vertical-align: middle;}.i_ td {height: 50px; padding-right: 4px;}.gb_ {width: 40%;}.i_ .jb_ {text-align: right; padding-right: 0;}.kb_.lb_ {padding: 0 8px; min-width: 54px; height: 27px; line-height: 27px;}.hb_ {text-decoration: none; color: "+ +P(a.linkColor)+"; display: block; overflow: hidden; text-overflow: ellipsis;}.hb_:hover {text-decoration: underline;}.ib_ {color: #7d7d7d; font-size: 80%;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var Gh=function(a,b){this.bg=a;this.maxHeight=b},Hh=new Gh(10,350),Ih=new Gh(20,700),Jh=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.Ee=a;this.P=b;this.T=c;this.pe=d;this.pj=e;this.dk=f;this.wj=g+" \u25bc";this.mj=h+" \u25b2";this.re=l;this.We=r;this.gk=y;this.D=C;this.Ab=u;this.Ab.height=Math.min(this.Ab.height,this.re.maxHeight);this.Ab.width=Math.min(this.Ab.width,1E3);this.yh=R();this.kg=R();this.Sf=R();this.Qf=R();this.yg=R()};Jh.prototype.j=function(){return this.D({xb:this.Ee, +title:this.P,description:this.T,ha:this.pe,sh:this.dk,ah:this.We.j(),si:this.Ab.width,uh:this.gk,Oc:this.yh,Hi:this.kg,Rf:this.Sf,ei:this.Qf,Xi:this.yg})};Jh.prototype.Vi=function(a){return T(a,"adBlock").offsetWidth};Jh.prototype.Mj=function(a){this.uk(a);var b=T(a,this.Sf).offsetHeight,b=b+2*this.re.bg;this.We.Cj(a,this.Ab.height-b);this.We.Zd(a)};Jh.prototype.uk=function(a){var b=T(a,this.yh);ng(b,3);if(b=a.getElementById(this.kg)){var c=Je(T(a,this.Qf)),c=c+2*this.re.bg;Je(T(a,this.yg));og(b, +this.Ab.height-c-50,this.wj,this.mj,this.pj)}};var Kh=function(a,b,c,d){var e,f,g,h=[],l=null,r=a.lc||"#0651cf";switch(a.id){case 1:case "SMALL_FORMAT":e=Bh;f=vh;g=yh;h.push(Dh({linkColor:r}));h.push(ud(wh({fontSize:12})));h.push(ud("#adBlock {font-family: arial; font-size: 0; width: 300px; background: white;}.h_ {font-size: 18px; font-weight: bold; color: #222222; word-wrap: break-word;}.xa_ {padding: 9px; border: 1px solid #e0e0e0;}.ab_ {max-width: 67px; max-height: 67px; vertical-align: middle;}.za_ {width: 67px; height: 67px; border: 1px solid #eeeeee; text-align: center; line-height: 67px;}.bb_ {padding: 10px 0; font-size: 12px; font-weight: bold; color: #222222;}.cb_ {color: #787878; font-size: 13px;}")); +d&&(e=Eh,h.push(ud(".i_ .nb_ {padding: 7px 0; width: 46px;}.i_ .fb_ {text-align: left; padding-right: 4px;}.ib_ {color: #7d7d7d; font-size: 90%; font-weight: normal;}")));l=Hh;break;case 3:case "WIDE_FORMAT":e=Ch;f=vh;g=zh;h.push(Fh({linkColor:r}));h.push(ud(wh({fontSize:14})));h.push(ud("#adBlock {font-family: arial; font-size: 0; background: white;}.xa_ {padding: 19px; border: 1px solid #e0e0e0;}.ab_ {max-width: 222px; max-height: 222px; vertical-align: middle;}.za_ {width: 222px; height: 222px; border: 1px solid #eeeeee; text-align: center; line-height: 222px; margin-bottom: 20px;}.eb_ {font-size: 12px; line-height: 18px; color: #222222; word-wrap: break-word;}.db_ {padding-bottom: 20px;}.h_ {font-size: 18px; font-weight: bold; color: #222222; word-wrap: break-word;}.cb_ {color: #7d7d7d; font-size: 13px;}.bb_ {font-size: 14px; font-weight: bold; color: #222222; padding-bottom: 8px;}")); +l=Ih;break;default:return Na.log({message:"Jackpot block json failed to provide a known format."},"crjc"),null}var u=[];a.offers&&(u=ic(a.offers,function(a){return new uh(a.u,a.m,a.pr,a.s,d&&a.ppu?a.ppu:"",c,e)}));f=new xh(u,b.pt,b.sipt,b.nl,f);return new Jh(a.pd.i,a.pd.t,a.pd.d,d&&a.pd.er?a.pd.er:"",r,b.sl,b.m,b.l,l,f,new Wc(a.mw,a.mh),h,g)}};var Lh=function(a){var b='<div class="hc_ c_" id="'+M(a.Ug)+'"><div class="ic_">',c='<div class="mc_"><div style="position: absolute;" class="nc_">'+K(Sd({href:a.Ja,content:a.title,A:a.Ma,qa:xd("oc_"),Za:a.Oc}))+'</div><div id="'+M(a.Vg)+'" style="position: absolute; bottom: 0;">',c=c+('<div class="pc_" style="padding-bottom: '+M(P(a.Id&&(a.ma||a.ha||a.ua)?2:4))+'px;"><span class="mb_" title="'+M(a.Yg)+'">'+G(a.Wb)+"</span></div>"+(a.Id?(a.ma?'<div class="qc_" title="'+M(a.ma)+'">'+G(a.ma)+"</div>": +"")+(a.ha?'<div class="qc_" title="'+M(a.ha)+'">'+G(a.ha)+"</div>":"")+(a.ua?'<div class="qc_" title="'+M(a.ua)+'">'+G(a.ua)+"</div>":""):"")+'<div class="rc_">'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("sc_"),Za:a.Dd}))+"</div></div></div>"),b=b+K(mf({Da:I("<div>"+K(Sd({href:a.Ja,content:I('<div class="jc_" style="background-image:url('+M(Ld(a.xb))+');"><div class="bb_">'+G(a.$f)+"</div></div>"),A:a.Ma,qa:xd("lc_"),Za:a.Dg}))+"</div>"),Ea:I(c),Z:a.Fe,ga:a.xc}));return F(b+"</div></div>")},Mh=function(a){return ud(".hc_ {background: white; margin-right: "+ +P(a.yc)+"px; margin-bottom: "+P(a.yc)+"px;"+(a.og?P(Rd({value:yd("1px 2px 1px rgba(0, 0, 0, 0.1)")}))+"border: 1px solid #E0E0E0; box-sizing: border-box; border-radius: 3px;":P(Rd({value:yd("0 2px 1px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0, 0, 0, 0.1)")}))+"border-radius: 2px;")+"width: "+P(a.hi)+"px; height: "+P(a.gi)+"px;"+P(Qd())+"}.ic_ {"+(a.og?"padding: "+P(a.xc-1)+"px;":"padding: "+P(a.xc)+"px;")+"position: relative;}.lc_ {text-decoration: none;}.jc_ {width: "+P(a.Fe)+"px; height: "+P(a.bj)+"px; background-repeat: no-repeat; background-position: center; background-size: contain; cursor: pointer; position: relative;}.mc_ {position: relative; height: "+ +P(a.Bi)+"px;}.oc_ {color: "+P(a.nk)+"; font-size: "+P(a.qk)+"px; text-decoration: none;}.nc_ {width: "+P(a.jd)+"px; word-wrap: break-word;}.mb_ {font-size: "+P(a.Ij)+"px; font-weight: bold; color: "+P(a.Xg)+";}.pc_ {color: "+P(a.Xg)+"; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: "+P(a.jd)+"px;}.sc_ {color: "+P(a.Lg)+"; text-decoration: none;}.rc_ {font-size: "+P(a.tj)+"px; padding-bottom: 2px; color: "+P(a.Lg)+"; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: "+ +P(a.jd)+"px;}.bb_ {font-size: 13px;"+P(Qd())+"text-decoration: none; background-color: #555555; position: absolute; bottom: 1px; left: 1px; padding: 0 3px; color: white; border-radius: 2px;}.qc_ {font-size: 12px; color: #777777; padding-bottom: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: "+P(a.jd)+"px;}")};var Nh=function(a){var b='<div class="hc_ c_" id="'+M(a.Ug)+'"><div class="ic_"><div>'+K(Sd({href:a.Ja,content:I('<div class="jc_" style="background-image:url('+M(Ld(a.xb))+');"><div class="bb_">'+G(a.$f)+"</div></div>"),A:a.Ma,qa:xd("lc_"),Za:a.Dg}))+'</div><div class="mc_"><div style="position: absolute;" class="nc_">'+K(Sd({href:a.Ja,content:a.title,A:a.Ma,qa:xd("oc_"),Za:a.Oc}))+'</div><div id="'+M(a.Vg)+'" style="position: absolute; bottom: 0;">',b=b+('<div class="pc_" style="padding-bottom: '+ +M(P(a.Id&&(a.ma||a.ha||a.ua)?2:4))+'px;"><span class="mb_" title="'+M(a.Yg)+'">'+G(a.Wb)+"</span></div>"+(a.Id?(a.ma?'<div class="qc_" title="'+M(a.ma)+'">'+G(a.ma)+"</div>":"")+(a.ha?'<div class="qc_" title="'+M(a.ha)+'">'+G(a.ha)+"</div>":"")+(a.ua?'<div class="qc_" title="'+M(a.ua)+'">'+G(a.ua)+"</div>":""):"")+'<div class="rc_">'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("sc_"),Za:a.Dd}))+"</div></div></div></div></div>");return F(b)},Oh=function(a){return ud(P(Mh(a))+".jc_ {margin-bottom: "+ +P(a.xc)+"px;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ph=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.mi=c;this.Me=d;this.P=a.t;this.Qe=a.m;this.cf=a.pr;this.Ee=a.i;this.Nd=a.s;this.Qd=a.ppu;this.pe=a.er;this.Pj=u;this.Yi=b.h;this.yk=b.w;this.Ie=e;this.Hg=f;this.cj=b.ih;this.Eg=b.iw;this.jg=g;this.Ci=h;this.rk=b.ts;this.uj=b.ms;this.Jj=b.ps;this.pk=b.tc;this.sj=b.mc;this.Hj=b.pc;this.Xe=l;this.Ki=r;this.fk=y;this.D=C;this.Ag=R();this.Cg=R();this.vf=R();this.Cd=R();this.Wg=R()};k=Ph.prototype;k.j=function(){return this.D({Ug:this.Ag, +$f:this.mi,Ja:this.Me,xb:this.Ee,Dg:this.Cg,title:this.P,Oc:this.vf,Wb:this.cf,Ed:this.Qe,Dd:this.Cd,Vg:this.Wg,Fe:this.Eg,xc:this.Hg,Yg:this.Ai(),Ma:this.Xe,ma:this.Nd,ua:this.Qd,ha:this.pe,Id:this.Pj})};k.Ui=function(){return this.fk({hi:this.yk,gi:this.Yi,yc:this.Ie,xc:this.Hg,bj:this.cj,Fe:this.Eg,Bi:this.jg,jd:this.Ci,qk:this.rk,tj:this.uj,Ij:this.Jj,nk:this.pk,Lg:this.sj,Xg:this.Hj,og:this.Ki})};k.Ai=function(){return hc([this.Qd,this.Nd],ca).join("\n")};k.Bh=function(a){var b=a.document.getElementById(this.Wg); +b&&mg(a.document.getElementById(this.vf),this.jg-(b.offsetHeight+4));this.ic&&this.ic.Bh(a)};k.Xf=function(a){this.ic&&this.ic.Xf(a)};k.vg=function(a){return T(a,this.Ag)};k.wg=function(a){var b=this.ic?this.ic.wg(a):[];return[new Ze(T(a,this.vf),"&nb=0"),new Ze(T(a,this.Cd),"&nb=1"),new Ze(T(a,this.Cg),"&nb=9")].concat(b)};var Qh=function(a,b,c,d,e,f,g){var h=db(a.u),l=new Wc(b.w,b.h),r=new Wc(b.iw,b.ih),u=Math.floor((l.height-r.height)/2);return new Ph(a,b,c,h,d,u,r.height,l.width-(3*u+r.width), +e,f,g,Mh,Lh)},Rh=function(a,b,c,d,e,f,g){var h=db(a.u),l=new Wc(b.w,b.h),r=new Wc(b.iw,b.ih),u=Math.floor((l.width-r.width)/2);return new Ph(a,b,c,h,d,u,l.height-(3*u+r.height),r.width,e,f,g,Oh,Nh)}};var Sh=function(a){var b='<div style="display: none;" id="_googAFShPLAs"></div><style>'+ud("#adBlock {width: "+P(a.width)+"px; font-size: 0;}.fc_ {background-color: "+P(a.backgroundColor)+"; font-family: "+P(a.fontFamily)+";}.gc_ {padding-top: "+P(a.yc)+"px; padding-left: "+P(a.yc)+"px;}"+P(a.dj))+'</style><div class="fc_"><div class="gc_">';a=a.Sj;for(var c=a.length,d=0;d<c;d++)b+=G(a[d]);return F(b+"</div></div>")};if(window.IS_GOOGLE_AFS_IFRAME_){var Th=function(a,b,c,d,e,f,g){this.Vb=a;this.kh=b;this.Ie=c;this.ni=d;this.Mi=e;this.ej=f;this.D=g};Th.prototype.j=function(){for(var a=[],b=0;b<this.Vb.length;b++)a.push(this.Vb[b].j());return this.D({Sj:a,width:this.kh.width,dj:this.ej,yc:this.Ie,backgroundColor:this.ni,fontFamily:this.Mi})};Th.prototype.Ti=function(){return this.kh};Th.prototype.Ri=function(){return this.Vb};Th.prototype.ji=function(a){for(var b=0;b<this.Vb.length;b++)this.Vb[b].Bh(a),this.Vb[b].Xf(a.document)}};var Uh=function(a){var b,c=0;b='<div class="SponsoredLinksBoxNoBorder"><div style="margin-left:2px"><div class="SponsoredLinksContentWrapper" id="A9AdsWidgetAdsWrapper"><div class="SponsoredLinksAdBox"><table id="SponsoredLinksTable" class="SponsoredLinkColumnAds"><tbody>';for(var d=a.ads,e=d.length,f=0;f<e;f++){var g=d[f];b+='<tr class="a_ c_"><td valign="top"><span style="white-space:nowrap; padding-right:18px">'+(1==a.ads.length?'<span class="SponsoredLinkYellowBlockEnclosure"><span class="SponsoredLinkYellowBlock"> </span> </span>': +'<span class="SponsoredLinkNumberItem">'+K(++c)+". </span>")+'<span class="SponsoredLinkTitle"> <a target="_blank" href="'+Q(g.u)+'" rel="nofollow" class="d_"><b>'+Q(g.cleanTitle)+'</b></a> <a rel="nofollow" href="'+Q(g.u)+'" target="_blank" class="f_"><img width="23" height="20" border="0" align="absbottom" style="padding-bottom:0px; margin-bottom:0px; display:inline;" alt="opens new browser window" src="//afs.googleusercontent.com/amazon/icon-offsite-sl-7069-t4._V171196157_.png"></a></span></span></td><td><span class="SponsoredLinkDescription" style="white-space:normal; padding-left:0px"><span style="padding-right:10px;" class="SponsoredLinkDescriptionText">'+ +Q(g.l1)+" "+Q(g.l2)+'</span></span> <span class="SponsoredLinkDescription" style="padding-left:0px"><a class="SponsoredLinkDescriptionUrlLink" rel="nofollow" href="'+Q(g.u)+'" target="_blank" class="e_">'+Q(g.v)+"</a></span></td></tr>"}return b+"</tbody></table></div></div></div></div><style>#adBlock {font-size: 13px;}#adBlock a:hover {text-decoration: none;}#SponsoredLinksTable {width: 100%;}#sponsoredLinks {font-family: verdana,arial,helvetica,sans-serif;}.SponsoredLinksBoxNoBorder td, .SponsoredLinksBoxNoBorder th{font-family: verdana,arial,helvetica,sans-serif;}.SponsoredLinksBoxNoBorder a {color: #004B91; font-family: verdana, arial,helvetica,sans-serif;}.SponsoredLinksBox td, .SponsoredLinksBox th{font-family: verdana,arial,helvetica,sans-serif;}.SponsoredLinksBox a {color: #004B91; font-family: verdana, arial,helvetica,sans-serif;}.SponsoredFeedbackDiv{display: block; font-size: 90%; padding-left: 2px; padding-top: 5px;}.SponsoredLinkDescriptionUrlLink:link, #sponsoredLinks .SponsoredLinkDescriptionUrlLink:link {color: black; font-weight: normal; text-decoration: none;}.SponsoredLinkDescriptionUrlLink:visited, #sponsoredLinks .SponsoredLinkDescriptionUrlLink:visited {color: black; font-weight: normal; text-decoration: none;}.SponsoredLinkDescriptionUrlLink:hover, #sponsoredLinks .SponsoredLinkDescriptionUrlLink:hover {color: black; font-weight: normal; text-decoration: none;}.SponsoredLinksBox{height: auto; padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 10px; margin-top: 0px; margin-bottom: 10px; border: 1px solid #D0EAF8;}.SponsoredLinksBoxNoBorder{height: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px; margin-top: 0px; border: none;}.SponsoredLinkYellowBlock {position: absolute; background-color: #db9234; width: 4px; height: 4px; margin-right: 2px; margin-left: 2px; margin-top: 9px; left: 0px; line-height: 1px;}#sponsoredLinks {width: 100%; padding-top: 4px;}.SponsoredLinkYellowBlockEnclosure {position: relative; margin-right: 2px;}.SponsoredLinkContentDeclaration {text-align: right; padding-right: 20px; color: #C2C2C2}.SponsoredLinksBottomBox {padding-top: 5px; padding-right: 20px;}.SponsoredLinksAdvertiseYourServices {font-size: 90%; float: right;}#sponsoredLinks a:link, #sponsoredLinks a:visited {text-decoration: underline;}.SponsoredLinksSearchSeperator {margin-top: 6px; border-bottom: 1px dotted gray;}.SponsoredLinkDescriptionUrlLink {white-space: nowrap;}.SponsoredLinkNumberItem {font-family: verdana; color: #666666; font-size: 110%;}.SponsoredLinkNumberItemEnclose {padding-top: 3px;}.SponsoredLinksAdBox{padding: 0px; margin: 0px;}.SponsoredLinksAdBox ul {list-style-type: none; padding-left: 0px; margin-left: 0px;}.SponsoredLinksAdBox ul li {clear: both; margin-top: 10px; padding-left: 5px; border: 0px solid #ffcc00;}.SponsoredLinksAdBox ul li span{float: left; padding: 0 0 0 0}.SponsoredLinksAdBox ul li div{float: left; padding: 0 10px 0 0}.SponsoredLinksAdBox .SponsoredLinkTitle {font-size: 125%; white-space: nowrap; min-width: 250px; padding-left: 0px; padding-bottom: 5px}.SponsoredLinksAdBox .SponsoredLinkTitle a:hover {color: #CC6600;}.SponsoredLinksAdBox .SponsoredLinkTitle a {font-family: arial;}.SponsoredLinksAdBox .SponsoredLinkDescription{font-size: 115%; color: #000; min-width: 240px; white-space: nowrap; padding-left: 18px; padding-top: 3px; font-family: arial;}.SponsoredLinksAdBox .SponsoredLinkDescription a:link {color: black; text-decoration: none; font-family: arial;}table.SponsoredLinkColumnAds td {padding-bottom: 12px;}</style>"}, +Vh=function(a){for(var b='<div id="AUI_A9AdsWidgetAdsWrapper"><table class="AUI_SponsoredLinkColumnAds" style="width:auto; margin-right:40px;"><tbody>',c=a.ads,d=c.length,e=0;e<d;e++)var f=c[e],b=b+('<tr class="a_ c_"><td><ul><li><div class="AUI_SponsoredLinkTitle"><a class="a-size-medium" style="font-size:15px; padding-top:3px; display:inline-block;" target="_blank" href="'+Q(f.u)+'" rel="nofollow">'+(a.options.amazonGrayBullets?"<b>"+Q(f.t)+"</b>":"<b>"+Q(f.cleanTitle)+"</b>")+'</a> <a target="_blank" href="'+ +Q(f.u)+'" rel="nofollow"><img src="//afs.googleusercontent.com/amazon/icon-offsite-sl-7069-t4._V171196157_.png" width="23" alt="opens new browser window" align="absbottom" style="padding-bottom:0px; margin-bottom:0px;" height="20" border="0"></a></div></li></ul></td><td><div class="AUI_SponsoredLinkDescriptionDIV"><span style="padding-top:2px; display:inline-block;"> - </span></div></td><td><div class="AUI_SponsoredLinkDescriptionDIV"><span class="a-size-base" style="padding-top:2px; display:inline-block;">'+ +Q(f.l1)+" "+Q(f.l2)+'</span></div></td><td style="padding-left: 10px;"><div class="AUI_SponsoredLinkDescriptionDIV"><a class="a-size-base" style="padding-top:2px; display:inline-block;" target="_blank" href="'+Q(f.u)+'" rel="nofollow"><span class="a-color-secondary">'+Q(f.v)+"</span></a></div></td></tr>");return b+="</tbody></table></div><style>#adBlock {margin-top: 10px;}* {-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;}body {font-size: 13px; line-height: 19px; color: #333; font-family: Arial,sans-serif;}"+ +(a.options.amazonGrayBullets?"":"#AUI_A9AdsWidgetAdsWrapper table {margin-left: 27px; font-family: verdana,arial,helvetica,sans-serif;}")+"table:last-child {margin-bottom: 0!important;}table {margin-bottom: 18px; border-collapse: collapse; width: 100%;}tr:first-child td, tr:first-child th {padding-top: 0;}td:first-child, th:first-child {padding-left: 0;}td, th {padding: 3px;}td, th {vertical-align: top;}td:last-child, th:last-child {padding-right: 0;}ul:last-child, ol:last-child {margin-bottom: 0!important;}ul, ol {padding: 0;}ul {margin: 0 0 18px 18px; color: #aaa;}ul li {"+ +(a.options.amazonGrayBullets?"":"color: #db9234;")+"}ul li, ol li {word-wrap: break-word; margin: 0;}ul li {list-style: disc;}a, a:visited, a:active, a:link {text-decoration: none; color: #0066c0;}.a-size-medium {font-size: 17px!important; line-height: 1.255!important; font-family: Arial,sans-serif; text-rendering: optimizeLegibility;}a:hover {text-decoration: underline; cursor: pointer; color: #e47911;}.a-size-base {font-size: 13px!important; line-height: 19px!important;}.a-color-secondary {color: #888!important;}img {vertical-align: top;}img {max-width: 100%; border: 0; -ms-interpolation-mode: bicubic;}</style>"};var Wh=function(a){var b,c=0;b='<table class="adsWrapper"><tbody>';for(var d=a.ads,e=d.length,f=0;f<e;f++){var g=d[f];b+='<tr class="a_ c_"><td><div class="leftColumnContentWrapper"><span class="number">'+K(++c)+'. </span><span class="title"> <a target="_blank" href="'+M(O(g.u))+'" rel="nofollow" class="titleLink d_"><span class="titleText">'+G(g.t)+'</span></a> <a rel="nofollow" href="'+M(O(g.u))+'" target="_blank" class="f_"><img width="23" height="20" class="icon" src="//afs.googleusercontent.com/amazon/icon-offsite-sl-7069-t4._V171196157_.png"></a></span></div></td><td><div class="rightColumnContentWrapper"><span class="description">'+ +G(g.l1)+" "+G(g.l2)+'</span> <a class="domainLink e_" rel="nofollow" href="'+M(O(g.u))+'" target="_blank">'+G(g.v)+"</a></div></td></tr>"}b+="</tbody></table><style>"+P(a.nc)+"</style>";return F(b)},Xh=function(a){for(var b='<table class="adsWrapper"><tbody>',c=a.ads,d=c.length,e=0;e<d;e++)var f=c[e],b=b+('<tr class="a_ c_"><td><ul class="leftColumnContentWrapper"><li><div class="title"><a class="titleLink d_" target="_blank" href="'+M(O(f.u))+'" rel="nofollow"><span class="titleText">'+G(f.t)+ +'</span></a> <a target="_blank" href="'+M(O(f.u))+'" rel="nofollow" class="f_"><img src="//afs.googleusercontent.com/amazon/icon-offsite-sl-7069-t4._V171196157_.png" height="20" width="23" class="icon"></a></div></li></ul></td><td><div class="descriptionWrapper">'+G(f.l1)+" "+G(f.l2)+'</div><div class="domainLinkWrapper"><a class="domainLink e_" target="_blank" href="'+M(O(f.u))+'" rel="nofollow"><span class="domainLinkText">'+G(f.v)+"</span></a></div></td></tr>");b+="</tbody></table><style>"+ +P(a.nc)+"</style>";return F(b)},Yh=function(a){var b;b='<table class="adsWrapper"><tbody>';for(var c=a.ads,d=c.length,e=0;e<d;e++){var f=c[e];b+='<tr class="a_ c_"><td><ul class="leftColumnContentWrapper"><li><div class="title"> <a target="_blank" href="'+M(O(f.u))+'" rel="nofollow" class="titleLink d_"><span class="titleText">'+G(f.t)+'</span></a> <a rel="nofollow" href="'+M(O(f.u))+'" target="_blank" class="f_"><img width="23" height="20" class="icon" src="//afs.googleusercontent.com/amazon/icon-offsite-sl-7069-t4._V171196157_.png"></a></div></li></ul></td><td><div class="rightColumnContentWrapper"><span class="description">'+ +G(f.l1)+" "+G(f.l2)+'</span> <a class="domainLink e_" rel="nofollow" href="'+M(O(f.u))+'" target="_blank">'+G(f.v)+"</a></div></td></tr>"}b+="</tbody></table><style>"+P(a.nc)+"</style>";return F(b)},Zh=function(a){for(var b='<table class="adsWrapper"><tbody>',c=a.ads,d=c.length,e=0;e<d;e++)var f=c[e],b=b+('<tr class="a_ c_"><td><ul class="leftColumnContentWrapper"><li><div class="title"><a class="titleLink d_" target="_blank" href="'+M(O(f.u))+'" rel="nofollow"><span class="titleText">'+G(f.t)+ +'</span></a> <a target="_blank" href="'+M(O(f.u))+'" rel="nofollow" class="f_"><img src="//afs.googleusercontent.com/amazon/icon-offsite-sl-7069-t4._V171196157_.png" height="20" width="23" class="icon"></a></div></li></ul></td><td><div class="dash"> - </div></td><td><div class="middleColumnContentWrapper">'+G(f.l1)+" "+G(f.l2)+'</div></td><td><div class="rightColumnContentWrapper"><a class="domainLink e_" target="_blank" href="'+M(O(f.u))+'" rel="nofollow"><span class="domainLinkText">'+ +G(f.v)+"</span></a></div></td></tr>");b+="</tbody></table><style>"+P(a.nc)+"</style>";return F(b)},$h=function(a){var b,c=0;b='<ul class="columnContentWrapper">';for(var d=a.ads,e=d.length,f=0;f<e;f++){var g=d[f];b+='<li class="a_ c_"><div class="columnContentItem"><div class="sponsoredLinkNumberContainer"><span class="sponsoredLinkNumberItem">'+K(++c)+'. </span></div><div class="sponsoredLinkContentContainer"><div><a class="titleLink d_" target="_blank" href="'+M(O(g.u))+'" rel="nofollow"><span class="titleText">'+ +G(g.t)+'</span></a></div><div><a class="domainLink e_" target="_blank" href="'+M(O(g.u))+'" rel="nofollow"><span class="domainLinkText">('+G(g.v)+')</span></a></div><div class="description">'+G(g.l1)+" "+G(g.l2)+"</div></div></div></li>"}b+="</ul><style>"+P(a.nc)+"</style>";return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_)var ai=function(a,b){b=b||130;var c=b+Math.max(1.5*b,160),d=a.document.getElementById("wideSfbl"),e=a.document.getElementById("narrowSfbl");d&&e&&(Ie(a.document.body,!1)<c?(d.style.display="none",e.style.display="block"):(d.style.display="block",e.style.display="none"));for(var c=Zd(a.document,"div","wideSitelinksWrapper_js"),d=Zd(a.document,"div","narrowSitelinksWrapper_js"),e=Zd(a.document,"div","sitelinksWrapper_js"),f=null,g=0,h;h=e[g];g++)if(0<h.offsetWidth){f= +h;break}if(f&&260>Ie(f,!1)){for(g=0;h=c[g];g++)h.style.display="none";for(g=0;h=d[g];g++)h.style.display="block"}else{for(g=0;h=c[g];g++)h.style.display="block";for(g=0;h=d[g];g++)h.style.display="none"}};var bi=function(a){return'<div class="sfblSellerNameWrapper" title="'+G(a.B.visDomain)+'"><a class="sfblSellerNameLink" href="'+G(a.B.u)+'"'+me(a)+">"+Jf({text:a.B.nonBreakingVisDomain,Ia:!1,f:a.C.isRtl})+"</a></div>"+(a.B.pn?Hf({Hd:a.B.pn,f:a.C.isRtl,Ng:!1})+"<br />":"")+(a.Gg?'<div class="sfblSellerRatingsWrapper">'+Wf({Mc:a.B.sr})+"</div>":"")},ci=function(a){return""+(a.C.disableSellerFirstFavicon?bi({B:a.B,C:a.C,A:a.A,Gg:a.wd}):nf({Da:'<img src="'+G(a.B.furl)+'" class="sfblFavicon"/>',Ea:""+ +bi({B:a.B,C:a.C,A:a.A,Gg:a.wd}),Z:18,ga:3,rb:a.C.isRtl}))+(a.wd?"":'<div class="sfblSellerRatingsWrapper">'+Wf({Mc:a.B.sr})+"</div>")},di=function(a){var b='<div class="sfblTitleWrapper"><a href="'+Q(a.B.u)+'" class="sfblTitleLink" '+me(a)+">"+Kf({text:a.B.tr,f:a.C.isRtl})+'</a></div><div class="sfblDescriptionWrapper">',c=a.B.l1r,d=a.B.l2r,e=a.C.isRtl,f="";if(d&&d.c)var g=c.rtl||d.rtl,f=f+Jf({Ia:g,f:e,text:Kf({text:c,f:g})+" "+Kf({text:d,f:g})});else f+=Kf({text:c,f:e});b=b+f+"</div>"+ig({be:a.B.cos, +f:a.C.isRtl})+Xg({Kd:a.B.ar,tb:a.B.gt&&"ar"==a.B.gt.r?a.B.gt.t:null,f:a.C.isRtl})+Rf({$e:a.B.plus_ones,A:a.A})+Lf({Ne:a.B.location,f:a.C.isRtl})+Of({Gd:a.B.oh,tb:a.B.gt&&"oh"==a.B.gt.r?a.B.gt.t:null,Hh:a.C.offerHighlightWithIcon});a=a.B.sls&&0<a.B.sls.length?F(cg({uid:"",na:a.B.sls,A:a.A,qh:"sfblSitelink",nh:"sfblSitelink",Ih:"sfblSitelinksWrapper"})):"";return b+a};var ei=window;var fi=!1,gi=function(a){if(a=a.match(/[\d]+/g))a.length=3}; +(function(){if(navigator.plugins&&navigator.plugins.length){var a=navigator.plugins["Shockwave Flash"];if(a&&(fi=!0,a.description)){gi(a.description);return}if(navigator.plugins["Shockwave Flash 2.0"]){fi=!0;return}}if(navigator.mimeTypes&&navigator.mimeTypes.length&&(fi=(a=navigator.mimeTypes["application/x-shockwave-flash"])&&a.enabledPlugin)){gi(a.enabledPlugin.description);return}try{var b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");fi=!0;gi(b.GetVariable("$version"));return}catch(c){}try{b= +new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");fi=!0;return}catch(c){}try{b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),fi=!0,gi(b.GetVariable("$version"))}catch(c){}})();var hi=D("Firefox"),ii=Ic()||D("iPod"),ji=D("iPad"),ki=D("Android")&&!(Hc()||D("Firefox")||Gc()||D("Silk")),li=Hc(),mi=D("Safari")&&!(Hc()||D("Coast")||Gc()||D("Edge")||D("Silk")||D("Android"))&&!(Ic()||D("iPad")||D("iPod"));var ni=function(a){return(a=a.exec(Dc))?a[1]:""};(function(){if(hi)return ni(/Firefox\/([0-9.]+)/);if(E||Kc||Jc)return Pc;if(li)return ni(/Chrome\/([0-9.]+)/);if(mi&&!(Ic()||D("iPad")||D("iPod")))return ni(/Version\/([0-9.]+)/);if(ii||ji){var a;if(a=/Version\/(\S+).*Mobile\/(\S+)/.exec(Dc))return a[1]+"."+a[2]}else if(ki)return(a=ni(/Android\s+([0-9.]+)/))?a:ni(/Version\/([0-9.]+)/);return""})();var oi=function(a,b){var c=b||ei;a&&c.top!=c&&(c=c.top);try{var d;if(c.document&&!c.document.body)d=new Wc(-1,-1);else{var e=(c||window).document,f="CSS1Compat"==e.compatMode?e.documentElement:e.body;d=(new Wc(f.clientWidth,f.clientHeight)).round()}return d}catch(g){return new Wc(-12245933,-12245933)}};if(window.IS_GOOGLE_AFS_IFRAME_){var pi=new lb("ijsp"),qi={},ri=null,si=new w("iframe"),ti={Nf:0,Yh:2,Vc:3,Sc:6},ui={ads:ti.Nf,rss:ti.Yh,pbs:ti.Vc,jb:ti.Sc},vi={twocolumnnumbered:Wh,threecolumnbulleted:Zh,twocolumnbulleted:Xh,twocolumnbulletedserp:Yh,onecolumnnumbered:$h},wi={bulleted:Vh,numbered:Uh},xi={0:"ad-left",1:"title-right"},yi={0:"off",1:"low",2:"med",3:"high"},W={},zi={},Ai=function(a){!ri&&a.name&&(ri=(a=a.name.match(/master-(\d+)/))&&a[1]?a[1]:null);ri||(ri=-1);return ri},Ai=m(Ai,"gMN"), +$g=function(a,b){return b.sellerFirstBoxLeft||"sellerfirst"==a.adLayout&&b.isDesktop},$g=m($g,"sGSFU"),Bi=function(a,b){try{return Je(a.document.getElementById(b))}catch(c){return null}},Bi=m(Bi,"gBH"),Ci=function(a,b){try{return Ie(a.document.getElementById(b),!1)}catch(c){return null}},Ci=m(Ci,"gBW"),Ei=function(a,b){var c=[],d=[],e;for(e in a){var f=Di(e,b);null==f?delete a[e]:(c.push(e),d.push(f))}return{frames:d,names:c}},Ei=m(Ei,"cFr"),Hi=function(a){var b=Ei(qi,a).names,c;for(c in b){Fi(Di(b[c], +a),b[c]);var d=Gi(b[c],a);ai(Di(b[c],a),d.sellerColumnWidth)}},Hi=m(Hi,"aPE"),Ii=function(a){var b=Zd(a.document.getElementById("adBlock"),"a","d_");return 0<b.length?($d(a.document,b[0],"font-size")||"").replace("px",""):""},Ii=m(Ii,"gtfs"),Ki=function(a){var b=Ei(qi,a),c=b.names,b=b.frames;a=Ji(b,ha(Ki,a));for(var d=0;d<a.length;d++){var e=c[d];null!=a[d]&&si.Yb(e+".h",a[d]);var f=Ii(b[d]);f&&si.Zb(e+".tfs",f)}Nb(si)},Ki=m(Ki,"sPH"),Li=function(a,b){Hi(a,b);Ki(a)},Li=m(Li,"oR"),Mi={d_:"&nb=0",sfblTitleLink:"&nb=0", +e_:"&nb=1",sfblSellerNameLink:"&nb=1",sl:"&nb=6",sfblSitelink:"&nb=6",textLink:"&nb=7",nArr:"&nb=8",ctcBtnLink:"&nb=14",f_:"&nb=9"},Ni=function(a){var b=[];a=a.getElementsByTagName("a");for(var c=0,d;d=a[c];c++){var e;var f=document;try{var g=$d(f,d,"display");e=null!=g&&"none"!=g}catch(l){e=!1}if(e)for(var h in Mi)if(Wd(d,h)){b.push(new Ze(d,Mi[h]));break}}return b},Ni=m(Ni,"gTASSL"),Fi=function(a,b){var c=a.document.getElementById("attribution"),d=a.document.getElementById("adsLabel"),e=a.document.getElementById("megaLabel"); +if(d||e){var f;zi[b]?f=zi[b]:(f=20,e?f+=Me(e).width:d&&(f+=Me(d).width,c&&(f+=Me(c).width,f+=20)),zi[b]=f);var g=T(a.document,"adBlock"),g=Le(g);f>g?e?(e.style.display="none",c?c.style.display="":e.parentNode.style.display="none"):(d.style.display="none",c||(d.parentNode.style.display="none")):e?(e.style.display="",e.parentNode.style.display="",c&&(c.style.display="none")):(d.style.display="",d.parentNode.style.display="")}},Fi=m(Fi,"aH"),Oi=function(a){var b="master-"+Ai(a);a=Di(b,a);b="";if(a)try{b= +a.document.documentElement.lang}catch(c){}return b},Oi=m(Oi,"gMIHL"),Pi=function(a,b){try{if(a&&a.document.getElementsByTagName("html")){var c;(c=a.document.getElementsByTagName("html")[0])&&!c.lang&&(c.lang=b)}}catch(d){}},Pi=m(Pi,"sSIHL"),Ri=function(a,b,c){a=a.document.getElementsByTagName("table");for(var d=a.length,e=0;e<d;e++){var f=a[e];Wd(f,"sl-table")&&!Wd(f.parentNode,"invisible")&&Qi(f,b,c)}},Ri=m(Ri,"aSL"),Si=function(a){if(a instanceof Array){for(var b=0;b<a.length;b++)if(Si(a[b]))return!0; +return!1}return a.offsetHeight>Me(a).height},Si=m(Si,"iW"),Ti=function(a){for(;0<a.length;){var b=a.pop();b&&b.parentNode.removeChild(b)}},Ti=m(Ti,"rLON"),Qi=function(a,b,c){for(var d=a.getElementsByTagName("div"),e=[],f=[],g=0,h;h=d[g];g++)"sl-left"==h.className&&3>e.length?e.push(h):"sl-right"==h.className&&3>f.length&&f.push(h);for(d=[];0<e.length;)0<f.length?d.push([e.shift(),f.shift()]):d.push([e.shift()]);b?Ui(a,d):Vi(a,d,c);Wi(a,"visibility","visible")},Qi=m(Qi,"aSL"),Vi=function(a,b){for(var c= +a.getElementsByTagName("a").length;1<b.length&&Si(b);)Ti(b.pop());1==b.length&&Ui(a,b);var d=Zd(a.parentNode,"div","g_");if(1==d.length){var d=d[0],e=a.getElementsByTagName("a").length;if(e<c&&3>e){c=Le(d)-15;125>c&&(c=125);for(var f=d.getElementsByTagName("div"),g=0,h=0,l;l=f[h];h++)Me(l).width<=c&&3>g?g++:l.style.display="none";g>e?(Wi(d,"visibility","visible"),a.style.display="none"):d.style.display="none"}else d.style.display="none"}},Vi=m(Vi,"uS"),Ui=function(a,b){var c=b.shift();if(c){for(;0< +b.length;)Ti(b.pop());c[1]&&(Si(c)||(Yd(c[0].firstChild,"l"),Yd(c[1].firstChild,"r"),c[0].innerHTML+=" - "+c[1].innerHTML),c[1].parentNode.removeChild(c[1]),c.pop());a.className="sl-table-ol";c[0].className="sl-left-ol";Si(c[0])&&Ti(c)}},Ui=m(Ui,"hSLS"),Xi=function(a,b){return Le(a)<b},Xi=m(Xi,"sHNE"),Yi=function(a){return ra()&&!a},Yi=m(Yi,"rCS"),Zi=function(a){var b=[],c=a.indexOf("<a");-1!=c?b=b.concat([a.substring(0,c+3),"TARGET",a.substring(c+2)]):b.push(a);return b},Zi=m(Zi,"pPSTA"),$i=function(a){for(var b= +0,c;c=a[b];b++)c.plus_ones&&(c.plus_ones=Zi(c.plus_ones))},$i=m($i,"aPOT"),Gi=function(a,b){var c=b[a];c||(Na.log({message:"frameOptions is undefined for "+a},"fAU"),c={});return c},Gi=m(Gi,"gFO"),aj=function(a,b,c,d,e,f,g){e=Gi(b,e);var h=Ub(e);if(d.hasOwnProperty("gbrs"))b:{var l=g.ipa,r=!!f.fillPlaEuData,u=null,y=null;g=d.gbrs;if(g.hasOwnProperty("scrs"))u=Rh,y=g.scrs;else if(g.hasOwnProperty("fcrs"))u=Qh,y=g.fcrs;else{Na.log({message:"PLA grid render spec failed to provide a valid format."},"crpGc"); +d=S;break b}for(var C=y.bc,H=C&&"#ffffff"==C.toLowerCase(),J=ud(y.ff),L=g.i,ua=[],ka=0;ka<d.plas.length;ka++)ua.push(u(d.plas[ka],y,l,L,h,H,r));d=new Wc(y.w,y.h);d=0==ua.length?S:new Th(ua,new Wc(L+g.c*(d.width+L),L+g.r*(d.height+L)),L,C,J,ua[0].Ui(),Sh)}else Na.log({message:"PLA block json failed to provide a known render spec."},"crpBc"),d=S;bh(d.j(),a,c);d.ji(a);si.Yb(b+".w",d.Ti().width);d=d.Ri();for(h=0;h<d.length;h++)$e(d[h].wg(a.document),d[h].vg(a.document),c,f);a=Cb(b);jh(e,c,a,f)},aj=m(aj, +"fP"),cj=function(a,b,c,d,e,f,g){e=Gi(b,e);var h={};bj(g.msgs,h);if(d=Kh(d,h,Ub(e),!!f.fillSingleProductEuData))bh(d.j(),a,c),d.Mj(a.document),si.Yb(b+".w",d.Vi(a.document)),a=Cb(b),jh(e,c,a,f)},cj=m(cj,"fJ"),ej=function(a,b,c,d,e,f){if(!f.cstaEnabled)return!1;e=Gi(b,e);var g=e.domTemplate;if(!da(g)||!vi.hasOwnProperty(g.toLowerCase()))return!1;var h="";f.css&&(h=ud(f.css));for(var l=0;l<d.length;l++)d[l].u=sd(d[l].u),d[l].t=F(d[l].t),d[l].v=F(d[l].v),d[l].l1=F(d[l].l1),d[l].l2=F(d[l].l2);bh((0,vi[g.toLowerCase()])({ads:d, +nc:h}),a,c);dj(c,f);a=Cb(b);jh(e,c,a,f);return!0},ej=m(ej,"fCA"),fj=function(a,b,c,d,e,f){if(!f.amazonTemplateEnabled)return!1;e=Gi(b,e);var g=e.amazonTheme;if(!wi.hasOwnProperty(g))return!1;bh((0,wi[g])({ads:d,options:e}),a,c);dj(c,f);a=Cb(b);jh(e,c,a,f);return!0},fj=m(fj,"fAA"),hj=function(a,b,c,d,e,f,g){e=Gi(b,e);for(var h=g.attr,l=null,r=null,u=null,y=f.rhsAttribution&&e.rightHandAttribution||f.isHighendMobile&&!1!==e.rightHandAttribution,C=y&&!f.isHighendMobile,H=!1,J=0;J<d.length&&!H;J++)if(d[J].ctc|| +d[J].ctd)H=!0;var J=0!=e.domainLinkAboveDescription,L=e.type||"ads",ua=!1,ka=g.iaa,la=null,qa=null,eb=null,eb=g.vw;null!=ka&&(la=ka.t,qa=ka.b,C=!1,y=f.rhsAttribution&&e.rightHandAttribution);f.isRtl&&(a.document.dir="rtl");e.adsLabel&&(u=g.ads_label||null);if("relatedsearch"==L){if(h)if("ads"==L)var l=h.u,sb=e.attributionText,r=h.alt_t&&h.alt_t[sb]?h.alt_t[sb]:"Ads"==e.attributionText?"Ads":h.t;else"relatedsearch"==L&&(r=g.rs_attr.t,l=g.rs_attr.u,e.horizontalFlow&&(r+=":"));r||u?(dh(null,l,r,u,null, +y,a,c),ua=!0):(void 0)(a)}else{var L=null,fb;f.suppliedAttribution&&e.attributionText?(fb={t:e.attributionText},e.attributionHref&&(fb.u=e.attributionHref)):fb=null;null!=fb?h=fb:sb=e.position?"ad-block-position-"+e.position:void 0;if(null!=h){if(e.detailedAttribution||0!=e.detailedAttribution&&f.megaLabelExp)L=h.t2;l=h.u;r=h.t}if(qa||r||u||L)dh(qa,l,r,u,L,y,a,c,sb),ua=!0}$i(d);h={titleInlineBlock:C,hasButtonRight:H};ka&&ka.bc&&(h.adBadgeColor=ka.bc);(l=Yi(ua))||ch(f,a,c,e,h);u=Xi(c,250);la=la&&!u? +new Ae(la):S;eb=gj(d,a,b,c,e,Tb(e,f),!!f.clickableText,J,la,eb,f,g);l&&ch(f,a,c,e,h);(d=a.document.getElementById("attrHeader"))&&la!=S&&Wi(d,"display","none");Fi(a,b);Ri(a,Vb(e,f),f);b=Cb(b);jh(e,c,b,f);d="https"==window.location.protocol;Tb(e,f)&&sh(c,hh(e,f,d),b,f);eb?eb.M(a,f):dj(c,f);ai(a,e.sellerColumnWidth)},hj=m(hj,"fA"),dj=function(a,b){for(var c=Zd(a,"div","a_"),c=c.concat(Zd(a,"tr","a_")),d=0,e;e=c[d];d++)$e(Ni(e),e,a,b)},dj=m(dj,"aSSTATU"),jj=function(a,b,c){var d={};if(c.bs)for(var e= +0,f;f=c.bs[e];e++)if(f.container==a.container){d=f;break}if(c=c.ps)for(var g in c)c.hasOwnProperty(g)&&(d[g]=c[g]);for(g in d)d.hasOwnProperty(g)&&""!==d[g]&&(c=g.replace(/_(.)/g,function(a,b){return b.toUpperCase()}),!b[c]||"clicktrackUrl"==c&&a[c]||(a[c]=d[g]));"boolean"==typeof a.linkTarget&&(a.linkTarget=a.linkTarget?"_blank":"_top");"number"==typeof a.adIconLocation&&(a.adIconLocation=xi[a.adIconLocation]);"number"==typeof a.adsafe&&(a.adsafe=yi[a.adsafe]);ij(a,"adBorderSelections");ij(a,"borderSelections"); +ij(a,"fontFamily");ij(a,"fontFamilyAttribution")},jj=m(jj,"fSSS"),ij=function(a,b){a[b]instanceof Array&&(0==a[b].length?delete a[b]:a[b]=a[b].join(","))},ij=m(ij,"cSLSTS"),Di=function(a,b){if(a==b.name)return window;var c=null;try{if(c=window.parent.frames[a+"|"+window.name])return c}catch(d){}try{if(c=window.parent.frames[a])return c}catch(d){}return null},Di=m(Di,"gFBN"),kj=function(a,b,c){var d=Oi(a),e;for(e in W){var f=W[e];if(0==f.length)Na.log({message:e},"mPAASH2");else{var g=Di(e,a);if(null!= +g){d&&Pi(g,d);var h=null;try{h=g.document.getElementById("adBlock")}catch(l){}null!=h&&(f[0].type==ti.Vc?aj(g,e,h,f[0],a,b,c):f[0].type==ti.Sc?cj(g,e,h,f[0],a,b,c):ej(g,e,h,f,a,b)||fj(g,e,h,f,a,b)||hj(g,e,h,f,a,b,c),qi[e]=!0,delete W[e])}}}Li(a,b)},kj=m(kj,"mPAASH"),lj=function(a,b,c){return("number"==typeof b&&16>b||"number"==typeof c&&16>c)&&(a=a.document.getElementById("adBlock"))&&""!=a.innerHTML?!0:!1},lj=m(lj,"iCSI"),Ji=function(a,b){for(var c=!1,d=[],e=0;e<a.length;e++){var f=a[e],g=Bi(f,"adBlock"), +h=Ci(f,"adBlock");lj(f,g,h)&&(g=null,c=!0);d.push(g)}c&&window.setTimeout(b,10);return d},Ji=m(Ji,"gFH"),mj=function(a,b,c){var d;d=Math.max.apply(Math,a);a=Math.min.apply(Math,a);if(d-a>rb)for(a=0;a<b.length;a++)d=b[a],c[d]=null;return c},mj=m(mj,"pBDF"),nj=function(a,b){var c={},d=!1,e=[],f=[],g;for(g in b)if(g in a){var h=b[g],l=a[g];"undefined"!=typeof l&&(l=vb(h,l),null!=l&&(c[g]=l,h.g==ub&&(e.push(l),f.push(g)),d=!0))}0<e.length&&(c=mj(e,f,c));return d?c:null},nj=m(nj,"vO"),oj=function(a,b){return a? +nj(a,b):null},oj=m(oj,"vCO"),pj=function(a,b){for(var c in b)a[c]=b[c]},pj=m(pj,"iCO"),qj=function(a,b){return(/^slave-\d+-\d+$/.test(a)||/^master-\d+$/.test(a))&&"object"==typeof b},qj=m(qj,"iPABO"),rj=function(a){return xa(a)||{}},rj=m(rj,"pNAO"),sj=function(a,b,c){var d=oj(window.CSE_OPTIONS_,b),e={},f;for(f in a){var g=a[f];"name"==f?e[f]=/^slave-\d+-\d+$/.test(g)||/^master-\d+$/.test(g)?g:null:qj(f,g)&&(g.adPageId&&jj(g,b,c),g=nj(g,b),d&&pj(g,d),e[f]=g,W[f]=[])}return e},sj=m(sj,"vNAO"),Wi=function(a, +b,c){a.style[b]=c},Wi=m(Wi,"sS"),ah=function(a){return a.titleLetterSpacing||""},ah=m(ah,"gTLS"),tj=function(a,b){for(var c=a.resultsPageBaseUrl,d=a.resultsPageQueryParam,e=0;e<b.length;e++){var f=b[e].t,g=b[e].afdt;if(null!=f&&null!=g){if(!c)throw Pa("resultsPageBaseUrl resultsPageBaseUrl needs to be set.");var h=new $a(c);n(h,d,f);n(h,"rsToken",g);b[e].l=ab(h);b[e].u=ab(h)}}},tj=m(tj,"fRSCL"),uj=function(a,b,c,d,e){var f=b.horizontalFlow?-1:b.columns;if(2<=f){var g=a;if(0>=f)a=g;else{a=[];for(var h= +0,l=0;l<f;l++)for(var r=Math.ceil((g.length-h)/(f-l)),u=0;u<r;u++)a[u*f+l]=g[h++]}}g=a;b=!b.horizontalFlow;if(e&&e.Fk&&(1==f||2<=f&&e.Ek)){c=(void 0)(e,a.length);f=d.f;d='<div class="ra_">';e=g.length;for(b=0;b<e;b++)a=g[b],d+='<div class="sa_" style="border-'+(f?"right":"left")+"-color: "+M(P(c[b]))+'"><a href="'+M(O(a.l))+'" class="d_ popstripeRs" target="_top">'+K(pe({text:a.t,f:f})),d+='<div class="ta_" style="background-image: url('+M(Ld(a.adIconUrl&&"ad-left"==a.adIconLocation&&a.img?a.adIconUrl: +"//www.gstatic.com/domainads/images/chevron-white.png"))+')"></div></a></div>';c=F(d+"</div>")}else{d=""+('<table cellspacing="0" cellpadding="0"'+(2<=f||b?' width="100%"':"")+"><tbody><tr>");e=g.length;for(b=0;b<e;b++)a=g[b],h=0>f||2<=f&&b<f,d+=(0!=b&&0<f&&0==b%f?"</tr><tr>":"")+'<td class="col'+(b==e-1?" l":"")+'"'+(2<=f?' width="'+M(100/f)+'%"':"")+">",l=g.length%f||f,d+='<div class="ad'+(0==b?" f":"")+(h?" fr":"")+(b==e-1?" l":"")+(!h&&2<=f&&b>=g.length-l?" lr":"")+'">'+Og({B:a,kc:!1,qj:"_top"})+ +'<div class="b_ c_ radlinkC">'+Ng({B:a,kc:!1,qj:"_top"})+'<div class="adD"><div class="adStd" '+(c?'data-click-s="'+Q(a.l)+'" data-click-trg="_top"':"")+'><a href="'+Q(a.l)+'" class="d_" target="_top">'+Q(a.t)+"</a></div></div></div></div></td>";c=d+"</tr></tbody></table>"}return c},uj=m(uj,"cRSN"),gj=function(a,b,c,d,e,f,g,h,l,r,u){if(0>=a.length)return null;var y=Ub(e),C="";c=null;if(u.customAdIcons){var H="https"==window.location.protocol;null!=e.adIconUrl&&0<e.adIconHeight&&0<e.adIconWidth?gh(a, +e.adIconUrl,e.adIconLocation,!0,H,e.adIconWidth,e.adIconSpacingAfter):null!=e.adIconPageUrl&&0<e.adIconPageHeight&&0<e.adIconPageWidth&&gh(a,e.adIconPageUrl,e.adIconPageLocation,!1,H)}tj(e,a);var H=u.isHighendMobile&&u.mobileUiFormat,J=Vb(e,u),L=!!u.isRtl,ua=!!u.offerHighlightWithIcon,ka=H?!0:!!u.sitelinkTruncate&&!J,la=e.lines;if(e.adLayout)switch(e.adLayout){case "oneline":la=1;break;case "twoline":la=2;break;default:la=3}H&&(la=3);g=new Vd(la,f,g,!!u.clickableIcon,h,!J,l,r,L,y,ua,ka,u.ctcIconFormat, +H,new zg(u.pubId,fc,Ea,Math.random,u.queryId));h=e.type||"ads";if("ads"==h)if($g(e,u)){e=e.sellerColumnWidth;if(a)for(f=0,C=a.length;f<C;f++)a[f].plus_ones&&(a[f].plus_ones=Tf(a[f]));a={ads:a,C:u,Zj:e,A:y};var qa,y='<div id="wideSfbl">';e=a.ads;f=e.length;for(C=0;C<f;C++)g=e[C],y+='<div class="b_ c_ a_"><div class="sfblAd'+(C!=f-1?" notLast":"")+(g.topad?" k_":"")+'">'+nf({Da:""+ci(vd(a,{B:g,wd:!0})),Ea:""+di(vd(a,{B:g})),Z:null==(qa=a.Zj)?130:qa,ga:10,rb:a.C.isRtl})+"</div></div>";y+='</div><div id="narrowSfbl" style="display: none;">'; +qa=a.ads;e=qa.length;for(f=0;f<e;f++)C=qa[f],y+='<div class="b_ c_ a_"><div class="sfblAd'+(f!=e-1?" notLast":"")+(C.topad?" k_":"")+'">'+ci(vd(a,{B:C,wd:!1}))+'<div class="sfblNarrowPadder">'+di(vd(a,{B:C,Dk:!0}))+"</div></div></div>";C=y+"</div>"}else{c=[];qa=g.ac?Rg:yg;for(y=0;y<a.length;++y)c.push(new qa(a[y],u,g));c=new Tg(c,Mg);C=c.j()}else"relatedsearch"==h&&(C=uj(a,e,f,g,null));u=F('<div style="display: none;" id="_googAFS_'+M(u.pubId||"unknown_pubId")+'"></div>');bh(u,b,d);bh(C,b,d);return c}, +gj=m(gj,"cAN"),vj=function(a){var b=[{index:a.indexOf("{{NUM_START}}"),Sb:13},{index:a.indexOf("{{NUM_END}}"),Sb:11},{index:a.indexOf("{{LINK_START}}"),Sb:14},{index:a.indexOf("{{LINK_END}}"),Sb:12},{index:a.indexOf("{{RATING}}"),Sb:10}];b.sort(function(a,b){return a.index-b.index});for(var c=[],d=0,e=0;-1==b[e].index;)e++;for(;e<b.length;e++)d<b[e].index&&c.push(a.substring(d,b[e].index)),d=a.substring(b[e].index,b[e].index+b[e].Sb),d=d.replace("{{","").replace("}}",""),c.push(d),d=b[e].index+b[e].Sb; +d<a.length&&c.push(a.substring(d));return c},vj=m(vj,"pSSTA"),wj=function(a){if(a.u&&(a.u=db(a.u),a.ctc&&(a.ctc.u=db(a.ctc.u)),a.sls))for(var b=0;b<a.sls.length;b++)a.sls[b].u=db(a.sls[b].u)},wj=m(wj,"aDTU"),xj=function(a){a.sr&&(a.sr.wt=vj(a.sr.wt),a.sr.nt=vj(a.sr.nt))},xj=m(xj,"fSRD"),yj=function(a,b){if(!b.isHighendMobile||!wa())return null;var c="100%";return m(function(){var b=oi(!1,window).width,e=window.screen.width,b=b>e&&b<2*e?e+"px":"100%";if(b!=c){c=b;for(var f in qi)e=Di(f,a),null==e? +delete qi[f]:Wi(e.document.body,"width",b);setTimeout(ha(Ki,a),10)}},"mWS")},yj=m(yj,"gMWS"),zj=function(a,b,c){var d=!1;b=Ai(b);c.isRtl&&si.Xb("rtl",!0);c.queryId&&si.Zb("qi",c.queryId);c.effectiveAdsWebProperty&&si.Zb("eawp",c.effectiveAdsWebProperty);for(var e={},f=0;f<a.length;f++){var g=a[f],h=g.fn;"slave-0"==h&&(d=!0);h=h+"-"+b;if(!W[h]){var l={message:h};Na.log(l,"pAJ2");W[h]=[]}W[h].push(g);g.type!=ti.Vc&&g.type!=ti.Sc&&(g.ctc&&g.ctc.coa&&!g.u&&(g.u=g.ctc.u),wj(g),g.t&&(g.cleanTitle=Ke(g.t)), +g.v&&(g.visDomain=Ke(g.v).replace(/\/.*$/,"").replace(/^www\./,""),g.nonBreakingVisDomain=g.visDomain.replace(/-/g,"‑")),g.type==ti.Nf&&xj(g),c.getVisUrls&&g&&g.v&&(e[Ke(g.v)]=1))}if(c.getVisUrls){a=[];for(var r in e)a.push(r);si.Zb("v."+b,a.sort().join("|"))}for(var u in W)r=W[u].length,a=!1,0<r&&W[u][0].type==ti.Vc?r=W[u][0].plas?W[u][0].plas.length:0:0<r&&W[u][0].type==ti.Sc&&(r=W[u][0].offers?W[u][0].offers.length:0,0==r&&W[u][0].pd&&(a=!0)),d&&/^master/.test(u)?(0<r&&(l={message:W[u].length}, +Na.log(l,"pAJ3")),delete W[u]):(si.Xb(u+".hA",0<r),c.getNumAds&&si.Yb(u+".aC",r),1>r&&!a&&delete W[u]);c.getNumAds&&si.Xb("aD."+b,!0);si.Xb("r."+b,!!c.isRejected);Nb(si)},zj=m(zj,"pAJ"),Aj=function(a){var b=[],c;for(c in ui){var d=a[c];if(d){for(var e=ui[c],f=0;f<d.length;f++)d[f].type=e;b=b.concat(d)}}return b},Aj=m(Aj,"cAA"),Cj=function(a,b,c){var d=null;window.XMLHttpRequest?d=new XMLHttpRequest:window.ActiveXObject&&(d=new ActiveXObject("Microsoft.XMLHTTP"));if(d)d.open("GET","/afs/ads?"+c,!0), +d.setRequestHeader("Duplicate","1"),d.onreadystatechange=function(){if(4==d.readyState){var c=xa(d.responseText.substr(d.responseText.indexOf("//")+2));if(!c)throw Error("Unable to use waitForAds");window.ad_json=c;Bj(a,b)}},d.send();else throw Error("Unable to create the HTTP request object.");},Cj=m(Cj,"rCAAC"),bj=function(a,b){for(var c=0;c<a.length;c++){var d=a[c],e=d.n,d=d.v;"t"==d?b[e]=!0:"f"!=d&&(b[e]=d)}},bj=m(bj,"cPATO"),Dj=function(a){var b=window.caps_||{};a.hasOwnProperty("caps")&&bj(a.caps, +b);window.relay&&(b.relay=window.relay);window.resultUrl&&(b.resultUrl=window.resultUrl);window.refererUrl&&(b.refererUrl=window.refererUrl);return b},Dj=m(Dj,"pCFJPD"),Ej=function(a,b,c){window.cMF_=function(a){/Opera/i.test(na)?setTimeout(function(){a()},0):a()};window.sPH=function(){window.cMF_(ha(Ki,a))};window.mPAASH=function(){window.cMF_(ha(kj,a,b,c))};kj(a,b,c);var d=yj(a,b);d&&setInterval(d,500)},Ej=m(Ej,"sCFC"),Bj=function(a,b){var c=window.ad_json||{};"string"==typeof c&&(c=xa(c));var d= +Dj(c),e=sj(b,a,c);zj(Aj(c),e,d);window.onresize=ha(Li,e,d);Ej(e,d,c);setTimeout(function(){Ki(e)},1)},Bj=m(Bj,"raa"),Fj=function(a,b){var c=b.name;b&&b[c]&&Bb(b[c])?Cj(a,b,b[c].adRequestUrlParams):Bj(a,b)},Fj=m(Fj,"init"),Gj=function(){return function(){window.startTime&&mb(new lb("ipl",window.startTime),"ol")}},Gj=m(Gj,"onload");U(window,"load",Gj());var Hj=function(){ob()},Hj=m(Hj,"istats");p&&(U(window,"unload",Hj),setTimeout(Hj,15E3),mb(p.clone("ipl"),"jlt"));mb(pi,"pt")};var Ij=function(a,b){this.pb=a;this.zd=b};Ij.prototype.ka=function(){var a=this.pb.ka()+" (one by itself, or multiple in an Array";this.zd&&(a+=" with fewer than "+(this.zd+1)+" elements");return a+")"};Ij.prototype.X=function(a){a="array"==ba(a)?a:[a];if(this.zd&&a.length>this.zd)return null;for(var b=[],c=0;c<a.length;c++){var d=this.pb.X(a[c]);if(null==d)return null;b.push(d)}return 0==b.length?null:b};Ij.prototype.ja=function(a){a=this.X(a);return null==a||1>a.length?null:this.pb.ja(a[0])};var Jj=function(){};Jj.prototype.ka=function(){return"true, false"};Jj.prototype.X=function(a){return"true"==a||1==a?!0:"false"==a||!1===a?!1:null};Jj.prototype.ja=function(a){a=this.X(a);return null==a?null:a?1:0};var q=new Jj;var X=function(a,b){this.Fc=Math.ceil(a);this.Ec=Math.floor(b)};X.prototype.ka=function(){return this.Fc+" - "+this.Ec};X.prototype.X=function(a){a=parseInt(a,10);return a>=this.Fc&&a<=this.Ec?a:null};X.prototype.ja=function(a){return this.X(a)};var Kj=function(a){this.pb=a};Kj.prototype.ka=function(){return this.pb.ka()+" (one or more, comma separated)"};Kj.prototype.X=function(a){a=Lj(a);for(var b=[],c=0;c<a.length;c++){var d=this.pb.X(a[c]);null!=d&&b.push(d)}return 0==b.length?null:b.join(",")};Kj.prototype.ja=function(a){a=Lj(a);for(var b=0;b<a.length;b++){var c=this.pb.ja(a[b]);if(null!=c)return c}return null};var Lj=function(a){if(!da(a))return[];a=a.split(",");for(var b=[],c=0;c<a.length;c++)b.push(Xb(a[c]));return b};var Nj=function(a,b){this.yf=a;var c=b||0;this.zf={};for(var d=0;d<this.yf.length;d++){var e=this.yf[d];this.zf[e.toLowerCase()]=new Mj(e,c+d)}},Mj=function(a,b){this.Aj=a;this.id=b},Oj=new Mj(null,null);Nj.prototype.ka=function(){return this.yf.join(", ")+" (case insensitive)"};var Pj=function(a,b){if(!b||!da(b))return Oj;b=b.toLowerCase();return a.zf.hasOwnProperty(b)?a.zf[b]:Oj};Nj.prototype.X=function(a){return Pj(this,a).Aj};Nj.prototype.ja=function(a){return Pj(this,a).id};var Qj=function(){},Rj=/^\d+px$/i,Sj=/^\d+%$/;Qj.prototype.ka=function(){return"Width in px (e.g. '500px') or 'auto'"};Qj.prototype.X=function(a){var b=Tj(a);return null!=b?b+"px":da(a)&&("auto"==a||Sj.test(a))?a:null};Qj.prototype.ja=function(a){return Tj(a)};var Tj=function(a){return"number"==typeof a||da(a)&&(!/[^0-9]/.test(a)||Rj.test(a))?(a=parseInt(a,10),isNaN(a)?null:a):null},Uj=new Qj;var Vj=function(){};Vj.prototype.ka=function(){return"A string"};Vj.prototype.X=function(a){return da(a)?a:null};Vj.prototype.ja=Ac;var Wj=new Vj;var Xj=function(){},Yj=/^((https?):)?\/\/([a-zA-Z0-9\~\!\@\#\$\&\*\(\)_\+\-\=\:\;\'\,\.\?\/\%]*)$/;Xj.prototype.ka=function(){return"An http(s) url"};Xj.prototype.X=function(a){return da(a)&&Yj.test(a)?a:null};Xj.prototype.ja=Ac;var Zj=new Xj;var ak=new X(2,400),bk=new X(0,400),ck=new Nj(["title-right","ad-left"]),dk=new X(8,50),ek=new Kj(new Nj("verdana;arial;tahoma;times new roman;georgia;trebuchet ms;meiryo;ms gothic".split(";"),1)),fk=new Kj(new Nj(["right","left","top","bottom"])),gk=new Nj(["off","low","med","high"]),hk=new Nj(["_top","_blank"]),ik={key:"container",g:Wj},jk={key:"adtest",g:q,H:"at",ta:!0},kk={key:"adsafe",g:gk,H:"as",ta:!0},lk={key:"clicktrackUrl",g:new Ij(Zj)},mk={key:"linkTarget",g:hk,Ob:"_top",L:!0},nk=function(a, +b){for(var c in b)b.hasOwnProperty(c)&&!a.hasOwnProperty(c)&&(a[c]=b[c])},ok={role:2,slaveNumber:1,masterNumber:1,cx:1,cref:1,bgresponse:1,sbsignals:1,gcsc:1,fexp:1,forceEx:1,expflags:1,userAgent:1,domainName:1,adRequestUrlParams:1,deb:1,uideb:1,debug:1,fcap:1,adsRejectedCallback:1,fakeads:1,uuld:1,jsSrc:1},pk={pubId:1,propertyCode:1,container:2,channel:1,hl:1,adtest:1,adsafe:1,clicktrackUrl:1,adLoadedCallback:1,adsResponseCallback:1,linkTarget:1,type:1},tk={lines:1,width:1,verticalSpacing:1,colorAdBackground:1, +colorAdBorder:1,colorAdSeparator:1,colorText:1,colorTitleLink:1,colorDomainLink:1,colorBackground:1,colorBorder:1,colorAttribution:1,colorPlusOnes:1,colorLocation:1,colorAnnotation:1,fontFamily:1,fontFamilyAttribution:1,fontSizeTitle:1,fontSizeDescription:1,fontSizeDomainLink:1,fontSizeAttribution:1,fontSizePlusOnes:1,fontSizeLocation:1,fontSizeAnnotation:1,titleBold:1,rolloverLinkBold:1,rolloverLinkColor:1,rolloverLinkBackgroundColor:1,rolloverLinkUnderline:1,rolloverAdBackgroundColor:1,noTitleUnderline:1, +attributionSpacingBelow:1,rightHandAttribution:1,attributionText:1,attributionHref:1,adsLabel:1,adBorderSelections:1,borderSelections:1,position:1,adIconPageUrl:1,adIconPageWidth:1,adIconPageHeight:1,adIconPageLocation:1,adIconPageSpacingAbove:1,adIconPageSpacingBefore:1,adIconPageSpacingAfter:1,adIconUrl:1,adIconWidth:1,adIconHeight:1,adIconLocation:1,adIconSpacingAbove:1,adIconSpacingBefore:1,adIconSpacingAfter:1,adIconSpacingBelow:1,lineHeightTitle:1,lineHeightDescription:1,lineHeightDomainLink:1, +domainLinkAboveDescription:1,detailedAttribution:1,columns:1,columnSpacing:1,horizontalFlow:1,horizontalAlignment:1,maxTermLength:1,sellerColumnWidth:1,amazonTheme:1,amazonGrayBullets:1,domTemplate:1,cssFileName:1,adLayout:1},uk={query:2,number:1,oe:1,ie:1,maxTop:1,minTop:1,gcse_nc:1,queryLink:1,queryContext:1,siteLinks:1,location:1,sellerRatings:1,reviewExtension:1,callouts:1,adPage:1,adpage:1,clickToCall:1,adstyle:1,numRepeated:1,gl:1,gcs:1,gr:1,gm:1,longerHeadlines:1,afdToken:1,plusOnes:1,colorKeyword:1, +relatedSearches:1,offerHighlight:1,adPageId:1,heightConstrained:1,referrer:1,noAdLoadedCallback:1,iframeHeightCallback:1,visibleUrlsCallback:1,clickableBackgrounds:1,cseGoogleHosting:1,waitForAds:1,resultsPageBaseUrl:1,resultsPageQueryParam:1},xb=function(){var a={};wb(a,[kk,jk,lk,ik,mk,{key:"verticalSpacing",g:new X(2,34)},{key:"lines",g:new X(1,3),H:"af",Ob:3},{key:"colorAdBackground",g:V},{key:"colorAdBorder",g:V},{key:"colorAdSeparator",g:V},{key:"colorText",g:V,L:!0},{key:"colorTitleLink",g:V, +L:!0},{key:"colorDomainLink",g:V,L:!0},{key:"colorBackground",g:V,L:!0},{key:"colorBorder",g:V,L:!0},{key:"colorAttribution",g:V},{key:"colorPlusOnes",g:V},{key:"colorKeyword",g:V},{key:"colorLocation",g:V},{key:"colorAnnotation",g:V},{key:"fontFamily",g:ek,H:"ff",L:!0},{key:"fontFamilyAttribution",g:ek,H:"fa"},{key:"fontSizeTitle",g:ub,H:"st",L:!0},{key:"fontSizeDescription",g:ub,H:"sd",L:!0},{key:"fontSizeDomainLink",g:ub,H:"sv",L:!0},{key:"fontSizeAttribution",g:ub,H:"sa",L:!0},{key:"fontSizePlusOnes", +g:ub,H:"so",L:!0},{key:"fontSizeLocation",g:ub,H:"sc",L:!0},{key:"fontSizeAnnotation",g:ub,H:"sn",L:!0},{key:"titleBold",g:q,L:!0},{key:"rolloverLinkBold",g:q,L:!0},{key:"rolloverLinkColor",g:V,L:!0},{key:"rolloverLinkBackgroundColor",g:V,L:!0},{key:"rolloverLinkUnderline",g:q,L:!0},{key:"rolloverAdBackgroundColor",g:V,L:!0},{key:"noTitleUnderline",g:q},{key:"rightHandAttribution",g:q},{key:"clickableBackgrounds",g:q},{key:"attributionText",g:Wj},{key:"attributionHref",g:Zj},{key:"adsLabel",g:q}, +{key:"adBorderSelections",g:fk},{key:"borderSelections",g:fk},{key:"position",g:new Nj(["top","right","bottom"])},{key:"cseGoogleHosting",g:new Nj(["full","iframe","partner"])},{key:"adIconPageUrl",g:Zj},{key:"adIconPageWidth",g:ak},{key:"adIconPageHeight",g:ak},{key:"adIconPageLocation",g:ck},{key:"adIconPageSpacingAbove",g:bk},{key:"adIconPageSpacingBefore",g:bk},{key:"adIconPageSpacingAfter",g:bk},{key:"adIconUrl",g:Zj},{key:"adIconWidth",g:ak},{key:"adIconHeight",g:ak},{key:"adIconLocation",g:ck, +Ob:"ad-left"},{key:"adIconSpacingAbove",g:bk,L:!0},{key:"adIconSpacingBefore",g:bk},{key:"adIconSpacingAfter",g:bk},{key:"adIconSpacingBelow",g:bk},{key:"lineHeightTitle",g:dk,H:"lt"},{key:"lineHeightDescription",g:dk,H:"ld"},{key:"lineHeightDomainLink",g:dk,H:"lv"},{key:"domainLinkAboveDescription",g:q,H:"va"},{key:"adRequestUrlParams",g:Wj},{key:"waitForAds",g:q,H:"wa"},{key:"heightConstrained",g:q,H:"hc"},{key:"width",g:Uj,H:"wi",L:!0},{key:"detailedAttribution",g:q,H:"da"},{key:"attributionSpacingBelow", +g:new X(0,40)},{key:"siteLinks",g:q,H:"sl",ta:!0},{key:"sellerRatings",g:q,H:"sr",ta:!0},{key:"location",g:q,H:"lo",ta:!0},{key:"clickToCall",g:q,H:"cc",ta:!0},{key:"longerHeadlines",g:q,H:"lh",ta:!0},{key:"plusOnes",g:q,H:"po",ta:!0},{key:"resultsPageBaseUrl",g:Zj},{key:"offerHighlight",g:q,H:"oh",ta:!0},{key:"type",g:new Nj(["ads","relatedsearch"])},{key:"columns",g:new X(1,20),Ob:1},{key:"columnSpacing",g:new X(2,100)},{key:"horizontalFlow",g:q},{key:"horizontalAlignment",g:new Nj(["center","left", +"right"]),Ob:"left"},{key:"resultsPageQueryParam",g:Wj,Ob:"query"},{key:"adPageId",g:new X(0,4294967295)},{key:"reviewExtension",g:q,H:"ap",ta:!0},{key:"sellerColumnWidth",g:new X(130,200)},{key:"amazonTheme",g:new Nj(["numbered","bulleted"])},{key:"amazonGrayBullets",g:q},{key:"domTemplate",g:new Nj(["twoColumnNumbered","threeColumnBulleted","twoColumnBulleted","twoColumnBulletedSerp","oneColumnNumbered"])},{key:"cssFileName",g:Wj},{key:"callouts",g:q,H:"co",ta:!0},{key:"adLayout",g:new Nj("oneline twoline threeline sellerfirst".split(" "), +1),H:"af"}]);return a},yb=function(){var a={};nk(a,uk);nk(a,tk);nk(a,ok);nk(a,pk);return a};if(window.IS_GOOGLE_AFS_IFRAME_){var vk=function(){var a=Ab();Fj(a,rj(window.name))};0==na.indexOf("Opera")||-1==na.indexOf("MSIE")&&-1==na.indexOf("Trident")?vk():window.onload=vk};if(!window.IS_GOOGLE_AFS_IFRAME_){var wk=function(){};wk.prototype.ue=function(){return new $a(Ka()+"/afs/ads")};wk.prototype.td=function(){return new $a(Ka()+"/afs/ads/i/iframe.html")};wk.prototype.Ae=function(){return"uds_ads_only"};wk.prototype.Ue=function(){return!1};var xk=function(){};xk.prototype.ue=function(){return new $a((window.dafeBase_||(window._googCsaAlwaysHttps?"https:":"")+"//domains.googlesyndication.com")+"/apps/domainpark/domainpark.cgi?")};xk.prototype.td=function(){return null}; +xk.prototype.Ae=function(){return"caf"};xk.prototype.Ue=function(){return!0};var yk=function(){};yk.prototype.ue=function(){var a=window.google&&window.google.loader&&window.google.loader.GoogleLocale?window.google.loader.GoogleLocale:"www.google.com",a=-1!=a.indexOf("www.google")?a.replace("www.google","cse.google"):a;return new $a((window._googCsaAlwaysHttps?"https:":"")+"//"+a+"/cse")};yk.prototype.td=function(){return null};yk.prototype.Ae=function(){return"uds_ads_only"};yk.prototype.Ue=function(){return!1}};if(!window.IS_GOOGLE_AFS_IFRAME_){var Y=function(a,b,c,d,e,f,g,h){this.Na=a;this.ed=b;this.Ge(c,d,e,f,g,h)},Y=m(Y,"ab");Y.Gj=new lb("pjsp");Y.Ph="gcsc";Y.Jh="21404";Y.Uh="4031211";Y.Oh="20606";Y.Kf=["","7000105","7000106","7000107","7000108"];Y.ib="longerHeadlines";Y.Sd="n";Y.Pf="w";Y.Lf="p";Y.Th="a";Y.di=6E4;Y.Rh="on";Y.prototype.Bd=!1;Y.Ch="";Y.Zg=Math.floor(100*Math.random());Y.Vh="7000126";Y.Wh="7000127";Y.ci="7000128";Y.Xh=/(^|,|\+)csa_(use|no)_rs(_aa)?($|,|\+)/;Y.Uc={query:"q",type:"type",format:"format", +ads:"ad",pubId:"client",channel:"channel",adtest:"adtest",hl:"hl",adsafe:"adsafe",adPage:"adpage",adpage:"adpage",oe:"oe",ie:"ie",output:"output",role:"r",referer:"referer",rurl:"rurl",res_url:"res_url",v:"v",source:"source",safe:"safe",num:"num",fexp:"fexp",jsei:"jsei",nocache:"nocache",cx:"cx",cref:"cref",bgresponse:"bgresponse",sbsignals:"sbsignals",gcse_nc:"gcse_nc",queryLink:"qry_lnk",queryContext:"qry_ctxt",adExtensions:{arg:"adext",siteLinks:"as1",location:"l1",sellerRatings:"sr1",clickToCall:"ctc1"}, +allwcallad:"allwcallad",adstyle:"adstyle",adlh:"adlh",numRepeated:"adrep",gl:"gl",uuld:"uuld",gcs:"gcs",gr:"gr",gm:"gm",glp:"glp",preload:"preload",forceEx:"expid",e:"e",expflags:"expflags",userAgent:"useragent",fcap:"fcap",afdToken:"afdt",plusOnes:"po",colorKeyword:"clkwd",deb:"deb",uideb:"uideb",debug:"debug",fakeads:"fakeads",jsSrc:"csa_js_src",location:"lo",domainName:"domain_name",maxTermLength:"max_radlink_len",adPageId:"apid",theme:"theme",textColorPalette:"tcpal",merchantFilter:"cmf",gtin:"gtin", +brand:"brand",mpn:"mpn",priceCurrency:"pfcrncy",priceMin:"pfmin",priceMax:"pfmax",cssFileName:"ccfn"};Y.Nh="UTF-8";Y.Lh="UTF-8";Y.If=2;Y.Ak=2;Y.Of="googleSynd";Y.Dh={};Y.Sh=80;k=Y.prototype;k.ee=function(a){if(this.la)return Y.Sd+"0";var b=a.minTop+this.cb,c=a.maxTop+this.bb,d=a.narrow+this.fb,e=a.wide+this.gb;a=0<b?Y.Th+b:"";var f=0<c?Y.Lf+c:"",d=0<d?Y.Sd+d:"",e=0<e?Y.Pf+e:"";if(c&&b>c)throw Pa("Cannot request more minTop ads than maxTop.");return e+d+f+a};k.ee=m(Y.prototype.ee,"cAA");k.ge=function(a, +b){var c=this.ea(a);b&&0<b.length&&(b.splice(0,0,c),c=b.join("|"));return c};k.ge=m(Y.prototype.ge,"cFAM");k.ea=function(a){this.fb=a.number&&!a[Y.ib]?a.number:0;this.gb=a.number&&a[Y.ib]?a.number:0;this.cb=a.minTop;this.bb=a.maxTop;this.fb||this.cb||this.bb||this.gb||(a[Y.ib]?this.gb=Y.If:this.fb=Y.If);var b=this.bb||this.cb;if((this.fb||this.gb)&&b)throw Pa("Cannot request standard and top ads in the same ad block.");if(this.la&&0!=a.slaveNumber&&!a.firstAdBlock&&(this.bb||this.cb))throw Pa("Only the first ad block can have top ads."); +var c;this.bb||this.cb?c=Y.Lf:this.fb?c=Y.Sd:this.gb&&(c=Y.Pf);return c+(this.bb||this.cb||this.fb||this.gb||0)};k.ea=m(Y.prototype.ea,"cFA");k.we=function(){return this.Oi};k.we=m(Y.prototype.we,"gFA");k.Ld=function(a){Fb(a)&&(a.siteLinks=0!=a.siteLinks,a.sellerRatings=0!=a.sellerRatings,a.clickToCall=0!=a.clickToCall);return a=Y.Bf(a)};k.Ld=m(Y.prototype.Ld,"sDIUP");k.Sa=function(){};k.Sa=m(Y.prototype.Sa,"vAURSO");k.Af=function(a,b,c,d){var e={};a.lines&&a.adLayout&&delete a.lines;for(var f in this.ed)if(this.ed.hasOwnProperty(f))if(2!= +this.ed[f]||a[f])"undefined"!=typeof a[f]&&null!=a[f]&&(e[f]=a[f]);else throw Pa("Missing option '"+f+"'.");this.la="m"!=a.role;if(!this.la){var g;a:{var h=window.location.href.match(/[?&]rsToken=([^&]*)/);if(h&&h[1])try{g=decodeURIComponent(h[1]);break a}catch(l){}g=null}g&&(e.afdToken=g)}e.adLoadedCallback=a.adLoadedCallback||a.callback||null;e.adsRejectedCallback=a.adsRejectedCallback||null;e.oe=e.oe||Y.Nh;e.ie=e.ie||Y.Lh;e.number=Y.Pc(e.number,0);e.minTop=Y.Pc(e.minTop,0);e.maxTop=Y.Pc(e.maxTop, +0);1==e.slaveNumber&&e.numRepeated&&e.longerHeadlines&&(e.longerHeadlines=!1);e.fexp=(e.fexp?e.fexp+",":"")+(e.gcsc?Y.Oh:Y.Jh);window.postMessage||(e.fexp+=","+Y.Uh);(g=window.googlev3ex)&&!isNaN(parseInt(g,10))&&(e.fexp+=","+g);a.hasOwnProperty("cseExperiment")&&(g={a:"7000752",b:"7000753",c:"7000754"},(h=a.cseExperiment)&&g.hasOwnProperty(h)&&(e.fexp+=","+g[h]));g=parseInt(window._googCsaX,10)||0;0<g&&g<Y.Kf.length&&(e.jsei=g,e.fexp+=","+Y.Kf[g]);g=parseInt(window._googCsaExp,10)||0;0<g&&(e.fexp+= +","+g);g=parseInt(window._googCsaJsLoad,10)||0;0<g&&(e.fexp+=","+g,p&&(7000615==g||7000637==g?nb("pplsc"):7000616!=g&&7000638!=g||nb("pplse")));g=parseInt(window._googCsaRelSearch,10)||0;0<g&&(e.fexp+=","+g);e.channel&&"string"==typeof e.channel&&(g=e.channel.match(Y.Xh))&&(e.fexp+=","+("use"==g[2]?Y.ci:"_aa"==g[3]?Y.Wh:Y.Vh));e.forceEx?e.e="ForceExperiment":0===e.forceEx&&(e.e="0");e.gcsc&&(5>Y.Zg?e.fexp+=",37108":10>Y.Zg&&(e.fexp+=",37109"),"top"==a.position&&(e.maxTop=a.number,e.longerHeadlines= +!1,e.number=null));e.format=this.la?this.ea(e):this.ge(e,b);this.Oi=e.format;e.ads=this.ee(c);e.nocache=[Math.floor(1E3*Math.random()),(new Date).getTime()].join("");e.num="0";e.output=this.Kc.Ae();this.Kc.Ue()?(e.domainName||(e.domainName=window.document.domain),e.domainName=e.domainName.substring(0,Y.Sh)):e.domainName="";e.gcsc&&(e.source=Y.Ph);e.v=Bb(e)?"4":"3";e.adPageId&&(e.pubId=e.propertyCode,e.adPageId=vb(this.Na.adPageId,e.adPageId));da(e.pubId)||(e.pubId=""+e.pubId);0==e.pubId.indexOf("partner-")&& +(e.pubId=e.pubId.substring(8));e=this.Ld(e);!e.titleBold||!0!==e.titleBold&&1!=e.titleBold?e.titleBold&&delete e.titleBold:e.titleBold=1;Fb(e)&&(!e.maxTop&&!e.minTop||e.hasOwnProperty(Y.ib)||(e[Y.ib]=!0));if(!this.la){a=e[Y.ib]||!1;for(f in d)d.hasOwnProperty(f)&&(a=a||d[f].o[Y.ib]);a&&(e.adlh=Y.Rh)}e.clickToCall&&(e.allwcallad=1);this.Sa(e);return e};k.Af=m(Y.prototype.Af,"vASDO");Y.Pc=function(a,b){var c=parseInt(a,10);return!isNaN(c)&&0<=c?c:b};Y.Pc=m(Y.Pc,"tNNIOD");Y.yd=function(a){a=parseInt(a, +10);return!isNaN(a)&&0<=a};Y.yd=m(Y.yd,"iNNN");Y.Qh={hc:1,lh:1,oh:1,pa:1};Y.sd=function(a,b){var c=b.H,d=b.g.ja(a);return null!=d&&Y.yd(d)?Y.Qh.hasOwnProperty(c)?d?c.charAt(0)+c.charAt(1).toUpperCase():c:c+d:""};Y.sd=m(Y.sd,"gPFO");k=Y.prototype;k.Ye=function(a){var b=[],c;for(c in a)a.hasOwnProperty(c)&&c in this.Na&&this.Na[c].H&&b.push(Y.sd(a[c],this.Na[c]));return b.join("")};k.Ye=m(Y.prototype.Ye,"oTPP");k.Gc=function(a,b){var c=[],d;for(d in a)!(a.hasOwnProperty(d)&&d in this.Na&&this.Na[d].H)|| +d in b&&b[d]==a[d]||c.push(Y.sd(a[d],this.Na[d]));return c.join("")};k.Gc=m(Y.prototype.Gc,"oTBP");k.je=function(a,b,c){var d=a.v?a.v:"3",e=this.fe(a,b,c),f=Y.de()?"vp1":"";if(0==b.length)return["uv",d,e,f,this.Gc(a,{}),"-"].join("");c.pubId=a.pubId;c=this.Ld(c);var g=this.Ye(c),g=["uv",d,e,f,g].join(""),d=[];d.push(this.Gc(a,c));for(a=0;e=b[a];a++)e.o.slaveNumber&&0!=e.o.slaveNumber&&d.push(this.Gc(e.o,c));return[g,d.join("-")].join("-")};k.je=m(Y.prototype.je,"cUIP");k.fe=function(a,b,c){if(a.colorTitleLink|| +a.colorDomainLink||c.colorTitleLink||c.colorDomainLink)return"cs1";for(a=0;c=b[a];a++)if(c.o.colorTitleLink||c.o.colorDomainLink)return"cs1";return""};k.fe=m(Y.prototype.fe,"cCTPP");Y.de=function(){for(var a=document.getElementsByTagName("meta"),b=0,c;c=a[b];b++)if("viewport"==c.name)return!0;return!1};Y.de=m(Y.de,"cVMT");Y.Bf=function(a){for(var b=["fontSizeTitle","fontSizeDescription","fontSizeDomainLink","fontSizeAttribution"],c=0;c<b.length;c++){var d=b[c];if(a[d]){var e="string"==typeof a[d]? +parseInt(a[d].replace("px",""),10):a[d],e=e>tb?tb:e,e=8>e?8:e;a[d]=e+"px"}}return a};Y.Bf=m(Y.Bf,"vFS");k=Y.prototype;k.ke=function(a,b){var c,d,e=this.Kc.ue();if(e){this.Wd(a,e);var f=2==window.googleAltLoader||4==window.googleAltLoader;d=1==window[Y.Of];3==window.googleAltLoader&&d?n(e,"bsl",9):3==window.googleAltLoader?n(e,"bsl",8):4==window.googleAltLoader&&d?n(e,"bsl",11):4==window.googleAltLoader?n(e,"bsl",10):d?n(e,"bsl",f?7:3):15==b.googleAltLoader?n(e,"bsl",2):f&&n(e,"bsl",6);if(!this.la){f= +window;d=document;var g=new Date;var h=f||ei;try{c=h.history.length}catch(u){c=0}n(e,"u_his",c);n(e,"u_tz",-g.getTimezoneOffset());n(e,"dt",g.getTime());n(e,"u_w",f.screen.width);n(e,"u_h",f.screen.height);c=oi(!0,f);n(e,"biw",c.width);n(e,"bih",c.height);f.top!=f&&(c=oi(!1,f),n(e,"isw",c.width),n(e,"ish",c.height));d.body?(c=(g=!f.scrollY&&"CSS1Compat"!=d.compatMode)?d.body.scrollWidth:d.body.offsetWidth,d=g?d.body.scrollHeight:d.body.offsetHeight):d=c=-1;n(e,"psw",c);n(e,"psh",d);var l;if(f.top== +f)l=0;else{f=f.top;try{var r;if(r=!!f&&null!=f.location.href)b:{try{de(f.foo);r=!0;break b}catch(u){}r=!1}l=r}catch(u){l=!1}l=l?1:2}n(e,"frm",l)}n(e,"uio",this.Ch);n(e,"rurl",b.location.href,!0);n(e,Y.Uc.referer,b.document.referrer,!0);a.referrer&&n(e,"optref",a.referrer,!0)}return e};k.ke=m(Y.prototype.ke,"cU");k.Xd=function(a,b,c){var d=a.arg,e=[],f;for(f in a)"arg"!=f&&a.hasOwnProperty(f)&&b.hasOwnProperty(f)&&b[f]&&e.push(a[f]);0<e.length&&n(c,d,e.join(","))};k.Xd=m(Y.prototype.Xd,"aSCSA");k.Wd= +function(a,b){for(var c in a)if(a.hasOwnProperty(c)&&Y.Uc.hasOwnProperty(c)){var d=Y.Uc[c],e=a[c];"clkwd"==d&&(e="t");if("mvtb"!=d||"low"==e||"medium"==e||"high"==e)"type"==d&&(e=hb[a[c]]),n(b,d,e)}this.Xd(Y.Uc.adExtensions,a,b)};k.Wd=m(Y.prototype.Wd,"aOTU");k.Fa=function(){return"s"==this.o.role?["slave",this.o.slaveNumber,this.o.masterNumber].join("-"):["master",this.o.masterNumber].join("-")};k.Fa=m(Y.prototype.Fa,"gFN");k.xe=function(a,b,c,d){var e={};e.name=b;a=c.concat([a]);b=d.concat([b]); +for(d=0;d<a.length;d++){c=a[d];var f=this.Na,g={},h=void 0;for(h in f)if(f.hasOwnProperty(h)&&!f[h].ta){var l=c[h],r=f[h].Ob;"undefined"==typeof l||"container"==h&&"object"==typeof l?"undefined"!=typeof r&&(g[h]=r):g[h]=l}e[b[d]]=g}a=[];za(new ya,e,a);return a.join("")};k.xe=m(Y.prototype.xe,"gFNAOAJ");k.se=function(a,b,c){document.getElementById(a)&&Na.log({message:a},"dI");var d=document.createElement("iframe");d.frameBorder=0;d.marginWidth=0;d.marginHeight=0;d.vspace=0;d.hspace=0;d.setAttribute("allowTransparency", +"true");d.scrolling="no";d.style.visibility="hidden";d.width="100%";d.style.height="0px";d.name=b;d.id=a;ra()?(d.style.display="none",this.fd(d),d.src=c,d.style.display=""):(d.src=c,this.fd(d));try{d.contentWindow.name=b}catch(e){}return d};k.se=m(Y.prototype.se,"gAI");k.wc=function(a,b,c){a=this.se(a,b,c);this.Bg=new lb(this.la?"sipl":"mipl");U(a,"load",this.te());this.la||this.He(a)};k.wc=m(Y.prototype.wc,"iAI");k.sf=function(a){document.write('<script src="'+a+'">\x3c/script>')};k.sf=m(Y.prototype.sf, +"sAP");k.fd=function(a){this.Xa.style.fontWeight="normal";this.Xa.style.textAlign="center";this.Xa.innerHTML="";this.Xa.appendChild(a)};k.fd=m(Y.prototype.fd,"aI");k.bf=function(){var a={},b;for(b in this.o)this.o.hasOwnProperty(b)&&(a[b]=this.o[b]);a.ads="n0";a[""]="";a.slaveNumber="0";a.role="s";a=zk(this.Na,this.ed,a);Z[a.Fa()]=a;this.hb.splice(0,0,a);a=document.createElement("div");document.body.appendChild(a);a.style.height="0px";a.style.visibility="hidden";this.o.container=a;this.Jg=this.o.preload= +!0};k.bf=m(Y.prototype.bf,"pM");k.Ke=function(){self.rg=self.rg||(new Date).getTime();return(new Date).getTime()-self.rg>Y.di?!0:!1};k.Ke=m(Y.prototype.Ke,"iTU");k.Ge=function(a,b,c,d,e,f){this.gb=this.cb=this.bb=this.fb=0;this.Kc=b;this.hb=f||null;this.Rg=c||null;this.o=this.Af(a,d,e,f);this.Pi=new zg(this.o.pubId,fc,Ea,Math.random);this.md()||this.la||!document.body||Ak()||this.bf();this.Ch=null==this.Rg?"":this.je(this.o,this.hb,this.Rg);if(this.cd=this.la&&this.Kc.td()||this.ke(this.o,window))if(this.wb= +this.id=this.sc=this.Fa(),this.cd.ld=this.sc,this.ya=ab(this.cd),!this.la){a=[];b=[];for(c=0;c<this.hb.length;c++)a.push(this.hb[c].Fa()),b.push(this.hb[c].o);Bb(this.o)&&(this.o.adRequestUrlParams=this.ya.substr(this.ya.indexOf("?")+1));this.wb=this.xe(this.o,this.sc,b,a);Y.Dh[this.ya]?Na.log({message:this.ya},"dAU"):Y.Dh[this.ya]=!0}};k.Ge=m(Y.prototype.Ge,"i");k.kd=function(){var a=this;a.Zc=new lb("plabl");var b=m(function(){if(!a.md())return!1;a.Zc=a.Zc.clone("iabl");a.nf(a.o.container);a.o.width&& +!a.Jg&&("auto"==a.o.width?a.Xa.style.width="100%":Y.yd(a.o.width)&&(a.Xa.style.width=a.o.width));a.Pe();return!0},"mA");b()||(this.bh=window.setInterval(function(){if(b())clearInterval(a.bh);else if(a.Ke())throw clearInterval(a.bh),Pa('container "'+a.o.container+'" does not exist.');},5))};k.kd=m(Y.prototype.kd,"cI");k.Pe=function(){if(this.cd){var a=this.Kc.td();if(a&&ab(a)&&Bb(this.o)){!0===this.o.debug&&n(a,"debug",!0);"1"==window[Y.Of]&&n(a,"bsl","3");a.ld=this.sc;var b=ab(a);if(this.la)this.wc(this.id, +this.wb,b);else{var c=this;window.google.renderCsaAds=function(){c.wc(c.id,c.wb,b)};this.sf(this.ya)}}else this.wc(this.id,this.wb,this.ya)}};k.Pe=m(Y.prototype.Pe,"mA");k.te=function(){var a=this;return m(function(){a.Bg&&mb(a.Bg,"ol")},"iLC")};k.te=m(Y.prototype.te,"gILC");k.He=function(a){var b=""+this.o.masterNumber,c=new w(b);c.ba("aD."+b,Jb,Bk);c.ba("qi",Ib);c.ba("eawp",Ib);var d=null;this.Jg||(d=this.Fa(),c.ba(d+".hA",Jb,Ck),c.ba(d+".h",x,Dk),c.ba(d+".w",x,Ek),c.ba(d+".aC",x),c.ba(d+".tfs", +Ib));c.ba("v."+b,Ib,Fk);this.o.hasOwnProperty("gcsc")&&this.o.gcsc&&c.ba("r."+b,Jb,Gk);if(this.hb)for(b=0;b<this.hb.length;b++)d=this.hb[b].Fa(),c.ba(d+".hA",Jb,Ck),c.ba(d+".h",x,Dk),c.ba(d+".aC",x);Pb(c,a)};k.He=m(Y.prototype.He,"iFS");k.Ve=function(){if(!this.Bd){this.Bd=!0;var a=this.o.container,b=this.o.noAdLoadedCallback;b&&Hk(b,a,!1);(b=this.o.adLoadedCallback)&&Hk(b,a,!1)}};k.Ve=m(Y.prototype.Ve,"nNA");k.of=function(a,b){a.width="100%";a.style.visibility=0<b?"visible":"hidden";a.style.height= +b+"px";this.Xa.style.height=b+"px"};k.of=m(Y.prototype.of,"sIH");k.mf=function(a){this.Xa.style.width=a+"px"};k.mf=m(Y.prototype.mf,"sCW");k.lf=function(a,b,c){var d=ye(a),e=this.Pi,f=d.y,d=d.x,g=a.offsetHeight;a=a.offsetWidth;var h=c.uc("qi"),l=c.uc("eawp");c=c.uc(b+".tfs");if(!(.01<e.Oj())){var r=new $a("https:"+Ka()+"/afs/gen_204");n(r,"client",e.gg);n(r,"output","uds_ads_only");n(r,"zx",e.tg());n(r,"adbx",d);n(r,"adby",f);n(r,"adbh",g);n(r,"adbw",a);n(r,"adbn",b);n(r,"aqid",h);n(r,"eawp",l);n(r, +"tfs",c);e.hh(ab(r))}};k.lf=m(Y.prototype.lf,"sP");k.gf=function(a,b){var c=this.Fa(),d=Ik(c,!0);d&&(this.of(d,a),!this.Bd&&0<a&&(this.Bd=!0,this.Zc&&mb(this.Zc,"alt"),window.googleNDT_&&!Jk&&p&&(Jk=!0,mb(p,"palt")),setTimeout(ga(this.lf,this,d,c,b),1500),(c=this.o.adLoadedCallback)&&Hk(c,this.o.container,!0)))};k.gf=m(Y.prototype.gf,"rIS");k.md=function(){var a=this.o.container;return"string"==typeof a?(a=document.getElementById(a),!!a):"string"==typeof a.innerHTML?!0:!1};k.md=m(Y.prototype.md,"dCE"); +k.nf=function(a){"string"==typeof a&&(a=document.getElementById(a));this.Xa=a};k.nf=m(Y.prototype.nf,"sC")};var Kk={key:"textColorPalette",g:new Ij(V,5)},Lk=function(a){"array"==ba(a)||(a=[a]);a=vb(Kk,a);for(var b=0;b<a.length;b++)a[b]=Fg(a[b]).ud.substr(1);return a.join(",")};if(!window.IS_GOOGLE_AFS_IFRAME_){var Mk=function(a,b,c,d,e,f,g,h){Y.call(this,a,b,c,d,e,f,g,h)},Mk=m(Mk,"JB");ja(Mk,Y);Mk.prototype.ea=function(){return""};Mk.prototype.ea=m(Mk.prototype.ea,"cFA_cJB");Mk.prototype.Sa=function(a){if(!a.brand&&a.mpn||a.brand&&!a.mpn)throw Pa("Both brand and mpn should be present in the request.");a.gtin?a.query=a.gtin:a.brand&&a.mpn&&(a.query=a.brand+" "+a.mpn);a.textColorPalette&&(a.textColorPalette=Lk(a.textColorPalette));Gb(a)};Mk.prototype.Sa=m(Mk.prototype.Sa, +"vURSO_cJB")};if(!window.IS_GOOGLE_AFS_IFRAME_){var Nk=function(a,b,c,d,e,f,g,h){Y.call(this,a,b,c,d,e,f,g,h)},Nk=m(Nk,"pb");ja(Nk,Y);Nk.prototype.ea=function(){return""};Nk.prototype.ea=m(Nk.prototype.ea,"cFA_PB");Nk.prototype.Sa=function(a){a.textColorPalette&&(a.textColorPalette=Lk(a.textColorPalette));Gb(a)};Nk.prototype.Sa=m(Nk.prototype.Sa,"vAURSO_PB")};if(!window.IS_GOOGLE_AFS_IFRAME_){var Ok=function(a,b,c,d,e,f,g,h){Y.call(this,a,b,c,d,e,f,g,h)},Ok=m(Ok,"rsb");ja(Ok,Y);Ok.Kh="r";Ok.Mh=10;Ok.prototype.ea=function(a){var b=a.relatedSearches;b||0===b||(b=a.number,b||0===b||(b=Ok.Mh));return Ok.Kh+b};Ok.prototype.ea=m(Ok.prototype.ea,"cFA_RS")};if(!window.IS_GOOGLE_AFS_IFRAME_)var zk=function(a,b,c,d,e,f,g){c.relatedSearches?c.type="relatedsearch":c.type||(c.type="ads");if("relatedsearch"==c.type)return new Ok(a,b,c,new xk,d,e,f,g);if("ads"==c.type)return new Y(a,b,c,c.gcsc?new yk:new wk,d,e,f,g);if("plas"==c.type)return new Nk(a,b,c,new wk,d,e,f,g);if("singleProduct"==c.type)return new Mk(a,b,c,new wk,d,e,f,g);throw Pa("invalid block type: "+c.type);},zk=m(zk,"nAB");var Pk=function(){this.options={}},Qk=function(){this.Ze={};this.Tf=[];this.$g=[]};if(!window.IS_GOOGLE_AFS_IFRAME_)var Rk=function(a){if(2>a.length)throw Pa("No options specified.");return 1<a.length&&a[1]instanceof Array?[a[0]].concat(a[1]):Array.prototype.slice.call(a,0)},Rk=m(Rk,"ppata"),Tk=function(a,b,c,d){c=Rk(c);var e=na.toLowerCase();if(-1==e.indexOf("series60")&&-1==e.indexOf("series 60")){d&&(c[0].type=d);d=new Qk;for(var e=c[0],f=null,g=1;g<c.length;g++){var h=f=new Pk,l=e,r=c[g],u=void 0;for(u in r)r.hasOwnProperty(u)&&(h.options[u]=r[u]);for(u in l)l.hasOwnProperty(u)&& +("longerHeadlines"!=u||h.options.maxTop||h.options.minTop)&&(h.options[u]=l[u]);f.options.relatedSearches?d.$g.push(f):d.Tf.push(f)}for(var y in e)e.hasOwnProperty(y)&&(d.Ze[y]=e[y]);Sk(a,b,d.Ze,d.Tf,{});Sk(a,b,d.Ze,d.$g)}},Tk=m(Tk,"aasi"),Sk=function(a,b,c,d){if(0!=d.length){var e=[],f=[],g={maxTop:0,narrow:0,minTop:0,wide:0},h=Ak();h||Uk++;for(var l=d.length-1;0<=l;l--){var r=d[l].options;0==l||h?(h&&(e=[],g={maxTop:0,narrow:0,minTop:0,wide:0},Uk++),r.role="m",r.masterNumber=Uk,r.fexp=Vk.join(","), +r=zk(a,b,r,c,e,g,f)):(r.role="s",r.slaveNumber=l,r.masterNumber=Uk,r=zk(a,b,r),e.splice(0,0,r.we()),f.splice(0,0,r),g.narrow+=r.fb,g.maxTop+=r.bb,g.minTop+=r.cb,g.wide+=r.gb);Z[r.Fa()]=r}a="master-"+Uk;var l=new RegExp("slave-[0-9]+-"+Uk),u;for(u in Z)l.test(u)&&(Z[u].wb+="|"+Z[a].wb);for(l=d.length-1;0<=l;l--)d=["slave",l,Uk].join("-"),Z.hasOwnProperty(d)&&Z[d].kd();Z.hasOwnProperty(a)?Z[a].kd():Na.log({message:"Missing ad block for "+a},"cAFOMM")}},Sk=m(Sk,"cAFO"),Ik=function(a,b){var c=document.getElementById(a); +if(!c&&b){var d=[];try{for(var e=document.getElementsByTagName("iframe"),f=0;f<e.length;f++){var g=e[f];try{d.push(["N="+g.name+"ID="+g.id])}catch(h){}}}catch(h){}Na.log({message:"iframe name: "+a+". existing frames: "+d.join(",")+". num masters: "+Uk},"gAFBN2")}return c},Ik=m(Ik,"gAFBN"),Ck=function(a,b,c,d){d||Z[c.split(".")[0]].Ve()},Ck=m(Ck,"hAC"),Gk=function(a,b,c,d){(a=Z["master-"+b])&&a.o&&(a=a.o.adsRejectedCallback)&&Wk(a,d)},Gk=m(Gk,"aRC"),Dk=function(a,b,c,d){b=Z[c.split(".")[0]];b.gf(d, +a);b&&b.o&&b.o.iframeHeightCallback&&Xk(b.o.iframeHeightCallback,0<d?d:0)},Dk=m(Dk,"hC"),Ek=function(a,b,c,d){Z[c.split(".")[0]].mf(d)},Ek=m(Ek,"wC"),Yk=function(a,b){var c={},d;for(d in Z)if(Z.hasOwnProperty(d)){var e=Z[d];e.o&&e.o.masterNumber==b&&"string"==typeof e.o.container&&(c[e.o.container]=a.ye(d+".aC"))}return c},Yk=m(Yk,"gAC"),Bk=function(a,b){var c=Z["master-"+b];if(c&&c.o&&c.o.adsResponseCallback){var d=Yk(a,b);Zk(c.o.adsResponseCallback,d)}},Bk=m(Bk,"aCC"),Fk=function(a,b,c,d){(a=Z["master-"+ +b])&&a.o&&a.o.visibleUrlsCallback&&$k(a.o.visibleUrlsCallback,d?d.split("|"):[])},Fk=m(Fk,"vUC"),al=null,Ak=function(){if(null!=al)return al;if(6!=oa(pa))return al=!1;var a;if(2<window.location.host.split(".").length)a=window.location.host.split(".").slice(1).join("."),a=a.replace(/:\d*/,"");else return al=!0;window.google.disallowedSameDomain_=!1;var b=document.createElement("iframe"),c=document.createElement("iframe");b.style.display="none";c.style.display="none";var d=document.getElementsByTagName("head")[0]; +d.appendChild(b);d.appendChild(c);try{var e=b.contentWindow.document,f=c.contentWindow.document}catch(g){e=b.document,f=c.document}if(e.domain==a)return al=!0;e.open();e.domain=a;e.write("<script>function test() {}\x3c/script>");e.close();f.open();f.write("<script>var theParent = window.parent;\x3c/script>");f.domain=a;f.write("<script>try{window.parent.frames["+(window.frames.length-2)+"].location} catch(e){theParent.google.disallowedSameDomain_ = true;}\x3c/script>");f.close();al=window.google.disallowedSameDomain_; +b.parentNode.removeChild(b);c.parentNode.removeChild(c);return al},Ak=m(Ak,"dBDSDIC"),Uk=0,Z={},Jk=!1,bl=function(a,b,c){c=1-(c||Math.random)();if(c<b*a.length){try{var d=new Uint16Array(1);window.crypto.getRandomValues(d);c=d[0]/65536}catch(e){c=Math.random()}return a[Math.floor(c*a.length)]}return null},bl=m(bl,"pE"),Vk=hc([bl([2631601,2631602],.05)],ca),Hk=function(a,b,c){a(b,c)},Hk=m(Hk),Wk=function(a,b){a(b)},Wk=m(Wk),Zk=function(a,b){a(b)},Zk=m(Zk),$k=function(a,b){a(b)},$k=m($k),Xk=function(a, +b){a(b)},Xk=m(Xk),cl=function(){p&&mb(p,"ol")},cl=m(cl,"rCPL"),el=function(){p&&!p.rj&&(p.rj=!0,U(window,"load",cl),setTimeout(dl,15E3));U(window,"unload",dl)},el=m(el,"sCEL"),dl=function(){ob()},dl=m(dl,"sCS"),fl=function(a){a&&a()},fl=m(fl),gl=function(){p&&(el(),mb(Y.Gj,"pt"),mb(p,"jlt"))},gl=m(gl,"sCOLT");var hl=function(a){var b;b={};wb(b,[kk,jk,lk,ik,mk,{key:"width",g:new X(0,1E4),H:"wi"},{key:"height",g:new X(0,1E4),H:"he"}]);var c={query:1,gtin:1,brand:1,mpn:1,width:2,height:2,priceMin:1,priceMax:1,priceCurrency:1,textColorPalette:1,testgl:1};nk(c,ok);nk(c,pk);Tk(b,c,arguments,"singleProduct")},hl=m(hl,"jmpMJ");var il=function(a){var b;b={};wb(b,[kk,jk,lk,ik,mk,{key:"width",g:new X(0,1E4),H:"wi"},{key:"height",g:new X(0,1E4),H:"he"},{key:"promoted",g:q,H:"pa"}]);var c={query:2,width:2,height:2,promoted:1,theme:1,priceMin:1,priceMax:1,priceCurrency:1,textColorPalette:1,merchantFilter:1,testgl:1};nk(c,ok);nk(c,pk);Tk(b,c,arguments,"plas")},il=m(il,"cmpp");if(!window.IS_GOOGLE_AFS_IFRAME_){var jl=function(a){var b=xb(),c=yb();Tk(b,c,arguments)},jl=m(jl,"cmpc"),kl={ads:jl,plas:il,"single-product":hl},ml=function(){var a=window._googCsa,b=null,c=null;a&&(b=a.q,c=a.t);window._googCsa=function(){ll(arguments)};c&&(window._googCsa.t=c);if(b&&0<b.length)for(a=0;a<b.length;a++)ll(b[a])},ml=m(ml,"cmps"),ll=function(a){if(a&&1<a.length)if(kl.hasOwnProperty(a[0])){var b=kl[a[0]];3==a.length?new b(a[1],a[2]):new b(a[1],Array.prototype.slice.call(a,2))}else"jsLoadedCallback"== +a[0]&&fl(a[1])},ll=m(ll,"cmpe");window.google=window.google||{};window.google.ads=window.google.ads||{};window.google.ads.search=window.google.ads.search||{};window.google.ads.search.Ads||(window.google.ads.search.Ads=jl,gl(),ml())}; +})();
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js.br b/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js.br Binary files differnew file mode 100644 index 0000000000..6dc14a36f9 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js.br diff --git a/test/modules/http2/htdocs/test1/apache.org-files/cse.js b/test/modules/http2/htdocs/test1/apache.org-files/cse.js new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/cse.js diff --git a/test/modules/http2/htdocs/test1/apache.org-files/css.css b/test/modules/http2/htdocs/test1/apache.org-files/css.css new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/css.css diff --git a/test/modules/http2/htdocs/test1/apache.org-files/default.css b/test/modules/http2/htdocs/test1/apache.org-files/default.css new file mode 100644 index 0000000000..6e2e2c4dad --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/default.css @@ -0,0 +1,676 @@ +/** + * Default Theme, v2. + * + */ +/* Slight reset to make the preview have ample padding. */ +.cse .gsc-control-cse, +.gsc-control-cse { + padding: 1em; + width: auto; +} +.cse .gsc-control-wrapper-cse, +.gsc-control-wrapper-cse { + width: 100%; +} +.cse .gsc-branding, +.gsc-branding { + display: none; +} +/* Selector for entire element. */ +.cse .gsc-control-cse, +.gsc-control-cse { + background-color: #fff; + border: 1px solid #fff; +} +.cse .gsc-control-cse:after, +.gsc-control-cse:after { + content:"."; + display:block; + height:0; + clear:both; + visibility:hidden; +} +.cse .gsc-resultsHeader, +.gsc-resultsHeader { + border: block; +} +table.gsc-search-box td.gsc-input { + padding-right: 24px; +} + +.gsc-search-box-tools .gsc-search-box .gsc-input { + padding-right: 12px; +} + +input.gsc-input { + font-size: 16px; + padding: 4px 9px; + border: 1px solid #D9D9D9; + width: 99%; +} + +.gsc-input-box { + border: 1px solid #D9D9D9; + background: #fff; + height: 25px; +} + +.gsc-search-box .gsc-input>input:hover, +.gsc-input-box-hover { + border: 1px solid #b9b9b9; + border-top-color: #a0a0a0; + -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); + box-shadow: inset 0 1px 2px rgba(0,0,0,.1); + outline: none; +} +.gsc-search-box .gsc-input>input:focus, +.gsc-input-box-focus { + border: 1px solid #4d90fe; + -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.3); + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.3); + box-shadow: inset 0 1px 2px rgba(0,0,0,.3); + outline: none; +} + +/* Search button */ +.cse input.gsc-search-button, +input.gsc-search-button { + font-family: inherit; + font-size: 11px; + font-weight: bold; + color: #fff; + padding: 0 8px; + height: 29px; + min-width: 54px; + + border: 1px solid #666666; + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + + border-color: #3079ed; + background-color: #4d90fe; + background-image: -webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#4787ed)); + background-image: -webkit-linear-gradient(top,#4d90fe,#4787ed); + background-image: -moz-linear-gradient(top,#4d90fe,#4787ed); + background-image: -ms-linear-gradient(top,#4d90fe,#4787ed); + background-image: -o-linear-gradient(top,#4d90fe,#4787ed); + background-image: linear-gradient(top,#4d90fe,#4787ed); + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#4d90fe',EndColorStr='#4787ed'); +} +.cse input.gsc-search-button:hover, +input.gsc-search-button:hover { + border-color: #2f5bb7; + background-color: #357ae8; + background-image: -webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#357ae8)); + background-image: -webkit-linear-gradient(top,#4d90fe,#357ae8); + background-image: -moz-linear-gradient(top,#4d90fe,#357ae8); + background-image: -ms-linear-gradient(top,#4d90fe,#357ae8); + background-image: -o-linear-gradient(top,#4d90fe,#357ae8); + background-image: linear-gradient(top,#4d90fe,#357ae8); + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#4d90fe',EndColorStr='#357ae8'); +} + +.cse input.gsc-search-button:focus, +input.gsc-search-button:focus { + box-shadow:inset 0 0 0 1px rgba(255,255,255,0.5); + -webkit-box-shadow:inset 0 0 0 1px rgba(255,255,255,0.5); + -moz-box-shadow:inset 0 0 0 1px rgba(255,255,255,0.5); +} + +.cse .gsc-search-button input.gsc-search-button-v2, +input.gsc-search-button-v2 { + width: 13px; + height: 13px; + padding: 6px 27px; + min-width: 13px; + margin-top: 2px; +} + +.gsc-refinementHeader { + text-decoration: none; + font-weight: bold; + color: #666; +} + +.gsc-refinementHeader.gsc-refinementhActive { + text-decoration: none; + color: #DD4B39; +} + +.gsc-refinementHeader.gsc-refinementhInactive { + text-decoration: none; + cursor: pointer; +} + +.gsc-refinementHeader.gsc-refinementhInactive>span:hover { + text-decoration: underline; +} + +.gsc-refinementhActive>span { + border-bottom: 3px solid; + padding-bottom: 2px; +} + +.gsc-refinementsArea { + margin-top: 0; + padding-bottom: 4px; + padding-top: 10px; +} + +/* Foont size for refinements */ +.gsc-tabsArea { + font-size: 11px; +} +/* For searcher tabs */ +.gsc-tabsArea > .gsc-tabHeader { + height: 27px; +} +.gsc-tabsArea > div { + height: 30px; + overflow: auto; +} +/* No spacers needed for keneddy refinements */ +.gsc-tabsArea .gs-spacer { + display: none; +} +.gsc-tabsArea .gs-spacer-opera { + display: none; +} +.gsc-tabsArea { + margin-top: 12px; + margin-bottom: 0; + height: 29px; + border-bottom: 1px solid #CCC; +} +/* Refinement tab properties */ +.gsc-tabHeader { + display: inline-block; + padding: 0 8px 1px 8px; + margin-right: 0px; + margin-top: 0px; + font-weight: bold; + height: 27px; + line-height: 27px; + min-width: 54px; + text-align: center; +} +/* Active refinement tab properties */ +.gsc-tabHeader.gsc-tabhActive { + border: 1px solid #ccc; + border-bottom-color: #fff; + color: #202020; +} +/* Inactive refinement tab properties */ +.gsc-tabHeader.gsc-tabhInactive { + background: #fff; + color: #666; + border-left: 0; + border-right: 0; + border-top: 0; +} +/* Inner wrapper for an image result */ +.gsc-imageResult-column, +.gsc-imageResult-classic { + padding: .25em; + border: 1px solid #fff; + margin-bottom: 1em; +} +/* Inner wrapper for a result */ +.gsc-webResult.gsc-result { + padding: .25em; + border: 1px solid #fff; + margin-bottom: 0; +} +/* Inner wrapper for a result */ +.cse .gsc-webResult.gsc-result { + border: 1px solid #fff; + margin-bottom: 0; +} +/* Wrapper for a result. */ +.gsc-webResult .gsc-result { + padding: 10px 0 10px 0; +} +/* Result hover event styling */ +.cse .gsc-webResult.gsc-result:hover, +.gsc-webResult.gsc-result:hover, +.gsc-webResult.gsc-result.gsc-promotion:hover, +.gsc-results .gsc-imageResult-classic:hover, +.gsc-results .gsc-imageResult-column:hover { + border: 1px solid #fff; +} +.gs-web-image-box, +.gs-promotion-image-box { + padding: 2px 0; +} +.gs-promotion-image-box img.gs-promotion-image { + max-width: 50px; +} +.gs-promotion-image-box img.gs-promotion-image, +.gs-promotion-image-box { + width: 50px; +} +.gs-web-image-box img.gs-image { + max-width: 70px; + max-height: 70px; +} + +.gs-web-image-box-landscape img.gs-image { + max-width: 70px; + max-height: 50px; +} + +.gs-web-image-box-portrait img.gs-image { + max-width: 50px; + max-height: 120px; +} + +.gs-image-box.gs-web-image-box.gs-web-image-box-landscape { + width: 80px; +} + +.gs-image-box.gs-web-image-box.gs-web-image-box-portrait { + width: 60px; + height: 50px; + overflow: hidden; +} + +.gs-web-image-box { + text-align: inherit; +} +.gs-promotion-image-box img.gs-promotion-image { + border: 1px solid #ebebeb; +} +/*Promotion Settings*/ +/* The entire promo */ +.cse .gsc-webResult.gsc-result.gsc-promotion, +.gsc-webResult.gsc-result.gsc-promotion { + background-color: #F6F6F6; + margin-top: 5px; + margin-bottom: 10px; +} +.gsc-result-info { + margin-top: 0; + margin-bottom: 0; + padding: 8px; + padding-bottom: 10px; +} +.gs-promotion-text-cell .gs-visibleUrl, +.gs-promotion-text-cell .gs-snippet { + font-size: 13px; +} + +.gsc-table-result, +.gsc-thumbnail-inside, +.gsc-url-top { + padding-left: 8px; + padding-right: 8px; +} + +.gs-promotion-table { + margin-left: 8px; + margin-right: 8px; +} + +.gs-promotion table { + padding-left: 8px; + padding-right: 8px; +} + +table.gs-promotion-table-snippet-with-image{ + padding-left: 0; + padding-right: 0; +} + +.gs-promotion-text-cell { + margin-left: 8px; + margin-right: 8px; +} + +.gs-promotion-text-cell-with-image { + padding-left: 10px; + padding-right: 10px; + vertical-align: top; +} + +/* Promotion links */ +.cse .gs-promotion a.gs-title:link, +.gs-promotion a.gs-title:link, +.cse .gs-promotion a.gs-title:link *, +.gs-promotion a.gs-title:link *, +.cse .gs-promotion .gs-snippet a:link, +.gs-promotion .gs-snippet a:link { + color: #15C; +} +.cse .gs-promotion a.gs-title:visited, +.gs-promotion a.gs-title:visited, +.cse .gs-promotion a.gs-title:visited *, +.gs-promotion a.gs-title:visited *, +.cse .gs-promotion .gs-snippet a:visited, +.gs-promotion .gs-snippet a:visited { + color: #15C; +} +.cse .gs-promotion a.gs-title:hover, +.gs-promotion a.gs-title:hover, +.cse .gs-promotion a.gs-title:hover *, +.gs-promotion a.gs-title:hover *, +.cse .gs-promotion .gs-snippet a:hover, +.gs-promotion .gs-snippet a:hover { + color: #15C; +} +.cse .gs-promotion a.gs-title:active, +.gs-promotion a.gs-title:active, +.cse .gs-promotion a.gs-title:active *, +.gs-promotion a.gs-title:active *, +.cse .gs-promotion .gs-snippet a:active, +.gs-promotion .gs-snippet a:active { + color: #15C; +} +/* Promotion snippet */ +.cse .gs-promotion .gs-snippet, +.gs-promotion .gs-snippet, +.cse .gs-promotion .gs-title .gs-promotion-title-right, +.gs-promotion .gs-title .gs-promotion-title-right, +.cse .gs-promotion .gs-title .gs-promotion-title-right *, +.gs-promotion .gs-title .gs-promotion-title-right * { + color: #000; +} +/* Promotion url */ +.cse .gs-promotion .gs-visibleUrl, +.gs-promotion .gs-visibleUrl { + color: #093; +} +/* Style for auto-completion table + * .gsc-completion-selected : styling for a suggested query which the user has moused-over + * .gsc-completion-container : styling for the table which contains the completions + */ +.gsc-completion-selected { + background: #EEE; +} + +.gsc-completion-container { + font-family: Arial, sans-serif; + font-size: 16px; + background: white; + border: 1px solid #CCC; + border-top-color: #D9D9D9; + margin: 0; +} + +.gsc-completion-title { + color: #15C; +} +.gsc-completion-snippet { + color: #000; +} + +/* Full URL */ +.gs-webResult div.gs-visibleUrl-short, +.gs-promotion div.gs-visibleUrl-short { + display: none; +} +.gs-webResult div.gs-visibleUrl-long, +.gs-promotion div.gs-visibleUrl-long { + display: block; +} + +/* Keneddy shows url at the top of the snippet, after title */ +.gsc-url-top { + display: block; +} + +.gsc-url-bottom { + display: none; +} + +/* Keneddy shows thumbnail inside the snippet, under title and url */ +.gsc-thumbnail-left { + display: none; +} + +.gsc-thumbnail-inside { + display: block; +} + +.gsc-result .gs-title { + height: 1.2em; +} + +.gs-result .gs-title, +.gs-result .gs-title * { + color: #15C; +} + +.gs-result a.gs-visibleUrl, +.gs-result .gs-visibleUrl { + color: #093; + text-decoration: none; + padding-bottom: 2px; +} + +.gsc-results .gsc-cursor-box { + margin: 10px; +} + +.gsc-results .gsc-cursor-box .gsc-cursor-page { + text-decoration: none; +} + +.gsc-results .gsc-cursor-box .gsc-cursor-page:hover { + text-decoration: underline; +} + +.gsc-results .gsc-cursor-box .gsc-cursor-current-page { + text-decoration: none; + color: #DD4B39; +} + +.gsc-preview-reviews, +.gsc-control-cse .gs-snippet, +.gsc-control-cse .gs-promotion em, +.gsc-control-cse .gs-snippet, +.gsc-control-cse .gs-promotion em { + color: #333; +} + +.gsc-control-cse-zh_CN .gs-snippet b, +.gsc-control-cse-zh_CN .gs-promotion em, +.gsc-control-cse-zh_TW .gs-snippet b, +.gsc-control-cse-zh_TW .gs-promotion em { + color: #C03; +} + +.gsc-snippet-metadata, +.gsc-role, +.gsc-tel, +.gsc-org, +.gsc-location, +.gsc-reviewer, +.gsc-author { + color: #666; +} + +.gsc-wrapper.gsc-thinWrapper { + border-right: 1px solid #e9e9e9; +} + +.gs-spelling a { + color: #15C; +} + +.gs-spelling { + color: #333; + padding-left: 7px; + padding-right: 7px; +} + +.gs-snippet { + margin-top: 1px; +} + +div.gsc-clear-button { + background-image: url('//www.google.com/uds/css/v2/clear.png'); +} + +div.gsc-clear-button:hover { + background-image: url('//www.google.com/uds/css/v2/clear-hover.png'); +} + +.gsc-preview-reviews ul { + padding-left: 0; + padding-right: 0; +} + +.gsc-completion-container .gsc-completion-icon-cell { + width: 42px; + height: 42px; + padding-right: 10px; +} + +td.gsc-branding-text, td.gcsc-branding-text { + color: #666; +} + +.gcsc-branding { + padding-top: 4px; + padding-left: 8px; + padding-right: 8px; +} + +.gsc-adBlock { + padding-bottom: 5px; +} + +.gsc-table-cell-snippet-close, +.gsc-table-cell-snippet-open { + padding-left: 0; + padding-right: 0; +} + +.gsc-selected-option-container { + background-color: whiteSmoke; + background-image: linear-gradient(top,whiteSmoke,#F1F1F1); + background-image: -webkit-linear-gradient(top,whiteSmoke,#F1F1F1); + background-image: -moz-linear-gradient(top,whiteSmoke,#F1F1F1); + background-image: -ms-linear-gradient(top,whiteSmoke,#F1F1F1); + background-image: -o-linear-gradient(top,whiteSmoke,#F1F1F1); +} + +/* Facet box css */ +.gsc-context-box { + font-size: 83%; + margin-top: 3px; + border-collapse: collapse; +} + +.gsc-context-box .gsc-col { + padding:1px 0; + white-space: nowrap; + vertical-align: middle; +} + +.gsc-context-box .gsc-facet-label { + width: 65px; + padding-left: 2px; + text-decoration: underline; + color: #0000cc; + cursor: pointer; +} + +.gsc-context-box .gsc-chart { + width: 32em; + padding: 3px; + border-left: 1px solid #0000cc; + border-right: 1px solid #0000cc; +} + +.gsc-context-box .gsc-top { + border-top: 1px solid #0000cc; +} + +.gsc-context-box .gsc-bottom { + border-bottom: 1px solid #0000cc; +} + +.gsc-context-box .gsc-chart div { + background: #0000cc; + height: 9px; +} + +.gsc-context-box .gsc-facet-result { + color: #0000cc; + width: 30px; + text-align: right; + padding-right: 5px; +} + +/* Universal one box css. */ +.gsc-usr-group-thumbnail { + display: inline-block; + max-width: 72px; + max-height: 72px; +} +.gsc-usr-group-thumbnail img { + max-height: 72px; + overflow: hidden; +} +.gs-webResult .gs-title +.gs-title.gsc-usr-group-heading { + color: #0000cc; + cursor: pointer; +} +.gsc-usr-group { + min-height: 100px; + zoom: 1; + display: block; + line-height: 1.24; + margin-top: -7px; + margin-bottom: -7px; + margin-left: 20px; +} +.gsc-usr-group-content { + padding-top: 1px; + padding-bottom: 3px; +} +.gsc-usr-group-content-thumbnail { + display: inline-block; + vertical-align: top; +} +.gsc-usr-group-head-result { + display: inline-block; + padding-left: 6px; +} +.gsc-usr-group-snippet { + width: 100%; + height: 3.6em; + overflow: hidden; +} +.gsc-usr-group-content-results { + font-size: 12px; + padding-left: 1px; + width: 80%; + padding-top: 7px; +} +.gsc-usr-group-head-results { + display:inline-block; + font-size: 13px; + padding-left: 6px; + width: 80%; +} +.gs-webResult .gs-title +.gs-title.gsc-usr-group-all-results { + font-size: 11px; + line-height: 10px; +} +.gs-webResult .gs-title +.gs-title.gsc-usr-group-all-results +b { + font-size: 14px; + font-weight: 600; +} +.gs-webResult .gs-title +.gs-title.gsc-usr-group-heading +b { + color: #0000cc; +} diff --git a/test/modules/http2/htdocs/test1/apache.org-files/defaulten.css b/test/modules/http2/htdocs/test1/apache.org-files/defaulten.css new file mode 100644 index 0000000000..cd2c1c6264 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/defaulten.css @@ -0,0 +1,2284 @@ + +/** Copyright 2005 Google Inc. All rights reserved. */ + +/* the GSearchControl CSS Classes + * .gsc-control : the primary class of the control + */ +.gsc-control { + width: 300px; +} + +.gsc-control div { + position: static; +} + +.gsc-control-cse, +.gsc-control-cse .gsc-table-result { + width: 100%; + font-family: Arial, sans-serif; + font-size : 13px; +} + +.gsc-control-cse div { + position: static; +} + +/* control inputs + * .gsc-search-box : the container that hosts the text input area + * .gsc-input : the text input area + * .gsc-keeper : the save link below savable results + */ +form.gsc-search-box { + font-size: 13px; + margin-top : 0; + margin-right : 0; + margin-bottom : 4px; + margin-left : 0; + width: 100%; +} + +/* + * This table contains the input element as well as the search button + * Note that the search button column is fixed width, designed to hold the + * button div's background image + */ +table.gsc-search-box { + border-style : none; + border-width : 0; + border-spacing : 0 0; + width : 100%; + margin-bottom : 2px; +} + +table.gsc-search-box td { + vertical-align : middle; +} + +table.gsc-search-box td.gsc-input { + padding-right : 12px; +} + +td.gsc-search-button { + width : 1%; +} + +td.gsc-clear-button { + width : 14px; +} + +/** + * undo common generic table rules + * that tend to impact branding + */ +table.gsc-branding td, +table.gsc-branding, +table.gcsc-branding td, +table.gcsc-branding { + margin: 0 0 0 0; + padding: 0 0 0 0; + border : none; +} + +table.gsc-branding, +table.gcsc-branding { + border-style : none; + border-width : 0; + border-spacing : 0 0; + width : 100%; +} + +.gsc-branding-text, +.gcsc-branding-text, +.gsc-branding-text-name, +.gcsc-branding-text-name, { + color : #676767; +} + +td.gsc-branding-text, +td.gcsc-branding-text { + vertical-align : top; +} + +td.gsc-branding-text div.gsc-branding-text, +td.gcsc-branding-text div.gcsc-branding-text { + padding-bottom : 2px; + text-align : right; + font-size : 11px; + margin-right : 2px; +} + +div.gsc-branding-youtube td.gsc-branding-text { + vertical-align : middle; +} + +td.gsc-branding-img-noclear, +td.gcsc-branding-img-noclear { + width : 51px; + vertical-align : bottom; +} + +td.gsc-branding-img, +td.gcsc-branding-img { + width : 65px; + vertical-align : bottom; +} + +div.gsc-branding-youtube td.gsc-branding-img-noclear { + width : 55px; +} + +div.gsc-branding-youtube td.gsc-branding-img { + width : 69px; +} + +table.gsc-branding-vertical td.gsc-branding-text div.gsc-branding-text { + margin-right : 0; + text-align : center; +} + +table.gsc-branding-vertical td.gsc-branding-img-noclear { + text-align : center; +} + +div.gsc-branding-img, +div.gsc-branding-img-noclear, +img.gsc-branding-img, +img.gsc-branding-img-noclear, +div.gcsc-branding-img, +div.gcsc-branding-img-noclear, +img.gcsc-branding-img, +img.gcsc-branding-img-noclear { + padding-top : 1px; +} + +img.gsc-branding-img, +img.gsc-branding-img-noclear, +img.gcsc-branding-img, +img.gcsc-branding-img-noclear { + margin : 0 0 0 0; + padding-right : 0; + padding-left : 0; + padding-bottom : 0; + border : none; + display : inline; +} + +td.gcsc-branding-text { + white-space: nowrap; + width: 100%; +} + +td.gcsc-branding-text div.gcsc-branding-text { + margin: 0 2px; +} + +td.gcsc-branding-img-noclear { + width: auto; +} + +a.gsc-branding-clickable { + cursor : pointer; +} + +input.gsc-search-button { + margin-left : 2px; +} + +div.gsc-clear-button { + display : inline; + text-align : right; + margin-left : 4px; + margin-right : 4px; + padding-left : 10px; + background-repeat: no-repeat; + background-position: center center; + cursor : pointer; +} + +.gsc-search-box-tools .gsc-clear-button { + display: none; +} + +.gsc-results-close-btn { + background-repeat: no-repeat; + background-position: -140px -230px; + float: right; + display: none; + opacity: 0; + height: 12px; + width: 12px; + position: absolute !important; + top: 20px; + right: 20px; + cursor: pointer; +} + +.gsc-results-close-btn-visible { + display: block; + opacity: 1; +} + +.gsc-results-wrapper-nooverlay { +} + +.gsc-results-wrapper-overlay { + border: none; + margin: auto; + border-radius: 1px; + overflow: auto; + height: 80%; + -webkit-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -moz-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -ms-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -o-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + border-collapse: separate; + background: white; + padding: 30px; + width: 70%; + position: fixed !important; + top: 5%; + left: 12%; + opacity: 0; + z-index: 100002; + visibility: hidden; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; + /* For IE 8 */ + -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=7, Direction=135, Color='#888888')"; + /* For IE 5.5 - 7 */ + filter: progid:DXImageTransform.Microsoft.Shadow(Strength=7, Direction=135, Color='#888888'); + +} + +.gsc-results-wrapper-visible { + opacity: 1 !important; + visibility: visible !important; +} + +.gsc-modal-background-image { + position: fixed !important; + top: 0px; + left: 0px; + height: 130%; + width: 100%; + z-index: 100001; + background-color: white; + opacity: 0; + -ms-filter:"alpha(opacity=0)"; + filter: alpha(opacity=0); + display: none; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; +} + +.gsc-modal-background-image-visible { + opacity: 0.8; + -ms-filter:"alpha(opacity=80)"; + filter: alpha(opacity=80); + display: block; +} + +.gsc-overflow-hidden { + overflow: hidden; +} +/* + * Given that this is sitting in a variable width tabel cell, the idea is + * for it to consume the entire cell. The adjacent cell contains the search + * button and that is a fixed width cell. + */ +input.gsc-input { + padding: 1px 6px; + border: 1px solid #DDD; + width: 99%; +} + +.gsc-keeper { + color: #3366cc; + text-decoration: underline; + font-size: 13px; + cursor: pointer; + font-weight: normal; + + padding-left: 16px; + background-repeat: no-repeat; + background-position: 1px 3px; +} + +/* each section of results has a results header table + * .gsc-resultsHeader : the header itseld + * td.twiddleRegionCell : the section that controls twiddleing of the section to expand/collapse + * td.configLabelCell : the twiddler that controls active configuration of a searcher (used in GlocalSearch) + * .gsc-twiddle : the twiddle image, note, this is a div that wraps gsc-title so that standard image replacement is feasible + * .gsc-twiddle-closed : class added to gsc-twiddle when the twiddler is in the closed state + * .gsc-twiddle-opened : class added to gsc-twiddle when the twiddler is in the opened state + * .gsc-title : the section's title (e.g., Web Results, etc.) + * .gsc-stats : contains the result counts + * .gsc-stats + */ +.gsc-resultsHeader { + width : 100%; + clear : both; +} + +.gsc-resultsHeader td.gsc-twiddleRegionCell{ + width: 75%; +} + +.gsc-resultsHeader td.gsc-configLabelCell{ + text-align: right; + width: 75%; +} + +/* + * note that the next three classes are all joined together + * to implement the twiddle image. apps can substitute in their + * own images but will need to account for the image size here + * as well as in the left padding of the title element + * + * Note: uds provides the following images that work with the geometry/padding defined below + * to use these images simply over-ride the.gsc-twiddle-opened/-closed class and specify an alternate image + * or use an image of your own design + */ +.gsc-resultsHeader .gsc-twiddle{ + margin-top: 4px; + display: inline; + cursor: pointer; + background-repeat: no-repeat; + background-position: 0 2px; +} +.gsc-resultsHeader td.gsc-twiddle-closed div.gsc-twiddle{ +} +.gsc-resultsHeader td.gsc-twiddle-opened div.gsc-twiddle{ +} + +.gsc-resultsHeader .gsc-title{ + color: #676767; + margin-right: 10px; + padding-left: 14px; + display: inline; +} + +.gsc-resultsHeader .gsc-stats { + color: #676767; + font-size: 11px; + font-weight: normal; + display : inline; +} + +.gsc-resultsHeader td.gsc-twiddle-opened .gsc-stats { + display : none; +} + +/* + * .gsc-results-selector : box surrounding individual selectors for 1, more, or all results + * .gsc-result-selector : an individual selector + * .gsc-one-result : single result selector + * .gsc-more-results : more (4) results selector + * .gsc-all-results : all results (8) selector + */ +.gsc-results-selector { + display : inline; +} + +.gsc-resultsHeader td.gsc-twiddle-closed .gsc-results-selector { + display : none; +} + +.gsc-result-selector { + cursor : pointer; + display : inline; + font-size : 13px; + padding-left : 13px; + background-repeat: no-repeat; + background-position: center left; +} + +/* default mode is dark */ +.gsc-one-result { +} + +.gsc-more-results { +} + +.gsc-all-results { + padding-right : 1px; +} + +/* active mode is light */ +.gsc-one-result-active .gsc-one-result { +} + +.gsc-more-results-active .gsc-more-results { +} + +.gsc-all-results-active .gsc-all-results { +} + +.gsc-resultsHeader .gsc-configLabel{ + color: #676767; + display: inline; + font-size: 11px; + cursor: pointer; +} + +.gsc-resultsHeader td.gsc-configLabelCell span.gsc-twiddle-closed { + padding-right: 12px; + background-repeat: no-repeat; + background-position: center center; +} + + +/* tabbed mode of search control + * .gsc-tabsArea : the box containing all of the tabs + * .gsc-tabsAreaInvisible : same as above, but this is the state when search has been cleared + * .gsc-tabHeader : an individual tab + * .gsc-tabHeader.gsc-tabhActive : the active tab + * .gsc-tabHeader.gsc-tabhInactive : an inactive tab + * .gsc-tabData : the data area/box containg results and header data for each tab + * .gsc-tabData.gsc-tabdActive : the data area for the active tab + * .gsc-tabData.gsc-tabdInactive : the data area for inactive tabs + */ +.gsc-tabsArea { + clear: both; + margin-top: 6px; + margin-bottom: 8px; + } + +.gsc-tabsArea .gs-spacer { + font-size : 1px; + margin-right : 0; + overflow : hidden; +} + +.gsc-tabsArea .gs-spacer-opera { + margin-right : 0; +} + +.gsc-tabsAreaInvisible, +.gsc-refinementsAreaInvisible, +.gsc-refinementBlockInvisible { + display : none; + } + +.gsc-tabHeader { + padding-left: 6px; + padding-right: 6px; + margin-right: 2px; + margin-top: 2px; + } + +.gsc-tabHeader.gsc-tabhActive { + border-left: 1px solid #e9e9e9; + border-right: 1px solid #e9e9e9; + border-top: 2px solid #ff9900; + color: black; + } + +.gsc-tabHeader.gsc-tabhInactive { + border-left: 1px solid #e9e9e9; + border-right: 1px solid #e9e9e9; + border-top: 2px solid #e9e9e9; + background: #e9e9e9; + color: #676767; + cursor: pointer; + } + +.gsc-tabData.gsc-tabdActive { + display: block; + } + +.gsc-tabData.gsc-tabdInactive { + display: none; + } + +/* gsc-resultsbox-invisible is preferred over gsc-tabdActive */ +.gsc-tabData.gsc-tabdActive.gsc-resultsbox-invisible{ + display: none; + } + +.gsc-refinementsArea { + clear: both; + margin-bottom: 4px; + padding-left: 8px; + border-bottom: 1px solid #E9E9E9; + padding-bottom: 5px + } + +.gsc-refinementHeader { + margin-right: 2px; + padding: 2px 8px 0 8px; + } + +.gsc-refinementHeader.gsc-refinementhActive { + font-weight: bold; + } + +.gsc-refinementHeader.gsc-refinementhInactive { + text-decoration: underline; + cursor: pointer; + } + +/* tab specific results header supression + * - no twiddle, tabbed mode runs in full expand mode + * - no title + * - no stats + */ +.gsc-tabData .gsc-resultsHeader .gsc-title { + display: none; + } + +.gsc-tabData .gsc-resultsHeader .gsc-stats { + display: none; + } + +.gsc-tabData .gsc-resultsHeader .gsc-results-selector { + display : none; +} + +/* style for auto-completion table + * .gsc-completion-selected : highlighted completions. + * .gsc-completion-container : styling for the table which contains the completions + * .gsc-completion-promotion-selected: highlighted promotions + */ +.gsc-completion-selected { + background : #EEEEEE; + cursor: default; +} + +.gsc-completion-selected .gsc-completion-promotion-table { + cursor: pointer; +} + +.gsc-completion-container { + font-family: Arial, sans-serif; + font-size: 13px; + background: white; + border : 1px solid #DDD; + border-top-color: #D9D9D9; + box-shadow: 0 2px 4px rgba(0,0,0,0.2); + -moz-box-shadow: 0 2px 4px rgba(0,0,0,0.2); + -webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.2); + margin: 0; +} + +.gsc-completion-title { + color: #0000cc; + line-height: normal; + white-space: normal; +} + +.gsc-completion-snippet { + line-height: normal; + white-space: normal; +} + +.gsc-completion-container .gsc-completion-icon-cell { + width: 42px; + height: 42px; + padding-right: 10px; +} + +.gsc-completion-icon { + /* place image in the middle */ + margin-left: auto; + margin-right: auto; + display: block; + border: 1px solid #dddddd; +} + +.gsc-completion-container .gsc-completion-promotion-table { + font-size : inherit; + background: inherit; + margin: 5px 0; + width: 100%; +} + +/* the results for each section + * .gsc-resultsbox-{visible,invisible} : a complete-collection of results including headers + * .gsc-results : the collection of results for a given searcher + * .gsc-result : a generic result within the control. each result has this class, as well as .gsc-xxxResult where xxx is web, image, local, blog, etc. + */ +.gsc-resultsbox-visible { + display : block; +} + +.gsc-resultsbox-invisible { + display : none; +} + +.gsc-results { + padding-bottom: 2px; + width : 99%; +} + +.gsc-result { + margin-bottom: 10px; +} + +.gsc-result .gs-title { + height: 1.4em; + overflow: hidden; +} + +/* specialized, result type specific, fine grained controls */ +.gsc-result div.gs-watermark { + display: none; +} + +/* Ads + */ +.gsc-results .gsc-result img.gs-ad-marker { + display: none; +} + +.gsc-wrapper { + position : relative; + display : block; +} + +.gsc-adBlock { + position : relative; + display : block; + border-bottom: 1px solid #E9E9E9; + margin-bottom: 4px; +} + +.gsc-adBlock h2 { + float : right; + margin : 3px 5px 0; + font-weight : normal; + font-size : .9em; + color : #676767; +} + +.gsc-adBlock .gsc-ad { + padding-left : 8px; + padding-top : 5px; + padding-right : 3px; +} + +.gsc-adBlock .gsc-ad a { + font-weight : bolder; + color : #0000CC; + line-height : 1.4em; +} + +.gsc-adBlock .gsc-ad cite { + font-style : normal; + color : green; +} + +.gsc-adBlock .gsc-ad span { + padding-left : 8px; +} + +.gsc-adBlockNoHeight { + height : 0; +} + +.gsc-adBlockInvisible { + display : none; +} + +.gsc-adBlockVertical { + position : relative; + display : block; + float : right; + clear: right; + width : 30%; +} + +.gsc-adBlockBottom { + position : relative; + display : block; + border-bottom: 1px solid #E9E9E9; + border-top: 1px solid #E9E9E9; + margin-bottom: 4px; +} + +.gsc-thinWrapper { + width : 69%; + float : left; + overflow : hidden; +} + +.gsc-adBlockVertical h2 { + text-align : center; + font-weight : normal; + font-size : .9em; + color : #676767; + margin-top : 6px; +} + +.gsc-adBlockVertical .gsc-ad { + padding-left : 8px; + padding-top : 5px; +} + +.gsc-adBlockVertical .gsc-ad a { + font-weight : bolder; + color : #0000CC; + line-height : 1.4em; +} + +.gsc-adBlockVertical .gsc-ad cite { + font-style : normal; + color : green; + display : block; +} + +.gsc-adBlockVertical .gsc-ad span { +} + +/* Standard configuration div/form */ +div.gsc-config { + border: 1px solid #e9e9e9; + margin-top: 0; + margin-bottom: 10px; + padding-top : 2px; + padding-left : 6px; + padding-right : 6px; + padding-bottom : 6px; +} + +form.gsc-config { + margin-bottom : 0; +} + +.gsc-configSetting { + margin-top : 6px; + } + +.gsc-configSetting_Label { + color: #676767; + } + +.gsc-configSettingInput { + color: #676767; + border: 1px solid #e9e9e9; + width: 75%; + } + +.gsc-configSettingCheckbox { + color: #676767; + margin-right: 6px; + } + +.gsc-configSettingCheckboxLabel { + display : inline; + color: #676767; + } + +div.gsc-configSettingSubmit { + margin-top : 8px; + text-align : right; +} + +input.gsc-configSettingSubmit { + display: inline; + font-size: 11px; + cursor: pointer; +} + +/* Added so elements inside a result are properly cleared by the container. */ +.gsc-webResult:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +.gsc-webResult { + zoom: 1; /* IE-specific hack to get the layout clearing right. */ +} + +/* Wrapper for a result. */ +.gsc-webResult .gsc-result { + margin: 0; + padding: .5em 0; + border-bottom: 1px solid #ebebeb; +} + +.gsc-above-wrapper-area { + border-bottom: 1px solid #E9E9E9; + padding: 5px 0 5px 0; +} + +.gsc-above-wrapper-area-invisible { + display: none; +} + +.gsc-above-wrapper-area-container { + width: 100%; +} + +.gsc-result-info { + text-align: left; + color: #676767; + font-size: 13px; + padding-left: 8px; + margin: 10px 0 10px 0; +} + +.gsc-result-info-container { + text-align: left; +} + +.gsc-result-info-invisible { + display: none; +} + +.gsc-orderby-container { + text-align: right; + background: transparent; +} + +.gsc-orderby-invisible { + display: none; +} + +.gsc-orderby-label { + color: #676767; + padding: 5px 5px 6px 0; +} + +.gsc-getlink-container { + padding-left: 5px; + padding-top: 1px; + width: 45px; +} + +.gsc-getlink-invisible { + display: none; +} + +.gsc-getlink { + width: 5px; +} + +.gsc-getlink-box { + background-color: rgb(245,245,245); + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 2px; + box-shadow: 0 1px 1px #eee; + box-shadow: 0 1px 1px rgba(0,0,0,0.1); + color: #444; + cursor: default; + font-size: 11px; + font-weight: bold; + height: 27px; + line-height: 27px; + max-width: 90%; + min-width: 10px; + outline: 0; + padding: 0 28px 0 6px; + position: relative; + text-align: center; +} + +.gsc-control-cse .gsc-getlink-textbox { + background: #fff; + border: 1px solid #eee; + border: 1px solid rgba(0,0,0,.2); + box-shadow: 0 2px 4px #eee; + box-shadow: 0 2px 4px rgba(0,0,0,0.2); + cursor: default; + margin: 0; + max-height: 360px; + outline: none; + padding: 10px; + position: absolute; + right: 20px; + z-index: 7; + width: auto; +} + +.gsc-getlink-inputbox { + width: 300px; + margin-top: 5px; +} + +.gsc-getlink-label { + width: 100%; + font-size: 14px; +} + +.gsc-getlink-image { + height: 29px; +} + +.gsc-getlink-text-invisible { + display: none; +} + +.gsc-selected-option-container { + background-color: transparent; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 2px; + box-shadow: 0 1px 1px #eee; + box-shadow: 0 1px 1px rgba(0,0,0,0.1); + color: #444; + cursor: default; + font-size: 11px; + font-weight: bold; + height: 27px; + line-height: 27px; + max-width: 90%; + min-width: 54px; + outline: 0; + padding: 0 28px 0 6px; + position: relative; + text-align: center; + width: 50px!important; +} + +.gsc-selected-option { + position: relative; + width: 100%; +} + +.gsc-control-cse .gsc-option-selector { + border: none; + height: 11px; + margin-top: -4px; + position: absolute; + right: 5px; + top: 12px; + width: 7px; + padding: 0 5px 0 5px; + background: url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat +} + +.gsc-option-menu-invisible { + display: none; +} + +.gsc-control-cse .gsc-option-menu-container { + color: #000; + font-size: 80%; + position: relative; +} + +.gsc-control-cse .gsc-option-menu { + background: #fff; + border: 1px solid #eee; + border: 1px solid rgba(0,0,0,.2); + box-shadow: 0 2px 4px #eee; + box-shadow: 0 2px 4px rgba(0,0,0,0.2); + cursor: default; + font-size: 13px; + margin: 0; + max-height: 360px; + outline: none; + padding: 6px 0; + position: absolute; + right: 0; + top: 0; + z-index: 7; +} + +.gsc-option-menu-item { + color: #777; + cursor: pointer; + list-style: none; + margin: 0; + padding: 0 30px 0 30px; + white-space: nowrap; +} + +.gsc-option-menu-item-highlighted { + background-color: #EEE; + border-color: #EEE; + border-width: 1px 0; + color: #333; +} + +.gsc-option { + cursor: pointer; + list-style: none; + white-space: nowrap; + line-height: 27px; + text-align: left; +} + +.gs-web-image-box, +.gs-promotion-image-box { + float: left; + padding: 2px 8px 2px 0px; + margin-right: 0px; + margin-left: 0px; + text-align:center; + width: 62px; /* default width + 1px border */ +} + +.gs-web-image-box img.gs-image, +.gs-promotion-image-box img.gs-promotion-image { + border: 1px solid #e2e2e2; + max-width: 60px; /* Small icons width. */ + max-height: 120px; /* Limit height too. */ + /* IE-specific hack to simulate max-width and max-height. */ + /* For IE, image size will be 105 because various default + * values for margins and borders are different. + */ + width: expression(this.width > 64 ? '64px': true); + height: expression(this.height > 120 ? '120px': true); +} + +div.gs-action { + display: inline; + margin-right: 0.6em; +} +div.gs-action a.gs-action { + color: #7777CC; +} +div.gs-action.cart a.gs-action, +div.gs-action.star a.gs-action, +div.gs-action.rss a.gs-action, +div.gs-action.download a.gs-action, +div.gs-action.email a.gs-action, +div.gs-action.mobile a.gs-action, +div.gs-action.share a.gs-action, +div.gs-action.fullscreen a.gs-action, +div.gs-action.generic a.gs-action, +div.gs-action.link a.gs-action { + padding-left: 18px; +} +div.gs-action.cart a.gs-action { + background-position: 0 0; +} +div.gs-action.star a.gs-action { + background-position: -16px -34px; +} +div.gs-action.rss a.gs-action { + background-position: -48px -98px; +} +div.gs-action.download a.gs-action { + background-position: -64px -128px; +} +div.gs-action.email a.gs-action { + background-position: -112px -224px; +} +div.gs-action.mobile a.gs-action { + background-position: -131px -257px; +} +div.gs-action.share a.gs-action { + background-position: -32px -64px; +} +div.gs-action.fullscreen a.gs-action { + background-position: -79px -162px; +} +div.gs-action.generic a.gs-action { + background-position: -144px -290px; +} +div.gs-action.link a.gs-action { + background-position: -159px -321px; +} + +/* Image Search + */ +.gsc-imageResult .gs-imageResult .gs-text-box .gs-ellipsis { + overflow:hidden; + text-align: left; + text-overflow:ellipsis; + -o-text-overflow:ellipsis; + -ms-text-overflow:ellipsis; + white-space:nowrap; +} + +.gsc-imageResult { + float: left; + margin-bottom: 1em; + margin-right: 20px; +} + +.gsc-imageResult-column { + margin-right: 70px; +} + +.gs-imageResult { + overflow: hidden; +} + +.gs-imageResult .gs-image-box { + height: 86px; /* default height + 1px border */ + position : relative; +} + +.gs-imageResult .gs-text-box { + text-align: center; + overflow : hidden; + height: 4em; +} + +/* No padding for image result */ +.gs-imageResult div.gs-title, +.gs-imageResult .gs-snippet, +.gs-imageResult .gs-visibleUrl, +.gs-imageResult .gs-visibleUrl-short, +.gs-imageResult .gs-spelling { + padding: 0; +} + +.gs-imageResult .gs-snippet { + overflow : hidden; + line-height: 1em; + white-space : nowrap; +} +.gs-imageResult .gs-visibleUrl { + overflow : hidden; + line-height: 1.3em; + height: 1.3em; +} + +.gs-imageResult .gs-size { + color: #6f6f6f; +} + +.gs-imageResult .gs-image-box { + text-align: center; /* center align image in image box */ +} + +.gs-imageResult .gs-image-box img.gs-image { + border: none; +} + +/* Classic layout related styles */ + +/* Do not show title for compact layout such as classic and popup */ +.gs-imageResult-classic .gs-text-box .gs-title { + display: none; +} + +/* Column layout related styles */ + +.gs-imageResult-column { + width: 474px; /* image box width (114px) + image box right margin (10px) + text box width (350px) */ + height: 84px; /* image box height */ +} + +.gs-imageResult-column .gs-image-box { + float: left; + margin-right: 10px; + text-align: left; +} + +.gs-imageResult-column .gs-text-box { + float: left; + width: 350px; + height: 86px; /* image box height */ +} + +.gsc-imageResult-column .gs-imageResult-column .gs-text-box .gs-title { + height: auto; + text-align: left; + white-space:normal; + overflow:hidden; + text-overflow:ellipsis; + -o-text-overflow:ellipsis; + -ms-text-overflow:ellipsis; +} + +.gs-imageResult-column .gs-text-box .gs-size { + display: none; +} + +/* Popup layout related styles */ + +/* No margin, padding or border for popup layout */ +.gsc-imageResult.gsc-imageResult-popup, +.gsc-results .gsc-imageResult-popup:hover { + margin: 0; + padding: 0; + border: 0; +} + +.gsc-imageResult .gs-imageResult-popup { + width: auto; /* Override the default image result width */ + overflow: visible; /* popup box may overflow and should be visible */ + position: relative; +} + +/* Instead put margin bottom and right on searcher image thumbnail. */ +.gs-imageResult-popup .gs-image-thumbnail-box { + padding: 5px; +} + +.gs-imageResult-popup .gs-image-box { + width: auto; +} + +.gs-imageResult-popup .gs-image-popup-box { + width: auto; + position : absolute; + padding: 10px; + background: white; + left: 0; + top: 0; + border: 1px solid #dddddd; + -webkit-box-shadow: 0 4px 16px rgba(0,0,0,0.2); + -moz-box-shadow: 0 4px 16px rgba(0,0,0,0.2); + -ms-box-shadow: 0 4px 16px rgba(0,0,0,0.2); + box-shadow: 0 4px 16px rgba(0,0,0,0.2); + -webkit-outline:1px solid rgba(0,0,0,0.2); + display: none; +} + +.gs-imageResult-popup .gs-image-popup-box .gs-image-box { + height: auto; /* override default image box width (86px) */ + width: auto; /* override default image box height (114px) */ + margin-bottom: 10px; +} + +.gs-imageResult-popup .gs-image-popup-box .gs-text-box { + height: auto; + width: auto; +} + +/* Do not show title for compact layout such as classic and popup */ +.gs-imageResult-popup .gs-text-box .gs-title { + display: none; +} + + +/* Video Search + * - single line title + */ + +.gsc-videoResult .gs-videoResult .gs-title { + line-height: 1.3em; + height: 1.3em; + overflow: hidden; + } + +.gsc-videoResult .gs-videoResult .gs-snippet { + line-height: 1.3em; + max-height: 2.6em; + overflow: hidden; + } + +/* trailing more link at the bottom of + * a collection of results + */ +.gsc-imageResult .gsc-trailing-more-results { + clear : both; +} + +.gsc-results .gsc-trailing-more-results { + margin-bottom : 10px; +} + +.gsc-results .gsc-trailing-more-results, +.gsc-results .gsc-trailing-more-results * { + color: #0000cc; + text-decoration: underline; +} + +/* trailing cursor section + */ +.gsc-imageResult .gsc-cursor-box { + clear : both; +} + +.gsc-results .gsc-cursor-box .gsc-trailing-more-results { + margin-bottom : 0; + display : inline; +} + +.gsc-results .gsc-cursor { + display : inline; +} + +.gsc-results .gsc-cursor-box { + margin-bottom : 10px; +} + +.gsc-results .gsc-cursor-box .gsc-cursor-page { + cursor : pointer; + color : #000000; + text-decoration: underline; + margin-right : 8px; + display : inline; +} + +.gsc-results .gsc-cursor-box .gsc-cursor-current-page { + cursor : default; + color : #A90A08; + font-weight : bold; + text-decoration: none; +} + + + +/*** End of Control, Begin Results ***/ + +/* generic, cross cutting result style + * - in the form of .gs-result .gs-xxx where xxx is the generic style + * .gs-title : typically the first line of a result, typically a link, image results over ride this, since for image results, the image is the link + * .gs-divider : typically seperates results from ads + * .gs-visibleUrl : typically the last line of a result, displayed in green. sometimes a link (like in blog search) + * .gs-clusterUrl : for news, and other similar services, this is a cluster of additional results + * img.gs-image : an actial image in a result + * .gs-phone : a phone number + * .gs-address : an address (includes street, city, region, country) + * .gs-streetAddress : a street (including #) + * .gs-city : a city + * .gs-region : a region (zip code, area, etc.) + * .gs-country : a country + * .gs-snippet : snippetized content + * .gs-watermark : indicator that user selected this result + * .gs-metadata : generic metadata, e.g., + * .gs-image-box : generic container for a result's image (within a table) + * .gs-text-box : generic container for a result's text content (within a table). Note that this class, and image-box are only used in video + */ +.gs-result .gs-title, +.gs-result .gs-title * { + color: #0000cc; + text-decoration: underline; +} + +.gsc-control-cse .gs-spelling, +.gsc-control-cse .gs-result .gs-title, +.gsc-control-cse .gs-result .gs-title * { + font-size: 16px; +} + +.gsc-control-cse .gs-result .gs-spelling-original { + font-size: 13px; +} + +.gs-divider { + padding-bottom: 8px; + text-align: center; + color: #676767; +} + +.gs-result a.gs-visibleUrl, +.gs-result .gs-visibleUrl { + color: #008000; + text-decoration: none; +} + +/* relative and absolute dates, note, news/books inlines these */ +.gs-relativePublishedDate, +.gs-publishedDate { + color: #6f6f6f; + text-decoration: none; +} +.gs-result a.gs-clusterUrl, +.gs-result .gs-clusterUrl { + color: #008000; + text-decoration: underline; + cursor: pointer; +} + +.gs-newsResult .gs-publisher { + color: #6f6f6f; + display : inline; + text-decoration: none; +} + +/* + * For news results there are two dates... + * The relative date is visible while in the + * search control and the published date + * is visible when clipped. Why? It doesn't + * make sense to say 4 hours ago for a clipped + * result... + */ + +/* establish the base style */ +.gs-newsResult .gs-relativePublishedDate, +.gs-newsResult .gs-publishedDate { + display : inline; + margin-left : 4px; +} + +/* base styling for relative date is none */ +.gs-blogResult .gs-relativePublishedDate, +.gs-newsResult .gs-relativePublishedDate { + display : none; +} + +/* suppress publishedDate while in the control */ +.gsc-blogResult .gs-blogResult .gs-publishedDate, +.gsc-newsResult .gs-newsResult .gs-publishedDate { + display : none; +} + +/* enable relativePublishedDate while in the control */ +.gsc-blogResult .gs-blogResult .gs-relativePublishedDate, +.gsc-newsResult .gs-newsResult .gs-relativePublishedDate { + display : inline; +} + +.gs-newsResult .gs-location { + color: #6f6f6f; + display : inline; + text-decoration: none; +} + +.gs-promotion .gs-title, +.gs-promotion .gs-title * { + text-decoration: none; +} + +.gs-promotion a.gs-title, +.gs-promotion a.gs-title * { + text-decoration: underline; +} + +.gs-title .gs-promotion-title-right { + color: #000000; +} + +.gsc-webResult.gsc-result.gsc-promotion { + background-color: #fff; +} + +span.gs-fileFormat { + color: #666666; + font-size: 12px; +} + +span.gs-fileFormatType { + font-size: 12px; +} + +.gs-promotion table { + border : none; + border-style : none; + border-width : 0; + border-spacing : 0 0; + margin: 0 0 0 0; + padding: 0 0 0 0; +} + +.gs-promotion table .gs-snippet a span.gs-title, +.gs-promotion table .gs-snippet a span.gs-title * { + font-size: 13px; +} + +.gs-promotion em { + font-style: normal; + font-weight: bold; +} + +.gs-promotion .gs-title em { + color: inherit; + text-decoration: inherit; +} + +.gs-result img.gs-image, +.gs-result img.gs-promotion-image { + vertical-align : middle; + border : 1px solid #e2e2e2; +} + +.gs-result div.gs-phone {} + +.gs-result .gs-directions, +.gs-result .gs-directions * { + color: #7777cc; + font-weight: normal; + text-decoration : underline; + cursor : pointer; +} + +.gs-secondary-link, +.gs-secondary-link * { + color: #7777cc; + font-weight: normal; + text-decoration : underline; + cursor : pointer; +} + +/* wrapper around user supplied to/from mode directions + * normally this is disabled by default, and gs-directions is enabled + * apps can easily switch this by setting display:block on the rule below, + * and display:none on the rule above + * e.g., add these two rules to switch local results into + * alternate style driving directions + * .gs-localResult .gs-directions-to-from { display : block; } + * .gs-localResult .gs-directions { display : none; } + */ +.gs-result .gs-directions-to-from { + display : none; + margin-top : 4px; +} +.gs-result .gs-directions-to-from .gs-label { + display : inline; + margin-right : 4px; +} + +.gs-result .gs-directions-to-from div.gs-secondary-link { + display : inline; +} + +.gs-result .gs-directions-to-from .gs-spacer { + display : inline; + margin-right : 3px; + margin-left : 3px; +} + +.gs-videoResult a.gs-publisher, +.gs-videoResult .gs-publisher { + color: #008000; + text-decoration: none; +} + +.gs-result a { + cursor: pointer; +} + +.gs-result .gs-address { +} + +.gs-result .gs-snippet { +} + +.gsc-loading-fade .gsc-result-info, +.gsc-loading-fade .gsc-loading-resultsRoot, +.gsc-loading-resultsRoot, /* customized root */ +.gsc-loading-fade .gsc-loading-refinementsArea, +.gsc-loading-fade .gsc-adBlock, +.gsc-loading-fade .gsc-adBlockVertical, +.gsc-loading-fade .gsc-adBlockNoHeight { + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=33.3)"; + filter: alpha(opacity=33.3); + opacity: 0.333; +} + +.gs-no-results-result .gs-snippet, +.gs-error-result .gs-snippet { + padding : 5px; + margin : 5px; + border : 1px solid rgb(255,204,51); + background-color : rgb(255,244,194); +} + +.gs-result .gs-watermark{ + font-size: 10px; + color: #7777cc; +} + +div.gs-results-attribution { + text-align : center; + margin-bottom : 4px; +} + +div.gs-results-attribution, +div.gs-results-attribution * { + font-size : 10px; + color : #676767; + text-decoration : none; +} + +div.gs-results-attribution a { + color: #0000cc; + cursor : pointer; +} + +div.gs-results-attribution a:hover { + text-decoration : underline; +} + +.gs-result .gs-metadata{ + color: #676767; +} + +/* searcher specific styling for + * - web ad + * - web + * - local + * - image (none) + * - blog (none) + * - video (none) + */ + +/* webAd search specific over rides + * .gs-ad-marker : disabled in control, but on in green to indicate clipped result is an ad + */ +.gs-localAd img.gs-ad-marker, +.gs-webAd img.gs-ad-marker { + padding-left: 4px; +} + +/* default is to not show long mode visible urls + * apps should selectively enable this while disabling + * div.gs-visibleUrl-short + */ +.gs-webResult div.gs-visibleUrl-long, +.gs-promotion div.gs-visibleUrl-long { + overflow : hidden; + display : none; +} + +/* Per result labels + */ +.gs-webResult div.gs-per-result-labels a.gs-label { + text-decoration : underline; + cursor : pointer; + padding : 3px; + color : black; +} + +.gs-webResult div.gs-per-result-labels a.gs-label.gs-labelActive { + cursor : default; + text-decoration : none; +} + +/* local search specific over rides + * - city, region displayed inline + * - country supressed + * - small font size for info window's + */ + +.gs-localAd div.gs-address * { + color : #676767; +} + +.gs-localAd div.gs-street { + display: inline; +} + +div.gs-city { + display: inline; +} + +div.gs-region { + display: inline; +} + +div.gs-country { + display: none; +} + +div.gs-infoWindow * { + font-size: 11px; + } + +/* video search specific over rides + * - align the table data + * - default image width garuntee + * - appropriate cell seperation + */ + +/* todo(markl): workaround until gre in gmail fixes his styles */ +.gs-videoResult * { + font-size: 13px; + } + +/* +.gs-videoResult td .gs-image { + vertical-align : middle; +} + +.gs-videoResult td.gs-image-box { + background-color : #000000; +}*/ + +.gs-videoResult td div.gs-image-box { + width : 110px; + height : 78px; +} + +.gs-videoResult td div.gs-text-box { + vertical-align: top; + margin-left: 4px; + } + + +/* book search specific over rides + * - default image width garuntee + * - appropriate cell seperation + */ + +div.gs-book-image-box td, +.gs-bookResult td { + vertical-align : top; +} + +div.gs-book-image-box, +div.gs-book-image-box div { + position : static; + text-align : start; +} + +div.gs-book-image-box { + width : 75px; + height : 90px; +} + +.gs-bookResult td div.gs-text-box { + vertical-align: top; + margin-left: 4px; + } + +div.gs-book-image-box img { + border-spacing : 0 0; + border : none; +} + +div.gs-book-image-box div.gs-row-1 { + line-height : 7px; +} + +div.gs-book-image-box img.gs-pages { + height : 7px; + width : 45px; +} + +div.gs-book-image-box img.gs-page-edge { + height : 7px; + width : 11px; +} + +div.gs-book-image-box div.gs-row-2 { +} + +div.gs-book-image-box img.gs-image { + height : 80px; + border : 1px solid #a0a0a0; +} + +.gs-bookResult .gs-author { + display : inline; + color: #6f6f6f; +} +.gs-bookResult .gs-publishedDate { + display : inline; +} + +.gs-bookResult .gs-pageCount { + display : inline; + color: #6f6f6f; + margin-left : 4px; +} + +.gs-bookResult .gs-id {} + + + +/* book search specific over rides + * - default image width garuntee + * - appropriate cell seperation + */ + +.gs-patentResult td { + vertical-align : top; +} +.gs-patentResult .gs-patent-number, +.gs-patentResult .gs-publishedDate, +.gs-patentResult .gs-author { + display:inline; +} + +.gs-patentResult .gs-image-box { + padding-right : 8px; +} + +.gs-patentResult img.gs-image { + border : 1px solid #7777cc; +} + +.gs-spelling a { + color: #0000cc; + cursor: pointer; + text-decoration : underline; +} + +.gsc-control-cse:after { + content:"."; + display:block; + clear:both; + height:0; + visibility: hidden; +} + +.gs-bidi-start-align { + text-align: left; +} + +.gs-bidi-end-align { + text-align: right; +} + +.gsc-control-cse-zh_CN .gs-snippet b, +.gsc-control-cse-zh_CN .gs-promotion em, +.gsc-control-cse-zh_TW .gs-snippet b, +.gsc-control-cse-zh_TW .gs-promotion em { + color: #C03; + font-style: normal; + font-weight: normal; +} + +.gsc-snippet-metadata { + color: #767676; + vertical-align: top; +} + +.gsc-role { + color: #767676; +} + +.gsc-tel { + color: #767676; +} + +.gsc-org { + color: #767676; +} + +.gsc-location { + color: #767676; +} + +.gsc-rating-bar { + vertical-align: top; + display: inline-block; + width: 64px; + height: 12px; + background: transparent url(/uds/css/cse_snippets_stars.png) -65px 0 no-repeat; + overflow:hidden; + margin: 2px 0 0 0; +} + +.gsc-rating-bar span { + vertical-align: top; + display: inline-block; + height: 12px; + background: transparent url(/uds/css/cse_snippets_stars.png) 0 0 no-repeat; + padding: 2px 0 0 0; +} + +.gsc-review-agregate-first-line { + margin: 0 40px 0 0; + padding: 6px 0; +} + +.gsc-review-agregate-odd-lines, .gsc-review-agregate-even-lines { + margin: 0 40px 0 0; + padding: 6px 0; + border-top: 1px solid #EBEBEB; +} + +.gsc-reviewer { + color: #00c; +} + +.gsc-author { + color: #00c; +} + +.gsc-table-result, +.gs-promotion-table { + border-spacing: 0px; +} + +.gsc-table-cell-thumbnail, +.gs-promotion-image-cell { + vertical-align: top; +} + +.gsc-table-cell-snippet-close, +.gs-promotion-text-cell { + vertical-align: top; + width: 100%; +} + +.gsc-table-cell-snippet-open { + vertical-align: top; + width: 100%; +} + +.gsc-preview-reviews li { + list-style: none; + width: 90%; +} + +.gsc-zippy { + margin: 2px 8px 0px 0px; + float: right; + outline: none; + overflow: hidden; + height: 14px; + width: 14px; + background-position: -19px -5px; + position: relative; + top: -6px; +} + +.gsc-table-cell-snippet-close .gsc-preview-reviews { + display: none; +} + +.gsc-table-cell-snippet-close .gsc-zippy { + background: transparent url(/uds/css/plus_icons.png) -19px -5px no-repeat; +} + +.gsc-table-cell-snippet-open .gsc-zippy { + background: transparent url(/uds/css/minus_icons.png) -19px -5px no-repeat; +} + +.gsc-collapsable { + cursor: pointer; +} + +/* + * Cross-browser implementation of the "display: inline-block" CSS property. + * See http://www.w3.org/TR/CSS21/visuren.html#propdef-display for details. + */ +/* Gecko hack */ +html>body .gsc-inline-block { + display: -moz-inline-box; + display: inline-block; +} + +/* Default rule */ +.gsc-inline-block { + position: relative; + display: inline-block; +} + +/* Pre-IE7 IE hack */ +* html .gsc-inline-block { + display: inline; +} + +/* IE7-only hack */ +*:first-child+html .gsc-inline-block { + display: inline; +} + +/* By default show url at the bottom of the snippet */ +.gsc-url-top { + display: none; +} + +.gsc-url-bottom { + display: block; +} + +/* By default show thumbnail at the left of the snippet */ +.gsc-thumbnail-left { + display: block; +} + +.gsc-thumbnail-inside { + display: none; +} + +/* CSS for labeling search results feature. */ +.gsc-label-result-main-box-visible { + position: fixed !important; + z-index: 100003; + background-color: rgba(255, 255, 255, 1); + width: 400px; + box-shadow: rgba(0, 0, 0, 0.2) 0px 4px 16px 0px; + opacity: 1; + display: block; + border: none; + margin: auto; + -webkit-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -moz-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -ms-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -o-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + border-collapse: separate; + background: white; + padding: 30px; + width: 28%; + top: 30%; + left: 35%; + border: 1px solid rgba(0,0,0,.333); +} + +.gsc-label-result-main-box-invisible { + display: none; + opacity: 0; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; + -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=7, Direction=135, Color='#888888')"; + filter: progid:DXImageTransform.Microsoft.Shadow(Strength=7, Direction=135, Color='#888888'); +} + +.gsc-label-result-url { + padding-bottom: 5px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + width: 100%; + color: #008000; + margin-top: 5px; + font-size: 13px; +} + +.gsc-label-result-url-title { + white-space: nowrap; + margin-top: 10px; + font-size: 15px; + color: #0000CC; + text-decoration: underline; + text-overflow: ellipsis; + overflow: hidden; + display: block; +} + +.gsc-label-result-url-heading { + margin-bottom: 15px; +} + +.gsc-label-result-labels { + vertical-align: text-top; + font-size: 13px; + color: #000; +} + +.gsc-label-checkbox { +} + +.gsc-label-box { + margin-top: 5px; +} + +.gsc-labels-box { + margin-top: 15px; +} + +.gsc-label-result-buttons { + margin-top: 20px; +} + +.gsc-labels-no-label-div-visible { + margin-top: 20px; +} + +.gsc-labels-no-label-div-invisible { + display: none; +} + +.gsc-labels-label-div-visible { + margin-top: 10px; +} + +.gsc-labels-label-div-invisible { + display: none; +} + +.gsc-label-result-form-label { + margin-right: 20px; + margin-left: 2px; + font-size: 13px; + color: #000; + vertical-align: text-top; +} + +.gsc-label-result-form-div { + margin-top: 5px; +} + +input.gsc-label-result-label-prefix-visible { + width: 90%; + height: 20px; + margin-top: 10px; +} + +input.gsc-label-result-label-prefix-invisible { + display: none; +} + +.gsc-label-result-label-prefix-error { + color: red; + margin-top: 10px; +} + +.gsc-label-result-label-prefix-error-invisible { + display: none; +} + +.gsc-label-result-heading { + font-size: 17px; + color: black; +} + +.gsc-result-label-button { + background-color: #f5f5f5; + font-weight: bold; + border-radius: 2px; + text-align: center; + padding: 0 8px; + background-image: -webkit-linear-gradient(top,#f5f5f5,#f1f1f1); + height: 29px; + border: 1px solid #dcdcdc; + border-color: rgba(0, 0, 0, .1); + color: #444; + margin-right: 10px; + width: 72px; +} + +.gsc-result-label-save-button { + color: #fff; + background-image: -webkit-linear-gradient(top,#4d90fe,#357ae8); + background-image: -moz-linear-gradient(top,#4d90fe,#357ae8); + background-image: -ms-linear-gradient(top,#4d90fe,#357ae8); + background-image: -o-linear-gradient(top,#4d90fe,#357ae8); + background-image: linear-gradient(top,#4d90fe,#357ae8); +} + +.gsc-add-label-error { + color: red; + padding-top: 20px; +} + +.gsc-add-label-error-invisible { + display: none; +} + +.gsc-label-results-close-btn-visible { + display: block; + opacity: 0.7; +} + +.gsc-label-result-saving-popup { + font-size: 13px; + -webkit-transition: opacity 218ms; + -moz-transition: opacity 218ms; + -o-transition: opacity 218ms; + transition: opacity 218ms; + border-width: 1px; + height: 14px; + opacity: 1; + padding: 6px 16px; + background-color: #f9edbe; + border-color: #f0c36d; + color: #333; + position: fixed !important; + top: 10%; + left: 45%; + border-style: solid; + border-radius: 2px; +} + +.gsc-label-result-saving-popup-invisible { + display: none; +} + +/* CSS for richsnippets feature. */ +.gsc-richsnippet-popup-box { + position: fixed !important; + z-index: 100003; + background-color: rgba(255, 255, 255, 1); + width: 400px; + box-shadow: rgba(0, 0, 0, 0.2) 0px 4px 16px 0px; + opacity: 1; + display: block; + border: none; + margin: auto; + -webkit-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -moz-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -ms-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + -o-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4); + border-collapse: separate; + background: white; + padding: 30px; + width: 25%; + top: 15%; + left: 25%; + overflow-x: hidden; + overflow-y: auto; + height: 65%; + width: 50%; + padding: 30px; + padding-bottom: 10px; + } + +.gsc-richsnippet-popup-box-invisible { + display: none; +} + +.gsc-richsnippet-showsnippet-label { + color: #000099; + text-decoration: underline; + cursor: pointer; + font-size:13px; +} + +.gsc-richsnippet-individual-snippet-box { + border: 1px solid #ebebeb; + padding: 15px; + margin-bottom: 20px; +} + +.gsc-richsnippet-individual-snippet-key { + font-size: 14px; + padding: 1px 0 6px; + color: #000099; +} + +.gsc-richsnippet-individual-snippet-data { +} + +.gsc-richsnippet-popup-box-title { + padding-bottom: 20px; + font-size: 15px; +} + +.gsc-richsnippet-popup-box-title-text { + color: #404040; + display: inline; +} + +.gsc-richsnippet-popup-box-title-url { + font-weight: bold; + color: black; + display: inline; +} + +.gsc-richsnippet-individual-snippet-keyvalue { +} + +.gsc-richsnippet-individual-snippet-keyelem { + display: inline; + font-weight: bold; +} + +.gsc-richsnippet-individual-snippet-valueelem { + display: inline-block; + height: 1.1em; + width: 80%; + text-overflow: ellipsis; + overflow: hidden; +} + +.gsc-richsnippet-popup-close-button { + background-repeat: no-repeat; + background-position: -140px -230px; + float: right; + height: 12px; + width: 12px; + top: 20px; + right: 20px; + cursor: pointer; +} + +.gsc-richsnippet-popup-box-contents { + overflow-x: hidden; + overflow-y: auto; + height: 88%; +} + + diff --git a/test/modules/http2/htdocs/test1/apache.org-files/defaulten.js b/test/modules/http2/htdocs/test1/apache.org-files/defaulten.js new file mode 100644 index 0000000000..1afe448ec5 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/defaulten.js @@ -0,0 +1,674 @@ +(function() { +var _UDS_CONST_LOCALE = 'en'; +var _UDS_CONST_SHORT_DATE_PATTERN = 'MDY'; +var _UDS_MSG_SEARCHER_IMAGE = ('Image'); +var _UDS_MSG_SEARCHER_WEB = ('Web'); +var _UDS_MSG_SEARCHER_BLOG = ('Blog'); +var _UDS_MSG_SEARCHER_VIDEO = ('Video'); +var _UDS_MSG_SEARCHER_LOCAL = ('Local'); +var _UDS_MSG_SEARCHCONTROL_SAVE = ('save'); +var _UDS_MSG_SEARCHCONTROL_KEEP = ('keep'); +var _UDS_MSG_SEARCHCONTROL_INCLUDE = ('include'); +var _UDS_MSG_SEARCHCONTROL_COPY = ('copy'); +var _UDS_MSG_SEARCHCONTROL_CLOSE = ('close'); +var _UDS_MSG_SEARCHCONTROL_SPONSORED_LINKS = ('Sponsored Links'); +var _UDS_MSG_SEARCHCONTROL_SEE_MORE = ('see more...'); +var _UDS_MSG_SEARCHCONTROL_WATERMARK = ('clipped from Google'); +var _UDS_MSG_SEARCHER_CONFIG_SET_LOCATION = ('Search location'); +var _UDS_MSG_SEARCHER_CONFIG_DISABLE_ADDRESS_LOOKUP = ('Disable address lookup'); +var _UDS_MSG_SEARCHER_NEWS = ('News'); +function _UDS_MSG_MINUTES_AGO(AGE_MINUTES_AGO) {return ('' + AGE_MINUTES_AGO + ' minutes ago');} +var _UDS_MSG_ONE_HOUR_AGO = ('1 hour ago'); +function _UDS_MSG_HOURS_AGO(AGE_HOURS_AGO) {return ('' + AGE_HOURS_AGO + ' hours ago');} +function _UDS_MSG_NEWS_ALL_N_RELATED(NUMBER) {return ('all ' + NUMBER + ' related');} +var _UDS_MSG_NEWS_RELATED = ('Related Articles'); +var _UDS_MSG_BRANDING_STRING = ('powered by Google'); +var _UDS_MSG_SORT_BY_DATE = ('Sort by date'); +var _UDS_MSG_MONTH_ABBR_JAN = ('Jan'); +var _UDS_MSG_MONTH_ABBR_FEB = ('Feb'); +var _UDS_MSG_MONTH_ABBR_MAR = ('Mar'); +var _UDS_MSG_MONTH_ABBR_APR = ('Apr'); +var _UDS_MSG_MONTH_ABBR_MAY = ('May'); +var _UDS_MSG_MONTH_ABBR_JUN = ('Jun'); +var _UDS_MSG_MONTH_ABBR_JUL = ('Jul'); +var _UDS_MSG_MONTH_ABBR_AUG = ('Aug'); +var _UDS_MSG_MONTH_ABBR_SEP = ('Sep'); +var _UDS_MSG_MONTH_ABBR_OCT = ('Oct'); +var _UDS_MSG_MONTH_ABBR_NOV = ('Nov'); +var _UDS_MSG_MONTH_ABBR_DEC = ('Dec'); +var _UDS_MSG_DIRECTIONS = ('directions'); +var _UDS_MSG_CLEAR_RESULTS = ('clear results'); +var _UDS_MSG_SHOW_ONE_RESULT = ('show one result'); +var _UDS_MSG_SHOW_MORE_RESULTS = ('show more results'); +var _UDS_MSG_SHOW_ALL_RESULTS = ('show all results'); +var _UDS_MSG_SETTINGS = ('settings'); +var _UDS_MSG_SEARCH = ('search'); +var _UDS_MSG_SEARCH_UC = ('Search'); +var _UDS_MSG_POWERED_BY = ('powered by'); +function _UDS_MSG_LOCAL_ATTRIBUTION(LOCAL_RESULTS_PROVIDER) {return ('Business listings provided by ' + LOCAL_RESULTS_PROVIDER + '');} +var _UDS_MSG_SEARCHER_BOOK = ('Book'); +function _UDS_MSG_FOUND_ON_PAGE(FOUND_ON_PAGE) {return ('Page ' + FOUND_ON_PAGE + '');} +function _UDS_MSG_TOTAL_PAGE_COUNT(PAGE_COUNT) {return ('' + PAGE_COUNT + ' pages');} +var _UDS_MSG_SEARCHER_BY = ('by'); +var _UDS_MSG_SEARCHER_CODE = ('Code'); +var _UDS_MSG_UNKNOWN_LICENSE = ('Unknown License'); +var _UDS_MSG_SEARCHER_GSA = ('Search Appliance'); +var _UDS_MSG_SEARCHCONTROL_MORERESULTS = ('More results'); +var _UDS_MSG_SEARCHCONTROL_PREVIOUS = ('Previous'); +var _UDS_MSG_SEARCHCONTROL_NEXT = ('Next'); +var _UDS_MSG_GET_DIRECTIONS = ('Get directions'); +var _UDS_MSG_GET_DIRECTIONS_TO_HERE = ('To here'); +var _UDS_MSG_GET_DIRECTIONS_FROM_HERE = ('From here'); +var _UDS_MSG_CLEAR_RESULTS_UC = ('Clear results'); +var _UDS_MSG_SEARCH_THE_MAP = ('search the map'); +var _UDS_MSG_SCROLL_THROUGH_RESULTS = ('scroll through results'); +var _UDS_MSG_EDIT_TAGS = ('edit tags'); +var _UDS_MSG_TAG_THIS_SEARCH = ('tag this search'); +var _UDS_MSG_SEARCH_STRING = ('search string'); +var _UDS_MSG_OPTIONAL_LABEL = ('optional label'); +var _UDS_MSG_DELETE = ('delete'); +var _UDS_MSG_DELETED = ('deleted'); +var _UDS_MSG_CANCEL = ('cancel'); +var _UDS_MSG_UPLOAD_YOUR_VIDEOS = ('upload your own video'); +var _UDS_MSG_IM_DONE_WATCHING = ('i\047m done watching this'); +var _UDS_MSG_CLOSE_VIDEO_PLAYER = ('close video player'); +var _UDS_MSG_NO_RESULTS = ('No Results'); +var _UDS_MSG_LINKEDCSE_ERROR_RESULTS = ('This Custom Search Engine is loading. Try again in a few seconds.'); +var _UDS_MSG_COUPONS = ('Coupons'); +var _UDS_MSG_BACK = ('back'); +var _UDS_MSG_SUBSCRIBE = ('Subscribe'); +var _UDS_MSG_SEARCHER_PATENT = ('Patent'); +var _UDS_MSG_USPAT = ('US Pat.'); +var _UDS_MSG_USPAT_APP = ('US Pat. App'); +var _UDS_MSG_PATENT_FILED = ('Filed'); +var _UDS_MSG_ADS_BY_GOOGLE = ('Ads by Google'); +var _UDS_MSG_SET_DEFAULT_LOCATION = ('Set default location'); +var _UDS_MSG_NEWSCAT_TOPSTORIES = ('Top Stories'); +var _UDS_MSG_NEWSCAT_WORLD = ('World'); +var _UDS_MSG_NEWSCAT_NATION = ('Nation'); +var _UDS_MSG_NEWSCAT_BUSINESS = ('Business'); +var _UDS_MSG_NEWSCAT_SCITECH = ('Sci/Tech'); +var _UDS_MSG_NEWSCAT_ENTERTAINMENT = ('Entertainment'); +var _UDS_MSG_NEWSCAT_HEALTH = ('Health'); +var _UDS_MSG_NEWSCAT_SPORTS = ('Sports'); +var _UDS_MSG_NEWSCAT_POLITICS = ('Politics'); +var _UDS_MSG_SEARCH_RESULTS = ('Search results'); +var _UDS_MSG_DID_YOU_MEAN = ('Did you mean:'); +var _UDS_MSG_CUSTOM_SEARCH = ('Custom Search'); +var _UDS_MSG_LABELED = ('Labeled'); +var _UDS_MSG_LOADING = ('Loading...'); +var _UDS_MSG_ALL_RESULTS_SHORT = ('All'); +var _UDS_MSG_ALL_RESULTS_LONG = ('All results'); +var _UDS_MSG_REFINE_RESULTS = ('Refine results:'); +function _UDS_MSG_REVIEWS(REVIEW_COUNT) {return ('' + REVIEW_COUNT + ' reviews');} +function _UDS_MSG_CALORIES(CALORIES) {return ('' + CALORIES + ' cal');} +function _UDS_MSG_PRICE_RANGE(RANGE) {return ('Price range: ' + RANGE + '.');} +function _UDS_MSG_PRICE(PRICE) {return ('Price: ' + PRICE + '.');} +function _UDS_MSG_AVAILABILITY(AVAILABILITY) {return ('Availability: ' + AVAILABILITY + '.');} +function _UDS_MSG_TELEPHONE(TELEPHONE) {return ('Tel: ' + TELEPHONE + '');} +function _UDS_MSG_RESULT_INFO(NUMBER_OF_RESULTS, SEARCH_TIME) {return ('About ' + NUMBER_OF_RESULTS + ' results (' + SEARCH_TIME + ' seconds)');} +var _UDS_MSG_FILE_FORMAT = ('File Format:'); +var _UDS_MSG_SHOWING_RESULTS_FOR = ('Showing results for'); +var _UDS_MSG_SEARCH_INSTEAD_FOR = ('Search instead for'); +function _UDS_MSG_FILTERED_RESULTS(NUM) {return ('In order to show you the most relevant results, we have omitted some entries very similar to the ' + NUM + ' already displayed. If you like, you can ' + '<a>repeat the search with the omitted results included' + '</a>.');} +var _UDS_MSG_ORDER_BY = ('Sort by:'); +var _UDS_MSG_ORDER_BY_RELEVANCE = ('Relevance'); +var _UDS_MSG_ORDER_BY_DATE = ('Date'); +var _UDS_MSG_ORDER_BY_GET_LINK = ('Share this page:'); +var _UDS_MSG_ADD_LABEL = ('Add Label'); +var _UDS_MSG_NO_REFINEMENT = + ('Refinements should be present before adding label'); +var _UDS_MSG_LABEL_PAGE = ('This particular page'); +var _UDS_MSG_LABEL_SITE = ('Entire site'); +var _UDS_MSG_LABEL_PREFIX = ('Specific page prefix'); +var _UDS_MSG_INVALID_URL_PREFIX = ('Invalid url prefix'); +var _UDS_MSG_ERROR_ADDING_LABEL = ('Error adding label.'); +var _UDS_MSG_SAVING = ('Saving...'); +var _UDS_MSG_ADD_LABEL_SAVE = ('Save'); +var _UDS_MSG_ADD_LABEL_CANCEL = ('Cancel'); + +var k;var ca=this,da=function(a,b,c){a=a.split(".");c=c||ca;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]:c[d]={}:c[d]=b},ia=function(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&&"undefined"!=typeof a.propertyIsEnumerable&& +!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if("function"==b&&"undefined"==typeof a.call)return"object";return b},la=function(a,b){function c(){}c.prototype=b.prototype;a.UC=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.TA=function(a,c,e){for(var g=Array(arguments.length-2),h=2;h<arguments.length;h++)g[h-2]=arguments[h]; +return b.prototype[c].apply(a,g)}};var na=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,na);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))};la(na,Error);na.prototype.name="CustomError";var oa=function(a,b){for(var c=a.split("%s"),d="",f=Array.prototype.slice.call(arguments,1);f.length&&1<c.length;)d+=c.shift()+f.shift();return d+c.join("%s")},Ma=function(a,b){if(b)a=a.replace(pa,"&").replace(Ca,"<").replace(Da,">").replace(Fa,""").replace(Ha,"'").replace(Ia,"�");else{if(!La.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(pa,"&"));-1!=a.indexOf("<")&&(a=a.replace(Ca,"<"));-1!=a.indexOf(">")&&(a=a.replace(Da,">"));-1!=a.indexOf('"')&&(a=a.replace(Fa, +"""));-1!=a.indexOf("'")&&(a=a.replace(Ha,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(Ia,"�"))}return a},pa=/&/g,Ca=/</g,Da=/>/g,Fa=/"/g,Ha=/'/g,Ia=/\x00/g,La=/[\x00&<>"']/;var Na=function(a,b){b.unshift(a);na.call(this,oa.apply(null,b));b.shift()};la(Na,na);Na.prototype.name="AssertionError";var Ra=function(a,b,c){if(!a){var d="Assertion failed";if(b)var d=d+(": "+b),f=Array.prototype.slice.call(arguments,2);throw new Na(""+d,f||[]);}return a},Sa=function(a,b){throw new Na("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1));};var Ta=Array.prototype,Ua=Ta.forEach?function(a,b,c){Ra(null!=a.length);Ta.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,f="string"==typeof a?a.split(""):a,e=0;e<d;e++)e in f&&b.call(c,f[e],e,a)},Va=function(a,b,c){Ra(null!=a.length);return 2>=arguments.length?Ta.slice.call(a,b):Ta.slice.call(a,b,c)};var Wa={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0};var Xa=/<[^>]*>|&[^;]+;/g,Ya=function(a,b){return b?a.replace(Xa,""):a},cb=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]"),db=RegExp("^[^A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]*[\u0591-\u06ef\u06fa-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc]"),eb=/^http:\/\/.*/,fb=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff][^\u0591-\u06ef\u06fa-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc]*$"), +gb=RegExp("[\u0591-\u06ef\u06fa-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc][^A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]*$"),hb=/\s+/,ib=/[\d\u06f0-\u06f9]/;var kb=function(){this.Cm="";this.Cs=jb};kb.prototype.oe=!0;kb.prototype.Jd=function(){return this.Cm};kb.prototype.toString=function(){return"Const{"+this.Cm+"}"};var lb=function(a){if(a instanceof kb&&a.constructor===kb&&a.Cs===jb)return a.Cm;Sa("expected object of type Const, got '"+a+"'");return"type_error:Const"},jb={};var nb=function(){this.aj="";this.ws=mb};nb.prototype.oe=!0;var mb={};nb.prototype.Jd=function(){return this.aj};nb.prototype.toString=function(){return"SafeStyle{"+this.aj+"}"};nb.prototype.Si=function(a){this.aj=a;return this};var ob=(new nb).Si(""),pb=/^[-,."'%_!# a-zA-Z0-9]+$/;var rb=function(){this.qd="";this.xs=qb};k=rb.prototype;k.oe=!0;k.Jd=function(){return this.qd};k.Ml=!0;k.gh=function(){return 1};k.toString=function(){return"SafeUrl{"+this.qd+"}"};var sb=/^(?:(?:https?|mailto|ftp):|[^&:/?#]*(?:[/?#]|$))/i,qb={};var ub=function(){this.hm="";this.Js=tb};k=ub.prototype;k.oe=!0;k.Jd=function(){return this.hm};k.Ml=!0;k.gh=function(){return 1};k.toString=function(){return"TrustedResourceUrl{"+this.hm+"}"};var tb={};var wb=function(){this.qd="";this.vs=vb;this.Ck=null};k=wb.prototype;k.Ml=!0;k.gh=function(){return this.Ck};k.oe=!0;k.Jd=function(){return this.qd};k.toString=function(){return"SafeHtml{"+this.qd+"}"}; +var xb=function(a){if(a instanceof wb&&a.constructor===wb&&a.vs===vb)return a.qd;Sa("expected object of type SafeHtml, got '"+a+"'");return"type_error:SafeHtml"},zb=function(a){if(a instanceof wb)return a;var b=null;a.Ml&&(b=a.gh());return yb(Ma(a.oe?a.Jd():String(a)),b)},Ab=/^[a-zA-Z0-9-]+$/,Bb={action:!0,cite:!0,data:!0,formaction:!0,href:!0,manifest:!0,poster:!0,src:!0},Cb={EMBED:!0,IFRAME:!0,LINK:!0,OBJECT:!0,SCRIPT:!0,STYLE:!0,TEMPLATE:!0},Db=function(a){var b=0,c="",d=function(a){"array"==ia(a)? +Ua(a,d):(a=zb(a),c+=xb(a),a=a.gh(),0==b?b=a:0!=a&&b!=a&&(b=null))};Ua(arguments,d);return yb(c,b)},Eb=function(a,b){var c=Db(Va(arguments,1));c.Ck=a;return c},vb={},yb=function(a,b){return(new wb).Si(a,b)};wb.prototype.Si=function(a,b){this.qd=a;this.Ck=b;return this};yb("<!DOCTYPE html>",0);yb("",0);var Fb=function(a,b){this.Bd="number"==typeof a?0<a?1:0>a?-1:null:null==a?null:a?-1:1;this.$s=!!b};k=Fb.prototype;k.Xk=function(a,b){for(var c=0,d=0,f=!1,e=Ya(a,b).split(hb),g=0;g<e.length;g++){var h=e[g];db.test(Ya(h,void 0))?(c++,d++):eb.test(h)?f=!0:cb.test(Ya(h,void 0))?d++:ib.test(h)&&(f=!0)}return 0==d?f?1:0:.4<c/d?-1:1};k.dt=function(a,b){return 0>a*b}; +k.Co=function(a,b,c,d){return d&&(this.dt(b,this.Bd)||1==this.Bd&&gb.test(Ya(a,c))||-1==this.Bd&&fb.test(Ya(a,c)))?1==this.Bd?"\u200e":"\u200f":""};k.Bo=function(a,b){return this.cq(this.Xk(a,b))};k.cq=function(a){return-1==(0==a?this.Bd:a)?"rtl":"ltr"};k.kr=function(a,b,c){return this.Jy(null,a,b,c)};k.Iy=function(a,b,c){null==a&&(a=this.Xk(xb(b),!0));return this.Ky(a,b,c)};k.Jy=function(a,b,c,d){b=c?yb(b,null):zb(b);return xb(this.Iy(a,b,d))}; +k.Ky=function(a,b,c){c=c||void 0==c;var d;d=0!=a&&a!=this.Bd;if(this.$s||d){var f;d&&(f=-1==a?"rtl":"ltr");d={dir:f};if(!Ab.test("span"))throw Error("Invalid tag name <span>.");if("SPAN"in Cb)throw Error("Tag name <span> is not allowed for SafeHtml.");f=null;var e="<span";if(d)for(var g in d){if(!Ab.test(g))throw Error('Invalid attribute name "'+g+'".');var h=d[g];if(null!=h){var l;l=g;if(h instanceof kb)h=lb(h);else if("style"==l.toLowerCase()){var m=typeof h;if(("object"!=m||null==h)&&"function"!= +m)throw Error('The "style" attribute requires goog.html.SafeStyle or map of style properties, '+typeof h+" given: "+h);if(!(h instanceof nb)){var m="",q=void 0;for(q in h){if(!/^[-_a-zA-Z0-9]+$/.test(q))throw Error("Name allows only [-_a-zA-Z0-9], got: "+q);var t=h[q];if(null!=t){if(t instanceof kb)t=lb(t),Ra(!/[{;}]/.test(t),"Value does not allow [{;}].");else if(pb.test(t)){for(var v=!0,y=!0,u=0;u<t.length;u++){var F=t.charAt(u);"'"==F&&y?v=!v:'"'==F&&v&&(y=!y)}v&&y||(Sa("String value requires balanced quotes, got: "+ +t),t="zClosurez")}else Sa("String value allows only [-,.\"'%_!# a-zA-Z0-9], got: "+t),t="zClosurez";m+=q+":"+t+";"}}m?(Ra(!/[<>]/.test(m),"Forbidden characters in style string: "+m),h=(new nb).Si(m)):h=ob}m=void 0;h instanceof nb&&h.constructor===nb&&h.ws===mb?m=h.aj:(Sa("expected object of type SafeStyle, got '"+h+"'"),m="type_error:SafeStyle");h=m}else{if(/^on/i.test(l))throw Error('Attribute "'+l+'" requires goog.string.Const value, "'+h+'" given.');if(l.toLowerCase()in Bb)if(h instanceof ub)h instanceof +ub&&h.constructor===ub&&h.Js===tb?h=h.hm:(Sa("expected object of type TrustedResourceUrl, got '"+h+"'"),h="type_error:TrustedResourceUrl");else if(h instanceof rb)h instanceof rb&&h.constructor===rb&&h.xs===qb?h=h.qd:(Sa("expected object of type SafeUrl, got '"+h+"'"),h="type_error:SafeUrl");else if("string"==typeof h)h instanceof rb||(h=h.oe?h.Jd():String(h),sb.test(h)||(h="about:invalid#zClosurez"),m=new rb,m.qd=h,h=m),h=h.Jd();else throw Error('Attribute "'+l+'" on tag "span" requires goog.html.SafeUrl, goog.string.Const, or string, value "'+ +h+'" given.');}h.oe&&(h=h.Jd());Ra("string"==typeof h||"number"==typeof h,"String or number value expected, got "+typeof h+" with value: "+h);l=l+'="'+Ma(String(h))+'"';e+=" "+l}}g=b;null!=g?"array"==ia(g)||(g=[g]):g=[];!0===Wa.span?(Ra(!g.length,"Void tag <span> does not allow content."),e+=">"):(f=Db(g),e+=">"+xb(f)+"</span>",f=f.gh());(d=d&&d.dir)&&(f=/^(ltr|rtl|auto)$/i.test(d)?0:null);d=yb(e,f)}else d=b;b=xb(b);return d=Eb(0,d,this.Co(b,a,!0,c))};k.iq=function(a,b){return this.Sw(null,a,b)}; +k.Sw=function(a,b,c){null==a&&(a=this.Xk(b,c));return this.Co(b,a,c,!0)};k.Ly=function(){return-1==this.Bd?"right":"left"};k.iu=function(){return-1==this.Bd?"left":"right"};var Gb,Hb,Ib,Jb,Kb,Lb,Mb,Nb,Ob,Rb,Sb,Tb,Ub,Vb,Wb,Xb,Yb,Zb,$b,ac,bc,cc,dc,ec,fc,gc,hc,ic,jc,kc,nc,oc,pc,qc,rc,sc,tc,uc,vc,wc,xc,yc,zc,Ac,Bc,Cc,Dc,Ec,Fc,Gc,Hc,Lc,Mc,Nc,Oc,Pc,Qc,Rc,Sc,Tc,Uc,Vc,Wc,Xc,Yc,Zc,$c,ad,bd,cd,dd=/^[6-9]$/,ed={Es:0,Jn:1,Ds:2,Sh:3},fd={EMPTY:0,ns:1,$m:2},gd={$r:1,os:2,$z:3,Wr:4,rs:5,qA:6,Hz:7,Fg:8},hd={DONT_CARE:1,Sr:2,Fn:3},id={en:0,Fs:1,Sh:2},jd=[23,24],n={Ks:0,qz:114,ud:115,Yf:116,sb:117,dg:494,Ua:118,Be:119,vd:374,xd:120,yd:121,Vh:122,ic:123,De:124,Wh:125,us:230,hA:553,Fc:126, +Fe:127,Rb:128,En:343,Eg:129,pz:231,ze:130,Nr:131,uz:237,Ez:570,cA:132,ps:134,qs:189,ss:246,eA:264,dA:256,Uh:133,ys:184,Dg:419,rA:503,sA:578,tA:579,uA:505,xA:516,vA:509,wA:512,He:173,Tz:568,Uz:569,cn:135,Sj:136,Vj:137,zn:138,Hg:139,Ur:140,mn:141,rn:142,vn:240,As:143,Hs:144,Mh:347,Ij:191,Nh:150,Xf:145,bn:146,lg:147,yA:148,oA:245,Sm:155,Tf:149,Oh:154,Qh:311,Xd:153,RENDERER:152,Xc:156,Ce:151,Yj:158,yn:294,$j:157,Ge:160,Wz:328,sd:159},kd={Wm:161,Tn:162};var ld=function(a){return{Ei:function(){return a.Ei()},Jb:function(){return a.Jb()},Fb:function(){return a.Fb()}}};(function(){function a(a){for(var b=[],f=0,e;e=a[f++];)b.push(e.api||{a:e.hh,b:e.ob,c:e.ke,d:e.L,e:e.Ye,f:e.Kp,g:e.Jp,i:e.Hi,j:e.Ea,k:e.Ni,l:e.xp});return b}function b(a){for(var b=[],f=0,e;e=a[f++];)e=e.api||e,b.push({api:e,hh:e.a,ob:e.b,ke:e.c,L:e.d,Ye:e.e,Kp:e.f,Jp:e.g,Hi:e.i,Ea:e.j,Ni:e.k,xp:e.l});return b}Gb=function(a){var b={};if(a)for(var f=0;f<a.length;++f)b[a[f]]=!0;return b};Hb=function(b){var d=a(b.Fb());return b.api||{a:b.Jb,b:function(){return d},c:b.Ei}};Ib=function(a){a=a.api||a;var d= +b(a.b());return{api:a,Jb:a.a,Fb:function(){return d},Ei:a.c}};Jb=function(a){return a?(a=a.toLowerCase(),"zh-tw"==a||"zh-cn"==a||"ja"==a||"ko"==a):!1};Kb=function(){return(new Date).getTime()};Lb=function(a){return"string"==typeof a};Mb=function(a){return"number"==typeof a}})();var md=function(){return{ih:function(){return{rk:"hp",om:"hp",to:"google.com",Py:"",ef:"en",Ao:"",rx:"",bz:"",ho:0,Qw:"",Dm:"",Io:!1,Hx:"",nm:"",uk:0,cD:null,Br:!1,HC:!1,Ri:!1,Hh:Gb([19,5,0]),FB:!1,cu:!0,mB:10,Xt:!0,Go:!0,jB:!1,ru:!1,Hw:!1,$p:!1,TB:!1,hw:!1,PA:!0,QC:"en",Jl:!0,Qt:!1,iw:500,Fl:!1,Qi:!0,Mp:!0,Zv:!1,lq:"",mC:"//www.google.com/textinputassistant",nC:"",pC:7,GB:!1,HB:!1,$v:!1,Wv:!0,bw:!1,Ip:!1,Tx:!1,Sx:!1,yj:1,Ww:!0,cl:!1,bl:!1,fu:!1,qx:10,Dl:!1,cB:0,JB:!1,yx:!0,gu:!1,Yg:document.body, +dw:!0,or:null,Te:{},lB:{},yC:0,su:!1,nw:!0,de:!1,PC:null,du:!1,Pw:null,nr:null,$t:!1,lw:!0,lt:!1,YC:1,XA:1,spellcheck:!1,Xw:!1,Ux:"Search",dl:"I'm Feeling Lucky",Xx:"",Ow:"Learn more",EC:"Remove",CC:"This search was removed from your Web History",LB:"",iB:"Did you mean:",oC:"",LC:"",RC:"Search by voice",Yo:!1,pw:null,Sp:0,qw:0,Pl:"",rr:"",SB:!1,Zg:"absolute",Vv:!1,Tv:!1,vq:null,Hp:!0,TC:0,Re:[0,0,0],Do:null,tr:null,ht:[0],mo:0,DC:1,Gm:"",ur:"",sr:"",el:null,il:"",fl:"",YA:1,sk:{},gt:!0}}}};var nd=/<\/?(?:b|em)>/gi,od={Kr:8,Fg:9,Xm:13,Ph:27,pA:32,Hr:37,Pm:38,Ir:39,Om:40,Rr:46,bA:190};var pd=function(){function a(a,b,c){e[a]=c;l[a]=[b]}function b(a,b,d){var e=h[a];e?e!=c&&(h[a]=c):h[a]=d;(e=l[a])?e.push(b):l[a]=[b];g[b]=d}var c=Nb,d=0,f={},e={},g={},h={},l={},m=1E4;return{vB:function(){return d++},uB:function(){return m++},Aq:a,AC:function(b,c){var d=m++;a(b,d,c);return d},register:b,BC:function(a,c){var d=m++;b(a,d,c);return d},Lu:function(){return l},ih:function(a,b){var d=f[a];return d?d:(d=e[a])?f[a]=d():b?(d=g[b])?d():null:(d=h[a])&&d!=c?d():null}}}();var qd=function(a,b,c,d,f,e){function g(){if(z){for(var a=0,b;b=E[a++];)b.Cb&&b.Cb();z=!1}}function h(a){for(var b in a){var c=b,d=a[c];if(d!=t.Wm)if(v[c]){for(var e=w[c]||[],f=0,g=void 0;f<d.length;++f)(g=l(c,d[f]))&&e.push(g);w[c]=e}else(d=l(c,d))&&(F[c]=d)}}function l(a,b){var c;if(b&&b instanceof Object)c=b;else if(c=A.ih(a,b),!c)return null;if(c.dh){var d=c.dh();if(d)for(var e=0,f,g,h;f=d[e++];){h=!1;g=f.L();if(v[g]){if(h=C[g]){h.push(f);continue}h=!0}C[g]=h?[f]:f}}D.push([c,a]);E.push(c);return c} +function m(a){for(var b=n.Ks,c=0,d;d=D[c++];)d[0]==a&&(b=d[1]);return b}function q(a,b){var c=Ob(a.L(),u),d=Ob(b.L(),u);return 0>c?1:0>d?-1:c-d}var t=kd,v=Gb([n.sd,n.Sm,n.Tf,n.Xd,n.Oh,n.Qh,n.RENDERER,n.Xc,n.Vh,n.Ce,n.Yj,n.yn,n.Ge]),y=[n.Xf,n.sb,n.Ua,n.Be,n.vd,n.Fc,n.ud,n.Yf,n.xd,n.lg,n.yd,n.Uh,n.ic,n.De,n.Wh,n.Fe,n.Rb,n.En,n.Eg],u=[n.Fe,n.Tf,n.ps,n.ic,n.yd,n.Fc,n.Ua,n.ud,n.Rb,n.Ge,n.He,n.Be,n.Yf,n.RENDERER,n.Xd,n.Eg,n.xd,n.vd,n.De,n.Yj,n.Sm,n.Nr,n.ze,n.lg,n.mn,n.rn,n.Vj,n.vn,n.As,n.zn,n.Hs,n.Hg,n.Ur, +n.cn,n.Sj],F={},w={},C={},D=[],E=[],z=!1,A=pd,N={ea:function(a){g();for(var b=0,c;c=E[b++];)c.ea&&c.ea(a);z=!0},Cb:g,Tp:function(){return z},get:function(a,b){var c=F[a];if(c)return c.W?c.W(m(b)):{}},Eb:function(a,b){var c=w[a];if(c){for(var d=[],e=m(b),f=0,g;g=c[f++];)d.push(g.W?g.W(e):{});return d}return[]},Ve:function(){return a},Mi:function(){return f},$o:function(a,b){var c=w[n.sd];if(c)for(var d=0,e;e=c[d++];)if(e.X()==a)return e.W?e.W(m(b)):{};return null}};(function(){if(e.gt){var f=A.Lu(), +g,m,u,w;for(w in f){var D=w;g=f[D];m=v[D];if(u=b[D]){if(u!=t.Wm&&m&&u.length){m=D;u=u.slice(0);for(var D=[],P={},aa=0,X=void 0,fa=void 0;fa=u[aa++];)fa instanceof Object&&(X=fa.X(),P[X]||(D.push(fa),P[X]=1),u.splice(--aa,1));aa=Gb(u);aa[t.Tn]&&(aa=Gb(u.concat(g)),delete aa[t.Tn]);for(X in aa)P[X]||D.push(parseInt(X,10));b[m]=D}}else b[D]=m?g:g[0]}}h(b);for(f=0;w=y[f++];)b[w]||(m=l(w,void 0))&&(F[w]=m);h(C);E.sort(q);for(f=0;w=E[f++];)w.lb&&w.lb(c,d);a.Yl(d,c.hi());d.bt();for(f=0;w=E[f++];)w.ka&&w.ka(N); +for(f=0;w=E[f++];)w.zb&&w.zb(e);for(f=0;w=E[f++];)w.ea&&w.ea(e);z=!0})();return N};var rd=function(a,b,c){function d(){return a}function f(){return u}function e(){return F}function g(){return b}function h(){return c||""}function l(a,b){v(a,b)}function m(a,b){v(a,b,!0)}function q(){z||(A=N=!0)}function t(){J=!0}function v(a,b,c){z||(A=!0,w[a]=b,c&&(C[a]=b))}var y=Tb(),u,F,w={},C={},D,E,z=!1,A=!1,N=!1,Q=!1,J=!1,V={vb:function(){return y},pp:function(){var a=parseInt(y,36);return isNaN(a)?-1:a},Jb:d,rp:f,le:e,eh:g,Ea:function(){return w},gp:function(){return D},Oi:h,Al:function(){return E}, +cp:function(){return{Jb:d,rp:f,le:e,eh:g,Oi:h,setParameter:l,lj:m,qu:q,kt:t}},setParameter:l,lj:m,qu:q,kt:t,Dw:function(){return N},ow:function(){A=Q=!0},Iw:function(d,e,f){return!A&&a==d&&b.ju(e)&&c==f},Yp:function(){return Q},Up:function(){return J},ou:function(){z||(E=Kb(),"cp"in C||m("cp",b.Ji()),v("gs_id",y),D=Rb(C)+":"+a,A=z=!0)}};u=a.toLowerCase();F=Sb(u);return V};var td=function(a,b,c,d,f,e){function g(){return!!b&&!!b[0]}var h,l=!0,m,q={hd:function(){return a},Jb:function(){return a.Jb()},ol:function(){return g()?b[0]:null},Fb:function(){return b},Ld:g,Ea:function(){return c},Sl:function(){return d},Ti:function(){return f},Bw:function(){return e},L:function(){return l},mp:function(){m||(m=ld(q));return m},Ei:function(){return h}};b?b.length&&33==b[0].L()&&(f=l=!1):b=[];c?h=c.mv("t"):c=sd;return q};var ud=function(a,b,c,d,f,e){function g(a){if(f)for(var b=0,c;c=a[b++];)if(-1!=Ob(c,f))return!0;return!1}var h=!1,l={hh:function(){return a},ob:function(){return b},ke:function(){return c},L:function(){return d},Ni:function(){return e.nb("za")},xp:function(){return e.nb("zb")},Ye:function(){return f||[]},Kp:function(a){return!!f&&g([a])},Jp:g,Ea:function(){return e},Hi:function(){return h}};switch(d){case 0:case 32:case 38:case 39:case 400:case 407:case 35:case 33:case 41:case 34:case 44:case 45:case 40:case 46:case 56:case 30:h= +!0}e||(e=sd);return l};(function(){var a=/\s/g,b=/\u3000/g,c=/^\s/,d=/\s+/,f=/\s+/g,e=/^\s+|\s+$/g,g=/^\s+$/,h=/<[^>]*>/g,l=/ /g,m=/ /g,q=[/&/g,/&/g,/</g,/</g,/>/g,/>/g,/"/g,/"/g,/'/g,/'/g,/{/g,/{/g],t=document.getElementsByTagName("head")[0],v=0;Vb=function(a,b){void 0===b&&(b=a);var c=function(){return b};return{Ji:c,wp:function(){return a},vv:c,IB:function(){return a<b},ju:function(c){return c&&a==c.wp()&&b==c.vv()}}};Ub=function(a,b,c,d){if(null==b||""===b){if(!d)return;b=""}c.push(a+ +"="+encodeURIComponent(String(b)))};Rb=function(a){var b=[],c;for(c in a)Ub(c,a[c],b);return b.join("&")};Wb=function(a){return!!a&&!g.test(a)};Xb=function(a){for(var b=q.length,c=0;c<b;c+=2)a=a.replace(q[c],q[c+1].source);return a};Yb=function(a){for(var b=q.length,c=0;c<b;c+=2)a=a.replace(q[c+1],q[c].source);a=a.replace(l," ");return a.replace(m,"\u3000")};Zb=function(a){return a.replace(nd,"")};$b=function(a){return a.replace(h,"")};ac=function(c){return c&&(-1<c.indexOf(" ")||d.test(c))?(c=c.replace(b, +" "),c.replace(a," ")):c};Sb=function(a,b){return a&&(-1<a.indexOf(" ")||d.test(a))?(a=a.replace(f," "),a.replace(b?e:c,"")):a};bc=function(a,b,c){c&&(a=a.toLowerCase(),b=b.toLowerCase());return b.length<=a.length&&a.substring(0,b.length)==b};cc=function(a,b){return a||b?!!a&&!!b&&a.toLowerCase()==b.toLowerCase():!0};dc=function(a){window.clearTimeout(a)};Nb=function(){};ec=function(){return t};Tb=function(){return(v++).toString(36)};fc=function(a){return dd.test(a)};gc=function(a,b){return ud(a.hh(), +a.ob(),b,a.L(),a.Ye(),a.Ea())};Ob=function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;++c)if(b[c]===a)return c;return-1};hc=function(a,b){return a.ib()-b.ib()};ic=function(a,b){return b.ib()-a.ib()};jc=function(a){var b={},c;for(c in a)b[c]=a[c];return b};kc=function(a,b,c){b in a||(a[b]=[162]);a[b].push(c)}})();var vd=function(a){return{contains:function(b){return b in a},yu:function(b){return!!a[b]},tp:function(b){return a[b]||0},nb:function(b){return a[b]||""},mv:function(b){return a[b]||null}}},sd=vd({});(function(){function a(a,b,c){a=document.createElement(a);b&&(a.className=b);c&&(a.id=c);return a}function b(b){return a("div",b)}function c(a,b){var c=a.getElementsByTagName("input");if(c)for(var d=0,e;e=c[d++];)if(e.name==b&&"submit"!=e.type.toLowerCase())return e;return null}function d(a){a&&(a.preventDefault&&a.preventDefault(),a.returnValue=!1);return!1}function f(a){return a?a.ownerDocument||a.document:window.document}function e(a){return a?(a=f(a),a.defaultView||a.parentWindow):window}var g= +void 0!=document.documentElement.style.opacity,h={rtl:"right",ltr:"left"};sc=function(a,b){try{if(a.setSelectionRange)a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0);c.moveStart("character",b);c.select()}}catch(d){}};tc=function(a){try{var b,c;if("selectionStart"in a)b=a.selectionStart,c=a.selectionEnd;else{var d=a.createTextRange(),e=f(a).selection.createRange();d.inRange(e)&&(d.setEndPoint("EndToStart",e),b=d.text.length,d.setEndPoint("EndToEnd",e),c= +d.text.length)}if(void 0!==b)return Vb(b,c)}catch(g){}return null};uc=function(a,b){for(var c=0,d=0;a&&(!b||a!=b);){c+=a.offsetTop;d+=a.offsetLeft;try{a=a.offsetParent}catch(e){a=null}}return{Hm:c,qe:d}};vc=function(a){try{return f(a).activeElement==a}catch(b){}return!1};wc=function(a){return 38==a||40==a};pc=a;xc=function(){var b=a("table");b.cellPadding=b.cellSpacing=0;b.style.width="100%";return b};yc=b;zc=function(a,c){var d=b(a),e=d.style;e.background="transparent";e.color="#000";e.padding=0; +e.position="absolute";c&&(e.zIndex=c);e.whiteSpace="pre";return d};Ac=function(a,b){a.innerHTML!=b&&(b&&(nc?b=ac(b):oc&&(b='<pre style="font:inherit;margin:0">'+b+"</pre>")),a.innerHTML=b)};Bc=function(a,b,c){var d=a.style;"INPUT"!=a.nodeName&&(c+=1);d.left=d.right="";d[b]=c+"px"};Cc=function(a){return"rtl"==a?"right":"left"};Dc=function(a,b){a.dir!=b&&(a.dir=b,a.style.textAlign=h[b])};Ec=function(b,d,e){if(c(b,d))return null;var f=a("input");f.type="hidden";f.name=d;e&&(f.value=e);return b.appendChild(f)}; +Fc=c;Gc=function(a){var b=document.createEvent("KeyboardEvent");b.initKeyEvent&&(b.initKeyEvent("keypress",!0,!0,null,!1,!1,!0,!1,27,0),a.dispatchEvent(b))};Hc=d;Lc=function(a){if(a=a||window.event)a.stopPropagation&&a.stopPropagation(),a.cancelBubble=a.cancel=!0;return d(a)};Mc=function(a,b){b.parentNode.insertBefore(a,b.nextSibling)};Nc=function(a){a=a.insertCell(-1);var b=pc("a");b.href="#ifl";b.className="gssb_j gss_ifl";a.appendChild(b);return b};Oc=function(a,b){var c=e(a);return(c=c.getComputedStyle? +c.getComputedStyle(a,""):a.currentStyle)?c[b]:null};Pc=function(a){var b=a||window;a=b.document;var c=b.innerWidth,b=b.innerHeight;if(!c){var d=a.documentElement;d&&(c=d.clientWidth,b=d.clientHeight);c||(c=a.body.clientWidth,b=a.body.clientHeight)}return{Cr:c,Lp:b}};Qc=function(a){return(a||window).document.documentElement.clientWidth};Rc=function(a){a=a.style;a.border="none";a.padding=qc||rc?"0 1px":"0";a.margin="0";a.height="auto";a.width="100%"};Sc=function(a){return(g?"opacity":"filter")+":"+ +(g?a+"":(nc?"progid:DXImageTransform.Microsoft.Alpha(":"alpha(")+"opacity="+Math.floor(100*a)+")")+";"};Tc=function(a){var b={};if(a)for(var c=0,d;d=a[c++];)b[d.lh()]=d;return b};Uc=f;Vc=e;Wc=function(a){qc&&(a.tabIndex=0)}})();pd.Aq(n.Ij,192,function(){function a(a){Lb(a)&&(a=d(a));var b="";if(a){for(var c=a.length,e=0,f=0,g=0;c--;)for(f<<=8,f|=a[g++],e+=8;6<=e;)var h=f>>e-6&63,b=b+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(h),e=e-6;e&&(h=f<<8>>e+8-6&63,b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(h))}return b}function b(a){var b=[];if(a)for(var c=0,d=0,e=0;e<a.length;++e){var f=a.charCodeAt(e);if(32>f||127<f||!l[f-32])return[];c<<=6;c|=l[f-32]-1;d+=6;8<=d&& +(b.push(c>>d-8&255),d-=8)}return b}function c(a,b){var c={};c.mb=Array(4);c.buffer=Array(4);c.dz=Array(4);c.padding=Array(64);c.padding[0]=128;for(var m=1;64>m;++m)c.padding[m]=0;f(c);var m=Array(64),l;64<b.length?(f(c),g(c,b),l=h(c)):l=b;for(var q=0;q<l.length;++q)m[q]=l[q]^92;for(q=l.length;64>q;++q)m[q]=92;f(c);for(q=0;64>q;++q)c.buffer[q]=m[q]^106;e(c,c.buffer);c.total=64;g(c,d(a));l=h(c);f(c);e(c,m);c.total=64;g(c,l);return h(c)}function d(a){for(var b=[],c=0,d=0;d<a.length;++d){var e=a.charCodeAt(d); +128>e?b[c++]=e:(2048>e?b[c++]=e>>6|192:(b[c++]=e>>12|224,b[c++]=e>>6&63|128),b[c++]=e&63|128)}return b}function f(a){a.mb[0]=1732584193;a.mb[1]=4023233417;a.mb[2]=2562383102;a.mb[3]=271733878;a.li=a.total=0}function e(a,b){for(var c=a.dz,d=0;64>d;d+=4)c[d/4]=b[d]|b[d+1]<<8|b[d+2]<<16|b[d+3]<<24;for(var e=a.mb[0],d=a.mb[1],f=a.mb[2],g=a.mb[3],h,l,z,A=0;64>A;++A)16>A?(h=g^d&(f^g),l=A):32>A?(h=f^g&(d^f),l=5*A+1&15):48>A?(h=d^f^g,l=3*A+5&15):(h=f^(d|~g),l=7*A&15),z=g,g=f,f=d,e=e+h+q[A]+c[l]&4294967295, +h=m[A],d=d+((e<<h|e>>>32-h)&4294967295)&4294967295,e=z;a.mb[0]=a.mb[0]+e&4294967295;a.mb[1]=a.mb[1]+d&4294967295;a.mb[2]=a.mb[2]+f&4294967295;a.mb[3]=a.mb[3]+g&4294967295}function g(a,b,c){c||(c=b.length);a.total+=c;for(var d=0;d<c;++d)a.buffer[a.li++]=b[d],64==a.li&&(e(a,a.buffer),a.li=0)}function h(a){var b=Array(16),c=8*a.total,d=a.li;g(a,a.padding,56>d?56-d:64-(d-56));for(var f=56;64>f;++f)a.buffer[f]=c&255,c>>>=8;e(a,a.buffer);for(f=d=0;4>f;++f)for(c=0;32>c;c+=8)b[d++]=a.mb[f]>>c&255;return b} +var l=[0,0,0,0,0,0,0,0,0,0,0,0,0,63,0,0,53,54,55,56,57,58,59,60,61,62,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,0,0,0,0,64,0,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,0,0,0,0],m=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21],q=[3614090360,3905402710,606105819,3250441966,4118548399,1200080426,2821735955, +4249261313,1770035416,2336552879,4294925233,2304563134,1804603682,4254626195,2792965006,1236535329,4129170786,3225465664,643717713,3921069994,3593408605,38016083,3634488961,3889429448,568446438,3275163606,4107603335,1163531501,2850285829,4243563512,1735328473,2368359562,4294588738,2272392833,1839030562,4259657740,2763975236,1272893353,4139469664,3200236656,681279174,3936430074,3572445317,76029189,3654602809,3873151461,530742520,3299628645,4096336452,1126891415,2878612391,4237533241,1700485571,2399980690, +4293915773,2240044497,1873313359,4264355552,2734768916,1309151649,4149444226,3174756917,718787259,3951481745];return{L:function(){return n.Ij},X:function(){return 192},W:function(){return{encode:a,decode:b,wv:c}}}});pd.Aq(n.Nh,95,function(){function a(a,c){c=Xb(Zb(c));a=Xb(Sb(a,!0));if(bc(c,a))return a+"<b>"+c.substr(a.length)+"</b>";for(var d="",f=[],e=c.length-1,g=0,h=-1,l;l=c.charAt(g);++g)" "==l||"\t"==l?d.length&&(f.push({t:d,Ch:h,e:g+1}),d="",h=-1):(d+=l,-1==h?h=g:g==e&&f.push({t:d,Ch:h,e:g+1}));d=a.split(/\s+/);g={};for(e=0;h=d[e++];)g[h]=1;l=-1;for(var d=[],m=f.length-1,e=0;h=f[e];++e)g[h.t]?(h=-1==l,e==m?d.push({Ch:h?e:l,e:e}):h&&(l=e)):-1<l&&(d.push({Ch:l,e:e-1}),l=-1);if(!d.length)return"<b>"+c+"</b>"; +e="";for(g=h=0;l=d[g];++g)(m=f[l.Ch].Ch)&&(e+="<b>"+c.substring(h,m-1)+"</b> "),h=f[l.e].e,e+=c.substring(m,h);h<c.length&&(e+="<b>"+c.substring(h)+"</b> ");return e}return{L:function(){return n.Nh},X:function(){return 95},W:function(){return{bold:a}}}});pd.register(n.bn,12,function(){function a(a){a=b(a,t,c);a=b(a,v,d);return b(a,u,f)}function b(a,b,c){for(var d,e="",f=0;null!=(d=b.exec(a));)f<d.index&&(e+=a.substring(f,d.index)),e+=c(d[0]),f=b.lastIndex;if(!e)return a;f<a.length&&(e+=a.substring(f));return e}function c(a){return String.fromCharCode(a.charCodeAt(0)-65248)}function d(a){var b=a.charCodeAt(0);return 1==a.length?g.charAt(b-65377):65438==a.charCodeAt(1)?h.charAt(b-65395):l.charAt(b-65418)}function f(a){var b=a.charCodeAt(0);return 12443== +a.charCodeAt(1)?m.charAt(b-12454):q.charAt(b-12495)}function e(a){return eval('"\\u30'+a.split(",").join("\\u30")+'"')}var g=e("02,0C,0D,01,FB,F2,A1,A3,A5,A7,A9,E3,E5,E7,C3,FC,A2,A4,A6,A8,AA,AB,AD,AF,B1,B3,B5,B7,B9,BB,BD,BF,C1,C4,C6,C8,CA,CB,CC,CD,CE,CF,D2,D5,D8,DB,DE,DF,E0,E1,E2,E4,E6,E8,E9,EA,EB,EC,ED,EF,F3,9B,9C"),h=e("F4__,AC,AE,B0,B2,B4,B6,B8,BA,BC,BE,C0,C2,C5,C7,C9_____,D0,D3,D6,D9,DC"),l=e("D1,D4,D7,DA,DD"),m=e("F4____,AC_,AE_,B0_,B2_,B4_,B6_,B8_,BA_,BC_,BE_,C0_,C2__,C5_,C7_,C9______,D0__,D3__,D6__,D9__,DC"), +q=e("D1__,D4__,D7__,DA__,DD"),t=/[\uFF01-\uFF5E]/g,v=RegExp("([\uff73\uff76-\uff84\uff8a-\uff8e]\uff9e)|([\uff8a-\uff8e]\uff9f)|([\uff61-\uff9f])","g"),y="(["+e("A6,AB,AD,AF,B1,B3,B5,B7,B9,BB,BD,BF,C1,C4,C6,C8,CF,D2,D5,D8,DB")+"]\u309b)|(["+e("CF,D2,D5,D8,DB")+"]\u309c)",u=new RegExp(y,"g");return{L:function(){return n.bn},X:function(){return 12},W:function(){return{iC:a}}}});var wd=function(a,b,c,d,f){var e=Xc?"-moz-":rc?"-ms-":qc?"-o-":Yc?"-webkit-":"",g=".gstl_"+d,h=new RegExp("(\\.("+f.join("|")+")\\b)"),l=[];return{addRule:function(a,d){if(b){if(c){for(var e=a.split(","),f=[],y=0,u;u=e[y++];)u=h.test(u)?u.replace(h,g+"$1"):g+" "+u,f.push(u);a=f.join(",")}l.push(a,"{",d,"}")}},bt:function(){if(b&&l.length){b=!1;var c=pc("style");c.setAttribute("type","text/css");(a||ec()).appendChild(c);var d=l.join("");l=null;c.styleSheet?c.styleSheet.cssText=d:c.appendChild(document.createTextNode(d))}}, +prefix:function(a,b){var c=a+(b||"");e&&(c+=b?a+e+b:e+a);return c}}};pd.register(n.lg,10,function(){function a(a){var b=0;a&&(g||c(),d(),a in h?b=h[a]:(Ac(g,Xb(a)),h[a]=b=g.offsetWidth,Ac(g,"")));return b}function b(){g||c();d();l||(Ac(g,"|"),l=g.offsetHeight);return l}function c(){g=zc(f.Pl);g.style.visibility="hidden";e.appendChild(g)}function d(){var a=Kb();if(!q||q+3E3<a)q=a,a=Oc(g,"fontSize"),m&&a==m||(h={},l=null,m=a)}var f,e,g,h,l,m,q;return{lb:function(a){e=a.kp()||document.body},zb:function(a){f=a},L:function(){return n.lg},X:function(){return 10},W:function(){return{Ze:a, +Hd:b}}}});var xd=function(a){var b;(function(){var c=function(){};a||(a={});var d=function(b){return a[b]||c};b={ml:d("a"),search:d("b"),mf:d("c"),redirect:d("d"),Ki:d("e"),wi:d("f"),Pk:d("g"),Qk:d("h"),Kk:d("i"),Rk:d("j"),vi:d("k"),Lk:d("l"),Ok:d("m"),yr:d("n"),Sk:d("o"),Tk:d("p"),ti:d("q"),Yl:d("r"),Eo:d("s"),Fo:d("t"),Nk:d("u"),Uk:d("w"),Hk:d("x"),Mk:d("y"),Jk:d("z"),Ik:d("aa"),Vk:d("ab"),zm:d("ac")}})();return{ml:function(){return b.ml()},search:function(a,d){b.search(a,d)},mf:function(a){b.mf(a)},redirect:function(a){b.redirect(a)}, +Ki:function(a){return b.Ki(a)},wi:function(a){b.wi(a)},Pk:function(a){b.Pk(a)},Qk:function(a){b.Qk(a)},Kk:function(a){b.Kk(a)},Rk:function(a,d){b.Rk(a,d)},vi:function(a,d){b.vi(a,d)},Lk:function(){b.Lk()},Ok:function(a){b.Ok(a)},yr:function(a){b.yr(a)},Sk:function(){b.Sk()},Tk:function(){b.Tk()},ti:function(a){b.ti(a)},Yl:function(a,d){b.Yl(a,d)},Eo:function(a){b.Eo(a)},Fo:function(){b.Fo()},Nk:function(){b.Nk()},Mk:function(){b.Mk()},Uk:function(a){b.Uk(a)},Hk:function(){b.Hk()},Jk:function(){b.Jk()}, +Ik:function(){b.Ik()},Vk:function(){b.Vk()},zm:function(a,d){return b.zm(a,d)}}};pd.register(n.Tf,6,function(){function a(a,b,c,d){var e=a.vb(),g=a.Jb();F.Io||f();b=q+t+v+"?"+(y?y+"&":"")+(b?b+"&":"");var l=Ub;a=[];l("q",g,a,!0);F.Br||l("callback","google.sbox.p"+m,a);if(u){for(var g="",D=4+Math.floor(32*Math.random()),T=0,L;T<D;++T)L=.3>Math.random()?48+Math.floor(10*Math.random()):(.5<Math.random()?65:97)+Math.floor(26*Math.random()),g+=String.fromCharCode(L);l("gs_gbg",g,a)}l=pc("script");l.src=b+a.join("&");l.charset="utf-8";w[e]=l;C=F.Io?d:c;h.appendChild(l);return!0}function b(){return 0} +function c(){return 0}function d(a){var b=w[a];b&&(h.removeChild(b),delete w[a])}function f(){for(var a in w)h.removeChild(w[a]);w={};C=null}function e(a){C&&C(a)}function g(a){a||(a=Nb);var b=window.google;F.Br?b.ac.h=a:b.sbox["p"+m]=a}var h=ec(),l,m,q,t,v,y,u,F,w={},C,D={ka:function(a){l=a.get(n.Fe,D);m=a.Mi().vb()},ea:function(a){F=a;0==a.uk&&(a=l.Eu(),q=a.protocol,t=a.host,v=a.nm,y=a.Oy,u="https:"==document.location.protocol,g(e),(new Image).src=q+t+"/generate_204")},L:function(){return n.Tf}, +X:function(){return 6},W:function(){return{ey:a,Ut:d,mi:Nb,ip:b,jp:c}},Cb:function(){g(null);f()}};return D});pd.register(n.Xf,1,function(){function a(a){if(!h)return!0;for(var b=!1,c=!1,e=0,g;e<a.length;++e)if(g=a.charAt(e),!d.test(g)&&(f.test(g)?c=!0:b=!0,c&&b))return!0;return!1}function b(a,b,c){if(!h)return!0;var f=e.test(c),l=g.test(b);return"ltr"==a?f||l||d.test(c)||d.test(b):!f||!l}function c(a){var b=l;h&&(f.test(a)?b="ltr":d.test(a)||(b="rtl"));return b}var d=RegExp("^[\x00- !-@[-`{-\u00bf\u00d7\u00f7\u02b9-\u02ff\u2000-\u2bff]*$"),f=RegExp("^[\x00- !-@[-`{-\u00bf\u00d7\u00f7\u02b9-\u02ff\u2000-\u2bff]*(?:\\d[\x00- !-@[-`{-\u00bf\u00d7\u00f7\u02b9-\u02ff\u2000-\u2bff]*$|[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u2c00-\ufb1c\ufdfe-\ufe6f\ufefd-\uffff])"), +e=RegExp("^[\x00- !-@[-`{-\u00bf\u00d7\u00f7\u02b9-\u02ff\u2000-\u2bff]*(?:\\d|[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u2c00-\ufb1c\ufdfe-\ufe6f\ufefd-\uffff])"),g=RegExp("(?:\\d|[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u2c00-\ufb1c\ufdfe-\ufe6f\ufefd-\uffff])[\x00- !-@[-`{-\u00bf\u00d7\u00f7\u02b9-\u02ff\u2000-\u2bff]*$"),h=f.test("x"),l;return{lb:function(a){l=a.We()},L:function(){return n.Xf},X:function(){return 1},W:function(){return{Yv:a, +Cw:b,nl:c}}}});pd.register(n.sb,2,function(){function a(a,b,c,d,e){var f=q(a);f||(f={},u.push({element:a,Rv:f}));var g=f[b];g||(g=f[b]=[],f=a.Xr?window:Vc(a),f=m(b,f,g),Lb(b)?a.addEventListener?a.addEventListener(b,f,!1):a["on"+b]=f:a[b]=f);g.push({Aw:!!e,Xl:!1,rq:d||0,nf:c});g.sort(v);c.lu=b}function b(a,b){var c=q(a);if(c&&(c=c[b.lu]))for(var d=0,e;e=c[d++];)if(e.nf==b){e.Xl=!0;break}}function c(b,c,d,e){a(F,b,c,d,e)}function d(a){b(F,a)}function f(a,b){var c=b||{},d=F[a];d&&d(c,c.Jh)}function e(a,b,c){a.addEventListener? +a.addEventListener(b,c,!1):a.attachEvent("on"+b,c)}function g(a,b,c){a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent("on"+b,c)}function h(a){y?(w||(w=[],e(window,"message",l)),w.push(a),a=window.location.href,window.postMessage("sbox.df",/HTTPS?:\/\//i.test(a)?a:"*")):window.setTimeout(a,0)}function l(a){w&&a&&a.source==window&&"sbox.df"==a.data&&w.length&&(w.shift()(),w&&w.length&&window.postMessage("sbox.df",window.location.href))}function m(a,b,c){return function(d,e){if(c.length){var f; +if(!(f=d)){f={};var g=b.event;g&&(g.keyCode&&(f.keyCode=g.keyCode),f.xw=!0)}f.Jh=e||a;for(var g=f,h,l,m=0,q;q=c[m++];)q.Xl?l=!0:h||(q.Aw?t(q,g):h=q.nf(g));if(l)for(m=0;q=c[m];)q.Xl?c.splice(m,1):++m;if(f.Vi)return delete f.Vi,f.xw&&(f=b.event||f),Lc(f),f.returnValue=!1}}}function q(a){for(var b=0,c;b<u.length;++b)if(c=u[b],c.element==a)return c.Rv;return null}function t(a,b){h(function(){a.nf(b)})}function v(a,b){return b.rq-a.rq}var y=window.postMessage&&!(rc||Zc||qc),u=[],F={Xr:1},w;return{L:function(){return n.sb}, +X:function(){return 2},W:function(){return{xb:a,Jm:b,Vb:c,iD:d,ub:f,xh:e,hD:g,defer:h}},Cb:function(){w=null}}});pd.register(n.dg,495,function(){function a(a){g[a.vb()]=!0}function b(a){var b=a.hd();a=b.vb();a in g&&(b=b.Al(),b=Kb()-b,l+=b,++h,delete g[a])}function c(){var a=0,b;for(b in g)a++;return a}function d(){return h}function f(){return l}function e(){g={};l=h=0}var g,h,l;return{ea:function(){e()},L:function(){return n.dg},X:function(){return 495},W:function(){return{Ts:a,Tw:b,wu:c,rv:d,xv:f,reset:e}}}});pd.register(n.vd,375,function(){function a(a){f[a]=!0;e=a}function b(){var a=[],b;for(b in f)a.push(parseInt(b,10));return a}function c(){return e}function d(){f={};e=null}var f,e;return{ea:function(){d()},L:function(){return n.vd},X:function(){return 375},W:function(){return{add:a,Av:b,cv:c,reset:d}}}});pd.register(n.xd,9,function(){function a(a){var b=q.Mc(),c;c=[];c[27]=25;c[0]=d(w.rk);c[28]=d(w.om);c[1]=void 0==a?"":a+"";c[26]=t.Av().join("j");a="";y.El()?a="o":u.$e()&&(a=u.uv()+"");c[2]=a;a="";var g=u.Fb();if(g){for(var z,M=0,T=0,L;L=g[T++];){var P=L;L=P.L()+"";P=P.Ye();P.length&&(L+="i"+P.join("i"));L!=z&&(1<M&&(a+="l"+M),a+=(z?"j":"")+L,M=0,z=L);++M}1<M&&(a+="l"+M)}c[3]=a;c[4]=f(q.Pu());c[5]=f(q.Xu());c[6]=C;c[7]=Kb()-D;c[18]=f(q.Zu());c[8]=m.sv();if(z=m.Bu())c[25]=z.Gw?"1"+(w.Xt?"a":"")+(w.Go? +"c":""):"",c[10]=z.ww;c[11]=m.pl();c[12]=m.Qu();if(z=m.Fu())c[9]=z.Gx,c[22]=z.Bx,c[17]=z.Kx;c[13]=m.nv();c[14]=m.iv();c[15]=m.yv();c[16]=m.Cu();c[30]=v.wu();c[31]=v.rv();c[32]=v.xv();c[19]=d(w.Dm);z=(z=y.Gd())?z.Ea().nb("e")?"1":"":"";c[20]=z;for(z=0;a=F[z++];)g=a.ke(),h[g]&&(c[g]=void 0==c[g]?d(a.Cv()):"");c=c.join(".").replace(e,"");l&&E?(z=b+c,a=l.decode(E),z=l.wv(z,a),z=z.slice(0,8),z=l.encode(z)):z="";return{oq:b,gs_l:c+"."+z}}function b(){D=Kb();++C;q.Pd();t.reset();m.Pd();for(var a=0,b;b=F[a++];)b.reset()} +function c(a){E=a}function d(a){return a?a.replace(g,"-"):""}function f(a){return Math.max(a-D,0)}var e=/\.+$/,g=/\./g,h=Gb(jd),l,m,q,t,v,y,u,F,w,C=-1,D,E,z={ka:function(a){l=a.get(n.Ij,z);m=a.get(n.ic,z);q=a.get(n.Ua,z);t=a.get(n.vd,z);v=a.get(n.dg,z);y=a.get(n.Fc,z);u=a.get(n.Rb,z);F=a.Eb(n.Qh,z);Tc(a.Eb(n.RENDERER,z))},zb:function(a){E=a.Qw},ea:function(a){w=a;b()},L:function(){return n.xd},X:function(){return 9},W:function(){return{Ea:a,reset:b,yy:c}}};return z});pd.register(n.yd,11,function(){function a(a,b){if(y){for(var c=!1,d=0,f;f=y[d++];)2==f.kh(a,b)&&(c=!0);if(c)return}if(Wb(a)||z.de||l&&l.de())fc(b)?E&&!D&&(D=Ec(E,"btnI","1")):D&&(E.removeChild(D),D=null),g(b),C.search(a,b),e(),m.ub(14,{bj:a})}function b(a){g();C.mf(a);e()}function c(a){g();C.redirect(a);e()}function d(a){g(1);C.ti(a);e()}function f(a){return C.Ki(a)}function e(){q.Ll();q.st();v.reset();F?F.clear():u.clear();t.Mc()!=t.hb()&&t.zt();w&&w.clear()}function g(a){h&&z.$t&&h.kj(a)}var h, +l,m,q,t,v,y,u,F,w,C,D,E,z,A={lb:function(a){E=a.kp()},ka:function(a){h=a.get(n.Mh,A);l=a.get(n.ze,A);m=a.get(n.sb,A);q=a.get(n.ic,A);t=a.get(n.Ua,A);v=a.get(n.xd,A);u=a.get(n.Rb,A);F=a.get(n.En,A);w=a.get(n.Hg,A);C=a.Ve();y=a.Eb(n.yn,A)},ea:function(a){z=a},L:function(){return n.yd},X:function(){return 11},W:function(){return{search:a,mf:b,redirect:c,ti:d,Ki:f}}};return A});pd.register(n.De,14,function(){function a(a){return(a[f.Sh]||{}).j}function b(a){return a[f.en]}function c(a,b){var c=a[f.en],q=a[f.Fs];b||(b=rd(c,Vb(c.length)));var F={},w=a[f.Sh];if(w)for(var C in w){var D=w[C];C in m&&(D=m[C].parse(D));F[C]=D}var w=b,E=!1,z=!1;C=!1;for(var D=0,A;A=q[D++];)if(33==(A[e.Jn]||0)?z=!0:E=!0,z&&E){C=!0;break}E=0;z=[];for(D=0;A=q[D++];){var N=A[e.Jn]||0;if(g[N]&&(!C||33!=N)){var Q;Q=A[e.Es];l&&(Q=h.bold(c.toLowerCase(),$b(Yb(Q))));z.push(ud(Q,$b(Yb(Q)),E++,N,A[e.Ds]|| +[],d(A)))}}return td(w,z,vd(F),!1,!0,!1)}function d(a){return(a=a[e.Sh])?vd(a):sd}var f=id,e=ed,g,h,l,m={},q={ka:function(a){h=a.get(n.Nh,q);if(a=a.Eb(n.Yj,q))for(var b=0,c;c=a[b++];)m[c.wB()]=c},ea:function(a){g=a.Hh;l=a.Dl},L:function(){return n.De},X:function(){return 14},W:function(){return{ox:a,sC:b,em:c}}};return q});pd.register(n.Wh,15,function(){function a(a){var c=b(a);if(c){if(g)for(var f=0,q;q=g[f++];)a=q.Wt(a);h.jy(a);f=a;q=f.hd().Jb();var F=f.Fb();if(l.isEnabled())if(F.length){var w=0==f.L();l.ym(q,F,w)&&e.Tw(f)}else l.clear();d.ub(3,{input:q,Ty:F})}m.Rk(a,c);return c}function b(a){var b=f.hb(),c=h.Gd(),b=b.toLowerCase(),d=a.Jb().toLowerCase();b==d?c=!0:(b=Sb(b),a=(d=a.hd())?d.le():Sb(a.Jb().toLowerCase()),c=c?c.hd().le():"",c=0==b.indexOf(a)?0==b.indexOf(c)?a.length>=c.length:!0:!1);return c}function c(a, +b){return a.ib()-b.ib()}var d,f,e,g,h,l,m,q={ka:function(a){d=a.get(n.sb,q);f=a.get(n.Ua,q);e=a.get(n.dg,q);g=a.Eb(n.Vh,q);h=a.get(n.Fc,q);l=a.get(n.Rb,q);m=a.Ve();g.sort(c)},L:function(){return n.Wh},X:function(){return 15},W:function(){return{nf:a,Xi:b}}};return q});pd.register(n.ic,13,function(){function a(a,b){if(!(!ja||ma||T&&T.RA())){a.lj("ds",ua.Ao);a.lj("pq",ya);a.ou();var c=!0,d=a.pp();d>R&&(R=d);++G;X.Ts(a);var d=Kb(),e;for(e in ta){var f=ta[e].Al();2500<d-f&&A(e)}ga&&(e=M.get(a))&&((c=S||a.Dw())&&ua.nw&&a.ow(),ba.nf(e),e.Sl()&&++W,O=null);c&&(O=a,H&&!b||z())}}function b(){return 10<=za||3<=L.jp()?!0:!1}function c(){ka=R}function d(){return R<=ka}function f(){O=null}function e(){return G}function g(){return{Gw:ga,ww:ga?M.Au():0}}function h(){return ga? +M.pl():0}function l(){return W}function m(){return{Gx:Aa,Bx:va,Kx:Ga}}function q(){return Oa}function t(){return Ba}function v(a){a=fa.em(a);return ba.Xi(a)}function y(){return wa}function u(){for(var a=[],b=0,c,d=0;d<=J;++d)c=xa[d],0==c?b++:(b=1==b?"0j":1<b?d+"-":"",a.push(b+c),b=0);return a.join("j")}function F(){ga&&M.ot()}function w(a){ga&&M.pt(a)}function C(){ga&&M.Pd();wa=Ba=Oa=Ga=va=Aa=W=za=G=0;xa=[];for(var a=0;a<=J;++a)xa[a]=0}function D(a){ya=a}function E(a){return function(b){N(b,a)}}function z(){null!= +H&&(dc(H),H=null);if(!(2<L.jp())&&O){var a=[],b=O.Ea();if(b)for(var c in b)Ub(c,b[c],a);I.Lk();a=L.ey(O,a.join("&"),E(O),N);O.Yp()||(++Aa,a?(a=O,ta[a.vb()]=a,++za):++va);O=null;a=100;b=(za-2)/2;for(c=1;c++<=b;)a*=2;a<ha&&(a=ha);H=window.setTimeout(z,a)}}function A(a){L.Ut(a);delete ta[a];za&&--za}function N(a,b){if(ja){if(!b){var c=fa.ox(a);b=ta[c];if(!b)return}if(!b.Yp()){c=fa.em(a,b);if(qa)var d=P.hb(),c=qa.JC(c,d);ga&&M.put(c);b.pp()<=ka||(++Ga,ba.nf(c)||++Oa,d=b,ha=c.Ea().tp("d"),d&&(A(d.vb()), +d=d.Al(),d=Kb()-d,wa+=d,Ba=Math.max(d,Ba),++xa[d>V?J:Q[Math.floor(d/100)]]));c&&(c=c.Ea().nb("q"))&&aa.yy(c)}}}var Q=[0,1,2,3,4,5,5,6,6,6,7,7,7,7,7,8,8,8,8,8],J=Q[Q.length-1]+1,V=100*Q.length-1,M,T,L,P,aa,X,fa,ba,qa,ea,I,ja=!1,O,R=-1,ta,G,za,W,Aa,va,Ga,Oa,Ba,wa,xa,ha,H,S,ma,ka,ga,ua,ya,ra={ka:function(a){M=a.get(n.Uh,ra);T=a.get(n.ze,ra);a.get(n.sb,ra);P=a.get(n.Ua,ra);aa=a.get(n.xd,ra);X=a.get(n.dg,ra);fa=a.get(n.De,ra);ba=a.get(n.Wh,ra);qa=a.get(n.us,ra);a.get(n.Fc,ra);ea=a.get(n.Fe,ra);a.get(n.Rb, +ra);I=a.Ve()},ea:function(a){L=ea.Du();ua=a;ja=!0;ta={};ha=0;S=a.ru;ma=a.Ri;ka=-1;ga=ua.cu&&!!M;ya=a.rx},L:function(){return n.ic},X:function(){return 13},W:function(){return{Qo:a,El:b,Ll:c,Wp:d,st:f,sv:e,Bu:g,pl:h,Qu:l,Fu:m,nv:q,iv:t,Xi:v,yv:y,Cu:u,mi:F,$A:w,Pd:C,Uq:D}},Cb:function(){ja=!1;null!=H&&(dc(H),H=null);ta=O=null;c()}};return ra});pd.register(n.Fc,5,function(){function a(){return f.El()}function b(a){e=a}function c(){return e}function d(){e=null}var f,e,g={ka:function(a){f=a.get(n.ic,g)},ea:function(){e=null},L:function(){return n.Fc},X:function(){return 5},W:function(){return{El:a,jy:b,Gd:c,bB:d}}};return g});pd.register(n.Fe,16,function(){function a(){return f}function b(){return e}function c(){f&&f.mi()}var d={},f,e,g={ka:function(a){a=a.Eb(n.Tf,g);for(var b=0,c;c=a[b++];)d[c.ip()]=c},ea:function(a){var b="https:"==document.location.protocol,c=Ub,g=[];c("client",a.rk,g);c("hl",a.ef,g);c("gl",a.Py,g);c("sugexp",a.Dm,g);c("gs_rn",25,g);c("gs_ri",a.om,g);a.ho&&c("authuser",a.ho,g);e={protocol:"http"+(b?"s":"")+"://",host:a.Hx||"clients1."+a.to,nm:a.nm||"/complete/search",Oy:g.length?g.join("&"):""};f&& +f.ip()==a.uk||(f=d[a.uk])},L:function(){return n.Fe},X:function(){return 16},W:function(d){return{Du:d==n.ic?a:Nb,Eu:b,aB:c}}};return g});pd.register(n.ud,7,function(){function a(a){l.oj(a)}function b(){return m}function c(a){if(a in q){if(t){if(a==t.yl())return;e();t.Fp()}t=q[a];l.rj(t)}}function d(){return m?l.Hd():0}function f(){m||(l.show(g()),m=!0)}function e(){m&&(l.rh(),m=!1)}function g(){var a=jc(h);t.eo(a);return a}var h={Uv:!1,Kl:"left",Vp:!0,Qe:null,marginWidth:0},l,m,q={},t,v={ka:function(a){l=a.get(n.Yf,v);if(a=a.Eb(n.Oh,v))for(var b=0,c;c=a[b++];)q[c.yl()]=c},ea:function(){m=!1},L:function(){return n.ud},X:function(){return 7}, +W:function(){return{vh:b,rj:c,Hd:d,show:f,rh:e,oj:a}},Cb:function(){e()}};return v});pd.register(n.Ua,3,function(){function a(){var a={};ga.ub(13,a);!a.cancel&&Pa.Jl&&ga.defer(U.Dk);Qa.Mk()}function b(){ga.ub(12);Qa.Nk()}function c(){va("rtl")}function d(){va("ltr")}function f(){U.Px()}function e(a){U.Ld()?U.Ox():U.ui(a)}function g(){if(0==Pa.yj)return!1;if(4==Pa.yj)return Qa.Vk(),!1;var a=Ga();if(a)switch(Pa.yj){case 1:if(Oa(a,!0))return ya.add(H.Fg),!0;break;case 3:return U.ph(a)}return!1}function h(){Pa.Tx?ta(5):(U.vh()?U.Dk():F(),N())}function l(a){sa&&a.wp()==sa.length&&(Za&& +Za.clear(),Pa.Sx&&ta(2),Qa.Kk(sa))}function m(a){ma&&0==a.Ji()&&ma.Zx()}function q(a,b,c,d){Pa.gu&&!a&&U.Sq(!0);Pa.Qt&&!U.vh()&&"mousedown"==c&&U.ui(b);var e;Qb&&Qb.Iw(a,b,c)?e=Qb:Qb=e=rd(a,b,c);var f=b=!1;if(a!=sa||"onremovechip"==c)bc(c,"key")?ya.add(H.$r):"paste"==c&&ya.add(H.os),b=!0,xa(a),ga.ub(1,{Jh:c,Qe:ab}),Qa.wi(a),f=Kb(),lc||(lc=f),Ic=f,Wb(a)&&(d=!0),f=!0;a=ha.DONT_CARE;var g=e.cp(),h=Ea.Gd();if(Ja)for(var l=0,m;m=Ja[l++];)m=m.kh(g,h),m>a&&(a=m);switch(a){case ha.Sr:d=!0;break;case ha.Fn:d= +!1}d?(b&&U.My(),mc&&e.setParameter("gs_is",1),Qa.Ok(mc),ua.Qo(e),Qb=null):f&&(U.clear(),ua.Ll());ga.ub(2,{Jh:c})}function t(a){(mc=a)&&ya.add(H.Wr)}function v(a){Jc!=a&&((Jc=a)?Qa.Jk():Qa.Ik())}function y(a){Ba(a)}function u(){S.focus()}function F(){S.blur()}function w(){return S.Ui()}function C(a,b,c){bc(a,sa,!0)&&(a=sa+a.substr(sa.length));c=c||Vb(a.length);q(a,c,"",b);Ba(a,!0)}function D(a){C(a,!0);Kc=Kb();ya.add(H.rs)}function E(){q(sa,L(),"onremovechip")}function z(a){xa(a);S.refresh();ga.ub(4, +{Qe:ab,input:a})}function A(){S.select()}function N(){sa!=bb&&xa(bb);ga.ub(5,{input:bb,Ty:U.Fb(),Qe:ab});S.refresh();Qa.Qk(bb)}function Q(){bb=sa}function J(){return S.hp()}function V(){return bb}function M(){return sa}function T(){return ab}function L(){return S.eh()}function P(){return S.wl()}function aa(){return S.Hd()}function X(){return S.Ze()}function fa(){return S.np()}function ba(){return lc}function qa(){return Ic}function ea(){return Kc}function I(){return 0!=Td}function ja(){if(Pb){if(Pa.Fl)return!0; +for(var a=0,b;b=$a[a++];)if(b.isEnabled())return!0}return!1}function O(a){if(a==sa)return!0;var b=sa.length;return a.substr(0,b)==sa?ka.Cw(ab,sa,a.substr(b)):!1}function R(){S.gm()}function ta(a){ra.search(sa,a)}function G(a){sa&&(xa(""),S.clear(),ga.ub(1),U.clear(),Qa.wi(sa));a&&Qa.Hk()}function za(){Kc=Ic=lc=0}function W(a){S.pj(a)}function Aa(){var a=Ga();a&&Oa(a)}function va(a){var b=L().Ji();ab==a?U.Ld()&&b==sa.length&&(U.$e()?Pa.cl&&(a=U.Xe(),ra.search(a.ob(),6)):Pa.Ww&&g()):ma&&0==b&&ma.Zx()} +function Ga(){if(U.Ld()){var a=U.$e()?U.Xe():U.ol();if(a.Hi())return a}return null}function Oa(a,b){var c=a.ob();return cc(bb,c)?!1:(Q(),b?C(c,!0):z(c),!0)}function Ba(a,b){sa=a||"";wa();S.refresh();b||(ga.ub(4,{Qe:ab,input:sa}),Qa.Pk(sa))}function wa(){var a=ka.nl(sa);a!=ab&&(S.tm(a),ab=a)}function xa(a){sa=bb=a||"";wa()}var ha=hd,H=gd,S,ma,ka,ga,ua,ya,ra,Ja,Ea,U,Za,Pb,$a,Qa,bb,sa,ab,Td,lc,Ic,Kc,mc,Jc,Qb,Pa,Ka={ka:function(a){S=a.get(n.Be,Ka);ma=a.get(n.ze,Ka);ka=a.get(n.Xf,Ka);ga=a.get(n.sb,Ka); +ua=a.get(n.ic,Ka);ya=a.get(n.vd,Ka);ra=a.get(n.yd,Ka);Ja=a.Eb(n.Xc,Ka);Ea=a.get(n.Fc,Ka);U=a.get(n.Rb,Ka);Za=a.get(n.Hg,Ka);Pb=a.get(n.He,Ka);$a=a.Eb(n.Ge,Ka);Qa=a.Ve();Td=a.Mi().rl()},zb:function(a){Pa=a;Ja.sort(hc);sa=bb=S.Uu()||""},ea:function(a){Pa=a;Jc=mc=!1;wa()},L:function(){return n.Ua},X:function(){return 3},W:function(){return{Ep:a,Jv:b,Nv:c,Ov:d,Qv:f,Hv:e,ph:g,Iv:h,Gv:l,Ev:m,Mv:q,py:t,Rq:v,nj:y,pu:u,lk:F,Xp:w,ir:C,DB:D,EB:E,pd:z,Lq:A,Lx:N,zt:Q,hp:J,Mc:V,hb:M,nl:T,eh:L,wl:P,Hd:aa,Ze:X,np:fa, +Pu:ba,Xu:qa,Zu:ea,Xv:I,Gl:ja,RB:O,gm:R,search:ta,clear:G,Pd:za,pj:W,Wn:Aa}}};return Ka});pd.register(n.Rb,17,function(){function a(a){a.Qe=Ja;a.marginWidth=ra;var b=Ea.tr;b||(b="rtl"==Ja?"right":"left");a.Kl=b}function b(a,b,d){var e=!1;a=Ba&&Ba.PB(b);N();(ha=b)&&b.length&&(e=b[0].ob(),ta.Yv(e)&&(e=W.Mc()),Ja=ta.nl(e),d?(ma=O.ns,e=R.Cx(b,Ja),b=b[0].Ea().nb("a"),b=Yb(b),ra=Aa.Ze(b)):(ma=O.$m,e=R.ma(ba(),Ja),ra=0),a&&(S=Ba.yB(),c(Ba.qB())),e?z():N());return e}function c(a){ja();if(H!=a){var b=H;H=a;I(b)}}function d(){if(C())if(ka){var a=H;H==ha.length-1?S=H=null:null==H?H=0:++H;S=H;ea(a, +d)}else z()}function f(){if(C())if(ka){var a=H;ha&&0!=H?null==H?H=ha.length-1:--H:S=H=null;S=H;ea(a,f)}else z()}function e(a){var b=a?4:3;D()?(a=F(),R.Pi(a)||W.search(b),b=W.Mc(),xa.vi(b,a)):W.search(b)}function g(a){return R.ph(a)}function h(a){S=H=a;a=ha[a];var b=W.Mc();xa.vi(b,a)}function l(){return ka}function m(){return ga}function q(a){ga&&!a&&N();ga=a}function t(){return ma}function v(){return ha}function y(){return C()?ha[0]:null}function u(){return H}function F(){return D()?ha[S]:null}function w(){return S} +function C(){return!(!ha||!ha.length)}function D(){return null!=S}function E(){ka&&!ua&&(ua=window.setTimeout(N,Ea.iw))}function z(){ka||(G.rj(17),G.show(),ka=!0,xa.Sk())}function A(){ka&&(ua&&(dc(ua),ua=null),G.rh(),ka=!1,xa.Tk())}function N(){A();ha=null;ma=O.EMPTY;null!=H&&R.Dj(H);S=H=null;R.clear()}function Q(){za.Ll();A()}function J(){null!=H&&R.Dj(H);S=H=null}function V(){ja();ya=window.setTimeout(J,0)}function M(){ja()}function T(a){if(C())z();else{var b=W.Mc();if(b){a=a||W.eh();b=rd(b,a); +if(Ga){a=b.cp();for(var c=Oa.Gd(),d=0,e;e=Ga[d++];)e.kh(a,c)}za.Qo(b)}}}function L(){return R.Ra()}function P(){return R.Li()}function aa(){ka=!1}function X(){R.Bh()}function fa(){return 17}function ba(){if(C()&&ma==O.$m){for(var a=[],b=[],c=0,d;(d=va[c++])&&!d.sp(W.Mc(),ha,b););(c=b?b.length:0)&&(c-=qa(b,a,0));for(d=0;d<ha.length;++d)a.push(ha[d]);c&&(c-=qa(b,a,1));Ea.$v&&a.push(1);c&&qa(b,a,2);Ea.Ip&&a.push(2);wa&&wa.Ss(a);return a}return null}function qa(a,b,c){for(var d=0,e=0,f;e<a.length;++e)(f= +a[e])&&f.position==c&&(b.push(f),++d);return d}function ea(a,b){if(null==H||R.ff(H))if(I(a),null==H)W.Lx();else{var c=R.yi(ha[H]);W.nj(c);xa.Uk(c)}else R.Dj(a),b()}function I(a){ja();null!=a&&R.Dj(a);null!=H&&R.kw(H)}function ja(){ya&&(dc(ya),ya=null)}var O=fd,R,ta,G,za,W,Aa,va,Ga,Oa,Ba,wa,xa,ha,H,S,ma,ka,ga,ua,ya,ra,Ja,Ea,U={ka:function(a){R=a.get(n.Eg,U);ta=a.get(n.Xf,U);G=a.get(n.ud,U);za=a.get(n.ic,U);W=a.get(n.Ua,U);Aa=a.get(n.lg,U);va=a.Eb(n.Xd,U);Ga=a.Eb(n.Xc,U);Oa=a.get(n.Fc,U);Ba=a.get(n.ys, +U);wa=a.get(n.$j,U);xa=a.Ve()},zb:function(){Ga.sort(hc);va.sort(ic)},ea:function(a){Ea=a;S=H=null;ma=O.EMPTY;ka=!1;ga=!0;Ja="";ra=0},L:function(){return n.Rb},X:function(){return 17},W:function(){return{ym:b,my:c,Ox:d,Px:f,Pi:e,ph:g,Fv:h,vh:l,isEnabled:m,Sq:q,jv:t,Fb:v,ol:y,rB:u,Xe:F,uv:w,Ld:C,$e:D,My:E,show:z,rh:A,clear:N,Dk:Q,Ix:J,Jx:V,MA:M,ui:T}},dh:function(){var b={eo:a,Ra:L,Li:P,Fp:aa,Bh:X,yl:fa};return[{lb:Nb,ka:Nb,zb:Nb,ea:Nb,L:function(){return n.Oh},X:function(){return 17},W:function(){return b}, +dh:Nb,Cb:Nb}]},Cb:function(){ua&&(dc(ua),ua=null);ha=null;A()}};return U});pd.register(n.Yf,8,function(){function a(a){a!=A&&(A=a,a=a.Ra(),N?a!=N&&E.replaceChild(a,N):E.appendChild(a),N=a)}function b(){z||(z=E?Math.max(E.offsetHeight,0):0);return z}function c(a){E.className=a.Uv?"gssb_e gsdd_a":"gssb_e";var b=a.Qe||T;F!=b&&(F=b,Dc(u,b));b=a.marginWidth;if(D!=b){var c=C.style;b?(w.hasChildNodes()||w.appendChild(C),c.width=b+"px",Xc&&(c.paddingLeft="1px")):(w.hasChildNodes()&&w.removeChild(C),c.paddingLeft="");D=b}P=a.Vp;aa=a.Kl;l(Q,!0);l(M,!0);t.ub(16);f()}function d(){z= +0;l(Q,!1);l(M,!1);var a=T;F!=a&&(F=a,Dc(u,a));t.ub(11)}function f(){z=0;g();if(M){var a=v.ht[0],c=M.style;"relative"!=v.Zg&&(c.top=u.style.top,c.left=u.offsetLeft+w.offsetWidth+"px");a=b()+a;M.style.height=Math.max(a,0)+"px";h(M,E.offsetWidth)}A&&A.Bh()}function e(a){if(J)V!=a&&J.replaceChild(a,V);else{var b=u.insertRow(-1);b.style.height="0";b.insertCell(-1);J=b.insertCell(-1);m.vh()||(l(E,!1),l(u,!0),f());Q=E;J.appendChild(a)}V=a}function g(){var a,b,c;a=(b=A&&A.Li())?b.offsetWidth:q.Ze();(c=L)? +Lb(c)&&(c=null):D||!P?(E.style.width="",u.style.width=""):(E.style.width="100%",c=a+v.Re[2],h(u,c));if("relative"!=v.Zg){var d=q.wl();b&&(d.qe=uc(b).qe);b=v.Re;var e=b[1];b=b[0];b=d.Hm+q.Hd()+b;"right"==aa?(c=Vc(u),a=Qc(c)-(d.qe-e+a),c=void 0):(d=d.qe+e,"center"==aa&&c&&(d+=(a-c)/2),c=d,a=void 0);e={qe:0,Hm:0};"absolute"==v.Zg&&v.Yg&&v.Yg!=document.body&&(e=uc(v.Yg));d=u.style;d.top=b-e.Hm+"px";d.left=d.right="";void 0!=c?d.left=c-e.qe+"px":d.right=a+e.qe+"px"}nc&&(d.zoom="normal",d.zoom=1)}function h(a, +b){Mb(b)?0<b&&(a.style.width=b+"px"):a.style.width=b}function l(a,b){a&&(a.style.display=b?"":"none")}var m,q,t,v,y,u,F,w,C,D,E,z,A,N,Q,J,V,M,T,L,P=!0,aa,X={lb:function(a,b){T=a.We();b.addRule(".gssb_c","border:0;position:absolute;z-index:989");b.addRule(".gssb_e","border:1px solid #ccc;border-top-color:#d9d9d9;"+b.prefix("box-shadow:0 2px 4px rgba(0,0,0,0.2);")+"cursor:default");b.addRule(".gssb_f","visibility:hidden;white-space:nowrap");b.addRule(".gssb_k","border:0;display:block;position:absolute;top:0;z-index:988"); +b.addRule(".gsdd_a","border:none!important")},ka:function(a){m=a.get(n.ud,X);q=a.get(n.Ua,X);t=a.get(n.sb,X);y=a.Mi().vb()},zb:function(a){v=a;u=xc();u.className="gstl_"+y+" gssb_c";l(u,!1);Q=u;var b=u.insertRow(-1);w=b.insertCell(-1);w.className="gssb_f";C=yc();E=b.insertCell(-1);E.className="gssb_e";E.style.width="100%";v.Tv&&(M=pc("iframe","gstl_"+y+" gssb_k"),l(M,!1),(v.Yg||document.body).appendChild(M));if(L=v.Do)Mb(L)&&(L+=v.Re[2]),h(u,L);g();(a.Yg||document.body).appendChild(u);t.Vb(8,f)}, +ea:function(a){v=a;u.style.position=a.Zg},L:function(){return n.Yf},X:function(){return 8},W:function(){return{rj:a,Hd:b,oj:e,show:c,rh:d,Bh:f}}};return X});pd.register(n.Be,4,function(){function a(a,b){Ga&&(Ga=!1,O.Jm(G,M),O.Jm(G,T));b||(b=a);G.parentNode.replaceChild(a,G);b.appendChild(G);va&&Aa.yx&&(rc||Xc?O.defer(function(){G.focus();sc(G,wa.Ji())}):G.focus());L()}function b(){return ma}function c(a){var b="rtl"==a==("rtl"==Ja);G.dir=a;if(ka){R.tm(a);var c=H.parentNode;c.removeChild(ka);b?Mc(ka,H):c.insertBefore(ka,H)}ma&&(ma.dir=a,c=ma.parentNode,c.removeChild(ma),b?c.insertBefore(ma,H):Mc(ma,H));0!=za&&(a=Cc(a),Bc(G,a,0))}function d(){return wa} +function f(){return uc(S)}function e(){var a=S?S.offsetHeight:0;U>a&&(a=U);return a}function g(){return Za?Za:S?S.offsetWidth:0}function h(){var a=G.offsetWidth;Aa.$p&&(a-=G.offsetHeight);return a}function l(){return G.value}function m(a){(Aa.Yo?G:H||Pb||G).style.background=a||"transparent"}function q(){ha=!0}function t(){G.select();ba()}function v(){$c&&(G.value="");G.value=I.hb();$c&&(G.value=G.value);D()}function y(){if(!va)try{G.focus(),va=!0,D()}catch(a){}}function u(){va&&(G.blur(),va=!1)}function F(){return va} +function w(){G.value=""}function C(){var b=Ea.get("gs_id");if(b)ma=Ea.get("gs_ttc"),H=Ea.get("gs_tti"),I.Gl()&&R&&(ga=R.Ra(),ka=ga.parentNode);else{b=xc();b.id=Ea.vb("gs_id");b.className="gstl_"+W+" "+(Aa.Gm||G.className);var c=b.insertRow(-1),d=b.style,e=G.style;d.width=Za?Za+"px":e.width;d.height=U?U+"px":e.height;d.padding="0";Rc(G);G.className=Aa.Pl;ra&&(ma=c.insertCell(-1),ma.id=Ea.vb("gs_ttc"),ma.style.whiteSpace="nowrap");H=c.insertCell(-1);H.id=Ea.vb("gs_tti");H.className="gsib_a";I.Gl()&& +R&&(ga=R.Ra(),ka=c.insertCell(-1),ka.className="gsib_b",ka.appendChild(ga));a(b,H)}ad&&Yc&&(G.style.height="1.25em",G.style.marginTop="-0.0625em");E(b);S=b}function D(){if(va){var a=G.value.length;wa=Vb(a);sc(G,a)}}function E(a){O.xb(a,"mouseup",function(){G.focus()})}function z(){O.xb(G,"keydown",N);(qc||Aa.lt)&&O.xb(G,"keypress",J);O.xb(G,"select",ba,10);var a=!1,b=function(b){O.xb(G,b,V,10,a)};b("mousedown");b("keyup");b("keypress");a=!0;b("mouseup");b("keydown");b("focus");b("blur");b("cut"); +b("paste");b("input");O.xb(G,"compositionstart",A);O.xb(G,"compositionend",A)}function A(a){a=a.type;"compositionstart"==a?I.Rq(!0):"compositionend"==a&&I.Rq(!1)}function N(a){var b=a.keyCode;xa=b;var c=(Yc||Xc)&&wc(b)&&ja.Ld(),d=b==ea.Xm,e=b==ea.Ph;ua=!1;b==ea.Fg&&(ua=I.ph());d&&((b=ja.Xe())&&Q(b)?ja.Pi(a.shiftKey):O.defer(function(){ja.Pi(a.shiftKey)}));if(c||d||e||ua)a.Vi=!0}function Q(a){return(a=ta[a.L()].QB)&&a()}function J(a){var b=a.keyCode,c=b==ea.Ph,d=b==ea.Fg&&ua;if(b==ea.Xm||c||d)a.Vi= +!0}function V(a){if(!ya){var b=a.Jh;if(!(b.indexOf("key")||a.ctrlKey||a.altKey||a.shiftKey||a.metaKey))a:if(a=a.keyCode,"keypress"!=b){var c=wc(a),d;if("keydown"==b){if(I.py(229==a),c)break a}else if(d=a!=xa,xa=-1,!c||d)break a;switch(a){case ea.Ph:I.Iv();break;case ea.Hr:I.Nv();break;case ea.Ir:I.Ov();break;case ea.Pm:I.Qv();break;case ea.Om:I.Hv(wa);break;case ea.Rr:I.Gv(wa);break;case ea.Kr:I.Ev(wa)}}ba();I.Mv(G.value,wa,b)}}function M(){va=!0;I.Jv()}function T(){va=!1;I.Ep()}function L(){Ga|| +(Ga=!0,O.xb(G,"focus",M,99),O.xb(G,"blur",T,99))}function P(){Ba||(Ba=window.setInterval(X,Aa.qx||50))}function aa(){Ba&&(dc(Ba),Ba=null)}function X(){V({Jh:"polling"})}function fa(){Xc&&Gc(G)}function ba(){if(va){var a=tc(G);a&&(wa=a)}}function qa(){var a;O.xh(window,"pagehide",function(){ya=!0;a=G.value});O.xh(window,"pageshow",function(b){ya=!1;(b.persisted||void 0!==a)&&I.pd(a)})}var ea=od,I,ja,O,R,ta,G,za,W,Aa,va,Ga=!1,Oa,Ba,wa=Vb(0),xa=-1,ha=!1,H,S,ma,ka,ga,ua,ya,ra,Ja,Ea,U,Za,Pb,$a={lb:function(a, +b){Ea=a;G=a.ql();Ja=a.We();a.hi()||(b.addRule(".gsib_a","width:100%;padding:4px 6px 0"),b.addRule(".gsib_a,.gsib_b","vertical-align:top"))},ka:function(a){I=a.get(n.Ua,$a);O=a.get(n.sb,$a);ja=a.get(n.Rb,$a);R=a.get(n.He,$a);ta=Tc(a.Eb(n.RENDERER,$a));a=a.Mi();za=a.rl();W=a.vb()},zb:function(a){Aa=a;U=a.Sp;Za=a.qw;va=vc(G);ba();rc&&O.xb(G,"beforedeactivate",function(a){ha&&(ha=!1,a.Vi=!0)},10);Xc&&qa();S=G;ra=!!a.Te[n.ze];(I.Xv()||I.Gl()||ra||a.su)&&C();a.fu&&(O.xb(G,"blur",aa,10),O.xb(G,"focus",P, +10),Oa=!0);O.Vb(8,fa);z();L()},ea:function(a){Aa=a;var b=a.pw;b&&(Pb=Ea.Di(b));G.setAttribute("autocomplete","off");G.setAttribute("spellcheck",a.spellcheck);G.style.outline=a.Xw?"":"none";Oa&&P()},L:function(){return n.Be},X:function(){return 4},W:function(){return{WC:a,hp:b,tm:c,eh:d,wl:f,Hd:e,Ze:g,np:h,Uu:l,pj:m,gm:q,select:t,refresh:v,focus:y,blur:u,Ui:F,clear:w}},Cb:function(){Oa&&aa();Aa.Jl&&O.Jm(G,I.Ep)}};return $a});pd.register(n.Eg,18,function(){function a(a,b){if(!ba)return!1;X=b;C();for(var c=!1,d=0,e;e=a[d++];)v(e)&&(c=!0);return c}function b(a){var b=A[a.L()];return b&&b.Pv?b.Pv(a):!1}function c(a){return A[a.L()].oh(null,a,N)}function d(a){var b=A[a.L()];if(b&&b.yi){var c=z.Mc();return b.yi(a,c)}return a.ob()}function f(a,b){if(!ba)return!1;X=b;C();for(var c=!1,d=0,e;e=a[d++];)if(1==e)if(ea)qa.appendChild(ea);else{e=u();var f=e.style;f.textAlign="center";f.whiteSpace="nowrap";e.dir=fa;f=yc();f.style.position= +"relative";I=yc();I.className="gssb_g";J.Ip&&(I.style.paddingBottom="1px");y(J.Ux,I,13);J.Wv?y(J.dl,I,8):J.bw&&y(J.Xx,I,14);f.appendChild(I);e.appendChild(f);ea=e.parentNode}else 2==e?ja?qa.appendChild(ja):(e=u(),f=e.style,f.padding="1px 4px 2px 0",f.fontSize="11px",f.textAlign="right",f=pc("a"),f.id="gssb_b",f.href="http://www.google.com/support/websearch/bin/answer.py?hl="+J.ef+"&answer=106230",f.innerHTML=J.Ow,e.appendChild(f),ja=e.parentNode):3==e?(e=L.pop())?qa.appendChild(e):(e=ba.insertRow(-1), +e.Jw=!0,e=e.insertCell(-1),f=pc("div","gssb_l"),e.appendChild(f)):v(e)&&(c=!0);return c}function e(a){F(a,O);var b=D.Fb();b&&E.ub(9,{index:a,SC:b[a],XC:P[a]})}function g(a){F(a,"");E.ub(10)}function h(){for(var a,b,c;c=M.pop();)a=c.L(),(b=V[a])||(b=V[a]=[]),b.push(c),a=c.Ra(),a.parentNode.removeChild(a);for(;a=qa.firstChild;)a=qa.removeChild(a),a.Jw?L.push(a):a!=ea&&a!=ja&&T.push(a);P=[]}function l(a){return(a=P[a])?a.ff():!1}function m(){C()}function q(){return ba}function t(){return J.Hp||fa==X? +aa:null}function v(a){var b=a.L(),c=A[b];if(!c)return!1;var d=(b=V[b])&&b.pop();d||(d=c.Ug(N));c.ma(a,d);M.push(d);var e=d.Ra(),b=u();b.className="gssb_a "+J.rr;b.appendChild(e);if(void 0!==a.ke){P.push(d);var d=X,f=a.ke();J.lw&&(e.onmouseover=function(){D.my(f)},e.onmouseout=function(){D.Jx()});e.onclick=function(b){z.lk();a.Hi()&&z.nj(a.ob());D.Ix();D.Fv(f);b=b||Vc(e).event;c.Kd(b,a,N)}}else d=fa;Dc(b,d);return!0}function y(a,b,c){var d=pc("input");d.type="button";d.value=Yb(a);d.onclick=function(){N.search(z.hb(), +c)};var e;if(J.Vv){a="lsb";e=pc("span");var f=pc("span");e.className="ds";f.className="lsbb";e.appendChild(f);f.appendChild(d)}else a="gssb_h",e=d;d.className=a;b.appendChild(e)}function u(){var a=T.pop();if(a)return qa.appendChild(a),a.firstChild;a=ba.insertRow(-1);a=a.insertCell(-1);a.className=J.rr;a.onmousedown=w;return a}function F(a,b){var c=P[a];c&&c.ff()&&(c.Ra().parentNode.parentNode.className=b)}function w(a){a=a||Vc(ba).event;a.stopPropagation?a.stopPropagation():qc||rc&&z.gm();return!1} +function C(){if(I){var a=J.mo?J.mo:z.Ze()-3;0<a&&(I.style.width=a+"px")}}var D,E,z,A,N,Q,J,V={},M=[],T=[],L=[],P=[],aa,X,fa,ba,qa,ea,I,ja,O,R={lb:function(a,b){Q=a;fa=a.We();b.addRule(".gssb_a","padding:0 7px");b.addRule(".gssb_a,.gssb_a td","white-space:nowrap;overflow:hidden;line-height:22px");b.addRule("#gssb_b","font-size:11px;color:#36c;text-decoration:none");b.addRule("#gssb_b:hover","font-size:11px;color:#36c;text-decoration:underline");b.addRule(".gssb_g","text-align:center;padding:8px 0 7px;position:relative"); +b.addRule(".gssb_h","font-size:15px;height:28px;margin:0.2em"+(Yc?";-webkit-appearance:button":""));b.addRule(".gssb_i","background:#eee");b.addRule(".gss_ifl","visibility:hidden;padding-left:5px");b.addRule(".gssb_i .gss_ifl","visibility:visible");b.addRule("a.gssb_j","font-size:13px;color:#36c;text-decoration:none;line-height:100%");b.addRule("a.gssb_j:hover","text-decoration:underline");b.addRule(".gssb_l","height:1px;background-color:#e5e5e5");b.addRule(".gssb_m","color:#000;background:#fff")}, +ka:function(a){D=a.get(n.Rb,R);E=a.get(n.sb,R);z=a.get(n.Ua,R);N=a.get(n.yd,R);A=Tc(a.Eb(n.RENDERER,R))},zb:function(a){J=a;ba=xc();a=pc("tbody");ba.appendChild(a);qa=ba.getElementsByTagName("tbody")[0]},ea:function(a){J=a;var b=a.vq;b&&(aa=Q.Di(b));ba.className=a.ur||"gssb_m";O=a.sr||"gssb_i"},L:function(){return n.Eg},X:function(){return 18},W:function(){return{Cx:a,yi:d,Pi:c,ph:b,ma:f,kw:e,Dj:g,clear:h,ff:l,Bh:m,Ra:q,Li:t}}};return R});pd.register(n.Mh,346,function(){function a(a){a=c.Ea(a);for(var e in g)e in a||(a[e]=g[e]);b(d+Rb(a))}function b(a){var b=new Image,c=e;b.onerror=b.onload=b.onabort=function(){try{delete f[c]}catch(a){}};f[e]=b;b.src=a;e++}var c,d,f=[],e=0,g,h={ka:function(a){c=a.get(n.xd,h)},ea:function(a){d="//"+(a.Pw||"www."+a.to)+"/gen_204?";g=a.nr||{}},L:function(){return n.Mh},X:function(){return 346},W:function(){return{kj:a}}};return h});pd.register(n.Uh,21,function(){function a(a){h(a);var b=a.hd();if((!b||!b.Up())&&t)for(b=0;b<t.length;++b)t[b].update(a)}function b(a){var b=q[a.gp()]||null;if(b)++v;else if(t&&!a.Up())for(var c=0;c<t.length;++c)if(b=t[c].get(a)){h(b);++y;break}return b?td(a,b.Fb(),b.Ea(),b.Sl(),b.Ti(),b.Bw()):null}function c(){return v}function d(){return y}function f(){y=v=0}function e(a){var b,c,d,e;for(e in q)for(b=q[e],b=b.Fb(),d=0;c=b[d++];)if(c.L()==a){delete q[e];break}l()}function g(){q={};l()}function h(a){a&& +a.Ti()&&(q[a.hd().gp()]=a)}function l(){if(t)for(var a=0;a<t.length;++a)t[a].reset()}function m(a,b){return b.ib()-a.ib()}var q={},t,v,y,u={ka:function(a){t=a.Eb(n.Ce,u);t.sort(m)},ea:function(){f()},L:function(){return n.Uh},X:function(){return 21},W:function(){return{put:a,get:b,Au:c,pl:d,Pd:f,pt:e,ot:g}}};return u});pd.register(n.sd,190,function(){function a(){q&&l.kk(h)}function b(){q&&l.dj(h)}function c(){q&&m.kk(h)}function d(){q&&m.dj(h)}var f,e,g,h,l,m,q=!1,t={lb:function(a,b){g=a;var c=function(a){return"box-shadow:"+a+"-moz-box-shadow:"+a+"-webkit-box-shadow:"+a};b.addRule(".gsfe_a","border:1px solid #b9b9b9;border-top-color:#a0a0a0;"+c("inset 0px 1px 2px rgba(0,0,0,0.1);"));b.addRule(".gsfe_b","border:1px solid #4d90fe;outline:none;"+c("inset 0px 1px 2px rgba(0,0,0,0.3);"))},ka:function(a){f=a.get(n.sb, +t);e=a.get(n.Ua,t)},zb:function(e){var q=e.el;if(h=q?g.Di(q):null)f.Vb(12,c),f.Vb(13,d),f.xb(h,"mouseover",a),f.xb(h,"mouseout",b),l=yd(e.il||"gsfe_a"),m=yd(e.fl||"gsfe_b")},ea:function(){q=!0;h&&e.Xp()&&m.kk(h)},L:function(){return n.sd},X:function(){return 190},Cb:function(){q=!1;h&&(l.dj(h),m.dj(h))}};return t});var yd=function(a){var b=new RegExp("(?:^|\\s+)"+a+"(?:$|\\s+)");return{kk:function(c){c&&!b.test(c.className)&&(c.className+=" "+a)},dj:function(a){a&&(a.className=a.className.replace(b," "))}}};var zd=function(){function a(a){if("keyup"==a.Oi()){var b=Kb();if(l){var c=b-l;d+=c;f+=c*c}a=a.Jb().length;a<h&&++e;++g;h=a;l=b}}function b(){return[d,f,g,e]}function c(){l=h=g=e=f=d=0}var d,f,e,g,h,l;return{L:function(){return n.sd},X:function(){return 325},W:function(){return{sx:a,vl:b,Pd:c}}}};var Ad=function(){function a(){return 23}function b(){return e.vl().join("j").replace(d,"j").replace(f,"")}function c(){e.Pd()}var d=/j0/g,f=/j+$/,e,g={ka:function(a){e=a.$o(325,g)},L:function(){return n.Qh},X:function(){return 337},W:function(){return{ke:a,Cv:b,reset:c}}};return g};var Bd=function(){function a(a){c.sx(a);return 1}function b(){return 17}var c,d={ka:function(a){c=a.$o(325,d)},L:function(){return n.Xc},X:function(){return 331},W:function(){return{kh:a,ib:b}}};return d};var Cd=function(){function a(a){return y&&v==a.Jb()?td(a,y,sd,!0,!1,!1):null}function b(a){return!!a&&0<=a.indexOf("**")}function c(){return C}function d(){C=""}function f(){var a=!u||!m.hb();a!=F&&(F?w.removeAttribute("x-webkit-speech"):w.setAttribute("x-webkit-speech",""),F=a)}function e(a,b){b=Xb(b);a=Xb(Sb(a,!0));for(var c=a.split(" "),d=b.split(" "),e,f=0;f<d.length;++f)e=d[f],0>c.indexOf(e)&&(d[f]=e.bold());return d.join(" ").replace(h," ")}function g(a){a=a&&a.Mx?a.Mx:[];var c=Math.min(a.length, +3);v=a[0].cz;q.add(6);if(b(v)){y=[];for(var d=0;d<c;++d){var f=a[d].cz;b(f)||y.push(ud(e(v,f),f,d,40,null))}}else y=null,C=v,t.search(v,15)}var h=/<\/b> <b>/gi,l,m,q,t,v,y,u,F,w,C="",D={lb:function(a){w=a.ql()},ka:function(a){l=a.get(n.sb,D);m=a.get(n.Ua,D);q=a.get(n.vd,D);t=a.get(n.yd,D)},zb:function(a){u=a.hw;f();w.setAttribute("x-webkit-grammar","builtin:search");""!=a.ef&&w.setAttribute("lang",a.ef);l.xh(w,"webkitspeechchange",g);u&&(l.Vb(4,f),l.Vb(5,f),l.Vb(1,f))},L:function(){return n.Dg},X:function(){return 90}, +W:function(){return{qt:d,Yu:c,bv:a,so:b}}};return D};var Ed=function(){function a(a){return Dd(f,a)}function b(a,b){b.ma(a.hh(),a.ob(),e)}function c(a,b,c){c.search(b.ob(),1)}function d(){return 40}var f,e,g={lb:function(a,b){b.addRule(".gsq_a","padding:0")},ka:function(a){f=a.get(n.Ua,g)},ea:function(a){e=a.bl?a.dl:""},L:function(){return n.RENDERER},X:function(){return 30},W:function(){return{Ug:a,ma:b,Kd:c,oh:Nb,lh:d}}};return g};var Dd=function(a,b){var c,d,f,e,g;(function(){c=yc();c.className="gsq_a";var a=xc();c.appendChild(a);d=a.insertRow(-1);a=d.insertCell(-1);a.style.width="100%";f=pc("span");a.appendChild(f)})();return{Ra:function(){return c},L:function(){return 40},ff:function(){return!0},ma:function(c,l,m){f.innerHTML=c;g=l;m&&!e&&(e=Nc(d),e.onclick=function(c){a.lk();a.nj(g);b.search(g,9);return Lc(c)});m?(e.innerHTML=m+" »",e.style.display=""):e&&(e.style.display="none")}}};var Fd=function(){function a(a){var b=a.Oi();return c&&"input"==b&&c.Yu()==a.Jb()?(c.qt(),3):1}function b(){return 22}var c,d={ka:function(a){c=a.get(n.Dg,d)},L:function(){return n.Xc},X:function(){return 465},W:function(){return{kh:a,ib:b}}};return d};var Gd=function(){function a(){return 1}function b(a){var b=null;c&&(b=c.bv(a));return b}var c,d={L:function(){return n.Ce},ka:function(a){c=a.get(n.Dg,d)},X:function(){return 100},W:function(){return{ib:a,update:Nb,get:b,reset:Nb}}};return d};var Hd=function(a){function b(){f.Xp()||f.hb()?c():a&&!e&&(f.pj(a),e=!0)}function c(){if(e||void 0==e)f.pj("#fff"),e=!1}var d,f,e,g,h={lb:function(a){g=a.ql()},ka:function(a){d=a.get(n.sb,h);f=a.get(n.Ua,h)},zb:function(){d.xb(g,"focus",c);d.xb(g,"blur",b);d.Vb(4,b);d.Vb(5,b)},ea:function(){b()},L:function(){return n.sd},X:function(){return 166},Cb:function(){c()}};return h};var Id=function(a){function b(b){var c=d.DONT_CARE;if(f){var h=b.Oi();"focus"==h||"blur"==h||"mousedown"==h?c=d.Fn:(b.lj("partnerid",a),b.setParameter("types","t"))}return c}function c(){return 10}var d=hd,f;return{ea:function(a){f=!!a.Te[66]},L:function(){return n.Xc},X:function(){return 66},W:function(){return{kh:b,ib:c}}}};var Kd=function(a){function b(){return Jd(a,f)}function c(a,b){b.ma(a)}function d(){return 505}var f;return{lb:function(a){f=a.We()},L:function(){return n.RENDERER},X:function(){return 182},W:function(){return{Ug:b,ma:c,Kd:Nb,oh:Nb,lh:d}}}},Jd=function(a,b){var c,d={L:function(){return 505},Ra:function(){return c},ma:Nb};(function(){c=yc();var d=c.style;d.backgroundImage="url("+a+")";d.backgroundRepeat="no-repeat";d.height="18px";d.marginBottom="2px";d.backgroundPosition="bottom "+("ltr"==b?"right": +"left")})();return d};pd.register(n.Xd,181,function(){function a(){return 5}function b(a,b,f){f.push({L:function(){return 505},position:1})}return{L:function(){return n.Xd},X:function(){return 181},W:function(){return{ib:a,sp:b}}}});var Md=function(a,b){function c(){y=null;q&&(q.Ra().innerHTML="")}function d(a,b){var c=C.length;switch(a.keyCode){case E.Om:var d=g(b);if(0>d)break;Hc(a);C[(d+1)%c].focus();break;case E.Pm:d=g(b);if(0>d)break;Hc(a);C[(d-1+c)%c].focus();break;case E.Ph:w=!1;m.focus();break;case E.Fg:Hc(a),w=!1,a.shiftKey?m.focus():(m.Ek(),D&&D.focus())}}function f(){window.setTimeout(function(){w&&0>g(document.activeElement)&&(w=!1,m.Ui()||m.Ek())},10)}function e(){var a=q.Ra();if(a.getElementsByClassName)return a.getElementsByClassName("cse-sayt-accessibility"); +for(var a=a.getElementsByTagName("a"),b=/\bcse-sayt-accessibility\b/,c=[],d=0;d<a.length;d++)b.test(a[d].className)&&c.push(a[d]);return c}function g(a){for(var b=0;b<C.length;b++)if(C[b]==a)return b;return-1}function h(a,b,c,d){b=null;a&&(b=a[0],u.put(d?c+d:c,b));c!=t||d&&d!=v||(y=b,l())}function l(){q&&y?q.Ra().innerHTML=y:c();b&&b()}var m,q,t,v,y,u,F,w=!1,C,D,E=od,z={ka:function(a){m=a},Ex:function(a){q=a;l()},zr:function(){var b;a:{if(m){b=null;if(m.$e())b=m.Xe();else if(m.Ld()){var d=m.Gd(); +d&&(b=Ib(d).Fb()[0])}if(b){b=b.ob();break a}}b=null}d=F&&F.restrictBy?F.restrictBy:"";if(t!=b||d!=v)if(t=b,v=d,b){var e=u.get(d?b+d:b);e?b!=t||d&&d!=v||(y=e,l()):(c(),a(b,h,z))}else c()},qk:c,Ny:function(){var a=e();C=[];for(var b=0;b<a.length;b++){var c=a[b];c.addEventListener?(C.push(c),c.addEventListener("keydown",function(a){d(a,a.srcElement?a.srcElement:this)},!0),c.addEventListener("blur",function(){f()},!0)):c.attachEvent&&(C.push(c),c.attachEvent("onkeydown",function(a){d(a,a.srcElement?a.srcElement: +this)}),c.attachEvent("onblur",function(){f()}))}C.length&&(w=!0,window.setTimeout(function(){D=document.activeElement;C[0].focus()},10))},Lv:function(){window.setTimeout(function(){w||m.Ek()},20)},ky:function(a){F=a}};u=Ld(36E5);return z};var Od=function(a){function b(){return Nd(f)}function c(b,c){a.Ex(c)}function d(){return 503}var f,e={ka:function(a){f=a.get(n.Rb,e)},L:function(){return n.RENDERER},X:function(){return 68},W:function(){return{Ug:b,ma:c,Kd:Nb,oh:Nb,lh:d}}};return e},Nd=function(){var a,b={L:function(){return 503},Ra:function(){return a},ma:Nb};a=yc("cse-sayt-container");return b}; +pd.register(n.Xd,67,function(){function a(){return 4}function b(a,b,f){f.push({L:function(){return 503},position:1})}return{L:function(){return n.Xd},X:function(){return 67},W:function(){return{ib:a,sp:b}}}});var Pd=function(a,b){function c(){return 2}function d(c){for(var d=[],g=[],h=c.Fb(),l=!1,m=0,q;q=h[m++];)34==q.L()?g.length<b&&(g.push(q),q.Ea().nb("c")&&(l=!0)):d.length<a&&d.push(gc(q,d.length));for(m=0;h=g[m++];){q=h.Ea();var t={};t.a=q.nb("a");t.b=q.nb("b");t.c=q.nb("c");t.d=q.nb("d");t.e=l;d.push(ud("","",d.length,h.L(),h.Ye(),vd(t)))}return td(c.hd(),d,c.Ea(),c.Sl(),c.Ti(),!0)}return{L:function(){return n.Vh},X:function(){return 171},W:function(){return{ib:c,Wt:d}}}};pd.register(n.Ce,98,function(){function a(){return 3}function b(a){if(f){var b=a.hd(),c=a.Fb();if(c.length){var d=b.le();a:for(var b=Number.MAX_VALUE,h,l=0;h=c[l++];){if(!e[h.L()]){b=-1;break a}h=h.ob();b=Math.min(h.length,b)}if(-1!=b){var m=c[0].ob();if(bc(m,d,!0))for(l=d.length+1;l<=b;){d=null;for(h=0;m=c[h++];){m=m.ob();if(l>m.length)return;m=m.substr(0,l);if(!d)d=m;else if(d!=m)return}g[d]=a;++l}}}}}function c(a){if(f){var b=g[a.le()];if(b){var c=a.rp(),d=a.le();b.hd().le();for(var e=b.Ea(),m= +l||!e.tp("k"),w=[],C,D,E=b.Fb(),z=0,A;A=E[z++];)D=A.ob(),C=m?h.bold(c,D):Xb(D),w.push(ud(C,D,A.ke(),A.L(),A.Ye(),A.Ea()));delete g[d];return td(a,w,e,!0,b.Ti(),!1)}}return null}function d(){g={}}var f=!0,e,g={},h,l,m={ka:function(a){h=a.get(n.Nh,m)},zb:function(){e=Gb([0])},ea:function(a){l=a.Dl;f=a.Go},L:function(){return n.Ce},X:function(){return 98},W:function(){return{ib:a,update:b,get:c,reset:d}},Cb:function(){f=!1}};return m});pd.register(n.RENDERER,169,function(){function a(){return Qd()}function b(a,b){var c=a.Ea();b.ma(c.nb("a"),c.nb("c"),c.nb("d"),c.yu("e"))}function c(a,b){return b}function d(a,b,c){a=b.Ea().nb("b");(bc(a,"http://")||bc(a,"https://"))&&c.mf(a)}function f(a,b,c){a=b.Ea().nb("b");(bc(a,"http://")||bc(a,"https://"))&&c.mf(a);return!0}function e(){return 34}return{lb:function(a,b){b.addRule(".gscsep_a","display:none")},L:function(){return n.RENDERER},X:function(){return 169},W:function(){return{Ug:a,ma:b, +yi:c,Kd:d,oh:f,lh:e}}}});var Qd=function(){var a,b,c,d,f;(function(){a=yc();var e=xc();e.className="gsc-completion-promotion-table";a.appendChild(e);var g=e.insertRow(-1),e=function(){var a=g.insertCell(-1);a.setAttribute("valign","top");return a};c=e();d=pc("img");d.className="gsc-completion-icon";b=yc();b.className="gsc-completion-title";f=yc();f.className="gsc-completion-snippet";e=e();e.appendChild(b);e.appendChild(f)})();return{Ra:function(){return a},L:function(){return 34},ff:function(){return!0},ma:function(a,g,h, +l){g&&(bc(g,"http://")||bc(g,"https://")||bc(g,"//"))?(d.src=g,c.hasChildNodes()||c.appendChild(d)):c.hasChildNodes()&&c.removeChild(d);c.className=l?"gsc-completion-icon-cell":"gscsep_a";b.innerHTML=a;f.innerHTML=h}}};pd.register(n.RENDERER,20,function(){function a(a){return Rd(f,a)}function b(a,b){b.ma(a.hh(),a.ob(),e)}function c(a,b,c){c.search(b.ob(),1)}function d(){return 0}var f,e,g={lb:function(a,b){b.addRule(".gsq_a","padding:0")},ka:function(a){f=a.get(n.Ua,g)},ea:function(a){e=a.bl?a.dl:""},L:function(){return n.RENDERER},X:function(){return 20},W:function(){return{Ug:a,ma:b,Kd:c,oh:Nb,lh:d}}};return g});var Rd=function(a,b){var c,d,f,e,g;(function(){c=yc();c.className="gsq_a";var a=xc();c.appendChild(a);d=a.insertRow(-1);a=d.insertCell(-1);a.style.width="100%";f=pc("span");a.appendChild(f)})();return{Ra:function(){return c},L:function(){return 0},ff:function(){return!0},ma:function(c,l,m){f.innerHTML=c;g=l;m&&!e&&(e=Nc(d),e.onclick=function(c){a.lk();a.nj(g);b.search(g,9);return Lc(c)});m?(e.innerHTML=m+" »",e.style.display=""):e&&(e.style.display="none")}}};pd.register(n.Ge,77,function(){function a(){return q}function b(){return 77}function c(){return 5}function d(){return y}function f(){return{Ew:!t}}function e(){h.clear(!0)}function g(){v&&((t=!!h.hb())&&q?m.Hy(77):m.jw(77))}var h,l,m,q,t,v,y,u,F={lb:function(a,b){u=a;a.hi()||(b.addRule(".gscb_a","display:inline-block;font:27px/13px arial,sans-serif"),b.addRule(".gsst_a .gscb_a","color:#a1b9ed;cursor:pointer"),b.addRule(".gsst_a:hover .gscb_a,.gsst_a:focus .gscb_a","color:#36c"))},ka:function(a){h= +a.get(n.Ua,F);l=a.get(n.sb,F);m=a.get(n.He,F)},zb:function(a){q=!!a.Qi;v=a.Mp;t=!v||!!h.hb();y=u.get("gs_cb");y||(y=pc("span","gscb_a"),y.id=u.vb("gs_cb"),y.innerHTML="×");l.Vb(4,g);l.Vb(5,g);l.Vb(1,g)},ea:function(a){a.Fl&&(q=!!a.Qi);v=a.Mp;t=!v||!!h.hb()},L:function(){return n.Ge},X:function(){return 77},W:function(){return{isEnabled:a,yp:b,ib:c,Ra:d,up:f,Kd:e}}};return F});pd.register(n.He,174,function(){function a(){return 174}function b(a){ba!=a&&(V.dir=ba=a,e())}function c(){return V}function d(a){(a=T[a])&&a.style&&(a.style.display="")}function f(a){(a=T[a])&&a.style&&(a.style.display="none")}function e(){L&&(T[L].className="gsst_a",E.rh(),L=null)}function g(a,b){L=a;var c=T[a];c.className="gsst_a gsst_g";var d=P.lastChild;d!=b&&(d==aa?P.appendChild(b):P.replaceChild(b,d));E.rj(174);E.show();c=c.clientWidth;aa.style.width=c+"px";aa.style.left="rtl"==ba?"0":P.clientWidth- +c+"px"}function h(a,b){L==a?e():g(a,b)}function l(a){a.Kl="rtl"==ba?"left":"right";a.Vp=!1}function m(){return P}function q(){return J.Hp||fa==ba?qa:null}function t(){e()}function v(){return 174}function y(a,b){return b.ib()-a.ib()}function u(){X!=L&&e()}function F(){for(var a,b=0,c;c=N[b++];)if(c.isEnabled()){a=!0;var d=pc("a","gsst_a");D(d,c);d.appendChild(c.Ra());V.appendChild(d)}V.style.display=a?"":"none"}function w(){X=null}function C(){T={};for(var a=0,b;b=N[a++];)if(b.isEnabled()){var c=b.yp(), +d=b.Ra().parentNode;d.onclick=b.Kd;d.onmouseover=function(){X=c};d.onmouseout=w;T[c]=d;b.up&&(b=b.up(),b.Ew&&f(c),(b=b.aD)&&!Q.zm(d,b)&&(d.title=b))}}function D(a,b){a.href="javascript:void(0)";Wc(a);a.onkeydown=function(a){a=a||window.event;var c=a.keyCode;if(13==c||32==c)b.Kd(a),A.pu(),Lc(a)}}var E,z,A,N,Q,J,V,M,T={},L,P,aa,X,fa,ba,qa,ea,I={lb:function(a,b){M=a;fa=a.We();a.hi()||(b.addRule(".gsst_a","display:inline-block"),b.addRule(".gsst_a","cursor:pointer;padding:0 4px"),b.addRule(".gsst_a:hover", +"text-decoration:none!important"),b.addRule(".gsst_b","font-size:16px;padding:0 2px;position:relative;"+b.prefix("user-select:none;")+"white-space:nowrap"),b.addRule(".gsst_e",Sc(.55)),b.addRule(".gsst_a:hover .gsst_e,.gsst_a:focus .gsst_e",Sc(.72)),b.addRule(".gsst_a:active .gsst_e",Sc(1)),b.addRule(".gsst_f","background:white;text-align:left"),b.addRule(".gsst_g","background-color:white;border:1px solid #ccc;border-top-color:#d9d9d9;"+b.prefix("box-shadow:0 2px 4px rgba(0,0,0,0.2);")+"margin:-1px -3px;padding:0 6px"), +b.addRule(".gsst_h","background-color:white;height:1px;margin-bottom:-1px;position:relative;top:-1px"))},ka:function(a){E=a.get(n.ud,I);z=a.get(n.sb,I);A=a.get(n.Ua,I);N=a.Eb(n.Ge,I);Q=a.Ve()},zb:function(a){ea=a.Fl;N.sort(y);V=M.get("gs_st");if(!V){V=yc("gsst_b");V.id=M.vb("gs_st");if(a=a.Sp)V.style.lineHeight=a+"px";F()}C()},ea:function(a){J=a;(a=a.vq)&&(qa=M.Di(a));if(ea){a=0;for(var b;b=N[a++];){var c=!!T[b.yp()];if(b.isEnabled()!=c){for(;V.hasChildNodes();)V.removeChild(V.lastChild);F();C(); +break}}}aa=yc("gsst_h");P=yc("gsst_f");P.dir="ltr";P.appendChild(aa);z.Vb(13,u)},L:function(){return n.He},X:a,W:function(){return{tm:b,Ra:c,Hy:d,jw:f,KB:e,OC:g,$C:h}},dh:function(){var b={eo:l,Ra:m,Li:q,Fp:t,Bh:Nb,yl:v};return[{lb:Nb,ka:Nb,zb:Nb,ea:Nb,L:function(){return n.Oh},X:a,W:function(){return b},dh:Nb,Cb:Nb}]}};return I});bd=function(){var a=window.navigator.userAgent,b=function(b){return 0<=a.indexOf(b)},c={};window.opera?c[2]=!0:b("MSIE")||b("Trident")?c[0]=!0:b("WebKit")?(c[5]=!0,b("Chrome")?c[3]=!0:b("Android")?c[7]=!0:b("Safari")&&(c[4]=!0),b("iPad")&&(c[6]=!0)):b("Gecko")&&(c[1]=!0);return c};var Ld=function(a){function b(a){delete d[a];delete f[a]}function c(c){if(a){var d=Kb(),h=f[c];h&&h<d&&b(c)}}var d={},f={};return{put:function(b,c){d[b]=c;if(null!=a){var h=Kb()+a;f[b]=h}},get:function(a){c(a);return d[a]||null},contains:function(a){c(a);return a in d},remove:b,reset:function(){d={};f={}}}};var Sd=function(){function a(a){return{api:a,install:a.a,ea:a.b,Cb:a.c,pB:a.d,Os:a.e,Mc:a.f,hb:a.g,Ld:a.h,$e:a.i,vl:a.j,ov:a.k,Kw:a.l,zB:a.m,Rs:a.n,mi:a.o,Ek:a.p,ir:a.q,oB:a.r,dB:a.s,Xi:a.t,Lq:a.u,focus:a.v,blur:a.w,Wp:a.x,Gd:a.y,pd:a.z,rC:a.aa,Pd:a.ab,search:a.ad,zC:a.ae,MC:a.af,ui:a.ag,Xe:a.ah,jD:a.ai,Wn:a.al,Tp:a.am,zx:a.an,de:a.ao,Nu:a.ap,sB:a.aq,rl:a.ar,vb:a.as,eB:a.at,ym:a.au,KC:a.av,Ui:a.aw,Uq:a.ax,oj:a.ay,Fw:a.az,Ni:a.ba,FC:a.bb,xB:a.bc,kj:a.bd,tB:a.be,so:a.bf}}return{ih:function(b,c,d,f){try{var e= +window.google.sbox(b,c,d,f);return a(e)}catch(g){return null}},translate:function(b){return a(b.api||b)}}};pd.register(n.$j,170,function(){function a(a){if(1<a.length&&34!=a[0].L())for(var c=1,d;d=a[c];++c)if(34==d.L()){a.splice(c,0,3);break}}return{L:function(){return n.$j},X:function(){return 170},W:function(){return{Ss:a}}}});window.google||(window.google={}); +window.google.sbox=function(a,b,c,d){function f(){A.Cb()}function e(a){T.pd(a||"")}function g(){return ta}function h(){return R}function l(){return T.hb()}function m(){return I.Xe()}function q(){V.ub(8)}function t(a){return aa.Ea(a)}function v(){return za||!!Q&&Q.de()}function y(){return P.cv()}function u(a){a=a.or||ec();a=Vc(a);void 0==a.nextSearchboxId&&(a.nextSearchboxId=50);return a.nextSearchboxId++}function F(){if(a)for(var b=a;b=b.parentNode;){var c=b.dir;if(c)return c}return"ltr"}function w(a){a= +jc(a);a.Hh[35]||(a.bz="");var b=a.lq;b?a.lq=b.toLowerCase():a.Zv=!1;a.cl&&!a.bl&&(a.cl=!1);cd||(a.$p=!1);return a}function C(a,b){var c=b.exec(a);return c&&c[1]?parseInt(c[1],10)||0:0}function D(){var b=Vc(a),c=Pc(b);V.xh(b,"resize",function(){var a=Pc(b);if(a.Cr!=c.Cr||a.Lp!=c.Lp)c=a,q()})}function E(a){var b=a.Te,c=b[n.cn],d=b[n.Vj],e=b[n.vn],f=b[n.zn],g=b[n.Hg],e=d||f||e;b[n.Sj]||g||c||e?(a.Te[n.Sj]=!0,a.Te[n.mn]=!0,e?(a=Jb(a.ef),!d||Xc&&(ad||a)||rc&&a?(ta=3,b[n.Vj]=!1,b[n.rn]=!1):ta=2):ta=1): +ta=0}var z,A,N,Q,J,V,M,T,L,P,aa,X,fa,ba,qa,ea,I,ja,O,R,ta,G=!1,za,W={a:function(c){if(!G){c=w(c);R=null==d?u(c):d;var e=Uc(a),f=F(),g=!!e.getElementById("gs_id"+R),h=["gssb_c","gssb_k"];c.Gm&&h.push(c.Gm);h=wd(c.or,c.dw,c.du,R,h);E(c);za=c.de;A=qd(z,c.sk||{},{hi:function(){return g},get:function(a){return e.getElementById(a+R)},Di:function(a){return e.getElementById(a)},kp:function(){return b},We:function(){return f},vb:function(a){return a+R},ql:function(){return a}},h,W,c);N=A.get(n.Mh,W);Q=A.get(n.ze, +W);J=A.get(n.ud,W);V=A.get(n.sb,W);M=A.get(n.ic,W);T=A.get(n.Ua,W);L=A.get(n.Be,W);P=A.get(n.vd,W);aa=A.get(n.xd,W);X=A.get(n.qs,W);fa=A.get(n.ss,W);ba=A.get(n.De,W);qa=A.get(n.Dg,W);ea=A.get(n.Fc,W);I=A.get(n.Rb,W);ja=A.get(n.Hg,W);O=A.get(n.yd,W);D();G=!0}},b:function(a){f();a=w(a);E(a);za=a.de;A.ea(a)},c:f,d:function(){return b},e:function(a,b){return Ec(a,b)},f:function(){return T.Mc()},g:l,h:function(){return I.Ld()},i:function(){return I.$e()},j:t,k:function(a,b){a||(a=aa.Ea(b));return Rb(a)}, +l:function(){return I.vh()},m:function(){return I.jv()},n:function(a,b){V.xh(a,"click",function(a){O.search(l(),b);return Hc(a)})},o:function(){M.mi()},p:function(){I.Dk()},q:function(a){T.ir(a||"")},r:function(){return J.Hd()},s:function(){T.clear()},t:function(a){return M.Xi(a)},u:function(){T.Lq()},v:function(){L.focus()},w:function(){L.blur()},x:function(){return M.Wp()},y:function(){var a=ea.Gd();return a?Hb(a.mp()):null},z:e,aa:function(a){a=ba.em(a);return Hb(a.mp())},ab:function(){aa.reset()}, +ad:function(a,b){O.search(a,b)},ae:function(){ja&&ja.refresh()},af:function(a){I.Sq(a)},ag:function(){I.ui()},ah:m,ai:q,al:function(){T.Wn()},am:function(){return A&&A.Tp()},an:function(a){Q&&Q.zx(a)},ao:v,ap:function(){return v()&&Q?Q.Nu():""},aq:function(a,b){return Fc(a,b)},ar:g,as:h,at:function(){ja&&ja.clear()},au:function(a,b){e(a);I.isEnabled()&&I.ym(a,b,!1)},av:function(a){V.ub(15,{bj:a})},aw:function(){return L.Ui()},ax:function(a){M.Uq(a)},ay:function(a){J.oj(a)},az:function(a){return!!fa&& +fa.Fw(a)},ba:function(){var a,b=ea.Gd();if(b){var c=b.ol();c&&((a=c.Ni())||(a=b.Ea().nb("o")))}return a||""},bb:function(a,b){return X?(X.GC(a,b),!0):!1},bc:function(a,b){switch(a){case "oq":case "gs_l":return t(b)[a]||null;case "gs_ssp":var c;a:{if((c=m())&&46==c.L()&&(c=c.Ea().nb("g")))break a;c=null}return c;default:return null}},bd:function(a){N&&N.kj(a)},be:y,bf:function(a){return 6==y()&&!!qa&&qa.so(a)},vb:h,rl:g};z=xd(c);(function(a){var b=z.ml(),c=C(a,/Version\/(\d+)/);c||(c=C(a,/(?:Android|Chrome|Firefox|Opera|MSIE)[\s\/](\d+)/)); +c||(c=C(a,/Trident[^)]*rv:(\d+)/));a=c;oc=(rc=b[0])&&8>=a;nc=rc&&7>=a;Xc=b[1];qc=b[2];Yc=b[5];Zc=b[4];cd=b[3];$c=b[7]})(window.navigator.userAgent);ad=/Mac/.test(navigator&&(navigator.platform||navigator.appVersion)||"");return W};var Ud=function(){function a(a){var b=!0;void 0!=a&&(b=a==v.Ri,v.Ri=a);q?b||q.ea(v):(q=Sd().ih(w,u,ba),q.install(v),E&&E.ka(q))}function b(a){q.pd(a)}function c(a){return a+(0<=a.indexOf("?")?"&":"?")+q.ov()}function d(){P&&P()}function f(b,c,d,f){u=b;w=c;aa=d;var l=f.onRenderCallback;l&&(P=function(){try{l()}catch(a){}});v=e();h(v,f);g(d,v);a();f.searchButton&&q.Rs(f.searchButton,12)}function e(){var a=t.ih();a.rk="partner";a.om="partner";a.Ao="cse";a.Hw=!0;a.nr={partnerid:aa};a.Yo=!0;a.Pl="gsc-input"; +a.ur="gsc-completion-container";a.sr="gsc-completion-selected";J&&(a.el=w.id,a.il="gsc-input-hover",a.fl="gsc-input-focus");a.Re=[-1,0,0];a.Dl=!0;a.de=!0;a.Qi=!1;a.spellcheck=!1;a.Hh=Gb([0,34]);a.Te[66]=!0;return a}function g(a,b){var c={},d=c[n.sd]=[162];if(D||z)c[n.RENDERER]=[D?Od(E):Kd(z),162];kc(c,n.Xc,Id(a));kc(c,n.sd,zd());kc(c,n.Xc,Bd());kc(c,n.Qh,Ad());A&&d.push(Hd(A));kc(c,n.Vh,Pd(N,Q));b.sk=c;M&&(c=b.sk,c[n.Dg]=Cd(),kc(c,n.Xc,Fd()),kc(c,n.Ce,Gd()),kc(c,n.RENDERER,Ed()))}function h(a,b){if(V= +!!b.useKennedyLookAndFeel)J&&(a.el=w.parentNode.id,a.il="gsc-input-box-hover",a.fl="gsc-input-box-focus"),a.Re=[3,-1,2],a.Qi=!0;b.interfaceLanguage&&(a.ef=b.interfaceLanguage);b.disableAutoCompletions&&(a.Ri=!0);N=parseInt(b.maxSuggestions,10);var c=b.saytSubmit;c&&(E=Md(c,P),b.saytExtraParameters&&E.ky(b.saytExtraParameters),a.Hh[503]=!0,a.Hh[34]=!1,b.saytKeyboardNavigationEnabled&&(a.yj=4,a.Jl=!1,fa=!0),D=!0);0<=N||(N=c?5:10);Q=parseInt(b.maxPromotions,10);0<=Q||(Q=3);a.Dm="gsnos,n="+(N+3);(z=b.brandingImageUrl)&& +(A=b.brandingImageStyle+" url("+z+")");if(c=b.styleOptions){var d=c.xOffset||0,e=c.yOffset||0,f=c.widthOffset||0,g=c.fixedWidth;T=!!c.allowWordWrapping;var h=a.Re;h[0]+=e;h[1]+=d;h[2]+=f;a.Do=g;a.tr=c.xAlign;c.positionFixed&&(a.Zg="fixed")}M=!!b.enableSpeech}function l(){q.kj(L)}var m={ms:"oq",zs:"gs_l"},q,t,v,y,u,F,w,C,D=!1,E,z,A,N,Q,J,V,M,T=!1,L,P,aa,X=!1,fa=!1,ba={ea:a,install:function(a,b,c,d){f(a,b,c,d);if(d.isLoggingWithHiddenFormFields){C={};for(var e in m)a=m[e],C[a]=q.Os(u,a)}else X=!0,u&& +(u.addEventListener?u.addEventListener("submit",l,!1):u.attachEvent&&u.attachEvent("onsubmit",l))},uw:function(a,b,c,d){J=c;f(a,b,J.Ii()||"",d);d.enableAsynchronousLogging&&(X=!0)},vw:function(a,b,c,d){f(null,b,c,d);X=!0;F=a},pd:b,hb:function(){return q.hb()},a:function(){return y},b:function(a,c){a!=w.value&&(J&&window.console&&window.console.log&&window.console.log("Programmatically setting input.value? Please consider using prefillQuery() or execute() from google.search.SearchControl instead."), +a=w.value,b(a));if(Wb(a)){L=c;X&&(J||F)&&l();var d=q.vl(L);if(C){var e=m.ms;C[e]&&(C[e].value=d[e]);e=m.zs;C[e]&&(C[e].value=d[e])}J?(a!=q.hb()&&q.pd(a),X?J.submit():J.Sy(d)):F?F(d):u&&(u.fireEvent&&document.createEventObject?(d=document.createEventObject(),u.fireEvent("onsubmit",d)&&u.submit()):u.dispatchEvent&&document.createEvent?(d=document.createEvent("HTMLEvents"),d.initEvent("submit",!0,!0),u.dispatchEvent(d)&&u.submit()):u.onsubmit&&0==u.onsubmit()||u.submit());L=null}},c:function(a){window.location= +a},d:function(a){window.location=c(a)},e:c,j:function(){E&&E.zr()},o:d,p:d,r:function(a){J?V?(a.addRule(".gssb_a","padding:0 9px"),a.addRule(".gsib_a","padding-right:8px;padding-left:8px"),a.addRule(".gsst_a","padding-top:3px")):a.addRule(".gssb_a","padding:0 7px"):a.addRule(".gssb_a","padding:0 2px");a.addRule(".gssb_e","border:0");a.addRule(".gssb_l","margin:5px 0");a.addRule(".gssb_c .gsc-completion-container","position:static");a.addRule(".gssb_c","z-index:5000");a.addRule(".gsc-completion-container table", +"background:transparent;font-size:inherit;font-family:inherit");a.addRule(".gssb_c > tbody > tr,.gssb_c > tbody > tr > td,.gssb_d,.gssb_d > tbody > tr,.gssb_d > tbody > tr > td,.gssb_e,.gssb_e > tbody > tr,.gssb_e > tbody > tr > td","padding:0;margin:0;border:0");a.addRule(".gssb_a table,.gssb_a table tr,.gssb_a table tr td","padding:0;margin:0;border:0");D&&a.addRule(".cse-sayt div","white-space:normal");T&&a.addRule(".gssb_a,.gssb_a td","white-space:normal")},w:function(){E&&E.zr()},x:function(){J&& +J.$c()},y:function(){E&&fa&&E.Lv()},ab:function(){E&&fa&&q.Kw()&&E.Ny()}};y=bd();t=md();return ba};google.search.V={};google.search.V.Yr="ar"==_UDS_CONST_LOCALE||"iw"==_UDS_CONST_LOCALE||"fa"==_UDS_CONST_LOCALE;google.search.V.Vm=google.search.V.Yr?-1:1;google.search.V.ed=new Fb(google.search.V.Vm);google.search.V.ci=google.search.V.ed.cq(google.search.V.Vm);google.search.V.Bn=google.search.V.ed.Ly();google.search.V.Dz=google.search.V.ed.iu();google.search.V.we=function(a,b){return google.search.V.ed.kr(a,!1,b)};google.search.V.Af=function(a,b){return google.search.V.ed.kr(a,!0,b)}; +google.search.V.Mu=function(a){return a?google.search.V.ed.Bo(a,!1):google.search.V.ci};google.search.V.fh=function(a){return a?google.search.V.ed.Bo(a,!0):google.search.V.ci};google.search.V.hv=function(a){return a?google.search.V.ed.iq(a,!1):""};google.search.V.gv=function(a){return a?google.search.V.ed.iq(a,!0):""};google.search.NoOldNames||(google_exportSymbol("UDS_ServiceBase",google.loader.ServiceBase),google_exportSymbol("UDS_ApiKey",google.loader.ApiKey),google_exportSymbol("UDS_KeyVerified",google.loader.KeyVerified),google_exportSymbol("UDS_LoadFailure",google.loader.LoadFailure),google_exportSymbol("UDS_CurrentLocale",_UDS_CONST_LOCALE),google_exportSymbol("UDS_ShortDatePattern",_UDS_CONST_SHORT_DATE_PATTERN),google_exportSymbol("UDS_Version",google.search.Version),google_exportSymbol("UDS_JSHash",google.search.JSHash));var p={blank:" "};p.image=_UDS_MSG_SEARCHER_IMAGE;p.web=_UDS_MSG_SEARCHER_WEB;p.blog=_UDS_MSG_SEARCHER_BLOG;p.video=_UDS_MSG_SEARCHER_VIDEO;p.local=_UDS_MSG_SEARCHER_LOCAL;p.news=_UDS_MSG_SEARCHER_NEWS;p.book=_UDS_MSG_SEARCHER_BOOK;p.patent=_UDS_MSG_SEARCHER_PATENT;p["ads-by-google"]=_UDS_MSG_ADS_BY_GOOGLE;p.save=_UDS_MSG_SEARCHCONTROL_SAVE;p.keep=_UDS_MSG_SEARCHCONTROL_KEEP;p.include=_UDS_MSG_SEARCHCONTROL_INCLUDE;p.copy=_UDS_MSG_SEARCHCONTROL_COPY;p.close=_UDS_MSG_SEARCHCONTROL_CLOSE; +p["sponsored-links"]=_UDS_MSG_SEARCHCONTROL_SPONSORED_LINKS;p["see-more"]=_UDS_MSG_SEARCHCONTROL_SEE_MORE;p.watermark=_UDS_MSG_SEARCHCONTROL_WATERMARK;p["search-location"]=_UDS_MSG_SEARCHER_CONFIG_SET_LOCATION;p["disable-address-lookup"]=_UDS_MSG_SEARCHER_CONFIG_DISABLE_ADDRESS_LOOKUP;p["sort-by-date"]=_UDS_MSG_SORT_BY_DATE;p.pbg=_UDS_MSG_BRANDING_STRING;p["n-minutes-ago"]=_UDS_MSG_MINUTES_AGO;p["n-hours-ago"]=_UDS_MSG_HOURS_AGO;p["one-hour-ago"]=_UDS_MSG_ONE_HOUR_AGO;p["all-n-related"]=_UDS_MSG_NEWS_ALL_N_RELATED; +p["related-articles"]=_UDS_MSG_NEWS_RELATED;p["page-count"]=_UDS_MSG_TOTAL_PAGE_COUNT;var Vd=[];Vd[0]=_UDS_MSG_MONTH_ABBR_JAN;Vd[1]=_UDS_MSG_MONTH_ABBR_FEB;Vd[2]=_UDS_MSG_MONTH_ABBR_MAR;Vd[3]=_UDS_MSG_MONTH_ABBR_APR;Vd[4]=_UDS_MSG_MONTH_ABBR_MAY;Vd[5]=_UDS_MSG_MONTH_ABBR_JUN;Vd[6]=_UDS_MSG_MONTH_ABBR_JUL;Vd[7]=_UDS_MSG_MONTH_ABBR_AUG;Vd[8]=_UDS_MSG_MONTH_ABBR_SEP;Vd[9]=_UDS_MSG_MONTH_ABBR_OCT;Vd[10]=_UDS_MSG_MONTH_ABBR_NOV;Vd[11]=_UDS_MSG_MONTH_ABBR_DEC;p["month-abbr"]=Vd;p.directions=_UDS_MSG_DIRECTIONS; +p["clear-results"]=_UDS_MSG_CLEAR_RESULTS;p["show-one-result"]=_UDS_MSG_SHOW_ONE_RESULT;p["show-more-results"]=_UDS_MSG_SHOW_MORE_RESULTS;p["show-all-results"]=_UDS_MSG_SHOW_ALL_RESULTS;p.settings=_UDS_MSG_SETTINGS;p.search=_UDS_MSG_SEARCH;p["search-uc"]=_UDS_MSG_SEARCH_UC;p["powered-by"]=_UDS_MSG_POWERED_BY;p.sa=_UDS_MSG_SEARCHER_GSA;p.by=_UDS_MSG_SEARCHER_BY;p.code=_UDS_MSG_SEARCHER_CODE;p["unknown-license"]=_UDS_MSG_UNKNOWN_LICENSE;p["more-results"]=_UDS_MSG_SEARCHCONTROL_MORERESULTS; +p.previous=_UDS_MSG_SEARCHCONTROL_PREVIOUS;p.next=_UDS_MSG_SEARCHCONTROL_NEXT;p["get-directions"]=_UDS_MSG_GET_DIRECTIONS;p["to-here"]=_UDS_MSG_GET_DIRECTIONS_TO_HERE;p["from-here"]=_UDS_MSG_GET_DIRECTIONS_FROM_HERE;p["clear-results-uc"]=_UDS_MSG_CLEAR_RESULTS_UC;p["search-the-map"]=_UDS_MSG_SEARCH_THE_MAP;p["scroll-results"]=_UDS_MSG_SCROLL_THROUGH_RESULTS;p["edit-tags"]=_UDS_MSG_EDIT_TAGS;p["tag-search"]=_UDS_MSG_TAG_THIS_SEARCH;p["search-string"]=_UDS_MSG_SEARCH_STRING;p["optional-label"]=_UDS_MSG_OPTIONAL_LABEL; +p["delete"]=_UDS_MSG_DELETE;p.deleted=_UDS_MSG_DELETED;p.cancel=_UDS_MSG_CANCEL;p["upload-video"]=_UDS_MSG_UPLOAD_YOUR_VIDEOS;p["im-done"]=_UDS_MSG_IM_DONE_WATCHING;p["close-player"]=_UDS_MSG_CLOSE_VIDEO_PLAYER;p["no-results"]=_UDS_MSG_NO_RESULTS;p["linked-cse-error-results"]=_UDS_MSG_LINKEDCSE_ERROR_RESULTS;p.back=_UDS_MSG_BACK;p.subscribe=_UDS_MSG_SUBSCRIBE;p["us-pat"]=_UDS_MSG_USPAT;p["us-pat-app"]=_UDS_MSG_USPAT_APP;p["us-pat-filed"]=_UDS_MSG_PATENT_FILED;p.dym=_UDS_MSG_DID_YOU_MEAN; +p["showing-results-for"]=_UDS_MSG_SHOWING_RESULTS_FOR;p["search-instead-for"]=_UDS_MSG_SEARCH_INSTEAD_FOR;p["custom-search"]=_UDS_MSG_CUSTOM_SEARCH;p.labeled=_UDS_MSG_LABELED;p.loading=_UDS_MSG_LOADING;p["all-results-short"]=_UDS_MSG_ALL_RESULTS_SHORT;p["all-results-long"]=_UDS_MSG_ALL_RESULTS_LONG;p["refine-results"]=_UDS_MSG_REFINE_RESULTS;p["result-info"]=_UDS_MSG_RESULT_INFO;p["file-format"]=_UDS_MSG_FILE_FORMAT;p["order-results-by"]=_UDS_MSG_ORDER_BY;p["order-by-relevance"]=_UDS_MSG_ORDER_BY_RELEVANCE; +p["order-by-date"]=_UDS_MSG_ORDER_BY_DATE;p["get-link"]=_UDS_MSG_ORDER_BY_GET_LINK;p["add-label"]="Add Label";p["no-refinement"]="Refinements should be present before adding label";p["label-page"]="This particular page";p["label-site"]="Entire site";p["label-prefix"]="Specific page prefix";p["invalid-url-prefix"]="Invalid url prefix";p["error-adding-label"]="Error adding label.";p.saving="Saving...";p.Save="Save";p.Cancel="Cancel";p["structured-data"]="Structured data";function Wd(a,b){var c=function(){};c.prototype=b.prototype;a.prototype=new c;a.prototype.LA=function(b,c,e,g){var h=Array.prototype.splice.apply(arguments,[1,arguments.length]);return b.apply(a,h)}}var _json_cache_defeater_=(new Date).getTime(),_json_request_require_prep=!0;function Xd(a,b){var c;if(c=Yd("msie"))c="msie 6.0"in Zd?Zd["msie 6.0"]:Zd["msie 6.0"]=-1!=navigator.appVersion.toLowerCase().indexOf("msie 6.0");c?window.setTimeout($d(this,ae,[a,b]),0):ae(a,b)} +function be(a){_json_request_require_prep=!1;Xd(a,null);_json_request_require_prep=!0} +function ae(a,b){var c=document.getElementsByTagName("head")[0];c||(c=document.body.parentNode.appendChild(document.createElement("head")));var d=document.createElement("script");d.type="text/javascript";d.charset="utf-8";var f=_json_request_require_prep?a+"&key="+google.loader.ApiKey+"&v="+b:a;if(ce()||Yd("safari")||Yd("konqueror"))f=f+"&nocache="+_json_cache_defeater_++;d.src=f;var e=function(){d.onload=null;d.parentNode.removeChild(d)},f=function(a){a=a?a:window.event;a=a.target?a.target:a.srcElement; +if("loaded"==a.readyState||"complete"==a.readyState)a.onreadystatechange=null,e()};"Gecko"==navigator.product?d.onload=e:d.onreadystatechange=f;c.appendChild(d)}function de(a,b){return function(){return b.apply(a,arguments)}}function $d(a,b,c){return function(){return b.apply(a,c||[])}}function ee(a){for(;a.firstChild;)a.removeChild(a.firstChild)}function fe(a,b){if(a)try{ee(a),a.appendChild(b)}catch(c){}return b}function r(a,b){try{a.appendChild(b)}catch(c){}return b} +function ge(a,b){void 0!=a.textContent?a.textContent=b:a.innerText=b}function he(a){return document.createTextNode(a?a:"")}function x(a,b){var c=document.createElement("div");a&&(c.innerHTML=a);b&&(c.className=b);return c}function ie(a,b){var c=document.createElement("div");a&&r(c,he(a));b&&(c.className=b);return c}function B(a){var b=document.createElement("div");a&&(b.className=a);return b}function je(a,b){var c=document.createElement("span");a&&r(c,he(a));b&&(c.className=b);return c} +function ke(a,b,c){var d=document.createElement("table");d.setAttribute("cellSpacing",a?a:0);d.setAttribute("cellPadding",b?b:0);c&&(d.className=c);return d}function le(a,b,c){(a=a.insertRow(-1))||alert(a);for(var d=0;d<b;d++)me(a,c);return a}function me(a,b){var c=a.insertCell(-1);b&&(c.className=b);return c}function ne(a,b,c,d){var f=document.createElement("img");f.src=a;b&&(f.width=b);c&&(f.height=c);d&&(f.className=d);return f} +function oe(a,b,c,d,f){var e=document.createElement("a");e.href=a;b&&(d?r(e,je(b,d)):r(e,he(b)));c&&(e.target=c);f&&(e.title=f);return e}function pe(a,b,c,d,f,e){var g=x(null,d),h=document.createElement("a");h.href=a;h.innerHTML=b;d&&(h.className=d);c&&(h.target=c);f&&(h.title=f);if(e)for(var l in e)h.setAttribute(l,e[l]);g.appendChild(h);return g}function qe(a,b){var c=document.createElement("label");b&&(c.className=b);a&&(c.textContent=a);return c} +function re(a){var b=document.createElement("form");a&&(b.className=a);return b}function se(a,b){var c=document.createElement("input");c.type="submit";c.value=a;b&&(c.className=b);return c}function te(a,b,c){var d=document.createElement("input");d.type="button";d.value=a;b&&(d.className=b);c&&(d.onclick=c);return d} +function ue(a,b,c){var d=document.createElement("input");d.setAttribute("autoComplete","off");d.type="text";-1==a?K(d,"util-css-expand"):d.size=0<a?a:10;b&&K(d,b);c&&(d.value=c);return d}function ve(a,b,c,d){var f=document.createElement("input");f.type="checkbox";f.name=a;f.value=b;d&&(f.className=d);c&&(f.checked=c);return f}function we(a,b,c,d){var f=document.createElement("input");f.type="radio";a&&(f.name=a);b&&(f.value=b);d&&(f.className=d);c&&(f.checked=c);return f} +function xe(a,b){b?(a.tabIndex=0,a.onclick=b,a.onkeypress=function(c){c=c||window.event;c.keyCode&&13==c.keyCode&&b.call(a,c)}):(a.tabIndex=-1,a.removeAttribute("tabIndex"),a.onclick=null,a.onkeypress=null)}function ye(){var a=window.location.hostname;return"/cse/labelurl"==window.location.pathname&&-1!==a.indexOf("google.com",a.length-10)?!0:!1}function ze(a,b){if(null==a||null==a.className)return!1;for(var c=a.className.split(" "),d=0;d<c.length;d++)if(c[d]==b)return!0;return!1} +function K(a,b){ze(a,b)||(a.className+=" "+b)}function Y(a,b){if(null!=a.className){for(var c=a.className.split(" "),d=[],f=!1,e=0;e<c.length;e++)c[e]!=b?c[e]&&d.push(c[e]):f=!0;f&&(a.className=d.join(" "))}} +var Ae="",Be={yt:{ZA:1,gB:1,NB:1,id:1,OB:1,"in":1,UB:1,WB:1,XB:1,YB:1,aC:1,kC:1,ZC:1,fD:1,gD:1,mD:1,nD:1,pD:1},fB:{NA:1,QA:1,SA:1,UA:1,VA:1,WA:1,yt:1,hB:1,"do":1,kB:1,nB:1,AB:1,BB:1,CB:1,MB:1,VB:1,bC:1,cC:1,dC:1,eC:1,fC:1,gC:1,hC:1,jC:1,qC:1,tC:1,uC:1,vC:1,wC:1,xC:1,IC:1,NC:1,VC:1,bD:1,dD:1,eD:1,kD:1,lD:1,oD:1},lC:{OA:1}};function Yd(a){return a in Ce?Ce[a]:Ce[a]=-1!=navigator.userAgent.toLowerCase().indexOf(a)}var Ce={},Zd={};function ce(){return Yd("msie")}var De,Ee; +window.ActiveXObject&&(De=!0,window.XMLHttpRequest&&(Ee=!0));function Fe(a){this.mk=a+"branding";this.Gj=a+"branding-vertical";this.Op=a+"branding-img-noclear";this.tt=a+"branding-clickable";this.text=a+"branding-text";this.ux=a+"branding-text-name"} +function Ge(a,b,c,d,f){var e=new Fe(a);a=B(e.mk);var g=ke(null,null,e.mk);r(a,g);var h=!c;h||(K(a,e.Gj),K(g,e.Gj));var l=le(g,0),m;h?m=l:(m=l,l=le(g,0));var q="/css/small-logo.png",t=51,v=15;d&&"string"==typeof d&&d.match(/^http:\/\/www\.youtube\.com/)&&(q="/css/youtube-logo-55x24.png",t=55,v=24,K(a,e.mk+"-youtube"),h||(K(a,e.Gj+"-youtube"),K(g,e.Gj+"-youtube")));m=me(m,e.text);var h=me(l,e.Op),y=x(p["powered-by"],e.text),q=google.loader.ServiceBase+q,u=e.Op;De&&!Ee?(u=B(u),u.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+ +q+'")',u.style.width=t+"px",u.style.height=v+"px"):u=ne(q,null,null,u);v=u;r(m,y);d?(m="http://www.google.com","string"==typeof d&&(d.match(/^http:\/\/[a-z]*\.google\.com/)||d.match(/^http:\/\/www\.youtube\.com/))&&(m=d),d=oe(m,null,"_BLANK"),d.className=e.tt,r(d,v),r(h,d)):r(h,v);f&&(d=l,c&&(d=le(g,0)),c=e.text+" "+e.ux,e=me(d,c),r(e,ie(f,c)));b&&(b="string"==typeof b?document.getElementById(b):b,ee(b),r(b,a));return a} +var Z=function(a,b,c){b=b&&"*"!=b?b.toUpperCase():"";if(c&&a.getElementsByClassName){a=a.getElementsByClassName(c);if(b){for(var d={},f=0,e=0,g;g=a[e];e++)b==g.nodeName&&(d[f++]=g);d.length=f;return d}return a}a=a.getElementsByTagName(b||"*");if(c){d={};for(e=f=0;g=a[e];e++)ze(g,c)&&(d[f++]=g);d.length=f;return d}return a};function He(a){return a.replace(/\s+$/,"").replace(/^\s+/,"")} +function Ie(a){var b=[];if(a)for(var c in a)null!=a[c]&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")}function Je(a,b){for(var c=a.split("?"),d=c[1].split("&"),f=b+"=",e=d.length;0<e--;)-1!=d[e].lastIndexOf(f,0)&&d.splice(e,1);return 0<d.length?c[0]+"?"+d.join("&"):c[0]}function Ke(a){for(var b=window.location.search.substring(1).split("&"),c=0;c<b.length;c++){var d=b[c].split("=");if(d[0]==a)return decodeURIComponent(d[1])}} +function Le(a,b){b||(b=document.getElementsByTagName("body")[0]);for(var c=0;a!=b;)c+=a.offsetLeft,a=a.offsetParent;return c}function Me(a,b){b||(b=document.body);for(var c=0;a!=b;)c+=a.offsetTop,a=a.offsetParent;return c}function Ne(a){try{return a instanceof HTMLFormElement}catch(b){return!!a&&"object"===typeof a&&1===a.nodeType&&"object"===typeof a.style&&"object"===typeof a.ownerDocument&&"form"===a.tagName.toLowerCase()}} +function Oe(a){"string"==typeof a&&(a=document.getElementById(a));return a}function Pe(a){if(a){var b=document.createElement("div"),c=document.createElement("a");c.href=a;b.appendChild(c);b.innerHTML=b.innerHTML;return b.firstChild.href}return null}function Qe(a){var b=document.createElement("a");b.href=a;return b.host}function Re(a){return!!a&&/https?:\/\/([^/.:]+\.)*google(\.[^/.:]+)*(\:[0-9]+)?\/cse/.test(a)}function Se(a,b){for(;b&&b!=a;)b=b.parentNode;return b==a} +function Te(a){window.console&&window.console.warn(a)};google.search.Ka={};google.search.Ka.Nw=function(a,b,c){var d=new XMLHttpRequest;d.onreadystatechange=function(){d.readyState==XMLHttpRequest.DONE&&c(d.responseText)};d.open("POST",a,!0);d.setRequestHeader("Content-type","application/json");d.setRequestHeader("Accept","application/json");d.send(b)}; +google.search.Ka.Lw=function(a,b){var c=new XMLHttpRequest;c.onreadystatechange=function(){c.readyState==XMLHttpRequest.DONE&&b(c.responseText)};c.open("GET",a,!0);c.setRequestHeader("Content-type","application/json");c.setRequestHeader("Accept","application/json");c.send()};google.search.Ka.Mw=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.setRequestHeader("Content-type","application/json");b.setRequestHeader("Accept","application/json");b.send();return b.responseText}; +google.search.Ka.bp=function(){var a=Ke("cx").split(":");return window.location.protocol+"//"+window.location.host+"/cse/api/"+a[0]+"/annotations/"+a[1]+"?xsrf="+google.search.Ka.Bp()};google.search.Ka.Bp=function(){return document.getElementById("xsrf").innerHTML};google.search.Ka.Hu=function(){var a=Ke("cx").split(":");return window.location.protocol+"//"+window.location.host+"/cse/api/"+a[0]+"/cse/"+a[1]+"?xsrf="+google.search.Ka.Bp()}; +google.search.Ka.Iu=function(){var a=JSON.parse(google.search.Ka.Mw(google.search.Ka.Hu()));if(!a.Context||!a.Context.Facet)return null;for(var b=[],c=0;c<a.Context.Facet.length;c++)for(var d=a.Context.Facet[c].FacetItem,f=0;d&&f<d.length;f++)b.push(d[f]);return b};google.search.Ka.Su=function(a,b){var c=JSON.parse(b);if(c.Annotation)for(var d=0;d<c.Annotation.length;d++)if(c.Annotation[d].AdditionalData[0].value==a)return c.Annotation[d].href}; +google.search.Ka.pv=function(a,b,c){a={Add:{Annotations:{Annotation:[{about:a,label:[{name:"_cse_"+Ke("cx").split(":")[1]}]}]}}};for(var d=a.Add.Annotations.Annotation[0].label,f=0;f<b.length;f++)d.push({name:b[f]});c&&(a.Remove={Annotations:{Annotation:[{href:c}]}});return JSON.stringify(a)}; +google.search.Ka.mu=function(a){var b=JSON.parse(a);a=[];if(!(b.Add&&b.Add.Annotations&&b.Add.Annotations.Annotation&&b.Add.Annotations.Annotation[0].Label))return a;for(var b=b.Add.Annotations.Annotation[0].Label,c=1;c<b.length;c++)a.push(b[c].name);return a};google.search.History=function(a,b){this.Km=google.search.History.no();this.Lm=google.search.History.oo();this.Wk=this.Km||this.Lm;var c=window.location.href;this.it=0<=c.indexOf("#")?c.substring(0,c.indexOf("#")):c;this.Cl=!1;this.Yw=b;c=google.search.History.Bk(google.search.History.ul());this.Vl=c.fq;this.pe=c.state;if(this.Wk){c=de(this,google.search.History.prototype.dx);this.Km&&window.addEventListener?(window.addEventListener("popstate",c,!1),window.addEventListener("hashchange",c,!1)):this.Lm&& +(window.addEventListener?window.addEventListener("hashchange",c,!1):window.attachEvent&&window.attachEvent("onhashchange",c));var c=!1,d;for(d in this.pe){c=!0;break}c?this.Uo():this.Yq(a,!0)}};google.search.History.pg="gsc.";google.search.History.qg=google.search.History.pg+"q";google.search.History.bi=google.search.History.pg+"tab";google.search.History.Th=google.search.History.pg+"ref";google.search.History.Wc=google.search.History.pg+"page";google.search.History.Rh=google.search.History.pg+"sort"; +var Ue={};Ue[google.search.History.qg]=!0;Ue[google.search.History.bi]=!0;Ue[google.search.History.Wc]=!0;Ue[google.search.History.Th]=!0;Ue[google.search.History.Rh]=!0;google.search.History.Er=Ue;var Ve={};Ve[google.search.History.bi]=!0;Ve[google.search.History.Wc]=!0;google.search.History.ls=Ve;google.search.History.no=function(){return!(!window.history||!window.history.pushState)};google.search.History.oo=function(){return"onhashchange"in window&&(!ce()||8<=document.documentMode)}; +google.search.History.isSupported=function(){return google.search.History.no()||google.search.History.oo()};google.search.History.cw=function(){var a=google.search.History.Bk(google.search.History.ul()).state,b;for(b in a)return!0;return!1};k=google.search.History.prototype;k.isEnabled=function(){return this.Wk};k.pushState=function(a){this.Wk&&!this.Cl&&this.Yq(a,!1)}; +k.Yq=function(a,b){a=google.search.History.nt(a);if(!google.search.History.Zp(this.pe,a)){this.pe=a;var c=google.search.History.fy(a);this.Vl&&(c=this.Vl+"&"+c);if(this.Km){var d=document.title||"",c="#"+c;b?window.history.replaceState(null,d,c):window.history.pushState(null,d,c)}else this.Lm&&(c=this.it+"#"+c,b?window.location.replace(c):window.location.href=c)}};k.mh=function(){var a={},b;for(b in this.pe)a[b]=this.pe[b];return a}; +k.dx=function(){var a=google.search.History.Bk(google.search.History.ul());this.Vl=a.fq;google.search.History.Zp(this.pe,a.state)||(this.pe=a.state,this.Uo())};k.Uo=function(){this.Cl=!0;this.Yw(this.mh());this.Cl=!1};google.search.History.ul=function(){var a=window.location.href,b=a.indexOf("#");return 0>b?"":a.substring(b+1)};google.search.History.Tl=function(a){return!!google.search.History.Er[a]}; +google.search.History.Zp=function(a,b){for(var c in a)if(a[c]!==b[c])return!1;for(c in b)if(!a.hasOwnProperty(c))return!1;return!0};google.search.History.nt=function(a){var b={},c;for(c in a)google.search.History.Tl(c)&&(b[c]=a[c]);return b};google.search.History.fy=function(a){var b=[],c;for(c in a)null!=a[c]&&google.search.History.Tl(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")}; +google.search.History.Bk=function(a){var b={};a=a.split("&");for(var c=[],d=0;d<a.length;d++){var f=a[d],e=f.indexOf("="),g=!1;if(-1!=e){var h=decodeURIComponent(f.substr(0,e));google.search.History.Tl(h)&&(e=decodeURIComponent(f.substr(e+1)),google.search.History.ls[h]?(e=parseInt(e,10),isNaN(e)||(b[h]=e)):b[h]=e,g=!0)}g||c.push(f)}return{state:b,fq:c.join("&")}};google.search.eg=function(a,b){this.size=b||google.search.eg.Mr;this.reset()};google.search.eg.Mr=20;google.search.eg.prototype.reset=function(){this.zi=null;for(var a=0;a<this.size;a++)this.tw(new google.search.Um);this.zo={};this.Mo=null};google.search.eg.prototype.tw=function(a){a.next=this.zi;a.qq=null;null==this.zi||(this.zi.qq=a);this.zi=a};google.search.eg.prototype.put=function(a,b){var c;a in this.zo&&(c=this.zo[a],c.set(a,b),this.Mo==c&&(this.Mo=null))}; +google.search.Um=function(){this.qq=this.next=null};google.search.Um.prototype.set=function(){};google.search.A=function(){this.Wx=google.search.A.$l;google.search.A.$l+=1;this.Jc=null;this.Ci=!0;this.za={width:100,height:75};this.kd=google.search.A.kg;this.fm=1;this.Ha(google.search.A.Xb);this.qk();this.gwsUrl=this.Aa=this.Ma=this.ta=this.Lh=this.ec=this.Wl=this.zj=this.xk=this.fe=null;this.rd=[];this.Ih={};this.Md=this.jf="";var a;if("object"===typeof window&&window.location&&window.location.hostname&&""!=window.location.hostname){if(""==Ae){var b=window.location.hostname.toLowerCase().split("."); +2>b.length&&(Ae=".com");a=b.pop();b=b.pop();Ae=2==a.length?Be[b]&&1==Be[b][a]?"."+b+"."+a:"."+a:".com"}a=Ae}else a=".com";this.Cp=a;this.re=this.Dd=null;this.O=!1};da("google.search.Search",google.search.A,void 0);google.search.A.$l=0;google.search.A.Qm=google.loader.ServiceBase;google.search.A.BASE=google.search.A.Qm;google.search.A.Is=/style=([^&]*)/;google.search.A.hc="large";google.search.A.LARGE_RESULTSET=google.search.A.hc;google.search.A.Xb="small";google.search.A.SMALL_RESULTSET=google.search.A.Xb; +google.search.A.Ec="filtered_cse";google.search.A.FILTERED_CSE_RESULTSET=google.search.A.Ec;google.search.A.ln=8;google.search.A.LARGE_RESULTS=google.search.A.ln;google.search.A.ak=4;google.search.A.SMALL_RESULTS=google.search.A.ak;google.search.A.Zm=10;google.search.A.FILTERED_CSE_RESULTS=google.search.A.Zm;google.search.A.cs="_top";google.search.A.LINK_TARGET_TOP=google.search.A.cs;google.search.A.nn="_self";google.search.A.LINK_TARGET_SELF=google.search.A.nn;google.search.A.bs="_parent"; +google.search.A.LINK_TARGET_PARENT=google.search.A.bs;google.search.A.kg="_blank";google.search.A.LINK_TARGET_BLANK=google.search.A.kg;google.search.A.og="order-by-relevance";google.search.A.ORDER_BY_RELEVANCE=google.search.A.og;google.search.A.Vc="order-by-date";google.search.A.ORDER_BY_DATE=google.search.A.Vc;google.search.A.un="order-by-ascending-date";google.search.A.ORDER_BY_ASCENDING_DATE=google.search.A.un;google.search.A.Xh="restrict-type";google.search.A.RESTRICT_TYPE=google.search.A.Xh; +google.search.A.Ya="restrict-safesearch";google.search.A.RESTRICT_SAFESEARCH=google.search.A.Ya;google.search.A.Cg="active";google.search.A.SAFESEARCH_STRICT=google.search.A.Cg;google.search.A.Bg="off";google.search.A.SAFESEARCH_OFF=google.search.A.Bg;google.search.A.Zj="moderate";google.search.A.SAFESEARCH_MODERATE=google.search.A.Zj;google.search.A.La="restrict-extended";google.search.A.RESTRICT_EXTENDED_ARGS=google.search.A.La;google.search.A.Zr=5E3; +google.search.A.Fr=google.loader.ApiaryBase?google.loader.ApiaryBase:"https://www.googleapis.com/customsearch/v1element";google.search.A.Gr="AIzaSyCVAXiUzRYsML1Pv6RwSG1gunmMikTzQqY";google.search.A.Gp=!1;google.search.A.Qy=p;google.search.A.strings=google.search.A.Qy;google.search.A.prototype.Qg=function(){};google.search.A.tl=function(){if(google.search.LoadArgs){var a=decodeURIComponent(google.search.LoadArgs).match(google.search.A.Is);if(a&&a[1])return a[1]}return null}; +google.search.A.Ju=function(a){a=!!a||/\/v2\/default\.css$/.test(google.search.A.tl()||"");return{gf:a,Wi:a,Mg:a,lo:a,zq:a}};google.search.A.prototype.oi=function(a){a.Ma=this.Ma;a.vf=this.vf;a.kd=this.kd;a.Na=this.Na;a.ec=this.ec;a.Ci=this.Ci;this.za&&(a.za={},a.za.width=this.za.width,a.za.height=this.za.height);a.ki=this.ki;a.gb=this.gb}; +google.search.A.prototype.tx=function(){var a=this.rc+"?hl="+google.search.CurrentLocale+"&source=uds",a=this.Aa?a+this.Aa:a+"&q=";return this.dd&&""!=this.dd?this.dd:a};google.search.A.prototype.Gb=function(a){this.Ma=null==a||""==a?null:a};google.search.A.prototype.setQueryAddition=google.search.A.prototype.Gb; +google.search.A.prototype.Nc=function(a,b){var c=google.search.A.Qm+this.Rc+"?callback="+a+"&rsz="+this.Na+"&hl="+google.search.CurrentLocale;this.gb&&this.O&&(c=google.search.A.Fr+"?key="+google.search.A.Gr+"&rsz="+this.Na+"&num="+this.gd()+"&hl="+google.search.CurrentLocale+"&prettyPrint=false");this.vf&&(c+="&source="+encodeURIComponent(this.vf));this.Cp&&(c+="&gss="+this.Cp);google.search.JSHash&&(c+="&sig="+google.search.JSHash);b&&(c+="&start="+b);return c}; +google.search.A.prototype.wy=function(a){this.vf=a};google.search.A.prototype.setSearcherSrc=google.search.A.prototype.wy;google.search.A.prototype.Sa=function(a){this.kd=a};google.search.A.prototype.setLinkTarget=google.search.A.prototype.Sa;google.search.A.prototype.ya=function(){return this.kd&&""!=this.kd?this.kd:null};google.search.A.prototype.je=function(){null==this.fe&&(this.fe="gsc-"+this.ta+"Result");return this.fe}; +google.search.A.prototype.Fd=function(){null==this.xk&&(this.xk="gs-"+this.ta+"Result");return this.xk};google.search.A.prototype.zl=function(){null==this.zj&&(this.zj=p[this.ta]);return this.ec?this.ec:this.zj};google.search.A.prototype.getTabLabel=google.search.A.prototype.zl;google.search.A.prototype.dv=function(){null==this.Wl&&(this.Wl=p[this.ta]);return this.ec?this.ec:this.Wl};google.search.A.prototype.tv=function(){return this.Na};google.search.A.prototype.getResultSetSize=google.search.A.prototype.tv; +google.search.A.prototype.Ha=function(a){isNaN(parseInt(a,10))||(a=parseInt(a,10));if(0<a&&8>=a)this.Na=a;else switch(a){case google.search.A.hc:this.Na=google.search.A.hc;break;default:case google.search.A.Xb:this.Na=google.search.A.Xb}};google.search.A.prototype.setResultSetSize=google.search.A.prototype.Ha; +google.search.A.prototype.oa=function(a,b,c){var d=void 0;if(c&&0<c)if(this.cursor&&this.cursor.pages&&this.cursor.pages[c-1]&&this.cursor.pages[c-1].start)d=this.cursor.pages[c-1].start;else{var f=this.gd();f&&(d=f*(c-1))}c=this.Zb(a,void 0,d);(b=Ie(b))&&(c+="&"+b);window._googleudsextrastuff&&(c+=window._googleudsextrastuff);b=this.Ih.hasOwnProperty(c);if(c==this.Md&&!b)return this.No(),!1;d=(new Date).getTime();if(b&&d-this.Ih[c]<google.search.A.Zr)return!1;b&&(d=-1);this.Ih[c]=d;this.cursor=null; +this.jf=a;this.Md=c;this.me=this.lp?this.lp():null;this.gb&&this.O?be(google.search.A.ep(this,c)):Xd(this.qp(a,c),google.search.Version);if(this.rd&&0<this.rd.length)for(b=0;b<this.rd.length;b++)this.rd[b].oa(a);return!0};google.search.A.prototype.execute=google.search.A.prototype.oa; +google.search.A.ep=function(a,b){var c="apiary"+Math.floor(2E4*Math.random());google.search.A[c]=function(d){var f=200,e=null;d.error&&(f=d.error.code,e=d.error.message);a.pb(d,f,e,f,b);delete google.search.A[c]};return b+"&callback=google.search.Search."+c};google.search.A.prototype.qp=function(a,b){var c;c=b+(this.me?"&"+this.me:"");var d=this.lc(a,b);return c+="&context="+d}; +google.search.A.prototype.Dp=function(a){this.cursor&&a<this.cursor.pages.length&&(a=this.Zb(this.jf,void 0,this.cursor.pages[a].start),this.cursor=null,this.Md=a,this.gb&&this.O?be(google.search.A.ep(this,a)):Xd(this.qp(this.jf,a),google.search.Version))};google.search.A.prototype.gotoPage=google.search.A.prototype.Dp;google.search.A.prototype.Fi=function(){return this.cursor&&null!=this.cursor.currentPageIndex?this.cursor.currentPageIndex+1:null}; +google.search.A.prototype.gd=function(){return isNaN(parseInt(this.Na,10))?this.Na==google.search.A.Xb?google.search.A.ak:this.Na==google.search.A.hc?google.search.A.ln:this.Na==google.search.A.Ec?google.search.A.Zm:google.search.A.ak:this.Na};google.search.A.prototype.getNumResultsPerPage=google.search.A.prototype.gd;google.search.A.prototype.Qs=function(a){this.rd&&this.rd.push(a)};google.search.A.prototype.addRelatedSearcher=google.search.A.prototype.Qs; +google.search.A.prototype.Ou=function(a,b,c){b=this.Zb(a,b);if(null==c||void 0==c)c=this.lc(a,b);return b+("&context="+c)+"&key="+google.loader.ApiKey+"&v="+google.search.Version};google.search.A.prototype.getExecuteUrl=google.search.A.prototype.Ou;google.search.A.prototype.Gc=function(a){var b=pe("http://code.google.com/apis/ajaxsearch/faq.html",p.watermark+" - "+this.At(),"_blank","gs-watermark");r(a,b)};google.search.A.prototype.At=function(){var a=new Date;return a.getMonth()+1+"/"+a.getFullYear()}; +google.search.A.prototype.Ue=function(a){var b;b=a.getFullYear();var c=a.getMonth(),d=p["month-abbr"][c];a=a.getDate();10>a&&(a="0"+a);switch(google.search.ShortDatePattern){case "MDY":b=d+" "+a+", "+b;break;case "YMD":"zh-CN"==google.search.CurrentLocale||"zh-TW"==google.search.CurrentLocale||"ja"==google.search.CurrentLocale||"ko"==google.search.CurrentLocale?(d=We[google.search.CurrentLocale],b=b+d.year+(c+1)+d.month+a+d.day):b=b+" "+d+" "+a;break;default:case "DMY":b=a+" "+d+" "+b}return b}; +google.search.A.prototype.formatToShortDate=google.search.A.prototype.Ue;var We={"zh-CN":{month:" \u6708 ",year:" \u5e74 ",day:" \u65e5 "},"zh-TW":{month:" \u6708 ",year:" \u5e74 ",day:" \u65e5 "},ja:{month:"\u6708",year:"\u5e74",day:"\u65e5"},ko:{month:" \uc6d4 ",year:" \ub144 ",day:" \uc77c "}};google.search.A.qn=36E5;google.search.A.js=6E4;google.search.A.hs=864E5; +google.search.A.prototype.jl=function(a){var b=(new Date).getTime(),c=a.getTime();if(b<c)return p["n-minutes-ago"](2);b-=c;return b<google.search.A.qn?(a=Math.floor(b/google.search.A.js),p["n-minutes-ago"](1>=a?2:a)):b<google.search.A.hs?(a=Math.floor(b/google.search.A.qn),1>=a?p["one-hour-ago"]:p["n-hours-ago"](a)):this.Ue(a)};google.search.A.prototype.formatToRelativeDate=google.search.A.prototype.jl;google.search.A.prototype.qk=function(){this.gwsUrl=null;this.results=[]}; +google.search.A.prototype.clearResults=google.search.A.prototype.qk;google.search.A.prototype.No=function(){this.qo&&this.qo()};google.search.A.prototype.xx=function(a,b){if(a&&0<=a){var c=(new Date).getTime(),d=c-a,f=b-a,e=[];1==c%100&&(this.O?(e.push("asa_"+this.ta+"_cse"),this.gb&&(google.search.A.Gp?e.push("asa_"+this.ta+"_cse_apiary_sub"):e.push("asa_"+this.ta+"_cse_apiary_first"))):e.push("asa_"+this.ta));0<e.length&&google.loader.recordCsiStat(e,["req."+d,"req2."+f])}}; +google.search.A.prototype.pb=function(a,b,c,d,f){c=(new Date).getTime();var e;f&&(e=this.Ih[f],delete this.Ih[f]);if(!f||!this.Md||f==this.Md){this.gwsUrl=null;if(this.results&&0<this.results.length)for(f=0;f<this.results.length;f++)this.results[f].html&&Xe(this.results[f].html);a&&a.results&&0<a.results.length?(this.results=a.results,a.cursor&&a.cursor.moreResultsUrl?this.gwsUrl=this.dd&&""!=this.dd?this.dd:a.cursor.moreResultsUrl:this.Aa&&this.rc&&(this.gwsUrl=this.tx())):this.results=[];this.completionStatus= +b;this.hashStatus=d;this.Gq=a&&a.resultAttribution&&null!=a.resultAttribution&&""!=a.resultAttribution?a.resultAttribution:null;a&&a.cursor&&a.cursor.pages&&0<a.cursor.pages.length?this.cursor=a.cursor:"undefined"!=typeof this.cursor&&delete this.cursor;if(a&&a.context){this.context=a.context;b=[];if(a.context.facets&&0<parseInt(a.context.total_results,10)){for(f=0;f<a.context.facets.length;f++)if(a.context.facets[f].facet_search_label){d=a.context.facets[f];var g=parseInt(d.count,10);0<g&&(d.count= +g,d.width=Math.ceil(100*g/parseInt(a.context.total_results,10)),b.push(d))}0<b.length&&b.sort(function(a,b){return b.count-a.count})}this.context.display_facets=b}else"undefined"!=typeof this.context&&delete this.context;a&&a.promotions?this.promotions=a.promotions:"undefined"!=typeof this.promotions&&delete this.promotions;a&&a.omittedResults?this.omittedResults=a.omittedResults:"undefined"!=typeof this.omittedResults&&delete this.omittedResults;a&&a.spelling?this.spelling=a.spelling:"undefined"!= +typeof this.spelling&&delete this.spelling;this.Ci&&this.Ws();this.No();this.xx(e,c);this.gb&&(google.search.A.Gp=!0)}};google.search.A.prototype.onSearchComplete=google.search.A.prototype.pb;google.search.A.prototype.fp=function(){var a=null;this.Gq&&(a=x(this.Gq,"gs-results-attribution"));return a};google.search.A.prototype.getAttribution=google.search.A.prototype.fp;google.search.A.prototype.Vq=function(a){this.ki=a}; +google.search.A.prototype.Ws=function(){var a,b;for(a=0;a<this.results.length;a++)b=this.results[a],this.Qa(b);(a=this.context)&&this.Qg(a)};google.search.A.prototype.Gh=function(a,b,c){c||(c=[null]);this.qo=$d(a,b,c)};google.search.A.prototype.setSearchCompleteCallback=google.search.A.prototype.Gh;google.search.A.prototype.ly=function(a,b){this.lp=$d(a,b)}; +google.search.A.Lc=function(a,b,c){return 3==a[b].length?new google.search.Gn(a[b][1]||c&&c.prefetchQuery,a[b][2],a[b][0],c):new google.search.Gn("","",a[b],c)};google.search.A.Ob=function(a,b){var c;if(a.length)for(var d=0;d<a.length;d++)if(null==a[d]){a[d]=b;c=d;break}c||(c=a.length,a.push(b));return c};google.search.A.AllocateCompletionMapContext=google.search.A.Ob;google.search.A.prototype.Ac=function(a){this.ec=a};google.search.A.prototype.setUserDefinedLabel=google.search.A.prototype.Ac; +google.search.A.prototype.zy=function(a){this.Lh=a};google.search.A.prototype.setUserDefinedClassSuffix=google.search.A.prototype.zy;google.search.A.prototype.ry=function(){this.Ci=!1};google.search.A.prototype.setNoHtmlGeneration=google.search.A.prototype.ry;google.search.A.dc=function(a,b,c,d,f){var e=Math.min(Math.min(c.width/a,c.height/b),1),g={};g.width=Math.round(a*e);g.height=Math.round(b*e);d&&(d.width=g.width,d.height=g.height,f&&(d.style.left=(c.width-g.width)/2+"px"));return g}; +google.search.A.scaleImage=google.search.A.dc;google.search.A.Un=1;google.search.A.VERTICAL_BRANDING=google.search.A.Un;google.search.A.Vr=2;google.search.A.HORIZONTAL_BRANDING=google.search.A.Vr;google.search.A.zu=function(a,b,c){return Ge("gsc-",a,b&&b==google.search.A.Un,c)};google.search.A.getBranding=google.search.A.zu;google.search.A.setOnLoadCallback=function(a,b){google.setOnLoadCallback(a,b)};google.search.A.setOnLoadCallback=google.search.A.setOnLoadCallback;var Ye; +function Xe(a){Ye||(Ye=document.createElement("DIV"));Ye.appendChild(a);Ye.innerHTML=""}google.search.A.prototype.tu=function(a){var b=this.Dd;a&&(b=a);a={};var c=B(this.Fd());K(c,"gs-result");K(c,"gs-error-result");b=x(b,"gs-snippet");r(c,b);a.html=c;return a};google.search.A.prototype.uu=function(a){var b=this.re;a&&(b=a);a={};var c=B(this.Fd());K(c,"gs-result");K(c,"gs-no-results-result");b=x(b,"gs-snippet");r(c,b);a.html=c;return a};google.search.A.prototype.Qq=function(a){this.za=a}; +google.search.A.prototype.$u=function(){return this.Md};google.search.A.prototype.getLastQueryUrl=google.search.A.prototype.$u;google.search.Gn=function(a,b,c){this.bj=a;this.Oc=b;this.Qc=c};google_exportSymbol("google.search.CurrentLocale",_UDS_CONST_LOCALE);google_exportSymbol("google.search.ShortDatePattern",_UDS_CONST_SHORT_DATE_PATTERN);google.search.qa=function(){google.search.A.call(this);this.ta="blog";this.Rc="/GblogSearch";this.rc="http://blogsearch.google.com/blogsearch";this.Nb=null;this.Kb=!1;this.Ne=!0;this.Jc=de(this,google.search.qa.prototype.nd);this.Me="gsc-blogConfig";this.na=null};da("google.search.BlogSearch",google.search.qa,void 0);Wd(google.search.qa,google.search.A);google.search.qa.Va="GblogSearch";google.search.qa.RESULT_CLASS=google.search.qa.Va;google.search.qa.$=[]; +google.search.qa.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.qa.$,e,b);google.search.qa.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.qa.RawCompletion=google.search.qa.Pa;google.search.qa.prototype.lc=function(a,b){return google.search.A.Ob(google.search.qa.$,[this,a,b])}; +google.search.qa.prototype.oa=function(a,b,c){window.console&&window.console.log&&window.console.log("The Google Blog Search API has been officially deprecated. For more information on its deprecation, see https://developers.google.com/blog-search/.");return google.search.A.prototype.oa.call(this,a,b,c)};google.search.qa.prototype.execute=google.search.qa.prototype.oa; +google.search.qa.prototype.Zb=function(a,b,c){b=this.Nc(null==b?"google.search.BlogSearch.RawCompletion":b,c);this.Ma&&(a=a+" "+this.Ma);this.Nb&&(a=a+" blogurl:"+this.Nb);a="&q="+encodeURIComponent(a);this.Kb&&(a+="&scoring=d");this.Aa=a;return b+a}; +google.search.qa.prototype.Qa=function(a){a.html&&delete a.html;var b=B(this.Fd());K(b,"gs-result");var c;c=pe(a.postUrl,a.title,this.ya(),"gs-title");r(b,c);c=new Date(a.publishedDate);c=x(this.Ue(c),"gs-publishedDate");r(b,c);c=new Date(a.publishedDate);c=x(this.jl(c),"gs-relativePublishedDate");r(b,c);c=x(a.content,"gs-snippet");r(b,c);c=pe(a.blogUrl,a.blogUrl,this.ya(),"gs-visibleUrl");r(b,c);a.html=b;this.Gc(a.html)};google.search.qa.prototype.createResultHtml=google.search.qa.prototype.Qa; +google.search.qa.prototype.Wb=function(a){this.Nb=null==a||""==a?null:a};google.search.qa.prototype.setSiteRestriction=google.search.qa.prototype.Wb;google.search.qa.prototype.Hb=function(a){this.Kb=a==google.search.A.Vc?!0:!1};google.search.qa.prototype.setResultOrder=google.search.qa.prototype.Hb; +google.search.qa.prototype.nd=function(a,b){if(b){if(null==this.na){var c=B("gsc-configSetting");this.na=ve(null,"0",this.Kb,"gsc-configSettingCheckbox");r(c,this.na);r(c,x(p["sort-by-date"],"gsc-configSettingCheckboxLabel"));var d=B("gsc-configSettingSubmit");r(d,se(p.close,"gsc-configSettingSubmit"));r(c,d);r(a,c)}else this.na.checked=this.Kb;this.na.focus()}else this.na&&(this.na.checked?this.Hb(google.search.A.Vc):this.Hb(google.search.A.og))};google.search.ia=function(){google.search.A.call(this);this.ta="book";this.Rc="/GbookSearch";this.rc="http://books.google.com/books";this.Bi=!1;this.Fj=null};da("google.search.BookSearch",google.search.ia,void 0);Wd(google.search.ia,google.search.A);google.search.ia.Va="GbookSearch";google.search.ia.RESULT_CLASS=google.search.ia.Va;google.search.ia.Sn="user-list";google.search.ia.USER_LIST=google.search.ia.Sn;google.search.ia.Kn=1;google.search.ia.TYPE_ALL_BOOKS=google.search.ia.Kn; +google.search.ia.On=2;google.search.ia.TYPE_FULL_VIEW_BOOKS=google.search.ia.On;google.search.ia.$=[];google.search.ia.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.ia.$,e,b);google.search.ia.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.ia.RawCompletion=google.search.ia.Pa;google.search.ia.prototype.lc=function(a,b){return google.search.A.Ob(google.search.ia.$,[this,a,b])}; +google.search.ia.prototype.Zb=function(a,b,c){b=this.Nc(null==b?"google.search.BookSearch.RawCompletion":b,c);this.Ma&&(a=a+" "+this.Ma);a="&q="+encodeURIComponent(a);this.Bi&&(a+="&as_brr=1");this.Fj&&(a=a+"&as_list="+this.Fj);this.Aa=a;return b+a}; +google.search.ia.prototype.Qa=function(a){a.html&&delete a.html;a.thumbnailHtml=this.wk(a);var b=B(this.Fd());K(b,"gs-result");var c=B("gs-text-box"),d=ke(),f=le(d,0),e=me(f,"gs-image-box"),f=me(f,"gs-text-box");r(e,a.thumbnailHtml.cloneNode(!0));r(f,c);r(b,d);d=pe(a.unescapedUrl,a.title,this.ya(),"gs-title");r(c,d);d=x(p.by+" "+a.authors,"gs-author");r(c,d);d=B("gs-spacer");r(c,d);a.publishedYear&&(d=x(a.publishedYear,"gs-publishedDate"),r(c,d));0<parseInt(a.pageCount,10)&&(d=x("- "+p["page-count"](a.pageCount), +"gs-pageCount"),r(c,d));d=pe("http://books.google.com","books.google.com",this.ya(),"gs-visibleUrl");r(c,d);a.html=b;this.Gc(a.html)};google.search.ia.prototype.createResultHtml=google.search.ia.prototype.Qa; +google.search.ia.prototype.wk=function(a){var b=B("gs-image-box gs-book-image-box"),c=B("gs-row-1"),d=ne("http://books.google.com/googlebooks/pages-trans.gif",null,null,"gs-pages");r(c,d);d=ne("http://books.google.com/googlebooks/p_edge-trans.gif",null,null,"gs-page-edge");r(c,d);r(b,c);c=B("gs-row-2");d=google.search.A.dc(a.tbWidth,a.tbHeight,this.za);d=ne(a.tbUrl,d.width,d.height,"gs-image");a=oe(a.unescapedUrl,null,this.ya(),"gs-image");a.className="gs-image";r(a,d);r(c,a);r(b,c);return b}; +google.search.ia.prototype.Ta=function(a,b){a==google.search.A.Xh?b?b==google.search.ia.Kn?this.Bi=!1:b==google.search.ia.On?this.Bi=!0:this.Ta(a,null):this.Bi=!1:a==google.search.ia.Sn&&(b&&b.match(/^[a-zA-Z0-9\-_]*$/)?this.Fj=b:this.Fj=null)};google.search.ia.prototype.setRestriction=google.search.ia.prototype.Ta;google.search.D=function(){google.search.A.call(this);this.fm=2;this.ta="image";this.Rc="/GimageSearch";this.rc="http://images.google.com/images";this.Ia=null;this.ha={};this.zc=this.qc=this.vc=this.tc=this.sc=this.uc=null;this.Tb=google.search.D.Uc;this.S=new google.search.gc;this.za={width:112,height:84}};da("google.search.ImageSearch",google.search.D,void 0);Wd(google.search.D,google.search.A);google.search.D.Va="GimageSearch";google.search.D.RESULT_CLASS=google.search.D.Va; +google.search.D.ug="restrict-imagesize";google.search.D.RESTRICT_IMAGESIZE=google.search.D.ug;google.search.D.Rj=["icon"];google.search.D.IMAGESIZE_SMALL=google.search.D.Rj;google.search.D.Qj=["small","medium","large","xlarge"];google.search.D.IMAGESIZE_MEDIUM=google.search.D.Qj;google.search.D.Pj=["xxlarge"];google.search.D.IMAGESIZE_LARGE=google.search.D.Pj;google.search.D.Oj=["huge"];google.search.D.IMAGESIZE_EXTRA_LARGE=google.search.D.Oj;google.search.D.sg="restrict-coloration"; +google.search.D.RESTRICT_COLORIZATION=google.search.D.sg;google.search.D.Ef="mono";google.search.D.COLORIZATION_BLACK_AND_WHITE=google.search.D.Ef;google.search.D.Gf="gray";google.search.D.COLORIZATION_GRAYSCALE=google.search.D.Gf;google.search.D.Ff="color";google.search.D.COLORIZATION_COLOR=google.search.D.Ff;google.search.D.rg="restrict-colorfilter";google.search.D.RESTRICT_COLORFILTER=google.search.D.rg;google.search.D.Pf="red";google.search.D.COLOR_RED=google.search.D.Pf;google.search.D.Mf="orange"; +google.search.D.COLOR_ORANGE=google.search.D.Mf;google.search.D.Sf="yellow";google.search.D.COLOR_YELLOW=google.search.D.Sf;google.search.D.Lf="green";google.search.D.COLOR_GREEN=google.search.D.Lf;google.search.D.Qf="teal";google.search.D.COLOR_TEAL=google.search.D.Qf;google.search.D.If="blue";google.search.D.COLOR_BLUE=google.search.D.If;google.search.D.Of="purple";google.search.D.COLOR_PURPLE=google.search.D.Of;google.search.D.Nf="pink";google.search.D.COLOR_PINK=google.search.D.Nf; +google.search.D.Rf="white";google.search.D.COLOR_WHITE=google.search.D.Rf;google.search.D.Kf="gray";google.search.D.COLOR_GRAY=google.search.D.Kf;google.search.D.Hf="black";google.search.D.COLOR_BLACK=google.search.D.Hf;google.search.D.Jf="brown";google.search.D.COLOR_BROWN=google.search.D.Jf;google.search.D.tg="restrict-filetype";google.search.D.RESTRICT_FILETYPE=google.search.D.tg;google.search.D.bg="jpg";google.search.D.FILETYPE_JPG=google.search.D.bg;google.search.D.cg="png"; +google.search.D.FILETYPE_PNG=google.search.D.cg;google.search.D.$f="gif";google.search.D.FILETYPE_GIF=google.search.D.$f;google.search.D.Zf="bmp";google.search.D.FILETYPE_BMP=google.search.D.Zf;google.search.D.vg="restrict-imagetype";google.search.D.RESTRICT_IMAGETYPE=google.search.D.vg;google.search.D.gg="face";google.search.D.IMAGETYPE_FACES=google.search.D.gg;google.search.D.fg="clipart";google.search.D.IMAGETYPE_CLIPART=google.search.D.fg;google.search.D.hg="lineart"; +google.search.D.IMAGETYPE_LINEART=google.search.D.hg;google.search.D.ig="news";google.search.D.IMAGETYPE_NEWS=google.search.D.ig;google.search.D.jg="photo";google.search.D.IMAGETYPE_PHOTO=google.search.D.jg;google.search.D.wg="restrict-rights";google.search.D.RESTRICT_RIGHTS=google.search.D.wg;google.search.D.Ag="(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial|cc_nonderived)";google.search.D.RIGHTS_REUSE=google.search.D.Ag;google.search.D.yg="(cc_publicdomain|cc_attribute|cc_sharealike|cc_nonderived).-(cc_noncommercial)"; +google.search.D.RIGHTS_COMMERCIAL_REUSE=google.search.D.yg;google.search.D.zg="(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial).-(cc_nonderived)";google.search.D.RIGHTS_MODIFICATION=google.search.D.zg;google.search.D.xg="(cc_publicdomain|cc_attribute|cc_sharealike).-(cc_noncommercial|cc_nonderived)";google.search.D.RIGHTS_COMMERCIAL_MODIFICATION=google.search.D.xg;google.search.D.Uf=20;google.search.D.CSE_LARGE_RESULTSET=google.search.D.Uf;google.search.D.wd="popup"; +google.search.D.LAYOUT_POPUP=google.search.D.wd;google.search.D.Wd="column";google.search.D.LAYOUT_COLUMN=google.search.D.Wd;google.search.D.Uc="classic";google.search.D.LAYOUT_CLASSIC=google.search.D.Uc;google.search.D.$=[];google.search.D.Sd={as_dt:!0,as_epq:!0,as_eq:!0,as_lq:!0,as_nlo:!0,as_nhi:!0,as_oq:!0,as_q:!0,as_qdr:!0,as_rq:!0,as_sitesearch:!0,cr:!0,c2coff:!0,filter:!0,gl:!0,hq:!0,lr:!0,query:!0,sort:!0};k=google.search.D.prototype; +k.ni=function(){var a=new google.search.D;this.oi(a);a.Ia=this.Ia;a.ha=this.ha;a.uc=this.uc;a.sc=this.sc;a.tc=this.tc;a.vc=this.vc;a.qc=this.qc;a.zc=this.zc;a.wf(this.Tb);a.S=this.S.clone();a.O=this.O;return a};k.ld=function(a){a=He(a);return a.replace(/\s+/g,"_").toLowerCase()};k.ne=function(a){return this.O?this.S.Ga==this.ld(a):!1};k.yc=function(a){return this.O&&this.S.Ga?a.replace(new RegExp(" more:"+this.S.Ga+"$"),""):a}; +k.je=function(){return this.fe=["gsc-"+this.ta+"Result","gsc-"+this.ta+"Result-"+this.Tb].join(" ")};google.search.D.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.D.$,e,b);google.search.D.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.D.RawCompletion=google.search.D.Pa;google.search.D.prototype.lc=function(a,b){return google.search.A.Ob(google.search.D.$,[this,a,b])}; +google.search.D.prototype.Zb=function(a,b,c){b=this.Nc(null==b?"google.search.ImageSearch.RawCompletion":b,c);this.gb&&this.O&&(b+="&searchtype=image");a=[a];this.Ma&&a.push(this.Ma);a=a.concat(this.S.ce()).join(" ");var d=this.S.$d(),f=[],e;for(e in d)f.push(e+"="+d[e]);e="&"+f.join("&");e=e+"&q="+encodeURIComponent(a);this.Ia&&(e=e+"&safe="+this.Ia);this.uc&&(e=e+"&imgsz="+encodeURIComponent(this.uc));this.sc&&(e=e+"&imgc="+encodeURIComponent(this.sc));this.tc&&(e=e+"&imgcolor="+encodeURIComponent(this.tc)); +this.vc&&(e=e+"&imgtype="+encodeURIComponent(this.vc));this.qc&&(e=e+"&as_filetype="+encodeURIComponent(this.qc));this.zc&&(e=e+"&as_rights="+encodeURIComponent(this.zc));this.Nb&&(e=e+"&as_sitesearch="+encodeURIComponent(this.Nb));this.ha&&(a=Ie(this.ha))&&(e+="&"+a);b+=e;this.Aa=e;c&&0!=c&&(this.Aa=this.Aa+"&start="+c);window.google.loader.GoogleLocale&&this.gb&&this.O&&(b+="&googlehost="+encodeURIComponent(window.google.loader.GoogleLocale));return b}; +google.search.D.prototype.Qa=function(a){a.html&&delete a.html;a.target=this.ya()||void 0;a.html=google.search.ga.ma("imageResult_"+this.Tb,a);for(var b=google.search.D.dc(a.tbWidth,a.tbHeight,this.za),c=a.html.firstChild;c;c=c.nextSibling)if(1==c.nodeType){for(var d=c.getElementsByTagName("img"),f=[],e=0,g=d[0];g=d[e];++e)f[e]=g;"IMG"==c.tagName.toUpperCase()&&f.push(c);for(d=0;g=f[d];++d)ze(g,"gs-image-scalable")&&(g.style.width=b.width+"px",g.style.height=b.height+"px")}this.Gc(a.html)}; +google.search.D.prototype.createResultHtml=google.search.D.prototype.Qa;google.search.D.prototype.sl=function(){return this.Tb};google.search.D.prototype.getLayout=google.search.D.prototype.sl; +google.search.D.prototype.wf=function(a){if(a==google.search.D.Uc||a==google.search.D.Wd||a==google.search.D.wd){var b=this.results;if(this.Tb!=a&&b)for(var c=0;c<b.length;c++){var d=b[c];d.html&&delete d.html}this.Tb=a;a==google.search.D.Uc?this.za={width:112,height:84}:a==google.search.D.Wd?this.za={width:112,height:168}:a==google.search.D.wd&&(this.za={width:224,height:84})}};google.search.D.prototype.setLayout=google.search.D.prototype.wf; +google.search.D.prototype.Wb=function(a,b){this.S=google.search.jc.ri(a,b);this.S instanceof google.search.Cc&&(this.O=!0,this.S.type()==google.search.K.Kc&&(this.Dd=p["linked-cse-error-results"]))};google.search.D.prototype.setSiteRestriction=google.search.D.prototype.Wb;k=google.search.D.prototype;k.Vg=function(){return this.O?this.S.type():null};k.Wg=function(){return this.O?this.S.pf:null};k.nc=function(){return this.O?this.S.Ga:null};k.mj=function(a){this.O&&a&&this.S.sj(a)}; +k.Ha=function(a){isNaN(parseInt(a,10))||(a=parseInt(a,10));this.O&&(0<a&&a<=google.search.D.Uf||google.search.A.Ec==a)?this.Na=a:google.search.A.prototype.Ha.call(this,a)};google.search.D.prototype.setResultSetSize=google.search.D.prototype.Ha;google.search.D.prototype.gd=function(){var a=google.search.A.prototype.gd.call(this);return this.O&&a&&"number"!=typeof this.Na?2*a:a};google.search.D.prototype.getNumResultsPerPage=google.search.D.prototype.gd; +google.search.D.prototype.Ta=function(a,b){a==google.search.A.Ya?this.Ia=b?b==google.search.A.Cg||b==google.search.A.Bg?b:null:null:a==google.search.D.ug?this.uc=b?b.join("|"):null:a==google.search.D.sg?this.sc=b?b==google.search.D.Ef||b==google.search.D.Gf||b==google.search.D.Ff?b:null:null:a==google.search.D.rg?this.tc=b?b==google.search.D.Pf||b==google.search.D.Mf||b==google.search.D.Sf||b==google.search.D.Lf||b==google.search.D.Qf||b==google.search.D.If||b==google.search.D.Of||b==google.search.D.Nf|| +b==google.search.D.Rf||b==google.search.D.Kf||b==google.search.D.Hf||b==google.search.D.Jf?b:null:null:a==google.search.D.tg?this.qc=b?b==google.search.D.bg||b==google.search.D.cg||b==google.search.D.$f||b==google.search.D.Zf?b:null:null:a==google.search.D.vg?this.vc=b?b==google.search.D.gg||b==google.search.D.fg||b==google.search.D.hg||b==google.search.D.ig||b==google.search.D.jg?b:null:null:a==google.search.D.wg&&(this.zc=b?b==google.search.D.Ag||b==google.search.D.yg||b==google.search.D.zg||b== +google.search.D.xg?b:null:null);if(a==google.search.A.La)if(b)for(var c in b){var d=b[c];google.search.D.Sd[c]&&(this.ha[c]=d)}else this.ha={}};google.search.D.prototype.setRestriction=google.search.D.prototype.Ta;google.search.D.dc=function(a,b,c,d,f){var e=Math.min(c.width/a,c.height/b),g={};g.width=Math.round(a*e);g.height=Math.round(b*e);d&&(d.width=g.width,d.height=g.height,f&&(d.style.left=(c.width-g.width)/2+"px"));return g};google.search.D.scaleImage=google.search.D.dc; +google.search.D.Bm=function(a){var b=a.childNodes[0],c=a.childNodes[1];if("block"==c.style.display)return!1;c.style.display="block";a.style.zIndex=4E3;var d=c.childNodes[0],f=c.childNodes[1],e=b.getElementsByTagName("img")[0],g=c.getElementsByTagName("img")[0],h={width:g.offsetWidth,height:g.offsetHeight};g.offsetWidth<e.offsetWidth?h={width:e.offsetWidth,height:2*e.offsetHeight}:g.offsetHeight<e.offsetHeight&&(h={width:e.offsetWidth,height:e.offsetHeight});google.search.D.dc(g.offsetWidth,g.offsetHeight, +h,g);c.style.width=c.offsetWidth>2*b.offsetWidth?2*b.offsetWidth+"px":Math.max(d.offsetWidth,f.offsetWidth);b=Le(e,a)+e.offsetWidth/2;a=Me(e,a)+e.offsetHeight/2;e=Le(g,c)+g.offsetWidth/2;g=Me(g,c)+g.offsetHeight/2;0===navigator.appName.indexOf("Microsoft")?(c.getBoundingClientRect().left=b-e+"px",c.getBoundingClientRect().top=a-g+"px"):(c.offsetLeft=b-e+"px",c.offsetTop=a-g+"px");return!1};google.search.D.showPopup=google.search.D.Bm; +google.search.D.Il=function(a){a=a.childNodes[1];if("none"==a.style.display)return!1;a.style.display="none";a.parentNode.style.zIndex=0;return!1};google.search.D.hidePopup=google.search.D.Il;google.search.D.prototype.Sa=function(a){google.search.A.prototype.Sa.call(this,a)};google.search.D.prototype.setLinkTarget=google.search.D.prototype.Sa;google.search.D.prototype.Gb=function(a){google.search.A.prototype.Gb.call(this,a)};google.search.D.prototype.setQueryAddition=google.search.D.prototype.Gb;google.search.C=function(){google.search.A.call(this);this.fm=2;this.ta="image";this.Rc="/GcustomimageSearch";this.rc="http://images.google.com/images";this.Ia=null;this.ha={};this.zc=this.qc=this.vc=this.tc=this.sc=this.uc=null;this.Tb=google.search.C.Uc;this.S=new google.search.gc;this.za={width:112,height:84}};da("google.search.CustomImageSearch",google.search.C,void 0);Wd(google.search.C,google.search.A);google.search.C.Va="GcustomimageSearch";google.search.C.RESULT_CLASS=google.search.C.Va; +google.search.C.ug="restrict-imagesize";google.search.C.RESTRICT_IMAGESIZE=google.search.C.ug;google.search.C.Rj=["icon"];google.search.C.IMAGESIZE_SMALL=google.search.C.Rj;google.search.C.Qj=["small","medium","large","xlarge"];google.search.C.IMAGESIZE_MEDIUM=google.search.C.Qj;google.search.C.Pj=["xxlarge"];google.search.C.IMAGESIZE_LARGE=google.search.C.Pj;google.search.C.Oj=["huge"];google.search.C.IMAGESIZE_EXTRA_LARGE=google.search.C.Oj;google.search.C.sg="restrict-coloration"; +google.search.C.RESTRICT_COLORIZATION=google.search.C.sg;google.search.C.Ef="mono";google.search.C.COLORIZATION_BLACK_AND_WHITE=google.search.C.Ef;google.search.C.Gf="gray";google.search.C.COLORIZATION_GRAYSCALE=google.search.C.Gf;google.search.C.Ff="color";google.search.C.COLORIZATION_COLOR=google.search.C.Ff;google.search.C.rg="restrict-colorfilter";google.search.C.RESTRICT_COLORFILTER=google.search.C.rg;google.search.C.Pf="red";google.search.C.COLOR_RED=google.search.C.Pf;google.search.C.Mf="orange"; +google.search.C.COLOR_ORANGE=google.search.C.Mf;google.search.C.Sf="yellow";google.search.C.COLOR_YELLOW=google.search.C.Sf;google.search.C.Lf="green";google.search.C.COLOR_GREEN=google.search.C.Lf;google.search.C.Qf="teal";google.search.C.COLOR_TEAL=google.search.C.Qf;google.search.C.If="blue";google.search.C.COLOR_BLUE=google.search.C.If;google.search.C.Of="purple";google.search.C.COLOR_PURPLE=google.search.C.Of;google.search.C.Nf="pink";google.search.C.COLOR_PINK=google.search.C.Nf; +google.search.C.Rf="white";google.search.C.COLOR_WHITE=google.search.C.Rf;google.search.C.Kf="gray";google.search.C.COLOR_GRAY=google.search.C.Kf;google.search.C.Hf="black";google.search.C.COLOR_BLACK=google.search.C.Hf;google.search.C.Jf="brown";google.search.C.COLOR_BROWN=google.search.C.Jf;google.search.C.tg="restrict-filetype";google.search.C.RESTRICT_FILETYPE=google.search.C.tg;google.search.C.bg="jpg";google.search.C.FILETYPE_JPG=google.search.C.bg;google.search.C.cg="png"; +google.search.C.FILETYPE_PNG=google.search.C.cg;google.search.C.$f="gif";google.search.C.FILETYPE_GIF=google.search.C.$f;google.search.C.Zf="bmp";google.search.C.FILETYPE_BMP=google.search.C.Zf;google.search.C.vg="restrict-imagetype";google.search.C.RESTRICT_IMAGETYPE=google.search.C.vg;google.search.C.gg="face";google.search.C.IMAGETYPE_FACES=google.search.C.gg;google.search.C.fg="clipart";google.search.C.IMAGETYPE_CLIPART=google.search.C.fg;google.search.C.hg="lineart"; +google.search.C.IMAGETYPE_LINEART=google.search.C.hg;google.search.C.ig="news";google.search.C.IMAGETYPE_NEWS=google.search.C.ig;google.search.C.jg="photo";google.search.C.IMAGETYPE_PHOTO=google.search.C.jg;google.search.C.wg="restrict-rights";google.search.C.RESTRICT_RIGHTS=google.search.C.wg;google.search.C.Ag="(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial|cc_nonderived)";google.search.C.RIGHTS_REUSE=google.search.C.Ag;google.search.C.yg="(cc_publicdomain|cc_attribute|cc_sharealike|cc_nonderived).-(cc_noncommercial)"; +google.search.C.RIGHTS_COMMERCIAL_REUSE=google.search.C.yg;google.search.C.zg="(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial).-(cc_nonderived)";google.search.C.RIGHTS_MODIFICATION=google.search.C.zg;google.search.C.xg="(cc_publicdomain|cc_attribute|cc_sharealike).-(cc_noncommercial|cc_nonderived)";google.search.C.RIGHTS_COMMERCIAL_MODIFICATION=google.search.C.xg;google.search.C.Uf=20;google.search.C.CSE_LARGE_RESULTSET=google.search.C.Uf;google.search.C.wd="popup"; +google.search.C.LAYOUT_POPUP=google.search.C.wd;google.search.C.Wd="column";google.search.C.LAYOUT_COLUMN=google.search.C.Wd;google.search.C.Uc="classic";google.search.C.LAYOUT_CLASSIC=google.search.C.Uc;google.search.C.$=[];google.search.C.Sd={as_dt:!0,as_epq:!0,as_eq:!0,as_lq:!0,as_nlo:!0,as_nhi:!0,as_oq:!0,as_q:!0,as_qdr:!0,as_rq:!0,as_sitesearch:!0,cr:!0,c2coff:!0,filter:!0,gl:!0,hq:!0,lr:!0,query:!0,sort:!0};k=google.search.C.prototype; +k.ni=function(){var a=new google.search.C;this.oi(a);a.Ia=this.Ia;a.ha=this.ha;a.uc=this.uc;a.sc=this.sc;a.tc=this.tc;a.vc=this.vc;a.qc=this.qc;a.zc=this.zc;a.wf(this.Tb);a.S=this.S.clone();a.O=this.O;return a};k.ld=function(a){a=He(a);return a.replace(/\s+/g,"_").toLowerCase()};k.ne=function(a){return this.O?this.S.Ga==this.ld(a):!1};k.yc=function(a){return this.O&&this.S.Ga?a.replace(new RegExp(" more:"+this.S.Ga+"$"),""):a}; +k.je=function(){return this.fe=["gsc-"+this.ta+"Result","gsc-"+this.ta+"Result-"+this.Tb].join(" ")};google.search.C.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.C.$,e,b);google.search.C.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.C.RawCompletion=google.search.C.Pa;google.search.C.prototype.lc=function(a,b){return google.search.A.Ob(google.search.C.$,[this,a,b])}; +google.search.C.prototype.Zb=function(a,b,c){b=this.Nc(null==b?"google.search.CustomImageSearch.RawCompletion":b,c);this.gb&&this.O&&(b+="&searchtype=image");a=[a];this.Ma&&a.push(this.Ma);a=a.concat(this.S.ce()).join(" ");var d=this.S.$d(),f=[],e;for(e in d)f.push(e+"="+d[e]);e="&"+f.join("&");e=e+"&q="+encodeURIComponent(a);this.Ia&&(e=e+"&safe="+this.Ia);this.uc&&(e=e+"&imgsz="+encodeURIComponent(this.uc));this.sc&&(e=e+"&imgc="+encodeURIComponent(this.sc));this.tc&&(e=e+"&imgcolor="+encodeURIComponent(this.tc)); +this.vc&&(e=e+"&imgtype="+encodeURIComponent(this.vc));this.qc&&(e=e+"&as_filetype="+encodeURIComponent(this.qc));this.zc&&(e=e+"&as_rights="+encodeURIComponent(this.zc));this.Nb&&(e=e+"&as_sitesearch="+encodeURIComponent(this.Nb));this.ha&&(a=Ie(this.ha))&&(e+="&"+a);b+=e;this.Aa=e;c&&0!=c&&(this.Aa=this.Aa+"&start="+c);window.google.loader.GoogleLocale&&this.gb&&this.O&&(b+="&googlehost="+encodeURIComponent(window.google.loader.GoogleLocale));return b}; +google.search.C.prototype.Qa=function(a){a.html&&delete a.html;a.target=this.ya()||void 0;a.html=google.search.ga.ma("imageResult_"+this.Tb,a);for(var b=google.search.C.dc(a.tbWidth,a.tbHeight,this.za),c=a.html.firstChild;c;c=c.nextSibling)if(1==c.nodeType){for(var d=c.getElementsByTagName("img"),f=[],e=0,g=d[0];g=d[e];++e)f[e]=g;"IMG"==c.tagName.toUpperCase()&&f.push(c);for(d=0;g=f[d];++d)ze(g,"gs-image-scalable")&&(g.style.width=b.width+"px",g.style.height=b.height+"px")}this.Gc(a.html)}; +google.search.C.prototype.createResultHtml=google.search.C.prototype.Qa;google.search.C.prototype.sl=function(){return this.Tb};google.search.C.prototype.getLayout=google.search.C.prototype.sl; +google.search.C.prototype.wf=function(a){if(a==google.search.C.Uc||a==google.search.C.Wd||a==google.search.C.wd){var b=this.results;if(this.Tb!=a&&b)for(var c=0;c<b.length;c++){var d=b[c];d.html&&delete d.html}this.Tb=a;a==google.search.C.Uc?this.za={width:112,height:84}:a==google.search.C.Wd?this.za={width:112,height:168}:a==google.search.C.wd&&(this.za={width:224,height:84})}};google.search.C.prototype.setLayout=google.search.C.prototype.wf; +google.search.C.prototype.Wb=function(a,b){this.S=google.search.jc.ri(a,b);this.S instanceof google.search.Cc&&(this.O=!0,this.S.type()==google.search.G.Kc&&(this.Dd=p["linked-cse-error-results"]))};google.search.C.prototype.setSiteRestriction=google.search.C.prototype.Wb;k=google.search.C.prototype;k.Vg=function(){return this.O?this.S.type():null};k.Wg=function(){return this.O?this.S.pf:null};k.nc=function(){return this.O?this.S.Ga:null};k.mj=function(a){this.O&&a&&this.S.sj(a)}; +k.Ha=function(a){isNaN(parseInt(a,10))||(a=parseInt(a,10));this.O&&(0<a&&a<=google.search.C.Uf||google.search.A.Ec==a)?this.Na=a:google.search.A.prototype.Ha.call(this,a)};google.search.C.prototype.setResultSetSize=google.search.C.prototype.Ha;google.search.C.prototype.gd=function(){var a=google.search.A.prototype.gd.call(this);return this.O&&a&&"number"!=typeof this.Na?2*a:a};google.search.C.prototype.getNumResultsPerPage=google.search.C.prototype.gd; +google.search.C.prototype.Ta=function(a,b){a==google.search.A.Ya?this.Ia=b?b==google.search.A.Cg||b==google.search.A.Bg?b:null:null:a==google.search.C.ug?this.uc=b?b.join("|"):null:a==google.search.C.sg?this.sc=b?b==google.search.C.Ef||b==google.search.C.Gf||b==google.search.C.Ff?b:null:null:a==google.search.C.rg?this.tc=b?b==google.search.C.Pf||b==google.search.C.Mf||b==google.search.C.Sf||b==google.search.C.Lf||b==google.search.C.Qf||b==google.search.C.If||b==google.search.C.Of||b==google.search.C.Nf|| +b==google.search.C.Rf||b==google.search.C.Kf||b==google.search.C.Hf||b==google.search.C.Jf?b:null:null:a==google.search.C.tg?this.qc=b?b==google.search.C.bg||b==google.search.C.cg||b==google.search.C.$f||b==google.search.C.Zf?b:null:null:a==google.search.C.vg?this.vc=b?b==google.search.C.gg||b==google.search.C.fg||b==google.search.C.hg||b==google.search.C.ig||b==google.search.C.jg?b:null:null:a==google.search.C.wg&&(this.zc=b?b==google.search.C.Ag||b==google.search.C.yg||b==google.search.C.zg||b== +google.search.C.xg?b:null:null);if(a==google.search.A.La)if(b)for(var c in b){var d=b[c];google.search.C.Sd[c]&&(this.ha[c]=d)}else this.ha={}};google.search.C.prototype.setRestriction=google.search.C.prototype.Ta;google.search.C.dc=function(a,b,c,d,f){var e=Math.min(c.width/a,c.height/b),g={};g.width=Math.round(a*e);g.height=Math.round(b*e);d&&(d.width=g.width,d.height=g.height,f&&(d.style.left=(c.width-g.width)/2+"px"));return g};google.search.C.scaleImage=google.search.C.dc; +google.search.C.Bm=function(a){var b=a.childNodes[0],c=a.childNodes[1];if("block"==c.style.display)return!1;c.style.display="block";a.style.zIndex=4E3;var d=c.childNodes[0],f=c.childNodes[1],e=b.getElementsByTagName("img")[0],g=c.getElementsByTagName("img")[0],h={width:g.offsetWidth,height:g.offsetHeight};g.offsetWidth<e.offsetWidth?h={width:e.offsetWidth,height:2*e.offsetHeight}:g.offsetHeight<e.offsetHeight&&(h={width:e.offsetWidth,height:e.offsetHeight});google.search.C.dc(g.offsetWidth,g.offsetHeight, +h,g);c.style.width=c.offsetWidth>2*b.offsetWidth?2*b.offsetWidth+"px":Math.max(d.offsetWidth,f.offsetWidth);b=Le(e,a)+e.offsetWidth/2;a=Me(e,a)+e.offsetHeight/2;e=Le(g,c)+g.offsetWidth/2;g=Me(g,c)+g.offsetHeight/2;0===navigator.appName.indexOf("Microsoft")?(c.getBoundingClientRect().left=b-e+"px",c.getBoundingClientRect().top=a-g+"px"):(c.offsetLeft=b-e+"px",c.offsetTop=a-g+"px");return!1};google.search.C.showPopup=google.search.C.Bm; +google.search.C.Il=function(a){a=a.childNodes[1];if("none"==a.style.display)return!1;a.style.display="none";a.parentNode.style.zIndex=0;return!1};google.search.C.hidePopup=google.search.C.Il;google.search.C.prototype.Sa=function(a){google.search.A.prototype.Sa.call(this,a)};google.search.C.prototype.setLinkTarget=google.search.C.prototype.Sa;google.search.C.prototype.Gb=function(a){google.search.A.prototype.Gb.call(this,a)};google.search.C.prototype.setQueryAddition=google.search.C.prototype.Gb;google.search.I=function(){google.search.A.call(this);this.xc=null;this.wc="San Francisco, CA";this.Hc={y:37.77916,x:-122.42009};this.Ke=null;this.yh=!0;this.Kg=!1;this.lf=null;this.Ne=!0;this.Jc=de(this,this.nd);this.Me="gsc-locationConfig";this.ta="local";this.Rc="/GlocalSearch";this.rc="http://www.google.com/local";this.Je=this.wb=null};da("google.search.LocalSearch",google.search.I,void 0);Wd(google.search.I,google.search.A);google.search.I.Va="GlocalSearch";google.search.I.RESULT_CLASS=google.search.I.Va; +google.search.I.Nn="blended";google.search.I.TYPE_BLENDED_RESULTS=google.search.I.Nn;google.search.I.Qn="kmlonly";google.search.I.TYPE_KMLONLY_RESULTS=google.search.I.Qn;google.search.I.Rn="localonly";google.search.I.TYPE_LOCALONLY_RESULTS=google.search.I.Rn;google.search.I.Mm="disabled";google.search.I.ADDRESS_LOOKUP_DISABLED=google.search.I.Mm;google.search.I.Nm="enabled";google.search.I.ADDRESS_LOOKUP_ENABLED=google.search.I.Nm;google.search.I.Dn=0;google.search.I.STATIC_MAP_ZOOM_FARTHEST=google.search.I.Dn; +google.search.I.Bs=13;google.search.I.STATIC_MAP_ZOOM_DEFAULT=google.search.I.Bs;google.search.I.Cn=21;google.search.I.STATIC_MAP_ZOOM_CLOSEST=google.search.I.Cn;google.search.I.fk=8;google.search.I.STATIC_MAP_MAX_POINTS=google.search.I.fk;google.search.I.px=3.141592653589;google.search.I.Vt=6367E3;google.search.I.Vy=16093;google.search.I.$=[]; +google.search.I.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.I.$,e,b);google.search.I.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.I.RawCompletion=google.search.I.Pa;google.search.I.prototype.pb=function(a,b,c,d,f){f&&this.Md&&f!=this.Md||(this.resultViewport=a&&a.viewport?a.viewport:null,google.search.A.prototype.pb.call(this,a,b,c,d,f))};google.search.I.prototype.lc=function(a,b){return google.search.A.Ob(google.search.I.$,[this,a,b])}; +google.search.I.prototype.oa=function(a,b,c){window.console&&window.console.log&&window.console.log("The Google Local Search API is deprecated. Please migrate to the Google Places API (https://developers.google.com/places)");return google.search.A.prototype.oa.call(this,a,b,c)};google.search.I.prototype.execute=google.search.I.prototype.oa; +google.search.I.prototype.Zb=function(a,b,c){b=this.Nc(null==b?"google.search.LocalSearch.RawCompletion":b,c);c="";c="&q="+encodeURIComponent(a);b+=c;this.viewport=null;if(this.xc){var d,f;this.yh?(d=this.xc.getCenterLatLng(),f=this.xc.getSpanLatLng(),a="&sll="+d.y+","+d.x,a+="&sspn="+f.height+","+f.width):(d=this.xc.getCenter(),f=this.xc.getBounds().toSpan().toUrlValue(),a="&sll="+d.y+","+d.x,a+="&sspn="+f);a+=google.search.I.nk(d.y,d.x);b+=a;c+=a}else this.Hc?(a="&sll="+this.Hc.y+","+this.Hc.x, +this.Ke&&(a=a+"&sspn="+this.Ke.lat+","+this.Ke.lng),a+=google.search.I.nk(this.Hc.y,this.Hc.x),b+=a,c+=a):this.wc&&(a="&near="+encodeURIComponent(this.wc),b+=a,c+=a);this.Kg&&(b+="&nogeocode=t",c+="&nogeocode=t");this.lf&&(b+="&mrt="+encodeURIComponent(this.lf),c+="&mrt="+encodeURIComponent(this.lf));c&&(this.Aa=c);return b}; +google.search.I.nk=function(a,b){var c=google.search.I.Vy/google.search.I.Vt*4*google.search.I.px;return"&gll="+Math.floor(1E6*(a-c))+","+Math.floor(1E6*(b-c))+","+Math.floor(1E6*(a+c))+","+Math.floor(1E6*(b+c))+"&llsep=500,500"};google.search.I.centerToGll=google.search.I.nk; +google.search.I.prototype.Qa=function(a){a.html&&delete a.html;var b=B(this.Fd());K(b,"gs-result");var c;c=pe(a.url,a.title,this.ya(),"gs-title");r(b,c);"kml"==a.listingType&&a.content&&""!=a.content&&(c=x(a.content,"gs-snippet"),r(b,c));var d=B("gs-address");if(a.addressLines&&0<a.addressLines.length)for(var f=0;f<a.addressLines.length;f++){c=a.addressLines[f];var e="gs-addressLine";0==f?e="gs-street gs-addressLine":1==f&&(e="gs-city gs-addressLine");c=x(c,e);r(d,c)}else c=x(a.streetAddress,"gs-street"), +r(d,c),f="",""!=a.city&&(f=a.city,""!=a.region&&(f+=", ")),c=x(f,"gs-city"),r(d,c),c=x(a.region,"gs-region"),r(d,c);c=x(a.country,"gs-country");r(d,c);r(b,d);if(a.phoneNumbers&&a.phoneNumbers.length){f=d=null;c=a.phoneNumbers[0];for(var g=0;g<a.phoneNumbers.length;g++){e=a.phoneNumbers[g];if("main"==e.type){d=e;break}if(""==e.type||"mobile"==e.type&&null==f)f=e}c=x((d?d:f?f:c).number,"gs-phone");r(b,c)}a.ddUrl&&""!=a.ddUrl&&(c=pe(a.ddUrl,p.directions,this.ya(),"gs-directions"),r(b,c));a.ddUrlToHere&& +""!=a.ddUrlToHere&&a.ddUrlFromHere&&""!=a.ddUrlFromHere&&(c=B("gs-directions-to-from"),d=x(p["get-directions"]+":","gs-label"),c.appendChild(d),d=pe(a.ddUrlToHere,p["to-here"],this.ya(),"gs-secondary-link"),c.appendChild(d),d=x("-","gs-spacer"),c.appendChild(d),d=pe(a.ddUrlFromHere,p["from-here"],this.ya(),"gs-secondary-link"),c.appendChild(d),r(b,c));a.html=b;this.Gc(a.html)};google.search.I.prototype.createResultHtml=google.search.I.prototype.Qa; +google.search.I.prototype.Nq=function(a){if(a.centerAndZoom)this.yh=!0,this.xc=a,this.Hc=null,this.wc="",this.wb&&(this.wb=null);else if(a.setCenter)this.yh=!1,this.xc=a,this.Ke=this.Hc=null,this.wc="",this.wb&&(this.wb=null);else if(a.x&&a.y)this.yh=!0,this.Hc=a,this.xc=this.Ke=null,this.wc="",this.wb&&(this.wb=null);else if(null!=a&&""!=a){this.yh=!0;this.xc=null;this.wc=a;this.Hc=null;this.wb&&(this.wb=null);var b=new google.search.I;b.Gh(this,this.Vs,[b,a]);b.oa(a)}}; +google.search.I.prototype.setCenterPoint=google.search.I.prototype.Nq;google.search.I.prototype.Vs=function(a,b){if(a.results&&a.results.length){var c={};c.y=parseFloat(a.results[0].lat);c.x=parseFloat(a.results[0].lng);this.Hc=c;this.wc=b;this.Ne=!0;this.xc=null;a.resultViewport&&(c={},c.ZB=parseFloat(a.resultViewport.span.lat)/2,c.$B=parseFloat(a.resultViewport.span.lng)/2,this.Ke=c)}}; +google.search.I.prototype.nd=function(a,b){if(b){if(null==this.wb){var c=null;if(null==this.xc){var d=B("gsc-configSetting");this.wb=ue(null,"gsc-configSettingInput",""==this.wc?null:this.wc);r(d,x(p["search-location"],"gsc-configSettingInputLabel"));r(d,this.wb);r(a,d);c=this.wb}d=B("gsc-configSetting");this.Je=ve(null,"0",this.Kg,"gsc-configSettingCheckbox");r(d,this.Je);r(d,x(p["disable-address-lookup"],"gsc-configSettingCheckboxLabel"));null==c&&(c=this.Je);var f=x(null,"gsc-configSettingSubmit"); +r(f,se(p.close,"gsc-configSettingSubmit"));r(d,f);r(a,d);c.focus()}}else this.wb&&(this.wb.value&&(this.wc=this.wb.value,this.Nq(this.wc)),this.wb=null),this.Je&&(this.Kg=this.Je.checked,this.Je=null),ee(a)};google.search.I.prototype.gy=function(a){a==google.search.I.Mm?this.Kg=!0:a==google.search.I.Nm&&(this.Kg=!1)};google.search.I.prototype.setAddressLookupMode=google.search.I.prototype.gy; +google.search.I.Fq=function(a,b,c,d){var f=a.staticMapUrl,f=f.replace(/&size=\d*x\d*/,"&size="+c+"x"+b);d&&d<=google.search.I.Cn&&d>=google.search.I.Dn&&(f=f.replace(/&zoom=\d*/,"&zoom="+d));return a.staticMapUrl=f};google.search.I.resizeStaticMapUrl=google.search.I.Fq; +google.search.I.Bt=function(a,b,c,d){var f="",e={staticMapUrl:"http://maps.google.com/maps/api/staticmap?maptype=roadmap&size=150x100&zoom=13&format=gif&sensor=false"};b=google.search.I.Fq(e,b,c,d);null==d&&(b=b.replace(/&zoom=\d*/,""));d=a.length;d>google.search.I.fk&&(d=google.search.I.fk);for(c=0;c<d;c++){var g;g=a[c];if(g.lat&&g.lng)"string"==typeof g.lat?(e=parseFloat(g.lat),g=parseFloat(g.lng)):(e=g.lat,g=g.lng);else if(g.x&&g.y)e=g.y,g=g.x;else return null;e="&markers=__ICONID____LAT__,__LNG__".replace(/__LAT__/, +e);e=e.replace(/__LNG__/,g);g=65+c;e=1<d?e.replace(/__ICONID__/,"label:"+String.fromCharCode(g)+"|"):e.replace(/__ICONID__/,"");f+=e}return b+f};google.search.I.computeStaticMapUrl=google.search.I.Bt;google.search.I.prototype.Ta=function(a,b){a==google.search.A.Xh&&(b?(this.lf=null,this.lf=b==google.search.I.Nn||b==google.search.I.Qn||b==google.search.I.Rn?b:null):this.lf=null)};google.search.I.prototype.setRestriction=google.search.I.prototype.Ta;google.search.la=function(){google.search.A.call(this);this.ta="news";this.Rc="/GnewsSearch";this.rc="http://news.google.com/nwshp";this.zf="site:";this.Kb=!1;this.Ne=!0;this.Jc=de(this,this.nd);this.Me="gsc-newsConfig";this.ha=this.na=null};da("google.search.NewsSearch",google.search.la,void 0);Wd(google.search.la,google.search.A);google.search.la.Va="GnewsSearch";google.search.la.RESULT_CLASS=google.search.la.Va;google.search.la.wn="GnewsSearch.quote";google.search.la.QUOTE_RESULT_CLASS=google.search.la.wn; +google.search.la.$=[];google.search.la.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.la.$,e,b);google.search.la.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.la.RawCompletion=google.search.la.Pa;google.search.la.prototype.lc=function(a,b){return google.search.A.Ob(google.search.la.$,[this,a,b])}; +google.search.la.prototype.Zb=function(a,b,c){b=this.Nc(null==b?"google.search.NewsSearch.RawCompletion":b,c);var d=null;a&&(d=a);this.Ma&&(d=null==d?this.Ma:d+" "+this.Ma);this.Nb&&(d=null==d?this.zf+this.Nb:d+" "+this.zf+this.Nb);a=d?"&q="+encodeURIComponent(d):"";this.Kb&&(a+="&scoring=d");if(this.ha){var d="",f;for(f in this.ha)":"==f.charAt(0)&&(d+="&"+this.ha[f]);a+=d}this.Nb&&"source:"==this.zf&&(b=b.replace(/&hl=.*&/,"&hl=en&"));this.Aa=a;c&&0!=c&&(this.Aa=this.Aa+"&start="+c);return b+a}; +google.search.la.prototype.Qa=function(a){a.html&&delete a.html;if(a.GsearchResultClass!=google.search.la.wn){var b=B(this.Fd());K(b,"gs-result");var c;c=pe(a.unescapedUrl,a.title,this.ya(),"gs-title");r(b,c);c=x(a.publisher,"gs-publisher");r(b,c);c=a.location.split(",");1<c.length&&(c=x(", "+c[c.length-1],"gs-location"),r(b,c));c=new Date(a.publishedDate);c=x(" - "+this.Ue(c),"gs-publishedDate");r(b,c);c=new Date(a.publishedDate);c=x(" - "+this.jl(c),"gs-relativePublishedDate");r(b,c);c=x(a.content, +"gs-snippet");r(b,c);a.clusterUrl&&""!=a.clusterUrl&&(c=pe(a.clusterUrl,p["related-articles"]+" »",this.ya(),"gs-clusterUrl"),r(b,c));a.html=b;this.Gc(a.html)}};google.search.la.prototype.createResultHtml=google.search.la.prototype.Qa;google.search.la.prototype.Wb=function(a){null==a||""==a?(this.Nb=null,this.zf="site:"):a.match("[./:]")?(this.zf="site:",this.Nb=a):(this.zf="source:",this.Nb=a.replace(/\s/g,"_"))};google.search.la.prototype.setSiteRestriction=google.search.la.prototype.Wb; +google.search.la.prototype.Hb=function(a){this.Kb=a==google.search.A.Vc?!0:!1};google.search.la.prototype.setResultOrder=google.search.la.prototype.Hb; +google.search.la.prototype.nd=function(a,b){if(b){if(null==this.na){var c=B("gsc-configSetting");this.na=ve(null,"0",this.Kb,"gsc-configSettingCheckbox");r(c,this.na);r(c,x(p["sort-by-date"],"gsc-configSettingCheckboxLabel"));var d=B("gsc-configSettingSubmit");r(d,se(p.close,"gsc-configSettingSubmit"));r(c,d);r(a,c)}else this.na.checked=this.Kb;this.na.focus()}else this.na&&(this.na.checked?this.Hb(google.search.A.Vc):this.Hb(google.search.A.og))}; +google.search.la.prototype.Zs={geo:!0,qsid:!0,quotesearch:!0,topic:!0,ned:!0,scoring:!0,as_mind:!0,as_minm:!0,as_miny:!0,as_maxd:!0,as_maxm:!0,as_maxy:!0};google.search.la.prototype.Ta=function(a,b){if(a==google.search.A.La)if(b)for(var c in b){var d=b[c];"undefined"!=typeof this.Zs[c]&&(this.ha=this.ha||{},this.ha[":"+c]=c+"="+encodeURIComponent(d))}else this.ha=null};google.search.la.prototype.setRestriction=google.search.la.prototype.Ta;google.search.da=function(){google.search.A.call(this);this.ta="patent";this.Rc="/GpatentSearch";this.rc="http://www.google.com/patents";this.gr="";this.Dh=null;this.Ne=!0;this.Jc=de(this,this.nd);this.Me="gsc-patentConfig";this.na=null};da("google.search.PatentSearch",google.search.da,void 0);Wd(google.search.da,google.search.A);google.search.da.Va="GpatentSearch";google.search.da.RESULT_CLASS=google.search.da.Va;google.search.da.Ln=1;google.search.da.TYPE_ANY_STATUS=google.search.da.Ln; +google.search.da.Pn=2;google.search.da.TYPE_ISSUED_PATENTS=google.search.da.Pn;google.search.da.Mn=3;google.search.da.TYPE_APPLICATIONS=google.search.da.Mn;google.search.da.$=[];google.search.da.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.da.$,e,b);google.search.da.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.da.RawCompletion=google.search.da.Pa;google.search.da.prototype.lc=function(a,b){return google.search.A.Ob(google.search.da.$,[this,a,b])}; +google.search.da.prototype.Zb=function(a,b,c){b=this.Nc(null==b?"google.search.PatentSearch.RawCompletion":b,c);this.Ma&&(a=a+" "+this.Ma);a="&q="+encodeURIComponent(a)+this.gr;this.Dh&&(a+=this.Dh);this.Aa=a;return b+a}; +google.search.da.prototype.Qa=function(a){a.html&&delete a.html;a.thumbnailHtml=this.wk(a);var b=B(this.Fd());K(b,"gs-result");var c=B("gs-text-box"),d=ke(),f=le(d,0),e=me(f,"gs-image-box"),f=me(f,"gs-text-box");r(e,a.thumbnailHtml.cloneNode(!0));r(f,c);r(b,d);e=pe(a.unescapedUrl,a.title,this.ya(),"gs-title");r(c,e);d=B("gs-patent-info gs-metadata");r(c,d);e=null;e=a.patentNumber?"issued"==a.patentStatus?p["us-pat"]+" "+a.patentNumber:p["us-pat-app"]+" "+a.patentNumber:p["us-pat-app"]+" N/A"; +e=x(e,"gs-patent-number");r(d,e);a.applicationDate&&(e=x(" - "+this.Ue(new Date(a.applicationDate)),"gs-publishedDate"),r(d,e));a.assignee&&(e=x(" - "+a.assignee,"gs-author"),r(d,e));e=x(a.content,"gs-snippet");r(c,e);r(c,e);a.html=b;this.Gc(a.html)};google.search.da.prototype.createResultHtml=google.search.da.prototype.Qa; +google.search.da.prototype.wk=function(a){var b=B("gs-patent-image"),c=ne(a.tbUrl,75,100,"gs-image");a=oe(a.unescapedUrl,null,this.ya(),"gs-image");a.className="gs-image";r(a,c);r(b,a);return b};google.search.da.prototype.Hb=function(a){this.Dh=a==google.search.A.Vc?"&scoring=d":a==google.search.A.un?"&scoring=ad":null};google.search.da.prototype.setResultOrder=google.search.da.prototype.Hb; +google.search.da.prototype.Ta=function(a,b){a==google.search.A.Xh&&(this.gr=b?b==google.search.da.Ln?"":b==google.search.da.Pn?"&as_psrg=1":b==google.search.da.Mn?"&as_psra=1":"":"")};google.search.da.prototype.setRestriction=google.search.da.prototype.Ta; +google.search.da.prototype.nd=function(a,b){if(b){var c=!1;this.Dh&&"&scoring=d"==this.Dh&&(c=!0);if(null==this.na){var d=B("gsc-configSetting");this.na=ve(null,"0",c,"gsc-configSettingCheckbox");r(d,this.na);r(d,x(p["sort-by-date"],"gsc-configSettingCheckboxLabel"));c=B("gsc-configSettingSubmit");r(c,se(p.close,"gsc-configSettingSubmit"));r(d,c);r(a,d)}else this.na.checked=c;this.na.focus()}else this.na&&(this.na.checked?this.Hb(google.search.A.Vc):this.Hb(google.search.A.og))};google.search.Za=function(){this.tq=this.pc=google.search.B.Vd;this.root=null;this.za={width:112,height:84};this.Hj={width:100,height:75};this.re=null};da("google.search.SearcherOptions",google.search.Za,void 0);google.search.Za.prototype.Pq=function(a){switch(a){case google.search.B.Ym:case google.search.B.Ae:case google.search.B.Vd:this.pc=a;break;default:this.pc=google.search.B.Vd}this.tq=this.pc};google.search.Za.prototype.setExpandMode=google.search.Za.prototype.Pq; +google.search.Za.prototype.uy=function(a){ee(a);this.root=a};google.search.Za.prototype.setRoot=google.search.Za.prototype.uy;google.search.Za.prototype.xf=function(a){this.re=a};google.search.Za.prototype.setNoResultsString=google.search.Za.prototype.xf;google.search.Za.prototype.ny=function(a){100<a&&(a=100);this.za.height=a;this.za.width=Math.round(1.33*a)};google.search.Za.prototype.setImageResultsTbHeight=google.search.Za.prototype.ny; +google.search.Za.prototype.Ay=function(a){100<a&&(a=100);this.Hj.height=a;this.Hj.width=Math.round(1.33*a)};google.search.Za.prototype.setVideoResultsTbHeight=google.search.Za.prototype.Ay;google.search.ra=function(){this.er=this.input=null;this.fb=google.search.B.Dc;this.ji=!1;this.Oa=null;this.oc=google.search.B.Uj;this.xi=!1;this.Df=-1};da("google.search.DrawOptions",google.search.ra,void 0);google.search.ra.prototype.oy=function(a){this.input=a};google.search.ra.prototype.setInput=google.search.ra.prototype.oy; +google.search.ra.prototype.Wq=function(a){this.er=Oe(a)};google.search.ra.prototype.setSearchFormRoot=google.search.ra.prototype.Wq;google.search.ra.prototype.Oq=function(a){this.fb=a==google.search.B.Dc||a==google.search.B.fc?a:google.search.B.Dc};google.search.ra.prototype.setDrawMode=google.search.ra.prototype.Oq;google.search.ra.prototype.Mq=function(a){this.ji=a};google.search.ra.prototype.setAutoComplete=google.search.ra.prototype.Mq;google.search.ra.prototype.Xq=function(a){this.xi=a}; +google.search.ra.prototype.setSpeech=google.search.ra.prototype.Xq;google.search.ra.prototype.$q=function(a){this.Df=a};google.search.ra.prototype.setTopRefinementsWanted=google.search.ra.prototype.$q;google.search.ra.prototype.Lo=function(a,b,c,d){this.oc=google.search.B.ng;this.Oa={};this.Oa.qm=a;this.Oa.vx=b||"q";this.Oa.Zw=c||!1;this.Oa.mx=d||"?"};google.search.ra.prototype.enableSearchboxOnly=google.search.ra.prototype.Lo;google.search.ra.prototype.Ko=function(){this.oc=google.search.B.mg}; +google.search.ra.prototype.enableSearchResultsOnly=google.search.ra.prototype.Ko; +google.search.eb=function(a,b,c){this.qb=c;this.tk=this.$k=!1;this.J=a;this.xa=null;this.Vx=$d(b,google.search.B.prototype.ix,[this]);this.cy=$d(b,google.search.B.prototype.bm,[this,google.search.eb.dk]);this.$x=$d(b,google.search.B.prototype.bm,[this,google.search.eb.ck]);this.Yx=$d(b,google.search.B.prototype.bm,[this,google.search.eb.An]);this.Rx=$d(b,google.search.B.prototype.hx,[this]);this.Qx=$d(b,google.search.B.prototype.bx,[this]);this.J.Gh(b,b.pb,[this]);this.J.ly(b,google.search.B.prototype.Ru); +this.J.Ha(b.rf);this.J.Sa(b.kd);this.kb=this.Oe=this.Ad=this.rm=this.qh=this.Bj=this.root=null;this.Nl=!0;this.$a=[];this.Ah=this.Lg=this.Ic=this.Ja=null;this.Ub=0;this.of=!1};google.search.eb.bk=0;google.search.eb.dk=1;google.search.eb.ck=2;google.search.eb.An=3; +google.search.eb.prototype.wm=function(a){var b="gsc-results-selector ",b=a==google.search.eb.bk?this.qb.pc==google.search.B.Vd?b+"gsc-one-result-active":this.J.Na==google.search.A.Xb?b+"gsc-more-results-active":b+"gsc-all-results-active":a==google.search.eb.dk?b+"gsc-one-result-active":a==google.search.eb.ck?b+"gsc-more-results-active":b+"gsc-all-results-active";this.rm.className=b}; +google.search.B=function(a){if(!google.loader.KeyVerified)if(google.search.B.bq())google.loader.KeyVerified=!0;else return;this.ik=this.rf=google.search.A.Xb;this.fb=google.search.B.Dc;this.uf=this.input=this.root=null;this.Aj=google.search.B.di;this.rw=$d(this,google.search.B.prototype.ex,[null]);this.sw=$d(this,google.search.B.prototype.fx,[null]);this.Eh=this.sm=this.Im=this.Yi=null;this.df=0;this.Ng=!1;this.kd=google.search.A.kg;this.oc=google.search.B.Uj;this.Ul=p.copy;this.ue=this.jb=null;this.eq= +0;this.Rd={};this.Lb=this.Od=this.jj=this.cc=this.Ig=null;this.nq=!1;this.od=null;this.ie=this.ve=0;this.jo=!1;this.Id=null;this.jh=!1;this.pa=this.fd=null;this.Kq=!1;this.Wa={};this.Wa[google.search.Fa.kc]={enabled:!0,className:"gsc-adBlock",Yb:"",wj:{lines:2}};this.Wa[google.search.Fa.Qb]={enabled:!1,className:"gsc-adBlockVertical",Yb:"gsc-thinWrapper",wj:{}};this.Wa[google.search.Fa.Ab]={enabled:!1,className:"gsc-adBlockBottom",Yb:"",wj:{}};this.Z=[];var b;if(a)for(var c=0;c<a.length;c++)b=new google.search.eb(a[c], +this,!1),this.Z.push(b);this.tj(google.search.B.Xj);this.Zn={};this.Jg=!1;this.ye=!0;this.Ib=null};da("google.search.SearchControl",google.search.B,void 0);google.search.B.prototype.mm=!1;google.search.Fa={kc:"top",Qb:"right",Ab:"bottom"};google.search.B.tn=p["no-results"];google.search.B.NO_RESULTS_DEFAULT_STRING=google.search.B.tn;google.search.B.In=350;google.search.B.TIMEOUT_SHORT=google.search.B.In;google.search.B.di=500;google.search.B.TIMEOUT_MEDIUM=google.search.B.di;google.search.B.Hn=700; +google.search.B.TIMEOUT_LONG=google.search.B.Hn;google.search.B.Ym=1;google.search.B.EXPAND_MODE_CLOSED=google.search.B.Ym;google.search.B.Ae=2;google.search.B.EXPAND_MODE_OPEN=google.search.B.Ae;google.search.B.Vd=3;google.search.B.EXPAND_MODE_PARTIAL=google.search.B.Vd;google.search.B.Dc=1;google.search.B.DRAW_MODE_LINEAR=google.search.B.Dc;google.search.B.fc=2;google.search.B.DRAW_MODE_TABBED=google.search.B.fc;google.search.B.kn="save";google.search.B.KEEP_LABEL_SAVE=google.search.B.kn; +google.search.B.jn="keep";google.search.B.KEEP_LABEL_KEEP=google.search.B.jn;google.search.B.hn="include";google.search.B.KEEP_LABEL_INCLUDE=google.search.B.hn;google.search.B.gn="copy";google.search.B.KEEP_LABEL_COPY=google.search.B.gn;google.search.B.fn="blank";google.search.B.KEEP_LABEL_BLANK=google.search.B.fn;google.search.B.Xj="tab";google.search.B.REFINEMENT_AS_TAB=google.search.B.Xj;google.search.B.Wj="link";google.search.B.REFINEMENT_AS_LINK=google.search.B.Wj;google.search.B.Uj="standard"; +google.search.B.MODE_STANDARD=google.search.B.Uj;google.search.B.ng="searchbox-only";google.search.B.MODE_SEARCHBOX_ONLY=google.search.B.ng;google.search.B.mg="searchresults-only";google.search.B.MODE_RESULTS_ONLY=google.search.B.mg;var Ze=google.loader.themes.BUBBLEGUM,$e=google.loader.themes.GREENSKY,af=google.loader.themes.ESPRESSO,bf=google.loader.themes.SHINY,cf=google.loader.themes.MINIMALIST,df=google.loader.themes.V2_DEFAULT;google.search.B.td={}; +google.search.B.td[Ze]={colorBackground:"#FDE5FF",colorTitleLink:"#0568CD",colorText:"#000",colorDomainLink:"#CC7A9F",fontFamily:"Arial"};google.search.B.td[$e]={colorBackground:"#EEFFE5",colorBorder:"#A9DA92",colorTitleLink:"#06C",colorText:"#454545",colorDomainLink:"#8D5FA7",fontFamily:"Trebuchet MS",fontSizeDescription:"14"};google.search.B.td[af]={colorBackground:"#F2F0E6",colorTitleLink:"#950000",colorText:"#333",colorDomainLink:"#A25B08",fontFamily:"Georgia",fontSizeDescription:"14",fontSizeDomainLink:"12"}; +google.search.B.td[bf]={colorBackground:"#F0F0F6",colorBorder:"#CCC",colorTitleLink:"#06C",colorDomainLink:"#008000",fontFamily:"Verdana"};google.search.B.td[cf]={colorBackground:"#EEE",colorBorder:"#CCC",colorTitleLink:"#000",colorText:"#444",colorDomainLink:"#333",fontSizeDescription:"14",fontFamily:"Arial"};google.search.B.td[df]={colorBackground:"#fff",colorBorder:"#ddd",colorTitleLink:"#1155CC",colorText:"#222",colorDomainLink:"#093",fontSizeDescription:"13",fontFamily:"Arial, sans-serif"}; +google.search.B.Tm="13";google.search.B.Or="16";try{google.search.B.appPath=window.location.href}catch(a){google.search.B.appPath=null}google.search.B.bq=function(){var a;a=window.location.host.toLowerCase().split(".");if(2>a.length)a=!1;else{var b=a.pop(),c=a.pop();"igoogle"!=c&&"gmodules"!=c&&"googlesyndication"!=c||"com"!=b?(2==b.length&&0<a.length&&Be[c]&&1==Be[c][b]&&(c=a.pop()),a="google"==c):a=!0}if(a)return!0;google.loader.KeyVerified=!0;google.loader.LoadFailure=!1;return!0}; +google.search.B.keyCheck=google.search.B.bq;google.search.B.prototype.Xs=function(){var a=this;return function(){a.mm&&(a.Dq(),a.mm=!1)}}; +google.search.B.prototype.Se=function(a,b){this.zd=!0;this.Zc=a;if(b){var c=this.Wa[google.search.Fa.kc],d=this.Wa[google.search.Fa.Qb],f=this.Wa[google.search.Fa.Ab];void 0!=b.includeVerticalAds&&(d.enabled=b.includeVerticalAds);void 0!=b.includeSideAds&&(d.enabled=b.includeSideAds);void 0!=b._includeBottomAds_&&(f.enabled=b._includeBottomAds_);void 0!=b.iframes&&(this.Zo=b.iframes);b.channel&&(this.ei=b.channel);b.clientIP&&(this.$n=b.clientIP);b.safe&&(this.hk=b.safe);b.userAgent&&(this.bo=b.userAgent); +b.adStyle&&(this.Xn=b.adStyle);b.cseGoogleHosting&&(this.fi=b.cseGoogleHosting);if(f=b.adtest||b.debug)this.jk=f;void 0!=b.numTopAds&&(c.md=Math.max(0,Math.min(4,b.numTopAds)),c.enabled=c.md?!0:!1);void 0!=b.numSideAds&&(d.md=Math.max(0,Math.min(8,b.numSideAds)),d.enabled=d.md?!0:!1);"noTop"==b.layout&&(c.enabled=!1,d.enabled=!0);this.Iq=b.enableSearchCompleteCallback?!0:!1}(function(a,b,c,d){a[d]=a[d]||function(){(a[d].q=a[d].q||[]).push(arguments)};a[d].t=1*new Date;var f=b.createElement(c);b=b.getElementsByTagName(c)[0]; +f.async=1;f.src="//cse.google.com/adsense/search/async-ads.js";b.parentNode.insertBefore(f,b)})(window,document,"script","_googCsa");window._googCsa("jsLoadedCallback",this.Xs())};google.search.B.prototype.enableAds=google.search.B.prototype.Se;google.search.B.prototype.Zd=function(a,b,c){b||(b=new google.search.Za);b&&b.za&&a.Qq(b.za);a.rd=null;b=new google.search.eb(a,this,b);c?(c.$a.push(b),b.Ah=c,b.Ub=c.Ub+1):(this.Z.push(b),b.Ub=0);this.Fh(a)&&(this.Sv=!0);a.vf="gsc"}; +google.search.B.prototype.addSearcher=google.search.B.prototype.Zd; +google.search.B.prototype.xo=function(a){a.qb.root?(a.Nl=!1,a.root=a.qb.root,K(a.root,"gsc-resultsRoot"),Y(a.root,"gsc-resultsbox-visible"),K(a.root,"gsc-resultsbox-invisible")):a.root=B("gsc-resultsRoot");a.J.Lh&&K(a.root,"gsc-resultsRoot-"+a.J.Lh);this.fb==google.search.B.fc&&(a.Ja.Bb=a.root);var b=ke(null,null,"gsc-resultsHeader"),c=le(b,0);a.xe=me(c,"gsc-twiddleRegionCell");c=me(c,"gsc-configLabelCell");a.Bj=x("","gsc-twiddle");r(a.xe,a.Bj);var d=ie(a.J.dv(),"gsc-title");r(a.Bj,d);a.qh=x("","gsc-stats"); +r(a.xe,a.qh);var d=x(),f=x(p.blank,"gsc-result-selector gsc-one-result"),e=x(p.blank,"gsc-result-selector gsc-more-results"),g=x(p.blank,"gsc-result-selector gsc-all-results");f.title=p["show-one-result"];e.title=p["show-more-results"];g.title=p["show-all-results"];r(d,f);r(d,e);r(d,g);f.onclick=a.cy;e.onclick=a.$x;g.onclick=a.Yx;a.rm=d;a.wm(google.search.eb.bk);r(a.xe,a.rm);a.Bj.onclick=a.Vx;a.J.Jc&&(a.Sb=je("","gsc-configLabel"),a.Sb.innerHTML=p.blank,K(a.Sb,"gsc-twiddle-closed"),r(c,a.Sb),a.Sb.onclick= +a.Rx,a.Sb.title=p.settings,a.Ad=B("gsc-config"),K(a.Ad,a.J.Me),a.Oe=re("gsc-config"),K(a.Oe,a.J.Me),a.Oe.onsubmit=a.Qx,r(a.Ad,a.Oe),a.Ad.style.display="none");a.kb=B();this.Db&&(a.kb.onmousedown=de(this,google.search.B.prototype.vt),a.kb.onclick=de(this,google.search.B.prototype.ut));a.xa=B("gsc-expansionArea");r(a.kb,a.xa);a.Nl&&r(this.Qd,a.root);r(a.root,b);a.Ad&&r(a.root,a.Ad);r(a.root,a.kb)};google.search.B.wt=/^https?:\/\/www\.google\.com\/url\?/;k=google.search.B.prototype; +k.vt=function(a){this.Jg&&this.Hq(this.So(a));return!0};k.ut=function(a){var b=this.So(a);this.Jg||this.Hq(b);b&&window.setTimeout(function(){var a=b.getAttribute(google.search.G.Td);a&&(b.href=a)},0);return!0};k.So=function(a){a=a||window.event;for(a=a.target||a.srcElement;a&&!(a.href&&a.getAttribute(google.search.G.Ud)&&a.getAttribute(google.search.G.Td));)a=a.parentNode;return a};k.Hq=function(a){if(a){var b=a.getAttribute(google.search.G.Ud);b&&google.search.B.wt.test(b)&&(a.href=b)}}; +k.uo=function(a){var b=ie();K(b,"gsc-refinementBlockInvisible");r(this.Pc,b);a.Ic=b;this.Dt(a)};k.Ct=function(a){return this.Rd.zq?je(a):he(a)};k.yo=function(a){if(this.Rd.zq){var b=document.createDocumentFragment();b.appendChild(je());b.firstChild.innerHTML=a;return b}var b=document.createDocumentFragment(),c=document.createElement("div");for(c.innerHTML=a;c.firstChild;)b.appendChild(c.firstChild);return b}; +k.Dt=function(a){var b=a.Ja,c=this.vk(a,a);c.Ub+=1;"tab"==this.xq?fe(c.ua,he(p["all-results-short"])):fe(c.ua,this.Ct(p["all-results-long"]));a.Ja=b;a.Lg=c;a.Lg.Bb=a.Ja.Bb}; +k.tj=function(a){a==google.search.B.Wj?(this.wq="gsc-refinementHeader",this.cj="gsc-refinementhInactive",this.km="gsc-refinementhActive",this.xq=a,this.lm="gsc-refinementsAreaInvisible",this.yq="gsc-refinementsArea"):a==google.search.B.Xj&&(this.wq="gsc-tabHeader",this.cj="gsc-tabhInactive",this.km="gsc-tabhActive",this.xq=a,this.lm="gsc-tabsAreaInvisible",this.yq="gsc-tabsArea")};google.search.B.prototype.setRefinementStyle=google.search.B.prototype.tj;k=google.search.B.prototype; +k.vk=function(a,b){var c={},d=a.J.zl();a.Ja=c;c.Ub=a.Ub;c.ua=x(google.search.V.we(d));c.Bb=null;c.rb=a.J;c.ta=a.J.ta;xe(c.ua,$d(this,this.Bf,[c]));c.Ib=a;var f="gs-spacer";Yd("opera")&&(f+=" gs-spacer-opera");b?(d=b.Ic,K(c.ua,this.wq),K(c.ua,this.cj)):(d=this.Sc,K(c.ua,"gsc-tabHeader"),K(c.ua,"gsc-tabhInactive"));K(c.ua,"gsc-inline-block");r(d,c.ua);f=je(" ",f);r(d,f);a.qb.Pq(google.search.B.Ae);return c}; +k.kq=function(a){if(1!=a.$a.length){var b=a.$a.shift();if(b){a.$a.push(b);a=b.Ja.ua;var c=a.nextSibling;r(a.parentNode,a);r(a.parentNode,c);b=b.Ja.Bb;r(b.parentNode,b)}}};k.xl=function(a){for(var b=0;b<this.od.length;++b)if(this.od[b].key==a)return b;return null};k.kx=function(a){this.Lb.className="gsc-option-menu-invisible";this.ve!=a&&(this.vm(a),this.qj(a,this.Y.rb),this.oa())}; +k.dy=function(a){a=a||window.event;this.Lb.className="gsc-option-menu";this.Lb.style.top=Me(this.Lb,this.Od)+Me(this.jj,this.Od)-Me(Z(this.Lb,"div","gsc-option-menu-item-highlighted")[0],this.Od)+"px";a.cancelBubble=!0;a.stopPropagation&&a.stopPropagation()};k.Rt=function(a){a=a||window.event;this.Lb&&!Se(this.Lb,a.target||a.srcElement)&&(this.Lb.className="gsc-option-menu-invisible")};google.search.B.jx=function(a){a=a||window.event;a.cancelBubble=!0;a.stopPropagation&&a.stopPropagation()};k=google.search.B.prototype; +k.Kt=function(){var a=B("gsc-orderby-invisible"),b=ie(p["order-results-by"],"gsc-orderby-label");K(b,"gsc-inline-block");r(a,b);this.Od=B("gsc-option-menu-container");K(this.Od,"gsc-inline-block");r(a,this.Od);b=B("gsc-selected-option-container");K(b,"gsc-inline-block");this.jj=B("gsc-selected-option");var c=B("gsc-option-selector");r(b,this.jj);r(b,c);b.onclick=de(this,this.dy);r(this.Od,b);this.Lb=B("gsc-option-menu-invisible");for(b=0;b<this.od.length;++b){var d=this.od[b].label,c=B("gsc-option-menu-item"), +d=ie(d,"gsc-option");r(c,d);r(this.Lb,c);d.onclick=$d(this,google.search.B.prototype.kx,[b])}r(this.Od,this.Lb);this.Lb.onclick=google.search.B.jx;b=de(this,this.Rt);this.root.attachEvent?(this.root.attachEvent("onmousedown",b),document.attachEvent("onmousedown",b)):document.addEventListener&&document.addEventListener("mousedown",b,!0);return a};k.fv=function(a){a=a||window.event;this.Id&&!Se(this.Id,a.target||a.srcElement)&&(this.fd.className="gsc-getlink-text-invisible")}; +k.ev=function(a){a=a||window.event;this.fd&&Se(this.fd,a.target||a.srcElement)||(this.fd.className=ze(this.fd,"gsc-getlink-text-visible")?"gsc-getlink-text-invisible":"gsc-getlink-text-visible",a.cancelBubble=!0,a.stopPropagation&&a.stopPropagation())};k.Mt=function(){var a=B("gsc-richsnippet-popup-box");K(a,"gsc-richsnippet-popup-box-invisible");return a}; +k.Jt=function(){var a=re(),b=we("label","page",!0),c=qe(p["label-page"],"gsc-label-result-form-label");r(a,b);r(a,c);xe(b,de(this,this.Np));b=we("label","site");c=qe(p["label-site"],"gsc-label-result-form-label");r(a,b);r(a,c);xe(b,de(this,this.Np));b=we("label","prefix");c=qe(p["label-prefix"],"gsc-label-result-form-label");r(a,b);r(a,c);xe(b,de(this,this.Fy));return a}; +k.Ht=function(a){var b=document.createElement("a"),c="more:"+a;b.className="gs-label";b.textContent=a;b.setAttribute("data-refinementlabel",a);b.setAttribute("label-with-op",c);b.setAttribute("dir","ltr");xe(b,$d(this,this.Em,[this.jd(this.Ib),c]));return b}; +k.It=function(){this.Nd=B("gsc-modal-background-image");xe(this.Nd,$d(this,this.cf));r(this.Qd,this.Nd);var a=B("gsc-label-result-main-box-invisible"),b=B("gsc-label-result-saving-popup");K(b,"gsc-label-result-saving-popup-invisible");ge(b,p.saving);r(a,b);b=B("gsc-results-close-btn");K(b,"gsc-label-results-close-btn-visible");r(a,b);xe(b,$d(this,this.cf));var b=p["add-label"],c=document.createElement("h");c.className="gsc-label-result-heading";b&&(c.textContent=b);r(a,c);b=B("gsc-labels-label-div-visible"); +r(a,b);this.Jq=b;this.ij=B("gsc-labels-no-label-div-invisible");ge(this.ij,p["no-refinement"]);r(a,this.ij);c=B("gsc-label-result-url-heading");r(b,c);c=document.createElement("a");c.target="_blank";c.className="gsc-label-result-url-title";r(b,c);c=B("gsc-label-result-url");r(b,c);c=B("gsc-label-result-form-div");r(b,c);r(c,this.Jt());c=ue(null,"gsc-label-result-label-prefix-invisible");K(c,"gsc-label-result-label-prefix-visible");r(b,c);c=B("gsc-label-result-label-prefix-error");ge(c,p["invalid-url-prefix"]); +K(c,"gsc-label-result-label-prefix-error-invisible");r(b,c);c=B("gsc-labels-box");r(b,c);c=B("gsc-add-label-error");K(c,"gsc-add-label-error-invisible");ge(c,p["error-adding-label"]);r(b,c);c=B("gsc-label-result-buttons");r(b,c);b=te(p.Save,"gsc-result-label-button");K(b,"gsc-result-label-save-button");r(c,b);xe(b,de(this,this.Yy));b=te(p.Cancel,"gsc-result-label-button");r(c,b);xe(b,de(this,this.cf));return a}; +k.Gt=function(){var a=B("gsc-getlink-invisible"),b=B("gsc-getlink-box");K(b,"gsc-inline-block");var c=ne(google.loader.ServiceBase+"/css/link.png",null,null,"gsc-getlink-image");this.fd=B("gsc-getlink-text-invisible");var d=B("gsc-getlink-textbox"),f=x(p["get-link"],"gsc-getlink-label"),e=ue(null,"gsc-getlink-inputbox");e.readOnly=!0;e.onclick=e.select;r(b,c);r(a,b);r(a,this.fd);r(this.fd,d);r(d,f);r(d,e);xe(a,de(this,this.ev));b=de(this,this.fv);this.root.attachEvent?(this.root.attachEvent("onclick", +b),document.attachEvent("onclick",b)):document.addEventListener&&document.addEventListener("click",b,!0);return a}; +k.Xg=function(a,b){var c=null,d=null;b?b.fb?(this.fb=b.fb,c=b.input,d=b.er,this.oc=b.oc,this.ji=b.ji,this.xi=b.xi,this.Df=b.Df,this.oc==google.search.B.ng&&(this.Oa=b.Oa)):this.fb=google.search.B.Dc:this.fb=google.search.B.Dc;this.root=B(this.Oa?"gsc-control-searchbox-only":"gsc-control");this.root.dir=google.search.V.ci;(a=Oe(a))&&fe(a,this.root);this.Db&&this.Uw();if(null!=c)this.input=c,this.input.onkeyup=this.rw,this.input.onpaste=this.sw,this.ye=!1;else{this.ye=!0;null==d?d=this.root:d.dir=google.search.V.ci; +this.uf=new google.search.Ca(!0,d,{Ej:!0,Ns:this.Jg,Mg:this.Rd.Mg});this.uf.Tq(this,this.$c);this.input=this.uf.input;var d=this.uf.hj,f=this.uf.gj,e={interfaceLanguage:google.search.CurrentLocale};this.Jg&&(e.brandingImageUrl=google.search.Ca.Lj,e.brandingImageStyle=google.search.Ca.Pr);this.ji?this.ii&&(e.maxSuggestions=this.ii.maxCompletions,e.maxPromotions=this.ii.maxPromotions):e.disableAutoCompletions=!0;this.Oa&&(e.enableAsynchronousLogging=!Re(Pe(this.Oa.qm)));e.useKennedyLookAndFeel=this.Rd.Mg; +e.searchButton=d;e.enableSpeech=b?b.xi:!1;this.ue=Ud();this.ue.uw(f,this.input,this,e);e.useKennedyLookAndFeel&&K(f,"gsc-search-box-tools")}c||this.oc!=google.search.B.mg||(this.uf.gj.style.display="none",this.root.style.visibility="hidden");if(!this.Oa){this.Qd=B("gsc-resultsbox-invisible");this.Jo&&(this.tf=this.Mt(),r(this.Qd,this.tf));ye()&&(this.pa=this.It(),r(this.Qd,this.pa));this.yb=this.pq?B("gsc-results-wrapper-overlay"):B("gsc-results-wrapper-nooverlay");r(this.root,this.yb);this.pq&&(this.kf= +B("gsc-modal-background-image"),r(this.root,this.kf),xe(this.kf,$d(this,google.search.B.prototype.$c)),this.sf=B("gsc-results-close-btn"),r(this.yb,this.sf),xe(this.sf,$d(this,google.search.B.prototype.$c)));if(this.fb==google.search.B.fc)for(this.Sc=B("gsc-tabsAreaInvisible"),r(this.yb,this.Sc),this.Db&&(1<this.Z.length&&this.tj(google.search.B.Wj),this.Pc=B(this.lm),r(this.yb,this.Pc)),c=0;c<this.Z.length;c++)this.vk(this.Z[c]);this.Ig=B("gsc-above-wrapper-area-invisible");r(this.yb,this.Ig);c= +ke(0,0,"gsc-above-wrapper-area-container");r(this.Ig,c);c=le(c,0);d=me(c,"gsc-result-info-container");this.qf=B("gsc-result-info-invisible");r(d,this.qf);this.Db&&this.nq&&this.fb==google.search.B.fc&&(d=me(c,"gsc-orderby-container"),this.cc=this.Kt(),r(d,this.cc),this.cc.className="gsc-orderby-invisible");this.jh&&(c=me(c,"gsc-getlink-container"),this.Id=this.Gt(),r(c,this.Id),this.Id.className="gsc-getlink-invisible");this.Bc=this.yb;this.zd&&(this.Bc=B("gsc-wrapper"),this.Ed(function(a,b){b.wa= +B("gsc-adBlockInvisible");a==google.search.Fa.kc?r(this.Bc,b.wa):a==google.search.Fa.Qb&&r(this.yb,b.wa)}),r(this.yb,this.Bc));r(this.Bc,this.Qd);for(c=0;c<this.Z.length;c++)this.xo(this.Z[c]),this.fb==google.search.B.fc&&(K(this.Z[c].Ja.Bb,"gsc-tabData"),K(this.Z[c].Ja.Bb,"gsc-tabdInactive"));this.fb==google.search.B.fc&&0<this.Z.length&&(this.Y=this.Z[0].Ja,this.Cf(this.Y),Y(this.Z[0].Ja.Bb,"gsc-tabdInactive"),K(this.Z[0].Ja.Bb,"gsc-tabdActive"),this.cc&&(this.vm(this.ie),this.qj(this.ie,this.Y.rb)))}a&& +(c=this.Gu())&&300>c&&K(this.root,"gsc-narrow")};google.search.B.prototype.draw=google.search.B.prototype.Xg;google.search.B.prototype.vm=function(a){if(this.cc){var b=Z(this.Lb,"div","gsc-option-menu-item-highlighted")[0];b&&Y(b,"gsc-option-menu-item-highlighted");this.ve=a;K(Z(this.Lb,"div","gsc-option")[this.ve].parentNode,"gsc-option-menu-item-highlighted");ge(this.jj,this.od[this.ve].label)}};google.search.B.prototype.qj=function(a,b){b instanceof google.search.G&&b.Ta(google.search.A.La,{sort:this.od[a].key})}; +google.search.B.prototype.um=function(a){var b=Z(Z(this.fd,"div","gsc-getlink-textbox")[0],"input",null)[0],c={},d=window.location.href;var f=d.split("#");if(1!=f.length){for(var d=f[1].split("&"),e=d.length;0<e--;)-1!=d[e].lastIndexOf("gsc.",0)&&d.splice(e,1);d=0<d.length?f[0]+"#"+d.join("&"):f[0]}if(-1!=d.indexOf("?gcse-bookmark=")||-1!=d.indexOf("&gcse-bookmark="))f=d.split("#"),d=1==f.length?Je(f[0],"gcse-bookmark"):Je(f[0],"gcse-bookmark")+"#"+f[1];c.query=this.hf;this.Y.rb.ec!=p.web&&this.Y.rb.ec!= +p.image&&(c.refine=this.Y.rb.ec);this.Y.rb instanceof google.search.C&&(c.image="1");this.cc&&this.Y.rb instanceof google.search.G&&(c.sortBy=this.od[this.ve].key);a&&(c.page=a);a=d;f=[];if(c)for(var g in c)null!=c[g]&&f.push("gcse-bookmark="+encodeURIComponent(g+":"+c[g]));c=f.join("&");g=-1!==a.indexOf("?")?"&":"?";f="";-1!==a.indexOf("#")&&(f=a.replace(/.*#/,"#"),a=a.replace(/#.*/,""));d=a+g+c+f;b.value=d;ge(b,d)}; +google.search.B.prototype.xy=function(a){switch(a){case google.search.B.In:case google.search.B.di:case google.search.B.Hn:this.Aj=a;break;default:this.Aj=google.search.B.di}};google.search.B.prototype.setTimeoutInterval=google.search.B.prototype.xy;google.search.B.prototype.sy=function(a,b,c){if(c)switch(c){case google.search.B.kn:case google.search.B.jn:case google.search.B.hn:case google.search.B.gn:case google.search.B.fn:this.Ul=p[c];break;default:this.Ul=c}this.Yi=de(a,b)}; +google.search.B.prototype.setOnKeepCallback=google.search.B.prototype.sy;k=google.search.B.prototype;k.Fh=function(a){var b=a.ta;return this.Db?"web"==b&&a.O?!1:!0:"blog"==b||"image"==b?!0:!1};k.Cf=function(a){1==a.Ub?a.ua.onclick?(xe(a.ua,null),Y(a.ua,this.cj),K(a.ua,this.km)):(xe(a.ua,$d(this,this.Bf,[a])),Y(a.ua,this.km),K(a.ua,this.cj)):a.ua.onclick?(xe(a.ua,null),Y(a.ua,"gsc-tabhInactive"),K(a.ua,"gsc-tabhActive")):(xe(a.ua,$d(this,this.Bf,[a])),Y(a.ua,"gsc-tabhActive"),K(a.ua,"gsc-tabhInactive"))}; +k.Bf=function(a,b){if(this.Y!=a){this.Am(!0);Y(this.Y.Bb,"gsc-tabdActive");K(this.Y.Bb,"gsc-tabdInactive");this.Cf(this.Y);var c=this.jd(this.Y.Ib),d=this.jd(a.Ib);1==this.Y.Ub&&c!=d&&(K(c.Ic,"gsc-refinementBlockInvisible"),this.Cf(c.Ja));this.Y=a;c=this.Y.rb;this.Cf(this.Y);this.cc&&this.qj(this.ve,this.Y.rb);this.jh&&this.um();1==this.Y.Ub&&d.Ja.ua.onclick&&this.Cf(d.Ja);this.jq();d=null;!b&&this.jb&&this.jb.isEnabled()&&(d=this.jb.mh(),this.Zq(a,d));K(this.Y.Bb,"gsc-tabdActive");Y(this.Y.Bb,"gsc-tabdInactive"); +var f=b?b.bj:this.hf,e=f&&f==c.jf;b&&(e=e&&b.page==c.Fi());this.Id&&this.wr();if(e){d&&(d[google.search.History.Wc]=c.Fi(),this.jb.pushState(d));if(!this.Ar(c.jf,c.Fi())||Yd("opera")&&b)this.me=c.me,this.Yk(c.jf,c.Fi());this.Y.Ib.gq||(this.fr(this.Y.Ib),this.Ro(c),this.cc&&this.xr())}else f&&this.Oo(f,b&&b.page,null,d)}};k.Ar=function(a,b){var c=this.Wa[google.search.Fa.Ab];return!!this.Da&&this.Da.query==a&&(this.Da.adPage||1)==(b||1)&&!(c.enabled&&this.Y&&this.Y.Ib.xa!=c.wa.parentNode)}; +k.Ro=function(a){var b=a.results,c=a.cursor;this.fb!=google.search.B.Dc&&(this.qf.id="resInfo-"+a.Wx);this.fb!=google.search.B.Dc&&0<b.length&&c&&c.resultCount&&c.searchResultTime?(a=he(p["result-info"](c.resultCount,c.searchResultTime)),fe(this.qf,a),this.qf.className="gsc-result-info"):(this.qf.className="gsc-result-info-invisible",ee(this.qf))}; +k.nu=function(){if(this.pa&&!this.Kq){var a=google.search.Ka.Iu();this.Kq=!0;if(a&&a.length)for(var b=Z(this.pa,null,"gsc-labels-box")[0],c=0;c<a.length;c++){var d=ve(a[c].Title,a[c].Label.name,null,"gsc-label-checkbox"),f=je(a[c].Title,"gsc-label-result-labels"),e=B("gsc-label-box");r(e,d);r(e,f);r(b,e)}else Y(this.ij,"gsc-labels-no-label-div-invisible"),K(this.ij,"gsc-labels-no-label-div-visible"),Y(this.Jq,"gsc-labels-label-div-visible"),K(this.Jq,"gsc-labels-label-div-invisible")}}; +k.To=function(a,b){if(a.J.O)for(var c=0;c<a.$a.length;c++){var d=a.$a[c];if(d.J.ne(b))return d.Ja}return null};k.Em=function(a,b){var c=this.To(a,b),d=!0;c||(c=a.Ja,d=!1);this.Bf(c);return d}; +k.Gy=function(a,b){this.tf.innerHTML="";var c=B("gsc-richsnippet-popup-close-button");xe(c,$d(this,function(){K(this.tf,"gsc-richsnippet-popup-box-invisible")}));var d=he(p["structured-data"]+" : "),f=B("gsc-richsnippet-popup-box-title-text");r(f,d);var e=he(decodeURIComponent(a)),d=B("gsc-richsnippet-popup-box-title-url");r(d,e);e=B("gsc-richsnippet-popup-box-title");r(e,f);r(e,d);r(e,c);r(this.tf,e);var c=B("gsc-richsnippet-popup-box-contents"),g;for(g in b)this.Dx(g,b[g],c);r(this.tf,c);Y(this.tf, +"gsc-richsnippet-popup-box-invisible")};k.Dx=function(a,b,c){var d=B("gsc-richsnippet-individual-snippet-box"),f=B("gsc-richsnippet-individual-snippet-key");a=a.charAt(0).toUpperCase()+a.slice(1);r(f,he(a));a=B("gsc-richsnippet-individual-snippet-data");for(var e in b)this.Cq(e,b[e],a);r(d,f);r(d,a);r(c,d)}; +k.Cq=function(a,b,c){var d=he(a+" : ");a=B("gsc-richsnippet-individual-snippet-valueelem");if("string"==typeof b){var f=B("gsc-richsnippet-individual-snippet-keyelem");r(f,d);r(a,he(b))}if("object"==typeof b)for(var e in b)this.Cq(e,b[e],a);b=B("gsc-richsnippet-individual-snippet-keyvalue");r(b,f);r(b,a);r(c,b)}; +k.Cy=function(a,b,c){var d=Z(this.pa,"input","gsc-label-checkbox");c=Z(c,"a","gs-label");for(var f=0;f<d.length;f++){d[f].checked=!1;d[f].disabled=!1;for(var e=1;c&&e<c.length;e++)d[f].value==c[e].getAttribute("data-refinementlabel")&&(d[f].checked=!0,d[f].disabled=!0)}(d=Z(this.pa,null,"gsc-label-result-form-div")[0])&&(d=Z(d,"input",null)[0])&&d.click();K(this.Nd,"gsc-modal-background-image-visible");Y(this.pa,"gsc-label-result-main-box-invisible");this.pa.className="gsc-label-result-main-box-visible"; +ge(Z(this.pa,null,"gsc-label-result-url")[0],unescape(a));d=Z(this.pa,null,"gsc-label-result-url-title")[0];d.href=a;ge(d,b);Z(this.pa,null,"gsc-label-result-label-prefix-visible")[0].value=unescape(a)};k.cf=function(){Y(this.pa,"gsc-label-result-main-box-visible");this.pa.className="gsc-label-result-main-box-invisible";Y(this.Nd,"gsc-modal-background-image-visible");this.Hl();this.fw()};k.fw=function(){K(Z(this.pa,null,"gsc-add-label-error")[0],"gsc-add-label-error-invisible")}; +k.By=function(){Y(Z(this.pa,null,"gsc-add-label-error")[0],"gsc-add-label-error-invisible")};k.gw=function(){K(Z(this.pa,null,"gsc-label-result-saving-popup")[0],"gsc-label-result-saving-popup-invisible")};k.Ey=function(){Y(Z(this.pa,null,"gsc-label-result-saving-popup")[0],"gsc-label-result-saving-popup-invisible")};k.Hl=function(){K(Z(this.pa,null,"gsc-label-result-label-prefix-error")[0],"gsc-label-result-label-prefix-error-invisible")}; +k.Dy=function(){Y(Z(this.pa,null,"gsc-label-result-label-prefix-error")[0],"gsc-label-result-label-prefix-error-invisible")};k.Fy=function(){var a=Z(this.pa,null,"gsc-label-result-label-prefix-invisible")[0];a&&Y(a,"gsc-label-result-label-prefix-invisible")};k.Np=function(){this.Hl();var a=Z(this.pa,null,"gsc-label-result-label-prefix-visible")[0];a&&K(a,"gsc-label-result-label-prefix-invisible")}; +k.$y=function(a,b){for(var c=Z(this.Y.Ib.root,null,"gs-per-result-labels"),d=null,f=0;f<c.length;f++)if(c[f].getAttribute("url")==a){d=c[f];break}if(d){for(;1<d.childNodes.length;)d.removeChild(d.childNodes[1]);for(f=0;f<b.length;f++)d.appendChild(this.Ht(b[f]))}}; +k.Yy=function(){for(var a=Z(this.pa,null,"gsc-label-checkbox"),b=[],c=!1,d=0;d<a.length;d++)a[d].checked&&b.push(a[d].value),a[d].checked&&!a[d].disabled&&(c=!0);if(c){var f=Z(this.pa,null,"gsc-label-result-url")[0].innerText,e=this.Wu(f);if(e){this.Hl();this.Nt();this.Ey();var g=this;google.search.Ka.Lw(google.search.Ka.bp()+"&num=5000",function(a){g.Vu(f,e,b,a)})}else this.Dy()}}; +k.Nt=function(){var a=Z(this.pa,null,"gsc-label-results-close-btn-visible")[0];a&&xe(a,null);this.Nd&&xe(this.Nd,null);this.Ho(!0)};k.Yt=function(){var a=Z(this.pa,null,"gsc-label-results-close-btn-visible")[0];a&&xe(a,$d(this,this.cf));this.Nd&&xe(this.Nd,$d(this,this.cf));this.Ho(!1)}; +k.Ho=function(a){for(var b=Z(this.pa,null,"gsc-result-label-button"),c=0;b&&c<b.length;c++)b[c].disabled=a;if(c=Z(this.pa,null,"gsc-label-result-form-div")[0])for(b=Z(c,"input",null),c=0;b&&c<b.length;c++)b[c].disabled=a};k.Vu=function(a,b,c,d){d=google.search.Ka.Su(b,d);b=google.search.Ka.pv(b,c,d);var f=this;google.search.Ka.Nw(google.search.Ka.bp(),b,function(b){f.Ps(a,b)})};k.Ps=function(a,b){var c=google.search.Ka.mu(b);this.gw();this.Yt();c&&c.length?(this.$y(a,c),this.cf()):this.By()}; +k.Wu=function(a){var b="",c=Qe(a),d=Z(Z(this.pa,"div","gsc-label-result-form-div")[0],"input");d[0].checked?b=a:d[1].checked?b=c:d[2].checked&&(d=Z(this.pa,"input","gsc-label-result-label-prefix-visible")[0].value,c==Qe(d)&&0==a.indexOf(d)&&(b=d));return b}; +k.vj=function(a,b){b?(K(this.root,"gsc-loading-fade"),a.gq=!0,K(a.kb,"gsc-loading-resultsRoot"),0==a.Ub&&this.Pc&&K(this.Pc,"gsc-loading-refinementsArea")):(Y(this.root,"gsc-loading-fade"),a.gq=!1,Y(a.kb,"gsc-loading-resultsRoot"),this.Pc&&Y(this.Pc,"gsc-loading-refinementsArea"))};k.jq=function(){this.zd&&(this.Fh(this.Y.rb)?this.sh():this.Fk())}; +k.Zy=function(a){var b=this.Wa[google.search.Fa.Ab];if(b.wa.parentNode!=a.xa){var c=Z(a.xa,"div","gsc-cursor-box")[0];c&&c.parentNode==a.xa?a.xa.insertBefore(b.wa,c):r(a.xa,b.wa)}};k.sh=function(){this.zd&&this.Ed(function(a,b){b.wa.className="gsc-adBlockInvisible";b.enabled&&b.Yb&&Y(this.Bc,b.Yb)})};k.Fk=function(){this.zd&&this.Ed(function(a,b){0<b.se?(b.wa.className=b.className,b.Yb&&K(this.Bc,b.Yb)):(b.wa.className="gsc-adBlockInvisible",b.Yb&&Y(this.Bc,b.Yb))})};k.submit=function(){return this.qr(null)}; +google.search.B.prototype.submit=google.search.B.prototype.submit;k=google.search.B.prototype;k.qr=function(a,b){this.input.value.length?this.Oa?this.mq(b):this.oa(void 0,void 0,b):this.$c();return!1};k.Sy=function(a){return this.qr(null,a)};k.mq=function(a){var b=this.Oa.mx,b=this.Oa.qm+(0<=this.Oa.qm.indexOf(b)?"&":b)+encodeURIComponent(this.Oa.vx)+"="+encodeURIComponent(this.input.value);(a=Ie(a))&&(b+="&"+a);this.Oa.Zw?window.open(b):window.location=b}; +k.Gk=function(){this.Sc&&!this.Uy&&(!this.Db||1<this.Z.length)&&(this.Sc.className="gsc-tabsArea");!this.Pc||1==this.Z.length&&0==this.Z[0].$a.length||(this.Pc.className=this.yq)};k.Ys=function(a){var b=this;return function(c,d){if(d){b.Wa[a].se=1;var f=0,e=0;b.Ed(function(a,b){b.enabled&&b.Eq&&(f++,b.se&&e++)});f==e?(window.clearTimeout(b.Pt),b.Fk()):1==e&&(b.Pt=window.setTimeout(function(){b.Fk()},200))}}};k.Ii=function(){return null};google.search.B.prototype.getPartnerId=google.search.B.prototype.Ii; +google.search.B.prototype.Uw=function(){var a=ie("","gsc-input"),b=ue(null,"gsc-input",null);b.style.display="none";b.style.background=google.search.Ca.Ku();r(a,b);r(this.root,a);var c="";document.defaultView&&document.defaultView.getComputedStyle?(b=document.defaultView.getComputedStyle(b,null))&&(c=b.backgroundImage||""):b.currentStyle&&(c=b.currentStyle.backgroundImage||"");-1!=c.search(google.search.H.Lr)&&(this.Jg=!0,this.Xa&&this.Xa.Vq(Ge("gcsc-",void 0,!1,"http://cse.google.com/cse/?hl="+google.search.CurrentLocale, +p["custom-search"])),this.cb&&this.cb.Vq(Ge("gcsc-",void 0,!1,"http://cse.google.com/cse/?hl="+google.search.CurrentLocale,p["custom-search"])));this.root.removeChild(a)};google.search.B.prototype.$i=function(a){if(this.ye)this.ue.pd(a);else if(this.input.value=a,this.input.onfocus)this.input.onfocus(null)};google.search.B.prototype.prefillQuery=google.search.B.prototype.$i;google.search.B.prototype.Ax=function(a){a?this.$i(a):a=this.ye?this.ue.hb():this.input.value;return a}; +google.search.B.prototype.op=function(){return this.ye?this.ue.hb():this.input.value};google.search.B.prototype.getInputQuery=google.search.B.prototype.op;google.search.B.prototype.oa=function(a,b,c){if(!this.Oa){var d=this.vp(this.Ak,this.zk);d&&this.Bf(d)}this.Oo(a,b,c)};google.search.B.prototype.execute=google.search.B.prototype.oa;k=google.search.B.prototype;k.Oo=function(a,b,c,d,f){a=this.Ax(a);this.Zk(a,b,c,d,f)}; +k.Zk=function(a,b,c,d,f){if(a.length){this.Ng=!1;this.hf=a;this.wh=b||1;this.jh&&this.um();this.jb&&this.jb.isEnabled()&&(d=d||this.jb.mh(),d[google.search.History.qg]=a,null==b?delete d[google.search.History.Wc]:d[google.search.History.Wc]=b,this.cc&&this.Y.rb instanceof google.search.G&&(d[google.search.History.Rh]=this.od[this.ve].key),this.jb.pushState(d));this.me=google.loader.createGuidArg_();d=!1;if(this.fb==google.search.B.fc)d=this.Po(this.Y.Ib,this.Y.Bb,a,f,b,c)||d;else for(var e=0;e<this.Z.length;e++)d= +this.Po(this.Z[e],this.Z[e].root,a,f,b,c)||d;f=this.Ar(a,b);d||!f?(f="",c&&c.gs_l&&23<c.gs_l.split(".").length&&(f=c.gs_l.split(".")[23]),this.Yk(a,b,f)):this.jq()}};k.Ru=function(){return this.me}; +k.Yk=function(a,b,c){var d=this.zd;d&&(this.Sv&&this.fb==google.search.B.Dc||this.fb==google.search.B.fc&&this.Fh(this.Y.rb))&&(d=!1);var f=this.zw(),e=this.yw();void 0!=f||this.Zc||this.Zo||(d=!1);this.fb!=google.search.B.fc&&(this.Wa[google.search.Fa.Ab].enabled=!1);if(d)if(this.hy(),this.Zo){this.sh();this.Ed(function(a,b){b.wa.innerHTML=""});this.Da={};this.Da.pubId=this.Zc||"google-coop";this.Da.gcsc=!0;f?this.Da.cx=f:e&&(this.Da.cref=e);this.Da.hl=google.search.CurrentLocale?encodeURIComponent(google.search.CurrentLocale): +null;this.Da.adtest=this.jk?"on":null;this.Da.channel=this.ei?this.ei:null;this.Da.adsafe=this.hk||null;this.Da.query=a;this.Da.adstyle=this.Xn?this.Xn:null;b&&(this.Da.adPage=b);this.gi&&(this.Da.cseExperiment=this.gi);this.Da.containerWidth=this.eq||this.yb.offsetWidth;this.Db&&(this.Da.cseGoogleHosting="full"==this.fi||"iframe"==this.fi||"partner"==this.fi?this.fi:"partner",this.Da.fontSizeDescription=google.search.B.Tm,this.Da.fontSizeDomainLink=google.search.B.Tm,this.Da.fontSizeTitle=google.search.B.Or); +window.___bg_&&document.getElementById("bgresponse")&&window.___bg_.exec&&(window.___bg_.exec(function(a){document.getElementById("bgresponse").value=a}),this.Da.bgresponse=document.getElementById("bgresponse").value,c&&(this.Da.sbsignals=c),window.___gcse_nc_&&(this.Da.gcse_nc=window.___gcse_nc_));if((b=google.search.A.tl())&&b in google.search.B.td){b=google.search.B.td[b];for(var g in b)this.Da[g]=b[g]}google&&google.ads&&google.ads.search&&google.ads.search.Ads?this.Dq():this.mm=!0}else{g=""; +this.Wa[google.search.Fa.kc].enabled&&(g=g+"w"+this.Wa[google.search.Fa.kc].md);this.Wa[google.search.Fa.Qb].enabled&&(g=g+"n"+this.Wa[google.search.Fa.Qb].md);g="http://www.google.com/"+(f?"cse":"search")+"?output=js&num=0&ie=utf8&oe=utf8&q="+encodeURIComponent(a)+"&hl="+encodeURIComponent(google.search.CurrentLocale)+"&ad="+encodeURIComponent(g)+"&js=uds&"+this.me;f&&(g+="&cx="+f);this.Zc&&(g+="&client="+encodeURIComponent(this.Zc));this.ei&&(g+="&channel="+encodeURIComponent(this.ei));this.jk&& +(g+="&adtest=on");this.$n&&(g+="&ip="+encodeURIComponent(this.$n));this.hk&&(g+="&adsafe="+encodeURIComponent(this.hk));this.bo&&(g+="&useragent="+encodeURIComponent(this.bo));b&&(g+="&adpage="+encodeURIComponent(b+""));var h=this;window.google_afs_request_done=function(a){h.$w(a)};be(g)}};k.Ed=function(a){for(var b in google.search.Fa)if(google.search.Fa.hasOwnProperty(b)){var c=google.search.Fa[b];a.call(this,c,this.Wa[c])}}; +k.Dq=function(){var a=[];this.Ed(function(b,c){c.se=0;if(c.enabled&&0<c.md){c.Eq=!0;c.pm={container:c.wa,number:c.md,callback:this.Ys(b),position:b};for(var d in c.wj)null!=c.pm[d]&&(c.pm[d]=c.wj);a.push(c.pm)}else c.Eq=!1;b==google.search.Fa.Ab&&this.Zy(this.Y.Ib);c.wa.className="gsc-adBlockNoHeight";c.wa.style.height="0px"});0<a.length&&new google.ads.search.Ads(this.Da,a)}; +k.Po=function(a,b,c,d,f,e){b=a.J;this.Im&&this.Im(this,b,c);this.sm&&this.sm(this,b,c);b.rd&&(b.rd=null);var g=!1;if(d)b.ej(d);else{d={};if(e)for(var h in e)d[h]=e[h];for(h in this.Zn)d[h]||(d[h]=this.Zn[h]);this.Db&&this.Zc&&(d.cseclient=this.Zc);g=b.oa(c,d,f)}this.vj(a,g);return g};k.zw=function(){for(var a=0;a<this.Z.length;a++){var b=this.Z[a].J;if("web"==b.ta&&b.O&&b.Vg()==google.search.G.Pe)return b.Wg()}return null}; +k.yw=function(){for(var a=0;a<this.Z.length;a++){var b=this.Z[a].J;if("web"==b.ta&&b.O&&b.Vg()==google.search.G.Kc)return b.Wg()}return null}; +k.$w=function(a){window.google_afs_request_done=null;var b=this.Wa[google.search.Fa.kc],c=this.Wa[google.search.Fa.Qb];if(b.wa)if(b.wa.innerHTML="",c.wa.innerHTML="",b.se=c.se=0,!a||1>a.length)this.sh();else{if(!this.Sc)for(var d=0;d<this.Z.length;d++){var f=this.Z[d].J;if(this.Fh(f)){this.sh();return}}b.wa.className=b.className;var f=!1,e=document.createElement("h2"),d="";this.jk&&(d="*DEBUG* ");d+=p["ads-by-google"];e.innerHTML=d;r(b.wa,e);for(var g=a.length,d=0;d<g;d++){var h=a[d];if("text/wide"== +h.type){b.se++;var l=B("gsc-ad"),m=pe(h.url,h.line1,google.search.A.kg);r(l,m);m=document.createElement("cite");m.innerHTML=h.visible_url;r(l,m);m=je();m.innerHTML=h.line2;r(l,m);r(b.wa,l)}else c.enabled&&(c.se++,f||(f=!0,K(this.Bc,c.Yb),r(c.wa,e.cloneNode(!0)),c.wa.className=c.className),l=B("gsc-ad"),m=pe(h.url,h.line1,google.search.A.kg),r(l,m),m=je(),m.innerHTML=h.line2+"<br/>"+h.line3,r(l,m),m=document.createElement("cite"),m.innerHTML=h.visible_url,r(l,m),r(c.wa,l))}c.enabled&&!f&&Y(this.Bc, +c.Yb);this.Sc&&(f=this.Y.rb,this.Fh(f)&&this.sh());this.Eh&&this.Iq&&this.Eh(this,"ads")}};k.ex=function(){var a=this.input.value;a&&""!=a&&(this.df&&window.clearTimeout(this.df),this.df=window.setTimeout($d(this,google.search.B.prototype.oa,[null]),this.Aj))};k.fx=function(){this.df&&window.clearTimeout(this.df);this.df=window.setTimeout($d(this,google.search.B.prototype.oa,[null]),this.Aj)}; +k.hy=function(){var a=google.search.Fa,b={};if(this.Wa[a.kc].enabled)switch(this.ik){case google.search.A.Ec:b[a.kc]=3;b[a.Qb]=5;b[a.Ab]=3;break;case google.search.A.hc:b[a.kc]=2;b[a.Qb]=4;b[a.Ab]=2;break;default:b[a.kc]=1,b[a.Qb]=2,b[a.Ab]=1}else switch(b[a.kc]=0,this.ik){case google.search.A.Ec:b[a.Qb]=8;b[a.Ab]=3;break;case google.search.A.hc:b[a.Qb]=6;b[a.Ab]=2;break;case google.search.A.Xb:b[a.Qb]=3;b[a.Ab]=1;break;default:b[a.Qb]=6,b[a.Ab]=2}this.Ed(function(a,d){void 0==d.md&&(d.md=b[a])})}; +k.Ha=function(a){if(0<a&&8>=a)this.rf=a;else switch(a){case google.search.A.hc:this.rf=google.search.A.hc;break;case google.search.A.Ec:this.rf=google.search.A.Ec;break;default:case google.search.A.Xb:this.rf=google.search.A.Xb}for(var b=0;b<this.Z.length;b++)this.Z[b].J.Ha(a);this.ik=a};google.search.B.prototype.setResultSetSize=google.search.B.prototype.Ha;google.search.B.prototype.Sa=function(a){this.kd=a;for(var b=0;b<this.Z.length;b++)this.Z[b].J.Sa(a)}; +google.search.B.prototype.setLinkTarget=google.search.B.prototype.Sa;google.search.B.prototype.xf=function(a){for(var b=0;b<this.Z.length;b++)this.Z[b].qb.xf(a)};google.search.B.prototype.setNoResultsString=google.search.B.prototype.xf;k=google.search.B.prototype;k.ix=function(a){a.$k?this.yf(a,!1):this.yf(a,!0)}; +k.yf=function(a,b,c){b?(Y(a.xe,"gsc-twiddle-closed"),K(a.xe,"gsc-twiddle-opened"),a.$k=!0,a.kb.style.display="block"):(Y(a.xe,"gsc-twiddle-opened"),K(a.xe,"gsc-twiddle-closed"),a.$k=!1,a.kb.style.display="none",fe(a.qh,c?he("(0)"):he("("+a.J.results.length+")")))};k.bx=function(a){this.uj(a,!1,!0);return!1};k.hx=function(a){a.J.Ne&&(a.tk?this.uj(a,!1,!0):this.uj(a,!0,!0))}; +k.uj=function(a,b,c){b?a.Sb&&a.J.Jc&&(K(a.Sb,"gsc-twiddle-opened"),Y(a.Sb,"gsc-twiddle-closed"),a.Sb.innerHTML=p.close,a.tk=!0,a.Ad.style.display="block",a.J.Jc(a.Oe,!0)):a.Sb&&a.J.Jc&&(Y(a.Sb,"gsc-twiddle-opened"),K(a.Sb,"gsc-twiddle-closed"),a.Sb.innerHTML=p.blank,a.tk=!1,a.J.Jc(a.Oe,!1),a.Ad.style.display="none",c&&this.oa())};k.gx=function(a){this.Yi&&this.Yi(a)};k.mt=function(){this.Ng=!0};google.search.B.prototype.cancelSearch=google.search.B.prototype.mt; +google.search.B.prototype.Am=function(a){if(a){if(this.Qd.className="gsc-resultsbox-visible",K(this.yb,"gsc-results-wrapper-visible"),this.sf&&K(this.sf,"gsc-results-close-btn-visible"),this.kf){K(this.kf,"gsc-modal-background-image-visible");var b=document.getElementsByTagName("body")[0];K(b,"gsc-overflow-hidden")}}else this.Qd.className="gsc-resultsbox-invisible",Y(this.yb,"gsc-results-wrapper-visible"),this.sf&&Y(this.sf,"gsc-results-close-btn-visible"),this.kf&&(Y(this.kf,"gsc-modal-background-image-visible"), +b=document.getElementsByTagName("body")[0],Y(b,"gsc-overflow-hidden"));for(b=0;b<this.Z.length;b++)this.Z[b].Nl||(a?(Y(this.Z[b].root,"gsc-resultsbox-invisible"),K(this.Z[b].root,"gsc-resultsbox-visible")):(Y(this.Z[b].root,"gsc-resultsbox-visible"),K(this.Z[b].root,"gsc-resultsbox-invisible")))}; +google.search.B.prototype.$c=function(){this.ye?this.ue.pd(""):this.input.value="";this.wh=this.hf=null;if(this.oc!=google.search.B.ng&&(this.oc==google.search.B.mg&&(this.root.style.visibility="hidden"),this.Am(!1),this.Sc&&(this.Sc.className="gsc-tabsAreaInvisible"),this.Pc&&(this.Pc.className=this.lm),this.Ed(function(a,c){c.wa&&(c.wa.className="gsc-adBlockInvisible",c.Yb&&Y(this.Bc,c.Yb))}),this.Ig.className="gsc-above-wrapper-area-invisible",this.jb&&this.jb.isEnabled())){var a=this.jb.mh(); +delete a[google.search.History.Wc];delete a[google.search.History.qg];this.jb.pushState(a)}};google.search.B.prototype.clearAllResults=google.search.B.prototype.$c;google.search.B.prototype.bu=function(){var a=google.search.F.element.cm(window.location.search)||{};if(!a.query)return!1;a.refine&&(this.zk=a.refine);a.image&&(this.Ak=1==a.image?google.search.H.dn:google.search.H.Vn);a.sortBy&&(this.ie=this.xl(a.sortBy)||0);return this.jo=!0};google.search.B.prototype.enableBookmark=google.search.B.prototype.bu; +k=google.search.B.prototype;k.xm=function(a,b,c,d,f){a=a.yc?a.yc(b):b;d?(b={},b[d]=f,d=$d(this,this.oa,[a,void 0,b])):d=$d(this,this.oa,[a]);xe(c,d)};k.xr=function(){this.cc.className=this.Db&&this.Y.Ib.J instanceof google.search.G?"gsc-orderby":"gsc-orderby-invisible"};k.wr=function(){this.Id.className=this.Db?"gsc-getlink":"gsc-getlink-invisible"}; +k.po=function(a){var b=function(a,b){for(var f=a.firstChild;f;){var e=f.nextSibling;f!=b&&a.removeChild(f);f=e}};b(a.xa,this.Wa[google.search.Fa.Ab].wa);b(a.kb,a.xa)}; +k.pb=function(a){this.oc==google.search.B.mg&&(this.root.style.visibility="visible");this.vj(a,!1);this.Am(!0);var b,c,d=!1,f;if(!this.Ng){this.po(a);var e=["gsc-results",a.J.je()].join(" ");a.kb.className=e;this.yf(a,!1,!0);this.uj(a,!1,!1);a.wm(google.search.eb.bk);this.Rd.lo&&(c=a.J.ki)&&a.kb.insertBefore(c.cloneNode(!0),a.xa);if(e=a.J.spelling)if(!e.html&&a.J.Tg&&a.J.Tg(e),e.html){var g=e.html.cloneNode(!0),h=g.getElementsByTagName("a");e.type&&"SPELL_CORRECTED_RESULTS"==e.type?h&&1<h.length&& +(this.xm(a.J,e.correctedQuery,h[0],e.correctedParamName,e.correctedParamValue),this.xm(a.J,e.originalQuery,h[1],e.originalParamName,e.originalParamValue)):h&&0<h.length&&this.xm(a.J,e.correctedQuery,h[0]);f=B(a.J.je());K(f,"gsc-result");r(f,g);a.kb.insertBefore(f,a.xa)}e=a.J.context||{};h=this.Sc&&e;this.Db&&!this.Us&&h&&(c=e.title,f=this.jd(a),c&&!f.J.ec&&fe(f.Ja.ua,this.yo(google.search.V.we(c))),this.Us=!0);var l=a.J.promotions;if(l&&0<l.length)for(c=0;c<l.length;c++)b=l[c],b.html||a.J.pi(b,this.Rd), +b.html&&(f=B(a.J.je()),K(f,"gsc-result"),K(f,"gsc-promotion"),g=b.html.cloneNode(!0),r(f,g),a.kb.insertBefore(f,a.xa));l=a.J.results;a.J.Dd&&400<=a.J.completionStatus?(l=[],l.push(a.J.tu())):0==l.length&&a.qb.re&&200==a.J.completionStatus&&(l=[],l.push(a.J.uu(a.qb.re)));this.Ig.className="gsc-above-wrapper-area";this.Ro(a.J);this.pa&&this.nu();this.cc&&this.xr();this.Id&&this.wr();c=this.Y&&this.Y.rb&&"Web"==this.Y.rb.ec&&0<a.J.results.length&&0===a.J.cursor.currentPageIndex;if(e.html&&c){f=B(a.J.je()); +K(f,"gsc-result");g=e.html.cloneNode(!0);r(f,g);c=Z(f,"div","gsc-facet-label");for(var m=0;m<c.length;m++)if(b=c[m]){var q=b.getElementsByTagName("a"),g=this.jd(a);b=0;for(var t;t=q[b];b++){var v=t.getAttribute("data-refinementLabel");if(v!=a.J.nc()){var y=t.getAttribute("label-with-op");y||(y=v);xe(t,$d(this,this.Em,[g,y]))}else K(t,"gs-labelActive")}}a.kb.insertBefore(f,a.xa)}ye()&&(this.Ib=a);for(c=0;c<l.length;c++)if(b=l[c],b.html||a.J.Qa(b),b.html){d=!0;f=B(a.J.je());K(f,"gsc-result");a.J.Lh&& +K(f,"gsc-result-"+a.J.Lh);g=b.html.cloneNode(!0);if(b.GsearchResultClass==google.search.va.Va&&a.qb.Hj)for(m=g.getElementsByTagName("img"),q=0;q<m.length;q++)google.search.A.dc(b.tbWidth,b.tbHeight,a.qb.Hj,m[q]);r(f,g);this.Jo&&(g=Z(f,"div","gs-richsnippet-box")[0])&&(g.style.display="block",m=je(p["structured-data"],"gsc-richsnippet-showsnippet-label"),r(g,m),xe(m,$d(this,this.Gy,[b.url,b.richSnippet])));(g=Z(f,"div","gs-per-result-labels")[0])&&(m=Z(g,null,"gs-add-label")[0])&&xe(m,$d(this,this.Cy, +[b.url,b.titleNoFormatting,g]));if(b.perResultLabels&&this.Db&&(g=Z(f,"div","gs-per-result-labels")[0]))for(q=g.getElementsByTagName("a"),g=this.jd(a),m=ye()?1:0;t=q[m];m++)v=t.getAttribute("data-refinementLabel"),v!=a.J.nc()?((y=t.getAttribute("label-with-op"))||(y=v),xe(t,$d(this,this.Em,[g,y]))):K(t,"gs-labelActive");this.Yi&&(g=this.Ul,m=x("","gsc-keeper"),m.innerHTML=g,r(f,m),m.onclick=$d(this,google.search.B.prototype.gx,[b,a]));c>=a.J.fm?(0==c&&a.qb.pc==google.search.B.Vd&&(a.xa.style.display= +"none"),(b=this.Wa[google.search.Fa.Ab].wa)&&b.parentNode==a.xa?a.xa.insertBefore(f,b):r(a.xa,f)):a.kb.insertBefore(f,a.xa)}a.J.Aa&&a.J.gwsUrl&&a.J.cursor&&(c=B("gsc-cursor-box gs-bidi-start-align"),c.dir="ltr",f=this.Et(a),c.appendChild(f),r(a.xa,c));d?(fe(a.qh,he("("+a.J.results.length+")")),a.qb.pc==google.search.B.Vd||a.qb.pc==google.search.B.Ae?this.yf(a,!0):this.yf(a,!1),(d=a.J.fp())&&r(a.kb,d)):(fe(a.qh,he("(0)")),this.po(a),this.yf(a,!1));a.qb.pc=a.qb.tq;this.Rd.lo||(c=a.J.ki)&&r(a.kb,c.cloneNode(!0)); +if(this.Db&&h&&(0==a.Ub||a.of)){g=this.jd(a);d=0==a.Ub&&this.ew(a);h=a.of&&1==g.$a.length;if(d||h){if(d&&this.rt(a),e.facets&&0<e.facets.length){d&&this.uo(a);f=!1;l=e.facets;if(l.length>this.Df&&0<e.display_facets.length&&-1!==this.Df)for(l.sort(function(a,b){return b.count-a.count}),c=l.length;c>this.Df;c--)l.pop();for(c=0;c<l.length;c++){e=l[c];b=e.label_with_op;if(!b||this.zk)b=e.label;d||h&&!a.J.ne(b)?this.wo(g,b,e.anchor):(a.J.Ac(e.anchor),this.kq(g),f=!0)}h&&!f&&this.kq(g)}}else if(a.of&&e.facets&& +0<e.facets.length)for(l=e.facets,c=0;c<l.length;c++)e=l[c],a.J.ne(e.label)&&a.J.Ac(e.anchor);a.of&&(a.of=!1)}this.Db&&this.Sc&&this.Y&&a==this.Y.Ib&&this.fr(a);this.Db&&this.Fx(a);this.Gk();this.Eh&&this.Eh(this,a.J)}};google.search.B.prototype.onSearchComplete=google.search.B.prototype.pb;k=google.search.B.prototype; +k.wo=function(a,b,c){var d=a.J,f=d.ni();f.mj(b);f.Ac(c);b=new google.search.Za;b.re=a.qb.re;this.Zd(f,b,a);f.Ha(d.Na);d.za&&f.Qq(d.za);d=a.$a[a.$a.length-1];this.vk(d,a);this.xo(d);K(d.Ja.Bb,"gsc-tabData");K(d.Ja.Bb,"gsc-tabdInactive");return d};k.Fx=function(a){var b=this.input.value;a=this.jd(a);if(a.$a)for(var c=0;c<a.$a.length;c++){var d=a.$a[c];fe(d.Ja.ua,this.yo(google.search.V.we(d.J.zl().replace(/\$q/g,b))))}};k.jd=function(a){return a.Ah||a}; +k.fr=function(a){a.Ic?(Y(a.Ic,"gsc-refinementBlockInvisible"),this.Y!=a.Lg&&(this.Y=a.Lg,this.Cf(this.Y))):a.Ah&&a.Ah.Ic&&Y(a.Ah.Ic,"gsc-refinementBlockInvisible")};k.ew=function(a){var b=a.J.context?a.J.context.facets:null;if(!b)return 0<a.$a.length;if(b.length!=a.$a.length)return!0;for(var c=0;c<b.length;c++){var d=b[c].label_with_op;d||(d=b[c].label);if(!a.$a[c].J.ne(d))return!0}return!1}; +k.rt=function(a){if(0!=a.$a.length){var b=a.Ic;ee(b);b.parentNode.removeChild(b);for(a.Ic=null;0<a.$a.length;)b=a.$a.pop(),ee(b.root),this.Qd.removeChild(b.root)}};k.Et=function(a){for(var b=B("gsc-cursor"),c=a.J.cursor,d=0;d<c.pages.length;d++){var f="gsc-cursor-page";d==c.currentPageIndex&&(f+=" gsc-cursor-current-page");f=x(c.pages[d].label,f);xe(f,$d(this,google.search.B.prototype.Nx,[a,d]));b.appendChild(f)}return b}; +google.search.B.xn={border:"border",borderColor:"border-color",borderStyle:"border-style",borderWidth:"border-width",borderTop:"border-top",borderTopColor:"border-top-color",borderTopStyle:"border-top-style",borderTopWidth:"border-top-width",borderRight:"border-right",borderRightColor:"border-right-color",borderRightStyle:"border-right-style",borderRightWidth:"border-right-width",borderBottom:"border-bottom",borderBottomColor:"border-bottom-color",borderBottomStyle:"border-bottom-style",borderBottomWidth:"border-bottom-width", +borderLeft:"border-left",borderLeftColor:"border-left-color",borderLeftStyle:"border-left-style",borderLeftWidth:"border-left-width",color:"color",cssFloat:"float",styleFloat:"float",clear:"clear",cursor:"cursor",display:"display",font:"font",fontFamily:"font-family",fontSize:"font-size",fontStyle:"font-style",fontWeight:"font-weight",height:"height",margin:"margin",marginTop:"margin-top",marginRight:"margin-right",marginBottom:"margin-bottom",marginLeft:"margin-left",overflow:"overflow",padding:"padding", +paddingTop:"padding-top",paddingRight:"padding-right",paddingBottom:"padding-bottom",paddingLeft:"padding-left",textAlign:"text-align",textDecoration:"text-decoration",textTransform:"text-transform",verticalAlign:"vertical-align",visibility:"visibility",width:"width"}; +google.search.B.Rp=function(a,b){if(Yd("safari")||Yd("konqueror"))alert("google.search.SearchControl.inlineCurrentStyle is not supported on Safari");else{var c=!0;b&&(c=b);if(c)for(c=0;c<a.childNodes.length;c++)google.search.B.Rp(a.childNodes[c],!0);if(1==a.nodeType){var d,f,e=!1,c=!1;window.getComputedStyle?(d=window.getComputedStyle(a,null),e=f=!0):a.currentStyle&&(d=a.currentStyle,f=!1,e=!0);if(e){for(var g in d)if(google.search.B.xn[g]){var e=google.search.B.xn[g],h=d[g];"display"==g&&"none"== +h&&(a.innerHTML="",c=!0);""!=d[g]&&(f?a.style.setProperty(e,h):a.style.setAttribute(e,h))}c&&!f&&(a.outerHTML='<div style="display:none"/>')}}}};google.search.B.inlineCurrentStyle=google.search.B.Rp;google.search.B.prototype.Gu=function(a){a=a?a:this.root;var b=null;window.getComputedStyle?b=window.getComputedStyle(a,null):a.currentStyle?b=a.currentStyle:document.defaultView.getComputedStyle&&(b=document.defaultView.getComputedStyle(a,null));return b?parseInt(b.width,10):300}; +google.search.B.prototype.Gh=function(a,b){this.Eh=de(a,b)};google.search.B.prototype.setSearchCompleteCallback=google.search.B.prototype.Gh;google.search.B.prototype.vy=function(a,b){this.sm=de(a,b)};google.search.B.prototype.setSearchStartingCallback=google.search.B.prototype.vy;google.search.B.prototype.dr=function(a,b){this.Im=de(a,b)};google.search.B.prototype.setTrackingCallback=google.search.B.prototype.dr; +google.search.B.prototype.bm=function(a,b){a.wm(b);var c=!1;switch(b){default:case google.search.eb.dk:a.xa&&(a.xa.style.display="none");break;case google.search.eb.ck:a.xa&&(a.xa.style.display="block");a.J.Na!=google.search.A.Xb&&(c=!0);a.J.Ha(google.search.A.Xb);break;case google.search.eb.An:a.xa&&(a.xa.style.display="block"),a.J.Na!=google.search.A.hc&&(c=!0),a.J.Ha(google.search.A.hc)}c&&(c=this.input.value,c.length&&(this.Ng=!1,this.Gk(),a.qb.pc=google.search.B.Ae,this.vj(a,!0),a.J.oa(c)))}; +google.search.B.prototype.Nx=function(a,b){this.Ng=!1;this.Gk();this.vj(a,!0);a.qb.pc=google.search.B.Ae;this.wh=b+1;if(this.jb&&this.jb.isEnabled()){var c=this.jb.mh();c[google.search.History.Wc]=b+1;this.jb.pushState(c)}this.Yk(this.hf,b+1);a.J.Dp(b);this.jh&&this.um(this.wh);this.yb.scrollIntoView()}; +google.search.B.prototype.mr=function(a){!a||google.search.History.isSupported()&&google.search.History.cw()||a(this);a={};this.Oa||this.Zq(this.Y,a);this.hf&&(a[google.search.History.qg]=this.hf);this.wh&&(a[google.search.History.Wc]=this.wh);this.jb=new google.search.History(a,de(this,google.search.B.prototype.Kv));return this.jb.isEnabled()};google.search.B.prototype.startHistoryManagement=google.search.B.prototype.mr; +google.search.B.prototype.vp=function(a,b){var c=null;if(null==a||0>a||a>=this.Z.length)c=this.Y;else{var d=this.Z[a];if(d.J.O&&b){var f=b;d.J.ld&&(f=d.J.ld(b));c=this.To(d,f);c||(d.Ic||this.uo(d),c=this.wo(d,f,b),c.of=!0,c=c.Ja)}else c=d.Lg||d.Ja}return c}; +google.search.B.prototype.Kv=function(a){var b=this.vp(a[google.search.History.bi],a[google.search.History.Th]);if(b){if(this.cc){var c;null!=a[google.search.History.Rh]&&(c=this.xl(a[google.search.History.Rh]));null==c&&(c=this.ie);this.vm(c);this.qj(c,b.rb)}c=a[google.search.History.qg]||"";a=a[google.search.History.Wc];if(null==a||0>=a)a=1;this.Y==b?c?this.oa(c,a):this.$c():(this.Bf(b,{bj:c,page:a}),c||this.$c())}}; +google.search.B.prototype.Zq=function(a,b){for(var c=this.jd(a.Ib),d=0;d<this.Z.length;d++)if(this.Z[d]==c){b[google.search.History.bi]=d;break}c=a.rb;c.nc&&null!=c.nc()?b[google.search.History.Th]=c.nc():delete b[google.search.History.Th]}; +google.search.Ca=function(a,b,c){google.search.Ca.Rl++;var d=re("gsc-search-box");d.acceptCharset="utf-8";var f=null,e=p["search-uc"],g=p.search;c&&c.Ej&&c.Mg&&(e="");c&&(c.buttonText&&(g=e=c.buttonText),c.clickableBrandingUrl&&(f="http://www.google.com","string"==typeof c.clickableBrandingUrl&&c.clickableBrandingUrl.match(/^http:\/\/[a-z]*\.google\.com/)&&(f=c.clickableBrandingUrl),f=oe(f,null,"_BLANK"),f.className="gsc-branding-clickable"));if(c&&c.Ej)if(""==e){var e=google.loader.ServiceBase+"/css/v2/search_box_icon.png", +h=document.createElement("input");h.type="image";h.src=e;h.className="gsc-search-button gsc-search-button-v2";e=h}else e=te(e,"gsc-search-button");else e=se(e,"gsc-search-button");this.hj=e;this.hj.title=g;this.input=ue(null,"gsc-input",null);this.input.name="search";this.input.title=g;e=this.input;c&&c.Ej&&c.Mg&&(this.input.className="",this.input.style.width="100%",this.input.style.padding="0 2px 0 0",this.Ql=B("gsc-input-box"),this.Ql.id="gsc-iw-id"+google.search.Ca.Rl,r(this.Ql,this.input),e= +this.Ql);c&&c.Ej&&(this.input.id="gsc-i-id"+google.search.Ca.Rl);h=document.createElement("input");h.type="hidden";h.name="bgresponse";h.id="bgresponse";g=ke(null,null,"gsc-search-box");r(d,g);g=le(g,0);this.Ol=me(g,"gsc-input");var l=me(g,"gsc-search-button");r(this.Ol,e);r(this.Ol,h);r(l,this.hj);e=ke(null,null,"gsc-branding");r(d,e);h="gsc-branding-img-noclear";l=le(e,0);this.userDefinedCell=me(l,"gsc-branding-user-defined");var m=me(l,"gsc-branding-text"),e=me(l,h),q=x(p["powered-by"],"gsc-branding-text"), +t;t=google.loader.ServiceBase+"/css/small-logo.png";ce()?(h=B(h),h.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")',h.style.width="51px",h.style.height="15px"):h=ne(t,null,null,h);t=h;r(m,q);f?(r(f,t),r(e,f)):r(e,t);c&&c.Ns||(l.style.display="none");this.gj=d;ee(b);r(b,this.gj);a&&(h="gsc-branding-img",this.pk=x(p.blank,"gsc-clear-button"),this.pk.title=p["clear-results"],a=me(g,"gsc-clear-button"),r(a,this.pk),e.className=h,t.className=h)}; +da("google.search.SearchForm",google.search.Ca,void 0);google.search.Ca.Lj=("https:"==document.location.protocol?"https:":"http:")+"//www.google.com/cse/static/"+google.search.CurrentLocale+"/google_custom_search_watermark.gif";google.search.Ca.Pr="#FFFFFF "+google.search.V.Bn+" no-repeat";google.search.Ca.Ku=function(){return"#FFFFFF url("+google.search.Ca.Lj+") "+google.search.V.Bn+" no-repeat"};google.search.Ca.Rl=0; +google.search.Ca.prototype.ty=function(a,b){this.pr=$d(this,this.Ry,[this]);this.xj=$d(a,b,[this]);this.gj.onsubmit=this.pr;this.hj.onclick=this.pr};google.search.Ca.prototype.setOnSubmitCallback=google.search.Ca.prototype.ty;google.search.Ca.prototype.Tq=function(a,b){this.pk.onclick=$d(a,b,[this])};google.search.Ca.prototype.setOnClearCallback=google.search.Ca.prototype.Tq; +google.search.Ca.prototype.Ry=function(){var a=this.Ol.offsetWidth,b=this.input.value;this.xj&&this.xj();if(ce()){var c=this,d;d=8*b.length>=a?a-6:"99%";window.setTimeout(function(){c.input.style.width=d},1)}return!1};google.search.Ca.prototype.oa=function(a){a&&(this.input.value=a);this.xj&&this.xj()};google.search.Ca.prototype.execute=google.search.Ca.prototype.oa;google.search.H=function(a,b){this.vr=(new Date).getTime();google.search.B.call(this);b=b||{};this.Rd=google.search.A.Ju(b.forceV2LookAndFeel);this.Db=!0;this.gb=null!=b._enableApiary_?!!b._enableApiary_:!0;this.Ha(b.resultSetSize||google.search.A.hc);var c={};if(b.adoptions)for(var d in b.adoptions)b.adoptions.hasOwnProperty(d)&&(c[d]=b.adoptions[d]);c.iframes=!0;c.adtest=b.adtest||null;c.channel=b.adchannel||null;b.enableMobileLayout&&(c.includeSideAds=!1,c.numTopAds=2);window.innerWidth<google.search.H.gs&& +(c.includeSideAds=!1,c.numTopAds=2);this.Se(b.adclient||"",c);this.ii=b.autoCompleteOptions;this.ro=google.search.H.vo(a,this.ii);this.si=a;this.si||(this.si={crefUrl:"http://www.google.com/coop/tools/autocse?referer="+window.location},this.ez=!0);this.Ak=google.search.H.Vn;this.zk=b.defaultToRefinement;this.jh=(this.io=b.bookmarkOptions)?this.io.showBookmarkLink||!1:!1;this.Xa=null;if(!b.disableWebSearch||!b.enableImageSearch){var f={};b[google.search.A.La]&&(f[google.search.A.La]=b[google.search.A.La]); +b[google.search.A.Ya]&&(f[google.search.A.Ya]=b[google.search.A.Ya]);if(b.webSearchOptions)for(d in b.webSearchOptions)f[d]=b.webSearchOptions[d];this.hu(f)}this.cb=null;if(b.enableImageSearch){c={};b[google.search.A.Ya]&&(c[google.search.A.Ya]=b[google.search.A.Ya]);if(b.imageSearchOptions)for(d in b.imageSearchOptions)c[d]=b.imageSearchOptions[d];this.eu(c);b.defaultToImageSearch&&this.Xa&&(this.Ak=google.search.H.dn)}this.Xa&&this.cb&&this.Ac({web:p.web,image:p.image});b.googleAnalyticsOptions&& +b.googleAnalyticsOptions.queryParameter&&(this.Bl=b.googleAnalyticsOptions,this.dr(null,google.search.H.Wy));b.enableOrderBy&&(this.nq=!0,this.od=b.orderByOptions&&b.orderByOptions.keys&&0<b.orderByOptions.keys.length?b.orderByOptions.keys:[{key:"",label:p["order-by-relevance"]},{key:"date",label:p["order-by-date"]}],void 0!==f&&b.orderByOptions&&f["restrict-extended"]&&void 0!==f["restrict-extended"].sort&&(this.ie=this.xl(f["restrict-extended"].sort)||0),void 0==this.ie&&(this.ie=0));this.pq=b.overlayResults? +!0:!1;this.Jo=b.enableRichSnippets?!0:!1;this.Wo=!0};da("google.search.CustomSearchControl",google.search.H,void 0);Wd(google.search.H,google.search.B);google.search.H.Tj=(new Date).getTime();google.search.H.ee=null;google.search.H.co=!1;google.search.H.Pp=function(){var a=google.search.H;a.co||(a.ee=new Image,a.ee.onload=a.ee.onerror=a.ee.onabort=a.ee.ontimeout=function(){a.ee=null},a.ee.src="https://www.googleapis.com/generate_204",a.co=!0)};google.search.A.tl()&&google.search.H.Pp(); +google.search.H.prototype.hu=function(a){this.Xa||(this.Xa=new google.search.G,this.Xa.Wb(this.si),this.Xa.zj=p["custom-search"],this.Xa.gb=this.gb,this.Zd(this.Xa),a&&(a.resultSetSize&&this.Xa.Ha(a.resultSetSize),a[google.search.A.La]&&this.Xa.Ta(google.search.A.La,a[google.search.A.La]),a[google.search.A.Ya]&&this.Xa.Ta(google.search.A.Ya,a[google.search.A.Ya]),a.linkTarget&&this.Xa.Sa(a.linkTarget),a.queryAddition&&this.Xa.Gb(a.queryAddition)))}; +google.search.H.prototype.eu=function(a){this.cb||(this.cb=new google.search.C,this.cb.Wb(this.si),this.cb.gb=this.gb,this.Zd(this.cb),a&&(a.resultSetSize&&this.cb.Ha(a.resultSetSize),this.cb.wf(a.layout||google.search.D.wd),a[google.search.A.Ya]&&this.cb.Ta(google.search.A.Ya,a[google.search.A.Ya]),a[google.search.A.La]&&this.cb.Ta(google.search.A.La,a[google.search.A.La]),a.linkTarget&&this.cb.Sa(a.linkTarget),a.queryAddition&&this.cb.Gb(a.queryAddition)))}; +google.search.H.prototype.iy=function(a){this.ro="string"==typeof a?a:null};google.search.H.prototype.setAutoCompletionId=google.search.H.prototype.iy;google.search.H.vo=function(a,b){var c="string"==typeof a?a:null;if(b){var d={prefix:0,ordered:3,any:1},f=b.matchType;f&&d[f]&&(c=c+"+qptype:"+d[f]);if(d=b.validLanguages)for(d=d.split(","),f=0;f<d.length;++f)d[f]&&(c=c+"+lang:"+d[f])}return c};google.search.H.prototype.Ii=function(){return this.ro};google.search.H.prototype.getPartnerId=google.search.H.prototype.Ii; +google.search.H.et=function(a,b,c,d,f,e,g,h){return google.search.H.fo(a,b,c,{saytActor:d,callback:f,maxCompletions:e,styleOptions:h})};google.search.H.attachAutoCompletion=google.search.H.et; +google.search.H.fo=function(a,b,c,d){if(c instanceof google.search.B&&window.console)return window.console.log("We no longer support attachAutoCompletionWithOptions for SearchControl object"),{};a=google.search.H.vo(a,d);d=d||{};var f="string"==typeof c?Oe(c):c;b=Oe(b);if(!f)for(var e=b;e;)e=e.parentNode,Ne(e)&&(f=e);var e=Ud(),g={interfaceLanguage:google.search.CurrentLocale,saytSubmit:d.saytActor,maxSuggestions:d.maxCompletions,maxPromotions:d.maxPromotions,styleOptions:d.styleOptions,isLoggingWithHiddenFormFields:d.isLoggingWithHiddenFormFields, +saytKeyboardNavigationEnabled:d.saytKeyboardNavigationEnabled,saytExtraParameters:d.saytExtraParameters};(d=d.searchButton?Oe(d.searchButton):null)&&("submit"!=d.type?g.searchButton=d:window.console&&window.console.warn("Cannot associate searchButton with a button of type submit."));if(g.isLoggingWithHiddenFormFields&&!g.searchButton)return window.console&&window.console.warn('The "searchButton" option is required when "isLoggingWithHiddenFormFields" is true.'),{};d=c&&(c.execute||c.submit);Ne(f)? +(g.isLoggingWithHiddenFormFields=g.isLoggingWithHiddenFormFields||Re(Pe(f.action)),e.install(f,b,a,g)):e.vw(d?de(c,d):function(){},b,a,g);return{getInputQuery:e.hb,prefillQuery:e.pd}};google.search.H.attachAutoCompletionWithOptions=google.search.H.fo;google.search.H.prototype.Zt=function(a){if(this.ye){if(a)throw"Please use constructor of CustomSearchControl to pass in additional options.";this.ue.ea(!1)}};google.search.H.prototype.enableAutoCompletion=google.search.H.prototype.Zt; +google.search.H.prototype.wx=function(){var a=(new Date).getTime();if(window.googleLT_&&1==window.googleLT_%100){var b=google.search.H.Tj-window.googleLT_,c=this.vr-window.googleLT_,a=a-window.googleLT_;0<b&&0<c&&0<a&&google.loader.recordCsiStat(["asa_cse"],["cl."+b,"cc."+c,"cd."+a])}}; +google.search.H.prototype.Xg=function(a,b){var c=b;c||(c=new google.search.ra);c.Oq(google.search.B.fc);this.ez&&1==this.Z.length&&(this.Uy=!0);this.xf(google.search.B.tn);c.oc!=google.search.B.ng&&this.gb&&google.search.H.Pp();google.search.B.prototype.Xg.call(this,a,c);var c=this.Oa?"gsc-control-searchbox-only":"gsc-control-cse",d=this.root;this.Oa||(d=B(),this.root.parentNode&&this.root.parentNode.insertBefore(d,this.root),r(d,this.root),this.root.className="gsc-control-wrapper-cse");d.className= +c;K(d,c+"-"+google.search.CurrentLocale);this.wx();if(this.jo){c=google.search.F.element.cm(window.location.search)||{};d=parseInt(c.page,10);if(isNaN(d)||0>=d)d=1;this.oa(c.query,d,{bm_req:"1"})}};google.search.H.prototype.draw=google.search.H.prototype.Xg; +google.search.H.prototype.Zk=function(a,b,c,d,f){if(this.Oa)this.mq();else{var e=this.yb.offsetWidth;Y(this.Bc,"gsc-thinWrapper");this.Wo&&(e=this.qv(),this.Wo=!1);this.eq=e;var g=[[5,"a"],[10,"b"],[15,"c"]],h=0;try{var l=new Uint16Array(1);window.crypto.getRandomValues(l);h=Math.floor(l[0]/65536*100)}catch(t){h=Math.floor(100*Math.random())}this.gi=null;for(l=0;l<g.length;l++)if(h<g[l][0]){this.gi=g[l][1];break}g=!0;"c"==this.gi?(0<e&&(g=e>=google.search.H.ks),e={includeVerticalAds:g},this.Zl&&(e.numTopAds= +google.search.H.pn),this.Se(this.Zc,e)):e<google.search.H.ds?this.zd=!1:e<google.search.H.fs?this.Se(this.Zc,{includeVerticalAds:!1}):(g=e>=google.search.H.es,e={includeVerticalAds:g},this.Zl&&(e.numTopAds=google.search.H.pn),this.Se(this.Zc,e));if((new Date).getTime()-this.vr<google.search.H.Dr&&this.zd)try{var m=decodeURIComponent(window.location.href).replace(/\+/g," "),q=decodeURIComponent(a).replace(/\+/g," ");this.zd=-1!=m.indexOf(q)}catch(t){}google.search.B.prototype.Zk.call(this,a,b,c,d, +f)}};google.search.H.prototype.qv=function(){var a=ie(google.search.H.vu());a.style.fontFamily="arial";a.style.fontSize="16px";a.style.visibility="hidden";r(this.yb,a);var b=this.yb.offsetWidth;this.yb.removeChild(a);return b};google.search.H.vu=function(){for(var a="",a="a a a a a ",b=5;80>b;b*=2)a+=a;return a};google.search.H.prototype.Ac=function(a){"string"==typeof a?this.Xa?this.Xa.Ac(a):this.cb&&this.cb.Ac(a):(a.web&&this.Xa&&this.Xa.Ac(a.web),a.image&&this.cb&&this.cb.Ac(a.image))}; +google.search.H.prototype.setUserDefinedLabel=google.search.H.prototype.Ac;google.search.H.prototype.Zd=function(a,b,c){google.search.B.prototype.Zd.call(this,a,b,c);a.vf="gcsc"};google.search.H.prototype.addSearcher=google.search.H.prototype.Zd;google.search.H.prototype.Ot=function(){this.Se("",{numTopAds:0,numSideAds:0,_includeBottomAds_:!1});this.Iq=!1};google.search.H.prototype.disableAds=google.search.H.prototype.Ot;google.search.H.prototype.qy=function(){this.Zl=!0}; +google.search.H.prototype.setMoreAds=google.search.H.prototype.qy;google.search.H.prototype.Tu=function(){return this.cb};google.search.H.prototype.getImageSearcher=google.search.H.prototype.Tu;google.search.H.prototype.Dv=function(){return this.Xa};google.search.H.prototype.getWebSearcher=google.search.H.prototype.Dv;google.search.H.prototype.zp=function(a){var b=a.ta;"web"==b&&(b="");a.O&&a.nc()&&(b=b?b+":"+a.nc():a.nc());return b};google.search.H.prototype.getTrackingCategory=google.search.H.prototype.zp; +google.search.H.Wy=function(a,b,c){var d=document.location;c=[d.pathname,d.search,d.search?"&":"?",encodeURIComponent(a.Bl.queryParameter),"=",encodeURIComponent(c)];a.Bl.categoryParameter&&(b=a.zp(b))&&c.push("&",encodeURIComponent(a.Bl.categoryParameter),"=",encodeURIComponent(b));window._gaq&&"function"==typeof window._gaq.push?window._gaq.push(["_trackPageview",c.join("")]):window.console&&window.console.log("Google Analytics tracking was not correctly setup.")};google.search.H.Jr=""; +google.search.H.AUTO_PUBID=google.search.H.Jr;google.search.H.Vn=0;google.search.H.dn=1;google.search.H.ds=250;google.search.H.fs=500;google.search.H.ks=500;google.search.H.es=795;google.search.H.Dr=500;google.search.H.gs=480;google.search.H.prototype.Zl=!1;google.search.H.pn=4;google.search.H.Lr=new RegExp('^url\\("?'+google.search.Ca.Lj+'"?\\)$');google.search.va=function(){google.search.A.call(this);this.ta="video";this.Rc="/GvideoSearch";this.rc="http://video.google.com/videosearch";this.Kb=!1;this.Ne=!0;this.Jc=de(this,this.nd);this.Me="gsc-videoConfig";this.na=null};da("google.search.VideoSearch",google.search.va,void 0);Wd(google.search.va,google.search.A);google.search.va.Va="GvideoSearch";google.search.va.RESULT_CLASS=google.search.va.Va;google.search.va.$=[]; +google.search.va.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.va.$,e,b);google.search.va.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.va.RawCompletion=google.search.va.Pa;google.search.va.prototype.lc=function(a,b){return google.search.A.Ob(google.search.va.$,[this,a,b])}; +google.search.va.prototype.Zb=function(a,b,c){b=this.Nc(null==b?"google.search.VideoSearch.RawCompletion":b,c);this.Ma&&(a=a+" "+this.Ma);a="&q="+encodeURIComponent(a);this.Kb&&(a+="&scoring=d");this.Aa=a;c&&0!=c&&(this.Aa=this.Aa+"&start="+c);return b+a}; +google.search.va.prototype.Qa=function(a){a.html&&delete a.html;var b=B(this.Fd());K(b,"gs-result");var c=B("gs-image-box"),d=B("gs-text-box"),f=ke(),e=le(f,0),g=me(e,"gs-image-box"),e=me(e,"gs-text-box");r(g,c);r(e,d);r(b,f);f=google.search.A.dc(a.tbWidth,a.tbHeight,this.za);f=ne(a.tbUrl,f.width,f.height,"gs-image");g=oe(a.url,null,this.ya(),"gs-image");g.className="gs-image";r(g,f);r(c,g);c=pe(a.url,a.title,this.ya(),"gs-title");r(d,c);c=x(a.content,"gs-snippet");ce()&&(c.style.height="2.6em"); +r(d,c);c=x(this.Ue(new Date(a.published)),"gs-publishedDate");r(d,c);c=pe("http://"+a.publisher,a.publisher,this.ya(),"gs-publisher");r(d,c);a.html=b;this.Gc(a.html)};google.search.va.prototype.createResultHtml=google.search.va.prototype.Qa; +google.search.va.Lt=function(a,b){var c=null;if(a.playUrl&&""!=a.playUrl){var c=a.playUrl,d="gsc-video-player";b&&(d=b);if(Yd("opera")){var f=document.createElement("object");f.className=d;f.setAttribute("type","application/x-shockwave-flash");f.setAttribute("data",c)}else f=document.createElement("embed"),f.className=d,f.setAttribute("type","application/x-shockwave-flash"),f.setAttribute("src",c),a.videoType?"Google"==a.videoType?f.setAttribute("bgcolor","#000000"):f.setAttribute("wmode","transparent"): +f.setAttribute("bgcolor","#000000");c=B(b);c.appendChild(f)}return c};google.search.va.createPlayer=google.search.va.Lt;google.search.va.prototype.Hb=function(a){this.Kb=a==google.search.A.Vc?!0:!1};google.search.va.prototype.setResultOrder=google.search.va.prototype.Hb; +google.search.va.prototype.nd=function(a,b){if(b){if(null==this.na){var c=B("gsc-configSetting");this.na=ve(null,"0",this.Kb,"gsc-configSettingCheckbox");r(c,this.na);r(c,x(p["sort-by-date"],"gsc-configSettingCheckboxLabel"));var d=B("gsc-configSettingSubmit");r(d,se(p.close,"gsc-configSettingSubmit"));r(c,d);r(a,c)}else this.na.checked=this.Kb;this.na.focus()}else this.na&&(this.na.checked?this.Hb(google.search.A.Vc):this.Hb(google.search.A.og))};google.search.K=function(){google.search.A.call(this);this.ta="web";this.Rc="/GwebSearch";this.rc="http://www.google.com/search";this.Ia=this.dd=this.he=null;this.ha={};this.S=new google.search.gc};da("google.search.WebSearch",google.search.K,void 0);Wd(google.search.K,google.search.A);google.search.K.Va="GwebSearch";google.search.K.RESULT_CLASS=google.search.K.Va;google.search.K.Pe="cx";google.search.K.cxRestriction_CX=google.search.K.Pe;google.search.K.Kc="cref"; +google.search.K.cxRestriction_CREF=google.search.K.Kc;google.search.K.yk="none";google.search.K.cxRestriction_NONE=google.search.K.yk;google.search.K.$=[];google.search.K.Sd={as_dt:!0,as_epq:!0,as_eq:!0,as_lq:!0,as_nlo:!0,as_nhi:!0,as_oq:!0,as_q:!0,as_qdr:!0,as_rq:!0,as_sitesearch:!0,cr:!0,c2coff:!0,filter:!0,gl:!0,hq:!0,lr:!0,query:!0,richsnippet:!0,sort:!0,usg:!0};google.search.K.Kj=20;google.search.K.Ud="data-cturl";google.search.K.Td="data-ctorig"; +google.search.K.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.K.$,e,b);google.search.K.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.K.RawCompletion=google.search.K.Pa;google.search.K.prototype.ni=function(){var a=new google.search.K;this.oi(a);a.Ia=this.Ia;a.ha=this.ha;a.S=this.S.clone();a.O=this.O;return a};google.search.K.prototype.ej=function(a){var b=google.search.A.Ob(google.search.K.$,[this,null,null]);google.search.K.Pa(b,a,200,void 0,200)}; +google.search.K.prototype.renderJson=google.search.K.prototype.ej;k=google.search.K.prototype;k.ld=function(a){a=He(a);return a.replace(/\s+/g,"_").toLowerCase()};k.ne=function(a){return this.O?this.S.Ga==this.ld(a):!1};k.yc=function(a){return this.O&&this.S.Ga?a.replace(new RegExp(" more:"+this.S.Ga+"$"),""):a};k.lc=function(a,b){return google.search.A.Ob(google.search.K.$,[this,a,b])}; +k.oa=function(a,b,c){window.console&&window.console.log&&window.console.log("The Google Web Search API has been officially deprecated. For more information on its deprecation, see https://developers.google.com/web-search/. We suggest you migrate to the Google Custom Search API. (see https://developers.google.com/custom-search/)");return google.search.A.prototype.oa.call(this,a,b,c)};google.search.K.prototype.execute=google.search.K.prototype.oa; +google.search.K.prototype.Zb=function(a,b,c){b=null==b?"google.search.WebSearch.RawCompletion":b;a=[a];this.Ma&&a.push(this.Ma);a=a.concat(this.S.ce()).join(" ");if(this.O&&this.he){var d=this.he,d=d.replace(/__HL__/,google.search.CurrentLocale);this.dd=d=d.replace(/__QUERY__/,encodeURIComponent(a))}var d=this.S.$d(),f=[],e;for(e in d)f.push(e+"="+d[e]);e="&"+f.join("&");e+="&q="+encodeURIComponent(a);this.Ia&&(e+="&safe="+this.Ia);this.ha&&(a=Ie(this.ha))&&(e+="&"+a);b=this.Nc(b,c);b+=e;this.Aa= +e;c&&0!=c&&(this.Aa=this.Aa+"&start="+c);window.google.loader.GoogleLocale&&(b=this.gb&&this.O?b+("&googlehost="+encodeURIComponent(window.google.loader.GoogleLocale)):b+("&gl="+encodeURIComponent(window.google.loader.GoogleLocale)));return b}; +google.search.K.prototype.Tg=function(a){a.html&&delete a.html;var b;if(a.type&&"SPELL_CORRECTED_RESULTS"==a.type){b=B("gs-result");var c=ie(p["showing-results-for"]+" ","gs-spelling"),d=document.createElement("a");d.innerHTML=google.search.V.Af(this.yc(a.correctedAnchor));c.appendChild(d);b.appendChild(c);c=ie(p["search-instead-for"]+" ","gs-spelling");K(c,"gs-spelling-original");d=document.createElement("a");d.innerHTML=google.search.V.Af(this.yc(a.originalAnchor));c.appendChild(d)}else b=ie(p.dym+ +" ","gs-spelling"),K(b,"gs-result"),c=document.createElement("a"),c.innerHTML=google.search.V.Af(this.yc(a.anchor));b.appendChild(c);a.html=b};google.search.K.prototype.createSpellingHtml=google.search.K.prototype.Tg;google.search.K.prototype.Sg=function(a,b){var c=x(google.search.V.we(a.visibleUrl),"gs-visibleUrl");r(b,c);K(c,"gs-visibleUrl-short");c=x(google.search.V.we(a.url),"gs-visibleUrl");r(b,c);K(c,"gs-visibleUrl-long")}; +google.search.K.prototype.Rg=function(a,b){var c=me(a,"gs-promotion-image-cell"),d=B("gs-promotion-image-box");r(d,b);r(c,d)}; +google.search.K.prototype.pi=function(a,b){a.html&&delete a.html;var c=B("gs-promotion");K(c,"gs-result");var d=ke(0,1,"gs-promotion-table"),f=le(d,0),e;r(c,d);var g;a.image&&(d=a.image.url.replace("resize_w=40","resize_w=60"),d=d.replace("resize_h=40","resize_h=60"),d=ne(d,null,null,"gs-promotion-image"),a.url&&(e=oe(a.url,"",this.ya()),a.clicktrackUrl&&google.search.K.Yc(e,a.clicktrackUrl,a.url),r(e,d),d=e),g=d,b.gf||google.search.K.prototype.Rg(f,g));d=null;a.clicktrackUrl&&(d={},d[google.search.K.Ud]= +a.clicktrackUrl,d[google.search.K.Td]=a.url);d=pe(a.url,a.title,this.ya(),"gs-title",void 0,d);a.titleRight&&(e=je("","gs-promotion-title-right"),e.innerHTML=" "+a.titleRight,r(d,e));d.dir=google.search.V.fh(d.innerHTML);K(d,"gs-bidi-start-align");e=me(f,b.gf&&a.image?"":"gs-promotion-text-cell");r(e,d);b.Wi&&google.search.K.prototype.Sg(a,e);var h;b.gf&&a.image?(d=ke(0,0,"gs-promotion-table-snippet-with-image"),f=le(d,0),r(e,d),google.search.K.prototype.Rg(f,g),h=me(f,"gs-promotion-text-cell-with-image")): +a.bodyLines&&(h=B(),r(e,h));if(a.bodyLines){f=a.bodyLines;g="right"==a.bodyLinkAlignment;for(var l=0;l<f.length;l++){var m=f[l],q=m.title,t=m.url,v=m.visibleUrl,d=B("gs-snippet"),y;q&&(y=je(""),y.innerHTML=q);var u;t&&v&&(u=oe(t,"",this.ya()),m.clicktrackUrl&&google.search.K.Yc(u,m.clicktrackUrl,t),m=je("","gs-title"),m.innerHTML=v,r(u,m));y&&g&&(r(d,y),u&&r(d,he(" ")));u&&r(d,u);y&&!g&&(u&&r(d,he(" ")),r(d,y));d.dir=google.search.V.fh(d.innerHTML);K(d,"gs-bidi-start-align");r(h,d)}}b.Wi||google.search.K.prototype.Sg(a, +e);a.html=c};google.search.K.prototype.createPromotionHtml=google.search.K.prototype.pi;google.search.K.prototype.Qg=function(a){delete a.html;0<a.display_facets.length&&(a.html=google.search.ga.ma("facets",a))};google.search.K.prototype.createFacetResultHtml=google.search.K.prototype.Qg; +google.search.K.prototype.Qa=function(a){a.html&&delete a.html;a.target=this.ya()||void 0;a.title=a.title||a.visibleUrl;a.html=google.search.ga.ma("webResult",a,{isLabelUrl:ye()});if(a.clicktrackUrl)for(var b=a.html.firstChild;b;b=b.nextSibling)if(1==b.nodeType){"a"==b.tagName.toLowerCase()&&b.href==a.unescapedUrl&&google.search.K.Yc(b,a.clicktrackUrl,a.unescapedUrl);for(var c=b.getElementsByTagName("a"),d=0,f;f=c[d];d++)f.href==a.unescapedUrl&&google.search.K.Yc(f,a.clicktrackUrl,a.unescapedUrl)}this.Gc(a.html)}; +google.search.K.prototype.createResultHtml=google.search.K.prototype.Qa;google.search.K.Yc=function(a,b,c){a.setAttribute(google.search.K.Ud,b);a.setAttribute(google.search.K.Td,c)};google.search.K.prototype.Wb=function(a,b,c){this.Dd=null;this.S=google.search.jc.ri(a,b);this.S instanceof google.search.Cc&&(this.O=!0,this.S.type()==google.search.K.Kc&&(this.Dd=p["linked-cse-error-results"]),c&&c.match(/__HL__/)&&c.match(/__QUERY__/)&&(this.he=c))};google.search.K.prototype.setSiteRestriction=google.search.K.prototype.Wb; +k=google.search.K.prototype;k.Vg=function(){return this.O?this.S.type():null};k.Wg=function(){return this.O?this.S.pf:null};k.nc=function(){return this.O?this.S.Ga:null};k.mj=function(a){this.O&&a&&this.S.sj(a)};k.Ta=function(a,b){a==google.search.A.Ya&&(this.Ia=b?b==google.search.A.Cg||b==google.search.A.Bg||b==google.search.A.Zj?b:null:null);if(a==google.search.A.La)if(b)for(var c in b){var d=b[c];google.search.K.Sd[c]&&(this.ha[c]=d)}else this.ha={}};google.search.K.prototype.setRestriction=google.search.K.prototype.Ta; +google.search.K.prototype.Ha=function(a){isNaN(parseInt(a,10))||(a=parseInt(a,10));this.O&&(0<a&&a<=google.search.K.Kj||google.search.A.Ec==a)?this.Na=a:google.search.A.prototype.Ha.call(this,a)};google.search.K.prototype.setResultSetSize=google.search.K.prototype.Ha;google.search.K.prototype.Sa=function(a){google.search.A.prototype.Sa.call(this,a)};google.search.K.prototype.setLinkTarget=google.search.K.prototype.Sa; +google.search.K.prototype.Gb=function(a){google.search.A.prototype.Gb.call(this,a)};google.search.K.prototype.setQueryAddition=google.search.K.prototype.Gb;google.search.G=function(){google.search.A.call(this);this.ta="web";this.Rc="/GcustomwebSearch";this.rc="http://www.google.com/search";this.Ia=this.dd=this.he=null;this.ha={};this.S=new google.search.gc};da("google.search.CustomWebSearch",google.search.G,void 0);Wd(google.search.G,google.search.A);google.search.G.Va="GcustomwebSearch";google.search.G.RESULT_CLASS=google.search.G.Va;google.search.G.Pe="cx";google.search.G.cxRestriction_CX=google.search.G.Pe;google.search.G.Kc="cref"; +google.search.G.cxRestriction_CREF=google.search.G.Kc;google.search.G.yk="none";google.search.G.cxRestriction_NONE=google.search.G.yk;google.search.G.$=[];google.search.G.Sd={as_dt:!0,as_epq:!0,as_eq:!0,as_lq:!0,as_nlo:!0,as_nhi:!0,as_oq:!0,as_q:!0,as_qdr:!0,as_rq:!0,as_sitesearch:!0,cr:!0,c2coff:!0,filter:!0,gl:!0,hq:!0,lr:!0,query:!0,richsnippet:!0,sort:!0,usg:!0};google.search.G.Kj=20;google.search.G.Ud="data-cturl";google.search.G.Td="data-ctorig"; +google.search.G.Pa=function(a,b,c,d,f){var e=0;a&&(e=parseInt(a,10));a=google.search.A.Lc(google.search.G.$,e,b);google.search.G.$[e]=null;a.Qc.pb(b,c,d,f,a.Oc)};google.search.G.RawCompletion=google.search.G.Pa;google.search.G.prototype.ni=function(){var a=new google.search.G;this.oi(a);a.Ia=this.Ia;a.ha=this.ha;a.S=this.S.clone();a.O=this.O;return a};google.search.G.prototype.ej=function(a){var b=google.search.A.Ob(google.search.G.$,[this,null,null]);google.search.G.Pa(b,a,200,void 0,200)}; +google.search.G.prototype.renderJson=google.search.G.prototype.ej;k=google.search.G.prototype;k.ld=function(a){a=He(a);return a.replace(/\s+/g,"_").toLowerCase()};k.ne=function(a){return this.O?this.S.Ga==this.ld(a):!1};k.yc=function(a){return this.O&&this.S.Ga?a.replace(new RegExp(" more:"+this.S.Ga+"$"),""):a};k.lc=function(a,b){return google.search.A.Ob(google.search.G.$,[this,a,b])}; +k.Zb=function(a,b,c){b=null==b?"google.search.CustomWebSearch.RawCompletion":b;a=[a];this.Ma&&a.push(this.Ma);a=a.concat(this.S.ce()).join(" ");if(this.O&&this.he){var d=this.he,d=d.replace(/__HL__/,google.search.CurrentLocale);this.dd=d=d.replace(/__QUERY__/,encodeURIComponent(a))}var d=this.S.$d(),f=[],e;for(e in d)f.push(e+"="+d[e]);e="&"+f.join("&");e+="&q="+encodeURIComponent(a);this.Ia&&(e+="&safe="+this.Ia);this.ha&&(a=Ie(this.ha))&&(e+="&"+a);b=this.Nc(b,c);b+=e;this.Aa=e;c&&0!=c&&(this.Aa= +this.Aa+"&start="+c);window.google.loader.GoogleLocale&&(b=this.gb&&this.O?b+("&googlehost="+encodeURIComponent(window.google.loader.GoogleLocale)):b+("&gl="+encodeURIComponent(window.google.loader.GoogleLocale)));return b}; +k.Tg=function(a){a.html&&delete a.html;var b;if(a.type&&"SPELL_CORRECTED_RESULTS"==a.type){b=B("gs-result");var c=ie(p["showing-results-for"]+" ","gs-spelling"),d=document.createElement("a");d.innerHTML=google.search.V.Af(this.yc(a.correctedAnchor));c.appendChild(d);b.appendChild(c);c=ie(p["search-instead-for"]+" ","gs-spelling");K(c,"gs-spelling-original");d=document.createElement("a");d.innerHTML=google.search.V.Af(this.yc(a.originalAnchor));c.appendChild(d)}else b=ie(p.dym+" ","gs-spelling"),K(b, +"gs-result"),c=document.createElement("a"),c.innerHTML=google.search.V.Af(this.yc(a.anchor));b.appendChild(c);a.html=b};google.search.G.prototype.createSpellingHtml=google.search.G.prototype.Tg;google.search.G.prototype.Sg=function(a,b){var c=x(google.search.V.we(a.visibleUrl),"gs-visibleUrl");r(b,c);K(c,"gs-visibleUrl-short");c=x(google.search.V.we(a.url),"gs-visibleUrl");r(b,c);K(c,"gs-visibleUrl-long")}; +google.search.G.prototype.Rg=function(a,b){var c=me(a,"gs-promotion-image-cell"),d=B("gs-promotion-image-box");r(d,b);r(c,d)}; +google.search.G.prototype.pi=function(a,b){a.html&&delete a.html;var c=B("gs-promotion");K(c,"gs-result");var d=ke(0,1,"gs-promotion-table"),f=le(d,0),e;r(c,d);var g;a.image&&(d=a.image.url.replace("resize_w=40","resize_w=60"),d=d.replace("resize_h=40","resize_h=60"),d=ne(d,null,null,"gs-promotion-image"),a.url&&(e=oe(a.url,"",this.ya()),a.clicktrackUrl&&google.search.G.Yc(e,a.clicktrackUrl,a.url),r(e,d),d=e),g=d,b.gf||google.search.G.prototype.Rg(f,g));d=null;a.clicktrackUrl&&(d={},d[google.search.G.Ud]= +a.clicktrackUrl,d[google.search.G.Td]=a.url);d=pe(a.url,a.title,this.ya(),"gs-title",void 0,d);a.titleRight&&(e=je("","gs-promotion-title-right"),e.innerHTML=" "+a.titleRight,r(d,e));d.dir=google.search.V.fh(d.innerHTML);K(d,"gs-bidi-start-align");e=me(f,b.gf&&a.image?"":"gs-promotion-text-cell");r(e,d);b.Wi&&google.search.G.prototype.Sg(a,e);var h;b.gf&&a.image?(d=ke(0,0,"gs-promotion-table-snippet-with-image"),f=le(d,0),r(e,d),google.search.G.prototype.Rg(f,g),h=me(f,"gs-promotion-text-cell-with-image")): +a.bodyLines&&(h=B(),r(e,h));if(a.bodyLines){f=a.bodyLines;g="right"==a.bodyLinkAlignment;for(var l=0;l<f.length;l++){var m=f[l],q=m.title,t=m.url,v=m.visibleUrl,d=B("gs-snippet"),y;q&&(y=je(""),y.innerHTML=q);var u;t&&v&&(u=oe(t,"",this.ya()),m.clicktrackUrl&&google.search.G.Yc(u,m.clicktrackUrl,t),m=je("","gs-title"),m.innerHTML=v,r(u,m));y&&g&&(r(d,y),u&&r(d,he(" ")));u&&r(d,u);y&&!g&&(u&&r(d,he(" ")),r(d,y));d.dir=google.search.V.fh(d.innerHTML);K(d,"gs-bidi-start-align");r(h,d)}}b.Wi||google.search.G.prototype.Sg(a, +e);a.html=c};google.search.G.prototype.createPromotionHtml=google.search.G.prototype.pi;google.search.G.prototype.Qg=function(a){delete a.html;0<a.display_facets.length&&(a.html=google.search.ga.ma("facets",a))};google.search.G.prototype.createFacetResultHtml=google.search.G.prototype.Qg; +google.search.G.prototype.Qa=function(a){a.html&&delete a.html;a.target=this.ya()||void 0;a.title=a.title||a.visibleUrl;a.html=google.search.ga.ma("webResult",a,{isLabelUrl:ye()});if(a.clicktrackUrl)for(var b=a.html.firstChild;b;b=b.nextSibling)if(1==b.nodeType){"a"==b.tagName.toLowerCase()&&b.href==a.unescapedUrl&&google.search.G.Yc(b,a.clicktrackUrl,a.unescapedUrl);for(var c=b.getElementsByTagName("a"),d=0,f;f=c[d];d++)f.href==a.unescapedUrl&&google.search.G.Yc(f,a.clicktrackUrl,a.unescapedUrl)}this.Gc(a.html)}; +google.search.G.prototype.createResultHtml=google.search.G.prototype.Qa;google.search.G.Yc=function(a,b,c){a.setAttribute(google.search.G.Ud,b);a.setAttribute(google.search.G.Td,c)};google.search.G.prototype.Wb=function(a,b,c){this.Dd=null;this.S=google.search.jc.ri(a,b);this.S instanceof google.search.Cc&&(this.O=!0,this.S.type()==google.search.G.Kc&&(this.Dd=p["linked-cse-error-results"]),c&&c.match(/__HL__/)&&c.match(/__QUERY__/)&&(this.he=c))};google.search.G.prototype.setSiteRestriction=google.search.G.prototype.Wb; +k=google.search.G.prototype;k.Vg=function(){return this.O?this.S.type():null};k.Wg=function(){return this.O?this.S.pf:null};k.nc=function(){return this.O?this.S.Ga:null};k.mj=function(a){this.O&&a&&this.S.sj(a)};k.Ta=function(a,b){a==google.search.A.Ya&&(this.Ia=b?b==google.search.A.Cg||b==google.search.A.Bg||b==google.search.A.Zj?b:null:null);if(a==google.search.A.La)if(b)for(var c in b){var d=b[c];google.search.G.Sd[c]&&(this.ha[c]=d)}else this.ha={}};google.search.G.prototype.setRestriction=google.search.G.prototype.Ta; +google.search.G.prototype.Ha=function(a){isNaN(parseInt(a,10))||(a=parseInt(a,10));this.O&&(0<a&&a<=google.search.G.Kj||google.search.A.Ec==a)?this.Na=a:google.search.A.prototype.Ha.call(this,a)};google.search.G.prototype.setResultSetSize=google.search.G.prototype.Ha;google.search.G.prototype.Sa=function(a){google.search.A.prototype.Sa.call(this,a)};google.search.G.prototype.setLinkTarget=google.search.G.prototype.Sa; +google.search.G.prototype.Gb=function(a){google.search.A.prototype.Gb.call(this,a)};google.search.G.prototype.setQueryAddition=google.search.G.prototype.Gb;google.search.jc=function(){};google.search.jc.prototype.ce=function(){};google.search.jc.prototype.$d=function(){};google.search.jc.prototype.clone=function(){}; +google.search.jc.ri=function(a,b){var c;null==a||"string"==typeof a&&""==a?c=new google.search.gc:"string"==typeof a?c=a.match(/(^partner-pub-\d*:.*)|(^\d{21}:.*)/)?new google.search.Cc(google.search.G.Pe,a,b):new google.search.Yd(a):a.siteUrl?c=new google.search.Yd(a.siteUrl):a.cseId?c=new google.search.Cc(google.search.G.Pe,a.cseId,b):a.crefUrl&&(c=new google.search.Cc(google.search.G.Kc,a.crefUrl,b));return c||new google.search.gc};google.search.gc=function(){};Wd(google.search.gc,google.search.jc); +google.search.gc.prototype.ce=function(){return[]};google.search.gc.prototype.$d=function(){return{}};google.search.gc.prototype.clone=function(){return new google.search.gc};google.search.Cc=function(a,b,c){this.Cj=a;this.pf=b;this.Ga=null;c&&(this.Ga=c)};Wd(google.search.Cc,google.search.jc);k=google.search.Cc.prototype;k.type=function(){return this.Cj};k.sj=function(a){this.Ga=a}; +k.ce=function(){var a=[];this.Ga&&(0==this.Ga.indexOf("more:")||0==this.Ga.indexOf("less:")?a.push(this.Ga):a.push("more:"+this.Ga));return a};k.$d=function(){var a=this.pf;this.Cj==google.search.G.Kc&&(a=encodeURIComponent(a));var b={};b[this.Cj]=a;return b};k.clone=function(){return new google.search.Cc(this.Cj,this.pf,this.Ga)};google.search.Yd=function(a){this.jr=a};Wd(google.search.Yd,google.search.jc);google.search.Yd.prototype.ce=function(){var a=[];a.push("site:"+this.jr);return a}; +google.search.Yd.prototype.$d=function(){return{}};google.search.Yd.prototype.clone=function(){return new google.search.Yd(this.jr)};google.search.NoOldNames||(google_exportSymbol("GwebSearch",google.search.K),google_exportSymbol("GcustomwebSearch",google.search.G),google_exportSymbol("GbookSearch",google.search.ia),google_exportSymbol("GblogSearch",google.search.qa),google_exportSymbol("GvideoSearch",google.search.va),google_exportSymbol("GnewsSearch",google.search.la),google_exportSymbol("GlocalSearch",google.search.I),google_exportSymbol("GimageSearch",google.search.D),google_exportSymbol("GcustomimageSearch",google.search.C), +google_exportSymbol("GpatentSearch",google.search.da),google_exportSymbol("GSearch",google.search.A),google_exportSymbol("GSearchControl",google.search.B),google_exportSymbol("GSearchForm",google.search.Ca),google_exportSymbol("GsearcherOptions",google.search.Za),google_exportSymbol("GdrawOptions",google.search.ra));google.search.ga={};google.search.ga.Yn=function(a){google.search.ga.Zi.unshift(a);return google.search.ga.Zi};da("google.search.Csedr.addOverride",google.search.ga.Yn,void 0);google.search.ga.Zi=["base_",""]; +google.search.ga.ku=function(a,b){google.search.ga.kl[a]||(google.search.ga.kl[a]=eval("[function(Vars,render,html,bidiTextDir,bidiHtmlDir,bidiTextMarkAfter,bidiHtmlMarkAfter, localizedMessages){with(Vars)return("+a+")}][0]"));return google.search.ga.kl[a](b,google.search.ga.ma,google.search.ga.th,google.search.V.Mu,google.search.V.fh,google.search.V.hv,google.search.V.gv,p)};google.search.ga.kl={}; +google.search.ga.th=function(a){var b=document.createDocumentFragment(),c=document.createElement("div");for(c.innerHTML=a;c.firstChild;)b.appendChild(c.firstChild);return b}; +google.search.ga.ma=function(a,b){google.search.ga.Fm&&(document.body.appendChild(google.search.ga.th(google.search.ga.Fm)),google.search.ga.Fm=0);for(var c=0;!a.appendChild;){if(c>=google.search.ga.Zi.length)return google.search.ga.th(a+" not found");a=document.getElementById(google.search.ga.Zi[c++]+a)||a}for(var d={},f=1;f<arguments.length;f++)for(c in arguments[f])d[c]=arguments[f][c];try{for(var e=google.search.ga.th(""),g,h,l=0,m,q,t=function(a){a="data-"+a;q=(m=v.getAttribute(a))?google.search.ga.ku(m, +d):"";g.removeAttribute&&g.removeAttribute(a);return m},v=a.firstChild;v;v=h?v:v.nextSibling)if(g=v.cloneNode(!1),1!=v.nodeType)(3!=v.nodeType||v.nodeValue.match(/\S/))&&e.appendChild(g);else{t("foreach");!h&&m&&(d.Foreach=q&&"function"==typeof q.join?q:[q],c=0,h=1);if(h)if(c<d.Foreach.length)d.Cur=d.Foreach[d.Index=c++];else{h=0;continue}t("if")&&(l=0);if(m||t("elif"))if(l||!q)continue;else l=1;if(!t("attr")||q){if(e.appendChild(g),m)for(var y in q)void 0!=q[y]&&("class"==y?g.className=q[y]:"style"== +y&&ce()?g.style.cssText=q[y]:g.setAttribute(y,q[y]))}else g=e;if(t("facetgroup"))for(f=0;f<d.display_facets.length;f++){var u={index:""};1==d.display_facets.length?u={index:"sizeone"}:0==f?u={index:"first"}:f==d.display_facets.length-1&&(u={index:"last"});g.appendChild(google.search.ga.ma("facetGroupEntry",d.display_facets[f],u))}var F=t("body")?q&&q.appendChild?q:document.createTextNode(q):google.search.ga.ma(v,d,t("vars")?q:{});try{F&&g.appendChild(F)}catch(w){}}return e}catch(w){return google.search.ga.th(w.toString()+ +": "+m)}};da("google.search.Csedr.render",google.search.ga.ma,void 0);google.search.fj={};google.search.fj.Vw=function(a){if(!(a&&a instanceof Array))return a;for(var b={},c=0;c<a.length;c++)for(var d in a[c])b[d]=a[c][d];return b};da("google.search.richsnippets.merge",google.search.fj.Vw,void 0);google.search.fj.mw=function(a){if(!(a instanceof Array))return!(!a.description&&!a.summary);for(var b=0;b<a.length;b++)if(a[b].description||a[b].summary)return!0;return!1};da("google.search.richsnippets.hreviewNonEmpty",google.search.fj.mw,void 0);google.search.F={};google.search.F.element={};google.search.F.element.Ba={Zh:"searchbox+results",tb:"searchbox",Pb:"results"};google.search.F.element.Tc={ek:"standard",Ie:"two-column",Ee:"searchbox-only",$h:"searchresults-only"};google.search.F.element.Mb=function(a){return"string"==typeof a?""!=a&&"0"!=a&&"false"!=a.toLowerCase():!!a};google.search.F.element.dm=function(a){a=parseInt(a,10);return isNaN(a)?void 0:a}; +google.search.F.element.ca=function(a){return function(b){for(var c=0;c<a.length;c++)if(typeof b==a[c])return b}};google.search.F.element.Ls=function(a){if("string"==typeof a&&(a=Pe(a))&&(0==a.indexOf("http://")||0==a.indexOf("https://")))return a}; +google.search.F.element.nx=function(a){var b={};if(1<a.length){a=a.substr(1).split("&");for(var c=0;c<a.length;c++){var d=a[c].split("=");try{var f=decodeURIComponent(d[0])}catch(g){continue}if(f){try{var e=d[1]?decodeURIComponent(d[1].replace(/\+/g," ")):d[1]}catch(g){}b[f]=e}}}return b}; +google.search.F.element.cm=function(a){var b={};if(1<a.length){a=a.substr(1).split("&");for(var c=0;c<a.length;c++){var d=a[c].split("=");try{var f=decodeURIComponent(d[0])}catch(g){continue}if("gcse-bookmark"===f)try{var e=decodeURIComponent(d[1]);b[e.split(":")[0]]=e.substring(e.indexOf(":")+1)}catch(g){}}}return b};google.search.F.element.Ap=function(a,b){for(var c={},d=0;d<b.length;d++)a.hasOwnProperty(b[d])&&(c[b[d]]=a[b[d]]);return c};google.search.F.element.U={}; +google.search.F.element.U.Vf="gcse";google.search.F.element.U.Qr="data-";google.search.F.element.U.Nj="div";google.search.F.element.U.Tr="gname";google.search.F.element.U.Gs=google.search.F.element.U.Vf+":";google.search.F.element.U.Jj=google.search.F.element.U.Vf+"-";google.search.F.element.U.Yh={REPLACE:0,Rm:1};google.search.F.element.U.lv=function(){var a=0,b="___"+google.search.F.element.U.Vf+"_";return function(){return b+a++}}(); +google.search.F.element.U.kv=function(a){var b=0;return function(c){return a==google.search.F.element.Tc.Ie?c||a:c||a+b++}};var ef=google.search.F.element.U,ff=google.search.F.element.Tc,gf=google.search.F.element.Ba,hf=google.search.F.element.U.kv,jf={};jf[ff.ek]={Pg:[gf.Zh],getName:hf(ff.ek)};jf[ff.Ie]={Pg:[gf.tb,gf.Pb],getName:hf(ff.Ie)};jf[ff.Ee]={Pg:[gf.tb],getName:hf(ff.Ee)};jf[ff.$h]={Pg:[gf.Pb],getName:hf(ff.$h)};ef.gk=jf; +google.search.F.element.U.Gg={search:{Cd:google.search.F.element.Tc.ek,Og:google.search.F.element.Ba.Zh},searchbox:{Cd:google.search.F.element.Tc.Ie,Og:google.search.F.element.Ba.tb},searchresults:{Cd:google.search.F.element.Tc.Ie,Og:google.search.F.element.Ba.Pb},"searchbox-only":{Cd:google.search.F.element.Tc.Ee,Og:google.search.F.element.Ba.tb},"searchresults-only":{Cd:google.search.F.element.Tc.$h,Og:google.search.F.element.Ba.Pb}}; +var kf=google.search.F.element.U,lf=[],mf=google.search.F.element.U.Vf+"\\:",nf;for(nf in google.search.F.element.U.Gg)lf.push(mf+nf),lf.push(google.search.F.element.U.Nj+"."+google.search.F.element.U.Jj+nf);kf.ts=lf.join(", "); +google.search.F.element.U.xu=function(a){var b=[],c=google.search.F.element.U.Vf+":",d;for(d in google.search.F.element.U.Gg){for(var f=a.getElementsByTagName(c+d),e=0;e<f.length;e++)b.push(f[e]);f=Z(a,google.search.F.element.U.Nj,google.search.F.element.U.Jj+d);for(e=0;e<f.length;e++)b.push(f[e])}return b}; +google.search.F.element.U.Option={jA:{name:"resultsUrl",P:google.search.F.element.Ls,defaultValue:void 0,T:!0,N:void 0,M:void 0,R:google.search.F.element.Ba.tb},Xz:{name:"newWindow",P:google.search.F.element.Mb,defaultValue:!1,T:!0,N:void 0,M:void 0,R:google.search.F.element.Ba.tb},fA:{name:"queryParameterName",P:google.search.F.element.ca(["string"]),defaultValue:"q",T:!0,N:void 0,M:void 0,R:void 0},oz:{name:"autoSearchOnLoad",P:google.search.F.element.Mb,defaultValue:!0,T:!0,N:void 0,M:void 0,R:void 0}, +sz:{name:"defaultToRefinement",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"defaultToRefinement",M:void 0,R:void 0},Az:{name:"enableOrderBy",P:google.search.F.element.Mb,defaultValue:void 0,T:!0,N:"enableOrderBy",M:void 0,R:void 0},aA:{name:"orderByOptions",P:google.search.F.element.ca(["object"]),defaultValue:void 0,T:!1,N:"keys",M:"orderByOptions",R:void 0},kA:{name:"resultSetSize",P:google.search.F.element.ca(["string","number"]),defaultValue:void 0,T:!0,N:"resultSetSize", +M:void 0,R:void 0},iA:{name:"extendedRestricts",P:google.search.F.element.ca(["object"]),defaultValue:void 0,T:!1,N:google.search.A.La,M:void 0,R:void 0},lA:{name:"safeSearch",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:google.search.A.Ya,M:void 0,R:void 0},gA:{name:"refinementStyle",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:void 0,M:void 0,R:google.search.F.element.Ba.Pb},xz:{name:"enableHistory",P:google.search.F.element.Mb,defaultValue:!1,T:!0, +N:void 0,M:void 0,R:void 0},Vz:{name:"linkTarget",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:void 0,M:void 0,R:google.search.F.element.Ba.Pb},Cz:{name:"enableSpeech",P:google.search.F.element.Mb,defaultValue:!1,T:!0,N:void 0,M:void 0,R:google.search.F.element.Ba.tb},wz:{name:"enableAutoComplete",P:google.search.F.element.Mb,defaultValue:void 0,T:!0,N:void 0,M:void 0,R:google.search.F.element.Ba.tb},kz:{name:"autoCompleteMatchType",P:google.search.F.element.ca(["string"]), +defaultValue:void 0,T:!0,N:"matchType",M:"autoCompleteOptions",R:google.search.F.element.Ba.tb},nz:{name:"autoCompleteValidLanguages",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"validLanguages",M:"autoCompleteOptions",R:google.search.F.element.Ba.tb},lz:{name:"autoCompleteMaxCompletions",P:google.search.F.element.dm,defaultValue:void 0,T:!0,N:"maxCompletions",M:"autoCompleteOptions",R:google.search.F.element.Ba.tb},mz:{name:"autoCompleteMaxPromotions",P:google.search.F.element.dm, +defaultValue:void 0,T:!0,N:"maxPromotions",M:"autoCompleteOptions",R:google.search.F.element.Ba.tb},Yz:{name:"noResultsString",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:void 0,M:void 0,R:google.search.F.element.Ba.Pb},hz:{name:"addOverride",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:void 0,M:void 0,R:void 0},Zz:{name:"numTopRefinements",P:google.search.F.element.dm,defaultValue:void 0,T:!1,N:void 0,M:void 0,R:void 0},IA:{name:"webSearchResultSetSize", +P:google.search.F.element.ca(["number","string"]),defaultValue:void 0,T:!0,N:"resultSetSize",M:"webSearchOptions",R:void 0},HA:{name:"webSearchExtendedRestricts",P:google.search.F.element.ca(["object"]),defaultValue:void 0,T:!1,N:google.search.A.La,M:"webSearchOptions",R:void 0},FA:{name:"lr",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"lr",M:"webSearchExtendedRestricts",R:void 0},BA:{name:"cr",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"cr",M:"webSearchExtendedRestricts", +R:void 0},DA:{name:"gl",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"gl",M:"webSearchExtendedRestricts",R:void 0},CA:{name:"filter",P:google.search.F.element.ca(["number"]),defaultValue:void 0,T:!0,N:"filter",M:"webSearchExtendedRestricts",R:void 0},AA:{name:"as_sitesearch",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"as_sitesearch",M:"webSearchExtendedRestricts",R:void 0},zA:{name:"as_oq",P:google.search.F.element.ca(["string"]),defaultValue:void 0, +T:!0,N:"as_oq",M:"webSearchExtendedRestricts",R:void 0},KA:{name:"sort_by",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"sort_by",M:"webSearchExtendedRestricts",R:void 0},JA:{name:"webSearchSafesearch",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:google.search.A.Ya,M:"webSearchOptions",R:void 0},EA:{name:"webSearchLinkTarget",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"linkTarget",M:"webSearchOptions",R:google.search.F.element.Ba.Pb}, +GA:{name:"webSearchQueryAddition",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"queryAddition",M:"webSearchOptions",R:void 0},yz:{name:"enableImageSearch",P:google.search.F.element.Mb,defaultValue:void 0,T:!0,N:"enableImageSearch",M:void 0,R:google.search.F.element.Ba.Pb},vz:{name:"disableWebSearch",P:google.search.F.element.Mb,defaultValue:void 0,T:!0,N:"disableWebSearch",M:void 0,R:void 0},rz:{name:"defaultToImageSearch",P:google.search.F.element.Mb,defaultValue:void 0,T:!0, +N:"defaultToImageSearch",M:void 0,R:void 0},Nz:{name:"imageSearchLayout",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"layout",M:"imageSearchOptions",R:google.search.F.element.Ba.Pb},Pz:{name:"imageSearchExtendedRestricts",P:google.search.F.element.ca(["object"]),defaultValue:void 0,T:!1,N:google.search.A.La,M:"imageSearchOptions",R:void 0},Oz:{name:"image_lr",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"lr",M:"imageSearchExtendedRestricts",R:void 0}, +Kz:{name:"image_cr",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"cr",M:"imageSearchExtendedRestricts",R:void 0},Mz:{name:"image_gl",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"gl",M:"imageSearchExtendedRestricts",R:void 0},Lz:{name:"image_filter",P:google.search.F.element.ca(["number"]),defaultValue:void 0,T:!0,N:"filter",M:"imageSearchExtendedRestricts",R:void 0},Jz:{name:"image_as_sitesearch",P:google.search.F.element.ca(["string"]),defaultValue:void 0, +T:!0,N:"as_sitesearch",M:"imageSearchExtendedRestricts",R:void 0},Iz:{name:"image_as_oq",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"as_oq",M:"imageSearchExtendedRestricts",R:void 0},Rz:{name:"image_sort_by",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"sort_by",M:"imageSearchExtendedRestricts",R:void 0},Qz:{name:"imageSearchResultSetSize",P:google.search.F.element.ca(["number","string"]),defaultValue:void 0,T:!0,N:"resultSetSize",M:"imageSearchOptions", +R:void 0},Gz:{name:"gaQueryParameter",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"queryParameter",M:"googleAnalyticsOptions",R:google.search.F.element.Ba.tb},Fz:{name:"gaCategoryParameter",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"categoryParameter",M:"googleAnalyticsOptions",R:google.search.F.element.Ba.tb},fz:{name:"adchannel",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"adchannel",M:void 0,R:void 0},gz:{name:"adclient", +P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"adclient",M:void 0,R:void 0},jz:{name:"adtest",P:google.search.F.element.ca(["string"]),defaultValue:void 0,T:!0,N:"adtest",M:void 0,R:void 0},iz:{name:"adoptions",P:google.search.F.element.ca(["object"]),defaultValue:void 0,T:!1,N:"adoptions",M:void 0,R:void 0},nA:{name:"overlayResults",P:google.search.F.element.Mb,defaultValue:!1,T:!0,N:"overlayResults",M:void 0,R:void 0},mA:{name:"showBookmarkLink",P:google.search.F.element.Mb, +defaultValue:!1,T:!1,N:"showBookmarkLink",M:"bookmarkOptions",R:void 0},Sz:{name:"isSitesearch",P:google.search.F.element.Mb,defaultValue:!1,T:!1,N:"isSiteSearch",M:"bookmarkOptions",R:void 0},zz:{name:"enableMobileLayout",P:google.search.F.element.Mb,defaultValue:!1,T:!1,N:"enableMobileLayout",M:void 0,R:void 0},Bz:{name:"enableRichSnippets",P:google.search.F.element.Mb,defaultValue:!1,T:!1,N:void 0,M:void 0,R:google.search.F.element.Ba.Pb}}; +google.search.F.element.U.Ai=function(a,b){var c=google.search.F.element.U.Option,d;for(d in c)c.hasOwnProperty(d)&&a.call(b,c[d])};google.search.F.element.U.on=["oq","gs_204"];google.search.F.element.Wf=function(a,b){this.node=a;this.Bq=b?google.search.F.element.U.Yh.Rm:google.search.F.element.U.Yh.REPLACE;var c,d;if(b)c=b.tag||"search",d=b.attributes||{};else{c=a.nodeName.toLowerCase();var f="";c==google.search.F.element.U.Nj?(f=google.search.F.element.U.Qr,c=(a.className||a.getAttribute("class")).substr(google.search.F.element.U.Jj.length)):c=c.substr(google.search.F.element.U.Gs.length);d=google.search.F.element.Wf.zv(a,f)}this.attributes=d;this.Cd=google.search.F.element.U.Gg[c].Cd; +this.type=google.search.F.element.U.Gg[c].Og;f=b?b.gname:a.getAttribute(f+google.search.F.element.U.Tr);this.$b=google.search.F.element.U.gk[this.Cd].getName(f)};google.search.F.element.Wf.zv=function(a,b){var c={};google.search.F.element.U.Ai(function(d){var f=a.getAttribute(b+d.name);null!=f&&(c[d.name]=f)},this);return c}; +google.search.F.element.Wf.prototype.Ft=function(){var a=this.node,b;if(this.Bq==google.search.F.element.U.Yh.REPLACE){b=document.createElement("div");var c=a.parentNode;c.insertBefore(b,a);c.removeChild(a);b.id=a.id;this.node=b}else this.Bq==google.search.F.element.U.Yh.Rm&&(b=document.createElement("div"),a.appendChild(b),this.node=b);this.node.id&&0!==this.node.id.length||(this.node.id=google.search.F.element.U.lv())};google.search.F.element.Element=function(a,b,c,d,f,e){this.ge=a;this.$b=b;this.type=c;this.Le={};this.fa=this.xt(d);this.Kh=f;this.mc=e};k=google.search.F.element.Element.prototype;k.zh=0;k.cd=null;k.jt=!1; +k.Ms=function(a){if(a.$b!=this.$b)return Te("Name of the component, "+a.$b+", should match name of the element, "+this.$b+"."),this.zh;var b=!1;this.Le[a.type]&&(Te("Multiple components of the same type "+a.type+" for Element named "+this.$b+" are detected. Only the last is used."),b=!0);for(var c=google.search.F.element.U.gk[this.type].Pg,d=0;d<c.length;d++)if(c[d]==a.type)return this.Le[a.type]=a,b||this.zh++,this.zh;Te("Component of type "+a.type+" is not allowed for Element named "+this.$b+" of type "+ +this.type+".");return this.zh};k.ma=function(){var a=google.search.F.element.U.gk[this.type].Pg;if(a.length!=this.zh)for(var b=0;b<a.length;b++)if(!this.Le[a[b]])return Te("Component of type "+a[b]+" is missing for Element named "+this.$b+"."),!1;var a={},c;for(c in this.Le)this.Le.hasOwnProperty(c)&&(b=this.Le[c],b.Ft(),a[c]=b.node,this.lx(b.attributes,c));this.cd=this.Tt(a);return!0};k.xt=function(a){var b={},c;for(c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}; +k.lx=function(a,b){var c=google.search.F.element.Ba;google.search.F.element.U.Ai(function(d){if(a.hasOwnProperty(d.name)&&d.T&&(b==c.Zh||void 0==d.R||d.R==b)){var f=d.P(a[d.name]);null!=f&&("webSearchExtendedRestricts"===d.M?(this.fa.webSearchExtendedRestricts||(this.fa.webSearchExtendedRestricts={}),this.fa.webSearchExtendedRestricts[d.name]=f):"imageSearchExtendedRestricts"===d.M?(this.fa.imageSearchExtendedRestricts||(this.fa.imageSearchExtendedRestricts={}),this.fa.imageSearchExtendedRestricts[d.N]= +f):this.fa[d.name]=f)}},this)}; +k.Tt=function(a){var b={imageSearchOptions:{},webSearchOptions:{},autoCompleteOptions:{},googleAnalyticsOptions:{},orderByOptions:{},bookmarkOptions:{}};google.search.F.element.U.Ai(function(a){if(a.N&&void 0!=this.fa[a.name]){var c=b;a.M&&(c=b[a.M]);c[a.N]=this.fa[a.name]}},this);this.fa.isSitesearch&&void 0!==this.mc.sortBy&&(b.webSearchOptions||(b.webSearchOptions={}),b.webSearchOptions[google.search.A.La]||(b.webSearchOptions[google.search.A.La]={}),b.webSearchOptions[google.search.A.La].sort=this.mc.sortBy); +this.fa.isSitesearch&&this.mc.refine&&(b.defaultToRefinement=this.mc.refine);this.fa.isSitesearch&&this.mc.image&&(b.defaultToImageSearch="0"!=this.mc.image?!0:!1);this.fa.enableRichSnippets&&(b.enableRichSnippets=!0);var c=new google.search.H(this.ge,b);void 0!=this.fa.refinementStyle&&c.tj(this.fa.refinementStyle);void 0!=this.fa.addOverride&&google.search.ga.Yn(this.fa.addOverride);void 0!=this.fa.linkTarget&&c.Sa(this.fa.linkTarget);var d=new google.search.ra;void 0!=this.fa.enableAutoComplete&& +d.Mq(this.fa.enableAutoComplete);void 0!=this.fa.enableSpeech&&d.Xq(this.fa.enableSpeech);void 0!=this.fa.numTopRefinements&&d.$q(this.fa.numTopRefinements);var f=null,e=google.search.F.element.Tc,f=google.search.F.element.Ba;this.type==e.Ee?(e=this.fa.resultsUrl,!e&&this.ge?e="http://www.google.com/cse?"+("string"==typeof this.ge?"cx="+encodeURIComponent(this.ge):"cref="+encodeURIComponent(this.ge.crefUrl)):void 0==e&&(e=window.location.href),d.Lo(e,this.fa.queryParameterName,this.fa.newWindow), +f=a[f.tb]):this.type==e.$h?(d.Ko(),f=a[f.Pb]):this.type==e.Ie?(d.Wq(a[f.tb]),f=a[f.Pb]):f=a[f.Zh];this.jt&&this.$b===this.type+"0"&&(a=document.createElement("script"),a.type="text/javascript",a.src="//www.google.com/cse/btguard.js?gcse_nc="+window.___gcse_nc_,document.head.appendChild(a));c.Xg(f,d);this.fa.noResultsString&&(d=this.fa.noResultsString,d=Ma(d),c.xf(d));this.fa.enableHistory?c.mr(de(this,this.Qp))&&void 0==this.fa.linkTarget&&c.Sa(google.search.A.nn):this.Qp(c);return c}; +k.Qp=function(a){var b=google.search.F.element.Tc,c=this.Kh[this.fa.queryParameterName];if(this.fa.isSitesearch&&this.mc.query&&this.type!=b.Ee){c=this.mc.query;b=parseInt(this.mc.page,10);isNaN(b)&&(b=1);var d=google.search.F.element.Ap(this.Kh,google.search.F.element.U.on);a.oa(c,b,d)}else c&&this.fa.autoSearchOnLoad&&(this.type==b.Ee?a.$i(c):(d=google.search.F.element.Ap(this.Kh,google.search.F.element.U.on),a.oa(c,void 0,d)))};google.search.F.element.sn=function(a){a=a||{};this.ge=a.cx||(a.cref?{crefUrl:a.cref}:null);this.Xy=this.Bv(a.uiOptions);this.te={};this.bh={};this.Kh=google.search.F.element.nx(window.location.search);this.mc=google.search.F.element.cm(window.location.search);this.jm=a.rawCss;this.ft()};k=google.search.F.element.sn.prototype; +k.Bv=function(a){a=a||{};var b={};google.search.F.element.U.Ai(function(c){var d=c.name,f=null;a.hasOwnProperty(d)&&(f=c.P(a[d]));null!=f?b[d]=f:void 0!=c.defaultValue&&(b[d]=c.defaultValue)},this);return b};k.St=function(){if("boolean"==typeof this.im)return this.im;var a=document.createElement("div");a.appendChild(document.createElement("G:TEST"));return this.im=!!(a.querySelectorAll&&0<a.querySelectorAll("G\\:TEST").length)}; +k.go=function(a){a=(a?Oe(a):null)||document.body;a=this.St()?a.querySelectorAll(google.search.F.element.U.ts):google.search.F.element.U.xu(a);window||(window={});window.___gcse_nc_=a.length||0;for(var b=0;b<a.length;++b)this.sq(new google.search.F.element.Wf(a[b]));this.Xo()}; +k.ma=function(a,b){if(b&&"searchbox"!=a.tag&&"searchresults"!=b.tag)return Te('First and second components must be of tag "searchbox" and "searchresults" separately.'),null;if(b&&a.gname!=b.gname)return Te("First and second components must be of the same gname."),null;var c=[a];b&&c.push(b);for(var d,f=[],e=0;e<c.length;e++){if(!c[e].div)return Te("div required for component."),null;c[e].tag||(c[e].tag="search");if(!google.search.F.element.U.Gg[c[e].tag])return Te("tag named "+c[e].tag+" is not recognized"), +null;var g=Oe(c[e].div);g&&1===g.nodeType&&(g=new google.search.F.element.Wf(g,c[e]),d=g.$b,f.push(g))}for(e=0;e<f.length;e++)this.sq(f[e]);this.Xo();return d?this.Gi(d):null};k.Gi=function(a){return this.bh[a]?new google.search.F.element.Mj(this.bh[a]):null};k.ll=function(){var a={},b;for(b in this.bh)a[b]=new google.search.F.element.Mj(this.bh[b]);return a};k.sq=function(a){var b=a.$b;this.te[b]||(this.te[b]=new google.search.F.element.Element(this.ge,b,a.Cd,this.Xy,this.Kh,this.mc));this.te[b].Ms(a)}; +k.ft=function(){if(this.jm){var a=document.getElementsByTagName("head")[0];a||(a=document.body.parentNode.appendChild(document.createElement("head")));var b=document.createElement("style");b.type="text/css";b.styleSheet?b.styleSheet.cssText=this.jm:b.appendChild(document.createTextNode(this.jm));a.appendChild(b)}};k.Xo=function(){for(var a in this.te)if(this.te.hasOwnProperty(a)){var b=this.te[a];b.ma()&&(this.bh[a]=b);delete this.te[a]}}; +google.search.F.element.Mj=function(a){this.gname=a.$b;this.type=a.type;this.uiOptions=a.fa;this.execute=de(a.cd,a.cd.oa);this.prefillQuery=de(a.cd,a.cd.$i);this.getInputQuery=de(a.cd,a.cd.op);this.clearAllResults=de(a.cd,a.cd.$c)};da("google.search.cse.element.ElementInterface",google.search.F.element.Mj,void 0);google.search.F.element.nh=function(){return(new Date).getTime()};google.search.F.element.Tj=google.search.F.element.nh(); +google.search.F.element.uq=function(a,b){if(!google.search.F.element.Vo&&(google.search.F.element.Vo=google.search.F.element.nh(),window.googleLT_&&1==window.googleLT_%100)){var c="e",d=window.googleLT_;window.__gcse&&window.__gcse.ct&&(d=window.__gcse.ct,c="c");var f=window.googleLT_-d,e=google.search.F.element.Tj-d,g=google.search.F.element.Rw-d,h=b-d,d=google.search.F.element.Vo-d;if(0<e&&0<g&&0<h){var l="ex";"c"==c&&"explicit"!=window.__gcse.parsetags&&(l="ol");var m="render"==a?"r":"g",q=[]; +"c"==c&&q.push("gl."+f);q=q.concat(["el."+e,"mc."+g,m+"s."+h,m+"e."+d]);google.loader.recordCsiStat(["element_"+(c+l)],q)}}};google.search.F.element.uh=function(a){return google.search.F.element.$g?!1:(google.search.F.element.$g=new google.search.F.element.sn(a),google.search.F.element.Rw=google.search.F.element.nh(),!0)};da("google.search.cse.element.init",google.search.F.element.uh,void 0); +google.search.F.element.go=function(a){google.search.F.element.uh();var b=google.search.F.element.nh();google.search.F.element.$g.go(a);google.search.F.element.uq("go",b)};da("google.search.cse.element.go",google.search.F.element.go,void 0);google.search.F.element.ma=function(a,b){google.search.F.element.uh();var c=google.search.F.element.nh(),d=google.search.F.element.$g.ma(a,b);google.search.F.element.uq("render",c);return d};da("google.search.cse.element.render",google.search.F.element.ma,void 0); +google.search.F.element.Gi=function(a){google.search.F.element.uh();return google.search.F.element.$g.Gi(a)};da("google.search.cse.element.getElement",google.search.F.element.Gi,void 0);google.search.F.element.ll=function(){google.search.F.element.uh();return google.search.F.element.$g.ll()};da("google.search.cse.element.getAllElements",google.search.F.element.ll,void 0);google.search.ga.Fm=' <div style="display:none"> <span id="private_ratings"> <span class="gsc-snippet-metadata"> <span data-if="Vars.ratingstars"> <span class="gsc-rating-bar"> <span data-attr="{style:\'width:\' + (Vars.ratingstars * 20) + \'%\'}"></span> </span> <span data-if="Vars.ratingcount"> <span data-body="\' \' + Vars.ratingcount"></span> <span> reviews</span> </span> </span> <span data-if="Vars.totaltime"> <span data-if="Vars.ratingstars && Vars.ratingcount"> - </span> <span data-body="Vars.totaltime"></span> </span> <span data-if="Vars.calories"> <span data-if="Vars.ratingstars && Vars.ratingcount || Vars.totaltime"> - </span> <span data-body="Vars.calories"></span> <span> cal</span> </span> <span data-if="Vars.pricerange"> <span data-if="Vars.ratingstars && Vars.ratingcount || Vars.totaltime || Vars.calories"> - </span> <span> Price range: </span> <span data-body="Vars.pricerange"></span> </span> <span data-if="Vars.reviewer" class="gsc-reviewer"> <span data-body="\' \' + Vars.reviewer"></span> </span> </span> </span> <span id="private_hproduct"> <span class="gsc-snippet-metadata"> <span data-if="Vars.availability">Availability: <span data-body="Vars.availability"></span>.</span> <span data-if="Vars.availability && Vars.price"> </span> <span data-if="Vars.price"> Price: <span data-body="Vars.price"></span>.</span> </span> </span> <span id="private_hreview_icon"> <span data-if="google.search.richsnippets.hreviewNonEmpty(Vars.hreview)"> <span class="gsc-zippy"></span> </span> </span> <span id="private_hreview_content"> <span data-if="google.search.richsnippets.hreviewNonEmpty(Vars.hreview)" class="gsc-preview-reviews"> <ul> <span data-foreach="Vars.hreview" data-attr="0"> <li data-if="(Cur.description || Cur.summary) && Index == 0" class = "gsc-review-agregate-first-line"> <span data-if="Cur.description" data-body="Cur.description"></span> <span data-elif="Cur.summary" data-body="Cur.summary"></span> </li> <li data-elif="(Cur.description || Cur.summary) && Index < 10" data-attr="{\'class\': Index % 2 == 0 ? \'gsc-review-agregate-even-lines\' : \'gsc-review-agregate-odd-lines\'}"> <span data-if="Cur.description" data-body="Cur.description"></span> <span data-elif="Cur.summary" data-body="Cur.summary"></span> </li> </span> </ul> </span> </span> <span id="private_hrecipe"> <span data-if="Vars.author" class="gsc-author"> <span data-body="\' \' + Vars.author"></span> </span> </span> <span id="private_recipe"> <span data-attr="0" data-body="render(\'private_ratings\',google.search.richsnippets.merge(richSnippet.recipe))"> </span> <span data-if="Vars.richSnippet.hrecipe && Vars.richSnippet.hrecipe.author && !Vars.richSnippet.recipe.reviewer" data-attr="0" data-body="render(\'private_hrecipe\',richSnippet.hrecipe)"> </span> </span> <span id="private_person"> <span data-vars="{vcard:google.search.richsnippets.merge(Vars.richSnippet.vcard)}"> <span data-if="Vars.richSnippet.vcard && vcard.adr"> <span data-if="vcard.adr" class="gs-location"> <span data-body="\' \' + vcard.adr"> </span> </span> </span> <span data-elif="Vars.richSnippet.person"> <span data-if="person.role" class="gsc-role"> <span data-attr="0" data-body="\' \' + person.role"> </span> </span> <span data-if="person.org" class="gsc-org"> <span data-body="\' @\' + person.org"> </span> </span> <span data-if="person.location" class="gsc-location"> <span data-if="person.org || person.role || Vars.richSnippet.review"> - </span> <span data-body="\' \' + person.location"> </span> </span> </span> <span data-if="Vars.richSnippet.vcard && vcard.tel" class="gsc-tel"> <span data-if="(person && (person.org || person.role || Vars.richSnippet.review || person.location)) || (Vars.richSnippet.vcard && vcard.adr) "> - </span> <span data-body="\' Tel: \' + vcard.tel"> </span> </span> </span> </span> <span id="private_metadata" class="gsc-snippet-metadata"> <span data-vars="{person:google.search.richsnippets.merge(Vars.richSnippet.person), product:google.search.richsnippets.merge(Vars.richSnippet.hproduct)}"> <span data-if="Vars.richSnippet.recipe" data-attr="0" data-body="render(\'private_recipe\', Vars)"> </span> <span data-elif="Vars.richSnippet.review" data-attr="0" data-body="render(\'private_ratings\',google.search.richsnippets.merge(richSnippet.review))"> </span> <span data-if="Vars.richSnippet.hproduct && (product.availability || product.price)" data-attr="0" data-body="render(\'private_hproduct\', product)"> </span> <span data-elif="Vars.richSnippet.person || Vars.richSnippet.vcard" data-attr="0" data-body="render(\'private_person\', Vars)"> </span> </span> </span> <div id="base_facets"> <div class="gsc-context-box" data-facetgroup=\'title\'> </div> </div> <div id="base_facetGroupEntry"> <div> <div class="gsc-facet-label gsc-col" style="display:inline-block;"> <a data-attr="{\'data-refinementLabel\': label, \'label-with-op\': label_with_op}" data-body="html(anchor)"></a> </div> <div class="gsc-facet-result gsc-col" data-body="html(width + \'%\')" style="display:inline-block;"> </div> <div data-attr="{\'class\': index == \'first\' ? \'gsc-chart gsc-top gsc-col\' : index == \'last\' ? \'gsc-chart gsc-bottom gsc-col\' : index == \'sizeone\' ? \'gsc-chart gsc-bottom gsc-col gsc-top\' : \'gsc-chart gsc-col\'}" style="display:inline-block;"> <div class="" data-attr="{style:\'width:\' + width + \'%\'}"></div> </div> </div> </div> <div id="base_webResult"> <div class="gs-webResult gs-result" data-vars="{longUrl:function() { var i = unescapedUrl.indexOf(visibleUrl); return i < 1 ? visibleUrl : unescapedUrl.substring(i);}}"> <div class="gsc-thumbnail-inside"> <div class="gs-title"> <a class="gs-title" data-attr="{href:unescapedUrl,target:target,dir:bidiHtmlDir(title)}" data-body="html(title)"> </a> </div> </div> <div class="gsc-url-top"> <div class="gs-bidi-start-align gs-visibleUrl gs-visibleUrl-short" data-body="visibleUrl" data-attr="{dir:bidiTextDir(visibleUrl)}"> </div> <div class="gs-bidi-start-align gs-visibleUrl gs-visibleUrl-long" data-body="Vars.formattedUrl ? html(Vars.formattedUrl) : longUrl()" data-attr="{dir: Vars.formattedUrl ? bidiHtmlDir(Vars.formattedUrl) : bidiTextDir(longUrl()), style:\'word-break:break-all;\'}"> </div> </div> <table class="gsc-table-result"> <tbody> <tr> <td class="gsc-table-cell-thumbnail gsc-thumbnail" style="display:none"> <div data-if="Vars.richSnippet" data-attr="0" data-body="render(\'thumbnail\',richSnippet,{url:unescapedUrl,target:target})"> </div> </td> <td data-attr="{\'class\': \'gsc-table-cell-snippet-close\' + ((google.search.CurrentLocale == \'en\' && Vars.richSnippet && Vars.richSnippet.hreview && google.search.richsnippets.hreviewNonEmpty(Vars.richSnippet.hreview)) ? \' gsc-collapsable\' : \'\')}" onclick="if (this.className == \'gsc-table-cell-snippet-close gsc-collapsable\') { this.className = \'gsc-table-cell-snippet-open gsc-collapsable\'; } else if (this.className == \'gsc-table-cell-snippet-open gsc-collapsable\') { this.className = \'gsc-table-cell-snippet-close gsc-collapsable\'; };"> <span data-if="google.search.CurrentLocale == \'en\' && Vars.richSnippet && Vars.richSnippet.hreview" data-attr="0" data-body="render(\'private_hreview_icon\',richSnippet)"> </span> <div class="gs-title gsc-table-cell-thumbnail gsc-thumbnail-left"> <a class="gs-title" data-attr="{href:unescapedUrl,target:target,dir:bidiHtmlDir(title)}" data-body="html(title)"> </a> </div> <div class="gs-fileFormat" data-if="Vars.fileFormat"> <span class="gs-fileFormat" data-body="localizedMessages[\'file-format\'] + \' \'"></span> <span class="gs-fileFormatType" data-body="Vars.fileFormat"></span> </div> <div data-if="google.search.CurrentLocale == \'en\' && Vars.richSnippet"> <span data-attr="0" data-body="render(\'private_metadata\', Vars)"> </span> </div> <div class="gs-bidi-start-align gs-snippet" data-body="html(content)" data-attr="{dir:bidiHtmlDir(content)}"> </div> <div class="gsc-url-bottom"> <div class="gs-bidi-start-align gs-visibleUrl gs-visibleUrl-short" data-body="visibleUrl" data-attr="{dir:bidiTextDir(visibleUrl)}"> </div> <div class="gs-bidi-start-align gs-visibleUrl gs-visibleUrl-long" data-body="Vars.formattedUrl ? html(Vars.formattedUrl) : longUrl()" data-attr="{dir: Vars.formattedUrl ? bidiHtmlDir(Vars.formattedUrl) : bidiTextDir(longUrl()), style:\'word-break:break-all;\'}"> </div> </div> <div class="gs-richsnippet-box" style="display: none;"> </div> <span data-if="google.search.CurrentLocale == \'en\' && Vars.richSnippet && Vars.richSnippet.hreview" data-attr="0" data-body="render(\'private_hreview_content\',richSnippet)"> </span> <div class="gs-per-result-labels" data-attr="{url:unescapedUrl}"> <span data-body="localizedMessages[\'labeled\']" data-if="!Vars.isLabelUrl && Vars.perResultLabels"></span> <a class=\'gs-label gs-add-label\' data-if="Vars.isLabelUrl" data-body="localizedMessages[\'add-label\']"></a> <div data-foreach="Vars.perResultLabels" data-attr="0" data-if="Vars.perResultLabels"> <a class="gs-label" data-attr="{\'data-refinementLabel\': Cur[\'label\'], \'label-with-op\': Cur[\'label_with_op\'], \'dir\' : bidiTextDir(Cur.anchor)}" data-body="Cur.anchor"></a> <span data-body="bidiTextMarkAfter(Cur.anchor)"></span> </div> </div> </td> </tr> </tbody> </table> </div> </div> <div id="base_imageResult_image" ><a data-attr="{ \'href\':originalContextUrl, \'target\':target, \'class\':imageClass }" ><img data-attr="{ \'src\':tbUrl, \'title\':titleNoFormatting, \'class\':imageClass }"/ ></a ></div> <div id="base_imageResult_text" ><div class="gs-title gs-ellipsis" ><a class="gs-title" data-attr="{ href:originalContextUrl, target:target, dir:bidiHtmlDir(title) }" data-body="html(title)"></a ></div ><div class="gs-visibleUrl gs-bidi-start-align gs-ellipsis gsc-url-top" data-attr="{title:visibleUrl, dir:bidiTextDir(visibleUrl)}" data-body="visibleUrl" ></div ><div class="gs-snippet gs-bidi-start-align gs-ellipsis" data-attr="{title:contentNoFormatting, dir:bidiHtmlDir(content)}" data-body="html(content)" ></div ><div class="gs-size gs-ellipsis" data-body="width + \' \u00d7 \' + height" ></div ><div class="gs-visibleUrl gs-bidi-start-align gs-ellipsis gsc-url-bottom" data-attr="{title:visibleUrl, dir:bidiTextDir(visibleUrl)}" data-body="visibleUrl" ></div ></div> <div id="base_imageResult_content" ><div data-body="render(\'base_imageResult_image\', Vars)" class="gs-image-box" ></div ><div data-body="render(\'base_imageResult_text\', Vars)" class="gs-text-box" ></div ></div> <div id="base_imageResult_classic" ><div class="gs-result gs-imageResult gs-imageResult-classic" data-body="render(\'base_imageResult_content\', Vars, { imageClass: \'gs-image gs-image-scalable\' })" ></div ></div> <div id="base_imageResult_column" ><div class="gs-result gs-imageResult gs-imageResult-column" data-body="render(\'base_imageResult_content\', Vars, { imageClass: \'gs-image gs-image-scalable\' })" ></div ></div> <div id="base_imageResult_popup" ><div class="gs-result gs-imageResult gs-imageResult-popup" onmouseover="google.search.ImageSearch.showPopup(this)" onmouseout="google.search.ImageSearch.hidePopup(this)" ><div class="gs-image-thumbnail-box" ><div data-body="render(\'base_imageResult_image\', Vars, { imageClass: \'gs-image gs-image-scalable\' })" class="gs-image-box" ></div ></div ><div data-body="render(\'base_imageResult_content\', Vars, { imageClass: \'gs-image\' })" class="gs-image-popup-box" ></div ></div ></div> <div id="base_thumbnail"> <div data-attr="0" data-vars="{tn:(Vars.cseThumbnail && cseThumbnail.src) ? cseThumbnail : ( (Vars.thumbnail && thumbnail.src) ? thumbnail : {src:Vars.document && document.thumbnailUrl})}"> <div data-if="tn.src"> <a class="gs-image" data-attr="{href:url,target:target}"> <img data-if="!tn.width || !tn.height || tn.width >= tn.height * 7 / 5" class="gs-image" data-attr="{src:tn.src}" onload="if (this.parentNode && this.parentNode.parentNode && this.parentNode.parentNode.parentNode) { this.parentNode.parentNode.parentNode.style.display = \'\'; this.parentNode.parentNode.className = \'gs-image-box gs-web-image-box gs-web-image-box-landscape\'; } "/> <img data-elif="true" class="gs-image" data-attr="{src:tn.src}" onload="if (this.parentNode && this.parentNode.parentNode && this.parentNode.parentNode.parentNode) { this.parentNode.parentNode.parentNode.style.display = \'\'; this.parentNode.parentNode.className = \'gs-image-box gs-web-image-box gs-web-image-box-portrait\'; } "/> </a> </div> </div> </div> <div id="base_action"> <div data-foreach="Vars.action" data-attr="0"> <div data-attr="{\'class\': \'gs-action \' + Cur[\'class\']}" data-if="Cur.url && Cur.label"> <a class="gs-action" data-attr="{href:Cur.url,target:target,dir:bidiTextDir(Cur.label)}" data-body="Cur.label"></a> </div> </div> </div> </div> '; +google.loader.loaded({"module":"search","version":"1.0","components":["default"]}); +google.loader.eval.search = function() {eval(arguments[0]);};if (google.loader.eval.scripts && google.loader.eval.scripts['search']) {(function() {var scripts = google.loader.eval.scripts['search'];for (var i = 0; i < scripts.length; i++) {google.loader.eval.search(scripts[i]);}})();google.loader.eval.scripts['search'] = null;}})();
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/apache.org-files/jquery-2.js b/test/modules/http2/htdocs/test1/apache.org-files/jquery-2.js new file mode 100644 index 0000000000..dc93a13e88 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/jquery-2.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)
+},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ib={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:"0",fontWeight:"400"},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||tb(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?tb(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Lb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Mb||(Mb=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Mb),Mb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Yb,Zb,$b=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))
+},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=n.now(),dc=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var ec,fc,gc=/#.*$/,hc=/([?&])_=[^&]*/,ic=/^(.*?):[ \t]*([^\r\n]*)$/gm,jc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,kc=/^(?:GET|HEAD)$/,lc=/^\/\//,mc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,nc={},oc={},pc="*/".concat("*");try{fc=location.href}catch(qc){fc=l.createElement("a"),fc.href="",fc=fc.href}ec=mc.exec(fc.toLowerCase())||[];function rc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function sc(a,b,c,d){var e={},f=a===oc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function tc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function uc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function vc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:fc,type:"GET",isLocal:jc.test(ec[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":pc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?tc(tc(a,n.ajaxSettings),b):tc(n.ajaxSettings,a)},ajaxPrefilter:rc(nc),ajaxTransport:rc(oc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=ic.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||fc)+"").replace(gc,"").replace(lc,ec[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=mc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===ec[1]&&h[2]===ec[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(ec[3]||("http:"===ec[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),sc(nc,k,b,v),2===t)return v;i=k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!kc.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=hc.test(d)?d.replace(hc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+pc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=sc(oc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=uc(k,v,f)),u=vc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var wc=/%20/g,xc=/\[\]$/,yc=/\r?\n/g,zc=/^(?:submit|button|image|reset|file)$/i,Ac=/^(?:input|select|textarea|keygen)/i;function Bc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||xc.test(a)?d(a,e):Bc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Bc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Bc(c,a[c],b,e);return d.join("&").replace(wc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Ac.test(this.nodeName)&&!zc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(yc,"\r\n")}}):{name:b.name,value:c.replace(yc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Cc=0,Dc={},Ec={0:200,1223:204},Fc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Dc)Dc[a]()}),k.cors=!!Fc&&"withCredentials"in Fc,k.ajax=Fc=!!Fc,n.ajaxTransport(function(a){var b;return k.cors||Fc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Cc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Dc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Ec[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Dc[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Gc=[],Hc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Gc.pop()||n.expando+"_"+cc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Hc.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Hc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Hc,"$1"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Gc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Ic=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Ic)return Ic.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Jc=a.document.documentElement;function Kc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Kc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Jc;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Jc})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Kc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=yb(k.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Lc=a.jQuery,Mc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Mc),b&&a.jQuery===n&&(a.jQuery=Lc),n},typeof b===U&&(a.jQuery=a.$=n),n});
diff --git a/test/modules/http2/htdocs/test1/apache.org-files/jsapi.js b/test/modules/http2/htdocs/test1/apache.org-files/jsapi.js new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/jsapi.js diff --git a/test/modules/http2/htdocs/test1/apache.org-files/min.css b/test/modules/http2/htdocs/test1/apache.org-files/min.css new file mode 100644 index 0000000000..908a2e8b8c --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/min.css @@ -0,0 +1 @@ +/*! Generated by Live LESS Theme Customizer *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-search:before{content:"\e003"}.glyphicon-home:before{content:"\e021"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Droid Serif",Georgia,"Times New Roman",Times,serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#585ac2;text-decoration:none}a:focus,a:hover{color:#373997;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:"Source Sans Pro","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:#700;line-height:1.1;color:#303284}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:42px}.h2,h2{font-size:35px}.h3,h3{font-size:28px}.h4,h4{font-size:21px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.small,small{font-size:85%}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#303284}a.text-primary:hover{color:#22245f}.text-success{color:#4e844f}a.text-success:hover{color:#3b643c}.text-info{color:#5d61ea}a.text-info:hover{color:#3035e4}.text-warning{color:#ab6400}a.text-warning:hover{color:#784600}.text-danger{color:#842b31}a.text-danger:hover{color:#5e1e23}.bg-primary{color:#fff;background-color:#303284}a.bg-primary:hover{background-color:#22245f}.bg-success{background-color:#e3eee3}a.bg-success:hover{background-color:#c3dbc3}.bg-info{background-color:#e4e5fc}a.bg-info:hover{background-color:#b7b9f6}.bg-warning{background-color:#ffdcab}a.bg-warning:hover{background-color:#ffc778}.bg-danger{background-color:#ebc3c5}a.bg-danger:hover{background-color:#df9ca1}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#303284;background-color:#fff;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:0;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto;outline-offset:-2px}output{display:block;padding-top:6px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:32px;padding:5px 10px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#303284;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(48,50,132,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(48,50,132,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=datetime-local],input[type=month],input[type=time]{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:6px;padding-bottom:6px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:26px;padding:3px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-sm{height:26px;line-height:26px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:3px 12px;font-size:12px;line-height:1.5;border-radius:0}select.form-group-sm .form-control{height:26px;line-height:26px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:26px;padding:3px 12px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 20px;font-size:18px;line-height:1.33;border-radius:0}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 20px;font-size:18px;line-height:1.33;border-radius:0}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 20px;font-size:18px;line-height:1.33}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#4e844f}.has-success .form-control{border-color:#4e844f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#3b643c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #83b583;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #83b583}.has-success .input-group-addon{color:#4e844f;border-color:#4e844f;background-color:#e3eee3}.has-success .form-control-feedback{color:#4e844f}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#ab6400}.has-warning .form-control{border-color:#ab6400;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#784600;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ff9d12;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ff9d12}.has-warning .input-group-addon{color:#ab6400;border-color:#ab6400;background-color:#ffdcab}.has-warning .form-control-feedback{color:#ab6400}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#842b31}.has-error .form-control{border-color:#842b31;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#5e1e23;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c64f57;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c64f57}.has-error .input-group-addon{color:#842b31;border-color:#842b31;background-color:#ebc3c5}.has-error .form-control-feedback{color:#842b31}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:6px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:26px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:6px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:4px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:5px 10px;font-size:14px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#303284;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#303284;background-color:#fff;border-color:#303284}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#303284;background-color:#e6e6e6;border-color:#202157}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#303284}.btn-default .badge{color:#fff;background-color:#303284}.btn-primary{color:#fff;background-color:#303284;border-color:#292b71}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#22245f;border-color:#191a44}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#303284;border-color:#292b71}.btn-primary .badge{color:#303284;background-color:#fff}.btn-success{color:#fff;background-color:#4e844f;border-color:#457445}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#3b643c;border-color:#2e4e2e}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#4e844f;border-color:#457445}.btn-success .badge{color:#4e844f;background-color:#fff}.btn-info{color:#fff;background-color:#5d61ea;border-color:#464be7}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#3035e4;border-color:#1c21d5}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5d61ea;border-color:#464be7}.btn-info .badge{color:#5d61ea;background-color:#fff}.btn-warning{color:#fff;background-color:#ffb245;border-color:#ffa72b}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ff9d12;border-color:#ed8b00}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#ffb245;border-color:#ffa72b}.btn-warning .badge{color:#ffb245;background-color:#fff}.btn-danger{color:#fff;background-color:#842b31;border-color:#71252a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#5e1e23;border-color:#431619}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#842b31;border-color:#71252a}.btn-danger .badge{color:#842b31;background-color:#fff}.btn-link{color:#585ac2;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#373997;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 20px;font-size:18px;line-height:1.33;border-radius:0}.btn-group-sm>.btn,.btn-sm{padding:3px 12px;font-size:12px;line-height:1.5;border-radius:0}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid #303284;border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#555;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#edeef9}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#303284}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 20px;font-size:18px;line-height:1.33;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:26px;padding:3px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:26px;line-height:26px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:5px 10px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:0}.input-group-addon.input-sm{padding:3px 12px;font-size:12px;border-radius:0}.input-group-addon.input-lg{padding:10px 20px;font-size:18px;border-radius:0}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:15px 22px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#585ac2}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #303284}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:0}.nav-tabs>li>a:hover{border-color:#eee #eee #303284}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#fff;background-color:#303284;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:22px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#303284}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:30px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;visibility:visible!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:5px 15px;font-size:18px;line-height:20px;height:30px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:-2px;margin-bottom:-2px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:2.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:5px;padding-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:0}.navbar-btn{margin-top:-1px;margin-bottom:-1px}.navbar-btn.btn-sm{margin-top:2px;margin-bottom:2px}.navbar-btn.btn-xs{margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:5px;margin-bottom:5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#303284}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#22245f;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#303284}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#fff;background-color:#a3a4dd}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#303284;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#303284}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#303284}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:#a3a4dd}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#303284;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#303284}.navbar-default .navbar-link:hover{color:#fff}.navbar-default .btn-link{color:#303284}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#fff}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#303284;border-color:#22245f}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:#3e40a9}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#22245f}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#26286a}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#22245f;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#22245f}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#22245f}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:#3e40a9}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#22245f}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .btn-link,.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover,.navbar-inverse .navbar-link,.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#585ac2}.thumbnail .caption{padding:9px;color:#333}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1px;border-top-left-radius:-1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1px;border-top-left-radius:-1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:-1px;border-top-left-radius:-1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:-1px;border-top-right-radius:-1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:-1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:-1px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1px;border-bottom-right-radius:-1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#303284}.panel-primary>.panel-heading{color:#fff;background-color:#303284;border-color:#303284}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#303284}.panel-primary>.panel-heading .badge{color:#303284;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#303284}.panel-success{border-color:#d5e5d3}.panel-success>.panel-heading{color:#4e844f;background-color:#e3eee3;border-color:#d5e5d3}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d5e5d3}.panel-success>.panel-heading .badge{color:#e3eee3;background-color:#4e844f}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d5e5d3}.panel-info{border-color:#c5cff7}.panel-info>.panel-heading{color:#5d61ea;background-color:#e4e5fc;border-color:#c5cff7}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c5cff7}.panel-info>.panel-heading .badge{color:#e4e5fc;background-color:#5d61ea}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c5cff7}.panel-warning{border-color:#ffbf91}.panel-warning>.panel-heading{color:#ab6400;background-color:#ffdcab;border-color:#ffbf91}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ffbf91}.panel-warning>.panel-heading .badge{color:#ffdcab;background-color:#ab6400}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ffbf91}.panel-danger{border-color:#e5afbc}.panel-danger>.panel-heading{color:#842b31;background-color:#ebc3c5;border-color:#e5afbc}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e5afbc}.panel-danger>.panel-heading .badge{color:#ebc3c5;background-color:#842b31}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e5afbc}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-print,.visible-print-block,.visible-print-inline,.visible-print-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}@media print{.visible-print-block{display:block!important}}@media print{.visible-print-inline{display:inline!important}}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#e3eee3}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d3e5d3}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#e4e5fc}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#cecff9}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#ffdcab}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#ffd291}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#ebc3c5}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#e5afb3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/apache.org-files/min.css.br b/test/modules/http2/htdocs/test1/apache.org-files/min.css.br Binary files differnew file mode 100644 index 0000000000..a58ad52f3d --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/min.css.br diff --git a/test/modules/http2/htdocs/test1/apache.org-files/mrunit.jpg b/test/modules/http2/htdocs/test1/apache.org-files/mrunit.jpg Binary files differnew file mode 100644 index 0000000000..7e5093da53 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/mrunit.jpg diff --git a/test/modules/http2/htdocs/test1/apache.org-files/search_box_icon.png b/test/modules/http2/htdocs/test1/apache.org-files/search_box_icon.png Binary files differnew file mode 100644 index 0000000000..bae336a45a --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/search_box_icon.png diff --git a/test/modules/http2/htdocs/test1/apache.org-files/small-logo.png b/test/modules/http2/htdocs/test1/apache.org-files/small-logo.png Binary files differnew file mode 100644 index 0000000000..b2d6ebb807 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/small-logo.png diff --git a/test/modules/http2/htdocs/test1/apache.org-files/styles.css b/test/modules/http2/htdocs/test1/apache.org-files/styles.css new file mode 100644 index 0000000000..a5e5565c63 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/styles.css @@ -0,0 +1,131 @@ +body { + padding-top:60px; + background-color: #fff; +} + +h1, h2, h3, h4, h5, h6 { + text-transform: uppercase; +} + +.navbar-default .navbar-toggle { + border: none; +} + +.navbar-toggle { + margin-top: 0px; + margin-bottom: 0px; +} + +section { + padding-bottom: 25px; +} + +ul.white > li > a, +a.white { + color: #ddd; +} + +ul.white > li > a:hover, +a.white:hover { + color: #fff; +} + +.white { + color: #fff; +} + +.bg-gray { + background: #eee; +} + +.letter-header { + display: block; + background-color: #f3f3f3; + color: #303284; + text-align: center; +} + +.list-unstyled { + list-style: none; +} + +.no-top-margin{ + margin-top: 0px; +} + +.no-btm-margin { + margin-bottom: 0px; +} + + +/* Custom Left Tabs */ + +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; + border: none; +} + +.tabs-left > .nav-tabs > li > a:hover:after { + content: ""; + position: absolute; + right: -24px; + top: 50%; + width: 0; + height: 0; + border-top: 25px solid transparent; + border-bottom: 25px solid transparent; + border-left: 25px solid #eee; + margin-top: -25px; +} + +.tabs-left > .nav-tabs > .active > a:after, +.tabs-left > .nav-tabs > .active > a:hover:after { + content: ""; + position: absolute; + right: -24px; + top: 50%; + width: 0; + height: 0; + border-top: 25px solid transparent; + border-bottom: 25px solid transparent; + border-left: 25px solid #303284; + margin-top: -25px; +} + + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + width: 90%; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border: none; +} + +/* Media Adjustments */ +@media (max-width: 992px){ +.navbar-nav > li > a { + padding-left: 5px; + } +} + +/* Prevent anchor links from displaying under the navbar */ +:target:before { + content: ""; + display: block; + height: 30px; + margin-top: -30px; +} diff --git a/test/modules/http2/htdocs/test1/apache.org-files/synapse.jpg b/test/modules/http2/htdocs/test1/apache.org-files/synapse.jpg Binary files differnew file mode 100644 index 0000000000..fb2f4570ff --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org-files/synapse.jpg diff --git a/test/modules/http2/htdocs/test1/apache.org.html b/test/modules/http2/htdocs/test1/apache.org.html new file mode 100644 index 0000000000..0265fcc174 --- /dev/null +++ b/test/modules/http2/htdocs/test1/apache.org.html @@ -0,0 +1,899 @@ +<!DOCTYPE html> +<html lang="en"><head> +<meta http-equiv="content-type" content="text/html; charset=UTF-8"> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta name="description" content="Home page of The Apache Software Foundation"> + <link rel="apple-touch-icon" sizes="57x57" href="http://apache.org/favicons/apple-touch-icon-57x57.png"> + <link rel="apple-touch-icon" sizes="60x60" href="http://apache.org/favicons/apple-touch-icon-60x60.png"> + <link rel="apple-touch-icon" sizes="72x72" href="http://apache.org/favicons/apple-touch-icon-72x72.png"> + <link rel="apple-touch-icon" sizes="76x76" href="http://apache.org/favicons/apple-touch-icon-76x76.png"> + <link rel="apple-touch-icon" sizes="114x114" href="http://apache.org/favicons/apple-touch-icon-114x114.png"> + <link rel="apple-touch-icon" sizes="120x120" href="http://apache.org/favicons/apple-touch-icon-120x120.png"> + <link rel="apple-touch-icon" sizes="144x144" href="http://apache.org/favicons/apple-touch-icon-144x144.png"> + <link rel="apple-touch-icon" sizes="152x152" href="http://apache.org/favicons/apple-touch-icon-152x152.png"> + <link rel="apple-touch-icon" sizes="180x180" href="http://apache.org/favicons/apple-touch-icon-180x180.png"> + <link rel="icon" type="image/png" href="http://apache.org/favicons/favicon-32x32.png" sizes="32x32"> + <link rel="icon" type="image/png" href="http://apache.org/favicons/favicon-194x194.png" sizes="194x194"> + <link rel="icon" type="image/png" href="http://apache.org/favicons/favicon-96x96.png" sizes="96x96"> + <link rel="icon" type="image/png" href="http://apache.org/favicons/android-chrome-192x192.png" sizes="192x192"> + <link rel="icon" type="image/png" href="http://apache.org/favicons/favicon-16x16.png" sizes="16x16"> + <link rel="manifest" href="http://apache.org/favicons/manifest.json"> + <link rel="shortcut icon" href="http://apache.org/favicons/favicon.ico"> + <meta name="msapplication-TileColor" content="#603cba"> + <meta name="msapplication-TileImage" content="/favicons/mstile-144x144.png"> + <meta name="msapplication-config" content="/favicons/browserconfig.xml"> + <meta name="theme-color" content="#303284"> + + <title>Welcome to The Apache Software Foundation!</title> + <link href="apache.org-files/css.css" rel="stylesheet" type="text/css"> + <link href="apache.org-files/min.css" rel="stylesheet"> + <link href="apache.org-files/styles.css" rel="stylesheet"> + + + + + +<script type="text/javascript" src="apache.org-files/jsapi.js"></script> +<link rel="stylesheet" href="apache.org-files/defaulten.css" type="text/css"> +<link rel="stylesheet" href="apache.org-files/default.css" type="text/css"> +<script src="apache.org-files/defaulten.js" type="text/javascript"></script> +<style type="text/css"> +.gsc-control-cse { +font-family: Arial, sans-serif; +border-color: #FFFFFF; +background-color: #FFFFFF; +} +.gsc-control-cse .gsc-table-result { +font-family: Arial, sans-serif; +} +input.gsc-input, .gsc-input-box, .gsc-input-box-hover, .gsc-input-box-focus { +border-color: #D9D9D9; +} +input.gsc-search-button, input.gsc-search-button:hover, input.gsc-search-button:focus { +border-color: #666666; +background-color: #CECECE; +background-image: none; +filter: none; +} +.gsc-tabHeader.gsc-tabhInactive { +border-color: #E9E9E9; +background-color: #E9E9E9; +} +.gsc-tabHeader.gsc-tabhActive { +border-color: #FF9900; +border-bottom-color: #FFFFFF; +background-color: #FFFFFF; +} +.gsc-tabsArea { +border-color: #FF9900; +} +.gsc-webResult.gsc-result, +.gsc-results .gsc-imageResult { +border-color: #FFFFFF; +background-color: #FFFFFF; +} +.gsc-webResult.gsc-result:hover, +.gsc-imageResult:hover { +border-color: #FFFFFF; +background-color: #FFFFFF; +} +.gs-webResult.gs-result a.gs-title:link, +.gs-webResult.gs-result a.gs-title:link b, +.gs-imageResult a.gs-title:link, +.gs-imageResult a.gs-title:link b { +color: #0000CC; +} +.gs-webResult.gs-result a.gs-title:visited, +.gs-webResult.gs-result a.gs-title:visited b, +.gs-imageResult a.gs-title:visited, +.gs-imageResult a.gs-title:visited b { +color: #0000CC; +} +.gs-webResult.gs-result a.gs-title:hover, +.gs-webResult.gs-result a.gs-title:hover b, +.gs-imageResult a.gs-title:hover, +.gs-imageResult a.gs-title:hover b { +color: #0000CC; +} +.gs-webResult.gs-result a.gs-title:active, +.gs-webResult.gs-result a.gs-title:active b, +.gs-imageResult a.gs-title:active, +.gs-imageResult a.gs-title:active b { +color: #0000CC; +} +.gsc-cursor-page { +color: #0000CC; +} +a.gsc-trailing-more-results:link { +color: #0000CC; +} +.gs-webResult .gs-snippet, +.gs-imageResult .gs-snippet, +.gs-fileFormatType { +color: #000000; +} +.gs-webResult div.gs-visibleUrl, +.gs-imageResult div.gs-visibleUrl { +color: #008000; +} +.gs-webResult div.gs-visibleUrl-short { +color: #008000; +} +.gs-webResult div.gs-visibleUrl-short { +display: none; +} +.gs-webResult div.gs-visibleUrl-long { +display: block; +} +.gs-promotion div.gs-visibleUrl-short { +display: none; +} +.gs-promotion div.gs-visibleUrl-long { +display: block; +} +.gsc-cursor-box { +border-color: #FFFFFF; +} +.gsc-results .gsc-cursor-box .gsc-cursor-page { +border-color: #E9E9E9; +background-color: #FFFFFF; +color: #0000CC; +} +.gsc-results .gsc-cursor-box .gsc-cursor-current-page { +border-color: #FF9900; +background-color: #FFFFFF; +color: #0000CC; +} +.gsc-webResult.gsc-result.gsc-promotion { +border-color: #336699; +background-color: #FFFFFF; +} +.gsc-completion-title { +color: #0000CC; +} +.gsc-completion-snippet { +color: #000000; +} +.gs-promotion a.gs-title:link, +.gs-promotion a.gs-title:link *, +.gs-promotion .gs-snippet a:link { +color: #0000CC; +} +.gs-promotion a.gs-title:visited, +.gs-promotion a.gs-title:visited *, +.gs-promotion .gs-snippet a:visited { +color: #0000CC; +} +.gs-promotion a.gs-title:hover, +.gs-promotion a.gs-title:hover *, +.gs-promotion .gs-snippet a:hover { +color: #0000CC; +} +.gs-promotion a.gs-title:active, +.gs-promotion a.gs-title:active *, +.gs-promotion .gs-snippet a:active { +color: #0000CC; +} +.gs-promotion .gs-snippet, +.gs-promotion .gs-title .gs-promotion-title-right, +.gs-promotion .gs-title .gs-promotion-title-right * { +color: #000000; +} +.gs-promotion .gs-visibleUrl, +.gs-promotion .gs-visibleUrl-short { +color: #008000; +}</style> +<style type="text/css">.gscb_a{display:inline-block;font:27px/13px arial,sans-serif}.gsst_a .gscb_a{color:#a1b9ed;cursor:pointer}.gsst_a:hover .gscb_a,.gsst_a:focus .gscb_a{color:#36c}.gsst_a{display:inline-block}.gsst_a{cursor:pointer;padding:0 4px}.gsst_a:hover{text-decoration:none!important}.gsst_b{font-size:16px;padding:0 2px;position:relative;user-select:none;-moz-user-select:none;white-space:nowrap}.gsst_e{opacity:0.55;}.gsst_a:hover .gsst_e,.gsst_a:focus .gsst_e{opacity:0.72;}.gsst_a:active .gsst_e{opacity:1;}.gsst_f{background:white;text-align:left}.gsst_g{background-color:white;border:1px solid #ccc;border-top-color:#d9d9d9;box-shadow:0 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);margin:-1px -3px;padding:0 6px}.gsst_h{background-color:white;height:1px;margin-bottom:-1px;position:relative;top:-1px}.gsib_a{width:100%;padding:4px 6px 0}.gsib_a,.gsib_b{vertical-align:top}.gssb_c{border:0;position:absolute;z-index:989}.gssb_e{border:1px solid #ccc;border-top-color:#d9d9d9;box-shadow:0 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);cursor:default}.gssb_f{visibility:hidden;white-space:nowrap}.gssb_k{border:0;display:block;position:absolute;top:0;z-index:988}.gsdd_a{border:none!important}.gsq_a{padding:0}.gsq_a{padding:0}.gscsep_a{display:none}.gssb_a{padding:0 7px}.gssb_a,.gssb_a td{white-space:nowrap;overflow:hidden;line-height:22px}#gssb_b{font-size:11px;color:#36c;text-decoration:none}#gssb_b:hover{font-size:11px;color:#36c;text-decoration:underline}.gssb_g{text-align:center;padding:8px 0 7px;position:relative}.gssb_h{font-size:15px;height:28px;margin:0.2em}.gssb_i{background:#eee}.gss_ifl{visibility:hidden;padding-left:5px}.gssb_i .gss_ifl{visibility:visible}a.gssb_j{font-size:13px;color:#36c;text-decoration:none;line-height:100%}a.gssb_j:hover{text-decoration:underline}.gssb_l{height:1px;background-color:#e5e5e5}.gssb_m{color:#000;background:#fff}.gsfe_a{border:1px solid #b9b9b9;border-top-color:#a0a0a0;box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);-webkit-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);}.gsfe_b{border:1px solid #4d90fe;outline:none;box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);}.gssb_a{padding:0 9px}.gsib_a{padding-right:8px;padding-left:8px}.gsst_a{padding-top:3px}.gssb_e{border:0}.gssb_l{margin:5px 0}.gssb_c .gsc-completion-container{position:static}.gssb_c{z-index:5000}.gsc-completion-container table{background:transparent;font-size:inherit;font-family:inherit}.gssb_c > tbody > tr,.gssb_c > tbody > tr > td,.gssb_d,.gssb_d > tbody > tr,.gssb_d > tbody > tr > td,.gssb_e,.gssb_e > tbody > tr,.gssb_e > tbody > tr > td{padding:0;margin:0;border:0}.gssb_a table,.gssb_a table tr,.gssb_a table tr td{padding:0;margin:0;border:0}</style> +</head> + +<body> +<!-- Navigation --> +<header> + <nav class="navbar navbar-default navbar-fixed-top"> + <div class="container"> + <div class="navbar-header"> + <button class="navbar-toggle" type="button" data-toggle="collapse" data-target="#mainnav-collapse"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a href="#" class="navbar-brand"><span class="glyphicon glyphicon-home"></span></a> + </div> + <div class="collapse navbar-collapse" id="mainnav-collapse"> + <div style="line-height:20px; padding-top:5px; float:left"><a href="http://apache.org/">Home</a></div> + <ul class="nav navbar-nav navbar-right"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">About <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="http://apache.org/foundation">Overview</a></li> + <li><a href="http://apache.org/foundation/members.html">Members</a></li> + <li><a href="http://apache.org/foundation/how-it-works.html">Process</a></li> + <li><a href="http://apache.org/foundation/sponsorship.html">Sponsorship</a></li> + <li><a href="http://apache.org/foundation/glossary.html">Glossary</a></li> + <li><a href="http://apache.org/foundation/preFAQ.html">FAQ</a></li> + <li><a href="http://apache.org/foundation/contact.html">Contact</a></li> + </ul> + </li> + <li><a href="http://apache.org/index.html#projects-list">Projects</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">People <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="http://people.apache.org/">Overview</a></li> + <li><a href="http://people.apache.org/committer-index.html">Committers</a></li> + <li><a href="http://apache.org/foundation/how-it-works.html#meritocracy">Meritocracy</a></li> + <li><a href="http://apache.org/foundation/how-it-works.html#roles">Roles</a></li> + <li><a href="http://planet.apache.org/">Planet Apache</a></li> + </ul> + </li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Get Involved <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="http://apache.org/foundation/getinvolved.html">Overview</a></li> + <li><a href="http://community.apache.org/">Community Development</a></li> + <li><a href="http://www.apachecon.com/">ApacheCon</a></li> + </ul> + </li> + <li><a href="http://apache.org/dyn/closer.cgi">Download</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Support Apache <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="http://apache.org/foundation/sponsorship.html">Sponsorship</a></li> + <li><a href="http://apache.org/foundation/contributing.html">Donations</a></li> + <li><a href="http://apache.org/foundation/buy_stuff.html">Buy Stuff</a></li> + <li><a href="http://apache.org/foundation/thanks.html">Thanks</a></li> + </ul> + </li> + </ul> + </div> + </div> + </nav> +</header> +<!-- / Navigation --> +<div class="container"> + <div class="row"> + <div class="col-md-9 col-sm-8 col-xs-12"> + <img src="apache.org-files/asf_logo.png" alt="Apache Logo" style="max-width: 100%;"> + </div> + <div class="col-md-3 col-sm-4 col-xs-12"> + <div class="input-group" style="margin-bottom: 5px;"> + <script src="apache.org-files/cse.js" async="" type="text/javascript"></script> + <a role="button" class="btn btn-block btn-default btn-xs" href="http://apache.org/foundation/governance/">The Apache Way</a> + <a role="button" class="btn btn-block btn-default btn-xs" href="https://community.apache.org/contributors/">Contribute</a> + <a role="button" class="btn btn-block btn-default btn-xs" href="http://apache.org/foundation/thanks.html">ASF Sponsors</a> + </div> + </div> +</div> + +<!-- Apache Statements Section --> +<section class="bg-gray"> + <div class="container"> + <div class="row"> + <div class="col-md-4"> + <style type="text/css"> +/* The following code is added by mdx_elementid.py + It was originally lifted from http://subversion.apache.org/style/site.css */ +/* + * Hide class="elementid-permalink", except when an enclosing heading + * has the :hover property. + */ +.headerlink, .elementid-permalink { + visibility: hidden; +} +h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style> +<h3>Open.</h3> + +<h5 class="no-btm-margin">The Apache Software Foundation</h5> + +<p class="small">provides support for the Apache Community of open-source software projects, which provide software products for the public good.</p> + </div> + <div class="col-md-4"> + <style type="text/css"> +/* The following code is added by mdx_elementid.py + It was originally lifted from http://subversion.apache.org/style/site.css */ +/* + * Hide class="elementid-permalink", except when an enclosing heading + * has the :hover property. + */ +.headerlink, .elementid-permalink { + visibility: hidden; +} +h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style> +<h3>Innovation.</h3> + +<h5 class="no-btm-margin">The Apache projects are defined</h5> + +<p class="small">by collaborative consensus based processes, an open, +pragmatic software license and a desire to create high quality software +that leads the way in its field.</p> + </div> + <div class="col-md-4"> + <style type="text/css"> +/* The following code is added by mdx_elementid.py + It was originally lifted from http://subversion.apache.org/style/site.css */ +/* + * Hide class="elementid-permalink", except when an enclosing heading + * has the :hover property. + */ +.headerlink, .elementid-permalink { + visibility: hidden; +} +h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style> +<h3>Community.</h3> + +<h5 class="no-btm-margin">We consider ourselves</h5> + +<p class="small">not simply a group of projects sharing a server, but rather a community of developers and users.</p> + </div> + </div> + </div> +</section> +<!-- / Apache Statements Section --> +<!-- Apache Featured Projects Section --> +<section class="container"> + <div class="row"> + <div class="col-md-12"> + <h2>Apache Projects</h2> + <p>The all-volunteer ASF develops, stewards, and incubates more +than 350 Open Source projects and initiatives that cover a wide range of + technologies. + From Abdera to Zookeeper, if you are looking for a rewarding +experience in Open Source and industry leading software, chances are you + are going to find it here. + <a href="http://apache.org/foundation/press/kit/#powerby">Are you powered by Apache?</a> + </p> +<!-- Featured Projects Section --> + <div class="container"> + <div class="row"> + <h3>Featured Project<span class="visible-md-inline visible-lg-inline">s</span></h3> + <div class="col-md-3 col-sm-12"> + <!-- tabs left --> + <div class="tabbable tabs-left visible-md-inline visible-lg-inline"> + <ul class="nav nav-tabs"> + + <li class="active"> + <a href="#1" data-toggle="tab">Apache MRUnit</a> + </li> + + <li> + <a href="#2" data-toggle="tab">Apache Synapse</a> + </li> + + <li> + <a href="#3" data-toggle="tab">Apache Ant</a> + </li> + + </ul> + </div> + </div> + <div class="col-md-9 col-sm-12"> + <div class="tab-content"> + + <div class="tab-pane fade in active" id="1"> + <div class="row"> + <div class="col-sm-2"> + <img class="img-responsive center-block" src="apache.org-files/mrunit.jpg" alt="Logo"> + </div> + <div class="col-sm-10"> + <h4 class="no-btm-margin"><a href="http://mrunit.apache.org/">Apache MRUnit</a></h4> + <p>The Apache MRUnit is a Java library that helps developers unit test Apache Hadoop map reduce jobs.</p> + <a class="btn btn-default btn-sm" href="http://mrunit.apache.org/" role="button">Learn More...</a> + </div> + </div> + </div> + + <div class="tab-pane fade in " id="2"> + <div class="row"> + <div class="col-sm-2"> + <img class="img-responsive center-block" src="apache.org-files/synapse.jpg" alt="Logo"> + </div> + <div class="col-sm-10"> + <h4 class="no-btm-margin"><a href="http://synapse.apache.org/">Apache Synapse</a></h4> + <p>Apache Synapse is a simple and highly effective ESB, Web Services intermediary and SOA framework. It can be +added to your existing network very simply either as a services gateway or as an HTTP proxy. Once Apache +Synapse is mediating your service requests it can perform many functions including routing,...</p> + <a class="btn btn-default btn-sm" href="http://synapse.apache.org/" role="button">Learn More...</a> + </div> + </div> + </div> + + <div class="tab-pane fade in " id="3"> + <div class="row"> + <div class="col-sm-2"> + <img class="img-responsive center-block" src="apache.org-files/ant.jpg" alt="Logo"> + </div> + <div class="col-sm-10"> + <h4 class="no-btm-margin"><a href="http://ant.apache.org/">Apache Ant</a></h4> + <p>Apache Ant is a Java-based build tool.</p> + <a class="btn btn-default btn-sm" href="http://ant.apache.org/" role="button">Learn More...</a> + </div> + </div> + </div> + + </div><!-- /tab-content --> + </div><!-- /container --> + </div><!-- /tabs --> + </div><!-- /column --> +<!-- / Featured Projects Section --> + </div> + </div> +</section> +<!-- / Apache Featured Projects Section --> +<!-- Updates Section --> +<section class="bg-gray"> + <div class="bg-info"> + <div class="container"> + <h2 class="no-btm-margin">Latest News</h2> + <p class="small"> + Keep up with the ASF's news and announcements by + <a href="http://apache.org/foundation/mailinglists.html#foundation-announce">subscribing to the Apache Announcements List</a>, + and following the <a href="https://blogs.apache.org/foundation/">Foundation Blog</a> + and <a href="https://twitter.com/TheASF">@TheASF on Twitter</a>. + </p> + </div> + </div> + <br> + <div class="container"> + <div class="row"> + <div class="col-md-8"> + <div class="panel panel-default"> + <div class="panel-body"> + + <h4><a href="http://mail-archives.us.apache.org/mod_mbox/www-announce/201511.mbox/%3c1766075582.6448050.1447364293441.JavaMail.yahoo@mail.yahoo.com%3e">Summary of the Apache Roadshow 2015 - China</a></h4> + >> this announcement is available online at <a href="http://s.apache.org/q2L">http://s.apache.org/q2L</a><br> <br>by Ted Liu, event co-organizer <br> <br>On 24-25 October, The Apache Roadshow 2015 - China in Beijing was successfully concluded. +It... + <hr> + + <h4><a href="http://mail-archives.us.apache.org/mod_mbox/www-announce/201511.mbox/%3c56449B7A.90008@apache.org%3e">[ANNOUNCE] Apache Jackrabbit Oak 1.3.10 released</a></h4> + The Apache Jackrabbit community is pleased to announce the release of +Apache Jackrabbit Oak 1.3.10 The release is available for download at:<br> <br> <a href="http://jackrabbit.apache.org/downloads.html">http://jackrabbit.apache.org/downloads.html</a><br> <br>See the full release notes... + <hr> + + <h4><a href="http://mail-archives.us.apache.org/mod_mbox/www-announce/201511.mbox/%3cCAGvacBnoz+m5b30dZ27H4NnAacCUt9HaMt3h2mU9LMiJFMmUDA@mail.gmail.com%3e">[ANNOUNCEMENT] Apache Camel 2.14.4 Released</a></h4> + The Apache Camel community announces the immediate availability of the +new patch release Apache Camel 2.14.4. This release contains 18 fixes +applied in the past few weeks by the community... + + + </div> + </div> + </div> + <div class="col-md-4"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title">Latest Activity</h4> + </div> + <div class="panel-body"> + + <div> + <a href="https://twitter.com/TheASF/statuses/664920266397646848">@</a> + <a href="http://twitter.com/TheASF">TheASF</a>: Summary of the Apache Roadshow 2015 - China <a href="https://t.co/HrxlmcHz51">https://t.co/HrxlmcHz51</a> <a href="http://twitter.com/search?q=%23Apache">#Apache</a> <a href="http://twitter.com/search?q=%23Community">#Community</a> <a href="http://twitter.com/search?q=%23China">#China</a> <a href="http://twitter.com/search?q=%23Beijing">#Beijing</a> <a href="http://twitter.com/brettporter">@brettporter</a> <a href="http://twitter.com/ke4qqq">@ke4qqq</a> <a href="http://twitter.com/jaaronfarr">@jaaronfarr</a> + </div> + <hr> + + <div> + <a href="https://twitter.com/TheASF/statuses/664035393797537792">@</a> + <a href="http://twitter.com/TheASF">TheASF</a>: The Apache Software Foundation announces Apache Cassandra v3.0 <a href="https://t.co/KR134FEnak">https://t.co/KR134FEnak</a> <a href="http://twitter.com/search?q=%23BigData">#BigData</a> <a href="http://twitter.com/search?q=%23distributed">#distributed</a> <a href="http://twitter.com/search?q=%23database">#database</a> <a href="http://twitter.com/cassandra">@cassandra</a> + </div> + <hr> + + <div> + <a href="https://twitter.com/TheASF/statuses/664023691051843584">@</a> + <a href="http://twitter.com/TheASF">TheASF</a>: Apache Commons statement to widespread Java object de-serialisation vulnerability <a href="https://t.co/gFRLOIMXe1">https://t.co/gFRLOIMXe1</a> <a href="http://twitter.com/ApacheCommons">@ApacheCommons</a> <a href="http://twitter.com/search?q=%23security">#security</a> <a href="http://twitter.com/search?q=%23Java">#Java</a> + </div> + + + </div> + </div> + </div> + <div class="col-md-12"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title">Apache Blogs</h4> + </div> + <div class="panel-body"> + + <h5><a class="entryTitle" href="https://blogs.apache.org/foundation/entry/summary_of_the_apache_roadshow">Summary of the Apache Roadshow 2015 - China</a></h5> + <p></p><p><i>by Ted Liu, event organizing committee +member, co-founder of KAIYUANSHE, and Principal Technical +Evangelist, Open Technology Center, Microsoft China</i></p> + <p>On 24-25 October, The Apache Roadshow 2015 - China in Beijing was...</p><p></p> + <hr> + + <h5><a class="entryTitle" href="https://blogs.apache.org/foundation/entry/the_apache_software_foundation_announces82">The Apache Software Foundation announces Apache™ Cassandra™ v3.0</a></h5> + <p></p><div><b><i>Open Source distributed database +management system simplifies Big Data application development with new +features, performance optimizations, and significant storage savings</i></b></div> + <div><b><br></b></div> + <div><b>Forest Hill, MD —10 November 2015—</b> The Apache Software Foundation...</div><p></p> + <hr> + + <h5><a class="entryTitle" href="https://blogs.apache.org/foundation/entry/apache_commons_statement_to_widespread">Apache Commons statement to widespread Java object de-serialisation vulnerability</a></h5> + <p></p><div><strong><em>Authors: Bernd Eckenfels, Committer, and Gary Gregory, Vice President of Apache Commons</em></strong></div> + <div><br></div> + <div>In their talk <a href="http://frohoff.github.io/appseccali-marshalling-pickles/">"Marshalling Pickles - how deserializing objects will ruin your day"</a> at AppSecCali2015 Gabriel Lawrence (...</div><p></p> + + + </div> + </div> + </div> + </div> + </div> +</section> +<!-- / Updates Section --> +<!-- Apache Projects List --> +<section id="projects-list"> + <div class="container"> + <div class="row"> + <div class="col-sm-12"> + <h2>Apache Project List</h2> + </div> + <div class="col-sm-2" id="by_category"><!-- id for eventual use by whimsy; do not move --> + <h4>By Category</h4> + <ul class="list-unstyled"> + <li><a href="http://projects.apache.org/">Overview</a></li> + <li><a href="http://projects.apache.org/indexes/alpha.html">All Projects</a></li> + <li><a href="http://attic.apache.org/" title="A home for dormant projects">Attic</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#big-data">Big Data</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#build-management">Build Management</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#cloud">Cloud</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#content">Content</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#database">Databases</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#ftp">FTP</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#graphics">Graphics</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#http">HTTP</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#httpd-module">HTTP-module</a></li> + <li><a href="http://incubator.apache.org/" title="Entry path for projects and codebases wishing to become part of the Foundation's efforts">Incubating</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#javaee">JavaEE</a></li> + <li><a href="http://labs.apache.org/" title="A place for innovation where committers of the foundation can experiment with new ideas">Labs</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#library">Libraries</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#mail">Mail</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#mobile">Mobile</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#network-client">Network-client</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#network-server">Network-server</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#osgi">OSGi</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#regexp">RegExp</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#retired">Retired</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#testing">Testing</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#virtual-machine">Virtual-machine</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#web-framework">Web-framework</a></li> + <li><a href="http://projects.apache.org/indexes/category.html#xml">XML</a></li> + <li><a href="http://apache.org/foundation/preFAQ.html">FAQ</a></li> + </ul> + </div> + <div class="col-sm-10"> + <div class="row"> + <div class="col-md-12" id="by_name"><!-- id for eventual use by whimsy; do not move --> + <h4>By Name</h4> + <div class="col-lg-4 col-sm-4"> + <div class="row"> + <div class="col-lg-6 col-md-12 border-right"> + <ul class="list-unstyled" style="margin-bottom: 0px;"> + <li><a href="http://httpd.apache.org/" title="Apache Web Server (httpd)">HTTP Server</a></li> + <li class="letter-header">A</li> + <li><a href="http://abdera.apache.org/" title="Atom Publishing Protocol Implementation">Abdera</a></li> + <li><a href="http://accumulo.apache.org/" title="Sorted, distributed key/value store">Accumulo</a></li> + <li><a href="http://ace.apache.org/" title="Centralized life cycle management and deployment of OSGi based and related modular software artifacts for distribution.">ACE</a></li> + <li><a href="http://activemq.apache.org/" title="Distributed Messaging System">ActiveMQ</a></li> + <li><a href="http://airavata.apache.org/" title="Workflow and Computational Job Management Middleware">Airavata</a></li> + <li><a href="http://allura.apache.org/" title="Forge software for hosting software projects">Allura</a></li> + <li><a href="http://ambari.apache.org/" title="Hadoop cluster management">Ambari</a></li> + <li><a href="http://ant.apache.org/" title="Java-based build tool">Ant</a></li> + <li><a href="http://any23.apache.org/" title="Anything to Triples">Any23</a></li> + <li><a href="http://apr.apache.org/" title="Apache Portable Runtime libraries">APR</a></li> + <li><a href="http://archiva.apache.org/" title="Build Artifact Repository Manager">Archiva</a></li> + <li><a href="http://aries.apache.org/" title="Enterprise OSGi application programming model">Aries</a></li> + <li><a href="http://aurora.apache.org/" title="Mesos framework for long-running services and cron jobs">Aurora</a></li> + <li><a href="http://avro.apache.org/" title="A Serialization System">Avro</a></li> + <li><a href="http://axis.apache.org/" title="Java SOAP Engine">Axis</a></li> + <li class="letter-header">B</li> + <li><a href="http://bigtop.apache.org/" title="Apache Hadoop ecosystem integration and distribution project">Bigtop</a></li> + <li><a href="http://bloodhound.apache.org/" title="Issue tracking, wiki and repository browser">Bloodhound</a></li> + <li><a href="http://bookkeeper.apache.org/" title="Replicated log service which can be used to build replicated state machines">BookKeeper</a></li> + <li><a href="http://buildr.apache.org/" title="Simple and intuitive build system for Java applications">Buildr</a></li> + <li><a href="http://bval.apache.org/" title="Apache BVal: JSR-303 Bean Validation Implementation and Extensions">BVal</a></li> + <li class="letter-header">C</li> + <li><a href="http://camel.apache.org/" title="Spring based Integration Framework which implements the Enterprise Integration Patterns">Camel</a></li> + <li><a href="http://cassandra.apache.org/" title="Highly scalable second-generation distributed database">Cassandra</a></li> + <li><a href="http://cayenne.apache.org/" title="User-friendly Java ORM with Tools">Cayenne</a></li> + <li><a href="http://celix.apache.org/" title="Implementation of the OSGi specification adapted to C">Celix</a></li> + <li><a href="http://chemistry.apache.org/" title="CMIS (Content Managment Interoperability Services) Clients and Servers">Chemistry</a></li> + <li><a href="http://chukwa.apache.org/" title="Open source data collection system for monitoring large distributed systems.">Chukwa</a></li> + <li><a href="http://clerezza.apache.org/" title="Semantically linked data for OSGi">Clerezza</a></li> + <li><a href="http://cloudstack.apache.org/" title="Infrastructure as a Service solution">CloudStack</a></li> + <li><a href="http://cocoon.apache.org/" title="Web development framework: separation of concerns, component-based">Cocoon</a></li> + </ul> + </div> + <div class="col-lg-6 col-md-12 border-right"> + <ul class="list-unstyled" style="margin-bottom: 0px;"> + <li><a href="http://commons.apache.org/" title="Reusable Java components">Commons</a></li> + <li><a href="http://continuum.apache.org/" title="Continuous Integration and Build Server">Continuum</a></li> + <li><a href="http://cordova.apache.org/" title="Platform for building native mobile applications using HTML, CSS and JavaScript">Cordova</a></li> + <li><a href="http://couchdb.apache.org/" title="RESTful document database">CouchDB</a></li> + <li><a href="http://creadur.apache.org/" title="Comprehension and auditing of software distributions">Creadur</a></li> + <li><a href="http://crunch.apache.org/" title="Simple and Efficient MapReduce Pipelines">Crunch</a></li> + <li><a href="http://ctakes.apache.org/" title="Natural language processing (NLP) tool for information extraction from electronic medical record clinical free-text">cTAKES</a></li> + <li><a href="http://curator.apache.org/" title="Java libraries that make using Apache ZooKeeper easier">Curator</a></li> + <li><a href="http://cxf.apache.org/" title="Service Framework">CXF</a></li> + <li class="letter-header">D</li> + <li><a href="http://db.apache.org/" title="Database access">DB</a></li> + <li><a href="http://deltaspike.apache.org/" title="Portable CDI extensions that provide useful features for Java application developers">DeltaSpike</a></li> + <li><a href="http://devicemap.apache.org/" title="data repository containing device information, images and other relevant information for all sorts of mobile devices">DeviceMap</a></li> + <li><a href="http://directory.apache.org/" title="Apache Directory Server">Directory</a></li> + <li><a href="http://drill.apache.org/" title="Schema-free SQL Query Engine for Hadoop, NoSQL and Cloud Storage">Drill</a></li> + <li class="letter-header">E</li> + <li><a href="http://empire-db.apache.org/" title="Relational Data Persistence">Empire-db</a></li> + <li><a href="http://etch.apache.org/" title="Cross-platform, language- and transport-independent RPC-like messaging framework">Etch</a></li> + <li class="letter-header">F</li> + <li><a href="http://falcon.apache.org/" title="Data management and processing platform.">Falcon</a></li> + <li><a href="http://felix.apache.org/" title="OSGi Framework and components.">Felix</a></li> + <li><a href="http://flex.apache.org/" title="Application framework for expressive web applications that deploy to all major browsers, desktops and devices.">Flex</a></li> + <li><a href="http://flink.apache.org/" title="platform for scalable batch and stream data processing">Flink</a></li> + <li><a href="http://flume.apache.org/" title="A reliable service for efficiently collecting, aggregating, and moving large amounts of log data">Flume</a></li> + <li><a href="http://forrest.apache.org/" title="Aggregated multi-channel documentation, separation of concerns">Forrest</a></li> + <li class="letter-header">G</li> + <li><a href="http://geronimo.apache.org/" title="Java2, Enterprise Edition (J2EE) container">Geronimo</a></li> + <li><a href="http://giraph.apache.org/" title="Iterative graph processing system built for high scalability">Giraph</a></li> + <li><a href="http://gora.apache.org/" title="ORM framework for column stores such as Apache HBase and Apache Cassandra with a specific focus on Hadoop">Gora</a></li> + <li><a href="http://gump.apache.org/" title="Continuous integration of open source projects">Gump</a></li> + </ul> + </div> + </div> + </div> + <div class="col-lg-4 col-sm-4"> + <div class="row"> + <div class="col-lg-6 col-md-12 border-right"> + <ul class="list-unstyled" style="margin-bottom: 0px;"> + <li class="letter-header">H</li> + <li><a href="http://hadoop.apache.org/" title="Distributed computing platform">Hadoop</a></li> + <li><a href="http://hama.apache.org/" title="a Bulk Synchronous Parallel computing framework on top of Hadoop">Hama</a></li> + <li><a href="http://hbase.apache.org/" title="Hadoop Database">HBase</a></li> + <li><a href="http://helix.apache.org/" title="A cluster management framework for partitioned and replicated distributed resources">Helix</a></li> + <li><a href="http://hive.apache.org/" title="Data warehouse infrastructure using the Hadoop Database">Hive</a></li> + <li><a href="http://hc.apache.org/" title="Java toolset of low level HTTP components">HttpComponents</a></li> + <li class="letter-header">I</li> + <li><a href="http://isis.apache.org/" title="Framework for rapidly developing domain-driven apps in Java">Isis</a></li> + <li><a href="http://ignite.apache.org/" title="High-performance, integrated and distributed in-memory platform for computing and transacting on large-scale data sets in real-time">Ignite</a></li> + <li class="letter-header">J</li> + <li><a href="http://jackrabbit.apache.org/" title="Content Repository for Java">Jackrabbit</a></li> + <li><a href="http://james.apache.org/" title="Java Apache Mail Enterprise Server">James</a></li> + <li><a href="http://jclouds.apache.org/" title="Java cloud APIs and abstractions">jclouds</a></li> + <li><a href="http://jena.apache.org/" title="Java framework for building Semantic Web applications">Jena</a></li> + <li><a href="http://jmeter.apache.org/" title="Java performance and functional testing">JMeter</a></li> + <li><a href="http://jspwiki.apache.org/" title="Leading open source WikiWiki engine, feature-rich and built around standard J2EE components (Java, servlets, JSP). ">JSPWiki</a></li> + <li><a href="http://juddi.apache.org/" title="Java implementation of the Universal Description, Discovery, and Integration specification">jUDDI</a></li> + <li class="letter-header">K</li> + <li><a href="http://kafka.apache.org/" title="Distributed publish-subscribe messaging system">Kafka</a></li> + <li><a href="http://karaf.apache.org/" title="Server-side OSGi distribution">Karaf</a></li> + <li><a href="http://knox.apache.org/" title="Simplify and normalize the deployment and implementation of secure Hadoop clusters">Knox</a></li> + <li class="letter-header">L</li> + <li><a href="http://lens.apache.org/" title="Unified analytics platform">Lens</a></li> + <li><a href="http://libcloud.apache.org/" title="Unified interface to the cloud">Libcloud</a></li> + <li><a href="http://logging.apache.org/" title="Cross-language logging services">Logging</a></li> + <li><a href="http://lucene.apache.org/" title="Search engine library">Lucene</a></li> + <li><a href="http://lucenenet.apache.org/" title="Search engine library targeted at .NET runtime users.">Lucene.Net</a></li> + <li><a href="http://lucy.apache.org/" title="Search engine library for dynamic languages">Lucy</a></li> + </ul> + </div> + <div class="col-lg-6 col-md-12 border-right"> + <ul class="list-unstyled" style="margin-bottom: 0px;"> + <li class="letter-header">M</li> + <li><a href="http://mahout.apache.org/" title="Scalable machine learning library">Mahout</a></li> + <li><a href="http://manifoldcf.apache.org/" title="Framework for connecting source content repositories to target repositories or indexes.">ManifoldCF</a></li> + <li><a href="http://marmotta.apache.org/" title="An Open Platform for Linked Data">Marmotta</a></li> + <li><a href="http://maven.apache.org/" title="Java project management and comprehension tools">Maven</a></li> + <li><a href="http://mesos.apache.org/" title="a cluster manager that provides efficient resource isolation and sharing across distributed applications">Mesos</a></li> + <li><a href="http://metamodel.apache.org/" title="common interface for discovery, exploration of metadata and querying of different types of data sources">MetaModel</a></li> + <li><a href="http://mina.apache.org/" title="Multipurpose Infrastructure for Network Application">MINA</a></li> + <li><a href="http://mrunit.apache.org/" title="Java library that helps developers unit test Apache Hadoop map reduce jobs">MRUnit</a></li> + <li><a href="http://myfaces.apache.org/" title="JavaServer(tm) Faces implementation and components">MyFaces</a></li> + <li class="letter-header">N</li> + <li><a href="http://nutch.apache.org/" title="Open Source Web Search Software">Nutch</a></li> + <li><a href="http://nifi.apache.org/" title="Easy to use, powerful, and reliable system to process and distribute data">Nifi</a></li> + <li class="letter-header">O</li> + <li><a href="http://ode.apache.org/" title="Orchestration Director Engine: Business Process Management (BPM), Process Orchestration and Workflow through service composition.">ODE</a></li> + <li><a href="http://ofbiz.apache.org/" title="Open for Business: enterprise automation software">OFBiz</a></li> + <li><a href="http://olingo.apache.org/" title="OASIS OData protocol libraries">Olingo</a></li> + <li><a href="http://oltu.apache.org/" title="OAuth protocol implementation in Java">Oltu</a></li> + <li><a href="http://onami.apache.org/" title="Development and maintenance of a set of Google Guice extensions">Onami</a></li> + <li><a href="http://oodt.apache.org/" title="Object Oriented Data Technology (middleware metadata)">OODT</a></li> + <li><a href="http://oozie.apache.org/" title="A workflow scheduler system to manage Apache Hadoop jobs.">Oozie</a></li> + <li><a href="http://climate.apache.org/" title="Climate model evaluation">Open Climate Workbench</a></li> + <li><a href="http://openjpa.apache.org/" title="OpenJPA: Object Relational Mapping for Java">OpenJPA</a></li> + <li><a href="http://openmeetings.apache.org/" title="OpenMeetings: Web-Conferencing and real-time collaboration">OpenMeetings</a></li> + <li><a href="http://opennlp.apache.org/" title="Machine learning based toolkit for the processing of natural language text">OpenNLP</a></li> + <li><a href="http://openoffice.apache.org/" title="An open-source, office-document productivity suite">OpenOffice</a></li> + <li><a href="http://openwebbeans.apache.org/" title="OpenWebBeans: JSR-299 Context and Dependency Injection for Java EE Platform Implementation">OpenWebBeans</a></li> + <li><a href="http://orc.apache.org/" title="the smallest, fastest columnar storage for Hadoop workloads">Orc</a></li> + <li class="letter-header">P</li> + <li><a href="http://parquet.apache.org/" title="columnar storage format available to any project in the Hadoop ecosystem">Parquet</a></li> + <li><a href="http://pdfbox.apache.org/" title="Java library for working with PDF documents">PDFBox</a></li> + <li><a href="http://perl.apache.org/" title="Dynamic websites using Perl">Perl</a></li> + <li><a href="http://phoenix.apache.org/" title="High performance relational database layer over HBase for low latency applications">Phoenix</a></li> + <li><a href="http://pig.apache.org/" title="Platform for analyzing large data sets">Pig</a></li> + <!-- N.B. entries for "P" are continued below --> + </ul> + </div> + </div> + </div> + <div class="col-lg-4 col-sm-4"> + <div class="row"> + <div class="col-lg-6 col-md-12 border-right"> + <ul class="list-unstyled" style="margin-bottom: 0px;"> + <li><a href="http://pivot.apache.org/" title="Rich Internet applications in Java">Pivot</a></li> + <li><a href="http://poi.apache.org/" title="Java API for OLE 2 Compound and OOXML Documents">POI</a></li> + <li><a href="http://portals.apache.org/" title="Portal technology">Portals</a></li> + <li class="letter-header">Q</li> + <li><a href="http://qpid.apache.org/" title="Multiple language implementation of the latest Advanced Message Queuing Protocol (AMQP)">Qpid</a></li> + <li class="letter-header">R</li> + <li><a href="http://rave.apache.org/" title="Web and social mashup engine">Rave</a></li> + <li><a href="http://river.apache.org/" title="Jini service oriented architecture">River</a></li> + <li><a href="http://roller.apache.org/" title="Java blog server">Roller</a></li> + <li class="letter-header">S</li> + <li><a href="http://samza.apache.org/" title="distributed stream processing framework">Samza</a></li> + <li><a href="http://santuario.apache.org/" title="XML Security in Java and C++">Santuario</a></li> + <li><a href="http://serf.apache.org/" title="High performance C-based HTTP client library built upon the Apache Portable Runtime (APR) library">Serf</a></li> + <li><a href="http://servicemix.apache.org/" title="Enterprise Service Bus">ServiceMix</a></li> + <li><a href="http://shindig.apache.org/" title="Opensocial Reference Implementation">Shindig</a></li> + <li><a href="http://shiro.apache.org/" title="Powerful and easy-to-use application security framework">Shiro</a></li> + <li><a href="http://sis.apache.org/" title="Spatial Information System">SIS</a></li> + <li><a href="http://sling.apache.org/" title="Web Framework for JCR Content Repositories">Sling</a></li> + <li><a href="http://spamassassin.apache.org/" title="Mail filter to identify spam">SpamAssassin</a></li> + <li><a href="http://spark.apache.org/" title="Fast and general engine for large-scale data processing">Spark</a></li> + <li><a href="http://sqoop.apache.org/" title="Bulk Data Transfer for Hadoop and Structured Datastores">Sqoop</a></li> + <li><a href="http://stanbol.apache.org/" title="Reusable components for semantic content management">Stanbol</a></li> + <li><a href="http://steve.apache.org/" title="Apache's Python based single transferable vote software system">STeVe</a></li> + <li><a href="http://storm.apache.org/" title="Distributed, real-time computation system">Storm</a></li> + <li><a href="http://stratos.apache.org/" title="highly-extensible Platform-as-a-Service (PaaS) framework">Stratos</a></li> + <li><a href="http://struts.apache.org/" title="Model 2 framework for building Java web applications">Struts</a></li> + <li><a href="http://subversion.apache.org/" title="Version Control">Subversion</a></li> + <li><a href="http://synapse.apache.org/" title="Enterprise Service Bus and Mediation Framework">Synapse</a></li> + <li><a href="http://syncope.apache.org/" title="Managing digital identities in enterprise environments">Syncope</a></li> + <li class="letter-header">T</li> + <li><a href="http://tajo.apache.org/" title="Big data warehouse system on Hadoop">Tajo</a></li> + <li><a href="http://tapestry.apache.org/" title="Component-based Java Web Application Framework">Tapestry</a></li> + <li><a href="http://tcl.apache.org/" title="Dynamic websites using TCL">Tcl</a></li> + <!-- N.B. entries for "T" are continued below --> + </ul> + </div> + <div class="col-lg-6 col-md-12"> + <ul class="list-unstyled" style="margin-bottom: 0px;"> + <li><a href="http://tez.apache.org/" title="High-performance and scalable distributed data processing framework">Tez</a></li> + <li><a href="http://thrift.apache.org/" title="Framework for scalable cross-language services development">Thrift</a></li> + <li><a href="http://tika.apache.org/" title="Content Analysis and Detection Toolkit">Tika</a></li> + <li><a href="http://tiles.apache.org/" title="A templating framework for web application user interfaces">Tiles</a></li> + <li><a href="http://tomcat.apache.org/" title="A Java Servlet and JSP Container">Tomcat</a></li> + <li><a href="http://tomee.apache.org/" title="Java EE Web Profile built on Tomcat">TomEE</a></li> + <li><a href="http://trafficserver.apache.org/" title="A fast, scalable and extensible HTTP/1.1 compliant caching proxy server">Traffic Server</a></li> + <li><a href="http://turbine.apache.org/" title="A Java Servlet Web Application Framework and associated component library">Turbine</a></li> + <li><a href="http://tuscany.apache.org/" title="An SCA based Service Composition Framework">Tuscany</a></li> + <li class="letter-header">U</li> + <li><a href="http://uima.apache.org/" title="Framework and annotators for unstructured information analysis">UIMA</a></li> + <li><a href="http://usergrid.apache.org/" title="The BaaS Framework you run">Usergrid</a></li> + <li class="letter-header">V</li> + <li><a href="http://vcl.apache.org/" title="Virtual Computing Lab">VCL</a></li> + <li><a href="http://velocity.apache.org/" title="A Java Templating Engine">Velocity</a></li> + <li><a href="http://vxquery.apache.org/" title="A parallel XQuery processor">VXQuery</a></li> + <li class="letter-header">W</li> + <li><a href="http://ws.apache.org/" title="Projects related to Web Services">Web Services</a></li> + <li><a href="http://whimsy.apache.org/" title="Tools that help automate various administrative tasks or information lookup activities">Whimsy</a></li> + <li><a href="http://wicket.apache.org/" title="Component-based Java Web Application Framework.">Wicket</a></li> + <li><a href="http://wink.apache.org/" title="RESTful Web services Framework">Wink</a></li> + <li><a href="http://wookie.apache.org/" title="Widgets for Applications">Wookie</a></li> + <li class="letter-header">X</li> + <li><a href="http://xalan.apache.org/" title="XSLT processors in Java and C++">Xalan</a></li> + <li><a href="http://xerces.apache.org/" title="XML parsers in Java, C++ and Perl">Xerces</a></li> + <li><a href="http://xmlbeans.apache.org/" title="XML-Java binding tool">XMLBeans</a></li> + <li><a href="http://xmlgraphics.apache.org/" title="Conversion from XML to graphical output">XML Graphics</a></li> + <li class="letter-header">Y</li> + <li><a href="http://yetus.apache.org/" title="Collection of libraries and tools that enable contribution and release processes for software projects">Yetus</a></li> + <li class="letter-header">Z</li> + <li><a href="http://zest.apache.org/" title="community based effort exploring Composite Oriented Programming for domain centric application development">Zest</a></li> + <li><a href="http://zookeeper.apache.org/" title="Centralized service for maintaining configuration information">ZooKeeper</a></li> + </ul> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</section> +<!-- / Projects List --> + + +<!-- Footer --> + +<footer class="bg-primary"> + <div class="container"> + <div class="row"> + <br> + <div class="col-sm-1"> + + </div> + <div class="col-sm-2"> + <h5 class="white">Community</h5> + <ul class="list-unstyled white" role="menu"> + <li><a href="http://community.apache.org/">Overview</a></li> + <li><a href="http://apache.org/foundation/conferences.html">Conferences</a></li> + <li><a href="http://community.apache.org/gsoc.html">Summer of Code</a></li> + <li><a href="http://community.apache.org/newcomers/">Getting Started</a></li> + <li><a href="http://apache.org/foundation/how-it-works.html">The Apache Way</a></li> + <li><a href="http://apache.org/travel/">Travel Assistance</a></li> + <li><a href="http://apache.org/foundation/getinvolved.html">Get Involved</a></li> + <li><a href="http://community.apache.org/newbiefaq.html">Community FAQ</a></li> + </ul> + </div> + + <div class="col-sm-2"> + <h5 class="white">Innovation</h5> + <ul class="list-unstyled white" role="menu"> + <li><a href="http://incubator.apache.org/">Incubator</a></li> + <li><a href="http://labs.apache.org/">Labs</a></li> + <li><a href="http://apache.org/licenses/">Licensing</a></li> + <li><a href="http://apache.org/foundation/license-faq.html">Licensing FAQ</a></li> + <li><a href="http://apache.org/foundation/marks/">Trademark Policy</a></li> + <li><a href="http://apache.org/foundation/contact.html">Contacts</a></li> + </ul> + </div> + + <div class="col-sm-2"> + <h5 class="white">Tech Operations</h5> + <ul class="list-unstyled white" role="menu"> + <li><a href="http://apache.org/dev/">Developer Information</a></li> + <li><a href="http://apache.org/dev/infrastructure.html">Infrastructure</a></li> + <li><a href="http://apache.org/security/">Security</a></li> + <li><a href="http://status.apache.org/">Status</a></li> + <li><a href="http://apache.org/foundation/contact.html">Contacts</a></li> + </ul> + </div> + + <div class="col-sm-2"> + <h5 class="white">Press</h5> + <ul class="list-unstyled white" role="menu"> + <li><a href="http://apache.org/press/">Overview</a></li> + <li><a href="https://blogs.apache.org/">ASF News</a></li> + <li><a href="https://blogs.apache.org/foundation/">Announcements</a></li> + <li><a href="https://twitter.com/TheASF">Twitter Feed</a></li> + <li><a href="http://apache.org/press/#contact">Contacts</a></li> + </ul> + </div> + + <div class="col-sm-2"> + <h5 class="white">Legal</h5> + <ul class="list-unstyled white" role="menu"> + <li><a href="http://apache.org/legal/">Legal Affairs</a></li> + <li><a href="http://apache.org/licenses/">Licenses</a></li> + <li><a href="http://apache.org/foundation/marks/">Trademark Policy</a></li> + <li><a href="http://apache.org/foundation/records/">Public Records</a></li> + <li><a href="http://apache.org/foundation/policies/privacy.html">Privacy Policy</a></li> + <li><a href="http://apache.org/licenses/exports/">Export Information</a></li> + <li><a href="http://apache.org/foundation/license-faq.html">License/Distribution FAQ</a></li> + <li><a href="http://apache.org/foundation/contact.html">Contacts</a></li> + </ul> + </div> + + <div class="col-sm-1"> + </div> + + </div> + <hr class="col-lg-12 hr-white"> + <div class="row"> + <div class="col-lg-12"> + <p class="text-center">Copyright © 2015 The Apache Software Foundation, Licensed under the <a class="white" href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> + <p class="text-center">Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</p> + </div> + </div> + </div> + +</footer> + +<!-- / Footer --> + +<script src="apache.org-files/jquery-2.js"></script> + + +<table class="gstl_50 gssb_c" style="width: 146px; display: none; top: 93px; left: 927px; position: absolute;" cellpadding="0" cellspacing="0"><tbody><tr><td class="gssb_f"></td><td style="width: 100%;" class="gssb_e"></td></tr></tbody></table></body></html>
\ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/index.html b/test/modules/http2/htdocs/test1/index.html new file mode 100644 index 0000000000..9f752b52f0 --- /dev/null +++ b/test/modules/http2/htdocs/test1/index.html @@ -0,0 +1,46 @@ +<html> + <head> + <title>mod_h2 test site</title> + </head> + <body> + <h1>mod_h2 test site</h1> + <p></p> + <h2>served directly</h2> + <ul> + <li><a href="001.html">01: html</a></li> + <li><a href="002.jpg">02: image</a></li> + <li><a href="003.html">03: html+image</a></li> + <li><a href="004.html">04: tiled image</a></li> + <li><a href="005.txt">05: large text</a></li> + <li><a href="006.html">06: html/js/css</a></li> + <li><a href="007.html">07: form submit</a></li> + <li><a href="upload.py">08: upload</a></li> + <li><a href="009.py">09: small chunks</a></li> + </ul> + <h2>mod_proxyied</h2> + <ul> + <li><a href="proxy/001.html">01: html</a></li> + <li><a href="proxy/002.jpg">02: image</a></li> + <li><a href="proxy/003.html">03: html+image</a></li> + <li><a href="proxy/004.html">04: tiled image</a></li> + <li><a href="proxy/005.txt">05: large text</a></li> + <li><a href="proxy/006.html">06: html/js/css</a></li> + <li><a href="proxy/007.html">07: form submit</a></li> + <li><a href="proxy/upload.py">08: upload</a></li> + <li><a href="proxy/009.py">09: small chunks</a></li> + </ul> + <h2>mod_rewritten</h2> + <ul> + <li><a href="rewrite/001.html">01: html</a></li> + <li><a href="rewrite/002.jpg">02: image</a></li> + <li><a href="rewrite/003.html">03: html+image</a></li> + <li><a href="rewrite/004.html">04: tiled image</a></li> + <li><a href="rewrite/005.txt">05: large text</a></li> + <li><a href="rewrite/006.html">06: html/js/css</a></li> + <li><a href="rewrite/007.html">07: form submit</a></li> + <li><a href="rewrite/upload.py">08: upload</a></li> + <li><a href="rewrite/009.py">09: small chunks</a></li> + </ul> + </body> +</html> + diff --git a/test/modules/http2/htdocs/test2/alive.json b/test/modules/http2/htdocs/test2/alive.json new file mode 100644 index 0000000000..6a742235fa --- /dev/null +++ b/test/modules/http2/htdocs/test2/alive.json @@ -0,0 +1,4 @@ +{ + "host" : "test2", + "alive" : true +} diff --git a/test/modules/http2/mod_h2test/mod_h2test.c b/test/modules/http2/mod_h2test/mod_h2test.c new file mode 100644 index 0000000000..7cd66d1286 --- /dev/null +++ b/test/modules/http2/mod_h2test/mod_h2test.c @@ -0,0 +1,165 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +#include <apr_optional.h> +#include <apr_optional_hooks.h> +#include <apr_strings.h> +#include <apr_time.h> +#include <apr_want.h> + +#include <httpd.h> +#include <http_protocol.h> +#include <http_request.h> +#include <http_log.h> + +#include "mod_h2test.h" + +static void h2test_hooks(apr_pool_t *pool); + +AP_DECLARE_MODULE(h2test) = { + STANDARD20_MODULE_STUFF, + NULL, /* func to create per dir config */ + NULL, /* func to merge per dir config */ + NULL, /* func to create per server config */ + NULL, /* func to merge per server config */ + NULL, /* command handlers */ + h2test_hooks, +#if defined(AP_MODULE_FLAG_NONE) + AP_MODULE_FLAG_ALWAYS_MERGE +#endif +}; + + +static int h2test_post_config(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + void *data = NULL; + const char *mod_h2_init_key = "mod_h2test_init_counter"; + + (void)plog;(void)ptemp; + + apr_pool_userdata_get(&data, mod_h2_init_key, s->process->pool); + if ( data == NULL ) { + /* dry run */ + apr_pool_userdata_set((const void *)1, mod_h2_init_key, + apr_pool_cleanup_null, s->process->pool); + return APR_SUCCESS; + } + + + return APR_SUCCESS; +} + +static void h2test_child_init(apr_pool_t *pool, server_rec *s) +{ + (void)pool; + (void)s; +} + +static int h2test_echo_handler(request_rec *r) +{ + conn_rec *c = r->connection; + apr_bucket_brigade *bb; + apr_bucket *b; + apr_status_t rv; + char buffer[8192]; + const char *ct; + long l; + + if (strcmp(r->handler, "h2test-echo")) { + return DECLINED; + } + if (r->method_number != M_GET && r->method_number != M_POST) { + return DECLINED; + } + + ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, "echo_handler: processing request"); + r->status = 200; + r->clength = -1; + r->chunked = 1; + apr_table_unset(r->headers_out, "Content-Length"); + /* Discourage content-encodings */ + apr_table_unset(r->headers_out, "Content-Encoding"); + apr_table_setn(r->subprocess_env, "no-brotli", "1"); + apr_table_setn(r->subprocess_env, "no-gzip", "1"); + + ct = apr_table_get(r->headers_in, "content-type"); + ap_set_content_type(r, ct? ct : "application/octet-stream"); + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + /* copy any request body into the response */ + if ((rv = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK))) goto cleanup; + if (ap_should_client_block(r)) { + while (0 < (l = ap_get_client_block(r, &buffer[0], sizeof(buffer)))) { + ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, + "echo_handler: copying %ld bytes from request body", l); + rv = apr_brigade_write(bb, NULL, NULL, buffer, l); + if (APR_SUCCESS != rv) goto cleanup; + rv = ap_pass_brigade(r->output_filters, bb); + if (APR_SUCCESS != rv) goto cleanup; + ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, + "echo_handler: passed %ld bytes from request body", l); + } + } + /* we are done */ + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, "echo_handler: request read"); + + if (r->trailers_in && !apr_is_empty_table(r->trailers_in)) { + ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, + "echo_handler: seeing incoming trailers"); + apr_table_setn(r->trailers_out, "h2test-trailers-in", + apr_itoa(r->pool, 1)); + } + + rv = ap_pass_brigade(r->output_filters, bb); + +cleanup: + if (rv == APR_SUCCESS + || r->status != HTTP_OK + || c->aborted) { + ap_log_rerror(APLOG_MARK, APLOG_TRACE1, rv, r, "echo_handler: request handled"); + return OK; + } + else { + /* no way to know what type of error occurred */ + ap_log_rerror(APLOG_MARK, APLOG_TRACE1, rv, r, "h2test_echo_handler failed"); + return AP_FILTER_ERROR; + } + return DECLINED; +} + +/* Install this module into the apache2 infrastructure. + */ +static void h2test_hooks(apr_pool_t *pool) +{ + static const char *const mod_h2[] = { "mod_h2.c", NULL}; + + ap_log_perror(APLOG_MARK, APLOG_TRACE1, 0, pool, "installing hooks and handlers"); + + /* Run once after configuration is set, but before mpm children initialize. + */ + ap_hook_post_config(h2test_post_config, mod_h2, NULL, APR_HOOK_MIDDLE); + + /* Run once after a child process has been created. + */ + ap_hook_child_init(h2test_child_init, NULL, NULL, APR_HOOK_MIDDLE); + + /* test h2 echo handler */ + ap_hook_handler(h2test_echo_handler, NULL, NULL, APR_HOOK_MIDDLE); +} + diff --git a/test/modules/http2/mod_h2test/mod_h2test.h b/test/modules/http2/mod_h2test/mod_h2test.h new file mode 100644 index 0000000000..a886d29428 --- /dev/null +++ b/test/modules/http2/mod_h2test/mod_h2test.h @@ -0,0 +1,21 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +#ifndef __MOD_H2TEST_H__ +#define __MOD_H2TEST_H__ + + +#endif diff --git a/test/modules/http2/test_000_infra.py b/test/modules/http2/test_000_infra.py new file mode 100644 index 0000000000..4a8591e62f --- /dev/null +++ b/test/modules/http2/test_000_infra.py @@ -0,0 +1,17 @@ +# +# mod-h2 test suite +# check that our test infrastructure is sane +# +import pytest + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + env.setup_data_1k_1m() + yield + + def test_000_00(self): + assert 1 == 1 + diff --git a/test/modules/http2/test_001_httpd_alive.py b/test/modules/http2/test_001_httpd_alive.py new file mode 100644 index 0000000000..f198c18d5e --- /dev/null +++ b/test/modules/http2/test_001_httpd_alive.py @@ -0,0 +1,28 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_test1().install() + assert env.apache_restart() == 0 + + # we expect to see the document from the generic server + def test_001_01(self, env): + r = env.curl_get(f"https://{env.domain_test1}:{env.https_port}/alive.json", 5) + assert r.exit_code == 0, r.stderr + r.stdout + assert r.response["json"] + assert True == r.response["json"]["alive"] + assert "test1" == r.response["json"]["host"] + + # we expect to see the document from the generic server + def test_001_02(self, env): + r = env.curl_get(f"https://{env.domain_test1}:{env.https_port}/alive.json", 5) + assert r.exit_code == 0, r.stderr + assert r.response["json"] + assert True == r.response["json"]["alive"] + assert "test1" == r.response["json"]["host"] + diff --git a/test/modules/http2/test_002_curl_basics.py b/test/modules/http2/test_002_curl_basics.py new file mode 100644 index 0000000000..1c1ef699a0 --- /dev/null +++ b/test/modules/http2/test_002_curl_basics.py @@ -0,0 +1,68 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_test1().add_vhost_test2().install() + assert env.apache_restart() == 0 + + # check that we see the correct documents when using the test1 server name over http: + def test_002_01(self, env): + url = env.mkurl("http", "test1", "/alive.json") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/1.1" == r.response["protocol"] + assert True == r.response["json"]["alive"] + assert "test1" == r.response["json"]["host"] + + # check that we see the correct documents when using the test1 server name over https: + def test_002_02(self, env): + url = env.mkurl("https", "test1", "/alive.json") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert r.response["json"]["alive"] is True + assert "test1" == r.response["json"]["host"] + assert "application/json" == r.response["header"]["content-type"] + + # enforce HTTP/1.1 + def test_002_03(self, env): + url = env.mkurl("https", "test1", "/alive.json") + r = env.curl_get(url, 5, [ "--http1.1" ]) + assert 200 == r.response["status"] + assert "HTTP/1.1" == r.response["protocol"] + + # enforce HTTP/2 + def test_002_04(self, env): + url = env.mkurl("https", "test1", "/alive.json") + r = env.curl_get(url, 5, [ "--http2" ]) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + + # default is HTTP/2 on this host + def test_002_04b(self, env): + url = env.mkurl("https", "test1", "/alive.json") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + assert "test1" == r.response["json"]["host"] + + # although, without ALPN, we cannot select it + def test_002_05(self, env): + url = env.mkurl("https", "test1", "/alive.json") + r = env.curl_get(url, 5, [ "--no-alpn" ]) + assert 200 == r.response["status"] + assert "HTTP/1.1" == r.response["protocol"] + assert "test1" == r.response["json"]["host"] + + # default is HTTP/1.1 on the other + def test_002_06(self, env): + url = env.mkurl("https", "test2", "/alive.json") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/1.1" == r.response["protocol"] + assert "test2" == r.response["json"]["host"] + diff --git a/test/modules/http2/test_003_get.py b/test/modules/http2/test_003_get.py new file mode 100644 index 0000000000..ea7c9fb39d --- /dev/null +++ b/test/modules/http2/test_003_get.py @@ -0,0 +1,213 @@ +import re +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_cgi( + proxy_self=True, h2proxy_self=True + ).add_vhost_test1( + proxy_self=True, h2proxy_self=True + ).install() + assert env.apache_restart() == 0 + + # check SSL environment variables from CGI script + def test_003_01(self, env): + url = env.mkurl("https", "cgi", "/hello.py") + r = env.curl_get(url, 5, ["--tlsv1.2"]) + assert 200 == r.response["status"] + assert "HTTP/2.0" == r.response["json"]["protocol"] + assert "on" == r.response["json"]["https"] + tls_version = r.response["json"]["ssl_protocol"] + assert tls_version in ["TLSv1.2", "TLSv1.3"] + assert "on" == r.response["json"]["h2"] + assert "off" == r.response["json"]["h2push"] + + r = env.curl_get(url, 5, ["--http1.1", "--tlsv1.2"]) + assert 200 == r.response["status"] + assert "HTTP/1.1" == r.response["json"]["protocol"] + assert "on" == r.response["json"]["https"] + tls_version = r.response["json"]["ssl_protocol"] + assert tls_version in ["TLSv1.2", "TLSv1.3"] + assert "" == r.response["json"]["h2"] + assert "" == r.response["json"]["h2push"] + + # retrieve a html file from the server and compare it to its source + def test_003_02(self, env): + with open(env.test_src("htdocs/test1/index.html"), mode='rb') as file: + src = file.read() + + url = env.mkurl("https", "test1", "/index.html") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + assert src == r.response["body"] + + url = env.mkurl("https", "test1", "/index.html") + r = env.curl_get(url, 5, ["--http1.1"]) + assert 200 == r.response["status"] + assert "HTTP/1.1" == r.response["protocol"] + assert src == r.response["body"] + + # retrieve chunked content from a cgi script + def check_necho(self, env, n, text): + url = env.mkurl("https", "cgi", "/necho.py") + r = env.curl_get(url, 5, ["-F", f"count={n}", "-F", f"text={text}"]) + assert 200 == r.response["status"] + exp = "" + for i in range(n): + exp += text + "\n" + assert exp == r.response["body"].decode('utf-8') + + def test_003_10(self, env): + self.check_necho(env, 10, "0123456789") + + def test_003_11(self, env): + self.check_necho(env, 100, "0123456789") + + def test_003_12(self, env): + self.check_necho(env, 1000, "0123456789") + + def test_003_13(self, env): + self.check_necho(env, 10000, "0123456789") + + def test_003_14(self, env): + self.check_necho(env, 100000, "0123456789") + + # github issue #126 + def test_003_20(self, env): + url = env.mkurl("https", "test1", "/006/") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + body = r.response["body"].decode('utf-8') + # our doctype varies between branches and in time, lets not compare + body = re.sub(r'^<!DOCTYPE[^>]+>', '', body) + assert ''' +<html> + <head> + <title>Index of /006</title> + </head> + <body> +<title>My Header Title</title> +<ul><li><a href="/"> Parent Directory</a></li> +<li><a href="006.css"> 006.css</a></li> +<li><a href="006.js"> 006.js</a></li> +<li><a href="header.html"> header.html</a></li> +</ul> +</body></html> +''' == body + + # github issue #133 + def clean_header(self, s): + s = re.sub(r'\r\n', '\n', s, flags=re.MULTILINE) + s = re.sub(r'^date:.*\n', '', s, flags=re.MULTILINE) + s = re.sub(r'^server:.*\n', '', s, flags=re.MULTILINE) + s = re.sub(r'^last-modified:.*\n', '', s, flags=re.MULTILINE) + s = re.sub(r'^etag:.*\n', '', s, flags=re.MULTILINE) + s = re.sub(r'^vary:.*\n', '', s, flags=re.MULTILINE) + return re.sub(r'^accept-ranges:.*\n', '', s, flags=re.MULTILINE) + + def test_003_21(self, env): + url = env.mkurl("https", "test1", "/index.html") + r = env.curl_get(url, 5, ["-I"]) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + s = self.clean_header(r.response["body"].decode('utf-8')) + assert '''HTTP/2 200 +content-length: 2007 +content-type: text/html + +''' == s + + r = env.curl_get(url, 5, ["-I", url]) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + s = self.clean_header(r.response["body"].decode('utf-8')) + assert '''HTTP/2 200 +content-length: 2007 +content-type: text/html + +HTTP/2 200 +content-length: 2007 +content-type: text/html + +''' == s + + # test conditionals: if-modified-since + @pytest.mark.parametrize("path", [ + "/004.html", "/proxy/004.html", "/h2proxy/004.html" + ]) + def test_003_30(self, env, path): + url = env.mkurl("https", "test1", path) + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + h = r.response["header"] + assert "last-modified" in h + lastmod = h["last-modified"] + r = env.curl_get(url, 5, ['-H', ("if-modified-since: %s" % lastmod)]) + assert 304 == r.response["status"] + + # test conditionals: if-etag + @pytest.mark.parametrize("path", [ + "/004.html", "/proxy/004.html", "/h2proxy/004.html" + ]) + def test_003_31(self, env, path): + url = env.mkurl("https", "test1", path) + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + h = r.response["header"] + assert "etag" in h + etag = h["etag"] + r = env.curl_get(url, 5, ['-H', ("if-none-match: %s" % etag)]) + assert 304 == r.response["status"] + + # test various response body lengths to work correctly + def test_003_40(self, env): + n = 1001 + while n <= 1025024: + url = env.mkurl("https", "cgi", f"/mnot164.py?count={n}&text=X") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + assert n == len(r.response["body"]) + n *= 2 + + # test various response body lengths to work correctly + @pytest.mark.parametrize("n", [ + 0, 1, 1291, 1292, 80000, 80123, 81087, 98452 + ]) + def test_003_41(self, env, n): + url = env.mkurl("https", "cgi", f"/mnot164.py?count={n}&text=X") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + assert n == len(r.response["body"]) + + # test ranges + @pytest.mark.parametrize("path", [ + "/004.html", "/proxy/004.html", "/h2proxy/004.html" + ]) + def test_003_50(self, env, path): + # check that the resource supports ranges and we see its raw content-length + url = env.mkurl("https", "test1", path) + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + h = r.response["header"] + assert "accept-ranges" in h + assert "bytes" == h["accept-ranges"] + assert "content-length" in h + clen = h["content-length"] + # get the first 1024 bytes of the resource, 206 status, but content-length as original + r = env.curl_get(url, 5, options=["-H", "range: bytes=0-1023"]) + assert 206 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + assert 1024 == len(r.response["body"]) + assert "content-length" in h + assert clen == h["content-length"] diff --git a/test/modules/http2/test_004_post.py b/test/modules/http2/test_004_post.py new file mode 100644 index 0000000000..5f85494a45 --- /dev/null +++ b/test/modules/http2/test_004_post.py @@ -0,0 +1,217 @@ +import email.parser +import json +import os +import re +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + env.setup_data_1k_1m() + HttpdConf(env).add_vhost_cgi().install() + assert env.apache_restart() == 0 + + # upload and GET again using curl, compare to original content + def curl_upload_and_verify(self, env, fname, options=None): + url = env.mkurl("https", "cgi", "/upload.py") + fpath = os.path.join(env.gen_dir, fname) + r = env.curl_upload(url, fpath, options=options) + assert r.exit_code == 0 + assert r.response["status"] >= 200 and r.response["status"] < 300 + + r2 = env.curl_get(r.response["header"]["location"]) + assert r2.exit_code == 0 + assert r2.response["status"] == 200 + with open(env.test_src(fpath), mode='rb') as file: + src = file.read() + assert src == r2.response["body"] + + def test_004_01(self, env): + self.curl_upload_and_verify(env, "data-1k", ["--http1.1"]) + self.curl_upload_and_verify(env, "data-1k", ["--http2"]) + + def test_004_02(self, env): + self.curl_upload_and_verify(env, "data-10k", ["--http1.1"]) + self.curl_upload_and_verify(env, "data-10k", ["--http2"]) + + def test_004_03(self, env): + self.curl_upload_and_verify(env, "data-100k", ["--http1.1"]) + self.curl_upload_and_verify(env, "data-100k", ["--http2"]) + + def test_004_04(self, env): + self.curl_upload_and_verify(env, "data-1m", ["--http1.1"]) + self.curl_upload_and_verify(env, "data-1m", ["--http2"]) + + def test_004_05(self, env): + self.curl_upload_and_verify(env, "data-1k", ["-v", "--http1.1", "-H", "Expect: 100-continue"]) + self.curl_upload_and_verify(env, "data-1k", ["-v", "--http2", "-H", "Expect: 100-continue"]) + + @pytest.mark.skipif(True, reason="python3 regresses in chunked inputs to cgi") + def test_004_06(self, env): + self.curl_upload_and_verify(env, "data-1k", ["--http1.1", "-H", "Content-Length: "]) + self.curl_upload_and_verify(env, "data-1k", ["--http2", "-H", "Content-Length: "]) + + @pytest.mark.parametrize("name, value", [ + ("HTTP2", "on"), + ("H2PUSH", "off"), + ("H2_PUSHED", ""), + ("H2_PUSHED_ON", ""), + ("H2_STREAM_ID", "1"), + ("H2_STREAM_TAG", r'\d+-1'), + ]) + def test_004_07(self, env, name, value): + url = env.mkurl("https", "cgi", "/env.py") + r = env.curl_post_value(url, "name", name) + assert r.exit_code == 0 + assert r.response["status"] == 200 + m = re.match("{0}=(.*)".format(name), r.response["body"].decode('utf-8')) + assert m + assert re.match(value, m.group(1)) + + # verify that we parse nghttp output correctly + def check_nghttp_body(self, env, ref_input, nghttp_output): + with open(env.test_src(os.path.join(env.gen_dir, ref_input)), mode='rb') as f: + refbody = f.read() + with open(env.test_src(nghttp_output), mode='rb') as f: + text = f.read() + o = env.nghttp().parse_output(text) + assert "response" in o + assert "body" in o["response"] + if refbody != o["response"]["body"]: + with open(env.test_src(os.path.join(env.gen_dir, '%s.parsed' % ref_input)), mode='bw') as f: + f.write(o["response"]["body"]) + assert len(refbody) == len(o["response"]["body"]) + assert refbody == o["response"]["body"] + + def test_004_20(self, env): + self.check_nghttp_body(env, 'data-1k', 'data/nghttp-output-1k-1.txt') + self.check_nghttp_body(env, 'data-10k', 'data/nghttp-output-10k-1.txt') + self.check_nghttp_body(env, 'data-100k', 'data/nghttp-output-100k-1.txt') + + # POST some data using nghttp and see it echo'ed properly back + def nghttp_post_and_verify(self, env, fname, options=None): + url = env.mkurl("https", "cgi", "/echo.py") + fpath = os.path.join(env.gen_dir, fname) + + r = env.nghttp().upload(url, fpath, options=options) + assert r.exit_code == 0 + assert r.response["status"] >= 200 and r.response["status"] < 300 + + with open(env.test_src(fpath), mode='rb') as file: + src = file.read() + assert src == r.response["body"] + + def test_004_21(self, env): + self.nghttp_post_and_verify(env, "data-1k", []) + self.nghttp_post_and_verify(env, "data-10k", []) + self.nghttp_post_and_verify(env, "data-100k", []) + self.nghttp_post_and_verify(env, "data-1m", []) + + def test_004_22(self, env): + self.nghttp_post_and_verify(env, "data-1k", ["--no-content-length"]) + self.nghttp_post_and_verify(env, "data-10k", ["--no-content-length"]) + self.nghttp_post_and_verify(env, "data-100k", ["--no-content-length"]) + self.nghttp_post_and_verify(env, "data-1m", ["--no-content-length"]) + + # upload and GET again using nghttp, compare to original content + def nghttp_upload_and_verify(self, env, fname, options=None): + url = env.mkurl("https", "cgi", "/upload.py") + fpath = os.path.join(env.gen_dir, fname) + + r = env.nghttp().upload_file(url, fpath, options=options) + assert r.exit_code == 0 + assert r.response["status"] >= 200 and r.response["status"] < 300 + assert r.response["header"]["location"] + + r2 = env.nghttp().get(r.response["header"]["location"]) + assert r2.exit_code == 0 + assert r2.response["status"] == 200 + with open(env.test_src(fpath), mode='rb') as file: + src = file.read() + assert src == r2.response["body"] + + def test_004_23(self, env): + self.nghttp_upload_and_verify(env, "data-1k", []) + self.nghttp_upload_and_verify(env, "data-10k", []) + self.nghttp_upload_and_verify(env, "data-100k", []) + self.nghttp_upload_and_verify(env, "data-1m", []) + + def test_004_24(self, env): + self.nghttp_upload_and_verify(env, "data-1k", ["--expect-continue"]) + self.nghttp_upload_and_verify(env, "data-100k", ["--expect-continue"]) + + @pytest.mark.skipif(True, reason="python3 regresses in chunked inputs to cgi") + def test_004_25(self, env): + self.nghttp_upload_and_verify(env, "data-1k", ["--no-content-length"]) + self.nghttp_upload_and_verify(env, "data-10k", ["--no-content-length"]) + self.nghttp_upload_and_verify(env, "data-100k", ["--no-content-length"]) + self.nghttp_upload_and_verify(env, "data-1m", ["--no-content-length"]) + + def test_004_30(self, env): + # issue: #203 + resource = "data-1k" + full_length = 1000 + chunk = 200 + self.curl_upload_and_verify(env, resource, ["-v", "--http2"]) + logfile = os.path.join(env.server_logs_dir, "test_004_30") + if os.path.isfile(logfile): + os.remove(logfile) + HttpdConf(env).add(""" +LogFormat "{ \\"request\\": \\"%r\\", \\"status\\": %>s, \\"bytes_resp_B\\": %B, \\"bytes_tx_O\\": %O, \\"bytes_rx_I\\": %I, \\"bytes_rx_tx_S\\": %S }" issue_203 +CustomLog logs/test_004_30 issue_203 + """).add_vhost_cgi().install() + assert env.apache_restart() == 0 + url = env.mkurl("https", "cgi", "/files/{0}".format(resource)) + r = env.curl_get(url, 5, ["--http2"]) + assert 200 == r.response["status"] + r = env.curl_get(url, 5, ["--http1.1", "-H", "Range: bytes=0-{0}".format(chunk-1)]) + assert 206 == r.response["status"] + assert chunk == len(r.response["body"].decode('utf-8')) + r = env.curl_get(url, 5, ["--http2", "-H", "Range: bytes=0-{0}".format(chunk-1)]) + assert 206 == r.response["status"] + assert chunk == len(r.response["body"].decode('utf-8')) + # now check what response lengths have actually been reported + lines = open(logfile).readlines() + log_h2_full = json.loads(lines[-3]) + log_h1 = json.loads(lines[-2]) + log_h2 = json.loads(lines[-1]) + assert log_h2_full['bytes_rx_I'] > 0 + assert log_h2_full['bytes_resp_B'] == full_length + assert log_h2_full['bytes_tx_O'] > full_length + assert log_h1['bytes_rx_I'] > 0 # input bytes recieved + assert log_h1['bytes_resp_B'] == chunk # response bytes sent (payload) + assert log_h1['bytes_tx_O'] > chunk # output bytes sent + assert log_h2['bytes_rx_I'] > 0 + assert log_h2['bytes_resp_B'] == chunk + assert log_h2['bytes_tx_O'] > chunk + + def test_004_40(self, env): + # echo content using h2test_module "echo" handler + def post_and_verify(fname, options=None): + url = env.mkurl("https", "cgi", "/h2test/echo") + fpath = os.path.join(env.gen_dir, fname) + r = env.curl_upload(url, fpath, options=options) + assert r.exit_code == 0 + assert r.response["status"] >= 200 and r.response["status"] < 300 + + ct = r.response["header"]["content-type"] + mail_hd = "Content-Type: " + ct + "\r\nMIME-Version: 1.0\r\n\r\n" + mime_msg = mail_hd.encode() + r.response["body"] + # this MIME API is from hell + body = email.parser.BytesParser().parsebytes(mime_msg) + assert body + assert body.is_multipart() + filepart = None + for part in body.walk(): + if fname == part.get_filename(): + filepart = part + assert filepart + with open(env.test_src(fpath), mode='rb') as file: + src = file.read() + assert src == filepart.get_payload(decode=True) + + post_and_verify("data-1k", []) diff --git a/test/modules/http2/test_005_status.py b/test/modules/http2/test_005_status.py new file mode 100644 index 0000000000..4224668d14 --- /dev/null +++ b/test/modules/http2/test_005_status.py @@ -0,0 +1,70 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_cgi().install() + assert env.apache_restart() == 0 + + def test_005_01(self, env): + url = env.mkurl("https", "cgi", "/.well-known/h2/state") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + st = r.response["json"] + + # remove some parts that are very dependant on client/lib versions + # or connection time etc. + del st["settings"]["SETTINGS_INITIAL_WINDOW_SIZE"] + del st["peerSettings"]["SETTINGS_INITIAL_WINDOW_SIZE"] + del st["streams"]["1"]["created"] + del st["streams"]["1"]["flowOut"] + del st["stats"]["in"]["frames"] + del st["stats"]["in"]["octets"] + del st["stats"]["out"]["frames"] + del st["stats"]["out"]["octets"] + del st["connFlowOut"] + + assert st == { + "version": "draft-01", + "settings": { + "SETTINGS_MAX_CONCURRENT_STREAMS": 100, + "SETTINGS_MAX_FRAME_SIZE": 16384, + "SETTINGS_ENABLE_PUSH": 0 + }, + "peerSettings": { + "SETTINGS_MAX_CONCURRENT_STREAMS": 100, + "SETTINGS_MAX_FRAME_SIZE": 16384, + "SETTINGS_ENABLE_PUSH": 0, + "SETTINGS_HEADER_TABLE_SIZE": 4096, + "SETTINGS_MAX_HEADER_LIST_SIZE": -1 + }, + "connFlowIn": 2147483647, + "sentGoAway": 0, + "streams": { + "1": { + "state": "HALF_CLOSED_REMOTE", + "flowIn": 65535, + "dataIn": 0, + "dataOut": 0 + } + }, + "stats": { + "in": { + "requests": 1, + "resets": 0, + }, + "out": { + "responses": 0, + }, + "push": { + "cacheDigest": "AQg", + "promises": 0, + "submits": 0, + "resets": 0 + } + } + } diff --git a/test/modules/http2/test_006_assets.py b/test/modules/http2/test_006_assets.py new file mode 100644 index 0000000000..339364ee58 --- /dev/null +++ b/test/modules/http2/test_006_assets.py @@ -0,0 +1,74 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_test1().install() + assert env.apache_restart() == 0 + + # single page without any assets + def test_006_01(self, env): + url = env.mkurl("https", "test1", "/001.html") + r = env.nghttp().assets(url, options=["-Haccept-encoding: none"]) + assert 0 == r.exit_code + assert 1 == len(r.assets) + assert r.assets == [ + {"status": 200, "size": "251", "path": "/001.html"} + ] + + # single image without any assets + def test_006_02(self, env): + url = env.mkurl("https", "test1", "/002.jpg") + r = env.nghttp().assets(url, options=["-Haccept-encoding: none"]) + assert 0 == r.exit_code + assert 1 == len(r.assets) + assert r.assets == [ + {"status": 200, "size": "88K", "path": "/002.jpg"} + ] + + # gophertiles, yea! + def test_006_03(self, env): + # create the tiles files we originally had checked in + exp_assets = [ + {"status": 200, "size": "10K", "path": "/004.html"}, + {"status": 200, "size": "742", "path": "/004/gophertiles.jpg"}, + ] + for i in range(2, 181): + with open(f"{env.server_docs_dir}/test1/004/gophertiles_{i:03d}.jpg", "w") as fd: + fd.write("0123456789\n") + exp_assets.append( + {"status": 200, "size": "11", "path": f"/004/gophertiles_{i:03d}.jpg"}, + ) + + url = env.mkurl("https", "test1", "/004.html") + r = env.nghttp().assets(url, options=["-Haccept-encoding: none"]) + assert 0 == r.exit_code + assert 181 == len(r.assets) + assert r.assets == exp_assets + + # page with js and css + def test_006_04(self, env): + url = env.mkurl("https", "test1", "/006.html") + r = env.nghttp().assets(url, options=["-Haccept-encoding: none"]) + assert 0 == r.exit_code + assert 3 == len(r.assets) + assert r.assets == [ + {"status": 200, "size": "543", "path": "/006.html"}, + {"status": 200, "size": "216", "path": "/006/006.css"}, + {"status": 200, "size": "839", "path": "/006/006.js"} + ] + + # page with image, try different window size + def test_006_05(self, env): + url = env.mkurl("https", "test1", "/003.html") + r = env.nghttp().assets(url, options=["--window-bits=24", "-Haccept-encoding: none"]) + assert 0 == r.exit_code + assert 2 == len(r.assets) + assert r.assets == [ + {"status": 200, "size": "316", "path": "/003.html"}, + {"status": 200, "size": "88K", "path": "/003/003_img.jpg"} + ] diff --git a/test/modules/http2/test_100_conn_reuse.py b/test/modules/http2/test_100_conn_reuse.py new file mode 100644 index 0000000000..cef2f9d07b --- /dev/null +++ b/test/modules/http2/test_100_conn_reuse.py @@ -0,0 +1,56 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_noh2().add_vhost_test1().add_vhost_cgi().install() + assert env.apache_restart() == 0 + + # make sure the protocol selection on the different hosts work as expected + def test_100_01(self, env): + # this host defaults to h2, but we can request h1 + url = env.mkurl("https", "cgi", "/hello.py") + assert "2" == env.curl_protocol_version( url ) + assert "1.1" == env.curl_protocol_version( url, options=[ "--http1.1" ] ) + + # this host does not enable h2, it always falls back to h1 + url = env.mkurl("https", "noh2", "/hello.py") + assert "1.1" == env.curl_protocol_version( url ) + assert "1.1" == env.curl_protocol_version( url, options=[ "--http2" ] ) + + # access a ServerAlias, after using ServerName in SNI + def test_100_02(self, env): + url = env.mkurl("https", "cgi", "/hello.py") + hostname = ("cgi-alias.%s" % env.http_tld) + r = env.curl_get(url, 5, [ "-H", "Host:%s" % hostname ]) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + assert hostname == r.response["json"]["host"] + + # access another vhost, after using ServerName in SNI, that uses same SSL setup + def test_100_03(self, env): + url = env.mkurl("https", "cgi", "/") + hostname = ("test1.%s" % env.http_tld) + r = env.curl_get(url, 5, [ "-H", "Host:%s" % hostname ]) + assert 200 == r.response["status"] + assert "HTTP/2" == r.response["protocol"] + assert "text/html" == r.response["header"]["content-type"] + + # access another vhost, after using ServerName in SNI, + # that has different SSL certificate. This triggers a 421 (misdirected request) response. + def test_100_04(self, env): + url = env.mkurl("https", "cgi", "/hello.py") + hostname = ("noh2.%s" % env.http_tld) + r = env.curl_get(url, 5, [ "-H", "Host:%s" % hostname ]) + assert 421 == r.response["status"] + + # access an unknown vhost, after using ServerName in SNI + def test_100_05(self, env): + url = env.mkurl("https", "cgi", "/hello.py") + hostname = ("unknown.%s" % env.http_tld) + r = env.curl_get(url, 5, [ "-H", "Host:%s" % hostname ]) + assert 421 == r.response["status"] diff --git a/test/modules/http2/test_101_ssl_reneg.py b/test/modules/http2/test_101_ssl_reneg.py new file mode 100644 index 0000000000..22bfa50baa --- /dev/null +++ b/test/modules/http2/test_101_ssl_reneg.py @@ -0,0 +1,126 @@ +import re +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add( + f""" + SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384 + <Directory \"{env.server_dir}/htdocs/ssl-client-verify\"> + Require all granted + SSLVerifyClient require + SSLVerifyDepth 0 + </Directory>""" + ).start_vhost( + env.https_port, "ssl", with_ssl=True + ).add( + f""" + Protocols h2 http/1.1" + <Location /renegotiate/cipher> + SSLCipherSuite ECDHE-RSA-CHACHA20-POLY1305 + </Location> + <Location /renegotiate/err-doc-cipher> + SSLCipherSuite ECDHE-RSA-CHACHA20-POLY1305 + ErrorDocument 403 /forbidden.html + </Location> + <Location /renegotiate/verify> + SSLVerifyClient require + </Location> + <Directory \"{env.server_dir}/htdocs/sslrequire\"> + SSLRequireSSL + </Directory> + <Directory \"{env.server_dir}/htdocs/requiressl\"> + Require ssl + </Directory>""" + ).end_vhost().install() + # the dir needs to exists for the configuration to have effect + env.mkpath("%s/htdocs/ssl-client-verify" % env.server_dir) + env.mkpath("%s/htdocs/renegotiate/cipher" % env.server_dir) + env.mkpath("%s/htdocs/sslrequire" % env.server_dir) + env.mkpath("%s/htdocs/requiressl" % env.server_dir) + assert env.apache_restart() == 0 + + # access a resource with SSL renegotiation, using HTTP/1.1 + def test_101_01(self, env): + url = env.mkurl("https", "ssl", "/renegotiate/cipher/") + r = env.curl_get(url, options=["-v", "--http1.1", "--tlsv1.2", "--tls-max", "1.2"]) + assert 0 == r.exit_code + assert r.response + assert 403 == r.response["status"] + + # try to renegotiate the cipher, should fail with correct code + def test_101_02(self, env): + url = env.mkurl("https", "ssl", "/renegotiate/cipher/") + r = env.curl_get(url, options=[ + "-vvv", "--tlsv1.2", "--tls-max", "1.2", "--ciphers", "ECDHE-RSA-AES256-GCM-SHA384" + ]) + assert 0 != r.exit_code + assert not r.response + assert re.search(r'HTTP_1_1_REQUIRED \(err 13\)', r.stderr) + + # try to renegotiate a client certificate from Location + # needs to fail with correct code + def test_101_03(self, env): + url = env.mkurl("https", "ssl", "/renegotiate/verify/") + r = env.curl_get(url, options=["-vvv", "--tlsv1.2", "--tls-max", "1.2"]) + assert 0 != r.exit_code + assert not r.response + assert re.search(r'HTTP_1_1_REQUIRED \(err 13\)', r.stderr) + + # try to renegotiate a client certificate from Directory + # needs to fail with correct code + def test_101_04(self, env): + url = env.mkurl("https", "ssl", "/ssl-client-verify/index.html") + r = env.curl_get(url, options=["-vvv", "--tlsv1.2", "--tls-max", "1.2"]) + assert 0 != r.exit_code + assert not r.response + assert re.search(r'HTTP_1_1_REQUIRED \(err 13\)', r.stderr) + + # make 10 requests on the same connection, none should produce a status code + # reported by erki@example.ee + def test_101_05(self, env): + r = env.run([env.h2load, "-n", "10", "-c", "1", "-m", "1", "-vvvv", + f"{env.https_base_url}/ssl-client-verify/index.html"]) + assert 0 == r.exit_code + r = env.h2load_status(r) + assert 10 == r.results["h2load"]["requests"]["total"] + assert 10 == r.results["h2load"]["requests"]["started"] + assert 10 == r.results["h2load"]["requests"]["done"] + assert 0 == r.results["h2load"]["requests"]["succeeded"] + assert 0 == r.results["h2load"]["status"]["2xx"] + assert 0 == r.results["h2load"]["status"]["3xx"] + assert 0 == r.results["h2load"]["status"]["4xx"] + assert 0 == r.results["h2load"]["status"]["5xx"] + + # Check that "SSLRequireSSL" works on h2 connections + # See <https://bz.apache.org/bugzilla/show_bug.cgi?id=62654> + def test_101_10a(self, env): + url = env.mkurl("https", "ssl", "/sslrequire/index.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert 404 == r.response["status"] + + # Check that "require ssl" works on h2 connections + # See <https://bz.apache.org/bugzilla/show_bug.cgi?id=62654> + def test_101_10b(self, env): + url = env.mkurl("https", "ssl", "/requiressl/index.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert 404 == r.response["status"] + + # Check that status works with ErrorDoc, see pull #174, fixes #172 + def test_101_11(self, env): + url = env.mkurl("https", "ssl", "/renegotiate/err-doc-cipher") + r = env.curl_get(url, options=[ + "-vvv", "--tlsv1.2", "--tls-max", "1.2", "--ciphers", "ECDHE-RSA-AES256-GCM-SHA384" + ]) + assert 0 != r.exit_code + assert not r.response + assert re.search(r'HTTP_1_1_REQUIRED \(err 13\)', r.stderr) diff --git a/test/modules/http2/test_102_require.py b/test/modules/http2/test_102_require.py new file mode 100644 index 0000000000..e8e2593c9c --- /dev/null +++ b/test/modules/http2/test_102_require.py @@ -0,0 +1,38 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + conf = HttpdConf(env).start_vhost(env.https_port, "ssl", with_ssl=True) + conf.add(""" + Protocols h2 http/1.1 + SSLOptions +StdEnvVars + <Location /h2only.html> + Require expr \"%{HTTP2} == 'on'\" + </Location> + <Location /noh2.html> + Require expr \"%{HTTP2} == 'off'\" + </Location>""") + conf.end_vhost() + conf.install() + # the dir needs to exists for the configuration to have effect + env.mkpath("%s/htdocs/ssl-client-verify" % env.server_dir) + assert env.apache_restart() == 0 + + def test_102_01(self, env): + url = env.mkurl("https", "ssl", "/h2only.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert 404 == r.response["status"] + + def test_102_02(self, env): + url = env.mkurl("https", "ssl", "/noh2.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert 403 == r.response["status"] diff --git a/test/modules/http2/test_103_upgrade.py b/test/modules/http2/test_103_upgrade.py new file mode 100644 index 0000000000..28ed7370d2 --- /dev/null +++ b/test/modules/http2/test_103_upgrade.py @@ -0,0 +1,119 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_test1().add_vhost_test2().add_vhost_noh2( + ).start_vhost( + env.https_port, "test3", doc_root="htdocs/test1", with_ssl=True + ).add( + """ + Protocols h2 http/1.1 + Header unset Upgrade""" + ).end_vhost( + ).start_vhost( + env.http_port, "test1b", doc_root="htdocs/test1", with_ssl=False + ).add( + """ + Protocols h2c http/1.1 + H2Upgrade off + <Location /006.html> + H2Upgrade on + </Location>""" + ).end_vhost( + ).install() + assert env.apache_restart() == 0 + + # accessing http://test1, will not try h2 and advertise h2 in the response + def test_103_01(self, env): + url = env.mkurl("http", "test1", "/index.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert "upgrade" in r.response["header"] + assert "h2c" == r.response["header"]["upgrade"] + + # accessing http://noh2, will not advertise, because noh2 host does not have it enabled + def test_103_02(self, env): + url = env.mkurl("http", "noh2", "/index.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert "upgrade" not in r.response["header"] + + # accessing http://test2, will not advertise, because h2 has less preference than http/1.1 + def test_103_03(self, env): + url = env.mkurl("http", "test2", "/index.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert "upgrade" not in r.response["header"] + + # accessing https://noh2, will not advertise, because noh2 host does not have it enabled + def test_103_04(self, env): + url = env.mkurl("https", "noh2", "/index.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert "upgrade" not in r.response["header"] + + # accessing https://test2, will not advertise, because h2 has less preference than http/1.1 + def test_103_05(self, env): + url = env.mkurl("https", "test2", "/index.html") + r = env.curl_get(url) + assert 0 == r.exit_code + assert r.response + assert "upgrade" not in r.response["header"] + + # accessing https://test1, will advertise h2 in the response + def test_103_06(self, env): + url = env.mkurl("https", "test1", "/index.html") + r = env.curl_get(url, options=["--http1.1"]) + assert 0 == r.exit_code + assert r.response + assert "upgrade" in r.response["header"] + assert "h2" == r.response["header"]["upgrade"] + + # accessing https://test3, will not send Upgrade since it is suppressed + def test_103_07(self, env): + url = env.mkurl("https", "test3", "/index.html") + r = env.curl_get(url, options=["--http1.1"]) + assert 0 == r.exit_code + assert r.response + assert "upgrade" not in r.response["header"] + + # upgrade to h2c for a request, where h2c is preferred + def test_103_20(self, env): + url = env.mkurl("http", "test1", "/index.html") + r = env.nghttp().get(url, options=["-u"]) + assert 200 == r.response["status"] + + # upgrade to h2c for a request where http/1.1 is preferred, but the clients upgrade + # wish is honored nevertheless + def test_103_21(self, env): + url = env.mkurl("http", "test2", "/index.html") + r = env.nghttp().get(url, options=["-u"]) + assert 404 == r.response["status"] + + # ugrade to h2c on a host where h2c is not enabled will fail + def test_103_22(self, env): + url = env.mkurl("http", "noh2", "/index.html") + r = env.nghttp().get(url, options=["-u"]) + assert not r.response + + # ugrade to h2c on a host where h2c is preferred, but Upgrade is disabled + def test_103_23(self, env): + url = env.mkurl("http", "test1b", "/index.html") + r = env.nghttp().get(url, options=["-u"]) + assert not r.response + + # ugrade to h2c on a host where h2c is preferred, but Upgrade is disabled on the server, + # but allowed for a specific location + def test_103_24(self, env): + url = env.mkurl("http", "test1b", "/006.html") + r = env.nghttp().get(url, options=["-u"]) + assert 200 == r.response["status"] diff --git a/test/modules/http2/test_104_padding.py b/test/modules/http2/test_104_padding.py new file mode 100644 index 0000000000..f5a481207d --- /dev/null +++ b/test/modules/http2/test_104_padding.py @@ -0,0 +1,100 @@ +import pytest + +from h2_conf import HttpdConf + + +def frame_padding(payload, padbits): + mask = (1 << padbits) - 1 + return ((payload + 9 + mask) & ~mask) - (payload + 9) + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + conf = HttpdConf(env) + conf.add_vhost_cgi() + conf.start_vhost(env.https_port, "pad0", doc_root="htdocs/cgi", with_ssl=True) + conf.add("Protocols h2 http/1.1") + conf.add("H2Padding 0") + conf.add("AddHandler cgi-script .py") + conf.end_vhost() + conf.start_vhost(env.https_port, "pad1", doc_root="htdocs/cgi", with_ssl=True) + conf.add("Protocols h2 http/1.1") + conf.add("H2Padding 1") + conf.add("AddHandler cgi-script .py") + conf.end_vhost() + conf.start_vhost(env.https_port, "pad2", doc_root="htdocs/cgi", with_ssl=True) + conf.add("Protocols h2 http/1.1") + conf.add("H2Padding 2") + conf.add("AddHandler cgi-script .py") + conf.end_vhost() + conf.start_vhost(env.https_port, "pad3", doc_root="htdocs/cgi", with_ssl=True) + conf.add("Protocols h2 http/1.1") + conf.add("H2Padding 3") + conf.add("AddHandler cgi-script .py") + conf.end_vhost() + conf.start_vhost(env.https_port, "pad8", doc_root="htdocs/cgi", with_ssl=True) + conf.add("Protocols h2 http/1.1") + conf.add("H2Padding 8") + conf.add("AddHandler cgi-script .py") + conf.end_vhost() + conf.install() + assert env.apache_restart() == 0 + + # default paddings settings: 0 bits + def test_104_01(self, env): + url = env.mkurl("https", "cgi", "/echo.py") + # we get 2 frames back: one with data and an empty one with EOF + # check the number of padding bytes is as expected + for data in ["x", "xx", "xxx", "xxxx", "xxxxx", "xxxxxx", "xxxxxxx", "xxxxxxxx"]: + r = env.nghttp().post_data(url, data, 5) + assert 200 == r.response["status"] + assert r.results["paddings"] == [ + frame_padding(len(data)+1, 0), + frame_padding(0, 0) + ] + + # 0 bits of padding + def test_104_02(self, env): + url = env.mkurl("https", "pad0", "/echo.py") + for data in ["x", "xx", "xxx", "xxxx", "xxxxx", "xxxxxx", "xxxxxxx", "xxxxxxxx"]: + r = env.nghttp().post_data(url, data, 5) + assert 200 == r.response["status"] + assert r.results["paddings"] == [0, 0] + + # 1 bit of padding + def test_104_03(self, env): + url = env.mkurl("https", "pad1", "/echo.py") + for data in ["x", "xx", "xxx", "xxxx", "xxxxx", "xxxxxx", "xxxxxxx", "xxxxxxxx"]: + r = env.nghttp().post_data(url, data, 5) + assert 200 == r.response["status"] + for i in r.results["paddings"]: + assert i in range(0, 2) + + # 2 bits of padding + def test_104_04(self, env): + url = env.mkurl("https", "pad2", "/echo.py") + for data in ["x", "xx", "xxx", "xxxx", "xxxxx", "xxxxxx", "xxxxxxx", "xxxxxxxx"]: + r = env.nghttp().post_data(url, data, 5) + assert 200 == r.response["status"] + for i in r.results["paddings"]: + assert i in range(0, 4) + + # 3 bits of padding + def test_104_05(self, env): + url = env.mkurl("https", "pad3", "/echo.py") + for data in ["x", "xx", "xxx", "xxxx", "xxxxx", "xxxxxx", "xxxxxxx", "xxxxxxxx"]: + r = env.nghttp().post_data(url, data, 5) + assert 200 == r.response["status"] + for i in r.results["paddings"]: + assert i in range(0, 8) + + # 8 bits of padding + def test_104_06(self, env): + url = env.mkurl("https", "pad8", "/echo.py") + for data in ["x", "xx", "xxx", "xxxx", "xxxxx", "xxxxxx", "xxxxxxx", "xxxxxxxx"]: + r = env.nghttp().post_data(url, data, 5) + assert 200 == r.response["status"] + for i in r.results["paddings"]: + assert i in range(0, 256) diff --git a/test/modules/http2/test_105_timeout.py b/test/modules/http2/test_105_timeout.py new file mode 100644 index 0000000000..85989eb0b2 --- /dev/null +++ b/test/modules/http2/test_105_timeout.py @@ -0,0 +1,96 @@ +import socket +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + # Check that base servers 'Timeout' setting is observed on SSL handshake + def test_105_01(self, env): + conf = HttpdConf(env) + conf.add(""" + AcceptFilter http none + Timeout 1.5 + """) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + host = 'localhost' + # read with a longer timeout than the server + sock = socket.create_connection((host, int(env.https_port))) + try: + # on some OS, the server does not see our connection until there is + # something incoming + sock.send(b'0') + sock.settimeout(4) + buff = sock.recv(1024) + assert buff == b'' + except Exception as ex: + print(f"server did not close in time: {ex}") + assert False + sock.close() + # read with a shorter timeout than the server + sock = socket.create_connection((host, int(env.https_port))) + try: + sock.settimeout(0.5) + sock.recv(1024) + assert False + except Exception as ex: + print(f"as expected: {ex}") + sock.close() + + # Check that mod_reqtimeout handshake setting takes effect + def test_105_02(self, env): + conf = HttpdConf(env) + conf.add(""" + AcceptFilter http none + Timeout 10 + RequestReadTimeout handshake=1 header=5 body=10 + """) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + host = 'localhost' + # read with a longer timeout than the server + sock = socket.create_connection((host, int(env.https_port))) + try: + # on some OS, the server does not see our connection until there is + # something incoming + sock.send(b'0') + sock.settimeout(4) + buff = sock.recv(1024) + assert buff == b'' + except Exception as ex: + print(f"server did not close in time: {ex}") + assert False + sock.close() + # read with a shorter timeout than the server + sock = socket.create_connection((host, int(env.https_port))) + try: + sock.settimeout(0.5) + sock.recv(1024) + assert False + except Exception as ex: + print(f"as expected: {ex}") + sock.close() + + # Check that mod_reqtimeout handshake setting do no longer apply to handshaked + # connections. See <https://github.com/icing/mod_h2/issues/196>. + def test_105_03(self, env): + conf = HttpdConf(env) + conf.add(""" + Timeout 10 + RequestReadTimeout handshake=1 header=5 body=10 + """) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + url = env.mkurl("https", "cgi", "/necho.py") + r = env.curl_get(url, 5, [ + "-vvv", + "-F", ("count=%d" % 100), + "-F", ("text=%s" % "abcdefghijklmnopqrstuvwxyz"), + "-F", ("wait1=%f" % 1.5), + ]) + assert 200 == r.response["status"] diff --git a/test/modules/http2/test_106_shutdown.py b/test/modules/http2/test_106_shutdown.py new file mode 100644 index 0000000000..218c75669d --- /dev/null +++ b/test/modules/http2/test_106_shutdown.py @@ -0,0 +1,45 @@ +# +# mod-h2 test suite +# check HTTP/2 timeout behaviour +# +import time +from threading import Thread + +import pytest + +from h2_conf import HttpdConf +from h2_result import ExecResult + + +class TestShutdown: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + conf = HttpdConf(env) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + + def test_106_01(self, env): + url = env.mkurl("https", "cgi", "/necho.py") + lines = 100000 + text = "123456789" + wait2 = 1.0 + self.r = None + def long_request(): + args = ["-vvv", + "-F", f"count={lines}", + "-F", f"text={text}", + "-F", f"wait2={wait2}", + ] + self.r = env.curl_get(url, 5, args) + + t = Thread(target=long_request) + t.start() + time.sleep(0.5) + assert env.apache_restart() == 0 + t.join() + # noinspection PyTypeChecker + r: ExecResult = self.r + assert r.response["status"] == 200 + assert len(r.response["body"]) == (lines * (len(text)+1)) diff --git a/test/modules/http2/test_200_header_invalid.py b/test/modules/http2/test_200_header_invalid.py new file mode 100644 index 0000000000..1b97fa67bb --- /dev/null +++ b/test/modules/http2/test_200_header_invalid.py @@ -0,0 +1,172 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_cgi().install() + assert env.apache_restart() == 0 + + # let the hecho.py CGI echo chars < 0x20 in field name + # for almost all such characters, the stream gets aborted with a h2 error and + # there will be no http status, cr and lf are handled special + def test_200_01(self, env): + url = env.mkurl("https", "cgi", "/hecho.py") + for x in range(1, 32): + r = env.curl_post_data(url, "name=x%%%02xx&value=yz" % x) + if x in [10]: + assert 0 == r.exit_code, "unexpected exit code for char 0x%02x" % x + assert 500 == r.response["status"], "unexpected status for char 0x%02x" % x + elif x in [13]: + assert 0 == r.exit_code, "unexpected exit code for char 0x%02x" % x + assert 200 == r.response["status"], "unexpected status for char 0x%02x" % x + else: + assert 0 != r.exit_code, "unexpected exit code for char 0x%02x" % x + + # let the hecho.py CGI echo chars < 0x20 in field value + # for almost all such characters, the stream gets aborted with a h2 error and + # there will be no http status, cr and lf are handled special + def test_200_02(self, env): + url = env.mkurl("https", "cgi", "/hecho.py") + for x in range(1, 32): + if 9 != x: + r = env.curl_post_data(url, "name=x&value=y%%%02x" % x) + if x in [10, 13]: + assert 0 == r.exit_code, "unexpected exit code for char 0x%02x" % x + assert 200 == r.response["status"], "unexpected status for char 0x%02x" % x + else: + assert 0 != r.exit_code, "unexpected exit code for char 0x%02x" % x + + # let the hecho.py CGI echo 0x10 and 0x7f in field name and value + def test_200_03(self, env): + url = env.mkurl("https", "cgi", "/hecho.py") + for h in ["10", "7f"]: + r = env.curl_post_data(url, "name=x%%%s&value=yz" % h) + assert 0 != r.exit_code + r = env.curl_post_data(url, "name=x&value=y%%%sz" % h) + assert 0 != r.exit_code + + # test header field lengths check, LimitRequestLine (default 8190) + def test_200_10(self, env): + url = env.mkurl("https", "cgi", "/") + val = "1234567890" # 10 chars + for i in range(3): # make a 10000 char string + val = "%s%s%s%s%s%s%s%s%s%s" % (val, val, val, val, val, val, val, val, val, val) + # LimitRequestLine 8190 ok, one more char -> 431 + r = env.curl_get(url, options=["-H", "x: %s" % (val[:8187])]) + assert 200 == r.response["status"] + r = env.curl_get(url, options=["-H", "x: %sx" % (val[:8188])]) + assert 431 == r.response["status"] + + # test header field lengths check, LimitRequestFieldSize (default 8190) + def test_200_11(self, env): + url = env.mkurl("https", "cgi", "/") + val = "1234567890" # 10 chars + for i in range(3): # make a 10000 char string + val = "%s%s%s%s%s%s%s%s%s%s" % (val, val, val, val, val, val, val, val, val, val) + # LimitRequestFieldSize 8190 ok, one more char -> 400 in HTTP/1.1 + # (we send 4000+4185 since they are concatenated by ", " and start with "x: " + r = env.curl_get(url, options=["-H", "x: %s" % (val[:4000]), "-H", "x: %s" % (val[:4185])]) + assert 200 == r.response["status"] + r = env.curl_get(url, options=["--http1.1", "-H", "x: %s" % (val[:4000]), "-H", "x: %s" % (val[:4189])]) + assert 400 == r.response["status"] + r = env.curl_get(url, options=["-H", "x: %s" % (val[:4000]), "-H", "x: %s" % (val[:4191])]) + assert 431 == r.response["status"] + + # test header field count, LimitRequestFields (default 100) + # see #201: several headers with same name are mered and count only once + def test_200_12(self, env): + url = env.mkurl("https", "cgi", "/") + opt = [] + for i in range(98): # curl sends 2 headers itself (user-agent and accept) + opt += ["-H", "x: 1"] + r = env.curl_get(url, options=opt) + assert 200 == r.response["status"] + r = env.curl_get(url, options=(opt + ["-H", "y: 2"])) + assert 200 == r.response["status"] + + # test header field count, LimitRequestFields (default 100) + # different header names count each + def test_200_13(self, env): + url = env.mkurl("https", "cgi", "/") + opt = [] + for i in range(98): # curl sends 2 headers itself (user-agent and accept) + opt += ["-H", "x{0}: 1".format(i)] + r = env.curl_get(url, options=opt) + assert 200 == r.response["status"] + r = env.curl_get(url, options=(opt + ["-H", "y: 2"])) + assert 431 == r.response["status"] + + # test "LimitRequestFields 0" setting, see #200 + def test_200_14(self, env): + conf = HttpdConf(env) + conf.add(""" + LimitRequestFields 20 + """) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + url = env.mkurl("https", "cgi", "/") + opt = [] + for i in range(21): + opt += ["-H", "x{0}: 1".format(i)] + r = env.curl_get(url, options=opt) + assert 431 == r.response["status"] + conf = HttpdConf(env) + conf.add(""" + LimitRequestFields 0 + """) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + url = env.mkurl("https", "cgi", "/") + opt = [] + for i in range(100): + opt += ["-H", "x{0}: 1".format(i)] + r = env.curl_get(url, options=opt) + assert 200 == r.response["status"] + + # the uri limits + def test_200_15(self, env): + conf = HttpdConf(env) + conf.add(""" + LimitRequestLine 48 + """) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + url = env.mkurl("https", "cgi", "/") + r = env.curl_get(url) + assert 200 == r.response["status"] + url = env.mkurl("https", "cgi", "/" + (48*"x")) + r = env.curl_get(url) + assert 414 == r.response["status"] + # nghttp sends the :method: header first (so far) + # trigger a too long request line on it + # the stream will RST and we get no response + url = env.mkurl("https", "cgi", "/") + opt = ["-H:method: {0}".format(100*"x")] + r = env.nghttp().get(url, options=opt) + assert r.exit_code == 0, r + assert not r.response + + # invalid chars in method + def test_200_16(self, env): + conf = HttpdConf(env) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + url = env.mkurl("https", "cgi", "/hello.py") + opt = ["-H:method: GET /hello.py"] + r = env.nghttp().get(url, options=opt) + assert r.exit_code == 0, r + assert r.response + assert r.response["status"] == 400 + url = env.mkurl("https", "cgi", "/proxy/hello.py") + r = env.nghttp().get(url, options=opt) + assert r.exit_code == 0, r + assert r.response + assert r.response["status"] == 400 diff --git a/test/modules/http2/test_201_header_conditional.py b/test/modules/http2/test_201_header_conditional.py new file mode 100644 index 0000000000..85047422cb --- /dev/null +++ b/test/modules/http2/test_201_header_conditional.py @@ -0,0 +1,69 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add( + """ + KeepAlive on + MaxKeepAliveRequests 30 + KeepAliveTimeout 30""" + ).add_vhost_test1().install() + assert env.apache_restart() == 0 + + # check handling of 'if-modified-since' header + def test_201_01(self, env): + url = env.mkurl("https", "test1", "/006/006.css") + r = env.curl_get(url) + assert 200 == r.response["status"] + lm = r.response["header"]["last-modified"] + assert lm + r = env.curl_get(url, options=["-H", "if-modified-since: %s" % lm]) + assert 304 == r.response["status"] + r = env.curl_get(url, options=["-H", "if-modified-since: Tue, 04 Sep 2010 11:51:59 GMT"]) + assert 200 == r.response["status"] + + # check handling of 'if-none-match' header + def test_201_02(self, env): + url = env.mkurl("https", "test1", "/006/006.css") + r = env.curl_get(url) + assert 200 == r.response["status"] + etag = r.response["header"]["etag"] + assert etag + r = env.curl_get(url, options=["-H", "if-none-match: %s" % etag]) + assert 304 == r.response["status"] + r = env.curl_get(url, options=["-H", "if-none-match: dummy"]) + assert 200 == r.response["status"] + + @pytest.mark.skipif(True, reason="304 misses the Vary header in trunk and 2.4.x") + def test_201_03(self, env): + url = env.mkurl("https", "test1", "/006.html") + r = env.curl_get(url, options=["-H", "Accept-Encoding: gzip"]) + assert 200 == r.response["status"] + for h in r.response["header"]: + print("%s: %s" % (h, r.response["header"][h])) + lm = r.response["header"]["last-modified"] + assert lm + assert "gzip" == r.response["header"]["content-encoding"] + assert "Accept-Encoding" in r.response["header"]["vary"] + + r = env.curl_get(url, options=["-H", "if-modified-since: %s" % lm, + "-H", "Accept-Encoding: gzip"]) + assert 304 == r.response["status"] + for h in r.response["header"]: + print("%s: %s" % (h, r.response["header"][h])) + assert "vary" in r.response["header"] + + # Check if "Keep-Alive" response header is removed in HTTP/2. + def test_201_04(self, env): + url = env.mkurl("https", "test1", "/006.html") + r = env.curl_get(url, options=["--http1.1", "-H", "Connection: keep-alive"]) + assert 200 == r.response["status"] + assert "timeout=30, max=30" == r.response["header"]["keep-alive"] + r = env.curl_get(url, options=["-H", "Connection: keep-alive"]) + assert 200 == r.response["status"] + assert "keep-alive" not in r.response["header"] diff --git a/test/modules/http2/test_202_trailer.py b/test/modules/http2/test_202_trailer.py new file mode 100644 index 0000000000..04fa5419c0 --- /dev/null +++ b/test/modules/http2/test_202_trailer.py @@ -0,0 +1,81 @@ +import os +import pytest + +from h2_conf import HttpdConf + + +def setup_data(env): + s100 = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\n" + with open(os.path.join(env.gen_dir, "data-1k"), 'w') as f: + for i in range(10): + f.write(s100) + + +# The trailer tests depend on "nghttp" as no other client seems to be able to send those +# rare things. +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + setup_data(env) + HttpdConf(env).add_vhost_cgi(h2proxy_self=True).install() + assert env.apache_restart() == 0 + + # check if the server survives a trailer or two + def test_202_01(self, env): + url = env.mkurl("https", "cgi", "/echo.py") + fpath = os.path.join(env.gen_dir, "data-1k") + r = env.nghttp().upload(url, fpath, options=["--trailer", "test: 1"]) + assert 300 > r.response["status"] + assert 1000 == len(r.response["body"]) + + r = env.nghttp().upload(url, fpath, options=["--trailer", "test: 1b", "--trailer", "XXX: test"]) + assert 300 > r.response["status"] + assert 1000 == len(r.response["body"]) + + # check if the server survives a trailer without content-length + def test_202_02(self, env): + url = env.mkurl("https", "cgi", "/echo.py") + fpath = os.path.join(env.gen_dir, "data-1k") + r = env.nghttp().upload(url, fpath, options=["--trailer", "test: 2", "--no-content-length"]) + assert 300 > r.response["status"] + assert 1000 == len(r.response["body"]) + + # check if echoing request headers in response from GET works + def test_202_03(self, env): + url = env.mkurl("https", "cgi", "/echohd.py?name=X") + r = env.nghttp().get(url, options=["--header", "X: 3"]) + assert 300 > r.response["status"] + assert b"X: 3\n" == r.response["body"] + + # check if echoing request headers in response from POST works + def test_202_03b(self, env): + url = env.mkurl("https", "cgi", "/echohd.py?name=X") + r = env.nghttp().post_name(url, "Y", options=["--header", "X: 3b"]) + assert 300 > r.response["status"] + assert b"X: 3b\n" == r.response["body"] + + # check if echoing request headers in response from POST works, but trailers are not seen + # This is the way CGI invocation works. + def test_202_04(self, env): + url = env.mkurl("https", "cgi", "/echohd.py?name=X") + r = env.nghttp().post_name(url, "Y", options=["--header", "X: 4a", "--trailer", "X: 4b"]) + assert 300 > r.response["status"] + assert b"X: 4a\n" == r.response["body"] + + # The h2 status handler echoes a trailer if it sees a trailer + def test_202_05(self, env): + url = env.mkurl("https", "cgi", "/.well-known/h2/state") + fpath = os.path.join(env.gen_dir, "data-1k") + r = env.nghttp().upload(url, fpath, options=["--trailer", "test: 2"]) + assert 200 == r.response["status"] + assert "1" == r.response["trailer"]["h2-trailers-in"] + + # Check that we can send and receive trailers throuh mod_proxy_http2 + def test_202_06(self, env): + url = env.mkurl("https", "cgi", "/h2proxy/.well-known/h2/state") + fpath = os.path.join(env.gen_dir, "data-1k") + r = env.nghttp().upload(url, fpath, options=["--trailer", "test: 2"]) + assert 200 == r.response["status"] + assert 'trailer' in r.response + assert "1" == r.response['trailer']["h2-trailers-in"] diff --git a/test/modules/http2/test_300_interim.py b/test/modules/http2/test_300_interim.py new file mode 100644 index 0000000000..b0c591d6f0 --- /dev/null +++ b/test/modules/http2/test_300_interim.py @@ -0,0 +1,39 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_test1().add_vhost_cgi().install() + assert env.apache_restart() == 0 + + def setup_method(self, method): + print("setup_method: %s" % method.__name__) + + def teardown_method(self, method): + print("teardown_method: %s" % method.__name__) + + # check that we normally do not see an interim response + def test_300_01(self, env): + url = env.mkurl("https", "test1", "/index.html") + r = env.curl_post_data(url, 'XYZ') + assert 200 == r.response["status"] + assert "previous" not in r.response + + # check that we see an interim response when we ask for it + def test_300_02(self, env): + url = env.mkurl("https", "cgi", "/echo.py") + r = env.curl_post_data(url, 'XYZ', options=["-H", "expect: 100-continue"]) + assert 200 == r.response["status"] + assert "previous" in r.response + assert 100 == r.response["previous"]["status"] + + # check proper answer on unexpected + def test_300_03(self, env): + url = env.mkurl("https", "cgi", "/echo.py") + r = env.curl_post_data(url, 'XYZ', options=["-H", "expect: the-unexpected"]) + assert 417 == r.response["status"] + assert "previous" not in r.response diff --git a/test/modules/http2/test_400_push.py b/test/modules/http2/test_400_push.py new file mode 100644 index 0000000000..9e2e853971 --- /dev/null +++ b/test/modules/http2/test_400_push.py @@ -0,0 +1,199 @@ +import os +import pytest + +from h2_conf import HttpdConf + + +# The push tests depend on "nghttp" +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).start_vhost( + env.https_port, "push", doc_root="htdocs/test1", with_ssl=True + ).add(r""" Protocols h2 http/1.1" + RewriteEngine on + RewriteRule ^/006-push(.*)?\.html$ /006.html + <Location /006-push.html> + Header add Link "</006/006.css>;rel=preload" + Header add Link "</006/006.js>;rel=preloadX" + </Location> + <Location /006-push2.html> + Header add Link "</006/006.css>;rel=preloadX, </006/006.js>; rel=preload" + </Location> + <Location /006-push3.html> + Header add Link "</006/006.css>;rel=preloa,</006/006.js>;rel=preload" + </Location> + <Location /006-push4.html> + Header add Link "</006/006.css;rel=preload, </006/006.js>; preload" + </Location> + <Location /006-push5.html> + Header add Link '</006/006.css>;rel="preload push"' + </Location> + <Location /006-push6.html> + Header add Link '</006/006.css>;rel="push preload"' + </Location> + <Location /006-push7.html> + Header add Link '</006/006.css>;rel="abc preload push"' + </Location> + <Location /006-push8.html> + Header add Link '</006/006.css>;rel="preload"; nopush' + </Location> + <Location /006-push20.html> + H2PushResource "/006/006.css" critical + H2PushResource "/006/006.js" + </Location> + <Location /006-push30.html> + H2Push off + Header add Link '</006/006.css>;rel="preload"' + </Location> + <Location /006-push31.html> + H2PushResource "/006/006.css" critical + </Location> + <Location /006-push32.html> + Header add Link "</006/006.css>;rel=preload" + </Location> + """).end_vhost( + ).install() + assert env.apache_restart() == 0 + + ############################ + # Link: header handling, various combinations + + # plain resource without configured pushes + def test_400_00(self, env): + url = env.mkurl("https", "push", "/006.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 0 == len(promises) + + # 2 link headers configured, only 1 triggers push + def test_400_01(self, env): + url = env.mkurl("https", "push", "/006-push.html") + r = env.nghttp().get(url, options=["-Haccept-encoding: none"]) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + assert '/006/006.css' == promises[0]["request"]["header"][":path"] + assert 216 == len(promises[0]["response"]["body"]) + + # Same as 400_01, but with single header line configured + def test_400_02(self, env): + url = env.mkurl("https", "push", "/006-push2.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + assert '/006/006.js' == promises[0]["request"]["header"][":path"] + + # 2 Links, only one with correct rel attribue + def test_400_03(self, env): + url = env.mkurl("https", "push", "/006-push3.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + assert '/006/006.js' == promises[0]["request"]["header"][":path"] + + # Missing > in Link header, PUSH not triggered + def test_400_04(self, env): + url = env.mkurl("https", "push", "/006-push4.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 0 == len(promises) + + # More than one value in "rel" parameter + def test_400_05(self, env): + url = env.mkurl("https", "push", "/006-push5.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + assert '/006/006.css' == promises[0]["request"]["header"][":path"] + + # Another "rel" parameter variation + def test_400_06(self, env): + url = env.mkurl("https", "push", "/006-push6.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + assert '/006/006.css' == promises[0]["request"]["header"][":path"] + + # Another "rel" parameter variation + def test_400_07(self, env): + url = env.mkurl("https", "push", "/006-push7.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + assert '/006/006.css' == promises[0]["request"]["header"][":path"] + + # Pushable link header with "nopush" attribute + def test_400_08(self, env): + url = env.mkurl("https", "push", "/006-push8.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 0 == len(promises) + + # 2 H2PushResource config trigger on GET, but not on POST + def test_400_20(self, env): + url = env.mkurl("https", "push", "/006-push20.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 2 == len(promises) + + fpath = os.path.join(env.gen_dir, "data-400-20") + with open(fpath, 'w') as f: + f.write("test upload data") + r = env.nghttp().upload(url, fpath) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 0 == len(promises) + + # H2Push configured Off in location + def test_400_30(self, env): + url = env.mkurl("https", "push", "/006-push30.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 0 == len(promises) + + # - suppress PUSH + def test_400_50(self, env): + url = env.mkurl("https", "push", "/006-push.html") + r = env.nghttp().get(url, options=['-H', 'accept-push-policy: none']) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 0 == len(promises) + + # - default pushes desired + def test_400_51(self, env): + url = env.mkurl("https", "push", "/006-push.html") + r = env.nghttp().get(url, options=['-H', 'accept-push-policy: default']) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + + # - HEAD pushes desired + def test_400_52(self, env): + url = env.mkurl("https", "push", "/006-push.html") + r = env.nghttp().get(url, options=['-H', 'accept-push-policy: head']) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + assert '/006/006.css' == promises[0]["request"]["header"][":path"] + assert b"" == promises[0]["response"]["body"] + assert 0 == len(promises[0]["response"]["body"]) + + # - fast-load pushes desired + def test_400_53(self, env): + url = env.mkurl("https", "push", "/006-push.html") + r = env.nghttp().get(url, options=['-H', 'accept-push-policy: fast-load']) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) diff --git a/test/modules/http2/test_401_early_hints.py b/test/modules/http2/test_401_early_hints.py new file mode 100644 index 0000000000..1e7a028a82 --- /dev/null +++ b/test/modules/http2/test_401_early_hints.py @@ -0,0 +1,46 @@ +import pytest + +from h2_conf import HttpdConf + + +# The push tests depend on "nghttp" +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).start_vhost( + env.https_port, "hints", doc_root="htdocs/test1", with_ssl=True + ).add(""" Protocols h2 http/1.1" + H2EarlyHints on + RewriteEngine on + RewriteRule ^/006-(.*)?\\.html$ /006.html + <Location /006-hints.html> + H2PushResource "/006/006.css" critical + </Location> + <Location /006-nohints.html> + Header add Link "</006/006.css>;rel=preload" + </Location> + """).end_vhost( + ).install() + assert env.apache_restart() == 0 + + # H2EarlyHints enabled in general, check that it works for H2PushResource + def test_401_31(self, env): + url = env.mkurl("https", "hints", "/006-hints.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + early = r.response["previous"] + assert early + assert 103 == int(early["header"][":status"]) + assert early["header"]["link"] + + # H2EarlyHints enabled in general, but does not trigger on added response headers + def test_401_32(self, env): + url = env.mkurl("https", "hints", "/006-nohints.html") + r = env.nghttp().get(url) + assert 200 == r.response["status"] + promises = r.results["streams"][r.response["id"]]["promises"] + assert 1 == len(promises) + assert "previous" not in r.response diff --git a/test/modules/http2/test_500_proxy.py b/test/modules/http2/test_500_proxy.py new file mode 100644 index 0000000000..00d9b7f21e --- /dev/null +++ b/test/modules/http2/test_500_proxy.py @@ -0,0 +1,119 @@ +import os +import re +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + env.setup_data_1k_1m() + HttpdConf(env).add_vhost_cgi(proxy_self=True).install() + assert env.apache_restart() == 0 + + def setup_method(self, method): + print("setup_method: %s" % method.__name__) + + def teardown_method(self, method): + print("teardown_method: %s" % method.__name__) + + def test_500_01(self, env): + url = env.mkurl("https", "cgi", "/proxy/hello.py") + r = env.curl_get(url, 5) + assert 200 == r.response["status"] + assert "HTTP/1.1" == r.response["json"]["protocol"] + assert "" == r.response["json"]["https"] + assert "" == r.response["json"]["ssl_protocol"] + assert "" == r.response["json"]["h2"] + assert "" == r.response["json"]["h2push"] + + # upload and GET again using curl, compare to original content + def curl_upload_and_verify(self, env, fname, options=None): + url = env.mkurl("https", "cgi", "/proxy/upload.py") + fpath = os.path.join(env.gen_dir, fname) + r = env.curl_upload(url, fpath, options=options) + assert r.exit_code == 0 + assert 200 <= r.response["status"] < 300 + + # why is the scheme wrong? + r2 = env.curl_get(re.sub(r'http:', 'https:', r.response["header"]["location"])) + assert r2.exit_code == 0 + assert r2.response["status"] == 200 + with open(env.test_src(fpath), mode='rb') as file: + src = file.read() + assert src == r2.response["body"] + + def test_500_10(self, env): + self.curl_upload_and_verify(env, "data-1k", ["--http2"]) + self.curl_upload_and_verify(env, "data-10k", ["--http2"]) + self.curl_upload_and_verify(env, "data-100k", ["--http2"]) + self.curl_upload_and_verify(env, "data-1m", ["--http2"]) + + # POST some data using nghttp and see it echo'ed properly back + def nghttp_post_and_verify(self, env, fname, options=None): + url = env.mkurl("https", "cgi", "/proxy/echo.py") + fpath = os.path.join(env.gen_dir, fname) + r = env.nghttp().upload(url, fpath, options=options) + assert r.exit_code == 0 + assert 200 <= r.response["status"] < 300 + with open(env.test_src(fpath), mode='rb') as file: + src = file.read() + assert src == r.response["body"] + + def test_500_20(self, env): + self.nghttp_post_and_verify(env, "data-1k", []) + self.nghttp_post_and_verify(env, "data-10k", []) + self.nghttp_post_and_verify(env, "data-100k", []) + self.nghttp_post_and_verify(env, "data-1m", []) + + def test_500_21(self, env): + self.nghttp_post_and_verify(env, "data-1k", ["--no-content-length"]) + self.nghttp_post_and_verify(env, "data-10k", ["--no-content-length"]) + self.nghttp_post_and_verify(env, "data-100k", ["--no-content-length"]) + self.nghttp_post_and_verify(env, "data-1m", ["--no-content-length"]) + + # upload and GET again using nghttp, compare to original content + def nghttp_upload_and_verify(self, env, fname, options=None): + url = env.mkurl("https", "cgi", "/proxy/upload.py") + fpath = os.path.join(env.gen_dir, fname) + + r = env.nghttp().upload_file(url, fpath, options=options) + assert r.exit_code == 0 + assert 200 <= r.response["status"] < 300 + assert r.response["header"]["location"] + + # why is the scheme wrong? + r2 = env.nghttp().get(re.sub(r'http:', 'https:', r.response["header"]["location"])) + assert r2.exit_code == 0 + assert r2.response["status"] == 200 + with open(env.test_src(fpath), mode='rb') as file: + src = file.read() + assert src == r2.response["body"] + + def test_500_22(self, env): + self.nghttp_upload_and_verify(env, "data-1k", []) + self.nghttp_upload_and_verify(env, "data-10k", []) + self.nghttp_upload_and_verify(env, "data-100k", []) + self.nghttp_upload_and_verify(env, "data-1m", []) + + def test_500_23(self, env): + self.nghttp_upload_and_verify(env, "data-1k", ["--no-content-length"]) + self.nghttp_upload_and_verify(env, "data-10k", ["--no-content-length"]) + self.nghttp_upload_and_verify(env, "data-100k", ["--no-content-length"]) + self.nghttp_upload_and_verify(env, "data-1m", ["--no-content-length"]) + + # upload using nghttp and check returned status + def nghttp_upload_stat(self, env, fname, options=None): + url = env.mkurl("https", "cgi", "/proxy/upload.py") + fpath = os.path.join(env.gen_dir, fname) + + r = env.nghttp().upload_file(url, fpath, options=options) + assert r.exit_code == 0 + assert 200 <= r.response["status"] < 300 + assert r.response["header"]["location"] + + def test_500_24(self, env): + for i in range(100): + self.nghttp_upload_stat(env, "data-1k", ["--no-content-length"]) diff --git a/test/modules/http2/test_600_h2proxy.py b/test/modules/http2/test_600_h2proxy.py new file mode 100644 index 0000000000..97b832c2bd --- /dev/null +++ b/test/modules/http2/test_600_h2proxy.py @@ -0,0 +1,27 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + env.setup_data_1k_1m() + conf = HttpdConf(env) + conf.add_vhost_cgi(h2proxy_self=True) + conf.add("LogLevel proxy_http2:trace2") + conf.add("LogLevel proxy:trace2") + conf.install() + assert env.apache_restart() == 0 + + def test_600_01(self, env): + url = env.mkurl("https", "cgi", "/h2proxy/hello.py") + r = env.curl_get(url, 5) + assert r.response["status"] == 200 + assert r.response["json"]["protocol"] == "HTTP/2.0" + assert r.response["json"]["https"] == "on" + assert r.response["json"]["ssl_protocol"] != "" + assert r.response["json"]["h2"] == "on" + assert r.response["json"]["h2push"] == "off" + assert r.response["json"]["host"] == f"cgi.{env.http_tld}" diff --git a/test/modules/http2/test_700_load_get.py b/test/modules/http2/test_700_load_get.py new file mode 100644 index 0000000000..3773bf6764 --- /dev/null +++ b/test/modules/http2/test_700_load_get.py @@ -0,0 +1,54 @@ +import pytest + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + HttpdConf(env).add_vhost_cgi().add_vhost_test1().install() + assert env.apache_restart() == 0 + + def check_h2load_ok(self, env, r, n): + assert 0 == r.exit_code + r = env.h2load_status(r) + assert n == r.results["h2load"]["requests"]["total"] + assert n == r.results["h2load"]["requests"]["started"] + assert n == r.results["h2load"]["requests"]["done"] + assert n == r.results["h2load"]["requests"]["succeeded"] + assert n == r.results["h2load"]["status"]["2xx"] + assert 0 == r.results["h2load"]["status"]["3xx"] + assert 0 == r.results["h2load"]["status"]["4xx"] + assert 0 == r.results["h2load"]["status"]["5xx"] + + # test load on cgi script, single connection, different sizes + @pytest.mark.parametrize("start", [ + 1000, 80000 + ]) + def test_700_10(self, env, start): + text = "X" + chunk = 32 + for n in range(0, 5): + args = [env.h2load, "-n", "%d" % chunk, "-c", "1", "-m", "10", + f"--base-uri={env.https_base_url}"] + for i in range(0, chunk): + args.append(env.mkurl("https", "cgi", ("/mnot164.py?count=%d&text=%s" % (start+(n*chunk)+i, text)))) + r = env.run(args) + self.check_h2load_ok(env, r, chunk) + + # test load on cgi script, single connection + @pytest.mark.parametrize("conns", [ + 1, 2, 16, 32 + ]) + def test_700_11(self, env, conns): + text = "X" + start = 1200 + chunk = 64 + for n in range(0, 5): + args = [env.h2load, "-n", "%d" % chunk, "-c", "%d" % conns, "-m", "10", + f"--base-uri={env.https_base_url}"] + for i in range(0, chunk): + args.append(env.mkurl("https", "cgi", ("/mnot164.py?count=%d&text=%s" % (start+(n*chunk)+i, text)))) + r = env.run(args) + self.check_h2load_ok(env, r, chunk) diff --git a/test/modules/http2/test_710_load_post_static.py b/test/modules/http2/test_710_load_post_static.py new file mode 100644 index 0000000000..0dfe6b65f1 --- /dev/null +++ b/test/modules/http2/test_710_load_post_static.py @@ -0,0 +1,62 @@ +import pytest +import os + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + env.setup_data_1k_1m() + HttpdConf(env).add_vhost_test1().install() + assert env.apache_restart() == 0 + + def check_h2load_ok(self, env, r, n): + assert 0 == r.exit_code + r = env.h2load_status(r) + assert n == r.results["h2load"]["requests"]["total"] + assert n == r.results["h2load"]["requests"]["started"] + assert n == r.results["h2load"]["requests"]["done"] + assert n == r.results["h2load"]["requests"]["succeeded"] + assert n == r.results["h2load"]["status"]["2xx"] + assert 0 == r.results["h2load"]["status"]["3xx"] + assert 0 == r.results["h2load"]["status"]["4xx"] + assert 0 == r.results["h2load"]["status"]["5xx"] + + # test POST on static file, slurped in by server + def test_710_00(self, env): + url = env.mkurl("https", "test1", "/index.html") + n = 10 + m = 1 + conn = 1 + fname = "data-10k" + args = [env.h2load, "-n", "%d" % n, "-c", "%d" % conn, "-m", "%d" % m, + f"--base-uri={env.https_base_url}", + "-d", os.path.join(env.gen_dir, fname), url] + r = env.run(args) + self.check_h2load_ok(env, r, n) + + def test_710_01(self, env): + url = env.mkurl("https", "test1", "/index.html") + n = 1000 + m = 100 + conn = 1 + fname = "data-1k" + args = [env.h2load, "-n", "%d" % n, "-c", "%d" % conn, "-m", "%d" % m, + f"--base-uri={env.https_base_url}", + "-d", os.path.join(env.gen_dir, fname), url] + r = env.run(args) + self.check_h2load_ok(env, r, n) + + def test_710_02(self, env): + url = env.mkurl("https", "test1", "/index.html") + n = 100 + m = 50 + conn = 1 + fname = "data-100k" + args = [env.h2load, "-n", "%d" % n, "-c", "%d" % conn, "-m", "%d" % m, + f"--base-uri={env.https_base_url}", + "-d", os.path.join(env.gen_dir, fname), url] + r = env.run(args) + self.check_h2load_ok(env, r, n) diff --git a/test/modules/http2/test_711_load_post_cgi.py b/test/modules/http2/test_711_load_post_cgi.py new file mode 100644 index 0000000000..187abea30d --- /dev/null +++ b/test/modules/http2/test_711_load_post_cgi.py @@ -0,0 +1,70 @@ +import pytest +import os + +from h2_conf import HttpdConf + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + env.setup_data_1k_1m() + HttpdConf(env).add_vhost_cgi(proxy_self=True, h2proxy_self=True).install() + assert env.apache_restart() == 0 + + def check_h2load_ok(self, env, r, n): + assert 0 == r.exit_code + r = env.h2load_status(r) + assert n == r.results["h2load"]["requests"]["total"] + assert n == r.results["h2load"]["requests"]["started"] + assert n == r.results["h2load"]["requests"]["done"] + assert n == r.results["h2load"]["requests"]["succeeded"] + assert n == r.results["h2load"]["status"]["2xx"] + assert 0 == r.results["h2load"]["status"]["3xx"] + assert 0 == r.results["h2load"]["status"]["4xx"] + assert 0 == r.results["h2load"]["status"]["5xx"] + + # test POST on cgi, where input is read + def test_711_10(self, env): + url = env.mkurl("https", "test1", "/echo.py") + n = 100 + m = 5 + conn = 1 + fname = "data-100k" + args = [ + env.h2load, "-n", str(n), "-c", str(conn), "-m", str(m), + f"--base-uri={env.https_base_url}", + "-d", os.path.join(env.gen_dir, fname), url + ] + r = env.run(args) + self.check_h2load_ok(env, r, n) + + # test POST on cgi via http/1.1 proxy, where input is read + def test_711_11(self, env): + url = env.mkurl("https", "test1", "/proxy/echo.py") + n = 100 + m = 5 + conn = 1 + fname = "data-100k" + args = [ + env.h2load, "-n", str(n), "-c", str(conn), "-m", str(m), + f"--base-uri={env.https_base_url}", + "-d", os.path.join(env.gen_dir, fname), url + ] + r = env.run(args) + self.check_h2load_ok(env, r, n) + + # test POST on cgi via h2proxy, where input is read + def test_711_12(self, env): + url = env.mkurl("https", "test1", "/h2proxy/echo.py") + n = 100 + m = 5 + conn = 1 + fname = "data-100k" + args = [ + env.h2load, "-n", str(n), "-c", str(conn), "-m", str(m), + f"--base-uri={env.https_base_url}", + "-d", os.path.join(env.gen_dir, fname), url + ] + r = env.run(args) + self.check_h2load_ok(env, r, n) diff --git a/test/modules/http2/test_712_buffering.py b/test/modules/http2/test_712_buffering.py new file mode 100644 index 0000000000..70b73762c2 --- /dev/null +++ b/test/modules/http2/test_712_buffering.py @@ -0,0 +1,175 @@ +import datetime +import re +import sys +import time +import subprocess + +from datetime import timedelta +from threading import Thread + +import pytest + +from h2_conf import HttpdConf + + +class CurlPiper: + + def __init__(self, url: str): + self.url = url + self.proc = None + self.args = None + self.headerfile = None + self._stderr = [] + self._stdout = [] + self.stdout_thread = None + self.stderr_thread = None + + def start(self, env): + self.args, self.headerfile = env.curl_complete_args(self.url, timeout=5, options=[ + "-T", "-", "-X", "POST", "--trace-ascii", "%", "--trace-time"]) + sys.stderr.write("starting: {0}\n".format(self.args)) + self.proc = subprocess.Popen(self.args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + bufsize=0) + + def read_output(fh, buffer): + while True: + chunk = fh.read() + if not chunk: + break + buffer.append(chunk.decode()) + + # collect all stdout and stderr until we are done + # use separate threads to not block ourself + self._stderr = [] + self._stdout = [] + if self.proc.stderr: + self.stderr_thread = Thread(target=read_output, args=(self.proc.stderr, self._stderr)) + self.stderr_thread.start() + if self.proc.stdout: + self.stdout_thread = Thread(target=read_output, args=(self.proc.stdout, self._stdout)) + self.stdout_thread.start() + return self.proc + + def send(self, data: str): + self.proc.stdin.write(data.encode()) + self.proc.stdin.flush() + + def close(self) -> ([str], [str]): + self.proc.stdin.close() + self.stdout_thread.join() + self.stderr_thread.join() + self._end() + return self._stdout, self._stderr + + def _end(self): + if self.proc: + # noinspection PyBroadException + try: + if self.proc.stdin: + # noinspection PyBroadException + try: + self.proc.stdin.close() + except Exception: + pass + if self.proc.stdout: + self.proc.stdout.close() + if self.proc.stderr: + self.proc.stderr.close() + except Exception: + self.proc.terminate() + finally: + self.stdout_thread = None + self.stderr_thread = None + self.proc = None + + def stutter_check(self, env, chunks: [str], stutter: datetime.timedelta): + if not self.proc: + self.start(env) + for chunk in chunks: + self.send(chunk) + time.sleep(stutter.total_seconds()) + recv_out, recv_err = self.close() + # assert we got everything back + assert "".join(chunks) == "".join(recv_out) + # now the tricky part: check *when* we got everything back + recv_times = [] + for line in "".join(recv_err).split('\n'): + m = re.match(r'^\s*(\d+:\d+:\d+(\.\d+)?) <= Recv data, (\d+) bytes.*', line) + if m: + recv_times.append(datetime.time.fromisoformat(m.group(1))) + # received as many chunks as we sent + assert len(chunks) == len(recv_times), "received response not in {0} chunks, but {1}".format( + len(chunks), len(recv_times)) + + def microsecs(tdelta): + return ((tdelta.hour * 60 + tdelta.minute) * 60 + tdelta.second) * 1000000 + tdelta.microsecond + + recv_deltas = [] + last_mics = microsecs(recv_times[0]) + for ts in recv_times[1:]: + mics = microsecs(ts) + delta_mics = mics - last_mics + if delta_mics < 0: + delta_mics += datetime.time(23, 59, 59, 999999) + recv_deltas.append(datetime.timedelta(microseconds=delta_mics)) + last_mics = mics + stutter_td = datetime.timedelta(seconds=stutter.total_seconds() * 0.9) # 10% leeway + # TODO: the first two chunks are often close together, it seems + # there still is a little buffering delay going on + for idx, td in enumerate(recv_deltas[1:]): + assert stutter_td < td, \ + f"chunk {idx} arrived too early \n{recv_deltas}\nafter {td}\n{recv_err}" + + +class TestStore: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + env.setup_data_1k_1m() + conf = HttpdConf(env).add("H2OutputBuffering off") + conf.add_vhost_cgi(h2proxy_self=True).install() + assert env.apache_restart() == 0 + + @pytest.mark.skip(reason="this test shows unreliable jitter") + def test_712_01(self, env): + # test gRPC like requests that do not end, but give answers, see #207 + # + # this test works like this: + # - use curl to POST data to the server /h2test/echo + # - feed curl the data in chunks, wait a bit between chunks + # - since some buffering on curl's stdout to Python is involved, + # we will see the response data only at the end. + # - therefore, we enable tracing with timestamps in curl on stderr + # and see when the response chunks arrive + # - if the server sends the incoming data chunks back right away, + # as it should, we see receiving timestamps separated roughly by the + # wait time between sends. + # + url = env.mkurl("https", "cgi", "/h2test/echo") + base_chunk = "0123456789" + chunks = ["chunk-{0:03d}-{1}\n".format(i, base_chunk) for i in range(5)] + stutter = timedelta(seconds=0.2) # this is short, but works on my machine (tm) + piper = CurlPiper(url=url) + piper.stutter_check(env, chunks, stutter) + + def test_712_02(self, env): + # same as 712_01 but via mod_proxy_http2 + # + url = env.mkurl("https", "cgi", "/h2proxy/h2test/echo") + base_chunk = "0123456789" + chunks = ["chunk-{0:03d}-{1}\n".format(i, base_chunk) for i in range(3)] + stutter = timedelta(seconds=0.4) # need a bit more delay since we have the extra connection + piper = CurlPiper(url=url) + piper.stutter_check(env, chunks, stutter) + + def test_712_03(self, env): + # same as 712_02 but with smaller chunks + # + url = env.mkurl("https", "cgi", "/h2proxy/h2test/echo") + base_chunk = "0" + chunks = ["ck{0}-{1}\n".format(i, base_chunk) for i in range(3)] + stutter = timedelta(seconds=0.4) # need a bit more delay since we have the extra connection + piper = CurlPiper(url=url) + piper.stutter_check(env, chunks, stutter) |