From cbc645ea0ce7a6255ca70d5de80be90ac1543cc6 Mon Sep 17 00:00:00 2001 From: bogind Date: Thu, 1 Oct 2020 19:49:24 +0300 Subject: [PATCH] removed redundant files and folders --- help/Makefile | 130 - help/build/doctrees/environment.pickle | Bin 3778 -> 0 bytes help/build/doctrees/index.doctree | Bin 4876 -> 0 bytes help/build/html/.buildinfo | 4 - help/build/html/_sources/index.rst.txt | 20 - help/build/html/_static/ajax-loader.gif | Bin 673 -> 0 bytes help/build/html/_static/basic.css | 665 - help/build/html/_static/classic.css | 261 - help/build/html/_static/comment-bright.png | Bin 756 -> 0 bytes help/build/html/_static/comment-close.png | Bin 829 -> 0 bytes help/build/html/_static/comment.png | Bin 641 -> 0 bytes help/build/html/_static/default.css | 1 - help/build/html/_static/doctools.js | 313 - .../html/_static/documentation_options.js | 9 - help/build/html/_static/down-pressed.png | Bin 222 -> 0 bytes help/build/html/_static/down.png | Bin 202 -> 0 bytes help/build/html/_static/file.png | Bin 286 -> 0 bytes help/build/html/_static/jquery-3.2.1.js | 10253 --------------- help/build/html/_static/jquery-3.4.1.js | 10598 ---------------- help/build/html/_static/jquery.js | 4 - help/build/html/_static/language_data.js | 297 - help/build/html/_static/minus.png | Bin 90 -> 0 bytes help/build/html/_static/plus.png | Bin 90 -> 0 bytes help/build/html/_static/pygments.css | 69 - help/build/html/_static/searchtools.js | 761 -- help/build/html/_static/sidebar.js | 159 - help/build/html/_static/underscore-1.3.1.js | 999 -- help/build/html/_static/underscore.js | 31 - help/build/html/_static/up-pressed.png | Bin 214 -> 0 bytes help/build/html/_static/up.png | Bin 203 -> 0 bytes help/build/html/_static/websupport.js | 808 -- help/build/html/genindex.html | 78 - help/build/html/index.html | 98 - help/build/html/objects.inv | Bin 243 -> 0 bytes help/build/html/search.html | 89 - help/build/html/searchindex.js | 1 - help/make.bat | 155 - help/source/conf.py | 216 - help/source/index.rst | 20 - i18n/af.ts | 11 - img/fill_symbol1.svg | 3 - img/fill_symbol1.txt | 1 - img/svg_template.svg | 3 - pb_tool.cfg | 8 +- scripts/compile-strings.sh | 12 - scripts/run-env-linux.sh | 28 - scripts/update-strings.sh | 56 - test/__init__.py | 2 - test/qgis_interface.py | 205 - test/tenbytenraster.asc | 19 - test/tenbytenraster.asc.aux.xml | 13 - test/tenbytenraster.keywords | 1 - test/tenbytenraster.lic | 18 - test/tenbytenraster.prj | 1 - test/tenbytenraster.qml | 26 - test/test_init.py | 64 - test/test_qgis_environment.py | 60 - test/test_qlyrx_dialog.py | 55 - test/test_resources.py | 44 - test/test_translations.py | 55 - test/utilities.py | 61 - zip_build/!README.txt | 2 + zip_build/qlyrx.zip | Bin 0 -> 57904 bytes zip_build/qlyrx/__init__.py | 36 + zip_build/qlyrx/icon.png | Bin 0 -> 15050 bytes zip_build/qlyrx/metadata.txt | 39 + zip_build/qlyrx/qlyrx.py | 1502 +++ zip_build/qlyrx/qlyrx_dialog.py | 45 + zip_build/qlyrx/qlyrx_dialog_base.ui | 378 + zip_build/qlyrx/resources.py | 1004 ++ 70 files changed, 3008 insertions(+), 26783 deletions(-) delete mode 100644 help/Makefile delete mode 100644 help/build/doctrees/environment.pickle delete mode 100644 help/build/doctrees/index.doctree delete mode 100644 help/build/html/.buildinfo delete mode 100644 help/build/html/_sources/index.rst.txt delete mode 100644 help/build/html/_static/ajax-loader.gif delete mode 100644 help/build/html/_static/basic.css delete mode 100644 help/build/html/_static/classic.css delete mode 100644 help/build/html/_static/comment-bright.png delete mode 100644 help/build/html/_static/comment-close.png delete mode 100644 help/build/html/_static/comment.png delete mode 100644 help/build/html/_static/default.css delete mode 100644 help/build/html/_static/doctools.js delete mode 100644 help/build/html/_static/documentation_options.js delete mode 100644 help/build/html/_static/down-pressed.png delete mode 100644 help/build/html/_static/down.png delete mode 100644 help/build/html/_static/file.png delete mode 100644 help/build/html/_static/jquery-3.2.1.js delete mode 100644 help/build/html/_static/jquery-3.4.1.js delete mode 100644 help/build/html/_static/jquery.js delete mode 100644 help/build/html/_static/language_data.js delete mode 100644 help/build/html/_static/minus.png delete mode 100644 help/build/html/_static/plus.png delete mode 100644 help/build/html/_static/pygments.css delete mode 100644 help/build/html/_static/searchtools.js delete mode 100644 help/build/html/_static/sidebar.js delete mode 100644 help/build/html/_static/underscore-1.3.1.js delete mode 100644 help/build/html/_static/underscore.js delete mode 100644 help/build/html/_static/up-pressed.png delete mode 100644 help/build/html/_static/up.png delete mode 100644 help/build/html/_static/websupport.js delete mode 100644 help/build/html/genindex.html delete mode 100644 help/build/html/index.html delete mode 100644 help/build/html/objects.inv delete mode 100644 help/build/html/search.html delete mode 100644 help/build/html/searchindex.js delete mode 100644 help/make.bat delete mode 100644 help/source/conf.py delete mode 100644 help/source/index.rst delete mode 100644 i18n/af.ts delete mode 100644 img/fill_symbol1.svg delete mode 100644 img/fill_symbol1.txt delete mode 100644 img/svg_template.svg delete mode 100644 scripts/compile-strings.sh delete mode 100644 scripts/run-env-linux.sh delete mode 100644 scripts/update-strings.sh delete mode 100644 test/__init__.py delete mode 100644 test/qgis_interface.py delete mode 100644 test/tenbytenraster.asc delete mode 100644 test/tenbytenraster.asc.aux.xml delete mode 100644 test/tenbytenraster.keywords delete mode 100644 test/tenbytenraster.lic delete mode 100644 test/tenbytenraster.prj delete mode 100644 test/tenbytenraster.qml delete mode 100644 test/test_init.py delete mode 100644 test/test_qgis_environment.py delete mode 100644 test/test_qlyrx_dialog.py delete mode 100644 test/test_resources.py delete mode 100644 test/test_translations.py delete mode 100644 test/utilities.py create mode 100644 zip_build/!README.txt create mode 100644 zip_build/qlyrx.zip create mode 100644 zip_build/qlyrx/__init__.py create mode 100644 zip_build/qlyrx/icon.png create mode 100644 zip_build/qlyrx/metadata.txt create mode 100644 zip_build/qlyrx/qlyrx.py create mode 100644 zip_build/qlyrx/qlyrx_dialog.py create mode 100644 zip_build/qlyrx/qlyrx_dialog_base.ui create mode 100644 zip_build/qlyrx/resources.py diff --git a/help/Makefile b/help/Makefile deleted file mode 100644 index 9def777..0000000 --- a/help/Makefile +++ /dev/null @@ -1,130 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/template_class.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/template_class.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/template_class" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/template_class" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - make -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/help/build/doctrees/environment.pickle b/help/build/doctrees/environment.pickle deleted file mode 100644 index efde71e79adcb82b769b35224bc8fc5107819c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3778 zcmb7HTW=&s751*}vB!6NfhRx{7Kuf|<0KG>@)kDSWSA_;qQJ_lPEB{sRLxd*wX3S_ z87V6zLAzOtLW`6NQb6J&0e>Mck@5$4=Zyy>BqaU>->L2y-^eDhG*Y!BBP!3i#DJuo|ITOV;_WX3HH?iVe0RT+AIg^wLCtki`KcM;I$6o9eoI-Tio z3JEMSALh)7;IEyTb|m?6sxuzA-*7xH6?5DsCC$4V{7N#j1%_kBgD18c4CI)`7rMqe zjI89$I&Ko6g5${|jNW_&(Xn%zry&ZJ6MmKkm> zj`GN_mApnGsf-G~Bb+Pk3wwLV$H(1r;)E``+6?zHezb>~b`LqF6^0ME;YA7`J-=oK zX+*R3@x`eRr?s+O$=x9OAmC{|%|5q&Ll$M_61dYDqCg2%Zm|3OuBEowKnk36iYMcN zHaTM1vDCg*|GafYFy#`(kGKl^i~b7(i6yeI+z@nd&iaaHi1?b#nQ@1erXEl_Wh&;x z&x28dnD<|DM&`*tYgb^(=}8k?GBosw-y8yMG$j&)1f&i=*A**<6|xH(+RR_&sD!n+ zQBv;|9#y`b95Yi4sv-?Naeev!Zm+2EzD-+W?Zzdi^!7fG6)b-HCnmuQ%VfooV~U-g*khkDM-! z{ZkjGf9=v_-=glo?I5bE5B3777}>9o_1GozGNV@XODXj{jCfuoI*3opSyi6C^jUfj z6-y(PUvg|1X+xj}tzS{P7@k2yRMsyz$|&K35Lf#Za)i>9V9_Zo;#iEugqXniHjN|_ zBz$>z#`fsh2H@?c?7$|54Gk;BrDf!F)?t@N-}sDZi?_tv;%@*^{1W^k9w2k?;CF)G zukiadkV8!oWrOS<`4+aWjHK#VVMQu5>|j|juEb;U7r6TKlU&iHKVs7FtG;-zuAwPd z;tv47zRfQO^|42rmBAgqgmN&{I5_cI(*?v6b;@%#Mt9*(+`o#dU}dD-o?jR$-ACKE zgv`)*cv^3k&J4>%1PQVq7W0L9T!VoQuk5s z`&TUl76x!b)g?hJP@A9u&zQEFI>rqZxwvMFyI|L?SdfX+xOt)qB@gRVgRn&<8(DgL zT5{*C5WBeHi^$$21+Ju#>y~ssN?xL*>-%$+pHIs&j;tEobBUegeU00Hs;z4;wo9{o z>(zR6MqO|Bd>bmYa4(yeNubUo#U-Jn~j$filiAIeJ4(9q9omVI@TDi%j(df zT!%V#IeD9I&`u>uMN-=Y{Pc}vKhqH~jLD7qLadXdnBE@l52`x+3`PPkA8}O5Afc9hpuE2Mp19CmXqDt zn;4IJG?y0mwVy;}Iu{-N;*6t~<&dW$j1m~ntzLaKj&yE8#GE!*t=Vso(CEc_UA z6Zpe0dJR)YKaYO#MjJG{JPcJ0{X+aQxsZ^Gm>8j*?IY@gjYjFF0@5nx+qYyM1+-sn zzHLZ&K)rt-6i)T@vqB!eRBIn_*5lAerKy_VM@KkMW8BgBI+3`mlIRbjRZ^Lb_6>_Y(B6hU$h=LaS#Q$_ZZ~c!-zCb~63eN=^&4>UaMK&cOna diff --git a/help/build/doctrees/index.doctree b/help/build/doctrees/index.doctree deleted file mode 100644 index ffb978b26dd8cc357a956495146852263d50c840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4876 zcmds5Uuz^;74J;ao$mbUWHM%1bVh2>naK{@$z)vEC7>b;f&`a%_W(J!DP2>ZM*ehVK&f9F)nzUQ8M?)mdO z=bqCaEPb?ar(yq0H;{g+MW}Wo88DTZHW5ZF(%FaE8$Zc@l_6RI`GHIw--{eC@M7&~E|eAN zK#e$LnuQZbOJ@Rwolu;KX!xenPqiboqqt1N!11&bGU&46%Sd}7f(+&)QflW!OJ669 zoj8F=n6Je-+s*j$vkYb~eV2{NDgRft{WP;7=1tx*t=L0Qb;eiIzGqfEtrG#q0Tcv+ zMG+_j9MKLvr9i~@X5@|XZ|xwBXN$h)pCxQyc{<}!c%WjBz|)QsrdV>$veYbVZ%8LH z-r?JPkuUH?(<)K+&btT4-%jKyLZFTbNm@Q1g~xH24n=fqv31N@7$4^cjztu(@ou7Y zW|l$`vFxy!_6eGbf+(XYmdQ|xC*iiKg$`L|%iRAy3xOg=__3EfQu7eLpMzo3e4)P^Qz9BcL8FAO&yfFRVXtJz6OzBy}1To<`3-66dS9F)u2r&CetXWD3JTp zY~)G2>jgnkNS2FSy2ATEP3PODX(I`g!J0jXErs~I2Sp%dRq1@xO%ELS05p-z=FA7@LmH%uL_tQ zTx?UQFn|E_Mqa&Vh~F&Y@3Y(l$3*$A&V?VPI8UEQX0iSv=)5Fti=r0 zMMHNC{)&KtpH;YOKfGhs@=sH%1#BXr= z*Y(p?CbNuldJ>~NE|LViwrmi{5#FVY|G}(c#l~?ce4zno+QbVvWTl95eUl>rK4JR@}VvPnQ-Njk>Nk z^#AF?OU~Xj1gBjbz8Zy6$(O|74&3_hx~kRdsxctuf4z$NY7Ax-zO3G5VK%M2&}C-f zv3=HmR!K%%7U$lFEu;z+bOXnr6WI=@8d-sQ}Xx1i8!`fzr_lI$$y?dttgFic{^f$fx=^M9EL} zp!ZHs34Fghzv;3hk%`LziV!UaQWCcLsQw!=)$>xCR!U~>)plwkPM=X4b#u8h9m>;p z=QnDH%_iBP;3y6kg|@3-54~uZdP4?}2YAMAq4hF%Fh0p7aM7pXImR{A%pI8)My>(O zghxc+VjLKVafaEW>!n({Gm^O_0IKyM9mVbxcyO#G2sFG&u zkS?YVaBboVm5RC5lNKeucF%S0=-~fSvDwQ|)DDn@*5K zI^m)Rf|s?Oomkv^@Z>GHrJD@=+BHO(U30g*MoWpwUNAkd*Kj=waYYB!1t}0v1Kl?F z0H~2W&8?~WZa%bKn%As0BEsZGjW%#gJ_-QjRs1k8T_W)|)dU0e*yUo#LwxKwCJEtd zYJ|DoeV!tH6;9r<>wM{k()Wti{+`b<qt$)gKq9&(atT5dB_Z+x8;e(c^<6 zq5(o(=KmH|1eNyZ`8F9k{{SgD!Cjo8gSs@^eki>&m!aDVU5qXmPieG$VHR0*PUu3T zr7`wXEx`z@(Ny(KJ1-8%MgWV7HvLlI=3SYcPj2IG07c_>6}St73r)~wYmS-^%OFGA zV7j0_j^=F8mx-8v-{I$6oxY8KW~5&d-nR=26ODr=e2u$Ci&zQnOx- ztChQsM$#gf5R_9W_e#FpfGQ>D!?cg+j`}j3LdCLvrbe7{cjhE^%3JNBtvUJjCm*WY w+jUvRPQ$cO8K!Jq%)v+~{PLhsbaH{y0x(Bjosw;^RsyO?Mfy_fn)Y}93rV~}rT_o{ diff --git a/help/build/html/.buildinfo b/help/build/html/.buildinfo deleted file mode 100644 index 2ca2ca1..0000000 --- a/help/build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 273d9e33c1ee851d38f9596cbb50d08b -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/help/build/html/_sources/index.rst.txt b/help/build/html/_sources/index.rst.txt deleted file mode 100644 index 55907b5..0000000 --- a/help/build/html/_sources/index.rst.txt +++ /dev/null @@ -1,20 +0,0 @@ -.. qlyrx documentation master file, created by - sphinx-quickstart on Sun Feb 12 17:11:03 2012. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to qlyrx's documentation! -============================================ - -Contents: - -.. toctree:: - :maxdepth: 2 - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/help/build/html/_static/ajax-loader.gif b/help/build/html/_static/ajax-loader.gif deleted file mode 100644 index 61faf8cab23993bd3e1560bff0668bd628642330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN diff --git a/help/build/html/_static/basic.css b/help/build/html/_static/basic.css deleted file mode 100644 index 19ced10..0000000 --- a/help/build/html/_static/basic.css +++ /dev/null @@ -1,665 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -div.code-block-caption { - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: relative; - left: 0px; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/help/build/html/_static/classic.css b/help/build/html/_static/classic.css deleted file mode 100644 index 6cfbfb9..0000000 --- a/help/build/html/_static/classic.css +++ /dev/null @@ -1,261 +0,0 @@ -/* - * classic.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- classic theme. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: sans-serif; - font-size: 100%; - background-color: #11303d; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - background-color: #1c4e63; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: #ffffff; - color: #000000; - padding: 0 20px 30px 20px; -} - -div.footer { - color: #ffffff; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #ffffff; - text-decoration: underline; -} - -div.related { - background-color: #133f52; - line-height: 30px; - color: #ffffff; -} - -div.related a { - color: #ffffff; -} - -div.sphinxsidebar { -} - -div.sphinxsidebar h3 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.4em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h3 a { - color: #ffffff; -} - -div.sphinxsidebar h4 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.3em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: #ffffff; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: #ffffff; -} - -div.sphinxsidebar a { - color: #98dbcc; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: #355f7c; - text-decoration: none; -} - -a:visited { - color: #355f7c; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - - - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Trebuchet MS', sans-serif; - background-color: #f2f2f2; - font-weight: normal; - color: #20435c; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - padding: 5px; - background-color: #eeffcc; - color: #333333; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; -} - -code { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -th { - background-color: #ede; -} - -.warning code { - background: #efc2c2; -} - -.note code { - background: #d6d6d6; -} - -.viewcode-back { - font-family: sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} - -div.code-block-caption { - color: #efefef; - background-color: #1c4e63; -} \ No newline at end of file diff --git a/help/build/html/_static/comment-bright.png b/help/build/html/_static/comment-bright.png deleted file mode 100644 index 15e27edb12ac25701ac0ac21b97b52bb4e45415e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ diff --git a/help/build/html/_static/default.css b/help/build/html/_static/default.css deleted file mode 100644 index 81b9363..0000000 --- a/help/build/html/_static/default.css +++ /dev/null @@ -1 +0,0 @@ -@import url("classic.css"); diff --git a/help/build/html/_static/doctools.js b/help/build/html/_static/doctools.js deleted file mode 100644 index d892892..0000000 --- a/help/build/html/_static/doctools.js +++ /dev/null @@ -1,313 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var bbox = span.getBBox(); - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - var parentOfText = node.parentNode.parentNode; - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keyup(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); \ No newline at end of file diff --git a/help/build/html/_static/documentation_options.js b/help/build/html/_static/documentation_options.js deleted file mode 100644 index fb47b84..0000000 --- a/help/build/html/_static/documentation_options.js +++ /dev/null @@ -1,9 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: '', - VERSION: '0.1', - LANGUAGE: 'None', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt' -}; \ No newline at end of file diff --git a/help/build/html/_static/down-pressed.png b/help/build/html/_static/down-pressed.png deleted file mode 100644 index 5756c8cad8854722893dc70b9eb4bb0400343a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl diff --git a/help/build/html/_static/down.png b/help/build/html/_static/down.png deleted file mode 100644 index 1b3bdad2ceffae91cee61b32f3295f9bbe646e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* diff --git a/help/build/html/_static/file.png b/help/build/html/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/help/build/html/_static/jquery-3.2.1.js b/help/build/html/_static/jquery-3.2.1.js deleted file mode 100644 index d2d8ca4..0000000 --- a/help/build/html/_static/jquery-3.2.1.js +++ /dev/null @@ -1,10253 +0,0 @@ -/*! - * jQuery JavaScript Library v3.2.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2017-03-20T18:59Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.2.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); - } else { - key = jQuery.camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: jQuery.isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( ">tbody", elem )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rmargin = ( /^margin/ ); - -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelMarginRight: function() { - computeStyleTests(); - return pixelMarginRightVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. -function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; - } - return ret; -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; - - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with computed style - var valueIsBorderBox, - styles = getStyles( elem ), - val = curCSS( elem, name, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Fall back to offsetWidth/Height when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - if ( val === "auto" ) { - val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; - } - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - - // Use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ); - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ name ] = value; - value = jQuery.css( elem, name ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 13 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = jQuery.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 13 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available, append data to url - if ( s.data ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - -
-
-
-
- - -

Index

- -
- -
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/help/build/html/index.html b/help/build/html/index.html deleted file mode 100644 index 21cdb47..0000000 --- a/help/build/html/index.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - Welcome to qlyrx’s documentation! — qlyrx 0.1 documentation - - - - - - - - - - - -
-
-
-
- -
-

Welcome to qlyrx’s documentation!¶

-

Contents:

-
-
-
-
-

Indices and tables¶

- -
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/help/build/html/objects.inv b/help/build/html/objects.inv deleted file mode 100644 index ace9aca1a346f62f2f8ee77ca38d7e0a75fd1b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmY#Z2rkIT%&Sny%qvUHE6FdaR47X=D$dN$Q!wIERtPA{&q_@$u~I0^sVu4h3WPx< ztrQIO41wH`j8ui9)ZE0(yp+@;h5R&yl8nq^g|y6^R0SZNoS$1zlv-SznxarzoSB!d zP?eLJq{mfp%iI6#=`-G*YXda&JU5>5^zk|yc)>KpqrK}@>XawXG%A{A#Bii){yeGR z>Y;TgxOmd%;$Ts)PoiAKTHRW5re}1*7__v{`kvMH)H!+PeDIS~XZ;T*1v@U)^I=Mw nl3(YQ>8Ew&+@mW;7Cqq!krgoPc$Cml - - - - - - Search — qlyrx 0.1 documentation - - - - - - - - - - - - - - - - - -
-
-
-
- -

Search

-
- -

- Please activate JavaScript to enable the search - functionality. -

-
-

- From here you can search these documents. Enter your search - words into the box below and click "search". Note that the search - function will automatically search for all of the words. Pages - containing fewer words won't appear in the result list. -

-
- - - -
- -
- -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/help/build/html/searchindex.js b/help/build/html/searchindex.js deleted file mode 100644 index 0343938..0000000 --- a/help/build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["index"],envversion:53,filenames:["index.rst"],objects:{},objnames:{},objtypes:{},terms:{content:0,index:0,modul:0,page:0,search:0},titles:["Welcome to qlyrx\u2019s documentation!"],titleterms:{document:0,indic:0,qlyrx:0,tabl:0,welcom:0}}) \ No newline at end of file diff --git a/help/make.bat b/help/make.bat deleted file mode 100644 index 3377610..0000000 --- a/help/make.bat +++ /dev/null @@ -1,155 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. changes to make an overview over all changed/added/deprecated items - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\template_class.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\template_class.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -:end diff --git a/help/source/conf.py b/help/source/conf.py deleted file mode 100644 index 830e0ce..0000000 --- a/help/source/conf.py +++ /dev/null @@ -1,216 +0,0 @@ -# -*- coding: utf-8 -*- -# -# qlyrx documentation build configuration file, created by -# sphinx-quickstart on Sun Feb 12 17:11:03 2012. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.todo', 'sphinx.ext.imgmath', 'sphinx.ext.viewcode'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'qlyrx' -copyright = u'2013, arc2qgis' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '0.1' -# The full version, including alpha/beta/rc tags. -release = '0.1' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_TemplateModuleNames = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'default' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'TemplateClassdoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -# The paper size ('letter' or 'a4'). -#latex_paper_size = 'letter' - -# The font size ('10pt', '11pt' or '12pt'). -#latex_font_size = '10pt' - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'qlyrx.tex', u'qlyrx Documentation', - u'arc2qgis', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Additional stuff for the LaTeX preamble. -#latex_preamble = '' - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'TemplateClass', u'qlyrx Documentation', - [u'arc2qgis'], 1) -] diff --git a/help/source/index.rst b/help/source/index.rst deleted file mode 100644 index 55907b5..0000000 --- a/help/source/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. qlyrx documentation master file, created by - sphinx-quickstart on Sun Feb 12 17:11:03 2012. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to qlyrx's documentation! -============================================ - -Contents: - -.. toctree:: - :maxdepth: 2 - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/i18n/af.ts b/i18n/af.ts deleted file mode 100644 index 615a88c..0000000 --- a/i18n/af.ts +++ /dev/null @@ -1,11 +0,0 @@ - - - - @default - - - Good morning - Goeie more - - - diff --git a/img/fill_symbol1.svg b/img/fill_symbol1.svg deleted file mode 100644 index 90bd3d1..0000000 --- a/img/fill_symbol1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/img/fill_symbol1.txt b/img/fill_symbol1.txt deleted file mode 100644 index c385632..0000000 --- a/img/fill_symbol1.txt +++ /dev/null @@ -1 +0,0 @@ -base64,Qk3eAgAAAAAAAD4AAAAoAAAATAAAADgAAAABAAEAAAAAAKACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wA//D/////3/93wAAD+f//7/P7/n//gAADn/+O//P//8//wAAD/3n//v//vfz4wAAA7//9//5f///7wAAD//9/3///////wAAD/n/z3+/7/ffPwAADn/fz/+//u///gAADj///Pv+/////wAAD//9v////5///wAAA/3///f/n/7u/wAAD/3n/3/3fv7v8QAADmf/z/+////9/wAAD+f5//+///c//wAAD////7/38Z8/8QAAA/3/97v+////HwAAD7/f//+////93wAAD9/+P///n+/f/wAADf3//8z++ff/8wAAD//ce//////8/wAADnv///+/f48z/wAAD////7///////QAAA/57v//J9////wAAD9/b/3v//5nz3wAAD9//x3/58fn//QAAA/5///9/n//f/gAADefn///Pn5/PPwAAD/3/97//93//8wAADb/+d/v/f/n9/wAADf/fv/+/+f/f/wAAD+f//8////f/3gAAD+Z7/Pv5nv//PwAADf5/9//P+f/z/QAAD9/ef7///+n//wAAAf////j/f+/vMwAAD/3/u8//7v///wAAD7v7/8/H/vj//gAAD/+/z/v////z3wAAD//7/3/////+/QAADbm+f/9+b37//wAAD//n/z//////7wAAA8f/v//+/u/x/wAAD/+7+/fP7/nf7gAAD6f////3/5///wAAD/5/v3t//////wAAD/x7////ef/d3wAADb///8////79/QAAD//f+Pz57+7//QAAA/5/v//H/v/x7wAAD/v7/////////wAADj/H+8/Hn/nf/wAAD///z/v//5/+8wAAD+Z+f7///p///wAAD//n//z3f/c97gAADmf+d3j/9///7wAAAf5//P/P8f/v8wAAA= \ No newline at end of file diff --git a/img/svg_template.svg b/img/svg_template.svg deleted file mode 100644 index 9082ac0..0000000 --- a/img/svg_template.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/pb_tool.cfg b/pb_tool.cfg index ac7fe2c..03e11af 100644 --- a/pb_tool.cfg +++ b/pb_tool.cfg @@ -64,17 +64,13 @@ extras: metadata.txt icon.png # Other directories to be deployed with the plugin. # These must be subdirectories under the plugin directory -extra_dirs: img +extra_dirs: # ISO code(s) for any locales (translations), separated by spaces. # Corresponding .ts files must exist in the i18n directory locales: -[help] -# the built help directory that should be deployed with the plugin -dir: help/build/html -# the name of the directory to target in the deployed plugin -target: help + diff --git a/scripts/compile-strings.sh b/scripts/compile-strings.sh deleted file mode 100644 index 9d76083..0000000 --- a/scripts/compile-strings.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -LRELEASE=$1 -LOCALES=$2 - - -for LOCALE in ${LOCALES} -do - echo "Processing: ${LOCALE}.ts" - # Note we don't use pylupdate with qt .pro file approach as it is flakey - # about what is made available. - $LRELEASE i18n/${LOCALE}.ts -done diff --git a/scripts/run-env-linux.sh b/scripts/run-env-linux.sh deleted file mode 100644 index 668247c..0000000 --- a/scripts/run-env-linux.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -QGIS_PREFIX_PATH=/usr/local/qgis-2.0 -if [ -n "$1" ]; then - QGIS_PREFIX_PATH=$1 -fi - -echo ${QGIS_PREFIX_PATH} - - -export QGIS_PREFIX_PATH=${QGIS_PREFIX_PATH} -export QGIS_PATH=${QGIS_PREFIX_PATH} -export LD_LIBRARY_PATH=${QGIS_PREFIX_PATH}/lib -export PYTHONPATH=${QGIS_PREFIX_PATH}/share/qgis/python:${QGIS_PREFIX_PATH}/share/qgis/python/plugins:${PYTHONPATH} - -echo "QGIS PATH: $QGIS_PREFIX_PATH" -export QGIS_DEBUG=0 -export QGIS_LOG_FILE=/tmp/inasafe/realtime/logs/qgis.log - -export PATH=${QGIS_PREFIX_PATH}/bin:$PATH - -echo "This script is intended to be sourced to set up your shell to" -echo "use a QGIS 2.0 built in $QGIS_PREFIX_PATH" -echo -echo "To use it do:" -echo "source $BASH_SOURCE /your/optional/install/path" -echo -echo "Then use the make file supplied here e.g. make guitest" diff --git a/scripts/update-strings.sh b/scripts/update-strings.sh deleted file mode 100644 index a31f712..0000000 --- a/scripts/update-strings.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash -LOCALES=$* - -# Get newest .py files so we don't update strings unnecessarily - -CHANGED_FILES=0 -PYTHON_FILES=`find . -regex ".*\(ui\|py\)$" -type f` -for PYTHON_FILE in $PYTHON_FILES -do - CHANGED=$(stat -c %Y $PYTHON_FILE) - if [ ${CHANGED} -gt ${CHANGED_FILES} ] - then - CHANGED_FILES=${CHANGED} - fi -done - -# Qt translation stuff -# for .ts file -UPDATE=false -for LOCALE in ${LOCALES} -do - TRANSLATION_FILE="i18n/$LOCALE.ts" - if [ ! -f ${TRANSLATION_FILE} ] - then - # Force translation string collection as we have a new language file - touch ${TRANSLATION_FILE} - UPDATE=true - break - fi - - MODIFICATION_TIME=$(stat -c %Y ${TRANSLATION_FILE}) - if [ ${CHANGED_FILES} -gt ${MODIFICATION_TIME} ] - then - # Force translation string collection as a .py file has been updated - UPDATE=true - break - fi -done - -if [ ${UPDATE} == true ] -# retrieve all python files -then - echo ${PYTHON_FILES} - # update .ts - echo "Please provide translations by editing the translation files below:" - for LOCALE in ${LOCALES} - do - echo "i18n/"${LOCALE}".ts" - # Note we don't use pylupdate with qt .pro file approach as it is flakey - # about what is made available. - pylupdate4 -noobsolete ${PYTHON_FILES} -ts i18n/${LOCALE}.ts - done -else - echo "No need to edit any translation files (.ts) because no python files" - echo "has been updated since the last update translation. " -fi diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index 8feeb0b..0000000 --- a/test/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# import qgis libs so that ve set the correct sip api version -import qgis # pylint: disable=W0611 # NOQA \ No newline at end of file diff --git a/test/qgis_interface.py b/test/qgis_interface.py deleted file mode 100644 index 3a65ed5..0000000 --- a/test/qgis_interface.py +++ /dev/null @@ -1,205 +0,0 @@ -# coding=utf-8 -"""QGIS plugin implementation. - -.. note:: This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - -.. note:: This source code was copied from the 'postgis viewer' application - with original authors: - Copyright (c) 2010 by Ivan Mincik, ivan.mincik@gista.sk - Copyright (c) 2011 German Carrillo, geotux_tuxman@linuxmail.org - Copyright (c) 2014 Tim Sutton, tim@linfiniti.com - -""" - -__author__ = 'tim@linfiniti.com' -__revision__ = '$Format:%H$' -__date__ = '10/01/2011' -__copyright__ = ( - 'Copyright (c) 2010 by Ivan Mincik, ivan.mincik@gista.sk and ' - 'Copyright (c) 2011 German Carrillo, geotux_tuxman@linuxmail.org' - 'Copyright (c) 2014 Tim Sutton, tim@linfiniti.com' -) - -import logging -from PyQt5.QtCore import QObject, pyqtSlot, pyqtSignal -from qgis.core import QgsMapLayerRegistry -from qgis.gui import QgsMapCanvasLayer -LOGGER = logging.getLogger('QGIS') - - -#noinspection PyMethodMayBeStatic,PyPep8Naming -class QgisInterface(QObject): - """Class to expose QGIS objects and functions to plugins. - - This class is here for enabling us to run unit tests only, - so most methods are simply stubs. - """ - currentLayerChanged = pyqtSignal(QgsMapCanvasLayer) - - def __init__(self, canvas): - """Constructor - :param canvas: - """ - QObject.__init__(self) - self.canvas = canvas - # Set up slots so we can mimic the behaviour of QGIS when layers - # are added. - LOGGER.debug('Initialising canvas...') - # noinspection PyArgumentList - QgsMapLayerRegistry.instance().layersAdded.connect(self.addLayers) - # noinspection PyArgumentList - QgsMapLayerRegistry.instance().layerWasAdded.connect(self.addLayer) - # noinspection PyArgumentList - QgsMapLayerRegistry.instance().removeAll.connect(self.removeAllLayers) - - # For processing module - self.destCrs = None - - @pyqtSlot('QStringList') - def addLayers(self, layers): - """Handle layers being added to the registry so they show up in canvas. - - :param layers: list list of map layers that were added - - .. note:: The QgsInterface api does not include this method, - it is added here as a helper to facilitate testing. - """ - #LOGGER.debug('addLayers called on qgis_interface') - #LOGGER.debug('Number of layers being added: %s' % len(layers)) - #LOGGER.debug('Layer Count Before: %s' % len(self.canvas.layers())) - current_layers = self.canvas.layers() - final_layers = [] - for layer in current_layers: - final_layers.append(QgsMapCanvasLayer(layer)) - for layer in layers: - final_layers.append(QgsMapCanvasLayer(layer)) - - self.canvas.setLayerSet(final_layers) - #LOGGER.debug('Layer Count After: %s' % len(self.canvas.layers())) - - @pyqtSlot('QgsMapLayer') - def addLayer(self, layer): - """Handle a layer being added to the registry so it shows up in canvas. - - :param layer: list list of map layers that were added - - .. note: The QgsInterface api does not include this method, it is added - here as a helper to facilitate testing. - - .. note: The addLayer method was deprecated in QGIS 1.8 so you should - not need this method much. - """ - pass - - @pyqtSlot() - def removeAllLayers(self): - """Remove layers from the canvas before they get deleted.""" - self.canvas.setLayerSet([]) - - def newProject(self): - """Create new project.""" - # noinspection PyArgumentList - QgsMapLayerRegistry.instance().removeAllMapLayers() - - # ---------------- API Mock for QgsInterface follows ------------------- - - def zoomFull(self): - """Zoom to the map full extent.""" - pass - - def zoomToPrevious(self): - """Zoom to previous view extent.""" - pass - - def zoomToNext(self): - """Zoom to next view extent.""" - pass - - def zoomToActiveLayer(self): - """Zoom to extent of active layer.""" - pass - - def addVectorLayer(self, path, base_name, provider_key): - """Add a vector layer. - - :param path: Path to layer. - :type path: str - - :param base_name: Base name for layer. - :type base_name: str - - :param provider_key: Provider key e.g. 'ogr' - :type provider_key: str - """ - pass - - def addRasterLayer(self, path, base_name): - """Add a raster layer given a raster layer file name - - :param path: Path to layer. - :type path: str - - :param base_name: Base name for layer. - :type base_name: str - """ - pass - - def activeLayer(self): - """Get pointer to the active layer (layer selected in the legend).""" - # noinspection PyArgumentList - layers = QgsMapLayerRegistry.instance().mapLayers() - for item in layers: - return layers[item] - - def addToolBarIcon(self, action): - """Add an icon to the plugins toolbar. - - :param action: Action to add to the toolbar. - :type action: QAction - """ - pass - - def removeToolBarIcon(self, action): - """Remove an action (icon) from the plugin toolbar. - - :param action: Action to add to the toolbar. - :type action: QAction - """ - pass - - def addToolBar(self, name): - """Add toolbar with specified name. - - :param name: Name for the toolbar. - :type name: str - """ - pass - - def mapCanvas(self): - """Return a pointer to the map canvas.""" - return self.canvas - - def mainWindow(self): - """Return a pointer to the main window. - - In case of QGIS it returns an instance of QgisApp. - """ - pass - - def addDockWidget(self, area, dock_widget): - """Add a dock widget to the main window. - - :param area: Where in the ui the dock should be placed. - :type area: - - :param dock_widget: A dock widget to add to the UI. - :type dock_widget: QDockWidget - """ - pass - - def legendInterface(self): - """Get the legend.""" - return self.canvas diff --git a/test/tenbytenraster.asc b/test/tenbytenraster.asc deleted file mode 100644 index 96a0ee1..0000000 --- a/test/tenbytenraster.asc +++ /dev/null @@ -1,19 +0,0 @@ -NCOLS 10 -NROWS 10 -XLLCENTER 1535380.000000 -YLLCENTER 5083260.000000 -DX 10 -DY 10 -NODATA_VALUE -9999 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -0 1 2 3 4 5 6 7 8 9 -CRS -NOTES diff --git a/test/tenbytenraster.asc.aux.xml b/test/tenbytenraster.asc.aux.xml deleted file mode 100644 index cfb1578..0000000 --- a/test/tenbytenraster.asc.aux.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - Point - - - - 9 - 4.5 - 0 - 2.872281323269 - - - diff --git a/test/tenbytenraster.keywords b/test/tenbytenraster.keywords deleted file mode 100644 index 8be3f61..0000000 --- a/test/tenbytenraster.keywords +++ /dev/null @@ -1 +0,0 @@ -title: Tenbytenraster diff --git a/test/tenbytenraster.lic b/test/tenbytenraster.lic deleted file mode 100644 index 8345533..0000000 --- a/test/tenbytenraster.lic +++ /dev/null @@ -1,18 +0,0 @@ - - - - Tim Sutton, Linfiniti Consulting CC - - - - tenbytenraster.asc - 2700044251 - Yes - Tim Sutton - Tim Sutton (QGIS Source Tree) - Tim Sutton - This data is publicly available from QGIS Source Tree. The original - file was created and contributed to QGIS by Tim Sutton. - - - diff --git a/test/tenbytenraster.prj b/test/tenbytenraster.prj deleted file mode 100644 index a30c00a..0000000 --- a/test/tenbytenraster.prj +++ /dev/null @@ -1 +0,0 @@ -GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/test/tenbytenraster.qml b/test/tenbytenraster.qml deleted file mode 100644 index 85247d4..0000000 --- a/test/tenbytenraster.qml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - 0 - diff --git a/test/test_init.py b/test/test_init.py deleted file mode 100644 index a11ca44..0000000 --- a/test/test_init.py +++ /dev/null @@ -1,64 +0,0 @@ -# coding=utf-8 -"""Tests QGIS plugin init.""" - -__author__ = 'Tim Sutton ' -__revision__ = '$Format:%H$' -__date__ = '17/10/2010' -__license__ = "GPL" -__copyright__ = 'Copyright 2012, Australia Indonesia Facility for ' -__copyright__ += 'Disaster Reduction' - -import os -import unittest -import logging -import configparser - -LOGGER = logging.getLogger('QGIS') - - -class TestInit(unittest.TestCase): - """Test that the plugin init is usable for QGIS. - - Based heavily on the validator class by Alessandro - Passoti available here: - - http://github.com/qgis/qgis-django/blob/master/qgis-app/ - plugins/validator.py - - """ - - def test_read_init(self): - """Test that the plugin __init__ will validate on plugins.qgis.org.""" - - # You should update this list according to the latest in - # https://github.com/qgis/qgis-django/blob/master/qgis-app/ - # plugins/validator.py - - required_metadata = [ - 'name', - 'description', - 'version', - 'qgisMinimumVersion', - 'email', - 'author'] - - file_path = os.path.abspath(os.path.join( - os.path.dirname(__file__), os.pardir, - 'metadata.txt')) - LOGGER.info(file_path) - metadata = [] - parser = configparser.ConfigParser() - parser.optionxform = str - parser.read(file_path) - message = 'Cannot find a section named "general" in %s' % file_path - assert parser.has_section('general'), message - metadata.extend(parser.items('general')) - - for expectation in required_metadata: - message = ('Cannot find metadata "%s" in metadata source (%s).' % ( - expectation, file_path)) - - self.assertIn(expectation, dict(metadata), message) - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_qgis_environment.py b/test/test_qgis_environment.py deleted file mode 100644 index 1becb30..0000000 --- a/test/test_qgis_environment.py +++ /dev/null @@ -1,60 +0,0 @@ -# coding=utf-8 -"""Tests for QGIS functionality. - - -.. note:: This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - -""" -__author__ = 'tim@linfiniti.com' -__date__ = '20/01/2011' -__copyright__ = ('Copyright 2012, Australia Indonesia Facility for ' - 'Disaster Reduction') - -import os -import unittest -from qgis.core import ( - QgsProviderRegistry, - QgsCoordinateReferenceSystem, - QgsRasterLayer) - -from .utilities import get_qgis_app -QGIS_APP = get_qgis_app() - - -class QGISTest(unittest.TestCase): - """Test the QGIS Environment""" - - def test_qgis_environment(self): - """QGIS environment has the expected providers""" - - r = QgsProviderRegistry.instance() - self.assertIn('gdal', r.providerList()) - self.assertIn('ogr', r.providerList()) - self.assertIn('postgres', r.providerList()) - - def test_projection(self): - """Test that QGIS properly parses a wkt string. - """ - crs = QgsCoordinateReferenceSystem() - wkt = ( - 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",' - 'SPHEROID["WGS_1984",6378137.0,298.257223563]],' - 'PRIMEM["Greenwich",0.0],UNIT["Degree",' - '0.0174532925199433]]') - crs.createFromWkt(wkt) - auth_id = crs.authid() - expected_auth_id = 'EPSG:4326' - self.assertEqual(auth_id, expected_auth_id) - - # now test for a loaded layer - path = os.path.join(os.path.dirname(__file__), 'tenbytenraster.asc') - title = 'TestRaster' - layer = QgsRasterLayer(path, title) - auth_id = layer.crs().authid() - self.assertEqual(auth_id, expected_auth_id) - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_qlyrx_dialog.py b/test/test_qlyrx_dialog.py deleted file mode 100644 index 5a93dd6..0000000 --- a/test/test_qlyrx_dialog.py +++ /dev/null @@ -1,55 +0,0 @@ -# coding=utf-8 -"""Dialog test. - -.. note:: This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - -""" - -__author__ = 'dror.bogin@gmail.com' -__date__ = '2019-04-09' -__copyright__ = 'Copyright 2019, arc2qgis' - -import unittest - -from PyQt5.QtGui import QDialogButtonBox, QDialog - -from qlyrx_dialog import qlyrxDialog - -from utilities import get_qgis_app -QGIS_APP = get_qgis_app() - - -class qlyrxDialogTest(unittest.TestCase): - """Test dialog works.""" - - def setUp(self): - """Runs before each test.""" - self.dialog = qlyrxDialog(None) - - def tearDown(self): - """Runs after each test.""" - self.dialog = None - - def test_dialog_ok(self): - """Test we can click OK.""" - - button = self.dialog.button_box.button(QDialogButtonBox.Ok) - button.click() - result = self.dialog.result() - self.assertEqual(result, QDialog.Accepted) - - def test_dialog_cancel(self): - """Test we can click cancel.""" - button = self.dialog.button_box.button(QDialogButtonBox.Cancel) - button.click() - result = self.dialog.result() - self.assertEqual(result, QDialog.Rejected) - -if __name__ == "__main__": - suite = unittest.makeSuite(qlyrxDialogTest) - runner = unittest.TextTestRunner(verbosity=2) - runner.run(suite) - diff --git a/test/test_resources.py b/test/test_resources.py deleted file mode 100644 index 9dc7690..0000000 --- a/test/test_resources.py +++ /dev/null @@ -1,44 +0,0 @@ -# coding=utf-8 -"""Resources test. - -.. note:: This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - -""" - -__author__ = 'dror.bogin@gmail.com' -__date__ = '2019-04-09' -__copyright__ = 'Copyright 2019, arc2qgis' - -import unittest - -from PyQt5.QtGui import QIcon - - - -class qlyrxDialogTest(unittest.TestCase): - """Test rerources work.""" - - def setUp(self): - """Runs before each test.""" - pass - - def tearDown(self): - """Runs after each test.""" - pass - - def test_icon_png(self): - """Test we can click OK.""" - path = ':/plugins/qlyrx/icon.png' - icon = QIcon(path) - self.assertFalse(icon.isNull()) - -if __name__ == "__main__": - suite = unittest.makeSuite(qlyrxResourcesTest) - runner = unittest.TextTestRunner(verbosity=2) - runner.run(suite) - - - diff --git a/test/test_translations.py b/test/test_translations.py deleted file mode 100644 index 8c28a1a..0000000 --- a/test/test_translations.py +++ /dev/null @@ -1,55 +0,0 @@ -# coding=utf-8 -"""Safe Translations Test. - -.. note:: This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - -""" -from .utilities import get_qgis_app - -__author__ = 'ismailsunni@yahoo.co.id' -__date__ = '12/10/2011' -__copyright__ = ('Copyright 2012, Australia Indonesia Facility for ' - 'Disaster Reduction') -import unittest -import os - -from PyQt5.QtCore import QCoreApplication, QTranslator - -QGIS_APP = get_qgis_app() - - -class SafeTranslationsTest(unittest.TestCase): - """Test translations work.""" - - def setUp(self): - """Runs before each test.""" - if 'LANG' in iter(os.environ.keys()): - os.environ.__delitem__('LANG') - - def tearDown(self): - """Runs after each test.""" - if 'LANG' in iter(os.environ.keys()): - os.environ.__delitem__('LANG') - - def test_qgis_translations(self): - """Test that translations work.""" - parent_path = os.path.join(__file__, os.path.pardir, os.path.pardir) - dir_path = os.path.abspath(parent_path) - file_path = os.path.join( - dir_path, 'i18n', 'af.qm') - translator = QTranslator() - translator.load(file_path) - QCoreApplication.installTranslator(translator) - - expected_message = 'Goeie more' - real_message = QCoreApplication.translate("@default", 'Good morning') - self.assertEqual(real_message, expected_message) - - -if __name__ == "__main__": - suite = unittest.makeSuite(SafeTranslationsTest) - runner = unittest.TextTestRunner(verbosity=2) - runner.run(suite) diff --git a/test/utilities.py b/test/utilities.py deleted file mode 100644 index 9c7f1f4..0000000 --- a/test/utilities.py +++ /dev/null @@ -1,61 +0,0 @@ -# coding=utf-8 -"""Common functionality used by regression tests.""" - -import sys -import logging - - -LOGGER = logging.getLogger('QGIS') -QGIS_APP = None # Static variable used to hold hand to running QGIS app -CANVAS = None -PARENT = None -IFACE = None - - -def get_qgis_app(): - """ Start one QGIS application to test against. - - :returns: Handle to QGIS app, canvas, iface and parent. If there are any - errors the tuple members will be returned as None. - :rtype: (QgsApplication, CANVAS, IFACE, PARENT) - - If QGIS is already running the handle to that app will be returned. - """ - - try: - from PyQt5 import QtGui, QtCore - from qgis.core import QgsApplication - from qgis.gui import QgsMapCanvas - from .qgis_interface import QgisInterface - except ImportError: - return None, None, None, None - - global QGIS_APP # pylint: disable=W0603 - - if QGIS_APP is None: - gui_flag = True # All test will run qgis in gui mode - #noinspection PyPep8Naming - QGIS_APP = QgsApplication(sys.argv, gui_flag) - # Make sure QGIS_PREFIX_PATH is set in your env if needed! - QGIS_APP.initQgis() - s = QGIS_APP.showSettings() - LOGGER.debug(s) - - global PARENT # pylint: disable=W0603 - if PARENT is None: - #noinspection PyPep8Naming - PARENT = QtGui.QWidget() - - global CANVAS # pylint: disable=W0603 - if CANVAS is None: - #noinspection PyPep8Naming - CANVAS = QgsMapCanvas(PARENT) - CANVAS.resize(QtCore.QSize(400, 400)) - - global IFACE # pylint: disable=W0603 - if IFACE is None: - # QgisInterface is a stub implementation of the QGIS plugin interface - #noinspection PyPep8Naming - IFACE = QgisInterface(CANVAS) - - return QGIS_APP, CANVAS, IFACE, PARENT diff --git a/zip_build/!README.txt b/zip_build/!README.txt new file mode 100644 index 0000000..ed775d9 --- /dev/null +++ b/zip_build/!README.txt @@ -0,0 +1,2 @@ +Any files placed in this directory will be lost during zip generation! +The qlyrx directory contains the files that make up your plugin and were used to create the zip file. diff --git a/zip_build/qlyrx.zip b/zip_build/qlyrx.zip new file mode 100644 index 0000000000000000000000000000000000000000..2512416d0b7735428606ee4f39d0b3ab768bcd57 GIT binary patch literal 57904 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

Aw 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 B^CtiR literal 0 HcmV?d00001 diff --git a/zip_build/qlyrx/__init__.py b/zip_build/qlyrx/__init__.py new file mode 100644 index 0000000..1387f43 --- /dev/null +++ b/zip_build/qlyrx/__init__.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + qlyrx + A QGIS plugin + Apply Arcgis Pro .lyrx style + Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ + ------------------- + begin : 2019-04-09 + copyright : (C) 2019 by arc2qgis + email : dror.bogin@gmail.com + git sha : $Format:%H$ + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + This script initializes the plugin, making it known to QGIS. +""" + + +# noinspection PyPep8Naming +def classFactory(iface): # pylint: disable=invalid-name + """Load qlyrx class from file qlyrx. + + :param iface: A QGIS interface instance. + :type iface: QgsInterface + """ + # + from .qlyrx import qlyrx + return qlyrx(iface) diff --git a/zip_build/qlyrx/icon.png b/zip_build/qlyrx/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..de230e28f3452fc16bbf8227ffe58b65c7509921 GIT binary patch literal 15050 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 Z{witl=aPTM_wP^fv|&#*>eUc&{|78?2O|Ig literal 0 HcmV?d00001 diff --git a/zip_build/qlyrx/metadata.txt b/zip_build/qlyrx/metadata.txt new file mode 100644 index 0000000..00e23cc --- /dev/null +++ b/zip_build/qlyrx/metadata.txt @@ -0,0 +1,39 @@ +# This file contains metadata for your plugin. Since +# version 2.0 of QGIS this is the proper way to supply +# information about a plugin. The old method of +# embedding metadata in __init__.py will +# is no longer supported since version 2.0. + +# This file should be included when you package your plugin.# Mandatory items: + +[general] +name=qlyrx +qgisMinimumVersion=3.0 +description=Apply Arcgis Pro .lyrx style +version=0.1 +author=arc2qgis +email=dror.bogin@gmail.com + +about=Apply Arcgis Pro .lyrx style to vector layers in QGIS + +tracker=https://github.com/arc2qgis/lyrxtoqml/issues +repository=https://github.com/arc2qgis/lyrxtoqml +# End of mandatory metadata + +# Recommended items: + +# Uncomment the following line and add your changelog: +# changelog= + +# Tags are comma separated with spaces allowed +tags=python + +homepage=https://github.com/arc2qgis/lyrxtoqml +category=Plugins +icon=icon.png +# experimental flag +experimental=True + +# deprecated flag (applies to the whole plugin, not just a single version) +deprecated=False + diff --git a/zip_build/qlyrx/qlyrx.py b/zip_build/qlyrx/qlyrx.py new file mode 100644 index 0000000..83e63b8 --- /dev/null +++ b/zip_build/qlyrx/qlyrx.py @@ -0,0 +1,1502 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + qlyrx + A QGIS plugin + Apply Arcgis Pro .lyrx style + Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ + ------------------- + begin : 2019-04-09 + git sha : $Format:%H$ + copyright : (C) 2019 by arc2qgis + email : dror.bogin@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +""" +from PyQt5.QtCore import QSettings, QTranslator, qVersion, QCoreApplication +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from qgis.core import * +from qgis.utils import * +import json +import re +import qgis.utils + +# Initialize Qt resources from file resources.py +from .resources import * +# Import the code for the dialog +from .qlyrx_dialog import qlyrxDialog +import os +import os.path +from collections import OrderedDict + +capStyles ={"Round" : 32, "Square" : 1, "Butt": 0} +joinStyles = {"Miter": 0, "Bevel" : 64, "Round": 128} +point2mm = 0.352778 +paths_to_shapes_array = { + "Cross2" : {"paths" : [ + [ + [ + -0.5, + 0.5 + ], + [ + 0.5, + -0.5 + ] + ], + [ + [ + -0.5, + -0.5 + ], + [ + 0.5, + 0.5 + ] + ] + ]}, + "Line" : {"paths" : [ + [ + [ + 3, + 0 + ], + [ + -3, + 0 + ] + ] + ] + } +} + +circle_rings = { + "curveRings" : [ + [ + [ + 1.2246467991473532e-16, + 2 + ], + { + "a" : [ + [ + 1.2246467991473532e-16, + 2 + ], + [ + 0, + 0 + ], + 0, + 1 + ] + } + ] + ] + } + + + +class qlyrx: + """QGIS Plugin Implementation.""" + + def __init__(self, iface): + """Constructor. + + :param iface: An interface instance that will be passed to this class + which provides the hook by which you can manipulate the QGIS + application at run time. + :type iface: QgsInterface + """ + # Save reference to the QGIS interface + self.iface = iface + self.mb = self.iface.messageBar() + # initialize plugin directory + self.plugin_dir = os.path.dirname(__file__) + # initialize locale + locale = QSettings().value('locale/userLocale')[0:2] + locale_path = os.path.join( + self.plugin_dir, + 'i18n', + 'qlyrx_{}.qm'.format(locale)) + + if os.path.exists(locale_path): + self.translator = QTranslator() + self.translator.load(locale_path) + + if qVersion() > '4.3.3': + QCoreApplication.installTranslator(self.translator) + + self.dlg = qlyrxDialog() + + # Declare instance attributes + self.actions = [] + self.menu = self.tr(u'&qlyrx') + + # Check if plugin was started the first time in current QGIS session + # Must be set in initGui() to survive plugin reloads + self.first_start = None + + + def tr(self, message): + """Get the translation for a string using Qt translation API. + + We implement this ourselves since we do not inherit QObject. + + :param message: String for translation. + :type message: str, QString + + :returns: Translated version of message. + :rtype: QString + """ + # noinspection PyTypeChecker,PyArgumentList,PyCallByClass + return QCoreApplication.translate('qlyrx', message) + + + def add_action( + self, + icon_path, + text, + callback, + enabled_flag=True, + add_to_menu=True, + add_to_toolbar=True, + status_tip=None, + whats_this=None, + parent=None): + """Add a toolbar icon to the toolbar. + + :param icon_path: Path to the icon for this action. Can be a resource + path (e.g. ':/plugins/foo/bar.png') or a normal file system path. + :type icon_path: str + + :param text: Text that should be shown in menu items for this action. + :type text: str + + :param callback: Function to be called when the action is triggered. + :type callback: function + + :param enabled_flag: A flag indicating if the action should be enabled + by default. Defaults to True. + :type enabled_flag: bool + + :param add_to_menu: Flag indicating whether the action should also + be added to the menu. Defaults to True. + :type add_to_menu: bool + + :param add_to_toolbar: Flag indicating whether the action should also + be added to the toolbar. Defaults to True. + :type add_to_toolbar: bool + + :param status_tip: Optional text to show in a popup when mouse pointer + hovers over the action. + :type status_tip: str + + :param parent: Parent widget for the new action. Defaults None. + :type parent: QWidget + + :param whats_this: Optional text to show in the status bar when the + mouse pointer hovers over the action. + + :returns: The action that was created. Note that the action is also + added to self.actions list. + :rtype: QAction + """ + + icon = QIcon(icon_path) + action = QAction(icon, text, parent) + action.triggered.connect(callback) + action.setEnabled(enabled_flag) + + if status_tip is not None: + action.setStatusTip(status_tip) + + if whats_this is not None: + action.setWhatsThis(whats_this) + + if add_to_toolbar: + # Adds plugin icon to Plugins toolbar + self.iface.addToolBarIcon(action) + + if add_to_menu: + self.iface.addPluginToMenu( + self.menu, + action) + + self.actions.append(action) + + return action + + def initGui(self): + """Create the menu entries and toolbar icons inside the QGIS GUI.""" + + icon_path = ':/plugins/qlyrx/icon.png' + self.add_action( + icon_path, + text=self.tr(u'Apply lyrx symbology'), + callback=self.run, + parent=self.iface.mainWindow()) + # will be set False in run() + self.first_start = True + + + + def load_vectors(self): + """ + Populate the layer selection with vector layers only + """ + self.dlg.layer_select.clear() + layers = [layer for layer in QgsProject.instance().mapLayers().values()] + vector_layers = [] + for layer in layers: + if layer.type() == QgsMapLayer.VectorLayer: + vector_layers.append(layer.name()) + self.dlg.layer_select.addItems(vector_layers) + + + def enableQmlSaving(self): + if self.dlg.saveQmlCheck.isChecked(): + self.dlg.QMLSaveLocation.setEnabled(True) + self.dlg.qmlLabel.setEnabled(True) + else: + self.dlg.QMLSaveLocation.setDisabled(True) + self.dlg.qmlLabel.setDisabled(True) + + + def saveQML(self,layer): + try: + if(len(self.dlg.QMLSaveLocation.filePath())) > 0: + QmlPath = self.dlg.QMLSaveLocation.filePath() + layer.saveNamedStyle(QmlPath) + else: + self.mb.pushWarning('QML Not Saved','missing Path') + except Exception as e: + self.mb.pushCritical('Error',"Something went wrong with saving the QML, please send us the following error: {}".format(e)) + + + def read_lyrx(self, file=None): + with open(file, mode="r", encoding="utf-8") as json_file: + data = json.load(json_file) + return data + + + def getSymbolLayers(self, obj): + return obj['symbol']['symbol']['symbolLayers'] + + + def getSymbolHalo(self, obj): + halo = '' + if 'haloSymbol' in obj['symbol']['symbol']: + halo = obj['symbol']['symbol']['haloSymbol'] + return halo + + + def readValueDef(self, obj): + return obj['symbol']['symbol']['symbolLayers'] + + + def checkSymbolType(self, obj): + obj_arr = {} + sl_idx = 0 + count_disabled = 0 + for o in obj: + if not 'desc' in obj_arr : + obj_arr['desc'] = [] + type = o['type'] + if not type in obj_arr : + obj_arr[type] = 0 + obj_arr[type] = obj_arr[type] + 1 + o['sl_idx'] = sl_idx + obj_arr['desc'].append(o) + if 'enable' in o and not o['enable']: + count_disabled = count_disabled + 1 + #print('disabled layer') + sl_idx = sl_idx + 1 + #print(sl_idx) + obj_arr['layer_count'] = sl_idx - count_disabled + if 'CIMHatchFill' in obj_arr: + obj_arr['template'] = 'hatch' + obj_arr['template_hatch_num'] = obj_arr['CIMHatchFill'] + else: + obj_arr['template'] = 'simple' + + if 'CIMLineSymbol' in obj_arr: + obj_arr['template_line_num'] = obj_arr['CIMLineSymbol'] + if 'CIMSolidFill' in obj_arr: + obj_arr['template_solid_num'] = obj_arr['CIMSolidFill'] + if 'CIMSolidStroke' in obj_arr: + obj_arr['template_stroke_num'] = obj_arr['CIMSolidStroke'] + if 'CIMCharacterMarker' in obj_arr: + obj_arr['template_font_num'] = obj_arr['CIMCharacterMarker'] + + return obj_arr + + + def tweakHaloSymbol(self, layers, haloDef, layer): + if not haloDef == '': + #halo_symbol_def = checkSymbolType(haloDef[0]) + new_layer = layers[len(layers) - 1].clone() + new_layer.setSize(new_layer.size()*1.1) + symbolHalo = haloDef['symbolLayers'] + halo_symbol_def = self.checkSymbolType(symbolHalo) + hallo_arr = self.parseSolidFill(halo_symbol_def, layer) + newFillSymbol = hallo_arr[0] + newStroke = self.parseStroke(halo_symbol_def, newFillSymbol, layer) + #for h in symbolHalo: + #print("halo symbol layer is " + h['type']) + if newFillSymbol != '': + new_layer.setStrokeColor(newFillSymbol.color()) + new_layer.setStrokeWidth(0.5) + if not newStroke == '': + #new_layer.setColor(newFillSymbol.color()) + new_layer.setStrokeColor(newStroke[0].color()) + layers.append(new_layer) + return layers + + + def parseSymbolLayerSolidFill(self, layers): + colors = [] + for l in layers: + if l['type'] == 'CIMSolidFill': + temp_color = l['color']['values'] + new_color = self.colorToRgbArray(temp_color, l['color']['type']) + colors.append(new_color) + return colors + + def generalise_geom_type(self, layer): + geometry_type_str = QgsWkbTypes.displayString(int(layer.wkbType())) + geometry_type = layer.wkbType() + geometry_general_type_str = geometry_type_str.replace('Multi', '').lower() + geometry_general_type_str = geometry_general_type_str.replace('string', '') + return geometry_general_type_str + + def parseRasterData(self, obj, layer): + #print(obj['colorizer']) + colorizer = obj['colorizer'] + renderer = '' + if 'Classify' in colorizer['type']: + print('classify') + self.parseRasterClassBreaks(colorizer, layer) + print("after parse rend") + elif 'Unique' in colorizer['type']: + print('unique') + self.parseRasterGroups(colorizer, layer) + print("after parse") + + #return renderer + #return '' + + def parseRasterGroups(self, obj, layer): + groups = obj['groups'] + renderer = '' + col_array = [] + val_array = [] + rampArray = [] + stats = self.getRasterLayerStats(layer) + print(stats) + min= stats.minimumValue + max = stats.maximumValue + initMin = False + classes = groups[0]['classes'] + + for gr in classes: + color = self.colorToRgbArray(gr['color']['values'], gr['color']['type']) + label = gr['label'] + col_array.append(color) + vals = gr['values'] if 'values' in gr else [] + val_arr = [] + for gr_val in vals: + val_arr.append(float(gr_val)) + rampArray.append(QgsColorRampShader.ColorRampItem(float(gr_val), color,label )) + + try: + fcn = QgsColorRampShader() + fcn.setColorRampType(QgsColorRampShader.Exact) + fcn.setColorRampItemList(rampArray) + cRamp = QgsPresetSchemeColorRamp(col_array) + fcn.setSourceColorRamp(cRamp) + + shader = QgsRasterShader() + shader.setRasterShaderFunction(fcn) + + renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), layer.type(), shader) + layer.setRenderer(renderer) + layer.renderer().setClassificationMin(min) + layer.renderer().setClassificationMax(max) + layer.renderer().shader().rasterShaderFunction().setColorRampItemList(rampArray) + layer.triggerRepaint() + print("after raster repaint") + + except Exception as e: + print(e) + + + def parseRasterClassBreaks(self, obj, layer): + classBreaks = obj['classBreaks'] + #print(classBreaks) + col_array = [] + val_array = [] + rampArray = [] + stats = self.getRasterLayerStats(layer) + min= stats.minimumValue + max = stats.maximumValue + initMin = False + for cb in classBreaks: + color = self.colorToRgbArray(cb['color']['values'], cb['color']['type']) + col_array.append(color) + val = cb['upperBound'] if 'upperBound' in cb else 0 + val_array.append(val) + label = cb['label'] + #print(str(val)) + if not initMin: + rampArray.append(QgsColorRampShader.ColorRampItem(val, color, label)) + initMin = True + if len(val_array) > 1: + rampArray.append(QgsColorRampShader.ColorRampItem(val, color, label)) + + try: + + fcn = QgsColorRampShader() + fcn.setColorRampType(QgsColorRampShader.Discrete) + fcn.setColorRampItemList(rampArray) + cRamp = QgsPresetSchemeColorRamp(col_array) + fcn.setSourceColorRamp(cRamp) + + shader = QgsRasterShader() + shader.setRasterShaderFunction(fcn) + + renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), layer.type(), shader) + layer.setRenderer(renderer) + layer.renderer().setClassificationMin(min) + layer.renderer().setClassificationMax(max) + layer.renderer().shader().rasterShaderFunction().setColorRampItemList(rampArray) + layer.triggerRepaint() + print("after raster repaint") + + except Exception as e: + print(e) + + #return '' + + def getRasterLayerStats(self, layer): + rend = layer.renderer() + provider = layer.dataProvider() + ver = provider.hasStatistics(1, QgsRasterBandStats.All) + stats = provider.bandStatistics(1, QgsRasterBandStats.All,layer.extent(), 0) + if ver is not False: + print("minimumValue = ", stats.minimumValue) + print("maximumValue = ", stats.maximumValue) + return(stats) + + def parseSolidFill(self, obj, layer): + symbol = "" + i = 0 + solid_index = -1 + for ls in obj['desc']: + if ls['type'] == 'CIMSolidFill' and ls['enable']: + temp_color = ls['color']['values'] + new_color = self.colorToRgbArray(temp_color, ls['color']['type']) + symbol = QgsSymbol.defaultSymbol(layer.geometryType()) + symbol.setColor(new_color) + ### TODO add lock + #print("solid index " + str(ls['sl_idx'])) + #symbol.setStrokeColor(new_color) + solid_index = ls['sl_idx'] if 'sl_idx' in ls else 0 + i = i + 1 + if i > 1: + print("Extra " + str(i) + " solid fills") + # Add default shape fill. + if symbol == '' or self.generalise_geom_type(layer) == 'line': + symbol = QgsSymbol.defaultSymbol(layer.geometryType()) + new_color = self.colorToRgbArray([255,255,255,0], 'CIMRGBColor') + symbol.setColor(new_color) + + #symbol['order'] = 0 + return [symbol, solid_index] + + + def parseLineCap(self, obj): + lineCap = 1 + #print(obj['capStyle']) + if 'capStyle' in obj: + lineCap = capStyles[obj['capStyle']] + return lineCap + + + def parseLineJoin(self, obj): + lineJoin = 1 + + if 'joinStyle' in obj: + #print(obj['joinStyle']) + lineJoin = joinStyles[obj['joinStyle']] + #print(lineJoin) + return lineJoin + + + def parseStroke(self, obj, symb, layer): + layers = [] + i = 0 + layers_obj = {} + firstWidth = 0 + firstColor = '' + geometry_general_type_str = self.generalise_geom_type(layer) + for ls in obj['desc']: + firstDash = False + if ls['type'] == 'CIMSolidStroke' and ls['enable']: + ## Check dash effects + dp = self.parseStrokeEffects(ls) + new_color = self.colorToRgbArray(ls['color']['values'], ls['color']['type']) + stroke_width = ls['width']*point2mm + cap = self.parseLineCap(ls) + join = self.parseLineJoin(ls) + stroke_order = ls['sl_idx'] if 'sl_idx' in ls else 0 + if i == 0 and dp == '' and not geometry_general_type_str == 'line': + #Change the first symbol layer stroke by layer type + symb.symbolLayer(0).setStrokeColor(new_color) + symb.symbolLayer(0).setStrokeWidth(stroke_width) + + cleanStrokeSymbol = symbol_layer = QgsSimpleLineSymbolLayer() + cleanStrokeSymbol.setColor(new_color) + cleanStrokeSymbol.setWidth(stroke_width) + firstWidth = stroke_width + firstColor = cleanStrokeSymbol.color() + cleanStrokeSymbol.setPenCapStyle(cap) + cleanStrokeSymbol.setPenJoinStyle(join) + ## Fix stroke offset + if not geometry_general_type_str == 'line': + cleanStrokeSymbol.setOffset(stroke_width/2) + + layers_obj[stroke_order] = cleanStrokeSymbol + else : + if (i == 0): + firstDash = True + # Add simple line symbol layer (stroke) + symbol_layer = QgsSimpleLineSymbolLayer() + symbol_layer.setColor(new_color) + symbol_layer.setWidth(stroke_width) + if firstWidth < stroke_width: + if symbol_layer.color() == firstColor: + if 0 in layers_obj: + layers_obj[0].setWidth(stroke_width) + if not geometry_general_type_str == 'line': + layers_obj[0].setOffset(stroke_width/2) + + symbol_layer.setPenCapStyle(cap) + symbol_layer.setPenJoinStyle(join) + ## Fix stroke offset + if not geometry_general_type_str == 'line': + symbol_layer.setOffset(stroke_width/2) + # Add dash pattern + if not dp == '': + #print("dp in " + str(i) + " stroke symbol") + symbol_layer.setUseCustomDashPattern(True) + symbol_layer.setCustomDashVector(dp) + symbol_layer = self.changeColorLock(symbol_layer, ls) + #print("stroke symbol idx is " + str(ls['sl_idx'])) + symb.appendSymbolLayer(symbol_layer) + layers_obj[stroke_order] = symbol_layer + i = i + 1 + return [symb, layers_obj, firstDash] + + + def parseStrokeEffects(self, obj): + dash_pattern = '' + temp_array = [] + if 'effects' in obj: + if obj['effects'][0]['type'] == 'CIMGeometricEffectDashes' : + temp_pattern = obj['effects'][0]['dashTemplate'] + for tp in temp_pattern: + temp_array.append(tp*point2mm) + dash_pattern = temp_array + return dash_pattern + + + def parseLineFill(self, obj, layer): + isDoubleHatch = False + isOffsetEqFirstWidth = True + symbol = "" + layers = [] + layers_obj = {} + i = 0 + first_width = 0 + prev_hatch = 0 + geometry_general_type_str = self.generalise_geom_type(layer) + for ls in obj['desc']: + if ls['type'] == 'CIMHatchFill' and ls['enable']: + #print(ls['sl_idx']) + sd_num = 0 + full_symbol_layer = '' + for sd in reversed(ls['lineSymbol']['symbolLayers']): + #print(sd) + symb_def = sd + #print("Line symbol sl num is " + str(sd_num) + "From " + str(len(ls['lineSymbol']['symbolLayers']))) + ## New definitions + angle = ls['rotation'] if 'rotation' in ls else 0 + temp_color = symb_def['color']['values'] + new_color = self.colorToRgbArray(temp_color, symb_def['color']['type']) + ## Hatch definitions + fill_width = symb_def['width'] if 'width' in symb_def else 1 + fill_width = fill_width*point2mm + fill_distance = ls['separation'] if 'separation' in ls else 0 + fill_distance = fill_distance*point2mm + if fill_distance <= 0.6 and not fill_distance == 0: + # TODO: add user interaction + print("QGIS problem with line fill small distances") + widthRatio = fill_width/point2mm/fill_distance + if widthRatio < 1: + widthRatio = 1/widthRatio + #print(widthRatio) + fill_distance = max(fill_distance*2,0.8) + fill_width = fill_width/point2mm*widthRatio + if fill_width > fill_distance: + # TODO: add user interaction + print("Fill width error") + + fill_offset = ls['offsetX'] if 'offsetX' in ls else 0 + #fill_offset = fill_offset*point2mm + ## Create symbol and set properties + symbol_layer = QgsLinePatternFillSymbolLayer() #if symbol_layer == '' else QgsSimpleLineSymbolLayer() + if sd_num == 0: + full_symbol_layer = symbol_layer + else: + symbol_layer = QgsSimpleLineSymbolLayer() + + dp = self.parseStrokeEffects(symb_def) + + symbol_layer.setColor(new_color) + if sd_num >= 0: + #print("before def") + if sd_num == 0: + symbol_layer.setLineAngle(angle) + symbol_layer.setLineWidth(fill_width) + symbol_layer.setDistance(fill_distance) + symbol_layer = self.changeColorLock(symbol_layer, ls) + else: + #symbol_layer.setAngle(angle) + try: + # TODO: add user interaction + print("Try width") + symbol_layer.setWidth(fill_width) + except: + # TODO: add user interaction + print("set width error") + + + if not dp == '': + #print("Dash pattern Fill is ") + #print(dp) + symbol_layer.subSymbol().symbolLayer(0).setUseCustomDashPattern(True) + symbol_layer.subSymbol().symbolLayer(0).setCustomDashVector(dp) + #print(symbol_layer.subSymbol().symbolLayer(0).__class__.__name__) + ## Tweak save the first hatch width and use as offset + # TODO: Real fix, mark problematic files and unusual offsets + if prev_hatch > 0 and sd_num == 0: + symbol_layer.setLineWidth(fill_width) + symbol_layer.setOffset(fill_width) + #isOffsetEqFirstWidth = fill_width == prev_hatch + isDoubleHatch = True + elif not fill_offset == 0 and not dp == '' : + symbol_layer.setOffset(fill_offset) + + if not sd_num == 0: + try: + full_symbol_layer.subSymbol().appendSymbolLayer(symbol_layer) + + except: + # TODO: add user interaction + print("Failed append subsymbol") + print(full_symbol_layer.__class__.__name__) + print(full_symbol_layer.subSymbol().__class__.__name__) + + sd_num = sd_num + 1 + + #print(full_symbol_layer.__class__.__name__) + layers.append(full_symbol_layer) + if 'sl_idx' in ls: + layers_obj[ls['sl_idx']] = full_symbol_layer + + if i == 0: + prev_hatch = fill_width + i = i + 1 + + + if len(layers) > 0: + return [layers, layers_obj] + else: + return symbol + + + def cmyk2Rgb(self, cmyk_array): + c = cmyk_array[0] + m = cmyk_array[1] + y = cmyk_array[2] + k = cmyk_array[3] + + r = int((1 - ((c + k)/100)) * 255) + g = int((1 - ((m + k)/100)) * 255) + b = int((1 - ((y + k)/100)) * 255) + + return [r, g, b] + + + def changeColorLock(self, sl, symbol_def): + color_lock = symbol_def['colorLocked'] if 'colorLocked' in symbol_def else '' + if not color_lock == '': + #print("locked") + sl.setLocked(True) + return sl + + + def colorToRgbArray(self, color_array, type): + opacity = 255 + if len(color_array) > 2 and type == 'CIMRGBColor': + opacity = color_array[3]/100*255 + new_color = QColor.fromRgb(color_array[0],color_array[1], color_array[2], opacity) + #print(opacity) + else: + new_color = QColor.fromRgb(color_array[0],color_array[1], color_array[2]) + if type == 'CIMHSVColor': + new_color = QColor.fromHsvF(color_array[0]/360,color_array[1]/100, color_array[2]/100,1) + elif type == 'CIMCMYKColor': + temp_color = self.cmyk2Rgb(color_array) + new_color = QColor.fromRgb(temp_color[0],temp_color[1], temp_color[2]) + return new_color + + + def parseSimpleRenderer(self, obj, layer): + + symbol = '' + symb_def = obj['symbol']['symbol']['symbolLayers'][0] + + if 'characterIndex' in symb_def and symb_def['type'] == 'CIMCharacterMarker': + symbol_ret = self.parseCharacterFill(symb_def, 0, layer) + symbol = symbol_ret[0] + + if symb_def['type'] == 'CIMVectorMarker': + vector_layers = self.parseVectorSymbolLine(symb_def, True, layer) + #print(vector_layers) + if not vector_layers == '': + vl_idx = vector_layers + for vl in vector_layers: + v_symb = vl[0] + v_ord = vl[1] + #allSymbolLayers[v_ord] = v_symb + symbol = v_symb + #print("After simple vector") + print(layer.geometryType()) + if layer.geometryType() == 2: + #print(obj['symbol']['symbol']['symbolLayers']) + #print(symb_def) + solid_array = self.parseSolidFill({"desc": [symb_def]}, layer) + #print(solid_array) + symbol = solid_array[0] + for sl in obj['symbol']['symbol']['symbolLayers']: + lines_ret = self.parseLineFill({'desc': [sl]} , layer) + #print(lines_ret) + if not lines_ret == '': + line_ret = lines_ret[0] + print("hatch number is " + str(len(line_ret))) + for line in line_ret: + try: + print("append layer") + solid_array[0].appendSymbolLayer(line) + except: + print(line.__class__.__name__) + + stroke = self.parseStroke({"desc": [symb_def], "sl_idx": 0}, solid_array[0], layer) + + if(stroke): + symbol = stroke[0] + if len(stroke[1]): + symbol.appendSymbolLayer(stroke[1][0]) + + return symbol + + + def parseCharacterFill(self, symb_def, max_size, layer): + #print(symb_def['sl_idx']) + ret_val = '' + symbol = QgsFontMarkerSymbolLayer() + symbol.setFontFamily(symb_def['fontFamilyName']) + symbol.setCharacter(chr(symb_def['characterIndex'])) + new_size = symb_def['size']*point2mm + symbol.setSize(symb_def['size']*point2mm) + geometry_general_type_str = self.generalise_geom_type(layer) + + if 'rotation' in symb_def: + new_angle = symb_def['rotation'] + negative_angle = new_angle < 0 + if (new_angle < 0 and new_angle <= -90) or new_angle == -45: + new_angle = abs(new_angle) + elif new_angle < 0 and new_angle > -90: + new_angle = new_angle + + if abs(new_angle) > 180: + new_angle = 360 - new_angle + if negative_angle: + new_angle = new_angle*-1 + #print("180 correction to " + str(new_angle)) + symbol.setAngle(new_angle) + + # Fix offset - rotation twaek + #symbol.setOffset(QPointF(0.3,0.0)) + #offset_tweak = (max_size - new_size)/2 if max_size > new_size else 0 + #print(offset_tweak) + #if offset_tweak > 0: + # symbol.setOffset(QPointF(0,0)) + #print(symb_def['characterIndex']) + # Check fill color + if 'symbol' in symb_def : + if 'symbolLayers' in symb_def['symbol']: + color = self.parseSymbolLayerSolidFill(symb_def['symbol']['symbolLayers']) + #print(color) + symbol.setColor(color[0]) + ## Check offset + offset_def = symb_def['anchorPoint'] if 'anchorPoint' in symb_def else '' + if 'x' in offset_def: + offsetX = offset_def['x']*point2mm + offsetY = offset_def['y']*point2mm + symbol.setOffset(QPointF(offsetX,offsetY)) + + ### TODO Fix offset after rotation + #print(symbol.markerOffsetWithWidthAndHeight(symbol, 8, 8)) + + if not geometry_general_type_str == 'point': + symbol_base = QgsPointPatternFillSymbolLayer() + if geometry_general_type_str == 'line': + symbol_base = QgsMarkerLineSymbolLayer() + ## Change to line symbol when diplacement is along line + if 'markerPlacement' in symb_def and 'type' in symb_def['markerPlacement']: + if symb_def['markerPlacement']['type'] == 'CIMMarkerPlacementAlongLineSameSize': + symbol_base = QgsMarkerLineSymbolLayer() + #print("Special fill " + geometry_general_type_str) + ## Fill pattern + if 'markerPlacement' in symb_def and 'stepX' in symb_def['markerPlacement']: + symbol_base.setDistanceX(symb_def['markerPlacement']['stepX']*point2mm) + symbol_base.setDistanceY(symb_def['markerPlacement']['stepY']*point2mm) + + marker = QgsMarkerSymbol() + marker.changeSymbolLayer(0, symbol) + symbol_base.setSubSymbol(marker) + ret_val = symbol_base + else: + ret_val = symbol + ret_val = self.changeColorLock(ret_val, symb_def) + + #join = parseLineJoin(symb_def) + #ret_val.setPenJoinStyle(join) + sym_ord = symb_def['sl_idx'] if 'sl_idx' in symb_def else -2 + return [ret_val, sym_ord] + + + def parseVectorSymbolLine(self, obj, simple, layer): + #print(obj) + vector_idx = 0 + vector_symbols = [] + vector_sl_array = [] + symb_idx = -1 + base_symbol = '' + order = '' + geometry_general_type_str = self.generalise_geom_type(layer) + if not 'desc' in obj: + obj['desc'] = [obj] + for ls in obj['desc']: + if ls['type'] == 'CIMVectorMarker' and ls['enable']: + + order = ls['sl_idx'] if 'sl_idx' in ls else -3 + if 'markerGraphics' in ls: + mg = ls['markerGraphics'] + #print("order is "+ str(ls['sl_idx'])) + #print(mg) + #print("mg len is " + str(len(mg))) + #if 'geometry' in mg[0]: + # print(mg) + placement = 1 + markerDistanceX = '' + markerDistanceY = '' + if 'markerPlacement' in ls and 'placementTemplate' in ls['markerPlacement']: + placement = ls['markerPlacement']['placementTemplate'][0] + #print("placement " + str(placement)) + placement = placement*point2mm + if 'markerPlacement' in ls and 'stepX' in ls['markerPlacement']: + markerDistanceX = ls['markerPlacement']['stepX']*point2mm + markerDistanceY = ls['markerPlacement']['stepY']*point2mm + + symbol_size = ls['size']*point2mm + + for mgs in mg: + #print(mgs) + if 'geometry' in mgs and 'x' in mgs['geometry']: + #print("geom is xy") + mgs_sl = mgs['symbol']['symbolLayers'] + vector_symbols = [] + #print(mgs_sl) + for sl in mgs_sl: + if sl['type'] == 'CIMCharacterMarker': + parsed_symb = self.parseCharacterFill(sl, 0, layer) + if not parsed_symb[0] == '': + symb_type = parsed_symb[0].__class__.__name__ + if 'MarkerLine' in symb_type: + parsed_symb[0].setInterval(placement) + else: + if not markerDistanceX == '': + parsed_symb[0].setDistanceX(markerDistanceX) + parsed_symb[0].setDistanceY(markerDistanceY) + vector_symbols.append(parsed_symb[0]) + if len(vector_symbols) > 1: + base_symbol = vector_symbols[0].clone() + vs_idx = 0 + for vs in vector_symbols: + if vs_idx > 0: + subSymbLayer = vs.subSymbol().symbolLayer(0).clone() + origFirstSubSymbLayer = base_symbol.subSymbol().symbolLayer(0).clone() + #print(subSymbLayer) + #print("append more") + base_symbol.subSymbol().appendSymbolLayer(origFirstSubSymbLayer) + base_symbol.subSymbol().changeSymbolLayer(0, subSymbLayer) + #print("Count sub: " + str(base_symbol.subSymbol().symbolLayerCount())) + vs_idx = vs_idx + 1 + vector_sl_array.append([base_symbol, order]) + else: + #print("append first") + vector_sl_array.append([vector_symbols[0], order]) + + else: + #print("geom is ") + #print(mgs['geometry']) + geom = mgs['geometry'] + ## Finding matching pattern + if 'paths' in geom: + for path_obj in paths_to_shapes_array: + #print(path_obj) + path_pattern = [] + for path_p in geom['paths']: + pair = [] + for path_pair in path_p: + #print(path_pair) + new_str = ",".join(map(str, path_pair)) + new_str = re.sub('[1-9]', '3', new_str) + new_str = new_str.split(',') + try: + new_str = [int(i) for i in new_str] + except: + new_str = [float(i) for i in new_str] + #print("no change") + #print(new_str) + pair.append(new_str) + + path_pattern.append(pair) + + alt_path_object = {"paths": path_pattern} + #print(alt_path_object) + if paths_to_shapes_array[path_obj] == geom or paths_to_shapes_array[path_obj] == alt_path_object: + #print("Found geom!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + #print(QgsSimpleMarkerSymbolLayerBase.decodeShape(path_obj)) + shape_id, isShape = QgsSimpleMarkerSymbolLayerBase.decodeShape(path_obj) + main_sym = QgsMarkerLineSymbolLayer.create() + vect_symb = QgsSimpleMarkerSymbolLayer.create() + vect_symb.setShape(shape_id) + vect_symb.setSize(symbol_size) + #print(vect_symb) + main_sym.subSymbol().changeSymbolLayer(0, vect_symb) + main_sym.setInterval(placement) + vector_sl_array.append([main_sym, order]) + elif 'curveRings' in geom: + vect_symb = QgsSimpleMarkerSymbolLayer.create() + vect_symb.setSize(symbol_size) + #print(vect_symb) + if not geometry_general_type_str == 'point': + main_sym = QgsMarkerLineSymbolLayer.create() + main_sym.subSymbol().changeSymbolLayer(0, vect_symb) + main_sym.setInterval(placement) + vector_sl_array.append([main_sym, order]) + else: + vector_sl_array.append([vect_symb, order]) + #print(base_symbol) + #if not base_symbol == '': + # print(base_symbol.subSymbol().symbolLayerCount()) + if len(vector_sl_array) == 0: + vector_sl_array = '' + else: + #print(vector_sl_array) + print("vector array length " + str(len(vector_sl_array))) + return vector_sl_array + + + def parsePictureFill(self, obj, appendix): + pic_idx = 0 + svg_symbol = '' + symb_idx = -1 + for ls in obj['desc']: + if ls['type'] == 'CIMPictureFill' and ls['enable']: + #print("Picture url is " + ls["url"]) + url_data = ls['url'] + url_data_array = url_data.split(",") + plugin_path = os.path.dirname(os.path.realpath(__file__)) + svg_path = plugin_path+"\\img" + svg_paths = QgsSettings().value('svg/searchPathsForSVG') + if plugin_path not in svg_paths: + QgsSettings().setValue('svg/searchPathsForSVG', svg_paths + [plugin_path, svg_path]) + + template_f = open(plugin_path+"/img/svg_template.svg") + template_str = template_f.read() + template_str = str(template_str) + + template_str = template_str.replace("image_url", str(url_data)) + + f = open(str(pic_idx)+appendix + ".svg","w") + name = f.name + #print(name) + f.write(template_str) + #print(f) + template_f.close() + f.close() + svg_symbol = QgsSVGFillSymbolLayer.create() + svg_symbol.setSvgFilePath( name ) + #print(svg_symbol) + #print(svg_symbol.svgFilePath()) + new_color = self.colorToRgbArray([80,80,80,100], 'CIMRGBColor') + svg_symbol.setSvgFillColor(new_color) + svg_symbol.setSvgStrokeColor(new_color) + symb_idx = ls['sl_idx'] + pic_idx = pic_idx + 1 + + return [svg_symbol, symb_idx] + + + def unload(self): + """Removes the plugin menu item and icon from QGIS GUI.""" + for action in self.actions: + self.iface.removePluginMenu( + self.tr(u'&qlyrx'), + action) + self.iface.removeToolBarIcon(action) + + def getLabelField(self, labelObj): + label_exp = '' + if 'expression' in labelObj: + label_exp = labelObj['expression'] + return label_exp + + def parseLabels(self, labelSymbArr, labelExpArr, layer, layerId = 0): + #print(layerId) + #print(labelExpArr) + #print(labelSymbArr) + label = '' + labelExp = labelExpArr[layerId] + ## Parse label expression - by default - one label with brackets (VB syntax) + ##TODO: Generelize + if "[" in labelExp: + labelExp = labelExp[1:-1] + + labelParse = labelSymbArr[layerId][0] + labelSymbol = labelParse['textSymbol'] + + ## Init properties + try: + fontFamily = labelSymbol['symbol']['fontFamilyName'] if labelSymbol['symbol']['fontFamilyName'] else 'David' + fontSize = labelSymbol['symbol']['height'] if labelSymbol['symbol']['height'] else 12 + color = labelSymbol['symbol']['symbol']['symbolLayers'][0]['color'] + ptColor = self.colorToRgbArray(color['values'], color['type']) + fontWeight = labelSymbol['symbol']['fontStyleName'] if labelSymbol['symbol']['fontStyleName'] else 'Regular' + minimumScale = labelParse['minimumScale'] if 'minimumScale' in labelParse else '' + except Exception as e: + print(e) + + # Create label settings + label_settings = QgsPalLayerSettings() + # Create font settings + text_format = QgsTextFormat() + text_format.setFont(QFont(fontFamily, fontSize)) + text_format.setSize(fontSize) + text_format.setColor(ptColor) + text_format.setNamedStyle(fontWeight) +# buffer_settings = QgsTextBufferSettings() +# buffer_settings.setEnabled(True) +# buffer_settings.setSize(0.30) +# buffer_settings.setColor(QColor("black")) +# text_format.setBuffer(buffer_settings) + + label_settings.setFormat(text_format) + label_settings.fieldName = labelExp + + ## Default label placement + ## TODO: create conversion object to all placement properties + label_settings.placement = 1 + label_settings.centroidInside = 1 + label_settings.centroidWhole = 1 + ## Scale visibility + try: + label_settings.scaleVisibility = True if not minimumScale == '' else False + label_settings.minimumScale = minimumScale if not minimumScale == '' else 0 + except Exception as e: + print(e) + ## Label visibility + label_settings.enabled = True + label_settings = QgsVectorLayerSimpleLabeling(label_settings) + layer.setLabelsEnabled(True) + ## + #layer.setLabeling(label_settings) + + return label_settings + + def apply_lyrx_symbols(self, layer, lyrx_data, geometry_general_type_str): + simple_symbol = False + raster_symbol = False + label_symbol = False + layerDef = lyrx_data['layerDefinitions'] + renderer = '' + renderers = []; + renderers_symb_type = [] + dataset_names = [] + raster_data = '' + label_symb_array = [] + label_expessions = [] + labels = '' + + for p in layerDef : + #print(p) + if 'type' in p: + print(p['type']) + if p['type'] == 'CIMRasterLayer': + raster_symbol = True + raster_data = p + ## Check for renderers + temp_renderer = p['renderer'] if 'renderer' in p else '' + renderers.append(temp_renderer) + temp_label = p['labelClasses'] if 'labelClasses' in p else '' + label_symb_array.append(temp_label) + try: + label_expr = self.getLabelField(temp_label[0]) if len(temp_label) else '' + #print(label_expr) + if label_expr: + label_symbol = True + label_expessions.append(label_expr) + else: + label_expessions.append('') + ## Get lyrx shape type and original names + if not temp_renderer == '' and not raster_symbol: + rend_type = temp_renderer['symbol']['type'] if 'symbol' in temp_renderer else temp_renderer['defaultSymbol']['symbol']['type'] + renderers_symb_type.append(rend_type.lower()) + dataset = p['featureTable']['dataConnection']['dataset'] + dataset_names.append(dataset) + except Exception as e: + print(e) + print("there are " + str(len(label_symb_array)) + " label def") + + + # Find a renderer with the active layer field attribute + rend_to_check = [] + x = 0 + for r in renderers_symb_type: + #print(r) + if geometry_general_type_str in r: + rend_to_check.append(x) + x = x + 1 + + rend_idx = -1 + #print(rend_to_check) + ## Check in the active layers for matching classification fields + for z in rend_to_check: + #print(renderers[z]['fields'][0]) + #print(layer.fields()) + ## Check for matching column names + field_exist = layer.fields().indexFromName(renderers[z]['fields'][0]) + if field_exist > -1: + rend_idx = z + + # Check simple symbol + if rend_idx < 0 and not raster_symbol: + active_name = layer.sourceName() + rend_idx = dataset_names.index(active_name) + simple_symbol = True + + if rend_idx > -1 and not simple_symbol: + ## Create data arrays for symbols, labels, symbolLayers, halo options + categories = [] + allSymbolLayers = {} + class_field = renderers[rend_idx]['fields'][0] if len(renderers[rend_idx]['fields']) > 0 else 'CODE' + class_field2 = renderers[rend_idx]['fields'][1] if len(renderers[rend_idx]['fields']) > 1 else '' + class_field3 = renderers[rend_idx]['fields'][2] if len(renderers[rend_idx]['fields']) > 2 else '' + #print(class_field) + classes = renderers[rend_idx]["groups"][0]["classes"] + symbols_labels = [] + symbol_layers = [] + symbol_values = [] + halo_symbols = [] + multi_cat = [] + for c in classes : + symbol_layers.append(self.getSymbolLayers(c)) + halo_symbols.append(self.getSymbolHalo(c)) + symbols_labels.append(c['label']) + symbol_values.append(c['values'][0]['fieldValues']) + if len(c['values']) > 1: + vf_idx = 0 + multi_array = [] + for vf in c['values']: + if vf_idx > 0: + multi_array.append(vf['fieldValues']) + vf_idx = vf_idx + 1 + multi_cat.append(multi_array) + else: + multi_cat.append('') + + ## Convert the symbolLayers definition of each CIMUniqueValueClass to qgis symbol and create a category + idx = 0 + for sl in symbol_layers: + #print(sl) + #print ("val :" + str(symbol_values[idx][0])) + allSymbolLayers = {} + ## Create definition array - add order and more + symbol_def = self.checkSymbolType(sl) + layer_num = symbol_def['layer_count'] + #print("Symology count is " + str(layer_num)) + ret_arr = self.parseSolidFill(symbol_def, layer) + ret = ret_arr[0] + #print("solid fill idx " + str(ret_arr[1])) + allSymbolLayers[ret_arr[1]] = ret + noSolid = False + firstDash = False + if ret_arr[1] < 0: + noSolid = True + + svg_file_appendix = str(symbol_values[idx][0]).replace(" ","_") + picture_ret = self.parsePictureFill(symbol_def, svg_file_appendix) + if not picture_ret[0] == '': + print("pic fill try") + allSymbolLayers[picture_ret[1]] = picture_ret[0] + ret.appendSymbolLayer(picture_ret[0]) + ## Create hatch fill + lines_ret = self.parseLineFill(symbol_def, layer) + #print(len(line_ret)) + if not lines_ret == '': + line_ret = lines_ret[0] + #print("hatch number is " + str(len(line_ret))) + for line in line_ret: + try: + ret.appendSymbolLayer(line) + except: + print(line.__class__.__name__) + for line_sym in lines_ret[1]: + allSymbolLayers[line_sym] = lines_ret[1][line_sym] + + ## Create line strokes symbols + if 'template_stroke_num' in symbol_def and not ret == '': + ret_val = self.parseStroke(symbol_def, ret, layer) + ret = ret_val[0] + stroke_symbols = ret_val[1] + for str_s in stroke_symbols: + #print(str_s) + allSymbolLayers[str_s] = stroke_symbols[str_s] + firstDash = ret_val[2] + + vector_layers = self.parseVectorSymbolLine(symbol_def, False, layer) + #print(vector_layers) + if not vector_layers == '': + vl_idx = vector_layers + for vl in vector_layers: + v_symb = vl[0] + v_ord = vl[1] + allSymbolLayers[v_ord] = v_symb + ret.appendSymbolLayer(v_symb) + #print("After vector") + + #allSymbolLayers[vl_idx] = vector_layers[0] + #ret.appendSymbolLayer(vector_layers[0]) + + + ## Create character fills + layers = [] + max_size = 0 + for charSl in sl: + if 'characterIndex' in charSl and charSl['type'] == 'CIMCharacterMarker': + #print(charSl["enable"]) + if charSl["enable"]: + ret_sym = self.parseCharacterFill(charSl, max_size, layer) + #print(ret_sym) + symbol = ret_sym[0] + if not symbol == '': + #print("char symb desc " + str(charSl['sl_idx'])) + layers.append(symbol) + allSymbolLayers[ret_sym[1]] = symbol + if geometry_general_type_str == 'point': + max_size = max(symbol.size(), max_size) + + if not halo_symbols[idx] == '': + layers = self.tweakHaloSymbol(layers, halo_symbols[idx], layer) + allSymbolLayers[len(allSymbolLayers) + 1] = layers[len(layers) - 1].clone() + + ## Add the font fill + x = 0 + for rl in layers: + ret.appendSymbolLayer(rl) + x = x + 1 + + ## Delete default base layer if font marker filled or symbol mismatch + #print("is Halo " + str(halo_symbols[idx] == '')) + #print("ret count is " + str(ret.symbolLayerCount())) + + if ((len(layers) > 0 and noSolid ) or (layer_num < ret.symbolLayerCount()) or firstDash ): + print("delete first symbol layer") + # add user interaction + ret.deleteSymbolLayer(0) + if -1 in allSymbolLayers: + print("fix demo first layer") + # add user interaction + del(allSymbolLayers[-1]) + + #print("symbol layers in object " + str(len(allSymbolLayers))) + #print("ret symbols " + str(ret.symbolLayerCount())) + + ## Create ordered object from allSymbolLayers + ordered_obj = OrderedDict(sorted(allSymbolLayers.items(), key=lambda t: t[0])) + #print("len " + str(len(allSymbolLayers))) + total_len = ret.symbolLayerCount() + total_sym_len = len(ordered_obj) + if -1 in ordered_obj and not total_len in ordered_obj: + #print("!!!!!!!!!!!!Fix by total length") + # TODO: add user interaction + ordered_obj[total_len] = ordered_obj[-1].clone() + del(ordered_obj[-1]) + + ## Create the new symbol from reveresed ordered_obj + new_symbol = QgsSymbol.defaultSymbol(layer.geometryType()) + baseLayer = False + try: + if total_sym_len > 1: + for ord_sym_idx in reversed(ordered_obj): + #print("in reorder loop " + str(ord_sym_idx)) + newSymbolLayer = ordered_obj[ord_sym_idx].clone() + locked = '' + if not 'SymbolLayer' in newSymbolLayer.__class__.__name__: + #print("try symbolLayer") + newSymbolLayer = ordered_obj[ord_sym_idx].symbolLayer(0).clone() + locked = ordered_obj[ord_sym_idx].symbolLayer(0).isLocked() + else: + locked = ordered_obj[ord_sym_idx].isLocked() + #print("locked " + str(locked)) + newSymbolLayer.setLocked(locked) + if not baseLayer: + if "SymbolLayer" in newSymbolLayer.__class__.__name__: + new_symbol.changeSymbolLayer(0, newSymbolLayer) + baseLayer = True + else: + if "SymbolLayer" in newSymbolLayer.__class__.__name__: + new_symbol.appendSymbolLayer(newSymbolLayer) + else: + #print("one layered symbol") + new_symbol = ret + except: + print("order fail") + # add user interaction + + #print("new symbol count" + str(new_symbol.symbolLayerCount())) + + ## Create new category + symbol_val_prep = symbol_values[idx][0] + ", " + symbol_values[idx][1] if len(symbol_values[idx]) > 1 else symbol_values[idx][0] + category = QgsRendererCategory(symbol_val_prep, new_symbol, symbols_labels[idx]) + categories.append(category) + + #if len(symbol_values[idx] > 2): + if not multi_cat[idx] == '': + for extra_label in multi_cat[idx]: + symbol_val_prep1 = extra_label[0] + ", " + extra_label[1] if len(extra_label) > 1 else extra_label[0] + category = QgsRendererCategory(symbol_val_prep1, new_symbol.clone(), symbols_labels[idx]) + categories.append(category) + + idx = idx + 1 + + ## Create renderer + concat_str = ", " + "', ', " + class_field2 + ")" if not class_field2 == "" else ")" + renderer = QgsCategorizedSymbolRenderer("concat(" + class_field + concat_str, categories) + #print(categories) + + elif not raster_symbol and renderers[rend_idx]['type'] == 'CIMSimpleRenderer' and simple_symbol: + single_symbology = self.parseSimpleRenderer(renderers[rend_idx], layer) + #print(single_symbology) + if not single_symbology == '': + #print('simple renderer') + symbol = QgsSymbol.defaultSymbol(layer.geometryType()) + try: + symbol.changeSymbolLayer(0, single_symbology) + except: + symbol = single_symbology + + renderer = QgsSingleSymbolRenderer(symbol) + elif raster_symbol: + print("raster") + self.mb.pushWarning('Warning',"Raster symbology is still experimental") + self.parseRasterData(raster_data, layer) + print("after parse all") + #layer.triggerRepaint() + #self.iface.legendInterface().refreshLayerSymbology(layer) + else: + print("No matching lyrx symbology fields found for the active layer") + self.mb.pushCritical('',"No matching lyrx symbology fields found for the active layer") + # add user interaction + + if label_symbol: + #print(label_symbol) + #print(label_expessions) + #print(label_symb_array) + labels = self.parseLabels(label_symb_array, label_expessions, layer, rend_idx) + print("label by layer num " + str(rend_idx) + " in lyrx") + + # assign the created renderer to the layer + if not renderer == '' : + #print("re-render") + layer.setRenderer(renderer) + layer.triggerRepaint() + + if not labels == '': + layer.setLabeling(labels) + #print(dir(self.dlg)) + if not self.dlg.parseLables.isChecked(): + layer.setLabelsEnabled(False) + layer.triggerRepaint() + print("after labeling") + + + def run(self): + """Run method that performs all the real work""" + + # Create the dialog with elements (after translation) and keep reference + # Only create GUI ONCE in callback, so that it will only load when the plugin is started + + # show the dialog + self.dlg.show() + self.load_vectors() + self.dlg.saveQmlCheck.stateChanged.connect(self.enableQmlSaving) + # Run the dialog event loop + result = self.dlg.exec_() + # See if OK was pressed + if result: + # Do something useful here - delete the line containing pass and + # substitute with your code. + + j_data = self.read_lyrx(self.dlg.file_select.filePath()) + + layer = self.dlg.layer_select.currentLayer() + #print(dir(layer)) + #print(layer.__class__.__name__) + #print(point2mm) + #fields = layer.fields() if layer.fields() else '' + fields = layer.fields() if "fields" in dir(layer) else '' + isRaster = 'Raster' in layer.__class__.__name__ + geometry_general_type_str = self.generalise_geom_type(layer) if not isRaster else 'raster' + + self.apply_lyrx_symbols(layer, j_data, geometry_general_type_str) + if self.dlg.saveQmlCheck.isChecked(): + self.saveQML(layer) + self.mb.pushSuccess('Yay',"It's Working") + #pass diff --git a/zip_build/qlyrx/qlyrx_dialog.py b/zip_build/qlyrx/qlyrx_dialog.py new file mode 100644 index 0000000..23fd1d6 --- /dev/null +++ b/zip_build/qlyrx/qlyrx_dialog.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + qlyrxDialog + A QGIS plugin + Apply Arcgis Pro .lyrx style + Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ + ------------------- + begin : 2019-04-09 + git sha : $Format:%H$ + copyright : (C) 2019 by arc2qgis + email : dror.bogin@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +""" + +import os + +from PyQt5 import uic +from PyQt5 import QtWidgets + +# This loads your .ui file so that PyQt can populate your plugin with the elements from Qt Designer +FORM_CLASS, _ = uic.loadUiType(os.path.join( + os.path.dirname(__file__), 'qlyrx_dialog_base.ui')) + + +class qlyrxDialog(QtWidgets.QDialog, FORM_CLASS): + def __init__(self, parent=None): + """Constructor.""" + super(qlyrxDialog, self).__init__(parent) + #self.setMinimumSize(1000, 800) + # Set up the user interface from Designer through FORM_CLASS. + # After self.setupUi() you can access any designer object by doing + # self., and you can use autoconnect slots - see + # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html + # #widgets-and-dialogs-with-auto-connect + self.setupUi(self) diff --git a/zip_build/qlyrx/qlyrx_dialog_base.ui b/zip_build/qlyrx/qlyrx_dialog_base.ui new file mode 100644 index 0000000..c10444b --- /dev/null +++ b/zip_build/qlyrx/qlyrx_dialog_base.ui @@ -0,0 +1,378 @@ + + + readLyrxDialogBase + + + + 0 + 0 + 436 + 413 + + + + + 0 + 0 + + + + + 418 + 332 + + + + + 8 + + + + readLyrx + + + true + + + + + 10 + 10 + 381 + 41 + + + + + 0 + 0 + + + + + 381 + 31 + + + + + 11 + + + + Qlyrx + + + + + + 10 + 60 + 401 + 271 + + + + + 28 + + + 6 + + + + + + + + + + 0 + 0 + + + + + 121 + 58 + + + + Layer to apply style to: + + + + + + + + 0 + 0 + + + + + 258 + 20 + + + + + wms + wmts + + + + + + + + + + + + 8 + + + + + + 0 + 0 + + + + + 359 + 20 + + + + Use Labels + + + true + + + + + + + + + + + + + + 0 + 0 + + + + + 54 + 20 + + + + .lyrx file: + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 85 + 20 + + + + + + + + + 0 + 0 + + + + + 165 + 20 + + + + Choose a lyrx file for symbology to load + + + Arcgis Pro Layer (*.lyrx) ;; + + + + + + + + + + + 8 + + + + + true + + + + 0 + 0 + + + + + 359 + 20 + + + + Save style to QML + + + false + + + + + + + + + false + + + .qml save location + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 85 + 20 + + + + + + + + false + + + QML files (*.qml) + + + QgsFileWidget::SaveFile + + + + + + + + + + + + + 60 + 370 + 359 + 24 + + + + + 0 + 0 + + + + + 359 + 5 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + QgsFileWidget + QWidget +

qgsfilewidget.h
+ + + QgsMapLayerComboBox + QComboBox +
qgsmaplayercombobox.h
+
+ + + + + button_box + accepted() + readLyrxDialogBase + accept() + + + 20 + 20 + + + 20 + 20 + + + + + button_box + rejected() + readLyrxDialogBase + reject() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/zip_build/qlyrx/resources.py b/zip_build/qlyrx/resources.py new file mode 100644 index 0000000..90fa943 --- /dev/null +++ b/zip_build/qlyrx/resources.py @@ -0,0 +1,1004 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created by: The Resource Compiler for PyQt5 (Qt v5.9.6) +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore + +qt_resource_data = b"\ +\x00\x00\x3a\xca\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\xca\x00\x00\x00\xbf\x08\x06\x00\x00\x00\xbf\x8a\x43\xda\ +\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\x00\x00\ +\x09\x70\x48\x59\x73\x00\x00\x16\xea\x00\x00\x16\xea\x01\xe5\x8e\ +\x43\x10\x00\x00\x3a\x5f\x49\x44\x41\x54\x78\x5e\xed\x9d\x07\x78\ +\x54\x65\xd6\xc7\xa3\xbb\x9f\x65\x5d\xcb\xd6\x6f\xf7\x5b\xb7\xb8\ +\x22\xa4\xcc\xbd\x33\xa1\x8b\x8b\xb1\x50\x95\xae\x80\xee\xea\xda\ +\xe8\xa0\xa0\x80\x22\x96\xac\x5d\x51\x74\x2d\xab\xb0\xf6\x82\x48\ +\x40\x9a\x52\x03\x04\xc8\xcc\x9d\x99\x54\x6a\x80\x50\x92\x09\x25\ +\x90\x3a\x3d\xf4\xf3\x9d\xf3\xde\x7b\x61\x92\xbc\x99\x96\x49\x32\ +\x33\xdc\xf3\x3c\x7f\x12\x32\x77\xee\xdc\x99\x39\xbf\x7b\xce\x79\ +\x6b\x82\x66\x11\x36\x80\x8b\x48\x9d\xf2\x6a\xae\xd6\x67\xd5\x5e\ +\x23\xe4\xba\x04\x51\xf2\x0c\xd4\x6d\x76\x3c\xa6\xb7\x78\x66\x8b\ +\x66\xef\xdb\x7a\xc9\xf5\xbd\x28\x39\x37\x08\x92\xa3\x40\x27\xb9\ +\x4b\x74\x92\xa7\x44\x34\xbb\x6b\x79\xa2\xc7\xe8\x18\x3a\x96\x9e\ +\x23\x9a\x5d\x8b\x05\xc9\xf3\xa9\x90\x5d\xfb\x2f\x71\x73\x4d\xba\ +\x68\x72\xdf\x2f\x58\x9c\x3d\x85\x2c\xcf\xb5\xea\x6b\x33\x69\xa6\ +\x59\x54\x98\xe2\x90\xc9\x59\xf0\x73\xbd\xd5\x95\x62\x30\xbb\xef\ +\xd0\x99\xec\x33\xf4\x66\xe7\x6a\xd1\xe4\xc8\x47\x27\xaf\x44\x20\ +\xce\xea\xcd\x6e\x68\x2d\x21\x44\xa7\x11\xac\x3d\x7a\x8b\xf3\x3b\ +\xc1\x68\x7f\x46\x6f\x74\xdc\x67\xc8\xf1\x74\x49\x48\x87\x8b\xcf\ +\x03\xa4\x41\xa4\x59\x4b\x99\xea\x64\x00\x17\x8b\x5b\x8e\xb7\x17\ +\xcc\x8e\xfe\x82\x54\xf7\x22\xfe\x34\x32\x20\xcc\x08\x84\xc5\x83\ +\xce\x4a\xe2\x3b\x71\xdb\x08\xaf\xc7\xea\x45\x80\xdc\x5e\xc1\xec\ +\x5a\x95\x62\x72\xcd\x11\x8c\xce\x51\xc9\xf9\x75\xed\xe8\xbd\x9c\ +\x7b\x5f\x9a\x69\x16\xb6\x29\x60\x74\x34\xd6\x5d\xaf\x33\xd5\x3e\ +\x24\x5a\x5c\x5f\xa0\xc3\x1d\x42\x07\x94\xa1\x60\x60\xf0\x9c\x33\ +\x8a\xa5\x5e\x77\x4e\x1d\x88\x92\xcb\x89\xef\xe9\x73\x7a\x6f\xf4\ +\x1e\x13\x32\xe0\x27\x1a\x34\x9a\x05\x61\xe8\x24\x98\xa2\x88\x5b\ +\xca\xaf\xe8\xb8\xa9\xa2\xa3\x41\xf2\xce\xd4\x49\x8e\x4d\x98\xce\ +\xd4\xd1\x5d\x39\x26\xc1\x08\x24\x15\x1c\x94\x68\x71\x17\x63\xfd\ +\x34\xa3\xa3\xe4\x12\xd2\xb2\xb2\x7e\x4a\x37\x09\x0d\x1c\xcd\x54\ +\x93\xd3\xa9\x35\x67\xaf\x30\x64\xbb\xf5\x98\xdf\xbf\xa4\x97\xdc\ +\x07\x64\xe7\x89\x53\x38\xfc\x09\xdf\xaf\x21\xf7\x04\xfd\x5e\x23\ +\x9a\x1d\x73\xf5\xc6\xda\x5b\xd3\xb2\x40\x86\x86\x3e\x2b\xcd\x2e\ +\x30\x4b\x4f\xbf\x98\x1c\x20\xd5\xec\x4c\xd2\x4b\xce\x27\xd1\x41\ +\x8a\x0c\x0c\x8c\xba\xc6\xce\x73\xa1\x8a\xa0\xc9\x3f\x49\xbf\x97\ +\x61\xb4\x99\x46\x9f\x95\x0f\x34\x9a\xc5\xaf\x61\x1a\x91\x91\xf1\ +\x93\x76\x2b\xcf\x5e\x2a\x6e\xae\xbe\x47\x30\x39\xd6\x8a\x66\xa7\ +\x57\x9f\x7b\xfc\xc2\x8b\x1c\xa1\x8a\x6a\x1a\xb3\xfb\x94\x60\xf6\ +\xe6\xe8\x25\xcf\xd8\xe4\xd5\x65\xbf\x1c\x4e\x35\x8d\x66\x71\x64\ +\x98\x67\xd3\x9d\x50\x30\x3a\x3a\x60\x0e\x3e\x15\xa1\xd8\xc6\xa2\ +\x07\xd5\x1d\x3c\xa7\xd0\xd4\xb4\xf0\x86\x92\x9a\x77\x8a\x9a\xa1\ +\x2b\xf5\x16\xd7\x6b\xa9\xf9\x75\xed\x94\x28\xa3\xa5\x65\x31\x6b\ +\xf8\xe5\x89\x6b\xb6\x5c\x91\x9a\x7f\x3c\x09\x8b\xf2\xb9\x18\x3d\ +\x8e\xa7\x52\xfe\xad\x45\x8f\x88\xc8\x80\x91\x58\x94\x1c\x75\x18\ +\x99\x17\x60\x94\xe9\xda\x29\x0f\xfe\x47\x03\x26\x96\x0c\x73\xe8\ +\xee\xd2\xd9\xcb\x05\xa3\xb3\x27\x46\x91\xf9\x94\x5e\x29\x05\xaa\ +\xa6\x96\x50\x0e\x02\x63\x76\x9f\xd1\x99\x5c\xcb\x53\x8d\x9e\xce\ +\xc9\x3b\xe0\x12\x0d\x98\x28\x37\xfa\x92\x52\x8d\x35\x83\x74\x92\ +\x3b\x4b\xc0\x9c\x9a\xbe\x44\xee\x97\xab\x29\xf2\xc2\x3a\x86\x6e\ +\x48\x98\x96\x6d\xd2\x4b\xce\x9b\x34\x60\xa2\xd0\x28\xec\xeb\xb3\ +\x6a\xff\x22\x5a\xbc\x1f\x8b\xac\x37\x5a\x03\xa4\xcd\x64\x45\x60\ +\xf2\x4e\x82\x5e\x72\xad\xd4\x1b\xdd\x06\x0d\x98\x28\x30\x2a\x24\ +\x19\x20\x92\xf3\xdf\xa2\xe4\xaa\x4b\xcd\x65\xcd\x99\x9a\xa2\x40\ +\x14\x5d\x04\xb3\xcb\x8d\xd1\xe5\x2b\xd1\x54\x9b\xca\x8a\x7e\xcd\ +\x5a\xd9\x32\xe0\x27\xdd\xcc\x67\xff\x57\xb4\x7a\xa7\x62\xa8\x3f\ +\x9c\x5a\x70\x9a\xfb\x65\x69\x6a\x6b\x29\xad\x64\x92\xab\x56\x34\ +\x3b\xa6\x76\xca\xac\xb9\x9a\x6a\x48\xe5\x5b\xd4\xac\x25\x8d\x42\ +\xb9\x60\x3e\x3e\x48\x6f\xf6\xe6\x1a\x30\x2f\xd6\x9a\x79\x63\x40\ +\xd4\xac\xbc\x15\xb0\x7e\xf1\xec\x10\xac\xa7\x6e\x6f\xb7\xb2\xf8\ +\x52\x2d\x1d\x6b\x21\xa3\x0e\xae\xce\x39\xde\x3f\x8a\x66\xe7\x2c\ +\xc1\xe4\xf4\x18\xf2\xb4\x96\xac\x58\x13\x4b\xc7\x24\xa7\x1b\x53\ +\xe5\x0f\x52\x25\x65\x04\xb3\x66\x91\xb3\x76\xc5\x67\x2f\x15\x4d\ +\xc7\x07\x88\x66\xaf\xd5\xc0\x06\x28\x6a\x51\x24\x66\x45\xd1\x65\ +\x0b\xd0\xef\xdb\x44\x4b\xdd\x6d\x69\x25\x70\x19\x7e\xc5\x5a\x74\ +\x69\x8e\x51\x14\xd1\x17\x7a\xfe\xa0\x33\xbb\xdf\x16\xcc\x9e\xb3\ +\xd4\xc9\xd5\xe8\x83\xd7\x14\x9b\xa2\xe6\xe4\xc2\x33\x40\x43\xfd\ +\x85\x6c\xfb\x5f\xb5\xe8\x12\xa6\x51\x93\xaf\x28\xb9\xfb\x61\x14\ +\x31\xc7\xed\x30\x77\x4d\x2c\xba\x60\xed\x52\x98\x6a\xf2\xde\x9c\ +\x9c\xb1\xe3\x12\xe5\xeb\xd7\x2c\x18\xeb\x62\x75\xfc\x4a\x94\x5c\ +\x8f\xa2\x4a\x0c\xf9\x5a\x8b\x56\xbc\x8b\xea\x4d\xd1\xec\xf2\xa2\ +\x1e\xeb\xba\xb2\xea\x2a\xad\xd0\x0f\x60\x94\x6a\x09\x96\xaa\x6b\ +\x0d\x66\xef\x3b\x86\x82\x33\xac\xf3\x8a\xf7\xc1\x6a\x8a\x43\x61\ +\xc6\xd0\x71\x27\xd6\x2e\x26\xd7\x22\x71\xb3\xa3\xbd\x96\x8a\x35\ +\x61\xd4\x21\x65\x90\x5c\xbd\x44\x8b\x37\xa7\xe3\x56\x56\xec\x69\ +\xba\x00\xd5\x91\xa5\x62\xee\x5c\x9d\xf5\xe4\x8d\x5a\x27\x65\x03\ +\xfb\x73\x56\xc9\x65\x7a\xc9\x33\x54\xb4\xb8\x4b\x52\x29\x92\x70\ +\x3e\x40\x4d\x17\x8e\x52\x31\xdd\x46\x58\x2a\x45\xa3\x7d\x24\xf9\ +\x86\xe2\x26\x17\xb6\xe9\x0b\xe1\x1a\x9d\xf5\xf8\x0c\x1a\xa3\x65\ +\xd0\x06\x31\x6a\x52\x44\x9d\xc9\xe4\x13\x3a\xab\x77\x06\xf9\x88\ +\xe2\x2e\x17\xa6\x89\x26\xd7\x6f\xb1\x60\x7f\x9d\x9a\x09\xb5\x56\ +\x2d\x4d\x8d\x84\x3e\x41\xbe\x61\xb0\xd4\xbd\x4e\xbe\xa2\xb8\xcd\ +\x05\x64\x00\x17\xa5\x6c\xf2\xfe\x51\x34\x39\xdf\x37\xe4\x9f\xd2\ +\x20\xd1\xe4\x57\x1d\x8b\x00\x0c\x66\xf7\x9c\xce\x39\xd5\x7f\xbc\ +\x70\x5a\xc4\xf0\x8d\x26\x5a\x1d\xed\x45\xab\x37\x83\x75\x20\x6a\ +\x90\x68\x0a\x24\xc9\x05\x1d\xb7\xb3\x22\x7f\x09\x4d\xe9\x8e\x7f\ +\x58\xf0\x0d\x1a\xcc\x15\x37\x88\x16\xd7\x62\x7a\xe3\xdc\x0f\x45\ +\x93\x26\xae\x10\x96\x6d\x08\x8b\xe4\x5e\xab\xcf\xae\x4e\x89\x5f\ +\x58\x08\x92\x8d\x15\x37\xe8\x25\xf7\xf7\x32\x24\xae\x06\x1f\x84\ +\x26\x4d\x81\x45\x5d\x07\x82\xe4\x5a\x63\xd8\x5c\x95\x1c\x7f\xb0\ +\xe0\x1b\x4a\x95\xec\xed\xf4\x16\xf7\x22\x0d\x92\xd6\x93\x80\x69\ +\xad\x60\xf5\xca\xc2\xdf\xd9\xec\x4f\xce\x71\xb1\x26\xb9\x9f\xcd\ +\xb3\x3a\x39\xae\x60\xc1\x37\x92\x9c\x65\x6f\x27\x5a\xdd\x0b\x35\ +\x48\x5a\x4f\x1d\x31\xaf\xbf\x35\xb3\x1c\x7a\x2f\x2f\x81\x5e\xa8\ +\xdb\xd6\x1c\x86\xee\x46\x3b\x83\x86\x77\x7c\x6c\x09\xd3\x30\x05\ +\x96\xa4\x8d\x8e\x1b\x14\x4f\x8b\x61\x43\x48\x52\x8c\xf6\xeb\x45\ +\xc9\x91\xa1\x41\xd2\x7a\xea\x84\x90\x8c\x9d\x57\x08\x5b\x06\x3d\ +\x09\x55\xd7\xf4\x84\x8a\xab\xfe\x06\x7b\x6e\x1e\x0b\xef\xcf\x5e\ +\x0e\x5d\x37\xd7\x50\xdf\x04\xf7\x79\xb1\x25\xb9\xc0\x47\x58\x3e\ +\xa5\x79\x4a\x8a\xc7\xc5\xa0\x21\x24\x7a\x73\xed\x5f\x44\xb3\xe3\ +\x5b\x6d\xcc\x56\xeb\x48\xb4\xc8\x90\x4c\xfc\xdc\x0a\xe5\xfa\x7b\ +\xe1\xd0\x95\x37\x81\xed\xd7\xb7\x31\x1d\xbc\xfa\x66\x38\xf4\xdb\ +\xdb\x61\xe9\xf8\xf7\xf0\x18\x67\x7c\xc0\x42\xad\x61\x34\x3e\x0c\ +\x61\xd1\x4b\x9e\x3f\x28\x9e\x17\x5b\x76\xa3\xdc\x99\x38\x97\x2d\ +\x19\xa4\x35\x01\xb7\x8a\xba\x64\xd7\xc2\xc4\x4f\xcc\x50\x79\xc3\ +\x10\xb0\x5d\x73\xf3\x39\x48\x54\x95\xfd\xf2\x16\xb0\x5d\xdb\x0f\ +\x16\x4f\xff\x04\x3a\x9b\xe2\x0b\x16\x83\xd5\xfb\x4e\xa7\xac\xc3\ +\xbf\x56\xdc\x2f\x36\xac\xbb\x54\x76\xb9\xc1\xec\x9a\x4c\x63\x76\ +\x34\x48\x5a\x47\x5d\x2c\x2e\x98\x91\x51\x08\xd5\xbf\xef\x8d\x90\ +\xa4\x35\x82\x44\x55\xd9\x2f\xd2\xa0\x0c\x61\xf9\xfe\xc9\x4f\x59\ +\xf4\xd1\xc5\xc3\x6c\x51\x7c\x1f\x9d\x76\x03\x45\xd4\x69\xe2\x9a\ +\xb3\x57\x28\x6e\x18\xdd\x46\x7b\x6b\xe8\x4c\x8e\x3b\x05\x8b\xf7\ +\x0c\x9b\xb6\xcb\x7b\x63\x9a\x22\xaa\x2e\x56\x37\x4c\xde\xed\x81\ +\x7d\x45\xfb\xa1\x4c\xbc\x07\x6c\xbf\xc0\xc8\xc1\x81\x44\x15\xc1\ +\x52\xfa\xa7\x3b\xe0\x9b\xf4\x79\xd0\x11\x9f\xaf\x8b\x93\x9b\x19\ +\x9b\x62\x6c\xac\x7d\x90\x6d\x8a\x14\xd5\xc6\xea\x12\xd7\x2d\x78\ +\xd1\x7b\xb4\x65\x4c\x5b\x5e\x22\xaa\x0b\xd6\x25\x53\x76\xb9\x61\ +\x9f\xd3\x0d\x07\xdd\x1e\xb0\x6d\xdf\x07\x36\x71\x64\x40\x58\x0e\ +\x62\x6a\x76\xe0\xba\x81\x30\xe7\x8d\x25\x90\x8a\xa0\xc5\x43\x64\ +\x31\x60\x2d\x2c\x9a\x5d\x4e\xc1\x58\xd3\x13\x7d\x31\x4a\xe7\xb3\ +\x20\x24\x3a\x93\x33\x51\xb4\xd6\xe5\x69\x43\xe5\x5b\x5e\x04\x49\ +\x67\x84\xe4\xf1\xdd\x6e\x38\xec\x46\x48\x5c\x6e\xb0\x31\x21\x2c\ +\xe6\xad\x60\xd3\x23\x2c\x57\xf5\xe4\x42\xa2\x8a\x60\xd9\x7b\xfd\ +\x60\x78\xfb\xbd\x55\xd0\x11\xcf\x15\x17\xb0\xb0\x1b\xb4\xa7\x5c\ +\xd8\x58\x2d\x90\x4f\x2a\xde\x19\x3d\x66\x28\x38\xfb\x1b\x51\x72\ +\x7e\xab\x4d\xba\x6a\x79\xa9\x90\x4c\x41\x48\x0e\x21\x24\x65\xe7\ +\x20\x51\x44\x91\xc5\x58\x08\xb6\xbf\x0e\x04\xdb\xd5\x8d\x8b\x7a\ +\x5f\x1d\xc2\xc7\x09\x96\xd9\xef\xad\x56\x60\x89\xfd\x34\x2c\xb5\ +\x10\xeb\x15\xab\xe7\x5b\xf2\x49\xc5\x3d\xa3\xc3\xd2\xb2\x4a\x2e\ +\x13\xad\xce\xf1\xa9\xb4\xe6\x2c\xe7\xc2\x35\x45\x4e\x04\x49\x57\ +\x4c\x95\x28\xdd\x3a\xd4\x10\x10\x55\x08\x8f\xcd\xe3\x05\x5b\x36\ +\xc2\xf2\x97\x3b\xfd\x16\xf7\xa4\x43\x57\xf7\x84\x7d\x37\x0c\x81\ +\xb7\xde\x5f\x4d\xad\x47\xac\x17\x9f\xf7\xda\xb1\x23\x17\x1b\x71\ +\xac\xb7\x78\x1e\xef\x57\x7c\xf6\x52\xc5\x4d\xdb\xd8\x30\xbc\x25\ +\x9b\x5c\xb7\x09\x92\xd3\x4e\x39\x22\xff\xc2\x35\x45\x42\x04\x49\ +\x37\x84\xe4\xe9\x62\x3f\x90\xa8\xa2\xa8\x42\x3f\x57\x1a\xa1\xf4\ +\x2f\x03\xb8\xcd\xc5\xbe\x3a\x8c\x69\x5a\x51\xe2\xdd\x90\xfe\xf1\ +\x26\xd0\xe7\xc4\x03\x2c\xca\x0a\x2f\x9b\x1d\x03\xa2\xa1\x5e\xb9\ +\x28\xc5\x58\x77\xbd\x68\xa9\xcb\x65\x2b\x98\x73\x2e\x56\x53\x64\ +\x44\x90\xf4\xc8\x71\xc3\x0c\x84\xe4\x7c\x3d\x12\x40\x08\xcb\x01\ +\x87\x13\x8a\x17\xaf\x97\x61\x09\x90\x86\x1d\xbe\xf2\x6f\xb0\x3d\ +\x79\x24\x4c\xfb\xca\x0a\x86\x38\x80\x85\xcd\x98\xb5\xb8\x0f\xd3\ +\x38\x43\xc5\x5f\xdb\xc6\x3a\xe5\xd5\x5c\x2d\x1a\x1d\x73\xb4\xba\ +\xa4\x65\x45\x90\xdc\x9c\xeb\x86\x37\x4b\x38\xf5\x88\x1f\x1d\xb0\ +\x3b\x60\x57\x45\x25\xec\x2c\xaf\x80\x3d\x8b\x32\xc1\x76\x5d\x60\ +\x58\x8e\x5c\x79\x13\xec\x48\x19\x09\x53\xbf\x44\x58\xac\x9e\x98\ +\x87\x85\xd6\x3c\x36\x98\x5c\xb3\x3a\x18\xcf\x5e\xa9\xb8\x6d\x2b\ +\x1b\x86\x33\x83\xc9\x79\xb7\xb6\xee\x56\xcb\x4a\x85\xe4\x3f\xa5\ +\x6e\x28\x45\xe7\x0f\x16\x14\x06\xc9\xb1\x0a\x84\xe4\x18\xec\x3c\ +\x4a\x3f\x11\x96\x85\x08\x4b\x10\x91\x85\x60\xd9\x2e\xdc\x03\x8f\ +\xcf\xcb\x03\x21\xb7\x2e\xf6\x23\x4b\xc1\x19\x10\x4d\xf6\x7b\x5a\ +\x3f\x05\xc3\xba\x44\x64\xb3\x14\x3d\x45\xda\x82\x10\x2d\x27\x01\ +\x75\x33\xa6\x5b\x04\x49\x09\x3a\x7f\x58\x90\xa8\x22\x58\x50\x7b\ +\xbe\x5b\x03\x65\xd7\xf6\xf7\x5f\xe0\xff\x0a\x61\xc1\x9a\x26\xef\ +\xa6\xd1\x30\x3a\x63\x7b\xcc\xd7\x2c\x6c\xd7\x03\xb3\xfb\xa0\x92\ +\x82\xb5\x5e\x93\x71\xda\x0e\xf8\xb9\x68\x72\xcc\x4b\xdd\x72\xb6\ +\xd1\x45\x69\x8a\x8c\x08\x92\x9e\x08\xc9\x47\x36\x84\xc4\x19\x3c\ +\x24\xfb\x6b\xed\x8d\x21\x51\x85\x7f\xdf\x73\xa4\x02\x4a\xe7\x2e\ +\x66\x63\xbe\x02\xc1\x72\xf4\xea\x9e\x0c\x96\x51\x0b\x63\x1f\x96\ +\xd4\x42\xf4\x55\xc9\xfd\x61\x3b\x4b\xd5\x55\x8a\x1b\xb7\xb4\xc1\ +\x45\x3a\xc9\x99\xc6\x16\x85\xe0\x5c\x90\xa6\xe6\x4b\x90\xce\x43\ +\x72\xcc\x13\x1a\x24\x5c\x40\x14\xed\xae\xa8\x82\x12\x6a\x0d\xab\ +\xb1\x83\xed\x9d\x79\x60\xfb\xbf\xbe\x41\xc0\xf2\x37\xc8\xed\x39\ +\x16\x46\xc5\x43\x64\x41\x9f\x15\x8d\xb5\x77\x25\x64\x64\xb4\xf4\ +\x10\x17\xb8\x28\xd9\xea\xfe\x9d\x68\xf1\x64\x6a\x43\x54\x5a\x46\ +\x04\xc9\x2d\x58\x93\x7c\xa8\x40\xc2\x03\x82\xa7\x40\x90\xec\xa9\ +\xac\x86\x12\x87\x4b\x3e\xbe\xae\x0e\x6c\x95\x35\x60\x7b\xe9\x53\ +\xb0\xfd\x21\x50\x64\xb9\xb5\x11\x2c\x54\x37\xf1\xae\x3d\xda\xc5\ +\xca\x04\x2c\x17\xba\x99\x8f\xfe\xaf\xe2\xd0\x2d\x63\x6c\xcf\x44\ +\xc9\x31\x45\xde\xa3\x24\xb6\x0b\xbc\x68\x94\x0e\x21\x49\x43\x48\ +\x3e\x3f\xe8\x86\xa3\x21\x42\xb2\xe3\xc8\x51\x2e\x20\xa4\x7a\x90\ +\xa8\x22\x58\xaa\x6a\xc1\xf6\xe2\xc7\x60\xfb\x5d\x6f\xb0\xfd\x22\ +\x30\x2c\x39\x69\xe3\xe1\x81\x25\xbb\x20\x29\x86\x37\x71\xa2\x05\ +\x2a\xd0\x77\x27\x62\x9d\xdd\x72\x51\x25\xd5\x54\xf3\x67\xbd\xc5\ +\x6d\xd3\x3a\x16\x23\x2f\x82\xa4\x77\x9e\x0c\x49\x79\x08\x90\xec\ +\xab\xa9\xe5\xc2\xa1\x8a\x20\x29\x75\x36\x80\x44\x55\xdd\x71\xb0\ +\x1d\xad\x02\xdb\xf4\xf7\xc0\xf6\xdb\x5e\xfe\x07\x52\x22\x2c\xc7\ +\x7e\x99\x06\x99\x83\x66\x42\xbf\xd5\x87\x20\x25\x86\xf7\xaa\x11\ +\x2c\xde\xd3\xac\xb0\x6f\x89\xb1\x60\x34\x4c\x45\x6f\x76\xbd\x60\ +\xa0\xa2\x88\xf3\xe2\x9a\xc2\x17\xa5\x32\xbd\x10\x92\x65\x47\x43\ +\x8b\x24\xc1\x40\xc2\x7b\x5e\x3d\x1d\x47\x58\x0e\x1f\x03\xdb\xa4\ +\x59\x41\xc1\x52\x71\xcd\xcd\x90\x39\xe4\x19\xe8\xbb\xf6\x08\xe8\ +\x62\x14\x16\x56\x5f\x9b\x1c\x1f\xd1\x1e\x3c\x8a\x7b\x47\xc8\x90\ +\xbc\x8e\xd9\xf6\x4e\xa2\xd9\x55\xa5\xa5\x5c\x91\x15\x41\x32\xb0\ +\xd0\x0d\xcb\xcb\xe5\x51\xc0\x5c\x67\x6e\x24\x57\x50\x90\x94\xa9\ +\xc3\x58\x02\xa8\xf4\x78\x1d\xec\x2b\x3d\x04\xfb\xc6\xbc\x82\xb0\ +\x50\x1a\xe6\x07\x96\x5f\xde\x02\x15\xbf\xb9\x0d\x56\xdf\xf3\x22\ +\xf4\xce\x3c\x02\x89\xf9\xb1\x39\x22\xc3\x50\x70\x1a\x44\x53\xb5\ +\x2e\x21\x3d\x3d\x72\x7d\x2b\xd7\x4a\x67\x2f\xd7\x99\x9c\x9f\xd3\ +\xc9\x79\x2f\xaa\x29\x3c\x51\x13\xf0\xe0\x2d\x18\x49\x42\x82\x24\ +\x70\x24\x29\xae\xaa\x09\x1e\x12\x4c\xcb\xf6\x56\xd7\xc0\x8e\xaa\ +\x6a\x28\xda\x53\x02\xfb\x46\xbf\x7c\x0e\x88\x46\x90\xa8\xc2\xc7\ +\x2a\x7f\x7d\x2b\x2c\xbd\xff\x35\xe8\x91\x55\x15\x93\x35\x0b\x35\ +\x46\x89\x92\x63\x29\xdb\xa1\x38\x22\x86\xd1\x44\xc8\xae\xea\x2e\ +\x58\xea\xbc\xbc\x17\xd4\x14\x9e\x18\x24\x18\x49\xd6\x54\x84\x1a\ +\x49\xfc\xb5\x6e\x55\x84\x0c\x49\x31\x02\x72\xae\x21\x00\x81\x29\ +\x2a\xda\x0b\xfb\xff\xf1\x2c\xc2\x70\x6b\x40\x58\xaa\x7e\x75\x0b\ +\x2c\x79\xe0\x0d\xb8\x71\x73\x0d\x24\xc5\x60\x2b\x28\x6b\xb9\xcd\ +\x76\x45\x66\xd5\xc9\x4e\x79\x87\x7f\xa6\x33\xba\x16\x6a\x83\x1e\ +\x23\x27\x5f\x48\x68\x3e\x09\xcf\x89\x1b\x8a\x9c\xda\x7f\x24\x09\ +\x17\x92\x06\xe7\xa9\x45\x58\xb6\xed\x81\x03\xc3\xa6\xb3\x7e\x14\ +\xbf\xb0\xfc\x22\x0d\x2a\x7e\xdf\x1b\x16\x8e\xf9\x37\xf4\xd8\x54\ +\x1d\x73\xb0\xb0\xa8\x62\xb2\x2f\x6b\xfe\xde\x91\x48\x5a\xaa\xf9\ +\x84\x88\xd1\xc4\xad\xb7\xf0\x5f\x4c\x53\x68\x3a\x07\xc9\xb1\xc8\ +\x41\x52\x74\xb4\x82\xa5\x4f\x65\x41\x9e\x8f\x9a\x8a\xa9\x86\x69\ +\x04\x09\x09\xff\x56\x64\xb7\xc3\xde\x5d\x07\xa0\x6c\xc4\x0c\x56\ +\xc0\xfb\x83\xa5\xec\x9a\x34\xa8\xfc\x5d\x2f\xc8\x18\xf7\x2e\xf4\ +\xd8\x18\x9b\xb0\x08\xc6\xca\xe6\x2d\xfc\xcd\xb6\xaf\xce\x76\xce\ +\xd6\xa2\x49\x64\x44\x4d\xc0\x04\xc9\x6a\x82\x84\xe3\xc0\x3c\xa9\ +\x35\x44\x23\x87\x56\x44\x90\xc8\x91\x84\xff\xfc\x86\x2a\x71\x38\ +\x19\x24\xbc\x73\x91\xe8\x7c\x04\x65\xd9\xe9\x53\x60\x2b\xb6\x81\ +\x6d\xe8\x34\xb9\x43\x92\x80\xe1\x80\x42\x62\xb0\x60\x64\xf9\x6e\ +\xdc\x7b\x31\x07\x8b\x1c\x55\x9c\xdf\x34\x63\x1b\x3c\xb8\x88\x56\ +\xe0\x13\x2d\xee\x0a\xad\xa5\xab\xf9\x4a\x41\x48\x46\x6c\x0d\x1d\ +\x12\x4a\x8f\x78\x0e\x4d\x92\x23\x49\x2d\xf7\xb9\x3c\xc9\x90\x54\ +\x71\xcf\x45\xda\x75\xac\x92\xd5\x40\xe7\xd2\x37\x6a\x3a\xce\xdb\ +\x05\xb6\x7e\x8f\xc9\x2d\x61\x81\x60\xc1\xc8\x32\x7f\xbc\x0a\x4b\ +\xec\x34\x1d\xd3\xae\xc4\xca\x5e\xf7\xa1\x47\x15\x8a\x26\x48\xda\ +\x0c\x6d\x4c\x57\xf3\x44\xcd\xbf\xa4\x7b\xb7\xb9\xc1\x5a\x13\x7c\ +\xe1\x1e\x69\x48\x0e\xd8\xfd\x43\x52\x74\x0e\x12\x9f\xe7\xd1\xef\ +\xa7\x4e\x20\x2c\x45\x60\xeb\x1b\x3c\x2c\x5f\x4f\x99\x0b\x5d\x25\ +\x27\x24\xcb\xa3\x76\xa3\x5e\x2c\xaa\x64\xdb\xdf\xee\x34\x77\x6e\ +\xe8\xfd\x2a\x89\x56\xc7\xaf\xb0\x2e\xd9\xae\x45\x93\xf0\x45\x80\ +\x50\x4d\xf2\xd0\x0e\x37\x6c\xb7\x87\x56\x93\x70\x0b\x6d\xd5\xa9\ +\x29\x3d\xaa\xb5\x73\x9f\xcb\x13\x45\x12\x1a\x10\xc9\x3b\x17\x89\ +\x1e\xdb\x6f\x77\xf0\xd3\x37\x15\x96\x5c\x84\xa5\xdf\xa3\x81\x61\ +\xb9\xba\x27\x94\x75\x18\x06\x1f\xbe\x90\xc1\x16\x05\x8f\x15\x58\ +\x28\x73\xea\x1a\xf2\xc8\x62\x0c\x41\x7a\xc9\x39\x94\x0d\x4d\xe6\ +\x9c\x54\x53\x60\x11\x24\x06\x8b\x0c\xc9\x56\x84\xe4\x60\x24\x21\ +\xa1\xd1\xbf\x9c\xe7\xf2\x14\x28\xdd\xda\x5d\x51\xc9\xa2\x0d\xef\ +\xb9\xe7\xc4\x60\x39\x89\xb0\xec\x04\x5b\xef\x49\x01\x27\x7e\x1d\ +\xbc\xf2\x6f\x70\xb0\xfd\x50\xf8\xe0\xe5\x45\x72\x64\x89\x81\x21\ +\x4f\xb4\xc4\x96\x98\xed\x19\x98\x90\x1e\xc2\xe4\x2e\xda\xb2\x58\ +\x30\x39\x16\x68\x2b\x3d\x86\x27\x82\x84\x5a\x09\xc7\x15\x85\x06\ +\x09\x39\x75\x24\x21\xa1\x09\x5c\xfe\x21\xa9\x62\xc7\xf0\x9e\xdb\ +\x48\xf4\x1e\xb0\xc0\x2f\xd9\x5c\x00\x25\xdd\xfe\x09\x36\x84\x81\ +\x07\x89\x2a\x5a\x20\xbc\x24\x65\x04\xcc\x7e\xf3\x47\xe8\x62\x76\ +\x41\x4a\x94\xfb\x92\xc1\xe2\xa5\xc6\x16\x73\x5a\x7a\x56\xf0\x45\ +\x7d\xca\x46\x67\x92\x68\xa9\x73\x69\x69\x57\xe8\x52\x6b\x92\x49\ +\x61\x40\x42\x4e\x1d\x49\x48\x28\x5a\xf0\xce\x45\x92\x21\x09\x10\ +\x49\x1a\x88\xa2\xdd\x1e\x3a\xef\xe2\x4c\x28\x31\x8c\x0c\x08\xcb\ +\xe1\x2b\x7a\x40\xb1\xe1\xef\xf0\xf2\x07\x99\xd0\x09\x6f\x1c\xd1\ +\x0e\x0b\xde\xdc\xce\x76\xce\xa1\xa2\x3e\x98\x59\x90\x00\x17\xeb\ +\x25\xf7\x93\xac\xd7\x92\x77\x32\x4d\x4d\x8a\xea\x11\x82\x64\x22\ +\x42\xb2\x3b\x84\x9a\x24\x50\x0d\xa1\x42\x12\x6c\x13\xb0\x3c\x15\ +\x38\xf2\x90\x14\xab\xcd\xca\x35\x35\xb0\xe7\xbb\x55\x50\x9a\x38\ +\xd4\x7f\x1a\xf6\x9b\xdb\xe1\xc8\xcf\x6e\x84\x9d\x5d\x1e\x80\xe7\ +\xe6\x6c\x64\x8b\xf6\x45\x33\x2c\x34\x5f\x45\x94\x1c\x2f\x05\x35\ +\xb1\xab\xdd\xca\xb3\x97\x8a\x66\x57\xa1\x16\x4d\x42\x13\x4d\xb8\ +\xa2\x95\x16\x29\x92\xec\x72\x84\x16\x49\xe4\x95\x52\x1a\x3b\x34\ +\x89\xa6\xf5\xd2\x7c\x93\x60\x21\xa1\x63\xa9\x05\x8b\x77\x2e\x52\ +\x50\x35\x49\x03\xb1\x48\xe2\xdb\x41\x49\xe7\x47\x78\x8b\xdf\xfc\ +\x12\x0b\x7b\x04\xc2\x4f\x71\x4f\xb0\x94\x5f\x8e\xb0\x74\x8d\x01\ +\x58\xc8\xe7\x2d\x9e\x6d\x1d\x8c\x95\x01\x56\x6c\xc1\x22\x5e\x67\ +\xb4\x77\xc6\x83\x4f\x73\x4f\xa4\x89\x2b\xea\x48\x24\x48\xa6\xed\ +\xc6\x48\x12\x02\x24\xec\xce\x1f\x61\x48\x02\x45\x92\x12\x47\x90\ +\x35\x89\xa2\x26\x7b\xf1\x6b\x6b\x61\xf7\x5a\x09\x4a\x7a\x3c\x1c\ +\x70\x8d\x63\x19\x96\xee\xb0\xa3\xeb\x83\xf0\xec\x5c\x84\x85\x3e\ +\xb3\x28\x5d\xe7\x98\x8a\xfa\x94\x6c\xd7\x2d\xfe\xfb\x54\x30\xe4\ +\x88\x66\xe7\xdb\x06\xab\xb6\xb2\x4a\xb0\x22\x48\xba\x5b\xdd\x30\ +\x7d\x0f\x46\x92\x10\x6a\x92\xc0\x90\x54\x32\xc7\xe7\x3d\x97\xa7\ +\x40\x90\x50\xfd\x43\xd1\x8b\xf7\xdc\xa6\x24\xd7\x4d\x4d\x34\x2e\ +\xe0\xf9\xf6\xe4\xef\x84\xd2\x7b\x67\x82\xed\x8a\xf3\x3b\x7b\x35\ +\x29\x05\x96\x9d\x08\xcb\xf4\xcf\x24\xd0\xe7\x1e\x8f\xca\xf9\xf7\ +\x34\x29\x51\x90\x9c\xb3\xfd\xa6\x5f\xfd\x30\xed\xd2\x9b\x5d\xf9\ +\x5a\xda\x15\x9c\x08\x92\x6e\x39\x6e\x78\x69\xbf\x1b\xf6\x84\x1a\ +\x49\xfc\x38\x35\x3d\x16\x8a\x53\xcb\x90\x34\xb1\xf2\x0a\x8a\x20\ +\x29\x75\x86\x07\x09\xef\x7c\xa4\x5d\xf8\x9a\xfb\x77\xee\x07\xdb\ +\x7d\xcf\x82\xed\x67\x3d\xf8\x70\x34\x14\xc2\x72\xec\xb2\x6e\x20\ +\xa5\x4d\x80\xf1\xf3\x0a\xa2\x73\x35\x4a\xba\x1e\xab\x67\x2b\x95\ +\x20\x0a\x16\x8d\x2d\x75\x63\x55\x12\x1e\xac\xa5\x5d\x41\x48\x87\ +\xea\x6e\x71\xc1\x2b\x07\x94\x9a\x84\xe3\x6c\x3c\xc9\x90\x34\xed\ +\xd4\x72\x7a\x14\x1a\x24\x54\xec\xf3\xce\x45\x22\x67\xa7\x1a\x83\ +\xf7\xdc\xa6\x44\xe9\x99\x5f\x48\xaa\xaa\xf1\x75\x31\x85\xfb\x78\ +\x09\xd8\xfe\x3a\xc8\xff\x44\xaf\x06\x2a\x45\x58\x2a\x2e\xed\x0a\ +\xe6\x5b\x26\xc0\xb8\x6f\x0b\xa3\x12\x16\x4a\xbf\x52\xcd\x2e\x91\ +\x86\x71\x29\x68\xf8\x58\x3a\xb5\x76\x79\x1e\x57\x16\x0b\xd3\xe4\ +\x47\x29\xa8\x6e\x66\x17\x3c\x93\x57\x0b\xd2\x61\x07\x83\x24\x98\ +\x25\x85\x08\x92\xdd\x15\xad\x0d\x49\x68\x91\x84\xae\xd1\x5f\xdf\ +\xcb\x2e\x7c\x6c\x7f\x55\x0d\xd8\x16\xad\x03\x5b\xb7\x07\x82\x4b\ +\xbb\x1a\x48\x85\x45\xba\x65\x22\x3c\xf2\xdd\xb6\xe8\x5b\x8d\xd2\ +\xea\x05\xd1\xe8\x78\x89\xdf\xf9\x48\x85\xbc\xd9\xb3\x5e\x4b\xbb\ +\xfc\x8b\x20\xb9\x11\x23\xc9\xd3\xb9\xb5\xb0\x22\xaf\x0a\x96\x16\ +\x56\x83\x15\x61\x21\x50\xfc\xc1\x22\x43\x12\xa8\xd0\x0e\xfe\xce\ +\x4f\x77\xf4\xa2\xa3\xfe\x6a\x92\xd0\x23\x49\x30\xd7\x78\x80\xc0\ +\x5b\x2d\x81\xad\xcb\xfd\x60\xbb\xec\x46\x96\x4e\xf1\x60\x08\x24\ +\x82\xa5\xf2\x92\x2e\xb0\xbe\xff\x34\xb8\x6f\xc9\x2e\x10\xf1\x06\ +\x1d\x35\xb0\xb0\xeb\x70\x15\xa4\xf3\x40\xe9\x62\x75\xfc\x4a\x30\ +\x7b\x1c\xdc\x27\x6a\x62\x22\x48\x7a\x20\x24\xcf\xe6\xd4\xc2\x8f\ +\xf9\x55\xb0\x1a\xb5\x12\x61\xf9\xbe\xa0\x1a\x2c\x87\xe5\x3b\x37\ +\x0f\x16\x39\xdd\x8a\x24\x24\x81\x22\x49\x4d\x58\x90\x04\xba\xc6\ +\xfd\x74\xce\x43\x47\xc1\xf6\xd8\x2c\xb0\x5d\xdc\x39\x6c\x48\x54\ +\x95\xa2\xaa\x7e\xde\x03\xd6\x0f\x9e\x01\xf7\x2d\x26\x58\xa2\x28\ +\x0d\xb3\xb8\x4f\x25\x67\x1d\xfb\xb9\x82\xc7\x79\xd3\x1b\xed\x7d\ +\xb4\x75\x84\x9b\x56\x32\xea\x26\x84\xe4\x79\x84\x64\x85\x0a\x89\ +\xa2\x55\x08\x4b\x46\x41\x0d\x58\x8e\xf0\x61\x21\x27\xe3\x39\x1f\ +\x29\x54\x48\xa8\xe3\xd1\x1f\x24\x34\x37\x25\x5c\x48\x9a\x1a\x15\ +\xc0\x22\x09\x1e\xc3\x96\x37\xda\x55\x02\xb6\x7f\x3e\x1f\x7c\x01\ +\x1f\x40\xa5\xbf\xba\x15\x61\xb9\x91\xc1\xf2\x8f\xc5\xbb\xa3\x07\ +\x16\x2a\x41\xb2\x6b\x6f\x51\xf0\x50\x8c\x06\x41\x1a\x9d\xcf\xe8\ +\xe3\x61\x2b\xe5\x16\x10\x41\xf2\x37\x84\xe4\x05\x05\x92\x55\x3e\ +\x90\xa8\x5a\x8d\xb0\x2c\xda\x52\x03\x79\x47\x5d\x8d\x40\xa1\x89\ +\x57\x3c\xe7\x0e\x07\x92\x86\xe7\xf0\x55\xcb\x41\xa2\xd4\x39\xb4\ +\x8b\x57\x45\x35\xd8\xd2\xe7\x28\xa0\xf8\xe9\x68\x0c\x41\x2a\x2c\ +\xeb\x86\x3c\xcd\x60\x61\x35\x42\x83\xef\xa0\xd5\x85\x2c\xb0\x66\ +\xe2\x7a\xfd\x29\x98\x8b\xe9\xcc\xde\x75\x5a\x7d\xd2\x58\x04\x49\ +\x4f\x84\xe4\x25\xaa\x49\x10\x08\x1e\x24\xaa\x28\xb2\x2c\xdb\x5e\ +\x03\xf9\x15\x3c\x58\x6a\xeb\xc1\x42\x35\x44\x68\x90\x04\x5e\x79\ +\x25\x74\x48\xec\x08\x82\x7f\x48\x1a\x35\x2e\x9c\xc0\xa8\x42\xfb\ +\x43\xf6\x1a\x1f\x70\x14\x71\x28\x3a\x1f\x59\x9e\x86\xc1\x3f\x96\ +\x40\x72\x5b\xaf\xec\x82\x2c\x88\x16\x57\x7e\x3d\x50\xa8\xcd\x58\ +\xab\x4f\x1a\x2b\x09\x45\x90\xbc\x12\x04\x24\xe7\x94\x5b\x05\x3f\ +\xec\x90\x61\xa9\xe7\x60\x28\x82\x85\xee\xde\x34\x42\x38\x14\xa7\ +\x0e\x04\x09\x45\x2c\xde\xf3\xfc\x89\x1a\x03\x82\x69\xa6\xae\x3f\ +\x91\xcb\x23\xa7\x5f\x85\xbb\xc0\xf6\xf7\x99\x60\xbb\x2a\x04\x50\ +\xa8\x9e\xa1\xa1\x2e\x7e\x86\xbb\x10\x2c\x35\x3f\xeb\x06\xdf\xdd\ +\xff\x06\xf4\xca\x2c\x6f\xf3\xd5\x28\x45\xac\x53\xba\xae\xf4\x99\ +\xa3\x42\xcb\x4b\x6a\xf5\x49\x7d\x11\x24\x69\x08\xc9\x6b\xa1\x40\ +\xa2\x0a\x61\x59\x86\xb0\x14\x54\x36\x86\x81\xf5\x3f\x34\xf8\x9b\ +\x3f\x11\x5c\x3c\x47\x26\x51\x84\x0a\x65\x51\x09\x55\x72\x63\x40\ +\xa0\xc6\x05\x0e\x24\x6e\x4c\xbd\x2c\xdb\xc0\x76\xf7\xf4\x30\x6a\ +\x14\x04\xa4\xdd\x60\xb0\xfd\xf9\x4e\xbf\x8b\x55\x10\x2c\xb5\xd7\ +\xf4\x84\xef\x1e\x9e\x0d\xbd\xd6\xb6\x31\x2c\x98\x02\x1a\xb2\x6b\ +\xf4\x0a\x26\x09\x09\x3a\xc9\x3e\x42\x4b\xbb\xce\x8b\x20\xb9\x05\ +\x21\x99\x85\x90\x90\xe3\x87\x04\x89\x2a\x84\xe5\xc7\xa2\x5a\xd8\ +\x52\xd5\x38\x0d\x0b\x56\x81\x21\x09\x7e\x2a\xb0\x2a\x9a\x19\x59\ +\x14\xa0\x17\x9f\x6a\x92\xfa\x90\x90\x10\x14\x33\x42\x32\x68\x4a\ +\x78\xf5\x09\x75\x4a\x26\x0d\x07\x9b\x38\x52\x5e\x14\x9c\x77\x8c\ +\xa2\x52\x04\x89\x60\xf9\x76\xcc\xbb\x90\xb6\xee\x18\xa4\xb4\x55\ +\xdf\x1e\x32\x21\x58\x9c\x77\xcb\x94\x60\x0e\x96\x62\x72\xbd\xaa\ +\x81\x22\x2b\x11\x75\x2b\x42\xf2\x56\x73\x20\x51\x85\xb0\xac\xda\ +\x85\xb0\x54\x87\x06\x0b\xa5\x65\x6d\x03\x09\xd5\x4d\x0d\x6a\x12\ +\x12\xad\x7c\xbf\xbf\x0c\x6c\xb4\xe4\x2a\xf5\x9d\xf8\x49\x9f\xfc\ +\x8a\x56\x73\xf9\xd3\x1d\x60\xfb\x23\x2a\xd0\x39\x7e\x91\x06\x35\ +\xbf\xbd\x1d\xbe\x18\xf7\x01\xf4\xd8\x58\x05\xc9\x6d\x11\x59\x08\ +\x14\xc9\xf9\xa6\x5c\xa7\xe0\x3f\x3a\xc9\xb5\x52\x03\x45\x8e\x24\ +\xb7\x23\x24\x6f\xe7\xd6\x30\x47\x6f\x16\x24\xaa\x10\x96\x95\xbb\ +\x6b\xa1\x10\x61\x69\xe4\x80\x1c\xc9\x90\x34\xbd\x3c\x11\x29\x2c\ +\x48\xb0\xce\xf1\x07\x89\xdf\xba\x89\xa6\x01\xaf\x32\x81\xed\xba\ +\x41\xfe\xf7\x52\x09\x46\x04\x48\xb0\xa0\x21\x2c\xb5\xbf\xbd\x0d\ +\xfe\xfb\xd8\x7f\xa1\xeb\xa6\x9a\x36\x80\x05\x99\xf0\x2d\xe8\x75\ +\x66\xd7\x6e\xfe\x81\x17\x86\xa8\x29\x92\x5a\xb7\xfa\x20\x24\xef\ +\x22\x24\x04\x48\x44\x20\x51\x85\xb0\xac\x40\x58\xb6\x56\xfb\xef\ +\xbd\x0f\x0e\x92\xd0\x0b\x77\x06\x09\xa7\x79\x9a\x54\x74\x34\x00\ +\x24\xa4\x93\x08\xca\xd7\x2b\x30\x9a\x74\xe7\x3b\x74\x4b\x8a\x22\ +\x0b\xa6\x79\x73\xa6\x7e\x06\x5d\xda\x60\xb1\x0a\xf4\x8d\x53\x0c\ +\x92\x76\x2b\xcf\x5e\xa5\x33\x7b\x6a\x78\x07\x5d\x08\x22\x48\xa8\ +\xc7\xbd\xbf\xd5\x05\xef\xb7\x04\x24\xaa\x10\x96\xd5\x7b\xec\xb0\ +\xa3\x16\x61\x69\xa2\xf8\x26\x87\xe5\x39\x33\x49\x2d\xdc\x79\xcf\ +\xf3\x27\x7f\x90\x90\xf6\x56\x07\x80\x84\xae\xf5\xe4\x09\xb0\x7d\ +\xf1\x03\xd8\x2e\xe9\xc6\x77\xe6\x50\x75\x75\x4f\xb0\x5d\x8e\x29\ +\x1c\xa5\x71\x34\x56\x2c\xd0\xa0\xca\x6b\x6e\x86\xea\x6b\xfb\xc2\ +\x47\x4f\x7d\x09\xdd\x36\xd7\xb6\x6e\xcd\x62\xf1\x42\x3b\x6a\xf9\ +\xd2\x99\x9c\x89\x17\xea\xc6\x40\x2a\x24\x03\x11\x92\x0f\xf3\x6a\ +\x58\x6f\x7b\x8b\x40\xa2\x68\x05\xc2\xb2\x6e\x6f\xd3\xb0\x34\x95\ +\x1a\x91\xa3\x93\xc3\x37\x3c\x3e\x90\x02\x41\x12\x74\xdf\xcb\xa9\ +\x53\x60\x5b\x69\x94\xb7\xde\xf6\xb7\x33\x57\x20\x51\x6b\xd7\xd5\ +\xf8\xfc\x5b\xc7\x40\xe9\xe4\x59\xb0\xff\x89\xd9\xb0\xff\x9e\x19\ +\x50\x4a\xfb\xdf\xd3\xe4\x2f\x9a\x2d\xc9\x7b\x1e\xe9\x6a\x84\xe5\ +\x0f\x7d\xe0\x9d\x7f\x2d\x64\x8b\x82\xb7\x5e\xef\xbd\x47\x6e\xf9\ +\xd2\x5b\xec\x7d\xf8\x07\xc4\xb7\x08\x12\x1a\x2a\x3f\xc4\xea\x84\ +\xb9\xad\x00\x89\x2a\x82\x25\x93\x60\xb1\x37\x4e\xc3\x78\x63\xb8\ +\x08\x9e\x36\x85\x84\x84\xc5\x7c\xe9\xfe\x83\x50\x3a\xee\x55\x39\ +\xaa\x34\x6c\xde\x25\x78\x02\x75\x3e\xd2\x73\x28\x72\x0c\x7a\x02\ +\x6c\x59\x79\xb0\xf7\x78\x1d\x14\x9d\x39\x09\x45\xc5\x25\x50\xfc\ +\xee\x3c\x28\xe9\xf4\x0f\x19\x22\x3f\xf5\x4b\x19\xc2\x54\x7e\xc3\ +\x10\xb8\xff\xf3\x3c\xd0\xb5\xe2\x74\x62\xd1\xec\x1a\x99\x20\x9a\ +\x9d\xe3\x79\x0f\xc6\xb3\x08\x12\x5a\x08\xe2\x2e\x84\xe4\x93\xbc\ +\x6a\x58\x83\x0e\x1c\x18\x92\x6a\x45\xbc\xc7\x42\x13\x8b\x2c\xfb\ +\xec\x6c\x1e\x8b\x2f\x2c\xf4\xbb\x0a\x0b\xf5\x96\x33\x48\xf0\xff\ +\xf5\x9c\x36\x08\x51\x8a\x16\x31\x48\x14\xed\xf7\xb8\x61\xcf\xa6\ +\x5c\x38\xd0\x7f\x12\x3a\xed\xed\x72\xea\x44\x69\xd3\x15\x3d\xa0\ +\xb4\xfd\x10\x28\x35\xdc\x83\x30\x34\x51\xa8\x13\x20\xd7\xa0\x86\ +\x3d\xc9\x96\x68\xdd\x87\xe0\xb1\x79\xfd\xb4\xdd\x44\x65\x15\xec\ +\xa0\x73\x2f\xca\x84\x92\x1b\x1f\x92\x8f\xf5\x03\x4b\xd5\x25\x9d\ +\xe1\x85\xe7\x16\x40\xd7\x6c\x7b\xab\x45\x15\xc1\x68\x9f\x99\x20\ +\x4a\xce\x74\xde\x83\xf1\x2a\x02\x84\x34\x12\x21\xf9\x2c\x48\x48\ +\xe8\xf1\x1f\x73\x8e\x31\xad\x2c\xe0\x1f\x13\xb2\xf2\xaa\x60\xd3\ +\x7e\x05\x16\x9f\x34\x8c\xd6\xfd\xa5\x31\x5d\xd4\x9f\x11\x0e\x24\ +\x04\x01\x0f\x0e\x55\x61\x41\xc2\x9a\x95\x2b\x61\x47\x45\x25\xec\ +\xb2\x6e\x83\x7d\x33\xdf\x87\xfd\x77\x4f\x87\x03\x43\xa7\xc2\xfe\ +\x07\x9f\x87\xfd\x73\x17\x42\xe9\x82\xb5\x60\xeb\x3d\x41\x2e\xf8\ +\x29\xc2\xa8\xad\x5b\x57\x62\x4a\x45\x00\x0d\x9f\xc1\x56\x9b\xdc\ +\xe7\xf5\x72\x21\xde\xe1\x70\x40\xf1\xb2\x8d\x50\xda\x73\x94\x5f\ +\x58\x8e\x5e\x71\x23\x7c\x32\x79\x0e\xa4\x6d\xa8\x68\x35\x50\xb0\ +\x3c\x79\x27\x41\x30\x7b\xe7\xf0\x1e\x8c\x47\xa9\xcb\x09\xfd\xdd\ +\xea\x80\x2f\x83\x8e\x24\x55\xb0\xd4\x74\x10\x16\x64\xed\x83\x0c\ +\xd4\x62\x63\x19\xac\xc8\xab\xe4\x1e\x17\xaa\x68\x6c\xd8\x46\x84\ +\xa5\x88\x03\x4b\xa8\xce\x4c\xc7\x13\x04\xfe\x76\x07\x0e\x1b\x92\ +\xa3\x3e\xe3\xc1\xa8\x55\xae\xaa\x0a\x8a\x76\xee\x85\x5d\x05\xbb\ +\x60\xcf\xc1\x72\x28\x39\x79\x1c\x6c\xa7\x4f\x83\x6d\x43\x0e\xd8\ +\xee\x9a\x8e\xb5\xcc\x40\xb9\x19\x99\x00\x11\x31\xd2\x4c\x9a\x05\ +\xa5\xf9\xbb\x60\xaf\xc7\xe3\xb7\x0e\x2b\xae\xf3\x42\xe9\x2a\x09\ +\x6c\x37\x8f\x91\x53\x35\x0e\x2c\x34\xc4\xe5\xf9\xf4\x45\xd0\x19\ +\x23\x8a\xd8\x5a\x11\x45\xf2\x7c\x97\x80\x54\xce\xe7\x3d\x18\x6f\ +\x22\x48\xe8\xe7\xfd\x08\xc9\x37\x08\xc9\x5a\x8e\xe3\xf2\xf4\x63\ +\xce\x51\xf8\x36\x73\x37\x7c\xb5\x6a\x07\xd3\xd7\xa8\x25\xa6\xc8\ +\xc3\x42\x0b\x53\xf8\x6b\x3a\xf6\xa7\x60\x20\xa1\xbe\x97\x50\x20\ +\xa1\x63\x09\x12\xee\xc8\x62\x8a\x08\x18\xf1\xf6\xd8\xed\x50\xa2\ +\x02\x4e\x3d\xf7\xd4\xdf\xb2\xbb\x14\x6c\x73\x17\x83\xed\xe5\x8f\ +\xc1\xf6\xda\xe7\x60\x5b\xb4\x1e\x4a\xcb\xca\x61\xaf\xd3\x89\x30\ +\x34\x38\x8f\x22\x82\xe4\xdc\xf5\x9d\x3d\x03\xb6\x1f\x8c\x60\x4b\ +\xbd\xb7\xd1\x02\x7b\x6c\x71\x8a\x6e\x0f\xc1\x5d\x19\x45\xad\xda\ +\xf2\x85\x59\xd7\x4a\x4a\xbd\x56\xf2\x1e\x8c\x27\x51\xd1\x6e\x40\ +\x3d\x94\xe3\x80\xf9\x58\x67\x04\x0b\xc9\xaa\x82\x6a\x84\xe2\x20\ +\xcc\x5b\xbb\x0b\xbe\x5e\xbd\x93\x89\x60\x99\xbf\xae\x58\x4e\xc3\ +\x38\xcf\x09\x47\x2a\x2c\xc5\xce\xd0\x61\x39\x0f\x49\x53\x4e\x78\ +\x2c\xf4\xc6\x00\x3c\x27\x3d\xa7\xa9\x41\x93\xec\xee\x8f\xaf\xc9\ +\xed\xc5\xa7\xad\x22\xc8\xd9\x01\xa0\x0c\x55\x8a\xf0\x14\x23\x50\ +\x4d\xd5\x4c\xf5\x20\xa1\xe7\x13\x70\x27\x10\xb8\x6f\x56\x80\x2d\ +\x65\xb8\x3c\xf0\x12\x23\xcb\x91\x6b\x6e\x86\xa2\x2e\xff\x84\x67\ +\x3f\xdc\x00\xdd\x4c\x8e\x56\x9d\xb3\x22\x98\x5d\x05\x09\x82\xe4\ +\x2a\xe4\x3d\x18\x2f\x52\x21\x79\x04\x23\xc9\x02\x84\x24\x93\xe3\ +\xa8\x4d\x89\x40\xf9\xc1\x7a\x94\x81\xc2\xa2\x89\x02\xca\x77\x11\ +\x06\x85\x44\xb0\x98\x6c\x0e\x28\x41\x67\x09\x16\x16\x15\x12\x9e\ +\x03\xaa\x22\x87\x0f\x76\xbb\x3a\x26\x3c\xe7\x5e\xbf\x2d\x66\x2a\ +\x24\x81\xa3\x53\x29\x82\x54\x4c\xa9\x5a\x30\x91\xc4\xf7\xb9\x98\ +\xa2\xb1\x26\xe9\xcf\x96\x81\x2d\x71\x18\x94\x5f\xd1\x03\x76\xde\ +\x34\x0a\xfe\x35\x37\x8b\x2d\xa0\xd7\x9a\x2d\x5e\x24\xc1\xec\x39\ +\x96\xa0\x33\x7b\x6c\xbc\x07\xe3\x41\x04\x49\x2a\x6a\x34\x42\xb2\ +\x10\xd3\xad\x75\x1c\x07\x0d\x24\x82\xe5\x7b\xac\x4b\xe6\xad\xdd\ +\xcd\x40\xf9\x66\xcd\x2e\x58\x62\x3c\x88\xc5\x78\x64\x52\x2f\x5f\ +\xad\x2e\xa8\x82\x9c\xb2\xe0\x60\x09\x04\x09\x39\x61\xa8\x90\xd0\ +\x39\xfd\x41\x22\xf7\xe2\x07\x07\x09\x45\x1b\xea\x40\xf5\x77\x2e\ +\xbf\xe9\x20\xc2\x52\xe6\xf1\xc2\x91\xff\x2c\x80\x82\x11\x33\x21\ +\x1d\x23\x49\x67\xb3\xab\xd5\x21\x21\x61\x5d\x6b\x4f\xd0\x49\x9e\ +\x03\xbc\x07\x63\x5d\x82\xc5\x0b\xdd\xf3\x4e\xc0\xc4\x3c\x17\x42\ +\x52\x15\x52\x24\xe1\x69\xa9\xf9\x30\x2b\xe4\x97\x48\x87\x22\x56\ +\x9f\xf0\xb4\x0a\x61\xb1\x1e\x74\xc0\x01\x9e\xf3\x28\x92\x21\xf1\ +\xdf\x8b\x4f\xf5\x45\x48\x90\xb8\x02\x45\x12\x82\x24\xb8\x79\x34\ +\xfe\x20\x61\xcd\xde\x47\x69\xd3\x22\xff\x35\x13\xdd\x28\xca\xb1\ +\xb8\xcf\x3c\x64\x87\xc9\x59\x36\xe8\x64\x74\xb4\x09\x24\x8a\x6a\ +\x30\xf5\xf2\x94\x73\x1e\x88\x6d\x61\xa1\x27\x6c\xac\x86\xee\xdf\ +\xe4\xc3\x7f\xd6\x1f\x80\xcd\xdb\x1c\x6c\x4e\x09\xcf\x31\x83\x15\ +\x45\x16\x55\xbc\xc7\x23\xaa\xc2\x6a\x30\x23\x2c\x87\x3c\x7c\x27\ +\xa2\x3b\x71\x43\x07\x54\x15\x16\x24\x14\x49\xf0\x9c\x4d\x43\x22\ +\x0f\x9f\x09\x66\xe9\xa3\xf3\x90\xf0\xce\x23\x43\x42\xd7\xc7\x7b\ +\xae\x2a\x06\x89\xdb\x0d\x99\x15\x6e\xf8\xe7\x4e\x0f\x5b\xce\x08\ +\x33\x1f\xfe\x77\xdd\x0a\x12\xcd\xae\xba\x04\x0a\x2b\xbc\x07\x63\ +\x56\xb9\xc7\x41\x44\x48\x52\x66\xaf\x84\xf6\xf7\x3e\x0b\xc3\x9e\ +\xfe\x2f\xcc\xdb\x64\x83\xf5\x08\x0b\xd7\x29\xa3\x54\x2b\x10\x96\ +\xbc\x43\x7c\x58\xe8\x6e\xcc\x77\xc2\x70\x21\xa9\x81\x22\x84\xa1\ +\xa9\x73\xca\x90\x84\x12\x49\x1a\x9f\x87\x44\x2d\x68\xc1\x42\xb2\ +\x8e\x20\xd9\xae\x74\x0e\x4b\x9c\xef\xb9\x35\x65\xf1\x00\x81\x52\ +\xcb\x7d\x30\x16\x45\x90\x6c\xaa\x81\x94\xb7\x7e\x84\xc4\xbb\x9f\ +\x84\x0e\xb7\x3f\x04\xd7\xf5\x19\x0b\x43\x66\x7e\x02\xdf\x6e\x2c\ +\x45\x58\xec\x5c\xa7\x8c\x56\xfd\x40\xb0\x1c\x71\x36\x82\x85\x9c\ +\xb6\x61\xea\x45\x4e\x28\x6f\x0d\x11\x06\x24\x4d\x44\x12\xfa\x3b\ +\x41\x69\xc3\xb4\x8c\xf7\x7c\x5f\x45\x02\x12\x92\x0a\xc9\x03\x08\ +\x09\x7d\xa7\x6d\x0e\x89\xa2\xf8\x01\x85\x20\xa1\x91\xa5\xb3\x96\ +\x43\xe2\xb0\xa9\x90\xd8\x7b\x34\x24\xf6\x1d\xcb\x7e\x12\x2c\x23\ +\x5e\xfe\x16\x16\x98\xcb\x61\xdd\xd6\x18\x83\x65\x4b\x35\xe4\x1c\ +\x76\xc2\xe1\x26\x60\xa1\xbe\x93\x60\x9d\xd0\x57\xc1\x42\x12\xb9\ +\x48\xe2\x7f\x0a\x34\x45\x92\x63\xf8\x1e\x69\xd7\xe4\xfb\xa3\x0c\ +\x12\x52\x7c\xa4\x5e\xb4\x01\xcc\x66\x8c\x24\x6f\xfe\x00\x89\x83\ +\xa7\x40\xe2\xed\x0f\xcb\x90\x28\xea\xd0\x6b\x14\xb4\xc7\xbf\xff\ +\x7d\xd6\xf7\xb0\x40\x3a\x82\xb0\xc8\xb3\x17\x63\x42\x79\x55\xb0\ +\x9c\xc1\xd2\x38\x0d\x93\x9d\xbd\x36\xa0\x13\x36\x56\x64\x21\xa1\ +\x99\x91\xcd\x85\x84\x76\x4b\x5e\x5e\xee\x86\x91\x5b\xa9\x39\x56\ +\x16\xf7\xbb\x6e\x0b\xb1\xd4\x4b\xf2\x1c\xe5\x3e\x18\x2b\xb2\xd6\ +\xc9\x35\x09\x41\x32\xe4\xf1\x46\x90\xa8\x6a\x7f\xfb\x23\xd0\x7e\ +\xe0\x64\xb8\xff\xed\xa5\xb0\xd0\x72\x14\x32\xb7\xc4\x12\x2c\x95\ +\xf0\xf5\x76\x17\xe4\x1c\xf3\x34\x8a\x2c\xa1\xa4\x5a\x24\x39\x12\ +\x45\x0e\x12\x5a\x88\x82\x77\x1e\x92\x9a\x0e\xf2\x9e\xab\x8a\xd6\ +\x6d\x3e\x82\x90\x2c\x3c\xe2\x86\x41\x85\x6e\xb6\x43\x00\xd5\x25\ +\xdc\xef\xba\xcd\xe4\x3a\x9e\x20\x98\x5c\x45\xfc\x07\x63\x44\x16\ +\x2f\xa4\x7c\xb4\x09\x12\x87\x62\xba\x75\x1b\x1f\x12\x55\xed\x11\ +\xa2\x0e\x43\x1f\x87\x87\x3e\x58\x09\x8b\x72\x8e\x21\x2c\xf2\x94\ +\xdf\x96\x50\xbd\x56\xb2\x66\xb4\x94\xad\xc8\xaf\x84\x05\x5b\x9c\ +\xb0\xac\xe8\x38\xac\x2e\x3e\x0e\x96\xa3\xde\x46\xb0\x04\x2b\x72\ +\x7e\xba\xfb\xf3\x9c\x9a\xd4\x12\x90\x94\x3a\xf9\xcf\x27\xd1\x36\ +\x19\x14\x4d\xbe\x3b\xec\x86\x01\x08\x49\x72\x54\x42\x42\x29\xa0\ +\xa7\x3c\x41\x90\x1c\xb1\xdb\x33\x8f\x29\x97\xb0\x74\x2f\x24\x8d\ +\x7d\x2b\x20\x24\xaa\xda\xe3\x71\x49\x77\x4d\x83\x31\xff\x5d\x07\ +\x8b\xf1\x4e\xbd\xb6\x30\xf2\xb0\x10\x1c\xcb\x2d\xe5\xac\xdf\x65\ +\xb1\xf1\x20\x1b\x2f\x16\xea\xa8\x63\x1a\xac\xf9\x03\x2a\x03\x21\ +\x59\xbe\xeb\x38\x64\xef\x3e\x0e\x9b\x50\xab\xf6\x1c\x87\xfc\x2a\ +\x4f\x93\x4d\xc7\x4d\x89\x3a\x09\x09\x92\xa6\x87\xba\x04\x0f\x09\ +\xad\xd2\x12\x08\x12\xaa\x99\x02\x41\x42\xfa\x06\x21\xe9\x5f\xe0\ +\x86\x94\x28\x85\x84\x24\x48\xae\x5d\x08\x8a\xd3\xc2\x7b\x30\x26\ +\x54\x70\x1a\x74\x1f\x6e\x80\xc4\x3b\x26\x9c\x2f\xde\x83\xd0\x0d\ +\xb7\x3e\x04\x29\x23\x66\xc0\xb8\x4f\x36\xc0\xe2\xdc\xc8\xc3\xb2\ +\x22\xb7\x02\xbe\x5b\x5f\x0c\xdf\xac\x29\x62\xa2\xdf\x7f\xb0\x96\ +\x73\x8f\xe5\x89\x20\x59\x86\xb5\xc9\x77\xdb\x9c\xf0\x83\x0f\x24\ +\xaa\x32\xf7\xd5\x41\x6e\x65\xe3\x34\xac\x29\x11\x24\xbb\x2b\x02\ +\x41\x42\x8e\x1d\x5c\x24\x21\x10\x78\xe7\x21\xd1\x63\x6c\x9d\x62\ +\xce\x73\x55\xa9\x90\x7c\x71\xd0\x0d\x7d\xf3\xe5\x59\xa6\xd1\x0a\ +\x09\x49\x34\x3b\xa5\x04\x2c\x9a\x16\xf3\x1e\x8c\x7a\x61\x81\x45\ +\xc3\xac\x53\x5e\xca\x80\xc4\x5b\x1e\xe4\x02\xe1\x4f\x04\x8b\x6e\ +\xc4\x53\x30\xe1\xd3\x0d\xb0\x24\x82\xb0\x50\x34\xa1\x81\x94\xea\ +\x20\x4a\x75\x7c\xd8\xc2\x4d\x25\x41\xf5\xe8\x13\x24\x4b\x08\x92\ +\xad\x2e\xf8\x91\x03\x09\x13\xfe\x7d\x2d\xc2\x52\x50\x8d\x91\x05\ +\x1d\x8e\xe7\x8c\xaa\xc8\xf9\xfd\xdd\xfd\x09\x92\x60\x1b\x03\xe4\ +\x74\xcb\xdf\xc2\x79\x81\x37\x52\x55\x21\xf9\xea\x90\x1b\x6e\xcf\ +\x73\x43\x92\x29\xba\x21\x91\xe5\x5c\x95\x20\x58\xbc\x1f\xf2\x1f\ +\x8c\x72\x11\x28\xb4\x84\xcd\xcc\x2f\x10\x94\x07\xb8\x30\x04\x12\ +\xc1\x22\x8c\x7c\x0a\x26\x7d\x26\xc3\xb2\x26\x02\xb0\xac\xca\x47\ +\x50\x30\xe5\xfa\xc6\x07\x14\xd2\xfc\xf5\x7b\x03\x82\x42\x90\x7c\ +\x8f\x22\x48\x56\x36\x05\x89\x8f\xd6\x1d\xa8\x83\x2d\x35\x4d\xc3\ +\x22\xd7\x24\x81\x21\x69\x6a\xb1\x0b\x5f\x05\x86\x84\xb3\x4e\x71\ +\x03\xf9\x42\xd2\x8b\x20\x89\xa2\xe6\x5f\x7f\x12\x24\xf7\xfc\x04\ +\xd1\xec\x9a\xc5\x7b\x30\x26\x84\x1f\x74\xf2\xbf\xe6\x43\x62\xda\ +\x3f\xb9\x20\x04\xa3\x76\x04\xcb\x88\x27\x61\xda\xb7\x16\x58\x5e\ +\x50\x03\x6b\x9a\x51\x78\xab\xa2\xd4\x6b\x3e\xa6\x5b\x5f\x29\xd1\ +\x84\xb4\x08\x23\x0a\xef\x58\x55\x04\xc9\x42\x84\x6c\xc1\x36\x17\ +\xac\x46\x48\x36\x73\xc0\xe0\x29\xab\xa4\x0e\xb6\xd6\xf2\x61\xa1\ +\x14\xa8\xa9\x39\x2a\x72\x1d\x11\x1c\x24\x74\x9e\x40\x91\x24\x10\ +\x24\x74\x7d\x34\xd8\xf3\x73\x4c\xb7\x7a\x63\xba\x15\x2b\x90\x90\ +\x74\x66\xef\xdc\x04\xbd\xc9\x39\x86\xf7\x60\x4c\x28\xff\x24\xa4\ +\xbc\xb9\x1c\x12\xd1\xd9\x79\x10\x04\xab\x76\xb7\x3e\x08\x1d\xef\ +\x7b\x0e\x66\x2c\xc8\x85\x1f\x22\x00\x8b\x5a\xcc\x2f\xdc\x74\x00\ +\x16\x6c\xd8\xc7\xd2\x2e\x56\xd0\x73\x8e\x25\xd1\xc2\x16\x0b\xf2\ +\x6b\x20\x63\x9b\x1b\xd6\xa2\xf3\x07\x0b\x89\xaa\x8d\x04\x0b\x27\ +\xb2\x34\x55\x4f\x9c\xab\x23\x82\x84\xc4\x5f\x4d\x12\x0c\x24\xd4\ +\x47\x52\x8a\x3f\x3f\x29\x73\xc3\x6d\x31\x06\x09\x93\xe4\x7e\x32\ +\x41\xb4\xba\xfb\x71\x1f\x8c\x05\xe5\x9d\x00\xe1\xdb\x2d\x90\xf4\ +\x8f\xe7\x9b\xec\x3f\x09\x56\xd7\x63\xfa\xd6\x09\x61\x79\x26\x83\ +\x60\xa9\x86\xd5\x11\x80\x85\x22\xcb\x0f\x08\x88\xbf\x94\x8b\x20\ +\xf9\x0e\xe1\x5c\xb8\xdd\x03\xeb\xd0\xe9\x43\x85\x44\x15\x45\x16\ +\x4a\xc3\xc8\x29\x7d\x9d\xb4\xa1\xa3\x9f\x83\xc4\xe7\x98\xa6\x44\ +\x2d\x57\xcd\x85\x84\xfa\x48\x68\xef\xfd\x0f\x4a\x31\xdd\x8a\x45\ +\x48\x50\x82\xc9\x7e\x6f\x82\xb8\xd9\xd1\x3e\x66\x37\x10\xc2\x3a\ +\x45\x6f\x72\xc9\x05\x3d\x81\x12\x42\xcb\x17\x4f\xd7\xdf\xf2\x20\ +\x74\xfe\xc7\xb3\xf0\xc2\xe2\x42\xf8\xb1\xb0\xb6\xd9\xb0\xc8\x6a\ +\xfa\x1c\x04\xc9\x7c\x8c\x24\x8b\x76\x78\x60\x3d\x3a\x7b\xb8\x90\ +\x90\x36\xa2\x36\x20\x2c\x05\x9c\xc8\x42\x29\x16\x39\x7c\x6b\x43\ +\x42\xe3\xb6\x76\xda\xdd\x30\xeb\x80\x1b\x6e\xce\x95\xfb\x49\xb8\ +\xdf\x63\x54\x0b\x6b\xe1\xcd\x8e\x6e\x09\xc9\x19\x70\x09\xfe\xe7\ +\x38\xff\xa0\x18\x10\x8d\xf1\x5a\x59\x06\x49\x53\xfe\x03\x89\x7d\ +\xc6\xa0\xc3\x93\xf8\x20\x04\xa3\xeb\xd3\x1e\x80\xee\x8f\xbc\x0c\ +\x2f\x2f\xdf\x0e\x2b\xb0\xb8\x8f\x0c\x2c\x8d\x45\x90\xcc\xc3\x48\ +\xb2\x18\x21\xc9\x42\x27\x6f\x0e\x24\xbe\x22\x58\x68\xb1\x0a\x2a\ +\x9a\x7d\x9d\x96\x00\x89\x1c\x24\x81\x0b\x77\x82\x84\xae\xe3\x75\ +\x84\xe4\x6f\x08\x09\xf5\x93\x70\xbf\xbf\x28\x17\x6d\x87\xd2\x61\ +\x69\xe5\x95\x09\xb4\x97\xb6\x60\x76\xc6\xf6\x2c\x47\x15\x96\x89\ +\xef\x60\xbd\x12\x7a\x53\x71\x43\xfd\xf5\xb6\x87\xa1\xfb\xa8\x57\ +\xe0\x35\x84\x65\x65\xc4\x22\xcb\x79\xd1\xea\x2f\x04\xc9\x52\x84\ +\x64\xe3\x1e\xbe\xc3\x37\x47\x46\x9b\x17\x76\xa2\x93\x36\xd5\x1a\ +\xe6\x4f\x32\x24\xfc\xe1\x2d\xa4\x26\x57\xbc\xf7\x11\x41\x42\x8b\ +\x65\xbc\xbc\xdf\x0d\x3d\x72\xe4\x61\x29\xdc\xef\x2d\x06\x24\x98\ +\x5d\x87\xd9\xda\xc3\xb4\x52\xb7\x20\xb9\x32\x58\x1a\xc3\x39\x30\ +\x66\x94\x77\x12\xc4\x25\xc5\x90\xfc\xf0\xab\x11\x83\xe5\x46\x84\ +\xe5\x8d\xe5\x3b\x18\x2c\x6c\x28\x4a\x03\x87\x0f\x47\x04\xc9\x37\ +\x05\xb5\xb0\x04\x21\x89\x54\x14\x69\x28\x4a\xc3\xb2\x11\x16\x5a\ +\x8d\x32\x14\x58\x08\x12\x6a\x32\xe6\x01\x42\x0a\x05\x92\x57\x10\ +\x92\x6e\x56\x4c\xb7\x4c\x9c\xef\x2a\x66\x44\xdb\x3e\x38\xd6\x9f\ +\xdb\xf6\x01\x41\x79\x3d\xe6\x41\x21\xe5\x62\x71\xff\x75\x3e\x16\ +\xf7\xcf\x35\xbb\xb8\x27\x11\x2c\x37\x8d\x7a\x15\x66\xff\x80\xb0\ +\x20\x28\xcd\x85\x85\x20\xf9\x9a\x20\xd9\xe9\x6d\x31\x48\x7c\x65\ +\x2c\xf3\xc2\x6e\x27\xa6\x61\x1c\x87\x6e\x28\x15\x92\xa6\x7a\xef\ +\x83\x86\x04\x23\xd9\xab\x2a\x24\x31\x1c\x49\x98\xa8\xaf\xce\xec\ +\xf9\x42\xd9\xf6\x01\x2e\x12\x25\xe7\xb8\xb8\x00\x45\x79\x0f\xba\ +\xb9\x9b\x21\x71\xf8\x53\x11\x83\xe5\x6f\x18\x59\xe6\xae\xdf\x07\ +\xab\xb7\x60\x64\x69\xe0\xfc\xc1\x8a\x20\xf9\xaa\x15\x21\x51\x65\ +\x3e\xe4\x65\xce\xeb\x0f\x16\x1a\xe3\x45\xe9\x96\x7f\x48\xfc\x0f\ +\x6f\x51\x0b\xf7\x17\xf7\xb9\xa1\x3b\xa6\x5b\x31\x0f\x09\x89\xfc\ +\xc9\xe2\x99\x44\x8c\xb0\xec\xcb\xb0\xd9\x99\x1c\x37\x7b\x38\x5a\ +\xbd\x20\x9a\x9c\xf2\x2c\x47\x9a\x9b\xd2\x7b\x14\x17\x80\x50\x74\ +\xdd\xad\x0f\xc3\xed\x93\xff\x0d\x9f\x6e\x2a\x0d\x0b\x16\x35\x92\ +\x2c\xde\xd1\xba\x90\x90\x36\x63\x0d\x44\xb0\xb0\x02\xbf\x81\x73\ +\x53\xcf\x3d\x41\xe2\x2f\xdd\xa2\x09\x59\x81\xc6\x80\x1d\x45\x48\ +\xb6\xd5\xba\xe1\xd9\x62\x37\x74\x8d\x87\x48\xa2\x0a\x7d\x29\xd5\ +\x68\xef\xcc\x20\x21\xa3\x96\x2f\xc1\xe2\x71\x72\x0f\x8e\x45\xe5\ +\xd4\xb1\xd9\x8e\xc9\x33\x3e\x6b\x76\x93\xb1\xaa\xeb\x7a\x8d\x82\ +\xde\x53\xde\x85\x2f\x36\xd9\x60\x4d\x08\x73\x59\xce\x45\x92\x10\ +\x20\xd9\xbc\xe7\x04\x6c\x2e\x3e\xc9\x7e\xf2\x1e\x0f\x55\xbe\xb0\ +\x1c\xf2\x71\x70\x4a\xa5\xfc\xb5\x6e\x11\x24\x34\xc9\xcb\x5f\xef\ +\x3d\xcd\x4a\x2c\xac\x71\xc3\xf4\x3d\x6e\xb6\xe6\x56\xac\xb6\x6e\ +\xf1\x44\xbb\x02\xf7\x90\x5b\xbc\x14\x4b\x87\x8b\x45\x8b\x77\x59\ +\x5c\xa4\x5f\xaa\xa8\xb8\x5f\x75\x10\x92\x47\xbf\x0e\x89\x69\xe1\ +\x8d\x05\xab\xa7\x3e\x63\xe0\xba\xdb\x47\x41\xff\x69\x1f\xc1\xbc\ +\xec\x32\x58\x5d\x18\xb8\x5e\x09\x07\x12\x12\x8d\x39\xa3\xce\x4a\ +\xfa\x99\x8d\xc0\xf0\x8e\x09\x55\x04\x8b\x74\x10\x61\xf1\xa9\x59\ +\x28\x52\xd0\x0c\x49\xde\x30\x97\x3d\x95\xb4\x69\x51\xd3\x90\xa8\ +\xb3\x12\x73\x10\x92\xa9\xbb\xdd\x90\x4a\x0b\xd3\xc5\x11\x24\xc4\ +\x82\x68\x71\xe5\x9d\xdb\x96\x8e\x19\xfe\x47\x6f\x72\x3e\x15\xb3\ +\x1d\x8f\x4d\x29\xff\x14\x08\x9f\x4a\x58\xaf\xcc\x80\xc4\x5e\x8f\ +\xf0\x01\x08\x45\x08\xcb\xf5\x7d\xc6\xc2\x1d\xd3\x3f\x82\xef\x2d\ +\xe5\x7e\x23\xcb\x9a\xfc\xca\xb0\x6a\x12\x6a\x30\xa0\x61\xf9\xb4\ +\xde\x31\xfd\xa4\x15\x29\x23\x15\x59\x36\x21\x2c\x56\x8c\x2c\xb4\ +\x5e\x30\x39\x3a\x39\x3c\xc1\x42\x33\x1e\x7d\x61\x51\x17\xb9\xf3\ +\x07\x09\xf5\xb8\x5b\xab\xdd\x30\x05\x21\xe9\x18\x6f\x90\x90\x08\ +\x14\xb3\x63\x4e\x42\x7a\xfa\xc5\x0a\x25\xb2\xe9\x8d\xb5\x06\x43\ +\xce\x09\xfe\x93\x62\x55\x2c\x42\x7a\x20\x79\xe6\xe7\x58\xd8\x47\ +\x00\x14\x52\x9f\xd1\x70\x5d\xef\xb1\x30\xe4\xf9\x2f\x60\x19\x3a\ +\x31\x0f\x16\x19\x12\x3b\x83\x84\xeb\xb0\x7e\x94\xb1\x71\xbf\xb2\ +\x7c\xab\x3c\x98\x72\x1e\x02\x93\xb9\xcd\xc9\x3d\x36\x1c\x65\x23\ +\x2c\x5b\xca\x79\xb0\xd0\xbc\xf7\xc0\x4b\x13\xa9\x90\x48\x55\x6e\ +\x98\x54\x14\xa7\x90\x90\x68\x11\x70\xa3\xbd\x0f\xa2\xe1\x13\x51\ +\xd0\x92\x77\xc0\x25\x98\x7e\xc5\x4f\x9d\xa2\x2a\xff\x34\x08\x5f\ +\xe5\x42\xd2\x3d\xcf\x44\x26\xaa\x90\x30\xb2\xfc\xb5\xdf\x78\x18\ +\xf6\xfc\x97\xb0\x9c\x52\x24\x9f\x29\xc5\x04\xc9\xd7\x85\x04\x49\ +\x1d\xd7\x51\x03\x69\x7e\xe6\x9e\x7a\xc3\xf3\x69\x04\x32\x9d\x97\ +\x77\x6c\xb8\xca\xde\x8b\xb0\x1c\xf5\x34\x82\x85\x7a\xee\x83\x85\ +\x64\x02\x42\x42\x6b\x3a\xc7\x25\x24\x24\xac\x4f\xc4\x35\x67\xaf\ +\x50\xf0\xf0\xb1\x8c\x8c\x9f\x08\x66\xf7\xf2\xb8\xaa\x53\x48\xca\ +\xfb\x61\x85\x3d\x45\x95\xfe\x13\x20\xb1\xdf\x38\x3e\x00\xa1\xa8\ +\xf7\x68\x84\x65\x02\x83\xe5\x07\x65\x2e\x4b\x73\x21\x21\xd1\xa2\ +\xe0\x5f\xae\xdc\x7e\x6e\x78\x3e\xc1\x42\x51\x8b\x77\x6c\x73\xb4\ +\xb9\xb8\x0e\x0a\xcb\x3d\x70\xd8\xcb\x87\xa2\xa1\x54\x48\xcc\x98\ +\x6e\x31\x48\xe2\x35\x92\x90\x58\xda\xe5\x2a\x4c\xc7\xda\x5d\xa1\ +\xc3\xc7\x30\x17\xc3\x03\x26\xc6\xe5\xc6\xa7\x58\xab\xe8\xbe\xc4\ +\xa8\x72\xef\xb3\x2c\x75\x4a\xbc\x63\x62\xc4\x60\xb9\x1e\x61\xb9\ +\x0b\x61\xa1\x11\xc2\xdf\x6e\x75\x87\x95\x6e\xf9\x2a\xab\xc8\x0b\ +\xcb\xad\xe5\xb0\x10\x53\x30\xb9\x46\x39\x0a\x1b\x77\x35\xef\x9c\ +\x3c\x51\xef\xfd\x26\x84\x65\x0b\xad\xec\x12\x00\x96\x7a\x90\xec\ +\x8a\x73\x48\x50\x06\x5a\xe3\x58\x72\x3e\x49\x8d\x5c\x0a\x1d\xf5\ +\x8d\xfa\x53\x52\x0b\xce\x70\x9f\x1c\xd3\xa2\xbe\x15\xa3\x03\x92\ +\x69\xe0\xe4\xad\x0f\xc8\x90\x44\x08\x96\x0e\x04\x4b\xff\x89\x30\ +\x74\xc6\x7f\x61\xd9\x36\x37\x64\x17\x9f\xe2\x3a\x66\x28\xda\xb8\ +\xab\x0e\xd6\x6d\x77\x42\xe6\x56\x3b\xfb\x9d\x77\x4c\x24\x44\xb0\ +\x6c\xdc\x8b\xb0\x54\x34\x0d\x8b\x0a\x09\x15\xee\x13\xe3\x3d\x92\ +\x28\x4a\xc5\x1b\x6b\xbd\xfe\x93\x86\xd6\xaf\xf8\xec\xa5\x7a\xab\ +\x67\x5b\xdc\xa5\x5f\xa4\x82\xd3\x90\xf2\xc2\x77\x18\x51\xd0\xc1\ +\x69\x94\x31\x41\x82\x0e\xde\x6c\x58\xb0\x56\x49\xbe\xf3\x51\xb8\ +\x01\x75\xff\x9b\x4b\x98\x63\x67\x47\xa0\x95\x8a\xf5\xa5\x44\xaa\ +\xb5\xcb\x8f\x08\x96\x2c\x9a\x7f\x8f\xb0\x1c\xe1\xc0\x42\x9d\x89\ +\x46\xac\x49\x68\x89\xd3\x8e\xf8\x39\xc6\x3b\x24\xcc\xf7\x2d\xee\ +\x7d\x5d\x2d\x55\x57\x29\x58\x70\x0c\xe0\x62\xbd\xe4\x78\x31\x2e\ +\xd3\xaf\xbc\x93\xa0\xfb\xc4\x04\x49\x23\x9e\x3e\xdf\x5b\xaf\xc2\ +\xd2\x37\x4c\x58\x10\x92\x94\x81\x93\x41\x37\xf8\x71\xd0\x0d\x9a\ +\x02\x89\xc3\xa6\xc3\xa8\xb9\xeb\xd1\x01\x4f\x44\x04\x96\xd6\x12\ +\xc1\xb2\x1e\x61\xc9\xf7\x81\x85\x22\x09\xf5\x93\xd0\x3a\xc0\x23\ +\x31\x52\xd2\x5e\x33\xd1\xb4\xc4\x69\x8b\x89\xb2\x0f\xc9\xf9\x59\ +\x3a\xb2\xa0\x50\xc1\x31\x80\x8b\x52\xb2\x6b\xf4\xa9\x5b\x80\x7f\ +\x92\x58\x16\xad\x01\xb6\x64\x2f\x24\x3d\xf2\x6a\xfd\x31\x60\x04\ +\xcb\x9d\x93\x42\x8e\x2c\x49\xbe\x90\x28\xa2\xff\xa7\xdc\xf3\x0c\ +\x8c\xf9\x6f\xec\xc1\x42\x73\x62\xd6\x61\x1a\x96\x8b\x35\xcb\x51\ +\x84\x85\x40\x59\x71\xd4\x0d\x77\x61\xdd\x15\xad\x0b\xd3\xb5\x84\ +\xa8\xf4\xd0\x65\xdb\x7b\xd7\xef\x68\xe4\xd8\x9f\xb3\x4a\x2e\x13\ +\x2d\x1e\x29\xee\xd2\x2f\x56\xa7\x38\xe5\x3a\xe5\x36\xdf\x39\xf6\ +\x98\x86\xf5\x47\x48\x06\x04\x0f\x0b\x41\x92\x3c\xa0\x3e\x24\xe7\ +\x60\x19\xf0\x18\xe8\xee\x99\x09\x13\xbe\x34\xc1\xa6\x56\x4a\x9f\ +\x22\x25\x8a\x2c\xeb\x68\xcd\x30\x84\x65\x35\x46\x92\x21\x5b\xa2\ +\x7f\xcd\xad\x88\x8a\xa5\x5d\x9e\x6d\xc9\x59\xf0\x73\x05\x07\x3f\ +\x96\x91\xf1\x13\x5d\xb6\xf3\x39\x43\x6e\x9c\x0c\x92\xf4\x55\xe1\ +\x19\x48\x79\xea\x63\xce\x7c\x15\xa5\x66\x19\xf8\x18\x42\x33\xbe\ +\xc1\x63\xf5\xe5\x0f\x12\x55\x04\x8b\xf8\xf7\xe7\x60\xf2\xfc\x5c\ +\xb9\xd6\x68\xe0\x90\xd1\x2a\x5a\x1e\x89\x60\x79\x6f\xa7\x17\xee\ +\x28\xa4\x49\x4b\x17\x10\x24\x28\x36\x30\x18\x4b\x0f\x2a\x41\x14\ +\x1a\xfc\x18\x86\x1c\x03\xa6\x5f\x58\xd0\x9c\xe5\x9d\x2c\xa6\xb5\ +\x05\x41\x79\xf6\x2b\x7e\x2f\x3d\x2b\xf0\x11\x92\x81\x8f\x36\x19\ +\x59\x18\x24\x0d\xd2\xad\xa6\x94\x3c\xe0\x51\x30\xdc\x97\x0e\xd3\ +\xbe\xdf\xca\xc6\x6b\xb5\x34\x2c\xcd\x2d\xfe\xd5\xeb\x7b\x7f\x7b\ +\x1d\xa4\x59\x3d\x31\xb9\x08\x44\xb3\x65\x71\x9f\x49\x35\xbb\xc4\ +\x04\x68\xd0\x1b\xdf\x94\x75\x5f\x50\x76\xb9\x4e\x72\x9b\x0d\xf1\ +\x36\xf6\x6b\xeb\x59\x48\xa1\xe1\x2c\xf5\x52\x2f\x1f\x11\x2c\x4d\ +\xa5\x61\x18\x69\x82\x85\x44\x15\xb5\x86\x75\xfc\xe7\x0b\xf0\xd4\ +\x92\x6d\x2d\x0c\x4b\x1d\x1b\xfa\x4f\x03\x35\xe9\xf7\x50\x81\x51\ +\xaf\xeb\xed\x6d\x75\xd0\x13\x21\xa1\x74\x8b\xfb\xf9\xc5\xb3\xa8\ +\x93\x51\x72\x6e\xed\x2e\x95\x5d\xae\x60\x10\x84\xd1\x68\x62\xc9\ +\x33\x30\xae\xfa\x54\x2c\x28\x0c\xad\xc9\xd3\xe6\x20\x28\xfe\xa6\ +\x0a\x2b\x69\x18\x46\x04\x16\x61\x18\x3c\x8d\x0b\xf7\x60\x45\xb0\ +\x74\x7a\xe0\x45\x78\x7a\xe9\x76\x84\x25\xf2\xf5\x0a\x75\x50\x2e\ +\xce\x2e\x83\x6f\xd7\xed\x61\xfb\xdf\x2f\xda\x5c\x0a\xeb\x76\xb8\ +\x83\x86\x45\x4d\xb7\xde\x42\x48\x6e\xc2\xcf\x28\x6e\xe6\x92\x84\ +\x28\x43\xfe\x69\x4c\xbb\xec\x93\x12\x32\xe0\x27\x0a\x05\xc1\x19\ +\xb5\x23\x8b\x16\x77\x05\xef\xa4\x31\x29\x9a\xa3\xb2\xfa\x30\x24\ +\x8d\x9b\x1d\xdc\xcc\x47\x06\x0b\x46\x96\x3b\x27\x85\x0d\x89\x2a\ +\x82\xa5\xf3\x03\x2f\xc0\xbf\x56\x16\x47\x1c\x96\xd5\x85\x35\xf0\ +\xf5\xaa\xf3\x2b\x52\xd2\x90\x97\xef\xb3\x6d\x2c\x82\xf1\x8e\xf7\ +\x15\x41\x42\xad\x5d\x6f\x22\x24\x3d\x2e\x60\x48\x48\x58\x8b\x55\ +\x74\xc9\x3a\xf6\x3b\xc5\xfd\x83\xb7\x4e\x73\xe7\xfe\x8f\x98\x6d\ +\x7f\xdb\x90\x77\x92\x7b\xe2\x98\x12\xb5\x66\xe0\xfb\x48\x79\x7f\ +\x1d\x24\x0e\x9b\x16\x78\x32\x17\x0d\x73\x41\x40\x92\x86\x4d\x87\ +\x14\x14\xcf\xf9\x43\x15\xd5\x2c\xdd\x1e\x7a\x19\x5e\xdb\x60\x03\ +\x63\x84\xe6\x98\x90\x32\xb7\x39\xd8\xd8\x30\xdf\x81\x94\x34\x44\ +\x3f\x50\x44\x51\x23\xc9\x6b\x5b\x35\x48\x0c\xb9\x27\x40\x9f\x6d\ +\x9f\x3d\x1c\x32\x42\x8b\x26\xcc\xb0\xa8\x17\x2d\x75\xd7\x09\x16\ +\x6f\x1d\x4b\x5b\x38\x2f\x10\x33\xa2\x68\xb2\xf2\x20\x24\x4d\xfc\ +\x37\x24\xf6\x0a\x30\x35\x98\x20\x1a\x34\x19\x92\xee\x7e\x0a\x74\ +\x43\x09\x92\x27\x40\x77\xd7\x93\xa0\x1b\x82\x3f\x39\x00\x84\x22\ +\x8a\x2c\x37\x8e\x7a\x15\x66\x6d\x28\x8b\x18\x2c\x59\x45\x1e\x98\ +\xb7\x76\x77\xbd\x88\xb2\x70\xe3\x01\xbf\xa0\xa8\x91\xe4\x15\x84\ +\xe4\x46\xfc\x6e\xe3\x69\x56\x62\xe8\xc2\x9b\x28\xa6\xe4\xd4\x80\ +\x15\xb0\xef\xa4\x29\x1b\x8e\xf9\x9a\x60\x74\xbf\x1b\xd3\x51\x85\ +\x20\xcf\x3f\x05\x29\x6f\x2c\x93\xc7\x77\x51\xcd\xc1\x03\x84\xa4\ +\x42\x32\x7c\x06\xe8\x7c\x23\xc9\x90\xa9\x08\x0b\x82\x43\xd0\xf8\ +\x38\x7e\x38\x4a\x42\x58\x7a\x3c\xf2\x2a\xbc\xcd\x60\x89\x4c\x1a\ +\xb6\x76\xab\x1d\xeb\x14\x1b\xd6\x28\x7b\xd8\x60\xca\xb5\x5b\xec\ +\xdc\xe3\x48\x2a\x24\x2f\x22\x24\xdd\x2f\x78\x48\xe4\x26\x61\x51\ +\x72\x2d\xe9\x94\x77\xf8\x67\x8a\xdb\x87\x61\x48\x98\xce\xec\x12\ +\x05\x4b\x9d\x3b\x66\xa3\x4a\xc1\x69\x10\x57\xd8\x20\x69\xcc\x1b\ +\xfe\x6b\x13\x06\xc9\x14\x48\x1e\x8a\x50\x70\xa3\x07\xfe\x6d\xe4\ +\x4c\x19\x9a\x46\x8f\x85\x26\x82\xe5\xa6\xf1\x6f\xc1\x87\xd2\xb1\ +\xc8\xc0\x82\xd1\x63\x03\x16\xf0\xeb\x30\x0d\x5b\xbf\xdd\xc5\x3f\ +\x06\x65\x44\x11\x24\xe9\x1a\x24\xe7\x64\x60\xeb\x2b\x78\xba\x85\ +\x1d\x4d\x54\x23\xd2\x74\x92\x6b\x61\xcc\x45\x15\x1a\x2a\x5d\x70\ +\x8a\x6d\x5d\x97\xfc\xd8\x7b\xc0\xe6\xa1\x34\x15\x4d\x54\x48\xb0\ +\x7e\xd1\x0d\xe2\x3b\x37\x13\x41\x74\x37\x46\x9b\x08\xa4\x61\x49\ +\x03\x27\xc3\xcd\x93\xde\x81\xb9\x04\xcb\x9e\x48\xa4\x61\x72\x3f\ +\x4a\x53\x29\x97\x1a\x49\x9e\x45\x48\xba\x22\x24\x71\x3f\xb8\x31\ +\x08\x51\x6d\x22\x4a\x8e\x25\xbf\x5f\xde\x9c\x68\xa2\x1a\x92\x26\ +\x64\x57\x75\xc7\xa8\xe2\xe5\xbd\x58\xd4\x89\x0a\x77\x04\x44\xbf\ +\xa1\x02\x52\x5e\x59\x04\x49\x7f\x7f\xd6\xff\xd6\x75\x4a\xba\xc5\ +\x20\xe1\x38\x74\x7d\x4d\x91\x61\xb9\x0b\xd3\xb2\x08\xc1\x92\x86\ +\xb0\x7c\x6a\xa6\xc8\x12\xb9\x02\xbf\xa1\x08\x92\x0d\xa8\x99\x5b\ +\xea\xa0\x0b\x41\xc2\xfb\xdc\x2e\x40\x51\xda\x25\x64\x3b\xba\x37\ +\x3b\x9a\xa8\x76\xad\x74\xf6\x72\xd1\xe4\xfc\xc2\x80\xb9\x3e\xef\ +\x05\xa3\x46\xd4\x7a\x81\xa0\xb0\x49\x5a\x54\xb8\xd3\x60\x47\x2a\ +\xde\xfd\x45\x92\x21\x58\x64\x07\x05\x89\x8f\x08\x92\x08\xc2\x72\ +\xeb\xa3\xef\xc0\xe7\x96\x8a\x16\x81\x45\x8d\x24\x4f\x11\x24\xf8\ +\x19\x69\x90\xc8\x52\xa3\x89\xb8\xa6\x9c\x33\xdd\x37\x5c\xa3\xa8\ +\x62\x74\x74\x10\x2c\xde\xe8\x5b\xf5\x9e\x22\x08\x8d\xd1\xa1\x15\ +\x57\x28\xcd\x7a\xfa\x73\x48\x1a\x39\x03\x12\xfb\x29\x20\xf0\x00\ +\x21\xf9\xa6\x5b\x1c\x07\x0e\xa8\x48\xc2\x82\xd7\x41\xb0\x7c\x65\ +\xa9\x8c\xe8\x88\x63\x15\x92\xa9\x85\x75\x6c\xcd\x2d\x0d\x92\xf3\ +\xa2\x52\x42\x67\x74\xdc\x18\xb1\x68\xa2\x1a\x5b\x7c\xc2\xe8\x7c\ +\xdf\x90\xdf\x4a\xbd\xf5\x14\x1d\xb6\x9c\x65\xc5\x38\xed\xac\x45\ +\xfd\x20\xec\x6f\x79\x24\xfc\x9d\xa2\x1b\x69\x53\x0d\x08\x0b\x76\ +\x40\xf2\x1b\xcb\x20\xe9\xe1\x57\x30\xcd\x1a\xaf\x00\xe2\xaf\x75\ +\x0b\xa3\xcc\xb0\xa9\x90\x4c\xcd\xbe\x1c\xc7\x0d\x5a\x11\x80\x44\ +\x15\xc1\xd2\x6b\xea\x47\xf2\x06\xa7\x11\x80\x45\x85\xe4\x71\x05\ +\x12\x1a\xe0\xc8\xfd\x9c\x2f\x40\x51\x66\x24\x98\x9d\x5f\x75\xca\ +\x83\x08\xd4\x26\x0d\x0d\xc9\xeb\x68\xb4\x5f\x2f\x5a\x3c\xd5\xec\ +\x2e\xce\xb9\x80\x88\x88\xce\x4d\xe9\xd3\xa7\x66\x48\x1e\xf3\x06\ +\x46\x88\xcf\x18\x04\x29\xef\x65\xb2\x89\x57\xba\x39\x1b\x21\xe5\ +\xdf\xab\x21\xf9\xe5\x0c\x48\x9e\xf2\x01\x24\x3d\xf4\x0a\x46\x90\ +\xa7\x59\x9d\xc1\x20\xf0\xd7\xfc\x4b\xc2\x54\x2c\x09\x23\x41\xf2\ +\x88\xa7\xb9\x0e\xdb\x96\x4a\x46\xf0\xfa\x3f\xf5\x31\xac\xa2\x3d\ +\x1c\x9b\x01\x8b\x0a\xc9\x63\x08\x49\x27\x0d\x92\x46\x12\xcc\xde\ +\x13\x29\x1b\xed\x5d\x22\x1e\x4d\x54\x4b\xcb\x82\x9f\xea\x25\xc7\ +\xf4\x8e\xdb\x5a\x68\x62\x17\x83\xc4\xcb\x20\x49\xa2\x1e\x74\x5a\ +\x5e\x88\x0a\x71\x82\x60\xe8\x13\x90\x74\xf7\x74\x74\x72\xfc\x3b\ +\x3a\x14\x1b\xe5\x4b\x8e\x4f\xd1\x83\x22\x44\x20\x40\x48\x04\x09\ +\xf5\xb6\x33\x48\x82\x88\x06\xf8\xba\xba\x01\x8f\x82\xee\x8e\x49\ +\xa0\xc3\x7a\x87\x89\xe6\x9b\xe0\xdd\x9f\x7b\x7c\x04\x94\x8c\xd7\ +\x35\x30\xfd\x6b\xc8\xf4\x71\xfc\x50\xa4\x42\x32\x01\x21\xa1\x35\ +\xb7\x34\x48\xea\x8b\x26\x25\x0a\x26\xc7\xab\xdd\xb1\xee\x56\xdc\ +\xba\x25\x0c\x2e\x4a\xcc\x3d\xfb\x7b\xc1\x52\x97\x13\xf1\xf9\x2a\ +\x04\x89\xe4\x62\x2b\xd1\x13\x10\xe7\x7a\xd0\x09\x00\x26\x02\x42\ +\x91\xfa\xb7\x86\x20\xf8\x13\xc2\x94\x84\xb0\xa5\x8c\x98\x81\x0e\ +\x19\x00\x12\x02\xa1\xdf\x78\x10\xee\x7d\x0e\x84\xc9\xff\x01\x31\ +\xfd\x5b\x10\x9e\xfb\x4a\xd6\xd8\xb7\x30\xe5\x9a\x0a\xba\xfe\x13\ +\x10\xa0\x89\xa0\x6b\xe6\x38\x30\x9e\x92\x87\x4e\x83\xc1\xcf\x7f\ +\x05\x52\x29\x70\x61\x68\x4a\x04\x09\x0d\x4b\x19\x5b\xa0\x41\xc2\ +\x13\xeb\x5c\xb4\x78\x8a\x3a\xe5\xd5\xfc\x49\x71\xe8\x16\x34\x0c\ +\x57\xa2\xc9\x75\x9b\x81\x9a\x60\x39\x17\x13\x96\xa8\xcf\x03\x7f\ +\xea\xe6\x6e\xc2\x3b\xfe\xd4\xf3\x90\x44\x4a\xf5\x20\xe1\x3b\x27\ +\x93\x0a\x08\x46\x1c\xf1\xcd\x1f\x41\xbf\x6c\x1f\xe8\xd7\x1e\x61\ +\x4d\xcd\xfa\xf5\xc7\x64\xad\x3a\x08\xe2\x0f\x07\x40\xfc\xd8\x08\ +\xe2\x6b\x8b\x41\xf7\x8f\x74\x39\xe2\x50\xa4\xe1\x9d\x33\x1c\xe1\ +\x75\xa4\x20\x2c\xc3\x5e\x98\x07\x39\x41\xc2\x42\x90\xd0\x3e\x90\ +\xa3\x14\x48\x2e\xa4\x09\x57\x41\x09\x3f\x13\xd6\xd2\x65\xac\xbd\ +\x0b\x7d\x38\x88\x89\x59\x11\x30\x6a\x52\xd3\x4b\xee\x0f\x53\x0b\ +\xb1\xd8\xe6\x5d\x54\x28\xb2\xd6\x81\x98\x5d\x0b\xba\x77\x56\x41\ +\x22\xa5\x55\x2d\x02\xc9\xe3\x81\x21\xb9\xf3\x51\x19\x90\x59\xcb\ +\x41\xbf\x64\x2f\xe8\x37\xd7\xc8\x00\x93\x94\xba\x89\x89\xfe\x4f\ +\xcb\x6d\x9a\x9c\xa0\xdf\x58\xc5\xc6\x90\x89\x1f\x66\x81\xf0\xd8\ +\xfb\x08\x0b\x46\x97\x81\x11\x02\x86\xc1\x32\x1d\x86\xbf\xbe\x08\ +\xf2\x6c\xfe\x61\xa1\xf9\x24\x99\x58\xd7\x3c\x98\x5f\xc7\x16\xcb\ +\xd6\x20\x69\x2c\x43\xc1\x19\x10\x4d\x8e\xa5\x42\xb6\xed\x17\x8a\ +\x1b\xb7\x82\x61\x54\x49\x95\xec\xed\x44\x8b\xfb\x10\x5b\x2c\x8c\ +\x73\x61\x41\x89\x86\x0f\x64\xdb\x41\x37\x1b\x21\x19\xf2\x38\x73\ +\x6a\xae\xb3\x87\x2b\x56\x93\x4c\x55\x6a\x12\x8e\x33\xaa\x22\x48\ +\x46\xbf\x01\xe2\xd7\x05\x34\x8a\x14\x81\x50\xe0\xe0\x5d\xb3\x2a\ +\x15\x1c\x82\x86\x9e\x93\x59\x0e\xe2\x9c\x8d\xa0\xbb\xef\x79\x76\ +\xbe\x88\xd4\x31\x83\x10\xf0\xbb\x9f\x82\x91\xaf\x7f\x0f\xf9\x4d\ +\xc0\x42\x91\x84\x8a\xff\xfb\xf3\xea\xd8\x12\xa7\x1a\x24\x8d\x45\ +\xc3\x54\xf0\xbb\xb2\x45\xb4\x73\x31\x68\x63\x29\x98\x63\x40\xa7\ +\xdd\x58\xd8\x63\x6d\xc1\xbb\x40\xbf\x22\x48\x36\xd5\x40\xca\x1b\ +\x4b\x59\xa1\x2e\x37\xe9\x72\x9c\x3d\x5c\xb1\x48\x82\x90\xd0\xf8\ +\xac\x40\x35\x09\xd6\x19\xe2\x47\x59\xf2\x75\x85\x03\xbe\x1a\x69\ +\x8c\x76\x10\x57\x1f\x02\xe1\x95\x45\x72\x0f\x3e\x35\x06\xf0\x5e\ +\x2f\x14\x11\x70\x08\xcb\x3d\x6f\x34\x8e\x2c\x04\xc9\x8f\x45\xc7\ +\xe1\x5e\x0d\x12\xbf\xa2\x3e\x13\xc1\xea\x1e\x35\x7c\x07\x5c\xa2\ +\x78\x6f\xeb\x9a\xb8\xe6\xec\x15\x98\x3a\xbd\xd9\x71\x6b\x88\xad\ +\x60\x0c\x92\x5a\x79\x44\x2f\x8b\x24\x91\x87\x84\x9a\x5a\x83\x2a\ +\xdc\xfb\x8e\xc3\x22\xfd\x1b\xd0\xaf\x3b\x1a\x1e\x24\xbe\x52\x23\ +\xcc\xc6\x6a\x10\xe7\x6d\xc1\xfa\x05\xa3\xcb\xc0\x48\x44\x16\x19\ +\x96\x7b\x31\x0d\x53\x23\x0b\xa5\x5b\xcb\x11\x92\x11\xb9\x5e\x0d\ +\x12\x3f\xea\xb8\x05\x40\x67\x72\xce\xeb\x94\xe7\xfc\xb5\xe2\xb6\ +\x6d\x63\x5d\x2d\x75\xd7\xe9\xad\x9e\xdd\x41\xb7\x82\x51\x4d\x82\ +\xf9\x7f\xca\x6b\x4b\xe4\xa6\xdf\x50\x5b\xaf\xfc\x0a\xcf\xd5\x7f\ +\x82\x5c\xb8\x0f\x0b\x62\x0e\x09\xa5\x5c\x8f\xbc\x06\xe2\xa2\x5d\ +\xcd\x87\xc4\x57\x04\x0c\x46\x59\xf1\xc7\x52\xd0\x3d\xf8\x72\x84\ +\xd2\xb0\x29\x20\x20\x2c\xff\x78\xe3\x7b\xc8\x2b\x01\x58\xb2\xf3\ +\x38\x0c\xcb\xc5\xd7\xc1\xd7\xd3\x20\xe1\x8b\xf9\xa4\xd5\xbb\x4b\ +\xc8\x71\x74\x68\xfd\x94\xab\xa1\xd1\xfc\x7a\x93\xbb\xaf\x60\xf6\ +\x9c\x61\x0e\xc2\xb9\xe0\x73\xa2\x48\x82\xf9\x7c\xca\xeb\x0a\x24\ +\x11\x8d\x24\x04\xc9\x78\x39\xdd\x0a\x66\xa2\x15\xa6\x5b\x02\x16\ +\xcb\xe2\x9c\x4d\x72\xea\x18\xe8\xda\xc3\x11\xc2\x27\x66\x1e\x05\ +\xdd\xa8\xd7\x23\x06\x8b\x88\xb0\xdc\xf7\x69\x36\x0c\xcd\x97\xc1\ +\xd6\x20\x69\x42\xf8\x7d\x52\x63\x93\x21\xdb\xdd\xbf\xed\x21\x51\ +\x8c\xd6\x2c\x46\x50\x26\x77\xdc\xe5\xa7\x5e\x51\x6b\x92\x97\x16\ +\xb4\x1c\x24\x77\x4d\x43\x48\x94\x59\x89\x3c\x47\x53\x45\x4e\x4b\ +\xd1\xe4\x5f\xf3\x23\x93\x72\xf9\x13\x45\xd0\xf5\x08\xcb\x23\x08\ +\x4b\x73\x5b\xc4\xe8\xba\x1f\x7c\x05\x0c\xcb\x4b\xc0\xd0\x12\x60\ +\xc7\x8b\x2c\x28\xf4\x37\x83\xd9\xf5\x46\x5a\x50\x8b\xd9\xb5\xa2\ +\x75\xca\x72\xfe\x1a\xef\x6e\x73\xb9\xf5\x0a\x8b\x24\x58\x93\x10\ +\x24\xb4\xb2\x49\xa4\x6b\x12\x4a\xb7\xd0\x91\xa8\xef\x21\xa8\xf1\ +\x57\xd4\xc3\x3e\xe1\x6d\x10\x17\xef\x69\x59\x48\x54\xd1\x6b\x20\ +\x90\xc2\xb4\xb9\xe8\xec\x61\x16\xf8\x94\x7a\x3d\xf0\x32\xe8\xe9\ +\x9a\xc3\x69\x3c\xb9\x80\x24\xf7\xbe\x3b\x97\xa7\x6c\xaa\xfe\x23\ +\x75\x92\x2b\x2e\x1a\x35\x76\x11\xc2\x92\x28\x5a\x3c\xc5\xf5\x26\ +\x79\x11\x24\x59\x95\x90\xfc\xe4\x27\x2d\x10\x49\x50\x14\x49\xd0\ +\x91\x52\x82\x9d\x79\xc8\xa2\xc9\x24\x10\xdf\x5e\x09\x7a\xa3\xa3\ +\x75\x40\x21\xd1\xeb\x64\x55\x81\x80\x9f\x43\xc8\xb0\x0c\x44\x48\ +\x30\x92\xe8\xb1\xe6\xd1\x9b\x35\x48\xfc\x89\x06\x3c\x8a\x66\x6f\ +\x6e\xdb\x34\x05\x07\x6b\x00\x17\x1b\x4c\x8e\x1e\xa2\xd9\xe5\x52\ +\xda\xae\x41\x5c\x73\x04\x21\xf9\x58\x1e\xf6\x4e\xc3\x50\x78\xce\ +\x1e\xae\x42\x85\x84\x44\x3d\xe8\xf7\xfd\x0b\xc4\xf9\xdb\x40\xdf\ +\xda\xcb\xc6\xaa\xb0\x4c\xff\x18\xaf\x25\xc8\x9a\x85\x6a\x29\x8a\ +\x24\x2b\x10\x12\x2d\xdd\xf2\x2b\xda\x85\x01\xb3\x1a\x3b\x2d\xb2\ +\x9d\x96\x95\xf5\x53\xc5\x2b\xa3\xd4\x10\x16\xd1\xec\x1c\x96\xba\ +\x0d\xc3\xdf\x5a\x84\x04\x9d\x42\x86\x24\x92\xad\x5b\x28\x4c\xe1\ +\x68\x68\x7a\x48\x90\x90\x28\xed\x7a\xec\x7d\x36\x0c\x85\xa2\x1d\ +\xef\x03\x6f\x51\x51\x67\x26\xc1\x32\x6e\x76\xe0\x61\x2f\x03\x10\ +\x92\xd1\x6f\x6a\x90\x04\x23\x2a\xde\x69\x25\x7a\xc9\x33\x09\xeb\ +\x92\xcb\x14\x6f\x8c\x6e\xfb\x33\xc0\x65\x29\x0b\x77\x4d\xd3\x3d\ +\xff\x6d\xcb\x41\x42\x8e\x14\xce\xa4\xab\xfe\x13\x41\x78\x3e\x42\ +\xfd\x26\xe1\x8a\x60\x59\x7f\x0c\x84\x67\xbf\x52\xc6\x89\x3d\xca\ +\x22\x07\x4b\x0b\xd9\x88\x65\x04\xe8\x0e\xbc\xce\xa9\x73\x41\xbf\ +\xd2\xa6\x41\x12\x8c\x68\x9e\x92\xe4\x7a\xb3\x8b\xd5\xf1\x2b\xc5\ +\x0d\xa3\xdf\xf4\xb7\x8d\xfd\x43\x87\xfe\x13\x57\x24\xe1\x97\x1e\ +\x51\x48\xe8\x5c\xe8\x40\x34\x54\x3e\x2c\x48\x48\x7d\xc7\x83\x38\ +\x1b\xeb\x13\xc9\xd9\xb6\x0e\xc8\xd2\xb0\x4a\x36\x6c\x46\x98\xf9\ +\x05\x08\xa3\x66\x81\x6e\xc4\xd3\x20\xdc\xf7\x02\x08\x4f\x7f\x8e\ +\x7f\xcf\x97\x07\x63\xf2\x9e\xab\xc9\x47\x2e\xe8\xb8\x9d\x1a\x90\ +\x5c\x1f\xa7\xe6\x7b\xfe\x4f\x71\xc1\xe8\xb7\xd4\x5e\x0f\xff\x5f\ +\x87\xde\x63\x96\x26\xf6\x1d\x77\x82\xeb\xec\xe1\x8a\x20\x19\x30\ +\x09\x92\x86\x3f\x55\x7f\xcd\xad\x50\x44\x77\x6c\xfc\x29\x7e\x6e\ +\x6d\xfd\xfa\x84\x27\x02\x95\x5a\xb0\x10\x18\x16\xe1\xd6\x1c\x06\ +\xfd\xda\x72\xf9\xff\x34\xe8\x52\x8b\x24\x01\x45\x73\xa3\x44\x8b\ +\x67\x81\xde\x5c\xf7\x17\xc5\x05\xa3\xdf\x3a\xf6\x1c\xfd\xfb\x0e\ +\xbd\xc7\x2e\x49\xec\x3b\xfe\x64\xd8\xdb\xbd\xf1\xe4\x0b\x09\xeb\ +\x27\xe1\x40\x10\x8c\x28\xbd\x19\xfe\x34\x88\xdf\x14\xca\xa1\x9a\ +\xf3\xc1\xb7\x89\x08\x88\x86\xe2\x1d\xa7\xa9\x9e\xd8\xce\x70\xd6\ +\xe3\x9b\x53\xcd\xc7\x93\xa2\xb7\x85\xab\x81\x75\x4a\x1b\xf3\x6b\ +\x8c\x24\x2b\x5a\x06\x92\x47\x59\x67\x22\xd7\xf9\x43\x11\x81\x32\ +\x62\x66\xf4\x81\xa2\x29\x64\xb1\xbe\x12\x8b\xc7\x48\x0b\x34\x36\ +\xb9\xcd\x75\x34\x5a\x7b\x02\xa5\xef\x98\x15\xc9\x58\x9c\x72\x1d\ +\x3e\x1c\x29\x91\x24\xb9\x39\x51\xc4\x57\x94\x7a\x61\x6d\x23\x7e\ +\x95\xa7\x81\x12\xc3\x22\x48\x30\xdd\x92\x21\x89\x95\x48\x72\xce\ +\xd2\xd3\x2f\xee\xd0\x77\x5c\x07\x8c\x2a\xd6\x64\xea\x58\xe4\x39\ +\x7e\x28\x22\x48\xee\x24\x48\x22\x10\x49\x54\x11\x28\x03\x1e\x03\ +\xf1\x33\x8b\xbc\x92\x0b\xe7\x4b\xd0\x14\xdd\xa2\xd1\xc0\xa2\xb5\ +\xce\x98\x62\x39\x11\xfe\xa2\xda\x51\x60\x17\x25\xdf\xf6\x50\x72\ +\x87\xde\xe3\x10\x16\xda\x96\x9a\x03\x40\x30\x22\x48\x06\x62\xba\ +\x45\x35\x09\xcf\xe1\x9b\xa3\x3e\xe3\xd8\x34\x5e\xb6\x04\x12\xe7\ +\x8b\xd0\x14\xbd\x62\x90\x98\x3d\x92\xde\xe8\x36\xc4\x54\xba\xd5\ +\x84\x5d\x94\xdc\x6f\x2c\xc2\x32\x26\x27\x29\x1c\x58\xd4\xc2\xfd\ +\xee\x66\xae\xb9\xc5\x13\x45\x94\xfe\x13\x40\xfc\x68\x23\x16\x81\ +\x6d\xd0\xd9\xa8\x29\x6c\xb1\xd6\x2d\xb3\x3b\x53\x90\x5c\x42\x3c\ +\x40\xa2\xda\x45\xed\x6f\x1b\x2f\xb6\xef\x33\x76\x77\x12\x2d\x8e\ +\xcd\x03\x82\x27\x16\x49\x1e\x83\xe4\x7b\x66\x9e\x6b\xca\x8d\x9c\ +\xf0\x7c\x34\x62\xf8\x99\x2f\x40\xbf\xe6\x50\xdb\x75\x36\x6a\x0a\ +\x4d\x16\x0f\x18\xb0\x9e\x14\x25\xcf\xe7\x1d\x73\xed\xd7\xc7\x72\ +\xba\xd5\x84\xc1\x45\x1d\xfa\x8f\xe9\x9c\xd8\x77\xcc\xe1\xa4\x7e\ +\x41\xc0\xa2\xa4\x5b\xc9\xf7\x3c\xd3\x72\x90\xcc\xfc\x9c\xad\xa2\ +\xa2\x35\xbf\xc6\x88\x08\x12\x1a\xe4\x28\x39\x3f\x10\x2c\x55\xd7\ +\x46\xe3\x48\xe0\xc8\x18\x16\xf8\x49\xbd\x47\x77\xeb\xd0\x7b\xf4\ +\x11\xbf\xb0\x20\x24\x49\xe8\xcc\x29\x7f\x7f\xae\x65\x20\xb9\x63\ +\x92\x3c\x6c\x85\x96\x1e\xd2\x20\x89\x0d\x61\xc4\x67\x9b\xed\x9a\ +\x1c\x1f\xea\x25\xcf\x1f\x14\x8f\x8a\x67\x43\x58\xee\x18\xdd\x2d\ +\xb1\xef\xe8\x43\xb4\x4f\x3b\x0f\x94\x0e\x7d\xc7\x7a\x93\x06\x3c\ +\x5a\x2e\x44\x60\x93\x9e\xfa\x52\x20\x79\x71\x01\xe8\x37\x54\x6a\ +\x90\xc4\x88\x52\x69\x87\x5e\xb3\xfb\x98\x60\x74\x8e\xea\x61\x3c\ +\x7b\x65\xfc\x46\x92\x86\x86\x91\xa5\x7d\xef\xd1\xfd\x13\xfb\x8c\ +\x75\x24\x35\xd8\xbf\xbd\x43\x9f\x31\x5e\x2c\xfa\x0f\xe9\x06\x3f\ +\x71\x86\xef\xec\x61\x8a\x22\x13\x4a\x7c\x63\x19\x5b\xc8\x5b\x83\ +\x24\x36\xc4\x5a\xb6\x2c\x5e\xab\x21\xdb\xd5\xbb\x53\x1e\xfc\x8f\ +\xe2\x41\x17\x8e\x0d\x1f\x3e\xfc\x27\x89\xb7\x8f\x1a\xd0\xc1\x07\ +\x16\x06\xc9\x9d\x13\x0f\x46\x1e\x92\xc9\x6c\x3c\x98\x38\x7b\x85\ +\x06\x49\xac\x08\x53\x2d\x2a\xda\xf5\x92\x6b\x99\xb0\xd1\x25\xd0\ +\xfe\xa1\x8a\xeb\x5c\x78\x46\xb0\x74\xe8\x3d\x66\x60\xfb\xbe\x63\ +\x5d\x08\xcc\x09\x84\xa4\xa4\xc5\x20\x79\x0b\x21\xd9\x5c\xab\x41\ +\x12\x03\x62\xdb\x57\x9b\x9d\x6e\xd1\x62\x7f\x9a\x2d\x2b\x14\x7f\ +\x2d\x5b\xa1\x1b\xc1\xd2\xbe\xcf\x98\x7e\x89\x77\x4e\x2a\xc5\x9a\ +\xe4\x2c\xd7\xd9\xc3\x95\x0a\xc9\xbb\x6b\xe4\x61\xf4\x9c\x2f\x45\ +\x53\x74\x89\x56\x4a\x11\x25\xf7\x6e\xac\x47\x06\xd3\x1e\x3c\x8a\ +\x9b\x68\xc6\x0c\x61\x11\x86\x4e\x1e\x84\xce\xed\x88\x58\x01\x4f\ +\x90\xd0\xf2\x43\xff\x5e\x2d\x0f\x5d\xe7\x7c\x29\x9a\xa2\x48\x94\ +\x6a\xb1\xf9\xed\xee\x0c\x1a\xfd\x3b\x1c\x2e\xe0\x54\xcb\x9f\xa5\ +\xa5\xa5\xff\x34\x79\xf0\xe4\xb1\xb4\xb6\x56\xc0\xe5\x85\x02\x49\ +\x85\xe4\x1d\x0d\x92\x58\x50\x6a\x1e\xeb\x1b\xa9\xd5\x99\xdd\x0f\ +\xb1\x7d\x4a\xb4\x54\xcb\xbf\x25\x27\xa7\x5f\x92\x32\x64\xf2\x78\ +\x91\x96\x19\x0a\x17\x16\x75\x8e\xc9\xfb\x99\x1a\x24\xd1\x2e\x6b\ +\x9d\x12\x45\x5c\x8b\x45\x93\x4b\x47\x1b\x53\x29\xae\xa0\x59\x20\ +\x13\x7b\x4f\xbd\x22\xf9\x8e\xc9\x4f\x09\x43\xc2\x80\x85\xcd\x2f\ +\x41\x48\xde\x43\x48\xb4\x65\x7c\xa2\x57\x34\x5c\xc8\xea\xa1\x5a\ +\x64\x67\x8a\xd1\x35\x92\x2d\xfe\xa0\x45\x91\xd0\x8d\x60\xd1\x0d\ +\x7c\xe2\x39\xc3\x70\x5a\x79\x9e\x03\x04\x4f\xb4\x25\xc2\xbd\x33\ +\x3d\xba\x39\x9b\xdc\xb4\x4c\x8d\xde\xac\xb5\x6e\x45\x9f\x3c\x4a\ +\x9a\xe5\xaa\xd1\x9b\x9d\xcf\x76\x33\xbb\xfe\xf7\x82\x6e\xf6\x8d\ +\x84\x31\x58\x06\x4d\x49\x37\x60\x1a\xc5\x05\xc3\x47\x02\xa6\x6a\ +\x29\x83\xa6\x14\xa7\xf4\x1d\x33\x4c\xbf\xe6\x98\x41\x34\x7b\x33\ +\x04\xb3\xfb\x4c\x54\xcc\x83\xd7\xc4\xc4\x76\xb7\x32\xbb\x5c\x82\ +\xc9\xb1\x88\xb6\xa9\xbe\x20\x3b\x0f\x5b\xca\xf4\x83\xd3\xaf\x11\ +\x86\x3c\xf1\x96\xfe\xee\xa6\x77\xc7\x62\x90\x0c\x9e\x52\x9c\x34\ +\x60\xd2\x48\x6a\x3d\xa3\x10\x4e\xcd\x8a\xfa\xcd\xd5\x37\xe9\x4c\ +\x9e\x95\x82\xc9\x75\x46\x1b\x42\xdf\x86\xa2\x3a\x04\x21\x11\x24\ +\xf7\x06\xda\xc2\xf0\xda\x05\x65\x5a\xb1\xde\x12\x96\xdc\xe7\xf1\ +\x5f\xa6\x0c\x79\xe2\x6d\x91\x03\x0b\x41\xa2\x1b\x3c\x79\x6f\xca\ +\xe0\xc9\x32\x24\xbe\xa6\x00\xa3\xac\x54\x99\xc3\x76\x2e\xa6\xf5\ +\xb3\x78\x5f\xa6\xa6\xc8\x4b\x01\x04\x3f\xfb\x8d\x86\x6c\x57\x2f\ +\x06\x48\x1c\xcd\x1b\x89\x4a\x13\xee\x9c\xf1\x0b\xdd\xc0\xc7\xff\ +\xed\x0b\x0b\x83\x64\xd0\x94\x7d\x49\x83\x27\x0f\x69\x04\x89\xaf\ +\x21\x30\xed\x56\x16\x5f\x9a\x6a\x75\xde\xac\x93\x5c\x6b\x30\x3f\ +\xc6\x08\xa3\xa5\x64\x2d\x26\x02\x84\x76\xdb\x35\xbb\x36\xd3\x52\ +\xa6\x7f\xa6\x42\x5d\x03\xa4\xf5\x8c\x45\x96\xc1\x4f\xbc\x4b\xb0\ +\xc8\x35\xc9\xe3\xfb\x53\x06\x4e\x1e\x46\x03\x2c\x95\x43\xfc\x1b\ +\x02\x43\x79\xb1\x2e\xc7\x99\xa6\x33\x7b\x32\x45\xb3\xfb\x34\x5b\ +\x0f\x59\x2b\xfa\x23\x23\x5a\x7c\x1d\x3f\xd3\x14\xc9\xb3\x56\xb4\ +\xda\xfb\xa6\x65\x95\x20\x20\x41\x7e\x37\x9a\x45\xd6\x92\xfb\xa4\ +\x53\x1a\x36\x47\x37\xe8\xf1\x23\xe2\xc0\x47\xfb\x85\xf5\x45\x28\ +\xc0\x88\xa6\xda\x54\x9d\xc5\xf3\x12\x46\x98\x83\xa9\xf9\xa7\xb4\ +\x31\x60\xe1\x08\x3f\xb3\xd4\xdc\x93\xd4\xcc\x6b\x17\x4d\x8e\x39\ +\x06\x93\xa7\x4b\xa7\xbc\xc3\x3f\xd3\x00\x89\x02\xeb\x34\xfc\xb1\ +\x3f\x25\xdd\xf5\x44\x6a\xb3\xe7\x24\x20\x30\xd4\x34\xd9\x39\xc7\ +\xfb\x47\xfc\x92\x1f\xd6\x5b\x5c\x05\x2c\xc2\xb4\xc5\x42\xdd\xb1\ +\x26\x96\x5e\xd1\xe7\xe4\x2a\xa0\xcf\xae\x53\x76\xcd\x9f\xd8\x90\ +\x13\xfc\x4c\x95\x4f\x57\xb3\x28\xb1\xc8\x7e\x21\x98\x43\x53\xaf\ +\x70\xaa\xd1\xde\x59\x34\x7b\x5e\xc1\x3b\xe4\x51\xb6\xa7\x8b\x16\ +\x65\xce\xcb\xe2\xa5\xba\xe3\xac\xde\xec\x2c\x47\x40\x3e\xed\x98\ +\xed\xe8\xde\x69\x39\x45\x0f\xad\xfe\xb8\xf0\x8c\xee\x88\x20\x43\ +\xa3\x37\xd6\xde\x2a\x9a\x1d\x73\xd1\x49\x6a\xd8\xb0\xef\x0b\x11\ +\x1a\x06\x87\x1b\xe1\x70\x1d\xd1\x9b\x1d\x0b\xf5\x92\x73\x28\xf5\ +\xa2\xb3\x4e\x42\x2d\x7a\x68\xc6\xec\x1c\x34\x59\x3f\xa5\xbb\xa7\ +\x68\xf2\xcc\x12\xcc\xee\x03\xac\xf8\x27\x68\xe2\x11\x1c\xf5\x7d\ +\x59\xdc\x20\x5a\xdc\x65\x6c\x45\x78\xc9\xde\xaf\xbb\x54\x76\x79\ +\x42\x46\x86\x06\x87\x66\x81\x0c\x1d\x84\x52\x0c\xbc\x93\x76\x31\ +\xba\x0d\x29\x52\xed\x28\xc1\xe2\x5a\x24\x9a\x5c\x5e\xd6\x99\xc9\ +\xa0\x89\x45\x70\x14\x30\x30\xa5\xc2\x94\xb3\x5c\x30\x3b\x97\xeb\ +\x8c\x35\x8f\x76\xb1\x1e\x6f\xdf\x61\x69\xe5\x95\xec\x3d\x6b\x70\ +\x68\x16\xb6\x91\xf3\xc8\x4e\x74\x31\x3a\xd9\x2d\xc2\x66\xfb\x04\ +\x51\x72\x7e\x2d\x98\x3d\xbb\x30\x8f\x3f\x2d\x77\x6c\x46\x23\x38\ +\x04\x06\xab\x35\x4e\xa7\xe0\xb5\x0a\x92\x63\x3e\x6a\x0a\xed\xbb\ +\x9e\xbc\x03\x7e\xae\x81\xa1\x59\xcb\x9a\x9c\xa6\xc9\x42\x67\x13\ +\x4c\xae\xdb\x75\x92\x7d\x12\xde\xa5\x31\x5d\x73\xad\x42\x98\x8e\ +\xb7\x49\xaa\x26\x61\xf1\x6d\x71\x1f\xc3\x48\xb1\x9a\xae\x45\x34\ +\x3b\xc7\xe3\xcf\x6e\xc9\xb4\x85\xb4\xef\x35\x6b\xa6\x59\xdb\x9a\ +\x8f\x33\xa2\x84\xac\xaa\x6b\x45\x93\x7b\x80\x21\xdb\xf1\x80\x6e\ +\xb3\xfd\x79\x41\xf2\x7c\x8a\x77\xf7\xc5\x18\x8d\x36\xe0\x9d\xbd\ +\x40\x27\x79\x0e\x60\xf1\x5c\x4b\xe2\x39\xbe\xfa\x18\x89\x8e\xa5\ +\xe7\xd0\x73\xe9\x1c\x78\xae\xcf\x10\xc6\xb7\x74\xd9\xf6\x49\x82\ +\xd5\x79\xb3\x90\xeb\x12\xda\xad\xac\xba\xea\x3c\x0c\x24\xcd\x22\ +\x63\x09\x09\xff\x0f\x9c\xde\x0a\xa0\xc6\xa1\xfa\x53\x00\x00\x00\ +\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +" + +qt_resource_name = b"\ +\x00\x07\ +\x07\x3b\xe0\xb3\ +\x00\x70\ +\x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x73\ +\x00\x05\ +\x00\x78\x40\x98\ +\x00\x71\ +\x00\x6c\x00\x79\x00\x72\x00\x78\ +\x00\x08\ +\x0a\x61\x5a\xa7\ +\x00\x69\ +\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ +" + +qt_resource_struct_v1 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ +\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +" + +qt_resource_struct_v2 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x74\xe4\x44\x3e\x4b\ +" + +qt_version = QtCore.qVersion().split('.') +if qt_version < ['5', '8', '0']: + rcc_version = 1 + qt_resource_struct = qt_resource_struct_v1 +else: + rcc_version = 2 + qt_resource_struct = qt_resource_struct_v2 + +def qInitResources(): + QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources()