From 1326ec7429526ad538a7c64f89d499dd09ddee27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 07:52:52 +0000 Subject: [PATCH 01/74] [upd] web-client (simple): Bump ionicons in /client/simple Bumps [ionicons](https://github.com/ionic-team/ionicons) from 7.4.0 to 8.0.8. - [Release notes](https://github.com/ionic-team/ionicons/releases) - [Commits](https://github.com/ionic-team/ionicons/compare/v7.4.0...v8.0.8) --- updated-dependencies: - dependency-name: ionicons dependency-version: 8.0.8 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- client/simple/package-lock.json | 138 ++++++++++++++++++++++++++++++-- client/simple/package.json | 2 +- 2 files changed, 131 insertions(+), 9 deletions(-) diff --git a/client/simple/package-lock.json b/client/simple/package-lock.json index 98f326728..9ebd69257 100644 --- a/client/simple/package-lock.json +++ b/client/simple/package-lock.json @@ -18,7 +18,7 @@ "eslint": "^9.25.1", "filemanager-webpack-plugin": "^8.0.0", "globals": "^16.0.0", - "ionicons": "^7.4.0", + "ionicons": "^8.0.8", "leaflet": "^1.9.4", "less": "^4.3.0", "less-loader": "^12.3.0", @@ -1766,9 +1766,9 @@ ] }, "node_modules/@stencil/core": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.26.0.tgz", - "integrity": "sha512-+0Inu+dJ9/LgWSskcZwx7v17v4GILcwIYxNgD+OuK0U+D5z61WsxWw7yHkYG5OqGPBijsJMVssYRx/Tn+e7F9A==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.31.0.tgz", + "integrity": "sha512-Ei9MFJ6LPD9BMFs+klkHylbVOOYhG10Jv4bvoFf3GMH15kA41rSYkEdr4DiX84ZdErQE2qtFV/2SUyWoXh0AhA==", "dev": true, "license": "MIT", "bin": { @@ -1777,8 +1777,130 @@ "engines": { "node": ">=16.0.0", "npm": ">=7.10.0" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9" } }, + "node_modules/@stencil/core/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@stencil/core/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@stencil/core/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@stencil/core/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@stencil/core/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@stencil/core/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@stencil/core/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@stencil/core/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -4217,13 +4339,13 @@ } }, "node_modules/ionicons": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.4.0.tgz", - "integrity": "sha512-ZK94MMqgzMCPPMhmk8Ouu6goyVHFIlw/ACP6oe3FrikcI0N7CX0xcwVaEbUc0G/v3W0shI93vo+9ve/KpvcNhQ==", + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-8.0.8.tgz", + "integrity": "sha512-CRHhDQA5vsNxC7raeEPqddgO90iR2F13VZS7hB0Vx7JrxJMM2060E3ddgYbpMQNJjzeBsgpkNwdBeK5qQ7RbLA==", "dev": true, "license": "MIT", "dependencies": { - "@stencil/core": "^4.0.3" + "@stencil/core": "^4.30.0" } }, "node_modules/is-arrayish": { diff --git a/client/simple/package.json b/client/simple/package.json index f7791e9ef..5eeffb688 100644 --- a/client/simple/package.json +++ b/client/simple/package.json @@ -16,7 +16,7 @@ "eslint": "^9.25.1", "filemanager-webpack-plugin": "^8.0.0", "globals": "^16.0.0", - "ionicons": "^7.4.0", + "ionicons": "^8.0.8", "leaflet": "^1.9.4", "less": "^4.3.0", "less-loader": "^12.3.0", From 409ede153097ff8e0d4cce028b611a790e44b166 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Fri, 9 May 2025 12:08:44 +0200 Subject: [PATCH 02/74] [fix] simple client: jinja_svg_catalog addClassesToSVGElement Starting with ionicons-8.0.8 the SVG already contains a class attribute and instaed of using SVGO plugin ``addAttributesToSVGElement`` we habve to use ``addClassesToSVGElement`` to add out ``__jinja_class_placeholder__``. Signed-off-by: Markus Heiser --- client/simple/tools/jinja_svg_catalog.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/simple/tools/jinja_svg_catalog.js b/client/simple/tools/jinja_svg_catalog.js index 0adffa5af..e3e8f1216 100644 --- a/client/simple/tools/jinja_svg_catalog.js +++ b/client/simple/tools/jinja_svg_catalog.js @@ -51,11 +51,13 @@ function jinja_svg_catalog(dest, macros, items) { (item) => { /** @type {import("svgo").Config} */ + // JSON.stringify & JSON.parse are used to create a deep copy of the + // item.svgo_opts object const svgo_opts = JSON.parse(JSON.stringify(item.svgo_opts)); svgo_opts.plugins.push({ - name: "addAttributesToSVGElement", + name: "addClassesToSVGElement", params: { - attributes: [{ "class": __jinja_class_placeholder__, }] + classNames: [__jinja_class_placeholder__] }} ); From cbf9ec7bf48adee105ee3b130dd4b00664c78e41 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Fri, 9 May 2025 12:14:39 +0200 Subject: [PATCH 03/74] [fix] static.build.commit: add missing searx/templates/simple/icons.html Signed-off-by: Markus Heiser --- utils/lib_sxng_static.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/lib_sxng_static.sh b/utils/lib_sxng_static.sh index 4a1fffaab..b10af3b40 100755 --- a/utils/lib_sxng_static.sh +++ b/utils/lib_sxng_static.sh @@ -4,6 +4,7 @@ STATIC_BUILD_COMMIT="[build] /static" STATIC_BUILT_PATHS=( + 'searx/templates/simple/icons.html' 'searx/static/themes/simple' 'client/simple/package-lock.json' ) From ef158ce1f41647a5da0a2f22d82cbc03db030953 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Fri, 9 May 2025 12:15:36 +0200 Subject: [PATCH 04/74] [build] /static --- searx/templates/simple/icons.html | 58 +++++++++++++++---------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/searx/templates/simple/icons.html b/searx/templates/simple/icons.html index 2ef37dd26..151b1b49b 100644 --- a/searx/templates/simple/icons.html +++ b/searx/templates/simple/icons.html @@ -7,35 +7,35 @@ template. This file from: {%- set catalog = { - 'alert' : '', - 'appstore' : '', - 'book' : '', - 'close' : '', - 'download' : '', - 'ellipsis-vertical' : '', - 'file-tray-full' : '', - 'film' : '', - 'globe' : '', - 'heart' : '', - 'image' : '', - 'layers' : '', - 'leecher' : '', - 'location' : '', - 'magnet' : '', - 'musical-notes' : '', - 'navigate-down' : '', - 'navigate-left' : '', - 'navigate-right' : '', - 'navigate-up' : '', - 'people' : '', - 'play' : '', - 'radio' : '', - 'save' : '', - 'school' : '', - 'search' : '', - 'seeder' : '', - 'settings' : '', - 'tv' : '', + 'alert' : '', + 'appstore' : '', + 'book' : '', + 'close' : '', + 'download' : '', + 'ellipsis-vertical' : '', + 'file-tray-full' : '', + 'film' : '', + 'globe' : '', + 'heart' : '', + 'image' : '', + 'layers' : '', + 'leecher' : '', + 'location' : '', + 'magnet' : '', + 'musical-notes' : '', + 'navigate-down' : '', + 'navigate-left' : '', + 'navigate-right' : '', + 'navigate-up' : '', + 'people' : '', + 'play' : '', + 'radio' : '', + 'save' : '', + 'school' : '', + 'search' : '', + 'seeder' : '', + 'settings' : '', + 'tv' : '', 'information-circle' : '', 'newspaper' : '', } From 77b78fab043997bcde916f6901522e0cb39faa64 Mon Sep 17 00:00:00 2001 From: kevadesu Date: Fri, 9 May 2025 17:39:56 +0200 Subject: [PATCH 05/74] Branding --- README.rst | 2 + .../themes/simple/img/empty_favicon.svg | 2 +- searx/static/themes/simple/img/favicon.png | Bin 5036 -> 18883 bytes searx/static/themes/simple/img/favicon.svg | 27 ++++++++++- .../themes/simple/img/img_load_error.svg | 42 +++++++++++++++++- searx/static/themes/simple/img/searxng.png | Bin 8692 -> 10181 bytes searx/static/themes/simple/img/searxng.svg | 37 ++++++++++++++- 7 files changed, 106 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 20c9175bb..e43437b55 100644 --- a/README.rst +++ b/README.rst @@ -10,6 +10,8 @@ ---- +Fork of SearXNG. The globe icon for empty_favicon.svg in searx/static/themes/simple/img/ belongs to the Noto Emojis font by Google + Privacy-respecting, hackable `metasearch engine`_ Searx.space_ lists ready-to-use running instances. diff --git a/searx/static/themes/simple/img/empty_favicon.svg b/searx/static/themes/simple/img/empty_favicon.svg index 580025e32..d390e6522 100644 --- a/searx/static/themes/simple/img/empty_favicon.svg +++ b/searx/static/themes/simple/img/empty_favicon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/searx/static/themes/simple/img/favicon.png b/searx/static/themes/simple/img/favicon.png index 15fcd6fa1a35bc33a19a713f03c9c4f9ed44c32c..8e2200b942d9f5340a1c6e4cb2a40d18bff4408a 100644 GIT binary patch literal 18883 zcmW(+Wk4HE6GlUT06~hoQ!KbkaCZvD-L<%Tkm62pheCk@#VM|(xVyEu7T1sW`*A;V zH#f68vpaM1?2~9U6AmHuJI8fog2dFM`AKl>K&~g8} z;NiaH5Wd}nchiuSfU6lNJ$Uzf%pwgITio z1%Qh23gL>jL4D3R7ox>(mpD)uUkHK;D+w4IYYf}nN``KIq2F>>)F8VsZ{as+=7nN2 zQJ{;KcJrw?(%4X}o}pu0W8~{X0+mnX)}Zrt%%6uQWHYh#kHpM3@B{Yp*{<2H-RNl<3m{tLh6W!zb93B2nL{=j5xrL0wMtjRwyNSK#leGb_ImmHd2HjKP`>%7(~rdh$TOr=kYIcF=a;;@i5sM#njjA5?-34&=7cQ8Ik*5u z4S-QGce28uxWEZy5|YdOne?K+HWM&9Z68nhU0IDDG|fL*=-{X28Mau_+s1UAVE-BK zzG72N3xc4eY4q<8Tzg&7u_z~@-|T9a;j3fA>l#t>i^YJ0qkw}9UfZ2kI=wdc+?O89FSw+FlDcJL{0l*= z8(0;O4=Q>d4G{tKo8rN)qhpYpQo;p6ns|zNK7hyT+y??vGYh zg;PqSS*T_|r`%`}VJt&hYJ17!^tOQ*nfUX8z@VDH))%y79`d zskkL1(uYk{#-OmBQ-aF0r?dUuTdEZ9D;5GH-#Ey%E*Z~}7#k!2;J{AvM@*6(s2XJP#!!8;VvXw~k<^A@Au1MW46|CsD=~ zjYg3Tg)DjzbBX&HJIgjC4aikdhep_!MHRd+F{9ta2p>!lsz2(&CUt3;12a-!&N8Ly z7l#oTZ7=;$P8gyYkU+=J@Ict@mQtIxVT2$?pI=vgCY``rLj5Jrh^bW|%>(={93Ig) zMG!&3O%PMu8>quQZqzteg4k*@sh6K>i4lff8GP8F&9No$SI>4*7e_;3IL_lxIJGNl zIc~y;=G?U_fk=4-PmwD`SCrbhuP|vcazZ;G5ay+nwpWdb@0n|NNE0`NXf^V@xe}Nd z8)9pWt&LdtTlO)dMIzMGUCd;yL=T*9^V6&V-!mwT;)>tq`4@31qJ-B1uzm!;m>^2> zSCjCM%IZ|wIysx>n;w_e*C|ws16h*tm>koTLQq8?p^{y~l5vdhtm5W63St8*xiq^V zR+RQw7Q_wLEWjM7cop#|bSSzmHf~ov5@)vWQrRI)J(q26%v_EnNu%qu z7AyYlmoS*J?Ick))`;BF>;pk2e-`m_#eK|14eJ2+AU%Q`2Sh{keRSj}qEgqiPfJPI zJ@%~22JZ~f$jGv)Co?ZQi|MbKlNgj_1cy9v)E!3$o1AT(85yJ96g!ciG%y{{FudnY zdNMC8LcJci3&YgwHqrV|)BM=ZEVWG$3NX=K!xd5o&{?baV{m}UTfBX*H!F=qS~f72 z3vvIMxQm_?(rIiZ58R?Ie3jv5vB{Js6AS&6s5ZiKlODg=saAGDnn4uny&^T$zEjV1 z!2}7`Aa~CK2q)?K{7uKDzGL$a+PDAIplNva7dy#9NWqB@(exT6)fIJKQkyVR^*lXFu1m~WYf4D>Kg85(F5?j;3gm%Uy|zHv3Cgv`Np%KXw% zH<<|K2TYID38X7tEBr+)@o$1FZGnrucG{e6@?mJ%hCE-=9ZN1~XcXSn9OHVvvnrF) za?efariaV_wk>@QN*~mK7tOX0x8^OwFwq+}zVTR+nJ5{wRft9z@~WP2JNx8sk`z$2 z@GwojuBc-v>ldC!B)lGEa7@x_heaSdgN}y9Nvw80!ZVM=KF@(N+NH_Kh35KoSd>Ss z5qg#27RZuN*O`pcG#9d9J7)5v`0JnwtJZR#a9X8rFM*WW+LC&Y-r{cbVoRDN#@0a6 z9^R*<&;8^> zmTXlPdgJs+=HQL4I1GQ2n`iMw=>iqdHGDB@5E;}MCw8X(71mh4Y}}q{&^b~`SpADS1*-N?d{EvK%c9N~cx6i3Yfc4J{Cq4TqAxvD1#7N*j&#Si z-A4TPftoV28Be6g7)O+b1ZARdt##;V@bVnY(9&95H zcHDI@i%7iu@wvq+^@~0V8(3N1O-!>A@U9Fe|7cv;x+%9<8 zjLS)|jt6V%(9^cI4^j0V%r@${=$QKBLE&^x!5r?yntuax)=lWw@46A;ORfezBE`Nx z3MRvT#lOda$3WDc4wf_FOd^i+SFn+6KzI5kMa!gG!}B8|1vUByOQG;+aeqnpudq@9 zksM5<0y+EDWz>a+-MdqdChzc3c_N=6OJ(YN!^=u@rAOitYhQv-wCFjmW9SxM+O7r zm9&nR(io9(NpQ#Squd-_{Wl-$$=%;e2I5f9s`nAjdlsYBEX?SNx`noV4&k+pG+D-$ zC{Xv}s1||nCIV3jA_%duCIAL*{is8bGVuqqPCC&vi?Jc8e;PUc{Y;J?@QE5Zu7MYJ zC`X{AVcDE>Ys-G$A6%q<)c$||sM2_Ri{$61KMv#s#7x8o$n3@?3>?D}4$(~s3#3~s zg$eL611eh;CL}D52O2g%Gv!T*3B_rp@!u_Rc>0n37%;@`c@gOG>*j~bUHH$l8SHTS zM(alSsc_OG3~swG8HM0EzF&nF;g(;scIaA&(%LUr?&Rglp(%0E$N@soFAmSu)YR@o z^-6lvq*C+{4#?moe3rY4Ll7;qAEP+m?Lwt}Ozb{t=?0=S$7=yROI1eaAdiAo6FLUW z?RI)fdO;?*uB9j1^t}gqjxKIJlTGH^0{YjTV1or6dr=>@>VLcDB<>E5Mc+ciTNa|> zmJ>-zK_krraYT0`#Wjm|oA}{zX}`in*$*q`qtDU~7g#COPg>_|W(Ki-+i7MdQPE~Y z*}rTS`x*vGuv+eI{-`7z`1CsQyYkjqfk1UKb0w9uVjkju{B6Cr1m>95#rX?orawvd z*|190YMAf${$<15t~GIn&Ur7IWcKX1{ImXefxzqhA14fReB9A-%fGYtk0lTEo#-81 zQ?F|UE&LC9`G+!MgSFb9$%tl|=cwIyV6_J^f6I_HqM`E6nu{IQ_+@oUTqape?<*Y%WeH6dyje zLvvUV-R_KDZ+%tSok2>}Y9U`0ms;}r1%ET<{mj`bw*cYURyOFbuHdDM2IlUYekuJn zvq>v*>uo&ZQ(K#Y4QT_Qr%R7_fEp=U$v*u(XKcO-axM%(<>qE#L2&c_@#+`xb(*N{ zL%*M<%cT@wdCCtQT=~PZdlL5>)Gr8{9O0I2-tm>~nIG|I7K1)8@~C{hG%dupQm`G$ zF(L-Hb-sF_oS0T?N%mojiv`X2s^ZjIh3GN);)x^d+9kU`j12e!3#Nwgcu!lQw+2Oy z5M)U;8tQL?@u}~LDZdJ=V7$jr^NF^#Yx$V#d=`{nHV7n+=c6_+2;smxk_9ewcbC|G zmFn%Lb&05JUm+plYv$o}Qj8Gc;@`;V_#&M-CRs$G0}Qx7fH{{O3QPLYafD?*SezZY z{fr~#vataIF1@ahE(w^1cgIEKeagHR>|B@nj#KkX15L%WNuPESSpb6`0jg2K7H$8U0SvJS&HjHZh)DpN*fD*1)c@BFx#4lt7^ zS1ULyHD|hw7m(bBB1v16?CPE?=ahISj^$WVI+vZ!;LRTt{NM01@q12Q2p&fGCNYV@ zOw;)mZT(TRW1xN;_0H6gvd3xiT&*1>RMSMvpI_zcrKrz^*fB?B2JfaGWE_u9h5fZ6`50+1nkyy5qCQnLkxjh=-m zXUw{$Iu$!0#ujtow3G&l~J9;MP6qd@UB0n*Cv&}^`{jS~w0{r~Sn&%R=DrwN0WK4e52 zFCZ751dFF7s3%}Eyl+C{JIFsQ4Z}#p95#5zZN+EFM3b?5@Uru5_HFD7-h~WL8M5v+ z8sb|qT8|WcpI&$A47#*;Ydp^R`B6>7_DRjfL$UzLY}@GnSgE+3^K8Zn3QadAXXfkn z+2MqPhLLj6IsK4a*H23y(sa<7da6K53Ho-SIsJpaw5>w3fA=NQ<7l4Yc(}Qb3EJ?s zvMY_eU>c))QdLPR4dWASE4rhzLF;>pD*W&8A*kP$$*w3%I>(fpr$%X=tI~+1qPT24 z-yHNTt&7niA+w551kaEl(XqLW4Ji3-qp{zeRp+g)$OEgBzf?;Hy&pvl!488)fz`BN zXUf_(HvB-TA040Dp*_UKHtz0#@Z(S|!9U(@-Yt_tTxSc_gWv~*2|;tDy|ZKetuu2W zeil=w>9-}_Lz#G{fP>&NU)HuoAv&j-`Ew(Z?uNemv+3UM993s5dTL2%K{%zQA>u!q z|Ky<(fFD%jM_&a^GT~?&C;w78)+5nM?i^M&YPuzZc_(byIEs-%9wlh<8LO}!3|TX# z9Z)bZP!hy@o0r+$Sc~vfk&IvtT6pIY4wHYM_4I(Ef&?C6qyx0Ngh%l$2senEn0?JF zm4$^{o7lFh431aaCc!v|FWzIpc|F+P;%30-(gqs`Il8J^&U=2h7EK>U2Dio4!jq82 zNf-W>EN>TSneXB;+9OSAU$Tg<0^`XJQ*y{obBkVowvF%w@Sp*6aOY!j#=9#b9i%Yn zu2k&aJVy!%$lhL$z0gU6q5gfeQ0)#bGtz9S$^fV9*t1EwQ|nfQa50A3aU3VFPENY$ zCPEb`S4KODsS9kE*kvalvm0HlK2`|r@E|X0QN62ikhb=t~B453C5BMdm#3aOj5jf=z3(zT7J*`r^Ql=lfaa3++J6ek{ z@E7Y*=3@*TW$QyF6^J!(x>0_*J$yF;QJjhcewM=|Wew~Tck z64i|#8Om4hJ+Yn=b+u6`R>;*ud3q5K8)VUll4hp{Pm(V(yA+T8gy84^Kxlwm1u^Q*gv$v;` zQXC&M1|_*6INArzeNqq6HxhN?@rH@Y5^obXj!F;{uMO3&%REJKUuxK|)HlTQjW2d8 zwtA3H!6YXB3pQIJ`|2jn9ZLyE7;N`W?sd&YeStOckk~9xaaucm`wz(Zx5IxC=@%fO zMI1N%h2#nK;7h;i5_Z8G8HpYInCz;79h{zbKf?-I*P=TB|ge< z)L6j*8V1Hcltj4I0nU!#e^@22MS*7*I@ReRAwXD|T&T~1}{b>5oGiNF2_7`bw?RCv{ z2xqOeO{(hIxI4G%I?lPaX071*`uB_K!x@SD^&v*vr+eaW*Bkj={<*~Qy!`j?)_z9& z;yQ%#)N4N&54QUpU9%9mr+!P+Lu}(9zM%-|KI?qNTMM|A7xX*bl?u%-%MogBd0j2# zJGf_FfK4!qgaMU`xAx&~RmQHcu5$K0QZ8u|79z#_HJ{pL=KoBo#AZ+6BP1e&Af}R{o{Hti*QjYM>P|lEB5pVli{ILb2H0Y1JKdK!H#`{^4 zDWrdKSGmHSOn~Mve0X%tn&f`OfWJ2AzA_tq|)$|kDK-QuEpap{>Yz(P%W-b*u`Eg%Q8_E;D3i! z#Zeu@^+4`Iu-0V69{2VCst{-5L(}fYX5Q4Wcc@@QCX9ivB&fX&E;4Zwgh7bU8>?JM ze}JXdX8qvcLL0;EII6MO{Gg{Bn%_W$>g)B-vgCo4@}Ni%FA0J`Xyhc-<8P!DT7+k> zhX|k_Y)ohcu3IJ%33}ZY+SgRgC11_Qhzz5$2<8gO zj;VE3K%zngJBMFwv`*ti?>m;4(0b^)o9Pcha1oN8j8q{ZHkiN6UBKS2lFc`uvqu!v zimgqK#EL|8(WX+AbQwP0_gYa`#at;+pnl_$Snd#|#gJl(g=VoHA+i19<5JN)eiV{e30G`999ANc|3; zkQsq@zs5?71?+&FPkwdKsg0G_^(mn47-h%sPO4}F1HlbQHCec3J+a=n$K_{pM1vJn zKEQs=Riy6fco&ZePfcK&TAS`9OHTbRNOrLyKDytyeV#B>Rt-DwV#jOJXbXL!Q+`79 zA0Xf*>kK2g8%in1b9QtB?>9mk%CH@IcJFD9_87JAX^`EKowbAPKtf0J{Et;c5=>O; zMaWu+)XyKTUm3D*PGL;68r?1pz8AZX)&bDF{7ICAr3rMr_N;L|Q%)htZ~YSqvtRTB z;ULt;ks-k&pWsuWrE`A;DHVHwzVf>FSvQgG%9Up}a)jHk1IH+Jm%I=yk@Ed7=R`D7 zZqT65KGl5qr^x0uo)OO>l_2pxb6c_LdZAN{{h$M+=UE?i^Ma-%3{<-xv#W;n22Rro zuV?atHE)Vq@Ls3Her9>bbOT>@g1jTvZzq0Ac0CF?Pm(x~<$u5VlLtkPrVD4O%{c{R z_o-l)#Gi*l$?O(|Ackk!u#91U5UFzHy@^%k;)#&|bT|0r{+`uN?!c4|agSu{!PN>l z3JO(sD!;Q4(;VlbVGM~iy{@r*I0`bihRqD(-H?Y+v0VHrQ4cdvCwq#wF+ZE0Mh)D! z&#YrKFpLXZQSX?-{)wJjwlfNT*~IE{9vY(r_a=y*lRf-44tkb@gyMv7Jjra_RO#>~ zqr2S<|9Vr29~RzyM8j!)M=DFj6*5$TAgS9Wzv zeVHdQD8DY+OJ9|!i=-5@ErQ=-VaFHw4t<0`!uIgJr8i~$&U*a32<^}H z^ZoSEJ=PI*l|tl^lWA}SroS1_9UpAaBCS@=^~Y+#4NAV(!M+PLI6qyl|A}h_z5zu+ z1yFEx-7|sesY0e`JpgP_<0H0Az%is+ax}JkpZl9CjtM^9vsaj^25vc$C#ioMzK&4L z25b#Yn4BFlX7u_af51u_TukA!U)uVac~KQCadjFBK$=QiehnsqEYwz7f=vWo5A{ zp!FV-D|UeJ7t&qPk5?XiwSnP@SjQ~4jjvJYX(&_40Tfs;qp4Q)ehq6N!cO4gQbVfT zA0qd5wUXZ=An)p2!u5m){Gwh)r=AKc%11(MhQ?%}L^-%2yNS?arVPY8cnGs8=J$2` zA789kjp8~0hH{A*J&Qz<{Cdmte3^NU;pFGM*kq_zHu_l&C?QxlJ@|Iq@mz%cAgV5q z-f-@rJE=Qt$ZGYJC2F|GYBI4|it z83-9(ePE^w$$J7nf#UfgpEnUv)5|u{L{D2JT6y zjY)piONPp&YVJbOn00rBvs{yo-Z_-b#4SWJBh1+!|6sH8wnN(JauiHMKXEPh($}HkUu}FOV$%%~ z)-13|okUjEkR$sXHDt9Yz+Zv(JBnWtdAE_=7o)?-; zYYjgCVZJRKS>a}dvr5C1z%%Q+daDa{*kg^r@2JWOnefL9p1bfMrBKB(@sX2?LCIgz zc8i}R76#te^;^Vuu; z7|{$CqFVtsRa~g9k#kjKhJQd=ftGK(M|?^sCK9$ll^4}HtZ--~UN5B1;8|jyb0@8I zDEn}BY=sG_1Eu*gtB~5A9Rhfr~wImWOut+`zbiXlF9xf(VXvA`B5WFmE8$ z9fMbm64Ir`Rn7D%N=+>4iIimMz6oN1iI-a|uMLiY=VAFWcJmjN{i}gR)~Ls967d5Ou1N^rt&G z?6j*54@{e=yt8^(m zOpbO%Ti$FHemcmSp%dQ}_(k2cs+2_u8ig+QNSVB8Zp){e~N2+#Jj z47C&SwrB|p?cr?uc9aO+Buc!pXReV_u&?u0m2W3p+gI6eQ7oKhyKJEG?0AuC%F>ap z{=_?ddiUE5rTa%`C#!)z=T1=rl@QRef-xaqU#^$RfuVN|nfcFr;MmRK+yUXK6K1vu zrkZweFlvQ8wyOR6gD#pCI}r_j+!iLHaHLsfB}{<_YKb~MRiT!=_SqYuMQ5dzp|hWl zcX|9j-*Ll@XoYlqWuj7kkg}2$f0+1{pR3P-Ep)u$L=DU#ZwGqcg1CNH>&Nho#oIo% z$OAoeLD*2dqUZEp>`lb1qVV8b@0{Um?0&KfUWFhej+2mYJ!tF4D31y3247TI(UT3i zSmsS-Bv&z_J!W=UwuDBNuQp7nS_1Usk48b~)Yd&a!)D9S>!&n&GEyX~C7LZ1YhnJq zMe#UT_!!j&Nl~_}KR zyYGR?*QQ-;#&p2&aOPqfh6em%b*F_D_E(W_6;LBf=(WnRRx@fZ#6Q(yYONb&+a~`v zp2)Lbl((B7@%gt=JV6~n`dh7iEYL(XF+?P$ryYl6J(>B8K$RMFT3l3U*yc&o4OyJMZf_9F0{;#6GPS zSl4}p=Qs-}*!!{L3s8OiH3~h(TP(3zG*wQsDbppMnQEqNgz_ZlI*)k`L9E4-kKKe3 zd^{wcc5AQlCp^OqwY0P+$0STNgJ-f`q<4#om%x9qymCa@ik*4o1XJgZ1J893r@MTJ zc-6m04J=10U{8rN)$AfeXt+t$bDVg?-|GgmeMC&93~9lVea%H?8y+s(2X^gn)Y`1R z0dArpjd~d%+S-prO0V~f%~~-hJ1X1TAl`^U(n5I$jL4{rFW(9g;04DsV%YJdBPFy5 z9e^gbyB6V_Q}i*M;i892px%$s{A|LeKgj5Ky}W%!y(4x2*qLMhaE5xBE5^EKf`-y^ z6J}9+UWy__IQMa7pVO2`-YtZhU}AbTCGHxUN;P|OoTSA3`fsOjFBhPd`T@>DVIuVo zh50Px%MxG0`Wgd7Sh>VRE98#ruDYeELaq|7HmLd-`DEbTLT|07w-?`)8#=96eS4GK z+GRB|1znNuhtgpv4yX8aI1vTE2<_#mu_beEi@fqEqR0lU8yM%um;Qh&dy`k3*5~&@ z1w4$kvkYNzFi{0M*eU!Lq&-nM>QSp$rc5oiNP(uwlUgdZ4?$NFcT6C^L{aP=gJKXU zpTZ1-XQmOgpLcAPF9PLXb59bbh!HVHgLPBu4b3}#%f33mY>9evfB$l!%(O(Qs^x(} zdch*q=s0Ojzi%=+v3xTX-`*mk)_{2n1t|!=|02yI6Ot0zi*BNoGY)mX_c2K|@H zZh618dF7Ze@L?ne7FqmY2tJ{F1ipa}pr&4GhaR-4>QRST>sDZ!;00TZm=mOLtOW@0 zsvQZ$8E{a z-2x5oAUC4gK(L9{INPW-N0VQKLLAe3F{Y%X*w#OuWeA5azVx+v-OtJe>KPn(eX9B5}6I==Ft~yxE}ed-8m1N08|KZjRlRcpWSk zgh45$2>#S}mla4$p`M6q1lB?t&xBC0gM^uJVQcF;7@tGJW@pw1!@Cn} z<8qihq^d9)?Y{9xuK;CQwS{bJp&ZpZkLm5=T(b?1M0cZ|WH$;$XB_bjph3={>uJ}1 z7J~YfVV4KJ?LzQK4^Y%tRydro-};#vrqLFxs-c8dH_T9{#g-Wi*-TOWDd@3mV&I_B zdwTH_>6E1>2n4m0wX~D<%QBSN+c~+{CH_@<&8^XqyOmcBP}f0DNwAPO3T2VIt2e`U zmYnnp`niPT8TYXytel+roBBXk@)*2DlS@SQzkx9n z0o(1G<2 zvfT17Cnmg^3*wubrQDAVobVzFJw)g<11qMr`%pr*Lio^b@+bbm2QfKG)k?M3K)2cVyu>8mS0)d#IBwc?#n z1t2`s`FWSYD2quo2R>V*P%7&9DdJzlfaBA-$VM5AEciM9)F#m|A=Nw%?V&kLFE&N@ z93gHsVV%C`GYcu9#ML&-<130^@0p>$tT|e6-G?m#vA`iEpU|(9plBhaHmu~biA^H+ zUBk&BYn^IP*Ib(-28v{ns#_9v5kb&Z2!Zuz!}8H^2-Dj!M$5N{YQTb(+$yrkpjWZ# z6GJ;m)=Rs5>*bW{$fLN#b(kpu#f0%s8H)S!UtE9G%Up8kBDz6=K_;;cWT`7!5xIzS z-madZW2mHDjQd^atq!h|oP?OoV^y0AY*C{WHSnJkR7LMc$4K0e5SLvo(Ry0iaIGe_ zBG#y27~hf6|D0LmNenT*)f)*jic=sba*EJkTz8P|ci<3EY`qGzA&8R)&^IJnqGMx4!q90Bq}n4YExHhfr` zTwit1d~@f53BeCH#e3HO_PMnvY1~4ls_?i)Riql-ai9BrbckzgDQ6}9$BOmd^X-#8 z?_FGUzTWfk?Pmx56qrfhf-hI$c zUi9_&O2~xI8`3HN>*?f@I*@P;b3^takbm^sHtVFfjRls8dF=ZUR}OM5aHypf59j+( z_LpDA0Sgk9VCW?(&ZJXwMbLjp9eMQ3Y@OS#+U_!+a{Q-@*8`bH09d@q6$y|00Jar7SfK+vw;1FxR;ov&NPY=kS zn89z!QyWGh=4?H{<$`@TcDtkv&g=yQY<$-s0{0~wtlw|3wz>O0|M^YxBgG}E_O3N3 zKq%m$SN~uvt5Xb)&)XWI!S=Avflv$ZkiLM7rXMohFar#JL4gGmWeMYUhdN3k%lYLH zNpw49No0Nu6QOQ7s4-g0T>9)f2~^Aox?Wi4Z4}slevBBzvyyG3>JXROF8-{^A5tT& z(MOYTj8tcy>=amp7MAxr7%RX~;MuwgK(h;zrYn37B{vns;1M`jaWBAp^(C zi;I=|^u+qNIK&UTzN5+0yiOenb+@hr)}48JgaJGAJD(T%j*aAXqVn*Us}q~ATG(-s zm@J?apeihDrv9P@Plk9f+Y&B1|z%^oe&-veQ0L z5QZwi=R|cR(#UM?Cz5Iy+T-*}g@f1Y3>O1yeL>$}O(RUAZXTECNN|bzbG_JR$O7~~ z_#MzeLY^rDrEF#rM9#On8x^?A>TV&Z@O@xrw+=OfIYuUb?1L_A;H%|uvH)yC7~J*E zc~~R-GQEt`Ax_-82jb~D4vKh;Yhl|;3z1irFh}$IJO-|4TNNMkPRtB7nWcX0GfE=L zJi^8o8rTq3?z;gtc%>RY%jqS=&$Q_J#l8Y{55udI?bY#=Ke;^r#j9qUNetEV z-Yq;1>vb=ivK(fqJhOtUon;iV{20?^)?+NDZ1LYRdo z!pMEUB5Koko2eBGg1NX17@?s_6RSz`%>faOH^V1B;!FD|w%blNyZc>y?_b)$e!0E9 z={-73(b=hOL)ll&+3KztK-iFpyT1efllxB{D1fAgUF?38^6(7hOQGvtl+3_uN}#C= zv_QW}I(nF-|Frzb>%12IQCFHE(1d_U0-F|@<@&Xg>i4g@j41Rxr&7POb{{8R+s@^7 zPBFKw>#Z}&CO&&5Q)?h->+kxnL>*>Xeh&%)$Uf5)qtY83tzCkqqbu^nu^C5Cbxe{f zkaG~1_|~+VU?f3tfY`}UoED8}nnh>sGKi3%ua5~3o~8(&flIdlhx0Slfr1$jt+E1H zy7jbyBRmYM#*APNOp5Tr0&VZ+$%CN?EuZcOyWu3j>gQ3%^YnEDHcFnYmJ7UX7juOp(fE?eZUpZwMKgCGlVW^O2!iQN? z|GgZQ>@%eTUsmh)QScz0Np@E&QF&9qo`#~B`gzcqAaI^WR?o^y*TcRK%}(djxHER$AxuUShGZ=v>TbM@F*VZDGlg8w?DhpyiPD1+ zD|9>5+Zd>CjDTQzCI_raqu~@EUR0pm^Tp@sw-4w{!oNTPD)&meL>rq$Rc?7xdzTXg zU!v$s-YDEl&r=;%ODY~l8k?trEy!eMuSF{Nh+x>>9c|0U`*F_)F6Bhfl@P%#vM7nY z4ZkjTnVKvA2f<|}z6kwdsGAJ= zXGR~nJ6OT}Mpsaqq>TWjY@=_j86a$GLsSuc9?m9lY)LqJFDA#cDO0_aw+Ata|02dQ zNwrMEb7Ry2Sd+{V-osHov+L`Iq);Q=?#pSzl9VVtKNIV}oe^_io3c=4{u4(7h}Y2; z7Q9-{GS&+esSzPL0`A+nttKI|HcCB9s0}nwjHulOZhmV?g$>tfbR;eK6lxX_XFfW? z*}<)qmP01{u}lCE<&502Kg);|BU=FKC9BYc*u?$j4{gX;G2=l$GE*!{w16BZe~erT znD{S_kQJJcuC{_RY>2 z7w1A>GHk1^(LqGX?<6u5x7DZLj+F}jGg!u_@zw0Cy z1E5=AIjidGXduSF1lz3M83O#RYEb6y>loTYt2mm`v4WCU%UI|15^F|tNM&%ckEy$a zdkQvjJfO)OZ7Vib5k zAQ52u^QW{UPvwasP~>mY02e*ag0A``4vOI-KA#*uIn?q4ol=b&A6i{XIr+icE(Wg| zz&ABX$-XT!+eO&(CR6eS=d`m={u`o8 zyv(R%LE9Al>GLmR1C_L~O%iUs!~SC!p!*0(HEmeo;}tG{LDYZCd%^?E!-Qi6!|yTV>Uk9A z#r_ilf;9Y%f`^sv+uEo+{?JSYmD`1C38NH<#ImF-^S<#5WP=^CGK1Ni@IYD$9O!bd zWEb9Le1OC`^rvBh?5H=MfOR6v6ng2t)WroX_ArcLXB-4h)rMzT4D2b34dV+H(0OCW zK^ROjTN_SPgV0$*tkUR%Uoz%MM@&4%@}v_{gW(;@Lcc7(2^pL0y`!BZm{$FJ90FmN zEPJKGgf8L+Y7soGPPCa%yRaKOE4@uV-Xz7B*2M(5uZyXL@|$n0D^Tt=_mGI=2O(dN z)b=mZ2w~ngS0i#h7ZFgcPq`p`xOEGmC1ZjUeE@&al14f3s~skMX@o3*ha;YhZvdm1>|WJ(fl zea7x;rJRG`>P3Cq4ti*9B+rGl$ywnaxLHzmFPJX=W38aC9H%zCPsHbtCWb8{x=8OY z)RZ4y4+|jiT3S#?`Fscqm&0@={h)v$)+PIYmP;AQg=Tk(iHyu5aT1O)1MwTU{}9gZ z{Kall>>sw1mM;4bcxA`8m=HiZ3ym)s6fSI?afRyy{81i^(d~(hh>0*7TsCQNh>p<@ z{A6o2{#&rcM|9yydswkiQ}UU^Vswow9KU@hz`V7~hYarxV!zTS^2uxtGQTf-Tb-nA zy}Q-!hnN})jbj62&SKIu34F$#QBvY;_?fBV1p>itbmcV~#euNbXM}y{z-C zGBdQN)HSikuU({CfG%ZbNv#=^N+m!{s=g9?G#$&euVM-gF)=1V2tZlFgv#};y<8vg z9*kj??yj@cLr;pa??2u_n{7}00711*Pv$e7uduPzkdW-7lC*WntR3*d!#ITDdCEv= zJal2xhR3~7=mWA=qen#=O+MU&+9sc3*X1TB?K?}k!uZdMH>i=17e0O<;13}!<+ZHbHaw!_ejMtA z1+K+3AEjlitejYK#Pn4f-btgADBp;3-jk*zVjqaV|nDo9z~7nob9_>WZQg8NJ)pjdPoZUG8jC5DkofNSZjdzYIJ zwy2)EG5yjg>1YM0mvJds)RPA^cG4nibBc?mOH-bH(9^xe9}GAM4ucvGBNMB|;C>2T zr0y*Up_(W)C=1xK){q~M%=(r#_-^dFfEU&wG85PT{Vjjokc7-H+QS2c3h184QQFIo zOx%xO^XB~r!A1p<>?7b5ai@#01{sMzU*+XYe}nA$KKo0NAH*XJyUTV;*F|~7xd+k?r}9MjLYC50R`_0<_8o}40Oj1L?6;Pt5)%XCFkvpA(S|C)IDpE4d``@muTu$&#{IQNpk}K^7715I+X}z_@7$%68&emD6ZE6sK9xTx+G_3A>zI`=9H-5~zyIBEN~ z!3b&k&vS}uCx1UvT&MPeUBkH z6z>T*7q->11|$`nD8mJooyUtl^L}awT3y&b1LePEV{EEXK5v}#{r3B!Hq2iI;!9-^ zu1jn>vHl2xgK~=X_lmMBn*a~2+i)?`O>rx3mK_|8XSE5vim1p{K3r_Eed=Qo$-Fxl!jwS z#*-gj3f=#r{Q{TFgfOlCLwFveTLvg{BO8@(7_~IY*kA5|b{Pv##d0>p!WI5Z_??4xuR2e4f?3fUs^oWVnq&`z44n;AT9RPC) zTVH++*f=M;v9Pn@{|Zd*<_xelL1H*~z1FEoIaMwIbSdHHMI}qK86vc=*?cUH#tG2KJrlrl40^0C_Q)5Mlg_ib)lD*iM!eDPUUYUCsfT#!K+up z^@7rW+=y1mV1y6*m1(#g_X96XACMK)!iq$Ytc$6u;0uM#M15F~`Fg6-^y~#ttnl3X z66uLeqrP@3-Y>hXEJysggZ{b9_>-?D&|3)}T+}Zp#3W%! z@gBf`-Z|WTxK`IOAz|u#tq%}xjTg3x=?i;*AKMZmYF7AO-y`4PXD_!v>BT0si@YkN z&ug26>wwIyzGTJDRLMGAaqcH!0s(PCdwtgkY<@Y}pvzhVZkpEN$dVEJgA|**m#Xm& zu|47sip9V-vX8>f?|S<#vt#gQxzH+DK65MEu~OYuc5-mVe$K z7YcItBi2^CahmzlONiloo2HovDMLn*Zi={=92=>5U+RIb5oCGS@=!X+*0?T+zFP8V zNY$~U<}0%?LIy~&Vie>rw%c((7uWnURR3ctHlXDC!r~!mTX8I#0U2sl5D*tW4uT2R z#~?LP^pCnbOYRjlS4+#9ATnd@T@ugj$9j%|8gt0D46kMn=^c%ZDZJ-ea1K6SZM(%G zE+13vPA{93D*@wI6#rPNegQDLS^lP61kiVFpg&$3N>A=Ak}rskOc1r*q|3Mujfc(uA64xF+=ErADBDudL^_Qi!ykgIg#d2xAXnbPMJZ#ju}EgU&;8~yb=|GD?rKeqhX^-%B`jzwj$K!-ETrtQ;A`>V6CZI2Z z@+nkfB=Jk`bTa1RjF>JTQ&l&p)~5xL8wA4a2IQ!1L@rdD#FGZw^XiNi3Dl$_-(d0# zL)+^K(E6CMJTlwFxWChI6}ACp&s6j!a%!%=)-Iz1-(H&% zw4b3->Cv8efqv#Z?E&_TAq0eo#*X-@O_tT#ARk$cNjo@yM}jVijtBQ+=CC@Bvlmlm zH3CAWQ3&-2U|H@6*J_Y81YV_MBKcyhOwx$TG@7@S%S22_OZhiZ)o`Q)7Lso2Km@|X zH71qr&E;^V$ux=S=I@!u0pW8|Ak<;&SyDso`MLId<1)rn3XC*0$lldZY0(C%Kc8nR zX}m#|1nVib5umEDSGR{aqkk~OP zpUAl3Y~nBy%y<+ziGhkv7c7rzTEz%nauphl*i^1#J~p+(PpT7>@2A`|DTS9N?4S>K+f{Q3J~)Wlk=#YBH&mU2Dr0X=~5o>ZROgkubSRz~w{4 zUtBP6-$t7lU{b(-_FP)qI(%90(|qC@EkC(i!{JugSB9X7F$*`&_g(hjsM<*_C=4& zfYnwx*?5pv2Qb{ONo2n6^b2eZVl#4usaEoisk8_=#=e3y+8>)**QDoSsuOi0II}5? z40paS#_zUlyN*gVY{H;$%)F8xCE5PJF587JEYZdjyKyH@ivwW@iXbs;(DHdQ#z5{x zquY@xvKB_H!&FC3Rxah|t){gtroC(>#}`NS*-Y;dzS!K3I4<$!Lvm#(TnXaJ++|$( zkcE>gO0pp@XB-(C-S3)pt7eQS7>S?3ITKXbmmC?cpfygY{w#0}y%W{&W!kEY@pCyt z=tQniKI)`#QNDu-Ou?QPmU=?bQ+8$!?YxW4HM`!!St&{^414kUOQhJAO z5O_5szhh0b#h4w<1miMn_R+SKc`AjECN!c^P}OF7CTQlCL|8H{bk$j$e>Fc=fDNi& zsxl{{tr4a8#qPY`^bN~)2qLJ&) z#)umLsSF?{k{VOUgDTH7SQ$}$79JC1Oja8;I;|&WC6oC}m6)Np(FDc*8ewiEprUBc zY-)s2v3+1swf1ORfM9)Jl#L+o9ZBh8w-xVzsIJ0UANX?JGg5pnw%`idSQ{7lJ+gl; zlJ&lfmn9PZT7PA|AFr1?T3WkC*DtTn5d$dk{{dqegE*sZ)M@|#002ovPDHLkV1m{q B#H0WK literal 5036 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 Cy^wVP diff --git a/searx/static/themes/simple/img/favicon.svg b/searx/static/themes/simple/img/favicon.svg index 262414509..03957d309 100644 --- a/searx/static/themes/simple/img/favicon.svg +++ b/searx/static/themes/simple/img/favicon.svg @@ -1 +1,26 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/static/themes/simple/img/img_load_error.svg b/searx/static/themes/simple/img/img_load_error.svg index 3f276b2fe..038ba9b55 100644 --- a/searx/static/themes/simple/img/img_load_error.svg +++ b/searx/static/themes/simple/img/img_load_error.svg @@ -1 +1,41 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/static/themes/simple/img/searxng.png b/searx/static/themes/simple/img/searxng.png index 35eeb60be10790510067a3a1672a14d6d6af7725..ab1c34a460dfc1f5b99826419cbd7861de7bfad0 100644 GIT binary patch literal 10181 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 T=^Oa}T7Z<8yl9oMLE!%ZlXnix diff --git a/searx/static/themes/simple/img/searxng.svg b/searx/static/themes/simple/img/searxng.svg index 8b13a027f..c695bfba2 100644 --- a/searx/static/themes/simple/img/searxng.svg +++ b/searx/static/themes/simple/img/searxng.svg @@ -1 +1,36 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d456f13f2e763772d154279e788967f33a7f8b21 Mon Sep 17 00:00:00 2001 From: kevadesu Date: Fri, 9 May 2025 18:00:19 +0200 Subject: [PATCH 06/74] Editing branding again --- searx/static/themes/simple/img/searxng.png | Bin 10181 -> 9986 bytes searx/static/themes/simple/img/searxng.svg | 46 ++++++++------------- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/searx/static/themes/simple/img/searxng.png b/searx/static/themes/simple/img/searxng.png index ab1c34a460dfc1f5b99826419cbd7861de7bfad0..93545f7948de61c9dde1dac7060efe27d54337a6 100644 GIT binary patch delta 9985 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 LNkvXXu0mjf^<%NX literal 10181 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 - + - - - + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - + - - - - From df9d41822299e318fa600bd94f3ad4baadcc2061 Mon Sep 17 00:00:00 2001 From: kevadesu Date: Fri, 9 May 2025 18:05:13 +0200 Subject: [PATCH 07/74] Fixing branding --- searx/static/themes/simple/img/searxng.png | Bin 9986 -> 14785 bytes searx/static/themes/simple/img/searxng.svg | 31 +++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/searx/static/themes/simple/img/searxng.png b/searx/static/themes/simple/img/searxng.png index 93545f7948de61c9dde1dac7060efe27d54337a6..60931b6c9130f3e2bef8d102cc099aea440af9d6 100644 GIT binary patch literal 14785 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 bxO?#rmJXDI?X|(600000NkvXXu0mjfs*Q$P delta 9985 zcmV+cC;r&MbAnEgRevUzNklIKDXUJVjyUU@pN}L!Gi%AS52(UW@ z>;UQWPeR}*XQl3u790-?z!hG z%*_7U3RX50)H=|+qJcG~5Wu`K|6$(SH};P}K`U+kniVuJi&jSbS((q8-beee%e48Y z+3nY_vU>BQ9&| zn7|2i*aJfI>3^Zdv(Ym=I|QzV@OV6@5;f)eSi##yRC_nfmi<^jNQ0z~s*HH%3N2z` zbQ*@d)fE463Z`@RBleYgo43BoIgY~EapN-SobQx9Uh08>%<*FN&OHT&k;cj0XZY1U zcs!m{MP-3C!aC@ow{5Jm0K$rk#gm0}Ok1^BFY`J{|9{e&WH(T3Atvt=4Y!7-PKmmT z>{7Oj#rwRko;qH(%<%`rYbmyQ!4DW+@IA-AnD|c7KJ0l2jg7nGh1TOaJya0b{a_WV zyT(fEJ1b3Tl@Yldvy;^?vF>CwU8mMb7ba0(t@Ewk%x1}UDiK&GwhD<0LG#h`l--rn zRqb_Llz(J>xsKJ`jLBSN|cL^e{l$p$FsEbihmZI!P{FsrS2Kgu;NO8bRsGwms+2& zm}x7Zk*eDFinp=Lc)eJl-Fgt!_v9c7PS_Ilb;}ihP_dx%v2^-fLrzVQKc1lS7@Vd8>?-?2hSP~CnS z+;ew$T1<3ohT8e7=I;w;dfrUWp~N8eM1L4d9v_?OXFNSE@OPv!*6h`%xH^Kz<5?;) z0=plaL2sX`s7aLR zDU)**Y8TX5z&SA;^5)m)&7Z#qFRpd)qM1H#PVZXss8fmWShy;JGiqfQ9*<|Kh<^ok z1^WYYL-*s}RPi5a=6=phpM|GxE*KI03|xa({5XqS7RhI<`>WXR!{hNR4MJemb}Xox zBLQ4%e>9N*ya-QIteMkK4=;P(RUBo&*TXi(ZNua7EDe#so-x)dxdvPWk@U>=qBbpK zVPOrPX3^0(J}*MUkfdp_pS>09@qa84J^u4%5{AVwtxDUFsVGw5Gw>`1ZO*mQD~aD* zx@@e-dMnoBSrQaQ4x9xZ$vH96z5Tb%i+2qymYRCKnk36sd;?At`3t6vTTo=zvX8Nm4^hSJH)_=@ZS$_(Q z;5l^|aW%C`>}BR%F(SJO&(g7K8czByaSIXmr;6@vFRpE2YYo;&Rhh&$<`Y>rBX~|D z!<=~obNwHf-@$!1!+hQ^*q$ujoA7i3V+^TRov22CqwbuFyStvt>saJj02=4aRXC3O z5+}*LqiBKvo>PYr&A_|_1%Hc8O%wOU=YGL@3ZBkj+PCzj=$*DPm_5Feb(H<;d3f65 zIs4*5wjlB(D7*?!Wyspo2?08au{=Y#YRfo2v)U3uQ3My0oKQ|!=^kEz&n?gJp43ZUQ&zlo!|bArH>e=v|x|!hc>IAC!Dbp@;$V zKpmO41D-W9^G5J2C96(dlLXl^x2dOHtkvrJ(#2yTXfLp*8Fm#6;aPfCqrV!d@w2i+ zvUu7fmB~=)^w?i@9w*8;6Io5<-wk;7Ls;M6eRI=Sj=SZ3QKZ8au`k;G0jxz9VhT7e zl=ejpJ!_(DqoS&_*?(q(*9X!KM_Xo@{4TfMcjM#qb9Q%Z*165=WY1Idz4BsJdEFbL z+@@7kW3@enD_S+I%|`~!H}qlX`u z%kq>f6FPqQ(Y5+WzgAmovAOQsus2tcWgMF6juV*)`=b49qkr6uLHpU6B--2{wTt2w zb62*jS-~>f?jh=-IFUG%x*kWL|vYVd-D&Y4dsF!&^ zeYTFMY)%|#y{hIL^XENEJGB#1`hJ9Qcu0~Wav*E z4g^m(&`G1COM=d+BxAJm93P+H?Sqf;@bC%V9({~uBzD=P zhU*cp^C54(oia;~e6Qw)y#`xdCsA0>2;NY<-+wD>;GpA}?a7ke7v;#Vzb@WCL^-st zU_qfw^uQo%S~dh`S({>Ag1+krHNp>?GI!2ZHDyDiXEs)4l5J}&sm{3xNK}9G#*4Vp ze=eFPaWSyL5!W{Cur^`%G!ogj?*444#5NiI)+OGKlf%xpUwZ@g`D4`0EwX~1Nl=g!dkIG=7tXo_MNw{FtdJB&;#YFh&aglhb8yfx<-X{C%GM_g~oI$ z^A+Fp;<`9`uF7d$d&(ttMi&~oE(R<3=H3PT=oQFhd=k=9dW7m67L>;!En)Jl8IVh$NL)!+|9{ohckx>P zU3}yA`<2C&I53S`UmW}dzjFC6@ik+q=7}gZhJDxgXS?Pya2JPi^x9Y5gt*Sz$RaJ^ zi>OW@-WOWF?DO5@P%RpLlft|xZ0sPjuhNbSo`^n&Z%xbCb@k`E8a>60CMr(!qLSFl z1wrCUmSh$Rw{pUIFlXyOxqlJ9X50ZJv=mK{gxmqHuFXCr zY$)E(n_G60FSQ7{ZitFd1Oi#MqO*Y$_y9h((^2O3*`C3F9pud0fM+7Tc<@p;O!Sz$ zpjnE<^{u-f;GY^XJg7OWiiDOd+ArUHZ)_Qf?0>)aGCGBfeP#DR4S&~0w%~76u}0{o zq@Z}7;`K8v{_9g%HrK@a5oUmoEnDb)B699Dg5q;Z*XI_dgRXfj%-lI*8=i^uT-c8b z&C&~W6Ht{rPh6=g|HZ-MsayfmLav5izWk#xmjU@~|6_?Cc#*hTg&QtLhHcHa-zeN@ z#2?GDC`tCk6l9i3k$;@Kv>cZnlDpJnmL8`&OYs(dsB zVh9__K|jL0-+(8FDA|j0IS5o@!Rm%hSgMLsTxu2)SE|Y{g6|)Gg4c`-A}g|AGL3D& zI%CXjt+;N>Ivx93Qxt)`0dH_TYe6xhMx=m0hS_ebusIFf&40PYBcm4WD?nO=^I}A) z`svdAO%iO`HT9rio%b^PKJ{?VwzBx!-JFNlT}+36xJ{s^<7#Kp?>!o-q+uiWE8FMC zLa``9U{T`gAd&s@&GFyKH+L^|${#B&S5-rVN9G2k8|@ug4UCRxM3>Y44aKH6bN1yD z#W?mjUUgmU%YS8=qU>D(&n^nFk}ixb-d7-3U@KSdD@1X%SUwQwJ8tpzr(JA^C>Fs0 z;}5Ufs4klHFna(`DN(W)XRRt1|JtydfLsG#+Ik^1j~cWnRH_Xq?CTqM{yH^}dVf*a zSo;X;HI-6we$4eI*MPKIhTv)-R|QGHvN;Rx7wjv_@qa324PZsv?dvhp8L19X5ctmG zpWPRg>#><+HC1K;yIvBeMP+l#oDY(=zjvBj!}-BiX2ovFhhPQQf`j%uK!+f=6F-Qv zQ>)iEiUf-9SItRY8V(}(ogBaGZ{KXz=Q;_poR5siOMdId3$0qQPE4h!CS93pI)+jM z*qbUWS$~a|U7wWRj+bvv*caWLH#zL;c*=dz%@Sl*C855YfGxH@>~{=hdDsmR6l{8!$-&@yM$Nl!sFD#CDy_%s_6ycK z&OU4=d@mGTUp@wvhsqT-jLLoUxm>GKhNjWQBUoH&^I@Pqh5w~xQfKEF&@cjve~h}x z>wm5FOP79_>h9Vm)ZsuTm7y>(ip6b%Gx$SuO+HB{-saa2@Nc^0Aoh4#rKYc zue{gzE?@sC%m@SYb9Jui2)96e1C^d zy32Yzp3cJ=@sgX?b;E3;k&A>%@_l2$c9DlU<@)@D1mH~&cZtoUAn-=4$Fm&RbcH%; zKygW5n(+6nT}Vqqm!bzGdF8s0c{nVB_*%HeEw)~}HYlaX?KRPh z7Z+~@o(AFsJnl0*9?vqc8h5>P<9~8##XX1Wx00wqt6K?FmH?3tHc9fb*mEd)7`YKk zT~86pQssJRg)Q{nalOxiOu3Fkxell8Io5F58arov%(0$TMS=Fb{s!!Iy(qS&^>^k8 z(69KLIc&2NfKG<5r`L;O5&eE@xjw7Ot(y2=bwdp)@4ffT2y9}-o^PSrU4MnOu9Qnj zSB(Lx;Av*Ayz1@KSc^?!}$Q=cEU9Zsf`=nmCTk_Z+Yx=9A8j}6}E%<#=dH%1@zF@Vig z8(9Zn;%kwY};xuuYdUW(dl zqS-E}WGPZ2mA7ji*l=F1TuFE7ef!`ew1tvxf~ca=SeO=7gMZ3?)YLFR`BX!slUE0@ z;#V}_AdQM}%RCrvVoLbNsA3sCM0(T$SFW-_5TkvYV_cr45sa<2!GzV0McL#r*12p! z!FE*sd$X1;hXCoJb&yj|H>}QiR1hK|u9Jk&H5eUd%5$Y;8(QwJO^Erqh5U0p%kPFD zkv*uA#?!Vq#eaTSol1>YHzcIlNP=s|TI`a*lHg~DvN;%if;Ld84j|2SG!RbzJVMw8 zm_3y5qYqn!4{{b$=KKdUF=Pcl33^6}>e&GW%?I9;WZ$Q~vrr2+wTurZjEWHQusBq%!-CZ|^b})r z>G44uvwzUdOXqB2VsScWX1avp!3J;COe@&_{Qf3xg? z%E#D)9ciNI+EDFhi1`?b_xDl#cQfF!6|L9T#YxX&da>`7+qGhUY(tv&*4_uH&*UcP z#@JUjo#Got@Fm~5-=2Fwc42nc$v*w+6I=Fm1%Ek`7R`_F5Cligc+IefC*uLGb2=lT>xbw zTh~M8t~u8ADStO3l-F)1KA3yi?y+$)k%lZLat9n_Tmo&6edWj-D~yJWX%)_(6<>|| zFMmr>HSf+0Lg7SqGc%j~aAet4-QTca{?4Rv!6r~7{=pO>ID5#qIPc6_Ha=%XKI%#S zz^a6>{qs5 zLYt6lAZxwSSYd7EOHh1GQaK6gzcxX^{C`8ti1<;GXi$|bV9RdeKG{ObtA2)aiffVh zJKjXKeT?{Ky}xz@z~Rrv_G6NPL7o0yMb!TexS zBudX!Ig>CTAQ|1D8S<>yFBvz%Z)S$_UKHdS_?_(zTCaq5oj(-UFq+A9mcv}tGJh7- z+cVsB!-Dx!MU@ao%e*wNc(K5QIg9G39*3%)UTl5jm*=3S{nJCL z?uSe`k4uE$YcncX9F%NIja=y&dO=z9^Tg|`M&w>uaBM8OCTJwtY~%oyuk~zSN=}Vs zIxDI&uA?2Ud%Vk$>zuzM*C7 zb(4JK_WNV50w=QB-c)r%ZUGY4>@YS&Tf=l`ky@&>8(p?`3wDHJ%V~eXB3mSIBh(1r zuzBD43R;5CbAax$kZaQbAzGvthh!;nLocvF|KDE!v8jru6RD8Me*50bjWv8xXM*1= z5Le<0nW4qo!u8pTGMw>5)PH$-xLQ_JjS7$?A?c%ea&KbQOd7;6XI>rE@u}bhBwLuj zFMrb%32a?e@TQnIYGN){qbexpf+eCG+I1URfIF4~`Cl^@qxFNPvuk~I_)^rm|Jyf@ zYl%mV8nbAhnP`D5U*&ME-)*^(i>`~}-gQZ$7u7^J<{@lLZIQqXXnzu^^{D0iumR!A z3rRZG4P?M7AVAHqW$IiXG@a+qu3P4^5ERUBRlvHAbv}wJXKWoUaENGXOd^r}_Px)J zC4dQxf0V3QawWWV_XB)uZ~9@r$zr80xwhBXc&4npMBrTz**HBR_pD1Axlk)qWi~=U zt@OJSRt>;n8UWVLj(o$o4Dqu zhE;jDYPOgb>LXxCWPj!IU*hYx*P@OGS*{q7r0MIo)*`We`{3g!%hmS}KS>S!O+tBo zZN;p6HWKUCubmrf#F9{h7WrJsQqG2IwJox)(}#+O?{SThs(%TQ-7^9~!ZJ-tz<{Ty z^}UAV(U;IZ^xZ29EI0m8U;hD?%OahY^LaDX{2dogHK}ATN{h}0i|`NR@a3)JNH|IC zF6JcUCJXf1#<^&kmv7v8A72~3AGs-9)IirnHX>7-XeuuOg+g(L`5`I>-e(AqxD!U^ zb#vbM(5@ncm4E!Fby%rRs7{N;>wyc?l3_q-AIeuiE`z25{mJ_M<;y=ZV*Xwvt_~8} z-1uB0vhDOV)2S3%i|A!15?#0?Bq3&_kA_AzXd976aftZ@@d)-DZ^E8$U)?@s@R(dG z-NC@!#4V~VxeQ3~sJrUx##;T7aT{EmV~81YBYeyFaDOQ?)n#O_(LI&N@`F3W;k zIBa>;BF0yj}Z)HI?pBtfF=N|=qZD2FB}t@2Khqt@+tm!x_au&IP1Mm4LzI7C z*Qb6|X8?W&I4YPwmCyR;ja3z=DpVYzWdqu~_$)ohrbWvu-J-mKv_!Gh$j* zQ1j@5$fi2g@db&}Nw$1(gy7z$&)frx8oJ1D8-EmRRwd~+-Ne~=%K#mrBoPe}WyDeq zk6ha#WnHR6cyh5r#zb$$V0sIRft?q!Zkx;(&n1~Ptous zB*LSTU4?lwNx&Nl0h^Ysg83n4Ox3qU6eh(+ao6LYdwNu0+wbxdKliJq{y?Q{kn9+C4;jBC9iw zSlvw%cAO$hZ*4+ugCa|4-h7~SksGI5qgx8=_|t8M$O?oF5w6#b$Nt( zm{kl93g&O4CMXKRO#A$ur+Nr9$PnFUuV8*H<7V+g#`TJm)4U_gwnp61z!^o!NPh-i zVe=>w*&8?N7g!}nnush}9%-T`HvtO_g+`I6(!hTM*kLgGn4coynk2kMS?#xUeHpz5 zuvRjC=XdC#!Vi~8V*5B}UNEn?Oc;u#GjIe*n6rq!e;p6NVZr>RZA9xS(YPhsxfYan zdnw5i*`uRps2%x?OP+vr*DmtJVSlchg|lDf?e|bk9?IIqk>;_h=gd#bsR6Uq+yGW| zCkbUyR{MFa;Con}F0wlX^SAii&ICU^iyA?fS70GK6^IPa%h;=AkvNg1&J5J`_SXiF zQ9GOiR=Gw(M8tS4yu=HvtV%m&T&w+Y%F9XtoKS*t0D|! zN!23!Y_YwA_QwI6g|Y^xTYv0s2~dH$eluMqog7t*P6ytAZ5!+3_>hPvKKyAWgscW)qqI}aZRoS>q z)F4$DSX;>Ilz_NsAGdnk}+dR%Qn zyASMttvgc$`_-nYihl)|PFx3=5#F|`YT}(4%XS^r<6i?zK36--m>7lyu!(DPmwN;* zJv|rpqqsVn4BhPowr#X)+ydhGWX{Y}JAAWDBOH@($xjBD6D}KBcp>V+m2IY*n5(T< zQBRfr<}zDqTy~064KY8p{bssCPp1OclSUNXz)kF#4i*2=Nq>B@LZc%Zz}_rmm4uj$ zW8VG}RU=UoWM!M_66O=y+RDax7cS3Ho&z&ouJatV1^Hy>yf$=Q_HathheUk_Z;hvL zHXly#JU-C>44(FQ0pBxKjHjF)LR=+<r!;?V9)j3*IXw9T4pIdw?<&^ayD4kYHd5dKO=#~KZmD1Uc~>gZ^W?b z{5doNdkG7M8#SbO9IKAx2k27SxGYlWs2pKe&efvn@_+B9X;zK09+@+6(KVvDSj!$h zGPB5fT7_rv(7BI2;p~TvlfKx|Ul(5{dsB4s#^_SnxGW=hBD(y$X_}sK!ai2AgF!rY z42kSt!_y8uydRJ5tGGv3oJvxiya$iR(|LL)&5Tewc-ny;Zmt&>5l0c&D6J7Z9#7}#J&Rg3btY8H zzV`HoSn*cu!m-xthj6)HWeQ39_sk2d$Fmglj1SVVfPr_ee40X&O?8n>RqpCTU0 zXKXq4=$gUf@pK-S>}5yxmvue5=);P!q@Kqg!GE(Dthj#2BTNwNd*%14IQx~y!92;i(7fbNzv7*gCRlB9R?3-JW+Nw0rNK{Msfw9?#N{ zO1QlWwHfsia+#Z4d~BS_3C17$CwLLx!x{Jxu6dydjTi9$jKChn)~b>wY($j&JX|^X z#9OZ(&ytaie#K|;%?%X~t)X~KD2N7a7k@NMS!2)P6a1pF!7iBhFZph@6Ci7qdT5=& zPprkNo{I1|dnuHQ;*hBaaB}%w{D$vb;PEUODsSe?_%B;#(XF`uf#PH^E*Gh`Ib&s( zauS9Uy=oSniFd4X4yH>AqEnw0vWcZr4L=2QT@_nbI7ZRDS;$uJ)8B=rC*~YIi+|2p zl3HhMCsA!d&etm^n?HW`8+-70JWGcvT3|$WXoO%}Mipq`GLS9YMEp4ueE^*!VzMDk ziRC(#xIZ&&jb;%`mc`|;>Tg9K;H1tfGa(@@}?4V>poXQZ^lI^jWIjdIb^zO89CBz4FY4`Y5 zuA$_*%0(}*r587{CE2A?UqZ3`#yhmOq)I8BI9mKYkS-s@SY*msnn=o=+Q!Mf_@taW z#jc-N{E2<5M7*(f=fpKCD!5t!btJg{SNQc2JRZ-|q9(2I3)l^w;_0r@fq%ZvSeVW# zi*+nxu{ukW2L37<^eoR39P|4+4H6%VzDZo3l;=QU(imgftp*68M#>!3()yIvs4Rxr z$q64Tw!%{fN%o<{d2##hDI6&Mbnrv``w$+FXQ`Peu#V5+KM&09zip%-h_`f>qFB!g zg;fwO1xWew-g#2 zH^9X{Ta9sVg>c~J6kkXF+l=dA+(DWyo7+aXQL^7zX+7qPHZu-Zpn8Ts^up@#oI0i! zSjR8mKLyXQ(mw&#d(i7fJ_2pWZ5lUDQ?7%I4VV(R#Ij7g35vJL?%(~%71lAqcHUE| zvEx>&oEK}lu(}}(YGj08TD9i=k$DYI>{vvHPjKeGPu$}1oL>G0%>HeRl2Z3d00000 LNkvXXu0mjf)vB@J diff --git a/searx/static/themes/simple/img/searxng.svg b/searx/static/themes/simple/img/searxng.svg index b8c6fe9fc..eceee9c2a 100644 --- a/searx/static/themes/simple/img/searxng.svg +++ b/searx/static/themes/simple/img/searxng.svg @@ -3,6 +3,23 @@ + + + + + + + + + + + + + + + + + @@ -17,6 +34,20 @@ + + + + + + + + + + + + + + From 48456caeb3cc701cc0d0e15091a42c5b5cb540d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milien=20=28perso=29?= <4016501+unixfox@users.noreply.github.com> Date: Fri, 9 May 2025 18:46:20 +0000 Subject: [PATCH 08/74] chore: docker + github-actions dependabot (#4754) * chore: docker dependabot * Add github actions too --- .github/dependabot.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4128911f3..a106397f3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -20,3 +20,21 @@ updates: target-branch: "master" commit-message: prefix: "[upd] web-client (simple):" + + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "weekly" + day: "friday" + target-branch: "master" + commit-message: + prefix: "[upd] docker:" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "friday" + target-branch: "master" + commit-message: + prefix: "[upd] github-actions:" From e982b9f73205dec9da2c5c1fc757bb40c605c899 Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Fri, 9 May 2025 23:05:20 +0200 Subject: [PATCH 09/74] [fix] documentation should run on push/pr Instead of executing the workflow after integration.yml completes correctly, let's run this workflow parallel to integration.yml restoring the original behaviour. --- .github/workflows/documentation.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 6d9f2cac5..629d9a272 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -4,11 +4,10 @@ name: Documentation # yamllint disable-line rule:truthy on: workflow_dispatch: - workflow_run: - workflows: - - Integration - types: - - completed + push: + branches: + - master + pull_request: branches: - master @@ -24,7 +23,6 @@ env: jobs: release: - if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' name: Release runs-on: ubuntu-24.04-arm permissions: @@ -56,7 +54,8 @@ jobs: - name: Build documentation run: make V=1 docs.clean docs.html - - name: Release + - if: github.ref_name == 'master' + name: Release uses: JamesIves/github-pages-deploy-action@v4 with: folder: "dist/docs" From 8e2e7774d7aeb13eac29c4dc16d65a2051ca250d Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sat, 10 May 2025 13:08:20 +0200 Subject: [PATCH 10/74] [mod] new l10n.yml workflow (#4734) l10n.yml will run after integration.yml finishes successfully (will defer anything depending on integration.yml until heavy loads like container building are moved to separate workflows) and in master branch. * After every integration.yml workflow completes successfully, only the `update` job runs. * Dispatch and Crontab triggers only the `pr` job. Style changes, cleanup and improved integration with CI by leveraging the use of shared cache between all workflows (not functional until all workflows have been refactored). --- .github/workflows/integration.yml | 42 ------- .github/workflows/l10n.yml | 136 ++++++++++++++++++++++ .github/workflows/translations-update.yml | 59 ---------- 3 files changed, 136 insertions(+), 101 deletions(-) create mode 100644 .github/workflows/l10n.yml delete mode 100644 .github/workflows/translations-update.yml diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 9ca96bf69..eb4f458d7 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -47,48 +47,6 @@ jobs: - name: Build themes run: make themes.all - babel: - name: Update translations branch - runs-on: ubuntu-24.04 - if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }} - needs: - - python - - themes - permissions: - contents: write # for make V=1 weblate.push.translations - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: '0' - token: ${{ secrets.WEBLATE_GITHUB_TOKEN }} - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - architecture: 'x64' - - name: Cache Python dependencies - id: cache-python - uses: actions/cache@v4 - with: - path: | - ./local - ./.nvm - ./node_modules - key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }} - - name: weblate & git setup - env: - WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }} - run: | - mkdir -p ~/.config - echo "${WEBLATE_CONFIG}" > ~/.config/weblate - git config --global user.email "searxng-bot@users.noreply.github.com" - git config --global user.name "searxng-bot" - - name: Update transations - id: update - run: | - make V=1 weblate.push.translations - dockers: name: Docker if: github.ref == 'refs/heads/master' diff --git a/.github/workflows/l10n.yml b/.github/workflows/l10n.yml new file mode 100644 index 000000000..4220c5c65 --- /dev/null +++ b/.github/workflows/l10n.yml @@ -0,0 +1,136 @@ +--- +name: Translation + +# yamllint disable-line rule:truthy +on: + workflow_dispatch: + workflow_run: + workflows: + - Integration + types: + - completed + branches: + - master + schedule: + - cron: "05 07 * * 5" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }} + cancel-in-progress: false + +permissions: + contents: read + +env: + PYTHON_VERSION: "3.13" + +jobs: + update: + if: github.repository_owner == 'searxng' && github.event.workflow_run.conclusion == 'success' + name: Update + runs-on: ubuntu-24.04-arm + permissions: + # For "make V=1 weblate.push.translations" + contents: write + + steps: + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "${{ env.PYTHON_VERSION }}" + + - name: Checkout + uses: actions/checkout@v4 + with: + token: "${{ secrets.WEBLATE_GITHUB_TOKEN }}" + fetch-depth: "0" + + - name: Setup cache Python + uses: actions/cache@v4 + with: + key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}" + restore-keys: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-" + path: "./local/" + + - name: Setup venv + run: make V=1 install + + - name: Setup Weblate + run: | + mkdir -p ~/.config + echo "${{ secrets.WEBLATE_CONFIG }}" > ~/.config/weblate + + - name: Setup Git + run: | + git config --global user.email "searxng-bot@users.noreply.github.com" + git config --global user.name "searxng-bot" + + - name: Update translations + run: make V=1 weblate.push.translations + + pr: + if: | + github.repository_owner == 'searxng' + && (github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') + name: Pull Request + runs-on: ubuntu-24.04-arm + permissions: + # For "make V=1 weblate.translations.commit" + contents: write + # For action "peter-evans/create-pull-request" + pull-requests: write + + steps: + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "${{ env.PYTHON_VERSION }}" + + - name: Checkout + uses: actions/checkout@v4 + with: + token: "${{ secrets.WEBLATE_GITHUB_TOKEN }}" + fetch-depth: "0" + + - name: Setup cache Python + uses: actions/cache@v4 + with: + key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}" + restore-keys: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-" + path: "./local/" + + - name: Setup venv + run: make V=1 install + + - name: Setup Weblate + run: | + mkdir -p ~/.config + echo "${{ secrets.WEBLATE_CONFIG }}" > ~/.config/weblate + + - name: Setup Git + run: | + git config --global user.email "searxng-bot@users.noreply.github.com" + git config --global user.name "searxng-bot" + + - name: Merge and push translation updates + run: make V=1 weblate.translations.commit + + - name: Create PR + id: cpr + uses: peter-evans/create-pull-request@v7 + with: + author: "${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>" + committer: "searxng-bot " + title: "[l10n] update translations from Weblate" + commit-message: "[l10n] update translations from Weblate" + branch: "translations_update" + delete-branch: "true" + draft: "false" + signoff: "false" + labels: | + translation + + - name: Display information + run: | + echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" + echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}" diff --git a/.github/workflows/translations-update.yml b/.github/workflows/translations-update.yml deleted file mode 100644 index 85e141e7f..000000000 --- a/.github/workflows/translations-update.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: "Update translations" -on: # yamllint disable-line rule:truthy - schedule: - - cron: "05 07 * * 5" - workflow_dispatch: - -jobs: - babel: - name: "create PR for additions from weblate" - runs-on: ubuntu-24.04 - if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: '0' - token: ${{ secrets.WEBLATE_GITHUB_TOKEN }} - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - architecture: 'x64' - - name: Cache Python dependencies - id: cache-python - uses: actions/cache@v4 - with: - path: | - ./local - ./.nvm - ./node_modules - key: python-ubuntu-24.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }} - - name: weblate & git setup - env: - WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }} - run: | - mkdir -p ~/.config - echo "${WEBLATE_CONFIG}" > ~/.config/weblate - git config --global user.email "searxng-bot@users.noreply.github.com" - git config --global user.name "searxng-bot" - - name: Merge and push transation updates - run: | - make V=1 weblate.translations.commit - - name: Create Pull Request - id: cpr - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.WEBLATE_GITHUB_TOKEN }} - commit-message: '[l10n] update translations from Weblate' - committer: searxng-bot - author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> - signoff: false - branch: translations_update - delete-branch: true - draft: false - title: '[l10n] update translations from Weblate' - body: | - update translations from Weblate - labels: | - translation From 1b787ed35e9c51e335c42faee1f76695780ba4cb Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sat, 10 May 2025 13:59:31 +0200 Subject: [PATCH 11/74] [mod] refactor integration.yml (#4763) Style changes, cleanup and improved integration with CI by leveraging the use of shared cache between all workflows. --- .github/workflows/integration.yml | 102 ++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 27 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index eb4f458d7..abdaf0c18 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -1,58 +1,106 @@ +--- name: Integration -on: # yamllint disable-line rule:truthy +# yamllint disable-line rule:truthy +on: push: - branches: ["master"] + branches: + - master pull_request: - branches: ["master"] + branches: + - master + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }} + cancel-in-progress: false permissions: contents: read +env: + PYTHON_VERSION: "3.13" + jobs: - python: + test: name: Python ${{ matrix.python-version }} runs-on: ubuntu-24.04 strategy: matrix: - os: [ubuntu-24.04] - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: + - "3.9" + - "3.10" + - "3.11" + - "3.12" + - "3.13" + steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install Ubuntu packages - run: | - sudo ./utils/searxng.sh install packages - - name: Set up Python + - name: Setup Python uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} - architecture: 'x64' + python-version: "${{ matrix.python-version }}" + + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: "false" + + - name: Setup cache Python + uses: actions/cache@v4 + with: + key: "python-${{ matrix.python-version }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}" + restore-keys: "python-${{ matrix.python-version }}-${{ runner.arch }}-" + path: "./local/" + + - name: Setup venv + run: make V=1 install + - name: Run tests run: make V=1 ci.test - themes: - name: Themes - runs-on: ubuntu-24.04 + theme: + name: Theme + runs-on: ubuntu-24.04-arm steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install Ubuntu packages - run: sudo ./utils/searxng.sh install buildhost - - name: Set up Python + - name: Setup Python uses: actions/setup-python@v5 with: - python-version: '3.12' - architecture: 'x64' - - name: Build themes + python-version: "${{ env.PYTHON_VERSION }}" + + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: "false" + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: "./.nvmrc" + + - name: Setup cache Node.js + uses: actions/cache@v4 + with: + key: "nodejs-${{ runner.arch }}-${{ hashFiles('./.nvmrc', './package.json') }}" + path: "./client/simple/node_modules/" + + - name: Setup cache Python + uses: actions/cache@v4 + with: + key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}" + restore-keys: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-" + path: "./local/" + + - name: Setup venv + run: make V=1 install + + - name: Build run: make themes.all dockers: name: Docker if: github.ref == 'refs/heads/master' needs: - - python - - themes + - test + - theme env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} runs-on: ubuntu-24.04 From d16854e67a5bf2f640aabf119c9b50f5a1a3f24f Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sun, 11 May 2025 18:12:51 +0200 Subject: [PATCH 12/74] [mod] rework container deployment (#4764) container.yml will run after integration.yml COMPLETES successfully and in master branch. Style changes, cleanup and improved integration with CI by leveraging the use of shared cache between all workflows. * Podman is now supported to build the container images (Docker also received a refactor, merging both build and buildx) * Container images are being built by Buildah instead of Docker BuildKit. * Container images are tested before release. * Splitting "modern" (amd64 & arm64) and "legacy" (armv7) arches on different Dockerfiles allowing future optimizations. --- .github/workflows/container.yml | 183 ++++++++++ .github/workflows/integration.yml | 46 --- Makefile | 10 +- container/Dockerfile | 100 ++++++ .../docker-entrypoint.sh | 4 +- Dockerfile => container/legacy/Dockerfile | 13 +- {dockerfiles => container}/uwsgi.ini | 0 docs/admin/installation-docker.rst | 11 +- manage | 91 +---- searx/version.py | 6 + utils/lib_sxng_container.sh | 319 ++++++++++++++++++ 11 files changed, 628 insertions(+), 155 deletions(-) create mode 100644 .github/workflows/container.yml create mode 100644 container/Dockerfile rename {dockerfiles => container}/docker-entrypoint.sh (97%) rename Dockerfile => container/legacy/Dockerfile (90%) rename {dockerfiles => container}/uwsgi.ini (100%) create mode 100644 utils/lib_sxng_container.sh diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml new file mode 100644 index 000000000..d232a0737 --- /dev/null +++ b/.github/workflows/container.yml @@ -0,0 +1,183 @@ +--- +name: Container + +# yamllint disable-line rule:truthy +on: + workflow_dispatch: + workflow_run: + workflows: + - Integration + types: + - completed + branches: + - master + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }} + cancel-in-progress: false + +permissions: + contents: read + # Organization GHCR + packages: read + +env: + PYTHON_VERSION: "3.13" + +jobs: + build: + if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' + name: Build (${{ matrix.arch }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - arch: amd64 + os: ubuntu-24.04 + emulation: false + - arch: arm64 + os: ubuntu-24.04-arm + emulation: false + - arch: armv7 + os: ubuntu-24.04-arm + emulation: true + + permissions: + # Organization GHCR + packages: write + + outputs: + version_string: ${{ steps.build.outputs.version_string }} + version_tag: ${{ steps.build.outputs.version_tag }} + docker_tag: ${{ steps.build.outputs.docker_tag }} + git_url: ${{ steps.build.outputs.git_url }} + git_branch: ${{ steps.build.outputs.git_branch }} + + steps: + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "${{ env.PYTHON_VERSION }}" + + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: "false" + + - name: Setup cache Python + uses: actions/cache@v4 + with: + key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}" + restore-keys: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-" + path: "./local/" + + - name: Setup cache container mounts + uses: actions/cache@v4 + with: + # yamllint disable-line rule:line-length + key: "container-mounts-${{ matrix.arch }}-${{ hashFiles('./container/Dockerfile ./container/legacy/Dockerfile') }}" + restore-keys: "container-mounts-${{ matrix.arch }}-" + path: | + /var/tmp/buildah-cache/ + /var/tmp/buildah-cache-*/ + + - if: ${{ matrix.emulation }} + name: Setup QEMU + uses: docker/setup-qemu-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: "ghcr.io" + username: "${{ github.repository_owner }}" + password: "${{ secrets.GITHUB_TOKEN }}" + + - name: Build + id: build + env: + OVERRIDE_ARCH: "${{ matrix.arch }}" + run: make podman.build + + test: + name: Test (${{ matrix.arch }}) + runs-on: ${{ matrix.os }} + needs: build + strategy: + fail-fast: false + matrix: + include: + - arch: amd64 + os: ubuntu-24.04 + emulation: false + - arch: arm64 + os: ubuntu-24.04-arm + emulation: false + - arch: armv7 + os: ubuntu-24.04-arm + emulation: true + + permissions: + # Organization GHCR + packages: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: "false" + + - if: ${{ matrix.emulation }} + name: Setup QEMU + uses: docker/setup-qemu-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: "ghcr.io" + username: "${{ github.repository_owner }}" + password: "${{ secrets.GITHUB_TOKEN }}" + + - name: Test + env: + OVERRIDE_ARCH: "${{ matrix.arch }}" + GIT_URL: "${{ needs.build.outputs.git_url }}" + run: make container.test + + release: + if: github.repository_owner == 'searxng' && github.ref_name == 'master' + name: Release + runs-on: ubuntu-24.04-arm + needs: + - build + - test + + steps: + - if: env.DOCKERHUB_USERNAME != '' + name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: "false" + + - if: env.DOCKERHUB_USERNAME != '' + name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: "ghcr.io" + username: "${{ github.repository_owner }}" + password: "${{ secrets.GITHUB_TOKEN }}" + + - if: env.DOCKERHUB_USERNAME != '' + name: Login to Docker Hub + uses: docker/login-action@v3 + with: + registry: "docker.io" + username: "${{ env.DOCKERHUB_USERNAME }}" + password: "${{ secrets.DOCKERHUB_TOKEN }}" + + - if: env.DOCKERHUB_USERNAME != '' + name: Release + env: + GIT_URL: "${{ needs.build.outputs.git_url }}" + DOCKER_TAG: "${{ needs.build.outputs.docker_tag }}" + run: make container.push diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index abdaf0c18..b40ae26ab 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -94,49 +94,3 @@ jobs: - name: Build run: make themes.all - - dockers: - name: Docker - if: github.ref == 'refs/heads/master' - needs: - - test - - theme - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - runs-on: ubuntu-24.04 - steps: - - name: Checkout - if: env.DOCKERHUB_USERNAME != null - uses: actions/checkout@v4 - with: - # make sure "make docker.push" can get the git history - fetch-depth: '0' - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - architecture: 'x64' - - name: Cache Python dependencies - id: cache-python - uses: actions/cache@v4 - with: - path: | - ./local - ./.nvm - ./node_modules - key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }} - - name: Set up QEMU - if: env.DOCKERHUB_USERNAME != null - uses: docker/setup-qemu-action@v1 - - name: Set up Docker Buildx - if: env.DOCKERHUB_USERNAME != null - uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub - if: env.DOCKERHUB_USERNAME != null - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push - if: env.DOCKERHUB_USERNAME != null - run: make -e GIT_URL=$(git remote get-url origin) docker.buildx diff --git a/Makefile b/Makefile index c1c067149..15e43be08 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ ci.test: test.yamllint test.black test.types.ci test.pylint test.unit test.robo test: test.yamllint test.black test.types.dev test.pylint test.unit test.robot test.rst test.shell test.shell: $(Q)shellcheck -x -s dash \ - dockerfiles/docker-entrypoint.sh + container/docker-entrypoint.sh $(Q)shellcheck -x -s bash \ utils/brand.sh \ $(MTOOLS) \ @@ -77,7 +77,9 @@ test.shell: MANAGE += weblate.translations.commit weblate.push.translations MANAGE += data.all data.traits data.useragents data.locales data.currencies MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean -MANAGE += docker.build docker.push docker.buildx +MANAGE += podman.build +MANAGE += docker.build docker.buildx +MANAGE += container.build container.test container.push MANAGE += gecko.driver MANAGE += node.env node.env.dev node.clean MANAGE += py.build py.clean @@ -95,8 +97,8 @@ $(MANAGE): # short hands of selected targets -PHONY += docs docker themes +PHONY += docs container themes docs: docs.html -docker: docker.build +container: container.build themes: themes.all diff --git a/container/Dockerfile b/container/Dockerfile new file mode 100644 index 000000000..b0530dfec --- /dev/null +++ b/container/Dockerfile @@ -0,0 +1,100 @@ +FROM docker.io/library/python:3.13-slim AS builder + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + build-essential \ + brotli \ + # uwsgi + libpcre3-dev \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /usr/local/searxng/ + +COPY ./requirements.txt ./requirements.txt + +RUN --mount=type=cache,id=pip,target=/root/.cache/pip python -m venv ./venv \ + && . ./venv/bin/activate \ + && pip install -r requirements.txt \ + && pip install "uwsgi~=2.0" + +COPY ./searx/ ./searx/ + +ARG TIMESTAMP_SETTINGS=0 +ARG TIMESTAMP_UWSGI=0 + +RUN python -m compileall -q searx \ + && touch -c --date=@$TIMESTAMP_SETTINGS ./searx/settings.yml \ + && touch -c --date=@$TIMESTAMP_UWSGI ./container/uwsgi.ini \ + && find /usr/local/searxng/searx/static \ + \( -name '*.html' -o -name '*.css' -o -name '*.js' -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \ + -type f -exec gzip -9 -k {} + -exec brotli --best {} + + +ARG SEARXNG_UID=977 +ARG SEARXNG_GID=977 + +RUN grep -m1 root /etc/group > /tmp/.searxng.group \ + && grep -m1 root /etc/passwd > /tmp/.searxng.passwd \ + && echo "searxng:x:$SEARXNG_GID:" >> /tmp/.searxng.group \ + && echo "searxng:x:$SEARXNG_UID:$SEARXNG_GID:searxng:/usr/local/searxng:/bin/bash" >> /tmp/.searxng.passwd + +FROM docker.io/library/python:3.13-slim + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + # healthcheck + wget \ + # uwsgi + libpcre3 \ + libxml2 \ + mailcap \ + && rm -rf /var/lib/apt/lists/* + +COPY --chown=root:root --from=builder /tmp/.searxng.passwd /etc/passwd +COPY --chown=root:root --from=builder /tmp/.searxng.group /etc/group + +ARG LABEL_DATE="0001-01-01T00:00:00Z" +ARG GIT_URL="unspecified" +ARG SEARXNG_GIT_VERSION="unspecified" +ARG LABEL_VCS_REF="unspecified" +ARG LABEL_VCS_URL="unspecified" + +WORKDIR /usr/local/searxng/ + +COPY --chown=searxng:searxng --from=builder /usr/local/searxng/venv/ ./venv/ +COPY --chown=searxng:searxng --from=builder /usr/local/searxng/searx/ ./searx/ +COPY --chown=searxng:searxng ./container/ ./container/ + +LABEL org.opencontainers.image.authors="searxng <$GIT_URL>" \ + org.opencontainers.image.created=$LABEL_DATE \ + org.opencontainers.image.description="A privacy-respecting, hackable metasearch engine" \ + org.opencontainers.image.documentation="https://github.com/searxng/searxng-docker" \ + org.opencontainers.image.licenses="AGPL-3.0-or-later" \ + org.opencontainers.image.revision=$LABEL_VCS_REF \ + org.opencontainers.image.source=$LABEL_VCS_URL \ + org.opencontainers.image.title="searxng" \ + org.opencontainers.image.url=$LABEL_VCS_URL \ + org.opencontainers.image.version=$SEARXNG_GIT_VERSION + +ENV CONFIG_PATH=/etc/searxng \ + DATA_PATH=/var/cache/searxng + +ENV SEARXNG_VERSION=$SEARXNG_GIT_VERSION \ + INSTANCE_NAME=searxng \ + AUTOCOMPLETE="" \ + BASE_URL="" \ + BIND_ADDRESS=[::]:8080 \ + MORTY_KEY="" \ + MORTY_URL="" \ + SEARXNG_SETTINGS_PATH=$CONFIG_PATH/settings.yml \ + UWSGI_SETTINGS_PATH=$CONFIG_PATH/uwsgi.ini \ + UWSGI_WORKERS=%k \ + UWSGI_THREADS=4 + +VOLUME $CONFIG_PATH +VOLUME $DATA_PATH + +EXPOSE 8080 + +HEALTHCHECK CMD wget --quiet --tries=1 --spider http://localhost:8080/healthz || exit 1 + +ENTRYPOINT ["/usr/local/searxng/container/docker-entrypoint.sh"] diff --git a/dockerfiles/docker-entrypoint.sh b/container/docker-entrypoint.sh similarity index 97% rename from dockerfiles/docker-entrypoint.sh rename to container/docker-entrypoint.sh index 3668fb589..72d020dcf 100755 --- a/dockerfiles/docker-entrypoint.sh +++ b/container/docker-entrypoint.sh @@ -140,14 +140,14 @@ if [ "$SEARX_CONF" -eq "1" ]; then cat << EOF > /etc/searx/deprecated_volume_read_me.txt This Docker image uses the volume /etc/searxng Update your configuration: -* remove uwsgi.ini (or very carefully update your existing uwsgi.ini using https://github.com/searxng/searxng/blob/master/dockerfiles/uwsgi.ini ) +* remove uwsgi.ini (or very carefully update your existing uwsgi.ini using https://github.com/searxng/searxng/blob/master/container/uwsgi.ini ) * mount /etc/searxng instead of /etc/searx EOF fi # end of searx compatibility # make sure there are uwsgi settings -update_conf "${FORCE_CONF_UPDATE}" "${UWSGI_SETTINGS_PATH}" "/usr/local/searxng/dockerfiles/uwsgi.ini" "patch_uwsgi_settings" +update_conf "${FORCE_CONF_UPDATE}" "${UWSGI_SETTINGS_PATH}" "/usr/local/searxng/container/uwsgi.ini" "patch_uwsgi_settings" # make sure there are searxng settings update_conf "${FORCE_CONF_UPDATE}" "${SEARXNG_SETTINGS_PATH}" "/usr/local/searxng/searx/settings.yml" "patch_searxng_settings" diff --git a/Dockerfile b/container/legacy/Dockerfile similarity index 90% rename from Dockerfile rename to container/legacy/Dockerfile index 9aeb28214..5436ea5da 100644 --- a/Dockerfile +++ b/container/legacy/Dockerfile @@ -1,3 +1,5 @@ +# For armv7 architecture + FROM docker.io/library/python:3.13-slim AS builder RUN apt-get update \ @@ -16,8 +18,7 @@ WORKDIR /usr/local/searxng/ COPY ./requirements.txt ./requirements.txt -# Readd on #4707 "--mount=type=cache,id=pip,target=/root/.cache/pip" -RUN python -m venv ./venv \ +RUN --mount=type=cache,id=pip,target=/root/.cache/pip python -m venv ./venv \ && . ./venv/bin/activate \ && pip install -r requirements.txt \ && pip install "uwsgi~=2.0" @@ -29,7 +30,7 @@ ARG TIMESTAMP_UWSGI=0 RUN python -m compileall -q searx \ && touch -c --date=@$TIMESTAMP_SETTINGS ./searx/settings.yml \ - && touch -c --date=@$TIMESTAMP_UWSGI ./dockerfiles/uwsgi.ini \ + && touch -c --date=@$TIMESTAMP_UWSGI ./container/uwsgi.ini \ && find /usr/local/searxng/searx/static \ \( -name '*.html' -o -name '*.css' -o -name '*.js' -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \ -type f -exec gzip -9 -k {} + -exec brotli --best {} + @@ -69,7 +70,7 @@ WORKDIR /usr/local/searxng/ COPY --chown=searxng:searxng --from=builder /usr/local/searxng/venv/ ./venv/ COPY --chown=searxng:searxng --from=builder /usr/local/searxng/searx/ ./searx/ -COPY --chown=searxng:searxng ./dockerfiles/ ./dockerfiles/ +COPY --chown=searxng:searxng ./container/ ./container/ LABEL org.opencontainers.image.authors="searxng <$GIT_URL>" \ org.opencontainers.image.created=$LABEL_DATE \ @@ -90,8 +91,6 @@ ENV SEARXNG_VERSION=$SEARXNG_GIT_VERSION \ AUTOCOMPLETE="" \ BASE_URL="" \ BIND_ADDRESS=[::]:8080 \ - MORTY_KEY="" \ - MORTY_URL="" \ SEARXNG_SETTINGS_PATH=$CONFIG_PATH/settings.yml \ UWSGI_SETTINGS_PATH=$CONFIG_PATH/uwsgi.ini \ UWSGI_WORKERS=%k \ @@ -104,4 +103,4 @@ EXPOSE 8080 HEALTHCHECK CMD wget --quiet --tries=1 --spider http://localhost:8080/healthz || exit 1 -ENTRYPOINT ["/usr/local/searxng/dockerfiles/docker-entrypoint.sh"] +ENTRYPOINT ["/usr/local/searxng/container/docker-entrypoint.sh"] diff --git a/dockerfiles/uwsgi.ini b/container/uwsgi.ini similarity index 100% rename from dockerfiles/uwsgi.ini rename to container/uwsgi.ini diff --git a/docs/admin/installation-docker.rst b/docs/admin/installation-docker.rst index 09471891b..06b3fe465 100644 --- a/docs/admin/installation-docker.rst +++ b/docs/admin/installation-docker.rst @@ -145,13 +145,6 @@ shell inside container - `How to make bash scripts work in dash `_ - `Checking for Bashisms `_ -Like in many other distributions, Alpine's `/bin/sh -`__ is :man:`dash`. Dash is meant to be -`POSIX-compliant `__. -Compared to debian, in the Alpine image :man:`bash` is not installed. The -:origin:`dockerfiles/docker-entrypoint.sh` script is checked *against dash* -(``make tests.shell``). - To open a shell inside the container: .. code:: sh @@ -188,10 +181,10 @@ Command line `__. In the :origin:`Dockerfile` the ENTRYPOINT_ is defined as -:origin:`dockerfiles/docker-entrypoint.sh` +:origin:`container/docker-entrypoint.sh` .. code:: sh docker run --rm -it searxng/searxng -h -.. program-output:: ../dockerfiles/docker-entrypoint.sh -h +.. program-output:: ../container/docker-entrypoint.sh -h diff --git a/manage b/manage index 61bc68b74..ee2a29281 100755 --- a/manage +++ b/manage @@ -11,6 +11,9 @@ source "$(dirname "${BASH_SOURCE[0]}")/utils/lib.sh" # shellcheck source=utils/lib.sh source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_nvm.sh" +# shellcheck source=utils/lib_sxng_container.sh +source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_sxng_container.sh" + # shellcheck source=utils/lib_sxng_data.sh source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_sxng_data.sh" @@ -77,9 +80,6 @@ docs.: gh-pages : deploy on gh-pages branch prebuild : build reST include files (./${DOCS_BUILD}/includes) clean : clean documentation build -docker.: - build : build docker image - push : build and push docker image gecko.driver: download & install geckodriver if not already installed (required for robot_tests) @@ -101,6 +101,7 @@ EOF go.help node.help weblate.help + container.help data.help test.help themes.help @@ -136,90 +137,6 @@ webapp.run() { SEARXNG_DEBUG=1 pyenv.cmd python -m searx.webapp } -docker.push() { - docker.build push -} - -docker.buildx() { - docker.build buildx -} - -# shellcheck disable=SC2119 -docker.build() { - pyenv.install - - local SEARXNG_GIT_VERSION - local VERSION_GITCOMMIT - local GITHUB_USER - local SEARXNG_IMAGE_NAME - local BUILD - - build_msg DOCKER build - # run installation in a subprocess and activate pyenv - - # See https://www.shellcheck.net/wiki/SC1001 and others .. - # shellcheck disable=SC2031,SC2230,SC2002,SC2236,SC2143,SC1001 - ( set -e - pyenv.activate - - # Check if it is a git repository - if [ ! -d .git ]; then - die 1 "This is not Git repository" - fi - if [ ! -x "$(which git)" ]; then - die 1 "git is not installed" - fi - - if ! git remote get-url origin 2> /dev/null; then - die 1 "there is no remote origin" - fi - - # This is a git repository - git update-index -q --refresh - python -m searx.version freeze - eval "$(python -m searx.version)" - - # Get the last git commit id - VERSION_GITCOMMIT=$(echo "$VERSION_TAG" | cut -d+ -f2) - build_msg DOCKER "Last commit : $VERSION_GITCOMMIT" - - # define the docker image name - GITHUB_USER=$(echo "${GIT_URL}" | sed 's/.*github\.com\/\([^\/]*\).*/\1/') - SEARXNG_IMAGE_NAME="${SEARXNG_IMAGE_NAME:-${GITHUB_USER:-searxng}/searxng}" - - BUILD="build" - if [ "$1" = "buildx" ]; then - # buildx includes the push option - CACHE_TAG="${SEARXNG_IMAGE_NAME}:latest-build-cache" - BUILD="buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --push --cache-from=type=registry,ref=$CACHE_TAG --cache-to=type=registry,ref=$CACHE_TAG,mode=max" - shift - fi - build_msg DOCKER "Build command: ${BUILD}" - - # build Docker image - build_msg DOCKER "Building image ${SEARXNG_IMAGE_NAME}:${SEARXNG_GIT_VERSION}" - # shellcheck disable=SC2086 - docker $BUILD \ - --build-arg BASE_IMAGE="${DEPENDENCIES_IMAGE_NAME}" \ - --build-arg GIT_URL="${GIT_URL}" \ - --build-arg SEARXNG_DOCKER_TAG="${DOCKER_TAG}" \ - --build-arg SEARXNG_GIT_VERSION="${VERSION_STRING}" \ - --build-arg VERSION_GITCOMMIT="${VERSION_GITCOMMIT}" \ - --build-arg LABEL_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ - --build-arg LABEL_VCS_REF="$(git rev-parse HEAD)" \ - --build-arg LABEL_VCS_URL="${GIT_URL}" \ - --build-arg TIMESTAMP_SETTINGS="$(git log -1 --format="%cd" --date=unix -- searx/settings.yml)" \ - --build-arg TIMESTAMP_UWSGI="$(git log -1 --format="%cd" --date=unix -- dockerfiles/uwsgi.ini)" \ - -t "${SEARXNG_IMAGE_NAME}:latest" -t "${SEARXNG_IMAGE_NAME}:${DOCKER_TAG}" . - - if [ "$1" = "push" ]; then - docker push "${SEARXNG_IMAGE_NAME}:latest" - docker push "${SEARXNG_IMAGE_NAME}:${DOCKER_TAG}" - fi - ) - dump_return $? -} - # shellcheck disable=SC2119 gecko.driver() { pyenv.install diff --git a/searx/version.py b/searx/version.py index d2013808b..565cc7e7a 100644 --- a/searx/version.py +++ b/searx/version.py @@ -41,6 +41,12 @@ def subprocess_run(args, **kwargs): def get_git_url_and_branch(): + # handle GHA directly + if "GITHUB_REPOSITORY" in os.environ and "GITHUB_REF_NAME" in os.environ: + git_url = f"https://github.com/{os.environ['GITHUB_REPOSITORY']}" + git_branch = os.environ["GITHUB_REF_NAME"] + return git_url, git_branch + try: ref = subprocess_run("git rev-parse --abbrev-ref @{upstream}") except subprocess.CalledProcessError: diff --git a/utils/lib_sxng_container.sh b/utils/lib_sxng_container.sh new file mode 100644 index 000000000..b3f84594f --- /dev/null +++ b/utils/lib_sxng_container.sh @@ -0,0 +1,319 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: AGPL-3.0-or-later + +container.help() { + cat </dev/null; then + die 1 "Git is not installed" + fi + + # Check if podman or docker is installed + if [ "$1" = "docker" ]; then + if command -v docker &>/dev/null; then + container_engine="docker" + else + die 1 "Docker is not installed" + fi + elif [ "$1" = "podman" ]; then + if command -v podman &>/dev/null; then + container_engine="podman" + else + die 1 "Podman is not installed" + fi + else + # If no explicit engine is passed, prioritize podman over docker + if command -v podman &>/dev/null; then + container_engine="podman" + elif command -v docker &>/dev/null; then + container_engine="docker" + else + die 1 "Podman/Docker is not installed" + fi + fi + info_msg "Selected engine: $container_engine" + + # Setup arch specific + case $parch in + "X64" | "x86_64" | "amd64") + dockerfile="Dockerfile" + arch="amd64" + variant="" + platform="linux/$arch" + ;; + "ARM64" | "aarch64" | "arm64") + dockerfile="Dockerfile" + arch="arm64" + variant="" + platform="linux/$arch" + ;; + "ARMV7" | "armhf" | "armv7l" | "armv7") + dockerfile="legacy/Dockerfile" + arch="arm" + variant="v7" + platform="linux/$arch/$variant" + ;; + *) + err_msg "Unsupported architecture; $parch" + exit 1 + ;; + esac + info_msg "Selected platform: $platform" + + pyenv.install + + ( + set -e + pyenv.activate + + # Check if it is a git repository + if [ ! -d .git ]; then + die 1 "This is not Git repository" + fi + + if ! git remote get-url origin &>/dev/null; then + die 1 "There is no remote origin" + fi + + # This is a git repository + git update-index -q --refresh + python -m searx.version freeze + eval "$(python -m searx.version)" + + info_msg "Set \$VERSION_STRING: $VERSION_STRING" + info_msg "Set \$VERSION_TAG: $VERSION_TAG" + info_msg "Set \$DOCKER_TAG: $DOCKER_TAG" + info_msg "Set \$GIT_URL: $GIT_URL" + info_msg "Set \$GIT_BRANCH: $GIT_BRANCH" + + if [ "$container_engine" = "podman" ]; then + params_build_builder="build --format=docker --platform=$platform --target=builder --layers --identity-label=false" + params_build="build --format=docker --platform=$platform --layers --squash-all --omit-history --identity-label=false" + else + params_build_builder="build --platform=$platform --target=builder" + params_build="build --platform=$platform --squash" + fi + + if [ "$GITHUB_ACTIONS" = "true" ]; then + params_build_builder+=" --cache-from=ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache --cache-to=ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache" + params_build+=" --cache-from=ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache --cache-to=ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache" + + # Tags + params_build+=" --tag=ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache:$CONTAINER_IMAGE_NAME-$arch$variant" + else + # Tags + params_build+=" --tag=localhost/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:latest" + params_build+=" --tag=localhost/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:$DOCKER_TAG" + fi + + # shellcheck disable=SC2086 + "$container_engine" $params_build_builder \ + --build-arg="TIMESTAMP_SETTINGS=$(git log -1 --format="%cd" --date=unix -- ./searx/settings.yml)" \ + --build-arg="TIMESTAMP_UWSGI=$(git log -1 --format="%cd" --date=unix -- ./container/uwsgi.ini)" \ + --tag="localhost/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:builder" \ + --file="./container/$dockerfile" \ + . + build_msg CONTAINER "Image \"builder\" built" + + # shellcheck disable=SC2086 + "$container_engine" $params_build \ + --build-arg="GIT_URL=$GIT_URL" \ + --build-arg="SEARXNG_GIT_VERSION=$VERSION_STRING" \ + --build-arg="LABEL_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + --build-arg="LABEL_VCS_REF=$(git rev-parse HEAD)" \ + --build-arg="LABEL_VCS_URL=$GIT_URL" \ + --file="./container/$dockerfile" \ + . + build_msg CONTAINER "Image built" + + if [ "$GITHUB_ACTIONS" = "true" ]; then + "$container_engine" push "ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache:$CONTAINER_IMAGE_NAME-$arch$variant" + + # Output to GHA + { + echo "version_string=$VERSION_STRING" + echo "version_tag=$VERSION_TAG" + echo "docker_tag=$DOCKER_TAG" + echo "git_url=$GIT_URL" + echo "git_branch=$GIT_BRANCH" + } >>"$GITHUB_OUTPUT" + fi + ) + dump_return $? +} + +container.test() { + local parch=${OVERRIDE_ARCH:-$(uname -m)} + local arch + local variant + local platform + + if [ "$GITHUB_ACTIONS" != "true" ]; then + die 1 "This command is intended to be run in GitHub Actions" + fi + + # Check if podman is installed + if ! command -v podman &>/dev/null; then + die 1 "podman is not installed" + fi + + # Setup arch specific + case $parch in + "X64" | "x86_64" | "amd64") + arch="amd64" + variant="" + platform="linux/$arch" + ;; + "ARM64" | "aarch64" | "arm64") + arch="arm64" + variant="" + platform="linux/$arch" + ;; + "ARMV7" | "armhf" | "armv7l" | "armv7") + arch="arm" + variant="v7" + platform="linux/$arch/$variant" + ;; + *) + err_msg "Unsupported architecture; $parch" + exit 1 + ;; + esac + build_msg CONTAINER "Selected platform: $platform" + + ( + set -e + + podman pull "ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache:$CONTAINER_IMAGE_NAME-$arch$variant" + + name="$CONTAINER_IMAGE_NAME-$(date +%N)" + + podman create --name="$name" --rm --timeout=60 --network="host" \ + "ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache:$CONTAINER_IMAGE_NAME-$arch$variant" >/dev/null + + podman start "$name" >/dev/null + podman logs -f "$name" & + pid_logs=$! + + # Wait until container is ready + sleep 5 + + curl -vf --max-time 5 "http://localhost:8080/healthz" + + kill $pid_logs &>/dev/null || true + podman stop "$name" >/dev/null + ) + dump_return $? +} + +container.push() { + # Architectures on manifest + local release_archs=("amd64" "arm64" "armv7") + + local archs=() + local variants=() + local platforms=() + + if [ "$GITHUB_ACTIONS" != "true" ]; then + die 1 "This command is intended to be run in GitHub Actions" + fi + + # Check if podman is installed + if ! command -v podman &>/dev/null; then + die 1 "podman is not installed" + fi + + for arch in "${release_archs[@]}"; do + case $arch in + "X64" | "x86_64" | "amd64") + archs+=("amd64") + variants+=("") + platforms+=("linux/${archs[-1]}") + ;; + "ARM64" | "aarch64" | "arm64") + archs+=("arm64") + variants+=("") + platforms+=("linux/${archs[-1]}") + ;; + "ARMV7" | "armv7" | "armhf" | "arm") + archs+=("arm") + variants+=("v7") + platforms+=("linux/${archs[-1]}/${variants[-1]}") + ;; + *) + err_msg "Unsupported architecture; $arch" + exit 1 + ;; + esac + done + + ( + set -e + + # Pull archs + for i in "${!archs[@]}"; do + podman pull "ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache:$CONTAINER_IMAGE_NAME-${archs[$i]}${variants[$i]}" + done + + # Manifest tags + release_tags=("latest") + release_tags+=("$DOCKER_TAG") + + # Create manifests + for tag in "${release_tags[@]}"; do + if ! podman manifest exists "localhost/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:$tag"; then + podman manifest create "localhost/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:$tag" + fi + + # Add archs to manifest + for i in "${!archs[@]}"; do + podman manifest add \ + "localhost/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:$tag" \ + "containers-storage:ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache:$CONTAINER_IMAGE_NAME-${archs[$i]}${variants[$i]}" + done + done + + podman image list + + # Push manifests + for tag in "${release_tags[@]}"; do + build_msg CONTAINER "Pushing manifest with tag: $tag" + + podman manifest push \ + "localhost/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:$tag" \ + "docker://docker.io/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:$tag" + done + ) + dump_return $? +} + +# Alias +podman.build() { + container.build podman +} + +# Alias +docker.build() { + container.build docker +} + +# Alias +docker.buildx() { + container.build docker +} From da3c640cef71032bced6f4e8baf1665801cdc4b9 Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sun, 11 May 2025 18:39:25 +0200 Subject: [PATCH 13/74] revert using null keyword env.DOCKERHUB_USERNAME shouldn't be an empty string as it's defined and set (I think, I can't see this). Even if wasn't defined, GitHub Org/Repo wide envs/secrets should return an empty string (?) --- .github/workflows/container.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index d232a0737..ee1093acb 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -153,13 +153,13 @@ jobs: - test steps: - - if: env.DOCKERHUB_USERNAME != '' + - if: env.DOCKERHUB_USERNAME != null name: Checkout uses: actions/checkout@v4 with: persist-credentials: "false" - - if: env.DOCKERHUB_USERNAME != '' + - if: env.DOCKERHUB_USERNAME != null name: Login to GHCR uses: docker/login-action@v3 with: @@ -167,7 +167,7 @@ jobs: username: "${{ github.repository_owner }}" password: "${{ secrets.GITHUB_TOKEN }}" - - if: env.DOCKERHUB_USERNAME != '' + - if: env.DOCKERHUB_USERNAME != null name: Login to Docker Hub uses: docker/login-action@v3 with: @@ -175,7 +175,7 @@ jobs: username: "${{ env.DOCKERHUB_USERNAME }}" password: "${{ secrets.DOCKERHUB_TOKEN }}" - - if: env.DOCKERHUB_USERNAME != '' + - if: env.DOCKERHUB_USERNAME != null name: Release env: GIT_URL: "${{ needs.build.outputs.git_url }}" From 750a7b4d6fba37f5d0d6bf42b99a865dc7e035e8 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Mon, 12 May 2025 08:27:16 +0200 Subject: [PATCH 14/74] [doc] add chapter on the purpose of (git) commits (#4729) Chapter on the purpose of (git) commits The commits and their messages are elementary for the traceability of changes and are unfortunately still too often given too little attention. It therefore seems necessary to dedicate a chapter to this topic in the context of development. Signed-off-by: Markus Heiser --- docs/dev/commits.rst | 108 ++++++++++++++++++++++++++++++++ docs/dev/contribution_guide.rst | 30 +++------ docs/dev/index.rst | 1 + 3 files changed, 116 insertions(+), 23 deletions(-) create mode 100644 docs/dev/commits.rst diff --git a/docs/dev/commits.rst b/docs/dev/commits.rst new file mode 100644 index 000000000..e9b10fa2e --- /dev/null +++ b/docs/dev/commits.rst @@ -0,0 +1,108 @@ +.. _create commit: + +=============================== +Git Commits & Change Management +=============================== + +.. sidebar:: Create good commits! + + - `Conventional Commits`_ + - `Structural split of changes`_ + - `Git Commit Good Practice`_ + +A commit and its commit message are among the most important information +available to a developer for bug fixing and further development. A commit is a +change and changes have a context (a change request). + +In a SCM system (git), the change history is derived from the commit history. A +commit message is therefore part of the documentation for change management and +thus elementary for the traceability of changes. + +**What a commit is not**: *A commit to an SCM system is not used to save files!* + +A commit should always have a context and the commit message describes what is +to be changed in that context, just as a function description should describe +what the intention and the goal of the function is, a commit message should +describe what the intention and the goal of that commit is. + +The commit messages form the history and are the first and therefore most +important information a developer has when he has to research when and why a +change had to be made and how it was made (what the goal was). + +Like any text, a commit message should be written for the reader and not from +the perspective of the author. + +When scrolling through the history, the first thing one see is the title of the +commit message. Therefore the title should describe the change as briefly and +precisely as possible ... followed by a blank line and then a somewhat detailed +description of the change. + +---- + +The follwing rules should be in mind, when creating a commit: + +- **Commit history should be read like a history book.** +- **Commit messages are for the reader not for the author of the commit.** +- **A commit is the atomic code-modification of a change in change management.** +- **Think about which descriptions from your PR might belong in the commit message.** +- **The maximum line length in a commit message is 80 characters.** + +---- + +Choose meaningful commit messages: + + .. code:: + + [type] optional scope: description + + [body] + + [optional trailers] + +``[type]``: + Commits MUST be prefixed with a type .. ``feat``, ``fix``, ``refactor``, + ``mod``, ``upd``, ``doc``, ``l10n``, ``build`` .. + +``[body]`` + `Information in commit messages`_ + +``[optional trailers]``: + - `Signed-off-by`_: certify that the committer has the rights to submit the + work under the project’s license. That the developer has this right is a + prerequisite for a merge. If the `Signed-off-by`_ is not set in the + commit, the contributor enters his `Developer's Certificate of Origin` at + the latest when creating a PR! + - Closes: Link to the bug report or the bug number (e.g. ``Closes: #10``) + - `Co-authored-by`_: email address of the co-author + - Reported-by: email address (if there is no bug report) + - Suggested-by: email address (if there is no bug report) + +---- + +To give examples at hand, here are a few commits. Follow the links to see the +full commit messages: + +:patch:`44d941c93` + ``[fix] mojeek web engine: don't add empty fmt argument for web searches`` + +:patch:`feb15e387` + ``[fix] brave.news engine: response is HTML and no longer JSON`` + +:patch:`bdfe1c2a1` + ``[mod] engines: migration of the individual cache solutions to EngineCache`` + + +.. _Conventional Commits: + https://www.conventionalcommits.org/ +.. _Structural split of changes: + https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes +.. _Git Commit Good Practice: + https://wiki.openstack.org/wiki/GitCommitMessages +.. _Information in commit messages: + https://wiki.openstack.org/wiki/GitCommitMessages#Information_in_commit_messages +.. _`Developer's Certificate of Origin`: + https://developercertificate.org/ +.. _Signed-off-by: + https://git-scm.com/docs/git-commit#Documentation/git-commit.txt-code--signoffcode +.. _Co-authored-by: + https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors diff --git a/docs/dev/contribution_guide.rst b/docs/dev/contribution_guide.rst index 61dd28c05..026cfbe73 100644 --- a/docs/dev/contribution_guide.rst +++ b/docs/dev/contribution_guide.rst @@ -30,15 +30,15 @@ SearXNG was born out of the need for a **privacy-respecting** search tool which can be extended easily to maximize both its search and its privacy protecting capabilities. -Some widely used search engine features may work differently, -may be turned off by default, or may not be implemented at all in SearXNG +Some widely used search engine features may work differently, +may be turned off by default, or may not be implemented at all in SearXNG **as a consequence of a privacy-by-design approach**. Following this approach, features reducing the privacy preserving aspects of SearXNG should be switched off by default or should not be implemented at all. There are plenty of search engines already providing such features. If a feature reduces -SearXNG's efficacy in protecting a user's privacy, the user must be informed about -the effect of choosing to enable it. Features that protect privacy but differ from the +SearXNG's efficacy in protecting a user's privacy, the user must be informed about +the effect of choosing to enable it. Features that protect privacy but differ from the expectations of the user should also be carefully explained to them. Also, if you think that something works weird with SearXNG, it might be because @@ -56,20 +56,12 @@ Code ==== .. _PEP8: https://www.python.org/dev/peps/pep-0008/ -.. _Conventional Commits: https://www.conventionalcommits.org/ -.. _Git Commit Good Practice: https://wiki.openstack.org/wiki/GitCommitMessages .. _Structural split of changes: https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes -.. _gitmoji: https://gitmoji.carloscuesta.me/ -.. _Semantic PR: https://github.com/zeke/semantic-pull-requests .. sidebar:: Create good commits! - - `Structural split of changes`_ - - `Conventional Commits`_ - - `Git Commit Good Practice`_ - - some like to use: gitmoji_ - - not yet active: `Semantic PR`_ + - :ref:`create commit` In order to submit a patch, please follow the steps below: @@ -88,15 +80,7 @@ In order to submit a patch, please follow the steps below: - Add yourself to the :origin:`AUTHORS.rst` file. -- Choose meaningful commit messages, read `Conventional Commits`_ - - .. code:: - - [optional scope]: - - [optional body] - - [optional footer(s)] +- Choose meaningful commit messages, see :ref:`create commit` - Create a pull request. @@ -161,7 +145,7 @@ changed (:ref:`make docs.clean`). Live builds are implemented by sphinx-autobuild_. Use environment ``$(SPHINXOPTS)`` to pass arguments to the sphinx-autobuild_ command. You can -pass any argument except for the ``--host`` option (which is always set to ``0.0.0.0``). +pass any argument except for the ``--host`` option (which is always set to ``0.0.0.0``). E.g., to find and use a free port, use: .. code:: sh diff --git a/docs/dev/index.rst b/docs/dev/index.rst index 01a16ba80..6d601d166 100644 --- a/docs/dev/index.rst +++ b/docs/dev/index.rst @@ -6,6 +6,7 @@ Developer documentation :maxdepth: 2 quickstart + commits rtm_asdf contribution_guide extended_types From 346d7fe0192ea180552adbd2877dc13b3dd4050e Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Mon, 12 May 2025 16:42:43 +0200 Subject: [PATCH 15/74] [mod] CI: dependabot group updates by minor & patch and major updates (#4773) By default, Dependabot opens a new pull request to update each dependency and we have a very large number of Dependabot pull requests to review and merge, which can quickly become difficult to manage. The intention of this patch to dependabot is to have: - one PR for all minor & patch level updates - one PR for every dependency with a major update [1] https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/optimizing-pr-creation-version-updates [2] https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference#groups Signed-off-by: Markus Heiser --- .github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a106397f3..46e341362 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,6 +10,12 @@ updates: target-branch: "master" commit-message: prefix: "[upd] pypi:" + groups: + minor: + applies-to: version-updates + update-types: + - "minor" + - "patch" - package-ecosystem: "npm" directory: "/client/simple" @@ -20,6 +26,12 @@ updates: target-branch: "master" commit-message: prefix: "[upd] web-client (simple):" + groups: + minor: + applies-to: version-updates + update-types: + - "minor" + - "patch" - package-ecosystem: "docker" directory: "/" From 64a5b6920f1fd386d5ec8bce575b2ea0c82b2572 Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Mon, 12 May 2025 10:36:04 +0200 Subject: [PATCH 16/74] [mod] lib_sxng_container.sh use required_commands() helper Suggested-by: @return42 https://github.com/searxng/searxng/pull/4764#discussion_r2083564489 --- utils/lib_sxng_container.sh | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/utils/lib_sxng_container.sh b/utils/lib_sxng_container.sh index b3f84594f..1df9ef358 100644 --- a/utils/lib_sxng_container.sh +++ b/utils/lib_sxng_container.sh @@ -19,24 +19,14 @@ container.build() { local variant local platform - # Check if git is installed - if ! command -v git &>/dev/null; then - die 1 "Git is not installed" - fi + required_commands git # Check if podman or docker is installed - if [ "$1" = "docker" ]; then - if command -v docker &>/dev/null; then - container_engine="docker" - else - die 1 "Docker is not installed" - fi - elif [ "$1" = "podman" ]; then - if command -v podman &>/dev/null; then - container_engine="podman" - else - die 1 "Podman is not installed" + if [ "$1" = "podman" ] || [ "$1" = "docker" ]; then + if ! command -v "$1" &>/dev/null; then + die 42 "$1 is not installed" fi + container_engine="$1" else # If no explicit engine is passed, prioritize podman over docker if command -v podman &>/dev/null; then @@ -44,7 +34,7 @@ container.build() { elif command -v docker &>/dev/null; then container_engine="docker" else - die 1 "Podman/Docker is not installed" + die 42 "no compatible container engine is installed (podman or docker)" fi fi info_msg "Selected engine: $container_engine" @@ -168,10 +158,7 @@ container.test() { die 1 "This command is intended to be run in GitHub Actions" fi - # Check if podman is installed - if ! command -v podman &>/dev/null; then - die 1 "podman is not installed" - fi + required_commands podman # Setup arch specific case $parch in @@ -234,10 +221,7 @@ container.push() { die 1 "This command is intended to be run in GitHub Actions" fi - # Check if podman is installed - if ! command -v podman &>/dev/null; then - die 1 "podman is not installed" - fi + required_commands podman for arch in "${release_archs[@]}"; do case $arch in From 945b30a1c459e6b437a3f379e638c2002a81fcab Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Mon, 12 May 2025 10:41:49 +0200 Subject: [PATCH 17/74] [mod] lib_sxng_container.sh: replace echo commands with heredoc Suggested-by: @return42 https://github.com/searxng/searxng/pull/4764#discussion_r2083571202 --- utils/lib_sxng_container.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/utils/lib_sxng_container.sh b/utils/lib_sxng_container.sh index 1df9ef358..f87b64e2b 100644 --- a/utils/lib_sxng_container.sh +++ b/utils/lib_sxng_container.sh @@ -136,13 +136,13 @@ container.build() { "$container_engine" push "ghcr.io/$CONTAINER_IMAGE_ORGANIZATION/cache:$CONTAINER_IMAGE_NAME-$arch$variant" # Output to GHA - { - echo "version_string=$VERSION_STRING" - echo "version_tag=$VERSION_TAG" - echo "docker_tag=$DOCKER_TAG" - echo "git_url=$GIT_URL" - echo "git_branch=$GIT_BRANCH" - } >>"$GITHUB_OUTPUT" + cat <>"$GITHUB_OUTPUT" +version_string=$VERSION_STRING +version_tag=$VERSION_TAG +docker_tag=$DOCKER_TAG +git_url=$GIT_URL +git_branch=$GIT_BRANCH +EOF fi ) dump_return $? From 5d99373bc65c7087ee743a1fe44897bad6065338 Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Mon, 12 May 2025 23:43:47 +0200 Subject: [PATCH 18/74] [fix] DOCKERHUB_USERNAME env reference (#4778) When making the container rework, I unknowingly deleted the section where an env with the same name as the secret was defined on the job scope, making it look like it was originally defined as an organization env. Since we can't validate the secrets in a condition directly, it's better to let docker/login-action take care of failing the entire job if the credentials are invalid. Reported in: https://github.com/searxng/searxng/issues/4777 --- .github/workflows/container.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index ee1093acb..ef92a0662 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -153,30 +153,26 @@ jobs: - test steps: - - if: env.DOCKERHUB_USERNAME != null - name: Checkout + - name: Checkout uses: actions/checkout@v4 with: persist-credentials: "false" - - if: env.DOCKERHUB_USERNAME != null - name: Login to GHCR + - name: Login to GHCR uses: docker/login-action@v3 with: registry: "ghcr.io" username: "${{ github.repository_owner }}" password: "${{ secrets.GITHUB_TOKEN }}" - - if: env.DOCKERHUB_USERNAME != null - name: Login to Docker Hub + - name: Login to Docker Hub uses: docker/login-action@v3 with: registry: "docker.io" - username: "${{ env.DOCKERHUB_USERNAME }}" + username: "${{ secrets.DOCKERHUB_USERNAME }}" password: "${{ secrets.DOCKERHUB_TOKEN }}" - - if: env.DOCKERHUB_USERNAME != null - name: Release + - name: Release env: GIT_URL: "${{ needs.build.outputs.git_url }}" DOCKER_TAG: "${{ needs.build.outputs.docker_tag }}" From 90068660196d898896219d1df7a088348c5d3d14 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Tue, 13 May 2025 10:18:28 +0200 Subject: [PATCH 19/74] [fix] engine archlinux: avoid Anubis challenge by User-Agent "SearXNG" (#4779) Of the archlinux wikis only wiki.archlinux.org has a has Anubis challenge. About Anubis[1]: > Anubis decides to present a challenge using this logic: > > - User-Agent contains "Mozilla" > ... > This should ensure that git clients, RSS readers, and other low-harm clients > can get through without issue .. [1] https://github.com/TecharoHQ/anubis/blob/6c0ff3f4d5e7a66ea85e5873e6ee4c28692091d7/docs/docs/design/how-anubis-works.mdx#challenge-presentation Suggested-by: @unixfox https://github.com/searxng/searxng/issues/4646#issuecomment-2855322406 Closes: https://github.com/searxng/searxng/issues/4646 Signed-off-by: Markus Heiser --- searx/engines/archlinux.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/searx/engines/archlinux.py b/searx/engines/archlinux.py index 820b31799..63de157dc 100644 --- a/searx/engines/archlinux.py +++ b/searx/engines/archlinux.py @@ -51,6 +51,9 @@ def request(query, params): if netloc == main_wiki: eng_lang: str = traits.get_language(sxng_lang, 'English') # type: ignore query += ' (' + eng_lang + ')' + # wiki.archlinux.org is protected by anubis + # - https://github.com/searxng/searxng/issues/4646#issuecomment-2817848019 + params['headers']['User-Agent'] = "SearXNG" elif netloc == 'wiki.archlinuxcn.org': base_url = 'https://' + netloc + '/wzh/index.php?' From 2cfd3fc44b16e7f3c6010c0ac1004efb6dacf382 Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sat, 5 Apr 2025 10:59:07 +0200 Subject: [PATCH 20/74] [enh] tidy: clean old morty, filtron, searx references Everyone should have already switched from legacy methods --- Makefile | 5 +- container/docker-entrypoint.sh | 43 +----- docs/admin/arch_public.dot | 2 +- docs/admin/update-searxng.rst | 45 ------- docs/dev/lxcdev.rst | 5 +- docs/own-instance.rst | 3 +- docs/utils/searxng.sh.rst | 2 +- searx/settings.yml | 12 -- searx/settings_defaults.py | 5 - searx/templates/simple/macros.html | 4 +- .../simple/result_templates/code.html | 2 +- .../simple/result_templates/default.html | 2 +- .../simple/result_templates/map.html | 2 +- .../simple/result_templates/paper.html | 2 +- .../simple/result_templates/products.html | 2 +- .../simple/result_templates/torrent.html | 2 +- .../simple/result_templates/videos.html | 2 +- searx/webapp.py | 25 ---- tests/unit/settings/user_settings_simple.yml | 3 - utils/filtron.sh | 125 ------------------ utils/lib.sh | 4 +- utils/morty.sh | 124 ----------------- utils/searx.sh | 88 ------------ utils/searxng.sh | 9 -- .../lib/systemd/system/filtron.service | 29 ---- .../lib/systemd/system/morty.service | 29 ---- 26 files changed, 18 insertions(+), 558 deletions(-) delete mode 100755 utils/filtron.sh delete mode 100755 utils/morty.sh delete mode 100755 utils/searx.sh delete mode 100644 utils/templates/lib/systemd/system/filtron.service delete mode 100644 utils/templates/lib/systemd/system/morty.service diff --git a/Makefile b/Makefile index 15e43be08..917d3aeb4 100644 --- a/Makefile +++ b/Makefile @@ -65,10 +65,7 @@ test.shell: utils/lib_redis.sh \ utils/searxng.sh \ utils/lxc.sh \ - utils/lxc-searxng.env \ - utils/searx.sh \ - utils/filtron.sh \ - utils/morty.sh + utils/lxc-searxng.env $(Q)$(MTOOLS) build_msg TEST "$@ OK" diff --git a/container/docker-entrypoint.sh b/container/docker-entrypoint.sh index 72d020dcf..ee14b2f05 100755 --- a/container/docker-entrypoint.sh +++ b/container/docker-entrypoint.sh @@ -12,8 +12,7 @@ Environment variables: INSTANCE_NAME settings.yml : general.instance_name AUTOCOMPLETE settings.yml : search.autocomplete BASE_URL settings.yml : server.base_url - MORTY_URL settings.yml : result_proxy.url - MORTY_KEY settings.yml : result_proxy.key + Volume: /etc/searxng the docker entry point copies settings.yml and uwsgi.ini in this directory (see the -f command line option)" @@ -70,20 +69,6 @@ patch_searxng_settings() { -e "s/autocomplete: \"\"/autocomplete: \"${AUTOCOMPLETE}\"/g" \ -e "s/ultrasecretkey/$(head -c 24 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9')/g" \ "${CONF}" - - # Morty configuration - - if [ -n "${MORTY_KEY}" ] && [ -n "${MORTY_URL}" ]; then - sed -i -e "s/image_proxy: false/image_proxy: true/g" \ - "${CONF}" - cat >> "${CONF}" <<-EOF - -# Morty configuration -result_proxy: - url: ${MORTY_URL} - key: !!binary "${MORTY_KEY}" -EOF - fi } update_conf() { @@ -122,30 +107,6 @@ update_conf() { fi } -# searx compatibility: copy /etc/searx/* to /etc/searxng/* -SEARX_CONF=0 -if [ -f "/etc/searx/settings.yml" ]; then - if [ ! -f "${SEARXNG_SETTINGS_PATH}" ]; then - printf '⚠️ /etc/searx/settings.yml is copied to /etc/searxng\n' - cp "/etc/searx/settings.yml" "${SEARXNG_SETTINGS_PATH}" - fi - SEARX_CONF=1 -fi -if [ -f "/etc/searx/uwsgi.ini" ]; then - printf '⚠️ /etc/searx/uwsgi.ini is ignored. Use the volume /etc/searxng\n' - SEARX_CONF=1 -fi -if [ "$SEARX_CONF" -eq "1" ]; then - printf '⚠️ The deprecated volume /etc/searx is mounted. Please update your configuration to use /etc/searxng ⚠️\n' - cat << EOF > /etc/searx/deprecated_volume_read_me.txt -This Docker image uses the volume /etc/searxng -Update your configuration: -* remove uwsgi.ini (or very carefully update your existing uwsgi.ini using https://github.com/searxng/searxng/blob/master/container/uwsgi.ini ) -* mount /etc/searxng instead of /etc/searx -EOF -fi -# end of searx compatibility - # make sure there are uwsgi settings update_conf "${FORCE_CONF_UPDATE}" "${UWSGI_SETTINGS_PATH}" "/usr/local/searxng/container/uwsgi.ini" "patch_uwsgi_settings" @@ -158,8 +119,6 @@ if [ $DRY_RUN -eq 1 ]; then exit fi -unset MORTY_KEY - printf 'Listen on %s\n' "${BIND_ADDRESS}" # Start uwsgi diff --git a/docs/admin/arch_public.dot b/docs/admin/arch_public.dot index 526fb53da..49b03d157 100644 --- a/docs/admin/arch_public.dot +++ b/docs/admin/arch_public.dot @@ -6,7 +6,7 @@ digraph G { browser [label="browser", shape=tab, fillcolor=aliceblue]; rp [label="reverse proxy"]; static [label="static files", shape=folder, href="url to configure static files", fillcolor=lightgray]; - uwsgi [label="uwsgi", shape=parallelogram href="https://docs.searxng.org/utils/searx.sh.html"] + uwsgi [label="uwsgi", shape=parallelogram href="https://docs.searxng.org/utils/searxng.sh.html"] redis [label="redis DB", shape=cylinder]; searxng1 [label="SearXNG #1", fontcolor=blue3]; searxng2 [label="SearXNG #2", fontcolor=blue3]; diff --git a/docs/admin/update-searxng.rst b/docs/admin/update-searxng.rst index b9d15c3f7..16715f00d 100644 --- a/docs/admin/update-searxng.rst +++ b/docs/admin/update-searxng.rst @@ -58,9 +58,6 @@ and then, to name just a few: - Bot protection has been switched from filtron to SearXNG's :ref:`limiter `, this requires a :ref:`Redis ` database. -- The image proxy morty is no longer needed, it has been replaced by the - :ref:`image proxy ` from SearXNG. - - To save bandwidth :ref:`cache busting ` has been implemented. To get in use, the ``static-expires`` needs to be set in the :ref:`uwsgi setup`. @@ -71,12 +68,6 @@ examples show, this is not always enough, sometimes services have to be set up or reconfigured and sometimes services that are no longer needed should be uninstalled. -.. hint:: - - First of all: SearXNG is installed by the script :ref:`searxng.sh`. If you - have old filtron, morty or searx setup you should consider complete - uninstall/reinstall. - Here you will find a list of changes that affect the infrastructure. Please check to what extent it is necessary to update your installations: @@ -85,39 +76,6 @@ check to what extent it is necessary to update your installations: file manually. -remove obsolete services ------------------------- - -If your searx instance was installed *"Step by step"* or by the *"Installation -scripts"*, you need to undo the installation procedure completely. If you have -morty & filtron installed, it is recommended to uninstall these services also. -In case of scripts, to uninstall use the scripts from the origin you installed -searx from or try:: - - $ sudo -H ./utils/filtron.sh remove all - $ sudo -H ./utils/morty.sh remove all - $ sudo -H ./utils/searx.sh remove all - -.. hint:: - - If you are migrate from searx take into account that the ``.config.sh`` is no - longer used. - -If you upgrade from searx or from before :pull:`1332` has been merged and you -have filtron and/or morty installed, don't forget to remove HTTP sites. - -Apache:: - - $ sudo -H ./utils/filtron.sh apache remove - $ sudo -H ./utils/morty.sh apache remove - -nginx:: - - $ sudo -H ./utils/filtron.sh nginx remove - $ sudo -H ./utils/morty.sh nginx remove - - - Check after Installation ------------------------ @@ -130,9 +88,6 @@ to see if there are some left overs. In this example there exists a *old* SearXNG checks -------------- ERROR: settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/ - INFO: [OK] (old) account 'searx' does not exists - INFO: [OK] (old) account 'filtron' does not exists - INFO: [OK] (old) account 'morty' does not exists ... INFO searx.redisdb : connecting to Redis db=0 path='/usr/local/searxng-redis/run/redis.sock' INFO searx.redisdb : connected to Redis diff --git a/docs/dev/lxcdev.rst b/docs/dev/lxcdev.rst index 79716ae57..9edd9f672 100644 --- a/docs/dev/lxcdev.rst +++ b/docs/dev/lxcdev.rst @@ -319,13 +319,13 @@ To *inspect* the SearXNG instance (already described above): .. code:: bash - $ ./utils/searx.sh inspect service + $ ./utils/searxng.sh inspect service .. group-tab:: desktop (HOST) .. code:: bash - $ sudo -H ./utils/lxc.sh cmd searxng-archlinux ./utils/searx.sh inspect service + $ sudo -H ./utils/lxc.sh cmd searxng-archlinux ./utils/searxng.sh inspect service Run :ref:`makefile`, e.g. to test inside the container: @@ -435,4 +435,3 @@ use: [searxng-archlinux] SEARXNG_URL : http:///n.n.n.140/searxng [searxng-archlinux] SEARXNG_PORT : 8888 [searxng-archlinux] SEARXNG_BIND_ADDRESS : 127.0.0.1 - diff --git a/docs/own-instance.rst b/docs/own-instance.rst index 7d79f26c2..8c0009aff 100644 --- a/docs/own-instance.rst +++ b/docs/own-instance.rst @@ -39,8 +39,7 @@ Removing private data means not sending cookies to external search engines and generating a random browser profile for every request. Thus, it does not matter if a public or private instance handles the request, because it is anonymized in both cases. The IP address used will be the IP of the instance, but SearXNG can also be -configured to use proxy or Tor. `Result proxy -`__ is supported, too. +configured to use proxy or Tor. SearXNG does not serve ads or tracking content, unlike most search services. Therefore, private data is not forwarded to third parties who might monetize it. Besides diff --git a/docs/utils/searxng.sh.rst b/docs/utils/searxng.sh.rst index bedc1ba4c..d45d7014f 100644 --- a/docs/utils/searxng.sh.rst +++ b/docs/utils/searxng.sh.rst @@ -28,7 +28,7 @@ In most cases you will install SearXNG simply by running the command: .. code:: bash - sudo -H ./utils/searx.sh install all + sudo -H ./utils/searxng.sh install all The installation is described in chapter :ref:`installation basic`. diff --git a/searx/settings.yml b/searx/settings.yml index d756e9b1c..7e0455701 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -169,18 +169,6 @@ ui: # - image_proxy # - query_in_title -# searx supports result proxification using an external service: -# https://github.com/asciimoo/morty uncomment below section if you have running -# morty proxy the key is base64 encoded (keep the !!binary notation) -# Note: since commit af77ec3, morty accepts a base64 encoded key. -# -# result_proxy: -# url: http://127.0.0.1:3000/ -# # the key is a base64 encoded string, the YAML !!binary prefix is optional -# key: !!binary "your_morty_proxy_key" -# # [true|false] enable the "proxy" button next to each result -# proxify_results: true - # communication with search engines # outgoing: diff --git a/searx/settings_defaults.py b/searx/settings_defaults.py index b91657ff6..4cee7e345 100644 --- a/searx/settings_defaults.py +++ b/searx/settings_defaults.py @@ -230,11 +230,6 @@ SCHEMA = { 'extra_proxy_timeout': SettingsValue(int, 0), 'networks': {}, }, - 'result_proxy': { - 'url': SettingsValue((None, str), None), - 'key': SettingsBytesValue((None, bytes), None), - 'proxify_results': SettingsValue(bool, False), - }, 'plugins': SettingsValue(dict, {}), 'checker': { 'off_when_debug': SettingsValue(bool, True, None), diff --git a/searx/templates/simple/macros.html b/searx/templates/simple/macros.html index 6010a5a3d..df8469d72 100644 --- a/searx/templates/simple/macros.html +++ b/searx/templates/simple/macros.html @@ -44,10 +44,10 @@ {%- endmacro -%} -{%- macro result_sub_footer(result, proxify) -%} +{%- macro result_sub_footer(result) -%}

{% for engine in result.engines %}{{ engine }}{% endfor %} - {{ icon_small('ellipsis-vertical') + result_link(cache_url + result.url, _('cached'), "cache_link") }}‎ {% if proxify and proxify_results %} {{ result_link(proxify(result.url), _('proxied'), "proxyfied_link") }} {% endif %} + {{ icon_small('ellipsis-vertical') + result_link(cache_url + result.url, _('cached'), "cache_link") }}
{{- '' -}}
{{- '' -}} {%- endmacro -%} diff --git a/searx/templates/simple/result_templates/code.html b/searx/templates/simple/result_templates/code.html index 7d2c8ff79..49326aed5 100644 --- a/searx/templates/simple/result_templates/code.html +++ b/searx/templates/simple/result_templates/code.html @@ -28,5 +28,5 @@ {{- result.codelines|code_highlighter(result.code_language)|safe -}} -{{- result_sub_footer(result, proxify) -}} +{{- result_sub_footer(result) -}} {{- result_footer(result) -}} diff --git a/searx/templates/simple/result_templates/default.html b/searx/templates/simple/result_templates/default.html index 263c19a36..8a6329248 100644 --- a/searx/templates/simple/result_templates/default.html +++ b/searx/templates/simple/result_templates/default.html @@ -14,7 +14,7 @@ {{ _('This site did not provide any description.')|safe }}

{% endif -%} -{{- result_sub_footer(result, proxify) -}} +{{- result_sub_footer(result) -}} {% if result.iframe_src -%} {% set display_tooltip = true %} diff --git a/searx/templates/simple/simple_search.html b/searx/templates/simple/simple_search.html index f69ba6142..af533e6e0 100644 --- a/searx/templates/simple/simple_search.html +++ b/searx/templates/simple/simple_search.html @@ -5,6 +5,7 @@ +
    From 861f9c4be52a4844631fb72c3c0dcf8fb6cc77fc Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Thu, 22 May 2025 11:51:30 +0200 Subject: [PATCH 48/74] [build] /static --- client/simple/package-lock.json | 9 --------- searx/static/themes/simple/css/searxng-rtl.min.css | 2 +- searx/static/themes/simple/css/searxng.min.css | 2 +- searx/static/themes/simple/js/searxng.min.js | 4 ++-- searx/static/themes/simple/js/searxng.min.js.map | 2 +- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/client/simple/package-lock.json b/client/simple/package-lock.json index 032e38a15..e1f183493 100644 --- a/client/simple/package-lock.json +++ b/client/simple/package-lock.json @@ -7,9 +7,6 @@ "": { "name": "simple", "version": "1.0.0", - "dependencies": { - "autocomplete-js": "^2.7.1" - }, "devDependencies": { "@eslint/js": "^9.26.0", "copy-webpack-plugin": "^13.0.0", @@ -2526,12 +2523,6 @@ "dev": true, "license": "MIT" }, - "node_modules/autocomplete-js": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/autocomplete-js/-/autocomplete-js-2.7.1.tgz", - "integrity": "sha512-F+1Sj13zbfpbkprKjtyYiaHgBo6YODzNzWgJjgo/p312AeiZVEn3W+NaRRzVZYqMI0Bm7/W36uanp995eNDy+A==", - "license": "MIT" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", diff --git a/searx/static/themes/simple/css/searxng-rtl.min.css b/searx/static/themes/simple/css/searxng-rtl.min.css index 5ddce2b5c..7e2f294f2 100644 --- a/searx/static/themes/simple/css/searxng-rtl.min.css +++ b/searx/static/themes/simple/css/searxng-rtl.min.css @@ -1 +1 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}:root{--color-base-font: #444;--color-base-font-rgb: 68, 68, 68;--color-base-background: #fff;--color-base-background-mobile: #f2f5f8;--color-url-font: #334999;--color-url-visited-font: #9822c3;--color-header-background: #fdfbff;--color-header-border: #ddd;--color-footer-background: #fdfbff;--color-footer-border: #ddd;--color-sidebar-border: #ddd;--color-sidebar-font: #000;--color-sidebar-background: #fff;--color-backtotop-font: #444;--color-backtotop-border: #ddd;--color-backtotop-background: #fff;--color-btn-background: #3050ff;--color-btn-font: #fff;--color-show-btn-background: #bbb;--color-show-btn-font: #000;--color-search-border: #bbb;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #fff;--color-search-font: #222;--color-search-background-hover: #3050ff;--color-error: #db3434;--color-error-background: #fae1e1;--color-warning: #dbba34;--color-warning-background: #faf5e1;--color-success: #42db34;--color-success-background: #e3fae1;--color-categories-item-selected-font: #3050ff;--color-categories-item-border-selected: #3050ff;--color-autocomplete-font: #000;--color-autocomplete-border: #bbb;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #fff;--color-autocomplete-background-hover: #e3e3e3;--color-answer-font: #444;--color-answer-background: #fff;--color-result-keyvalue-col-table: #fdfbff;--color-result-keyvalue-odd: #fdfbff;--color-result-keyvalue-even: #fff;--color-result-background: #fff;--color-result-border: #ddd;--color-result-url-font: #000;--color-result-vim-selected: #f7f7f7;--color-result-vim-arrow: #000bbb;--color-result-description-highlight-font: #000;--color-result-link-font: #000bbb;--color-result-link-font-highlight: #000bbb;--color-result-link-visited-font: #9822c3;--color-result-publishdate-font: #777;--color-result-engines-font: #545454;--color-result-search-url-border: #ddd;--color-result-search-url-font: #000;--color-result-image-span-font: #444;--color-result-image-span-font-selected: #fff;--color-result-image-background: #fff;--color-settings-tr-hover: #ebebeb;--color-settings-engine-description-font: #545454;--color-settings-table-group-background: #0001;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #242424;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #545454;--color-toolkit-kbd-font: #fff;--color-toolkit-kbd-background: #000;--color-toolkit-dialog-border: #ddd;--color-toolkit-dialog-background: #fff;--color-toolkit-tabs-label-border: #fff;--color-toolkit-tabs-section-border: #ddd;--color-toolkit-select-background: #e1e1e1;--color-toolkit-select-border: #ddd;--color-toolkit-select-background-hover: #bbb;--color-toolkit-input-text-font: #222;--color-toolkit-checkbox-onoff-off-background: #ddd;--color-toolkit-checkbox-onoff-on-background: #ddd;--color-toolkit-checkbox-onoff-on-mark-background: #3050ff;--color-toolkit-checkbox-onoff-on-mark-color: #fff;--color-toolkit-checkbox-onoff-off-mark-background: #aaa;--color-toolkit-checkbox-onoff-off-mark-color: #fff;--color-toolkit-checkbox-label-background: #ddd;--color-toolkit-checkbox-label-border: #ddd;--color-toolkit-checkbox-input-border: #3050ff;--color-toolkit-engine-tooltip-border: #ddd;--color-toolkit-engine-tooltip-background: #fff;--color-toolkit-loader-border: rgba(0, 0, 0, .2);--color-toolkit-loader-borderleft: rgba(255, 255, 255, 0);--color-doc-code: #003;--color-doc-code-background: #ddeaff;--color-bar-chart-primary: #5bc0de;--color-bar-chart-secondary: #deb15b;--color-image-resolution-background: rgba(0, 0, 0, .5);--color-image-resolution-font: #fff;--color-loading-indicator: rgba(255, 255, 255, .2);--color-loading-indicator-gap: #fff;--color-line-number: #64708d;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}@media (prefers-color-scheme: dark){:root.theme-auto{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}}:root.theme-dark{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}:root.theme-black{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc;--color-base-background: #000;--color-base-background-mobile: #000;--color-header-background: #000;--color-footer-background: #000;--color-sidebar-background: #000}.code-highlight pre{line-height:100%}.code-highlight td.linenos .normal,.code-highlight span.linenos{color:inherit;background-color:transparent;padding-left:5px;padding-right:5px}.code-highlight td.linenos .special,.code-highlight span.linenos.special{color:#000;background-color:#ffffc0;padding-left:5px;padding-right:5px}.code-highlight .hll{background-color:#ffc}.code-highlight .c{color:#3d7b7b;font-style:italic}.code-highlight .err{border:1px solid #F00}.code-highlight .k{color:green;font-weight:700}.code-highlight .o{color:#666}.code-highlight .ch,.code-highlight .cm{color:#3d7b7b;font-style:italic}.code-highlight .cp{color:#9c6500}.code-highlight .cpf,.code-highlight .c1,.code-highlight .cs{color:#3d7b7b;font-style:italic}.code-highlight .gd{color:#a00000}.code-highlight .ge{font-style:italic}.code-highlight .ges{font-weight:700;font-style:italic}.code-highlight .gr{color:#e40000}.code-highlight .gh{color:navy;font-weight:700}.code-highlight .gi{color:#008400}.code-highlight .go{color:#717171}.code-highlight .gp{color:navy;font-weight:700}.code-highlight .gs{font-weight:700}.code-highlight .gu{color:purple;font-weight:700}.code-highlight .gt{color:#04d}.code-highlight .kc,.code-highlight .kd,.code-highlight .kn{color:green;font-weight:700}.code-highlight .kp{color:green}.code-highlight .kr{color:green;font-weight:700}.code-highlight .kt{color:#b00040}.code-highlight .m{color:#666}.code-highlight .s{color:#ba2121}.code-highlight .na{color:#687822}.code-highlight .nb{color:green}.code-highlight .nc{color:#00f;font-weight:700}.code-highlight .no{color:#800}.code-highlight .nd{color:#a2f}.code-highlight .ni{color:#717171;font-weight:700}.code-highlight .ne{color:#cb3f38;font-weight:700}.code-highlight .nf{color:#00f}.code-highlight .nl{color:#767600}.code-highlight .nn{color:#00f;font-weight:700}.code-highlight .nt{color:green;font-weight:700}.code-highlight .nv{color:#19177c}.code-highlight .ow{color:#a2f;font-weight:700}.code-highlight .w{color:#bbb}.code-highlight .mb,.code-highlight .mf,.code-highlight .mh,.code-highlight .mi,.code-highlight .mo{color:#666}.code-highlight .sa,.code-highlight .sb,.code-highlight .sc,.code-highlight .dl{color:#ba2121}.code-highlight .sd{color:#ba2121;font-style:italic}.code-highlight .s2{color:#ba2121}.code-highlight .se{color:#aa5d1f;font-weight:700}.code-highlight .sh{color:#ba2121}.code-highlight .si{color:#a45a77;font-weight:700}.code-highlight .sx{color:green}.code-highlight .sr{color:#a45a77}.code-highlight .s1{color:#ba2121}.code-highlight .ss{color:#19177c}.code-highlight .bp{color:green}.code-highlight .fm{color:#00f}.code-highlight .vc,.code-highlight .vg,.code-highlight .vi,.code-highlight .vm{color:#19177c}.code-highlight .il{color:#666}.codelines{margin:.125rem 0 0;padding:1rem 0 0}.code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}.code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}.code-highlight .linenos::selection{background:transparent}.code-highlight .linenos::-moz-selection{background:transparent}.code-highlight span.linenos{color:var(--color-line-number)}@media (prefers-color-scheme: dark){:root.theme-auto .code-highlight pre{line-height:100%}:root.theme-auto .code-highlight td.linenos .normal{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight span.linenos{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight td.linenos .special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight span.linenos.special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight .hll{background-color:#6e7681}:root.theme-auto .code-highlight .c{color:#7e8aa1}:root.theme-auto .code-highlight .err{color:#f88f7f}:root.theme-auto .code-highlight .esc{color:#d4d2c8}:root.theme-auto .code-highlight .g{color:#d4d2c8}:root.theme-auto .code-highlight .k{color:#ffad66}:root.theme-auto .code-highlight .l{color:#d5ff80}:root.theme-auto .code-highlight .n{color:#d4d2c8}:root.theme-auto .code-highlight .o{color:#ffad66}:root.theme-auto .code-highlight .x{color:#d4d2c8}:root.theme-auto .code-highlight .p{color:#d4d2c8}:root.theme-auto .code-highlight .ch{color:#f88f7f;font-style:italic}:root.theme-auto .code-highlight .cm{color:#7e8aa1}:root.theme-auto .code-highlight .cp{color:#ffad66;font-weight:700}:root.theme-auto .code-highlight .cpf{color:#7e8aa1}:root.theme-auto .code-highlight .c1{color:#7e8aa1}:root.theme-auto .code-highlight .cs{color:#7e8aa1;font-style:italic}:root.theme-auto .code-highlight .gd{color:#f88f7f;background-color:#3d1e20}:root.theme-auto .code-highlight .ge{color:#d4d2c8;font-style:italic}:root.theme-auto .code-highlight .ges{color:#d4d2c8}:root.theme-auto .code-highlight .gr{color:#f88f7f}:root.theme-auto .code-highlight .gh{color:#d4d2c8}:root.theme-auto .code-highlight .gi{color:#6ad4af;background-color:#19362c}:root.theme-auto .code-highlight .go{color:#7e8aa1}:root.theme-auto .code-highlight .gp{color:#d4d2c8}:root.theme-auto .code-highlight .gs{color:#d4d2c8;font-weight:700}:root.theme-auto .code-highlight .gu{color:#d4d2c8}:root.theme-auto .code-highlight .gt{color:#f88f7f}:root.theme-auto .code-highlight .kc{color:#ffad66}:root.theme-auto .code-highlight .kd{color:#ffad66}:root.theme-auto .code-highlight .kn{color:#ffad66}:root.theme-auto .code-highlight .kp{color:#ffad66}:root.theme-auto .code-highlight .kr{color:#ffad66}:root.theme-auto .code-highlight .kt{color:#73d0ff}:root.theme-auto .code-highlight .ld{color:#d5ff80}:root.theme-auto .code-highlight .m{color:#dfbfff}:root.theme-auto .code-highlight .s{color:#d5ff80}:root.theme-auto .code-highlight .na{color:#ffd173}:root.theme-auto .code-highlight .nb{color:#ffd173}:root.theme-auto .code-highlight .nc{color:#73d0ff}:root.theme-auto .code-highlight .no{color:#ffd173}:root.theme-auto .code-highlight .nd{color:#7e8aa1;font-weight:700;font-style:italic}:root.theme-auto .code-highlight .ni{color:#95e6cb}:root.theme-auto .code-highlight .ne{color:#73d0ff}:root.theme-auto .code-highlight .nf{color:#ffd173}:root.theme-auto .code-highlight .nl{color:#d4d2c8}:root.theme-auto .code-highlight .nn{color:#d4d2c8}:root.theme-auto .code-highlight .nx{color:#d4d2c8}:root.theme-auto .code-highlight .py{color:#ffd173}:root.theme-auto .code-highlight .nt{color:#5ccfe6}:root.theme-auto .code-highlight .nv{color:#d4d2c8}:root.theme-auto .code-highlight .ow{color:#ffad66}:root.theme-auto .code-highlight .pm{color:#d4d2c8}:root.theme-auto .code-highlight .w{color:#d4d2c8}:root.theme-auto .code-highlight .mb{color:#dfbfff}:root.theme-auto .code-highlight .mf{color:#dfbfff}:root.theme-auto .code-highlight .mh{color:#dfbfff}:root.theme-auto .code-highlight .mi{color:#dfbfff}:root.theme-auto .code-highlight .mo{color:#dfbfff}:root.theme-auto .code-highlight .sa{color:#f29e74}:root.theme-auto .code-highlight .sb{color:#d5ff80}:root.theme-auto .code-highlight .sc{color:#d5ff80}:root.theme-auto .code-highlight .dl{color:#d5ff80}:root.theme-auto .code-highlight .sd{color:#7e8aa1}:root.theme-auto .code-highlight .s2{color:#d5ff80}:root.theme-auto .code-highlight .se{color:#95e6cb}:root.theme-auto .code-highlight .sh{color:#d5ff80}:root.theme-auto .code-highlight .si{color:#95e6cb}:root.theme-auto .code-highlight .sx{color:#95e6cb}:root.theme-auto .code-highlight .sr{color:#95e6cb}:root.theme-auto .code-highlight .s1{color:#d5ff80}:root.theme-auto .code-highlight .ss{color:#dfbfff}:root.theme-auto .code-highlight .bp{color:#5ccfe6}:root.theme-auto .code-highlight .fm{color:#ffd173}:root.theme-auto .code-highlight .vc{color:#d4d2c8}:root.theme-auto .code-highlight .vg{color:#d4d2c8}:root.theme-auto .code-highlight .vi{color:#d4d2c8}:root.theme-auto .code-highlight .vm{color:#d4d2c8}:root.theme-auto .code-highlight .il{color:#dfbfff}:root.theme-auto .code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}:root.theme-auto .code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}:root.theme-auto .code-highlight .linenos::selection{background:transparent}:root.theme-auto .code-highlight .linenos::-moz-selection{background:transparent}:root.theme-auto .code-highlight span.linenos{color:var(--color-line-number)}}:root.theme-dark .code-highlight pre{line-height:100%}:root.theme-dark .code-highlight td.linenos .normal{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight span.linenos{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight td.linenos .special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight span.linenos.special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight .hll{background-color:#6e7681}:root.theme-dark .code-highlight .c{color:#7e8aa1}:root.theme-dark .code-highlight .err{color:#f88f7f}:root.theme-dark .code-highlight .esc{color:#d4d2c8}:root.theme-dark .code-highlight .g{color:#d4d2c8}:root.theme-dark .code-highlight .k{color:#ffad66}:root.theme-dark .code-highlight .l{color:#d5ff80}:root.theme-dark .code-highlight .n{color:#d4d2c8}:root.theme-dark .code-highlight .o{color:#ffad66}:root.theme-dark .code-highlight .x{color:#d4d2c8}:root.theme-dark .code-highlight .p{color:#d4d2c8}:root.theme-dark .code-highlight .ch{color:#f88f7f;font-style:italic}:root.theme-dark .code-highlight .cm{color:#7e8aa1}:root.theme-dark .code-highlight .cp{color:#ffad66;font-weight:700}:root.theme-dark .code-highlight .cpf{color:#7e8aa1}:root.theme-dark .code-highlight .c1{color:#7e8aa1}:root.theme-dark .code-highlight .cs{color:#7e8aa1;font-style:italic}:root.theme-dark .code-highlight .gd{color:#f88f7f;background-color:#3d1e20}:root.theme-dark .code-highlight .ge{color:#d4d2c8;font-style:italic}:root.theme-dark .code-highlight .ges{color:#d4d2c8}:root.theme-dark .code-highlight .gr{color:#f88f7f}:root.theme-dark .code-highlight .gh{color:#d4d2c8}:root.theme-dark .code-highlight .gi{color:#6ad4af;background-color:#19362c}:root.theme-dark .code-highlight .go{color:#7e8aa1}:root.theme-dark .code-highlight .gp{color:#d4d2c8}:root.theme-dark .code-highlight .gs{color:#d4d2c8;font-weight:700}:root.theme-dark .code-highlight .gu{color:#d4d2c8}:root.theme-dark .code-highlight .gt{color:#f88f7f}:root.theme-dark .code-highlight .kc{color:#ffad66}:root.theme-dark .code-highlight .kd{color:#ffad66}:root.theme-dark .code-highlight .kn{color:#ffad66}:root.theme-dark .code-highlight .kp{color:#ffad66}:root.theme-dark .code-highlight .kr{color:#ffad66}:root.theme-dark .code-highlight .kt{color:#73d0ff}:root.theme-dark .code-highlight .ld{color:#d5ff80}:root.theme-dark .code-highlight .m{color:#dfbfff}:root.theme-dark .code-highlight .s{color:#d5ff80}:root.theme-dark .code-highlight .na{color:#ffd173}:root.theme-dark .code-highlight .nb{color:#ffd173}:root.theme-dark .code-highlight .nc{color:#73d0ff}:root.theme-dark .code-highlight .no{color:#ffd173}:root.theme-dark .code-highlight .nd{color:#7e8aa1;font-weight:700;font-style:italic}:root.theme-dark .code-highlight .ni{color:#95e6cb}:root.theme-dark .code-highlight .ne{color:#73d0ff}:root.theme-dark .code-highlight .nf{color:#ffd173}:root.theme-dark .code-highlight .nl{color:#d4d2c8}:root.theme-dark .code-highlight .nn{color:#d4d2c8}:root.theme-dark .code-highlight .nx{color:#d4d2c8}:root.theme-dark .code-highlight .py{color:#ffd173}:root.theme-dark .code-highlight .nt{color:#5ccfe6}:root.theme-dark .code-highlight .nv{color:#d4d2c8}:root.theme-dark .code-highlight .ow{color:#ffad66}:root.theme-dark .code-highlight .pm{color:#d4d2c8}:root.theme-dark .code-highlight .w{color:#d4d2c8}:root.theme-dark .code-highlight .mb{color:#dfbfff}:root.theme-dark .code-highlight .mf{color:#dfbfff}:root.theme-dark .code-highlight .mh{color:#dfbfff}:root.theme-dark .code-highlight .mi{color:#dfbfff}:root.theme-dark .code-highlight .mo{color:#dfbfff}:root.theme-dark .code-highlight .sa{color:#f29e74}:root.theme-dark .code-highlight .sb{color:#d5ff80}:root.theme-dark .code-highlight .sc{color:#d5ff80}:root.theme-dark .code-highlight .dl{color:#d5ff80}:root.theme-dark .code-highlight .sd{color:#7e8aa1}:root.theme-dark .code-highlight .s2{color:#d5ff80}:root.theme-dark .code-highlight .se{color:#95e6cb}:root.theme-dark .code-highlight .sh{color:#d5ff80}:root.theme-dark .code-highlight .si{color:#95e6cb}:root.theme-dark .code-highlight .sx{color:#95e6cb}:root.theme-dark .code-highlight .sr{color:#95e6cb}:root.theme-dark .code-highlight .s1{color:#d5ff80}:root.theme-dark .code-highlight .ss{color:#dfbfff}:root.theme-dark .code-highlight .bp{color:#5ccfe6}:root.theme-dark .code-highlight .fm{color:#ffd173}:root.theme-dark .code-highlight .vc{color:#d4d2c8}:root.theme-dark .code-highlight .vg{color:#d4d2c8}:root.theme-dark .code-highlight .vi{color:#d4d2c8}:root.theme-dark .code-highlight .vm{color:#d4d2c8}:root.theme-dark .code-highlight .il{color:#dfbfff}:root.theme-dark .code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}:root.theme-dark .code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}:root.theme-dark .code-highlight .linenos::selection{background:transparent}:root.theme-dark .code-highlight .linenos::-moz-selection{background:transparent}:root.theme-dark .code-highlight span.linenos{color:var(--color-line-number)}html.no-js .hide_if_nojs,html.js .show_if_nojs{display:none}.center{text-align:center}.right{float:right}.left{float:left}.invisible{display:none!important}.list-unstyled{list-style-type:none}.list-unstyled li{margin-top:4px;margin-bottom:4px}.danger{background-color:var(--color-error-background)}.warning{background:var(--color-warning-background)}.success{background:var(--color-success-background)}.badge{display:inline-block;color:var(--color-toolkit-badge-font);background-color:var(--color-toolkit-badge-background);text-align:center;white-space:nowrap;vertical-align:baseline;min-width:10px;padding:1px 5px;border-radius:5px}kbd{padding:2px 4px;margin:1px;font-size:90%;color:var(--color-toolkit-kbd-font);background:var(--color-toolkit-kbd-background)}table{width:100%}table.striped tr{border-bottom:1px solid var(--color-settings-tr-hover)}th{padding:.4em}td{padding:0 4px}tr:hover{background:var(--color-settings-tr-hover)!important}div.selectable_url{display:block;border:1px solid var(--color-result-search-url-border);padding:4px;color:var(--color-result-search-url-font);margin:.1em;overflow:hidden;height:1.2em;line-height:1.2em;border-radius:5px}div.selectable_url pre{display:block;font-size:.8em;word-break:break-all;margin:.1em;-webkit-user-select:all;user-select:all}.dialog-error{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:right;border-radius:10px;color:var(--color-error);background:var(--color-error-background);border-color:var(--color-error)}.dialog-error .close{float:left;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error ul,.dialog-error ol,.dialog-error p{margin:1px 0 0}.dialog-error table{width:auto}.dialog-error tr{vertical-align:text-top}.dialog-error tr:hover{background:transparent!important}.dialog-error td{padding:0 1em 0 0;padding-left:1rem;padding-bottom:0;padding-right:0}.dialog-error h4{margin-top:.3em;margin-bottom:.3em}.dialog-error-block{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:right;border-radius:10px;display:block;color:var(--color-error);background:var(--color-error-background);border-color:var(--color-error)}.dialog-error-block .close{float:left;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error-block ul,.dialog-error-block ol,.dialog-error-block p{margin:1px 0 0}.dialog-error-block table{width:auto}.dialog-error-block tr{vertical-align:text-top}.dialog-error-block tr:hover{background:transparent!important}.dialog-error-block td{padding:0 1em 0 0;padding-left:1rem;padding-bottom:0;padding-right:0}.dialog-error-block h4{margin-top:.3em;margin-bottom:.3em}.dialog-warning{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:right;border-radius:10px;color:var(--color-warning);background:var(--color-warning-background);border-color:var(--color-warning)}.dialog-warning .close{float:left;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-warning ul,.dialog-warning ol,.dialog-warning p{margin:1px 0 0}.dialog-warning table{width:auto}.dialog-warning tr{vertical-align:text-top}.dialog-warning tr:hover{background:transparent!important}.dialog-warning td{padding:0 1em 0 0;padding-left:1rem;padding-bottom:0;padding-right:0}.dialog-warning h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal{position:relative;display:flex;padding:1rem;border:1px solid var(--color-toolkit-dialog-border);text-align:right;border-radius:10px;display:block;background:var(--color-toolkit-dialog-background);position:fixed;top:50%;left:50%;margin:0 auto;transform:translate(-50%,-50%);z-index:5000}.dialog-modal .close{float:left;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-modal ul,.dialog-modal ol,.dialog-modal p{margin:1px 0 0}.dialog-modal table{width:auto}.dialog-modal tr{vertical-align:text-top}.dialog-modal tr:hover{background:transparent!important}.dialog-modal td{padding:0 1em 0 0;padding-left:1rem;padding-bottom:0;padding-right:0}.dialog-modal h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal h3{margin-top:0}.btn-collapse{cursor:pointer}.scrollx{overflow:auto hidden;display:block;padding:0;margin:0;border:none}.tabs .tabs>label{font-size:90%}ul.tabs{border-bottom:1px solid var(--color-toolkit-tabs-section-border);list-style:none;padding-left:0}ul.tabs li{display:flex}.tabs{display:flex;flex-wrap:wrap;width:100%;min-width:100%}.tabs>*{order:2}.tabs>input[type=radio]{display:none}.tabs>label,.tabs>li>a{order:1;padding:.7em;margin:0 .7em;letter-spacing:.5px;text-transform:uppercase;border:solid var(--color-toolkit-tabs-label-border);border-width:0 0 2px 0;color:unset;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:pointer}.tabs>label.active,.tabs>li>a.active{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font)}.tabs>label:hover,.tabs>li>a:hover{border-bottom:2px solid var(--color-categories-item-border-selected)}.tabs>section{min-width:100%;padding:.7rem 0;box-sizing:border-box;border-top:1px solid var(--color-toolkit-tabs-section-border);display:none}.tabs>label:last-of-type{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font);letter-spacing:-.1px}.tabs>section:last-of-type{display:block}html body .tabs>input:checked~section{display:none}html body .tabs>input:checked~label{position:inherited;background:inherit;border-bottom:2px solid transparent;font-weight:400;color:inherit}html body .tabs>input:checked~label:hover{border-bottom:2px solid var(--color-categories-item-border-selected)}html body .tabs>input:checked+label{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font)}html body .tabs>input:checked+label+section{display:block}select{height:2.4rem;margin-top:0;margin-left:1rem;margin-bottom:0;margin-right:0;padding:.2rem!important;color:var(--color-search-font);font-size:.9rem;z-index:100}select:hover,select:focus{cursor:pointer}@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))){select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border-width:0 2rem 0 0;border-color:transparent;background:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E) no-repeat;background-position-x:calc(100% + 2rem);background-size:2rem;background-origin:content-box;background-color:var(--color-toolkit-select-background);outline:medium none;text-overflow:ellipsis;border-radius:5px}select:hover,select:focus{background-color:var(--color-toolkit-select-background-hover)}select option{background-color:var(--color-base-background)}@media (prefers-color-scheme: dark){html.theme-auto select,html.theme-dark select{background-image:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20fill%3D%22%23ddd%22%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E)}}html.theme-dark select{background-image:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20fill%3D%22%23ddd%22%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E)}}input.checkbox-onoff[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;display:inline-block;width:2.5em;height:.7em;box-shadow:none!important;margin:0 16px;border-radius:10px;position:relative}input.checkbox-onoff[type=checkbox]:focus,input.checkbox-onoff[type=checkbox]:hover{outline:none}input.checkbox-onoff[type=checkbox]:focus:after{content:"";position:absolute;width:3.5em;height:1.65em;border:1px solid var(--color-btn-background);border-radius:12px;box-shadow:var(--color-btn-background) 0 0 3px;z-index:1200;top:-.55em;left:-.6em}input.checkbox-onoff[type=checkbox]:before{position:absolute;top:-.5em;display:flex;justify-content:center;align-items:center;font-size:.75em;width:1.875em;height:1.875em;border-radius:50%}input.checkbox-onoff[type=checkbox],input.checkbox-onoff.reversed-checkbox[type=checkbox]:checked{background:var(--color-toolkit-checkbox-onoff-off-background)}input.checkbox-onoff[type=checkbox]:before,input.checkbox-onoff.reversed-checkbox[type=checkbox]:checked:before{left:-.5em;content:"✕";color:var(--color-toolkit-checkbox-onoff-off-mark-color);background:var(--color-toolkit-checkbox-onoff-off-mark-background)}input.checkbox-onoff[type=checkbox]:checked,input.checkbox-onoff.reversed-checkbox[type=checkbox]{background:var(--color-toolkit-checkbox-onoff-on-background)}input.checkbox-onoff[type=checkbox]:checked:before,input.checkbox-onoff.reversed-checkbox[type=checkbox]:before{left:calc(100% - 1.5em);content:"✓";color:var(--color-toolkit-checkbox-onoff-on-mark-color);background:var(--color-toolkit-checkbox-onoff-on-mark-background)}@supports (transform: rotate(-45deg)){input[type=checkbox]:not(.checkbox-onoff){-webkit-appearance:none;-moz-appearance:none;appearance:none;width:20px;height:20px;cursor:pointer;position:relative;top:0;left:0;border:2px solid var(--color-toolkit-checkbox-input-border);border-radius:.3em}input[type=checkbox]:not(.checkbox-onoff):after{content:"";width:9px;height:5px;position:absolute;top:3px;left:2px;border:3px solid var(--color-toolkit-checkbox-label-border);border-top:none;border-right:none;background:transparent;opacity:0;transform:rotate(-45deg)}input[type=checkbox]:not(.checkbox-onoff):checked:after{border-color:var(--color-toolkit-checkbox-input-border);opacity:1}input[type=checkbox][disabled]:not(.checkbox-onoff){border:inherit;background-color:transparent!important;cursor:inherit}input.checkbox[type=checkbox]:not(:checked,[disabled],.checkbox-onoff):hover:after{opacity:.5}}@media screen and (max-width: 50em){.tabs>label{width:100%}}.loader,.loader:after{border-radius:50%;width:2em;height:2em}.loader{margin:1em auto;font-size:10px;position:relative;text-indent:-9999em;border-top:.5em solid var(--color-toolkit-loader-border);border-right:.5em solid var(--color-toolkit-loader-border);border-bottom:.5em solid var(--color-toolkit-loader-border);border-left:.5em solid var(--color-toolkit-loader-borderleft);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.2s infinite linear;animation:load8 1.2s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.engine-tooltip{display:none;position:absolute;padding:.5rem 1rem;margin:0 0 0 2rem;border:1px solid var(--color-toolkit-engine-tooltip-border);background:var(--color-toolkit-engine-tooltip-background);font-size:14px;font-weight:400;z-index:5000;text-align:left;border-radius:10px}th:hover .engine-tooltip,td:hover .engine-tooltip,.engine-tooltip:hover{display:inline-block}.stacked-bar-chart{margin:0;padding:0 .125rem 0 4rem;width:100%;width:-moz-available;width:-webkit-fill-available;width:fill;flex-flow:row nowrap;align-items:center;display:inline-flex}.stacked-bar-chart-value{width:3rem;display:inline-block;position:absolute;padding:0 .5rem;text-align:right}.stacked-bar-chart-base{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset}.stacked-bar-chart-median{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:var(--color-base-font);border:1px solid rgba(var(--color-base-font-rgb),.9);padding:.3rem 0}.stacked-bar-chart-rate80{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border:1px solid rgba(var(--color-base-font-rgb),.3);padding:.3rem 0}.stacked-bar-chart-rate95{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border-bottom:1px dotted rgba(var(--color-base-font-rgb),.5);padding:0}.stacked-bar-chart-rate100{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border-left:1px solid rgba(var(--color-base-font-rgb),.9);padding:.4rem 0;width:1px}/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */.autocomplete{position:absolute;width:44rem;max-height:0;overflow-y:hidden;text-align:right;border-radius:10px}.autocomplete:active,.autocomplete:focus,.autocomplete:hover{background-color:var(--color-autocomplete-background)}.autocomplete:empty{display:none}.autocomplete>ul{list-style-type:none;margin:0;padding:0}.autocomplete>ul>li{cursor:pointer;padding:.5rem 1rem}.autocomplete>ul>li.active,.autocomplete>ul>li:active,.autocomplete>ul>li:focus,.autocomplete>ul>li:hover{background-color:var(--color-autocomplete-background-hover)}.autocomplete>ul>li.active a:active,.autocomplete>ul>li:active a:active,.autocomplete>ul>li:focus a:active,.autocomplete>ul>li:hover a:active,.autocomplete>ul>li.active a:focus,.autocomplete>ul>li:active a:focus,.autocomplete>ul>li:focus a:focus,.autocomplete>ul>li:hover a:focus,.autocomplete>ul>li.active a:hover,.autocomplete>ul>li:active a:hover,.autocomplete>ul>li:focus a:hover,.autocomplete>ul>li:hover a:hover{text-decoration:none}.autocomplete>ul>li.locked{cursor:inherit}.autocomplete.open{display:block;background-color:var(--color-autocomplete-background);color:var(--color-autocomplete-font);max-height:32rem;overflow-y:auto;z-index:5000;margin-top:3.5rem;border-radius:.8rem}.autocomplete.open:empty{display:none}@media screen and (max-width: 50em){.autocomplete{width:100%}.autocomplete>ul>li{padding:1rem}}#main_results #results.image-detail-open.only_template_images{width:min(98%,59.25rem)!important}#main_results #results.only_template_images.image-detail-open #backToTop{right:56.75rem!important;left:inherit}article.result-images .detail{display:none}#results.image-detail-open article.result-images[data-vim-selected] .detail{display:flex;flex-direction:column;position:fixed;right:60rem;left:0;top:13rem;transition:top 64ms ease-in 0s;bottom:0;background:var(--color-result-detail-background);border:1px solid var(--color-result-detail-background);z-index:1000;padding:4rem 3rem 3rem;overflow-y:scroll}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source{display:block;flex:1;text-align:left;width:100%;border:none;text-decoration:none}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{padding:0;margin:0;border:none;object-fit:contain;width:inherit;height:inherit;max-width:100%;min-height:inherit;max-height:calc(100vh - 42rem);background:inherit}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels{color:var(--color-result-detail-font);height:19rem}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels hr{border-top:1px solid var(--color-result-detail-hr);border-bottom:none}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels h4{height:2rem;overflow:hidden;text-overflow:ellipsis;font-size:.9rem;margin-bottom:0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p{color:var(--color-result-detail-label-font);font-size:.9rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:.8rem 0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p span{display:inline-block;width:12rem}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels h4,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a{text-align:right}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-content{height:2rem;line-height:unset;overflow:hidden;text-overflow:ellipsis}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url{white-space:nowrap;overflow:hidden hidden;text-overflow:ellipsis}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-content:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url:hover{position:relative;overflow:inherit!important;background:var(--color-result-detail-background);text-overflow:inherit!important}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:active{color:var(--color-result-detail-link)}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:hover{text-decoration:underline}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close{top:1rem;right:1rem;padding:.4rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous{top:1rem;left:6rem;padding:.4rem .3rem .4rem .5rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next{top:1rem;left:2rem;padding:.4rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous{border-radius:50%;display:block;width:1.5rem;height:1.5rem;position:absolute;filter:opacity(40%);z-index:1200}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close span,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next span,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous span{display:block;width:1.5rem;height:1.5rem;text-align:center}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next span:before,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous span:before{vertical-align:sub}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:active,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:active,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:active{color:var(--color-result-detail-font);background:var(--color-result-detail-background);border:1px solid var(--color-result-detail-font)}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:hover{filter:opacity(80%)}#results.image-detail-open article.result-images[data-vim-selected] .detail .loader{position:absolute;top:1rem;left:50%;border-top:.5em solid var(--color-result-detail-loader-border);border-right:.5em solid var(--color-result-detail-loader-border);border-bottom:.5em solid var(--color-result-detail-loader-border);border-left:.5em solid var(--color-result-detail-loader-borderleft)}#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail{top:0}#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail a.result-images-source img{max-height:calc(100vh - 25rem)}@media screen and (max-width: 79.75em){#results.image-detail-open article.result-images[data-vim-selected] .detail{top:0;right:0}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source{display:flex;flex-direction:column;justify-content:center}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{width:100%;max-height:calc(100vh - 24rem)}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next{left:1rem}}@media screen and (max-width: 50em){#results.image-detail-open article.result-images[data-vim-selected] .detail{top:0;right:0;padding:1rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{width:100%;max-height:calc(100vh - 20rem);margin:0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p span{width:inherit;margin-left:1rem}}.dialog-modal{animation-name:dialogmodal;animation-duration:.13s}@keyframes dialogmodal{0%{opacity:0}50%{opacity:.5;transform:translate(-50%,-50%) scale(1.05)}}input.checkbox-onoff[type=checkbox]:before{transition:left .25s}iframe[src^="https://w.soundcloud.com"]{height:120px}iframe[src^="https://www.deezer.com"]{height:94px}iframe[src^="https://www.mixcloud.com"]{height:250px}iframe[src^="https://bandcamp.com/EmbeddedPlayer"]{height:350px}iframe[src^="https://bandcamp.com/EmbeddedPlayer/track"]{height:120px}iframe[src^="https://genius.com/songs"]{height:65px}.info-page code{font-family:monospace;border-radius:5px;background-color:var(--color-doc-code-background);color:var(--color-doc-code);padding:.2rem;border:0 none}.stats_endpoint .github-issue-button{display:block;font-size:16px}.stats_endpoint .issue-hide{display:none}.stats_endpoint input[type=checked]{position:absolute}.stats_endpoint label{margin:1rem 1rem 1rem 0}.stats_endpoint .step_content{margin:1rem 1rem 1rem 2rem}.stats_endpoint .step1,.stats_endpoint .step2{visibility:hidden}.stats_endpoint .step1_delay{transition:visibility 0s linear 4s}.stats_endpoint #step1:checked~.step1,.stats_endpoint #step2:checked~.step2{visibility:visible}.engine-stats{border-spacing:0;border-collapse:collapse}.engine-stats tr td,.engine-stats tr th{border-bottom:1px solid var(--color-result-border);padding:.25rem}.engine-stats table.engine-tooltip{border-spacing:0;border-collapse:collapse}.engine-stats table.engine-tooltip td,.engine-stats table.engine-tooltip th{border:none}.engine-stats .engine-name{width:20rem}.engine-stats .engine-score{width:7rem;text-align:right}.engine-stats .engine-reliability{text-align:right}table.engine-error th.engine-error-type,table.engine-error td.engine-error-type,failed-test{width:10rem}.engine-errors{margin-top:3rem}.engine-errors table.engine-error{max-width:1280px;margin:1rem 0 3rem;border:1px solid var(--color-result-border);text-align:right}.engine-errors table.engine-error tr th,.engine-errors table.engine-error tr td{padding:.5rem}.engine-errors table.engine-error span.log_parameters{border-right:1px solid solid var(--color-result-border);padding:0 1rem 0 0;margin:0 0 0 .5rem}.bar-chart-value{width:3em;display:inline-block;text-align:right;padding-right:.5rem}.bar-chart-graph{width:calc(100% - 5rem);display:inline-block}.bar-chart-bar{border:3px solid var(--color-bar-chart-primary);margin:1px 0}.bar-chart-serie1{border:3px solid var(--color-bar-chart-primary);margin:1px 0;float:left}.bar-chart-serie2{border:3px solid var(--color-bar-chart-secondary);margin:1px 0;float:left}.bar0{width:0;border:0}.bar1{width:1%}.bar2{width:2%}.bar3{width:3%}.bar4{width:4%}.bar5{width:5%}.bar6{width:6%}.bar7{width:7%}.bar8{width:8%}.bar9{width:9%}.bar10{width:10%}.bar11{width:11%}.bar12{width:12%}.bar13{width:13%}.bar14{width:14%}.bar15{width:15%}.bar16{width:16%}.bar17{width:17%}.bar18{width:18%}.bar19{width:19%}.bar20{width:20%}.bar21{width:21%}.bar22{width:22%}.bar23{width:23%}.bar24{width:24%}.bar25{width:25%}.bar26{width:26%}.bar27{width:27%}.bar28{width:28%}.bar29{width:29%}.bar30{width:30%}.bar31{width:31%}.bar32{width:32%}.bar33{width:33%}.bar34{width:34%}.bar35{width:35%}.bar36{width:36%}.bar37{width:37%}.bar38{width:38%}.bar39{width:39%}.bar40{width:40%}.bar41{width:41%}.bar42{width:42%}.bar43{width:43%}.bar44{width:44%}.bar45{width:45%}.bar46{width:46%}.bar47{width:47%}.bar48{width:48%}.bar49{width:49%}.bar50{width:50%}.bar51{width:51%}.bar52{width:52%}.bar53{width:53%}.bar54{width:54%}.bar55{width:55%}.bar56{width:56%}.bar57{width:57%}.bar58{width:58%}.bar59{width:59%}.bar60{width:60%}.bar61{width:61%}.bar62{width:62%}.bar63{width:63%}.bar64{width:64%}.bar65{width:65%}.bar66{width:66%}.bar67{width:67%}.bar68{width:68%}.bar69{width:69%}.bar70{width:70%}.bar71{width:71%}.bar72{width:72%}.bar73{width:73%}.bar74{width:74%}.bar75{width:75%}.bar76{width:76%}.bar77{width:77%}.bar78{width:78%}.bar79{width:79%}.bar80{width:80%}.bar81{width:81%}.bar82{width:82%}.bar83{width:83%}.bar84{width:84%}.bar85{width:85%}.bar86{width:86%}.bar87{width:87%}.bar88{width:88%}.bar89{width:89%}.bar90{width:90%}.bar91{width:91%}.bar92{width:92%}.bar93{width:93%}.bar94{width:94%}.bar95{width:95%}.bar96{width:96%}.bar97{width:97%}.bar98{width:98%}.bar99{width:99%}.bar100{width:100%}.osm-map-box{height:300px;width:100%;margin:10px 0}#main_index{margin-top:26vh}.index{text-align:center}.index .title{background:url(../img/searxng.png) no-repeat;min-height:4rem;margin:4rem auto;background-position:center;background-size:contain}.index h1{font-size:4em;visibility:hidden}.index #search,.index #search_header{margin:0 auto;background:inherit;border:inherit;padding:0;display:block}.index .search_filters{display:block;margin:1em 0}.index .category label{padding:6px 10px;border-bottom:initial!important}@media screen and (max-width: 79.75em){div.title h1{font-size:1em}#main_index{margin-top:6em}}table{border-collapse:collapse}table th,table td{text-align:center;padding:1rem .5rem;text-align:right}table tr.pref-group th{font-weight:400;text-align:right;background:var(--color-settings-table-group-background)}#main_preferences form{width:100%}#main_preferences fieldset{margin:8px;border:none}#main_preferences legend{margin:0;padding:5px 0 0;display:block;float:right;width:300px}#main_preferences input[type=text]{width:13.25rem;color:var(--color-toolkit-input-text-font);border:none;background:none repeat scroll 0 0 var(--color-toolkit-select-background);padding:.2rem .4rem;height:2rem;border-radius:5px}#main_preferences input[type=text]:hover,#main_preferences input[type=text]:focus{background-color:var(--color-toolkit-select-background-hover)}#main_preferences div.pref-group{width:100%;font-weight:400;padding:1rem .5rem;text-align:right;background:var(--color-settings-table-group-background)}#main_preferences .value{margin:0;padding:0;float:right;width:15em}#main_preferences .value select,#main_preferences .value input[type=text]{font-size:inherit!important;margin-top:0;margin-left:1rem;margin-bottom:0;margin-right:0}#main_preferences .value select{width:14rem}#main_preferences .value select:focus,#main_preferences .value input:focus{outline:none;box-shadow:0 0 1px 1px var(--color-btn-background)}#main_preferences .description{margin:0;padding:5px 0 0;float:left;width:50%;color:var(--color-settings-engine-description-font);font-size:90%}#main_preferences .bang{text-align:right;border-radius:5px;background-color:var(--color-doc-code-background);color:var(--color-doc-code);padding:.2rem;border:0 none}#main_preferences .category{margin-left:.5rem}#main_preferences .category label{border:2px solid transparent;padding:.2rem .4rem;border-radius:5px}#main_preferences .category input[type=checkbox]:checked+label{border:2px solid var(--color-categories-item-border-selected)}#main_preferences table.table_engines th.name label{cursor:pointer}#main_preferences table.table_engines th.name .engine-tooltip{margin-top:1.8rem;right:calc((100% - 85em)/2 + 10em);max-width:40rem}#main_preferences table.table_engines th.name .engine-tooltip .engine-description{margin-top:.5rem}#main_preferences table.table_engines th.name .engine-tooltip .bang{margin:.3rem}#main_preferences table.table_engines .checkbox-col,#main_preferences table.table_engines .name,#main_preferences table.table_engines .shortcut{text-align:right}#main_preferences table.cookies{width:100%;direction:ltr}#main_preferences table.cookies th,#main_preferences table.cookies td{text-align:left;font-family:monospace;font-size:1rem;padding:.5em;vertical-align:top}#main_preferences table.cookies td:first-child{word-break:keep-all;width:14rem;padding-right:1rem}#main_preferences table.cookies td:last-child{word-break:break-all}#main_preferences table.cookies>tbody>tr:nth-child(2n)>th,#main_preferences table.cookies>tbody>tr:nth-child(2n)>td{background-color:var(--color-settings-tr-hover)}#main_preferences .preferences_back{background:none repeat scroll 0 0 var(--color-btn-background);color:var(--color-btn-font);border:0 none;border-radius:10px;cursor:pointer;display:inline-block;margin:2px 4px;padding:.7em}#main_preferences .preferences_back a{color:var(--color-settings-return-font)}#main_preferences .preferences_back a:first-letter{text-transform:uppercase}#main_preferences #toggle-all-engines-container{width:max-content;margin-left:auto}#main_preferences div.selectable_url pre{width:100%}#main_preferences #copy-hash-container{display:flex;align-items:center;gap:.5rem}#main_preferences #copy-hash-container div.selectable_url pre{width:auto;flex-grow:1}#main_preferences #pref-hash-input{width:100%}@media screen and (max-width: 79.75em){.preferences_back{clear:both}.engine-tooltip{right:10em!important}}#search{padding:0;margin:0}#search_header{padding-top:1.5em;padding-left:2em;padding-right:7rem;margin:0;background:var(--color-header-background);border-bottom:1px solid var(--color-header-border);display:grid;gap:1rem 1.2rem;grid-template-columns:3rem 1fr;grid-template-areas:"logo search" "spacer categories"}.category_checkbox,.category_button{display:inline-block;position:relative;margin-left:1rem;padding:0}.category_checkbox input{display:none}.category_checkbox label{cursor:pointer;padding:.2rem 0;display:inline-flex;text-transform:capitalize;font-size:.9em;border-bottom:2px solid transparent;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.category_checkbox label svg{padding-right:.2rem}.category_checkbox label div.category_name{margin:auto 0}.category_checkbox input[type=checkbox]:checked+label{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}button.category_button{background-color:inherit;color:var(--color-base-font);cursor:pointer;padding:.2rem 0;display:inline-flex;align-items:center;text-transform:capitalize;font-size:.9em;border:none;border-bottom:2px solid transparent}button.category_button svg{padding-right:.2rem}button.category_button.selected,button.category_button:active{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}.no-js #categories_container:has(button.category_button:focus-within) button.category_button.selected{color:var(--color-base-font);border-bottom:none}.no-js #categories_container:has(button.category_button:focus-within) button.category_button:focus-within{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}#search_logo{padding:.5rem 10px 0;grid-area:logo;display:flex;align-items:center;justify-content:center}#search_logo svg{flex:1;width:30px;height:30px;margin:.5rem 0 auto}.search_categories{grid-area:categories}.search_categories .help{display:none}.search_categories:hover .help{display:block;position:absolute;background:var(--color-base-background);padding:1rem .6rem .6rem 0;z-index:1000;width:100%;left:-.1rem}#search_view{padding:.5rem .3rem 0 .5rem;grid-area:search}body.results_endpoint #search_view{padding:.5rem 2.8rem 0 0}.search_box{border-radius:.8rem;width:44rem;display:inline-flex;flex-direction:row;white-space:nowrap;box-shadow:var(--color-search-shadow)}#clear_search{display:block;border-collapse:separate;box-sizing:border-box;width:1.8rem;margin:0;padding:.8rem .2rem;background:none repeat scroll 0 0 var(--color-search-background);border:none;outline:none;color:var(--color-search-font);font-size:1.1rem;z-index:1000}#clear_search:hover{color:var(--color-search-background-hover)}#clear_search.empty *,html.no-js #clear_search.hide_if_nojs{display:none}#q,#send_search{display:block;margin:0;padding:.8rem;background:none repeat scroll 0 0 var(--color-search-background);border:none;outline:none;color:var(--color-search-font);font-size:1.1rem;z-index:100}#q{width:100%;padding-right:1rem;padding-left:0!important;border-radius:0 .8rem .8rem 0}#q::-ms-clear,#q::-webkit-search-cancel-button{display:none}#send_search{border-radius:.8rem 0 0 .8rem}#send_search:hover{cursor:pointer;background-color:var(--color-search-background-hover);color:var(--color-search-background)}.no-js #clear_search,.no-js #send_search{width:auto!important;border-right:1px solid var(--color-search-border)}.search_filters{margin-top:.6rem;margin-left:0;margin-bottom:0;margin-right:10.6rem;display:flex;overflow-x:auto;overscroll-behavior-inline:contain}.search_filters select{background-color:inherit}.search_filters select:hover,.search_filters select:focus{color:var(--color-base-font)}@media screen and (max-width: 79.75em){#search_header{padding:1.5em .5rem 0;column-gap:.5rem}.search_filters{margin-top:.6rem;margin-left:0;margin-bottom:0;margin-right:3.5rem}#categories{font-size:90%;clear:both}}@media screen and (max-width: 79.75em) and (hover: none){#main_index #categories_container,#main_results #categories_container{width:max-content}#main_index #categories_container .category_checkbox,#main_results #categories_container .category_checkbox{display:inline-block;width:auto}#main_index #categories,#main_results #categories{width:100%;text-align:right;overflow:scroll hidden;-webkit-overflow-scrolling:touch}}@media screen and (max-width: 50em){#search_header{width:100%;margin:0;padding:.1rem 0 0;gap:0 0;grid-template-areas:"logo search" "categories categories"}.search_logo{padding:0}.search_box{width:98%;display:flex}#q{width:100%;flex:1}.search_filters{margin:0 10px;padding:.5rem 0}.category{display:inline-block;width:auto;margin:0}.category svg{display:none}.category_checkbox label,.category_button{padding:1rem!important;margin:0!important}#search_view:focus-within{display:block;background-color:var(--color-search-background);position:absolute;top:0;height:100%;width:100%;z-index:2000}#search_view:focus-within .search_box{border-bottom:1px solid var(--color-search-border);width:100%;border-radius:0;box-shadow:none}#search_view:focus-within .search_box #send_search{margin-left:0!important}#search_view:focus-within .search_box *{border:none;border-radius:0;box-shadow:none}#main_results #q:placeholder-shown~#send_search{margin-left:2.6rem;transition:margin .1s}}@media screen and (max-width: 20rem){#search_header{grid-template-areas:"search search" "categories categories"}#search_logo{display:none}}#categories{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}#categories::-webkit-scrollbar{width:0;height:0}#categories_container{position:relative}.favicon img{height:1.5rem;width:1.5rem;border-radius:10%;background-color:var(--color-favicon-background-color);border:1px solid var(--color-favicon-border-color);display:flex}@media screen and (min-width: 50em){.center-alignment-yes #main_results{--center-page-width: 48rem}}@media screen and (width >= 62rem){.center-alignment-yes #main_results{--center-page-width: 60rem}}@media screen and (min-width: 79.75em){.center-alignment-yes #main_results{--center-page-width: 73rem}}@media screen and (min-width: 50em) and (max-width: 79.75em){.center-alignment-yes #main_results #results{grid-template-columns:60% calc(40% - 5rem);margin-left:0;margin-right:0}.center-alignment-yes #main_results #urls{margin-right:3rem}.center-alignment-yes #main_results #sidebar{margin-left:1rem}.center-alignment-yes #main_results #backToTop{right:calc(60% + 1rem)}}@media screen and (min-width: 79.75em){.center-alignment-yes #main_results{display:flex;flex-direction:column;align-items:center}.center-alignment-yes #main_results #search{width:100%;display:flex;flex-direction:column;align-items:center}.center-alignment-yes #main_results #search_header{grid-template-columns:calc(50% - 4.5rem - var(--center-page-width) / 2) 3rem var(--center-page-width);grid-template-areas:"na logo search" "na spacer categories";column-gap:1.2rem;width:100%;padding-left:0;padding-right:0}.center-alignment-yes #main_results .search_filters{margin-right:.5rem;width:var(--center-page-width)}.center-alignment-yes #main_results #results{margin-left:2rem;margin-right:10rem}.center-alignment-yes #main_results #results.only_template_images,.center-alignment-yes #main_results #results.image-detail-open{align-self:flex-start}.center-alignment-yes #main_results #results:not(.only_template_images,.image-detail-open){margin-right:1.5rem;grid-template-columns:calc(var(--center-page-width) - 5rem - 25rem) 25rem}.center-alignment-yes #main_results #results:not(.only_template_images,.image-detail-open) #backToTop{right:calc(50% - 25rem - 5rem + 1rem + var(--center-page-width) / 2)}.center-alignment-yes #main_results #results .result .content{max-width:inherit}.center-alignment-yes #main_results #urls{margin-right:0}.center-alignment-yes #main_results #sidebar{margin-left:0}}.sxng-icon-set{display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scaleX(-1)}.sxng-icon-set-small{width:1rem;height:1rem;display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scaleX(-1)}.sxng-icon-set-big{width:1.5rem;height:1.5rem;display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scaleX(-1)}html{font-family:sans-serif;font-size:.9em;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:var(--color-base-font);background-color:var(--color-base-background);padding:0;margin:0;scroll-behavior:smooth}body,main{padding:0;margin:0}body{display:flex;flex-direction:column;height:100vh;margin:0}@supports (height: 100dvh){body{height:100dvh}}main{width:100%;margin-bottom:2rem;flex:1}.page_with_header{margin:2em auto;width:85em}footer{clear:both;min-height:4rem;padding:1rem 0;width:100%;text-align:center;background-color:var(--color-footer-background);border-top:1px solid var(--color-footer-border);overflow:hidden}footer p{font-size:.9em}.page_with_header .logo{height:40px}input[type=submit],#results button[type=submit],.button{padding:.7rem;display:inline-block;background:var(--color-btn-background);color:var(--color-btn-font);border-radius:10px;border:0;cursor:pointer}a{text-decoration:none;color:var(--color-url-font)}a:visited,a:visited .highlight{color:var(--color-url-visited-font)}article[data-vim-selected]{background:var(--color-result-vim-selected);border-right:.2rem solid var(--color-result-vim-arrow);border-radius:10px 0 0 10px}article.result-images[data-vim-selected]{background:var(--color-result-vim-arrow);border:none;border-radius:10px}article.result-images[data-vim-selected] .image_thumbnail{filter:opacity(60%)}article.result-images[data-vim-selected] span.title,article.result-images[data-vim-selected] span.source{color:var(--color-result-image-span-font-selected)}article[data-vim-selected].category-videos,article[data-vim-selected].category-news,article[data-vim-selected].category-map,article[data-vim-selected].category-music,article[data-vim-selected].category-files,article[data-vim-selected].category-social{border:1px solid var(--color-result-vim-arrow);border-radius:10px}.result{margin:.125rem 0;padding:1rem;box-sizing:border-box;width:100%;border-right:.2rem solid transparent}.result h3{font-size:1.2rem;word-wrap:break-word;margin:.4rem 0;padding:0}.result h3 a{color:var(--color-result-link-font);font-weight:400;font-size:1.1em}.result h3 a:visited{color:var(--color-result-link-visited-font)}.result h3 a:focus,.result h3 a:hover{text-decoration:underline;border:none;outline:none}.result .cache_link,.result .proxyfied_link{font-size:smaller!important;margin-left:.5rem}.result .content,.result .stat{font-size:.9em;margin:0;padding:0;max-width:54em;word-wrap:break-word;line-height:1.24}.result .content .highlight,.result .stat .highlight{color:var(--color-result-description-highlight-font);background:inherit;font-weight:700}.result .altlink a{font-size:.9em;margin:0 10px 0 0;padding:5px 10px;border-radius:5px;background:var(--color-show-btn-background);color:var(--color-show-btn-font);cursor:pointer}.result .altlink a:hover{background:var(--color-btn-background);color:var(--color-btn-font)}.result .codelines .highlight{color:inherit;background:inherit;font-weight:400}.result .url_header{display:flex;gap:.5rem}.result .url_wrapper{display:flex;align-items:center;font-size:1rem;color:var(--color-result-url-font);flex-flow:row nowrap;overflow:hidden;margin:0;padding:0}.result .url_wrapper .url_o1{white-space:nowrap;flex-shrink:1;padding-bottom:1px}.result .url_wrapper .url_o1 .url_i1{unicode-bidi:plaintext}.result .url_wrapper .url_o1:after{content:" ";width:1ch;display:inline-block}.result .url_wrapper .url_o2{overflow:hidden;white-space:nowrap;flex:0 1 content;text-align:right;padding-bottom:1px}.result .url_wrapper .url_o2 .url_i2{float:right}.result .published_date,.result .result_length,.result .result_views,.result .result_author,.result .result_shipping,.result .result_source_country{font-size:.8em;color:var(--color-result-publishdate-font)}.result .result_price{font-size:1.2em;color:var(--color-result-description-highlight-font)}.result img.thumbnail{float:right;padding-top:.6rem;padding-left:1rem;width:7rem;height:unset}.result .break{clear:both}.result-paper .attributes,.result-packages .attributes{display:table;border-spacing:.125rem}.result-paper .attributes div,.result-packages .attributes div{display:table-row}.result-paper .attributes div span,.result-packages .attributes div span{font-size:.9rem;margin-top:.25rem;display:table-cell}.result-paper .attributes div span time,.result-packages .attributes div span time{font-size:.9rem}.result-paper .attributes div span:first-child,.result-packages .attributes div span:first-child{color:var(--color-base-font);min-width:10rem}.result-paper .attributes div span:nth-child(2),.result-packages .attributes div span:nth-child(2){color:var(--color-result-publishdate-font)}.result-paper .content,.result-packages .content{margin-top:.25rem}.result-paper .comments,.result-packages .comments{font-size:.9rem;margin:.25rem 0 0;padding:0;word-wrap:break-word;line-height:1.24;font-style:italic}.result-packages .attributes{margin-top:.3rem}.template_group_images{display:flex;flex-wrap:wrap}.template_group_images:after{flex-grow:10;content:""}.category-videos,.category-news,.category-map,.category-music,.category-files,.category-social{border:1px solid var(--color-result-border);margin:0 .5rem 1rem!important;border-radius:10px}.category-social .image{width:auto!important;min-width:48px;min-height:48px;padding:0 5px 25px 0!important}.audio-control audio{width:100%;padding:10px 0 0}.embedded-content iframe{width:100%;padding:10px 0 0}.result-videos img.thumbnail{float:right;padding-top:.6rem;padding-left:1rem;width:20rem;height:unset}.result-videos .content{overflow:hidden}.result-videos .embedded-video iframe{width:100%;aspect-ratio:16 / 9;padding:10px 0 0}@supports not (aspect-ratio: 1 / 1){.result-videos .embedded-video iframe{height:25.3125rem}}.engines{float:left;display:flex;flex-wrap:wrap;justify-content:flex-end;color:var(--color-result-engines-font)}.engines span{font-size:smaller;margin-top:0;margin-bottom:0;margin-left:.5rem;margin-right:0}.small_font{font-size:.8em}.highlight{color:var(--color-result-link-font-highlight);background:inherit}.empty_element{font-style:italic}.result-images{flex-grow:1;padding:.5rem .5rem 3rem;margin:.25rem;border:none!important;height:12rem;width:unset}.result-images>a{position:relative;outline:none}.result-images img{margin:0;padding:0;border:none;height:100%;width:auto;object-fit:cover;vertical-align:bottom;background:var(--color-result-image-background)}.result-images .image_resolution{position:absolute;right:0;bottom:0;background:var(--color-image-resolution-background);padding:.3rem .5rem;font-size:.9rem;color:var(--color-image-resolution-font);border-top-left-radius:.3rem}.result-images span.title,.result-images span.source{display:block;position:absolute;width:100%;font-size:.9rem;color:var(--color-result-image-span-font);padding:.5rem 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.result-images span.source{padding:1.8rem 0 0;font-size:.7rem}.result-map img.image{float:left!important;height:100px!important;width:auto!important}.result-map table{font-size:.9em;width:auto;border-collapse:separate;border-spacing:0 .35rem}.result-map table th{font-weight:inherit;width:17rem;vertical-align:top;text-align:right}.result-map table td{vertical-align:top;text-align:right}.hidden{display:none!important}#results{margin-top:1rem;margin-left:2rem;margin-bottom:0;margin-right:10rem;display:grid;grid-template:"corrections sidebar" min-content "answers sidebar" min-content "urls sidebar" 1fr "pagination sidebar" min-content / 45rem 25rem;gap:0 5rem}#results #sidebar *:first-child{margin-top:0}#urls{padding:0;grid-area:urls}#apis .wrapper{display:flex}#suggestions .wrapper{display:flex;flex-flow:column;justify-content:flex-end}#suggestions .wrapper form{display:inline-block;flex:1 1 50%}#suggestions input,#infoboxes input{padding:0;margin:3px;font-size:.9em;display:inline-block;background:transparent;color:var(--color-result-search-url-font);cursor:pointer;width:100%;text-overflow:ellipsis;overflow:hidden;text-align:left}#suggestions input[type=submit],#infoboxes input[type=submit],#suggestions .infobox .url a,#infoboxes .infobox .url a{color:var(--color-result-link-font);text-decoration:none;font-size:.9rem}#suggestions input[type=submit]:hover,#infoboxes input[type=submit]:hover,#suggestions .infobox .url a:hover,#infoboxes .infobox .url a:hover{text-decoration:underline}#corrections{grid-area:corrections;display:flex;flex-flow:row wrap;margin:0 0 1em}#corrections h4,#corrections input[type=submit]{display:inline-block;padding:.5rem;margin:.5rem}#corrections input[type=submit]{font-size:.8rem;border-radius:5px}#infoboxes .title,#suggestions .title,#search_url .title,#engines_msg .title,#apis .title{margin:2em 0 .5em;color:var(--color-base-font)}summary.title{cursor:pointer;padding-top:1em}.sidebar-collapsible{border-top:1px solid var(--color-sidebar-border);padding-bottom:.5em}#sidebar-end-collapsible{border-bottom:1px solid var(--color-sidebar-border);width:100%}#answers{grid-area:answers;background:var(--color-answer-background);padding:1rem;margin:1rem 0;margin-top:0;color:var(--color-answer-font);border-radius:10px}#answers h4{display:none}#answers span{overflow-wrap:anywhere}#answers .answer{display:flex;flex-direction:column}#answers .answer-url{margin:5px 10px 10px auto}#infoboxes form{min-width:210px}#sidebar{grid-area:sidebar;word-wrap:break-word;color:var(--color-sidebar-font)}#sidebar .infobox{margin:10px 0;border:1px solid var(--color-sidebar-border);padding:1rem;font-size:.9em;border-radius:10px}#sidebar .infobox h2{margin:0 0 .5em}#sidebar .infobox img{max-width:100%;max-height:12em;display:block;margin:0 auto;padding:0}#sidebar .infobox dt{font-weight:700}#sidebar .infobox .attributes dl{margin:.5em 0}#sidebar .infobox .attributes dt{display:inline;margin:.5em 0 .5em .25em;padding:0}#sidebar .infobox .attributes dd{display:inline;margin:.5em 0;padding:0}#sidebar .infobox input{font-size:1em}#sidebar .infobox br,#sidebar .infobox .attributes,#sidebar .infobox .urls{clear:both}#apis input{font-size:.9em;margin:0 10px 0 0;padding:5px 10px;border-radius:5px;background:var(--color-show-btn-background);color:var(--color-show-btn-font);cursor:pointer}#apis input:hover{background:var(--color-btn-background);color:var(--color-btn-font)}#engines_msg .engine-name{width:10rem}#engines_msg .response-error{color:var(--color-error)}#engines_msg .bar-chart-value{width:auto}#search_url div.selectable_url pre{float:left;width:200em}#search_url button#copy_url{float:right;padding:.4rem;margin-left:.5rem;border-radius:.3rem;display:none}#links_on_top{position:absolute;left:1rem;text-align:left;top:2.7rem;padding:0;border:0;display:flex;align-items:center;font-size:1em;color:var(--color-search-font)}#links_on_top a{display:flex;align-items:center;margin-left:1em}#links_on_top a svg{font-size:1.2em;margin-left:.125em}#links_on_top a,#links_on_top a:link *,#links_on_top a:hover *,#links_on_top a:visited *,#links_on_top a:active *{color:var(--color-search-font)}#pagination{grid-area:pagination}#pagination br{clear:both}.numbered_pagination{display:flex;flex-direction:row;justify-content:center;align-items:center;overflow:hidden}.page_number{background:transparent!important;color:var(--color-result-link-font)!important;text-decoration:underline}.page_number_current{background:transparent;color:var(--color-result-link-visited-font);border:none}#backToTop{border:1px solid var(--color-backtotop-border);margin:0;padding:0;font-size:1em;background:var(--color-backtotop-background);position:fixed;bottom:8rem;right:56.3rem;transition:opacity .5s;opacity:0;pointer-events:none;border-radius:10px}#backToTop a{display:block;margin:0;padding:.7em}#backToTop a,#backToTop a:visited,#backToTop a:hover,#backToTop a:active{color:var(--color-backtotop-font)}#results.scrolling #backToTop{opacity:1;pointer-events:all}@media screen and (width <= calc(79.75em - .5px)){#links_on_top span{display:none}}@media screen and (width <= 52rem){body.results_endpoint #links_on_top .link_on_top_about,body.results_endpoint #links_on_top .link_on_top_donate{display:none}}@media screen and (min-width: 50em) and (max-width: 79.75em){.center-alignment-no #links_on_top span{display:none}.center-alignment-no .page_with_header{margin:2rem .5rem;width:auto}.center-alignment-no #infoboxes{position:inherit;max-width:inherit}.center-alignment-no #infoboxes .infobox{clear:both}.center-alignment-no #infoboxes .infobox img{float:right;max-width:10em;margin:.5em 0 .5em .5em}.center-alignment-no #sidebar{margin:0 .5rem .125rem;padding:0;float:none;border:none;width:auto}.center-alignment-no #sidebar input{border:0}.center-alignment-no .result .thumbnail{max-width:98%}.center-alignment-no .result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.center-alignment-no .result .engines{float:left;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:3px 0 0}.center-alignment-no .result-images{border-bottom:none!important}.center-alignment-no .image_result,.center-alignment-no .image_result img{max-width:98%}.center-alignment-no #backToTop{display:none}.center-alignment-no #pagination{margin:2rem 0 0!important}.center-alignment-no #main_results div#results{margin:0 auto;justify-content:center;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 45rem;gap:0}}#main_results div#results.only_template_images{margin:1rem .5rem 0;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 100%;gap:0}#main_results div#results.only_template_images #sidebar{display:none}#main_results div#results.only_template_images #urls{margin:0;display:flex;flex-wrap:wrap}#main_results div#results.only_template_images #urls:after{flex-grow:10;content:""}#main_results div#results.only_template_images #backToTop{right:auto;left:1rem}#main_results div#results.only_template_images #pagination{margin-left:4rem}@media screen and (max-width: 50em){#links_on_top span{display:none}.page_with_header{margin:2rem .5rem;width:auto}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:right;max-width:10em;margin:.5em 0 .5em .5em}#sidebar{margin:0 .5rem .125rem;padding:0;float:none;border:none;width:auto}#sidebar input{border:0}.result .thumbnail{max-width:98%}.result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.result .engines{float:left;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:3px 0 0}.result-images{border-bottom:none!important}.image_result,.image_result img{max-width:98%}#backToTop{display:none}#pagination{margin:2rem 0 0!important}#main_results div#results{margin:0 auto;justify-content:center;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 45rem;gap:0}html{background-color:var(--color-base-background-mobile)}#main_results div#results{grid-template-columns:100%;margin:0 auto}#links_on_top{top:1.4rem;left:10px}#main_index #links_on_top{top:.5rem;left:.5rem}#results{margin:0;padding:0}#pagination{margin:2rem 1rem 0!important}article[data-vim-selected]{border:1px solid var(--color-result-vim-arrow);border-radius:10px}.result{background:var(--color-result-background);border:1px solid var(--color-result-background);margin:1rem 2%;width:96%;border-radius:10px}.result-images{margin:0;height:10rem;background:var(--color-base-background-mobile);width:unset}.infobox{border:none!important;background-color:var(--color-sidebar-background)}.numbered_pagination{display:none}.result-paper .attributes,.result-packages .attributes,.result-paper .attributes div,.result-packages .attributes div{display:block}.result-paper .attributes div span,.result-packages .attributes div span{display:inline}.result-paper .attributes div span:first-child,.result-packages .attributes div span:first-child{font-weight:700}.result-paper .attributes div span:nth-child(2),.result-packages .attributes div span:nth-child(2){margin-right:.5rem}}@media screen and (max-width: 35em){.result-videos img.thumbnail{float:none!important}.result-videos .content{overflow:inherit}}pre code{white-space:pre-wrap}#main_results .result-keyvalue caption{padding:.8rem .5rem;font-style:italic;caption-side:bottom;background-color:var(--color-result-keyvalue-table)}#main_results .result-keyvalue .col-key{width:25%}#main_results .result-keyvalue table{word-break:break-word;table-layout:fixed;width:100%;background-color:var(--color-result-keyvalue-table)}#main_results .result-keyvalue tr.odd{background-color:var(--color-result-keyvalue-odd)}#main_results .result-keyvalue tr.even{background-color:var(--color-result-keyvalue-even)}#main_results .result-keyvalue th,#main_results .result-keyvalue td{padding:.3rem .5rem}#q,#sidebar .infobox dt bdi{direction:rtl}#urls{direction:initial;text-align:right}#urls .result .url_header{direction:rtl}#urls .result .url_wrapper{justify-content:end}#main_results div#results.only_template_images #urls{direction:rtl}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p{direction:rtl}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url{direction:ltr}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url span{direction:rtl;float:right}@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))){select{border-width:0 0 0 2rem;background-position-x:-2rem}}#vim-hotkeys-help table{direction:ltr;text-align:left}#main_preferences h1,#main_stats h1{background-position-x:100%}.bar-chart-serie1,.bar-chart-serie2{float:right}.engine-stats .engine-name,.engine-stats .engine-score,.engine-stats .result-count,.engine-stats .response-time,.engine-stats .engine-reliability{text-align:right} +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}:root{--color-base-font: #444;--color-base-font-rgb: 68, 68, 68;--color-base-background: #fff;--color-base-background-mobile: #f2f5f8;--color-url-font: #334999;--color-url-visited-font: #9822c3;--color-header-background: #fdfbff;--color-header-border: #ddd;--color-footer-background: #fdfbff;--color-footer-border: #ddd;--color-sidebar-border: #ddd;--color-sidebar-font: #000;--color-sidebar-background: #fff;--color-backtotop-font: #444;--color-backtotop-border: #ddd;--color-backtotop-background: #fff;--color-btn-background: #3050ff;--color-btn-font: #fff;--color-show-btn-background: #bbb;--color-show-btn-font: #000;--color-search-border: #bbb;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #fff;--color-search-font: #222;--color-search-background-hover: #3050ff;--color-error: #db3434;--color-error-background: #fae1e1;--color-warning: #dbba34;--color-warning-background: #faf5e1;--color-success: #42db34;--color-success-background: #e3fae1;--color-categories-item-selected-font: #3050ff;--color-categories-item-border-selected: #3050ff;--color-autocomplete-font: #000;--color-autocomplete-border: #bbb;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #fff;--color-autocomplete-background-hover: #e3e3e3;--color-answer-font: #444;--color-answer-background: #fff;--color-result-keyvalue-col-table: #fdfbff;--color-result-keyvalue-odd: #fdfbff;--color-result-keyvalue-even: #fff;--color-result-background: #fff;--color-result-border: #ddd;--color-result-url-font: #000;--color-result-vim-selected: #f7f7f7;--color-result-vim-arrow: #000bbb;--color-result-description-highlight-font: #000;--color-result-link-font: #000bbb;--color-result-link-font-highlight: #000bbb;--color-result-link-visited-font: #9822c3;--color-result-publishdate-font: #777;--color-result-engines-font: #545454;--color-result-search-url-border: #ddd;--color-result-search-url-font: #000;--color-result-image-span-font: #444;--color-result-image-span-font-selected: #fff;--color-result-image-background: #fff;--color-settings-tr-hover: #ebebeb;--color-settings-engine-description-font: #545454;--color-settings-table-group-background: #0001;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #242424;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #545454;--color-toolkit-kbd-font: #fff;--color-toolkit-kbd-background: #000;--color-toolkit-dialog-border: #ddd;--color-toolkit-dialog-background: #fff;--color-toolkit-tabs-label-border: #fff;--color-toolkit-tabs-section-border: #ddd;--color-toolkit-select-background: #e1e1e1;--color-toolkit-select-border: #ddd;--color-toolkit-select-background-hover: #bbb;--color-toolkit-input-text-font: #222;--color-toolkit-checkbox-onoff-off-background: #ddd;--color-toolkit-checkbox-onoff-on-background: #ddd;--color-toolkit-checkbox-onoff-on-mark-background: #3050ff;--color-toolkit-checkbox-onoff-on-mark-color: #fff;--color-toolkit-checkbox-onoff-off-mark-background: #aaa;--color-toolkit-checkbox-onoff-off-mark-color: #fff;--color-toolkit-checkbox-label-background: #ddd;--color-toolkit-checkbox-label-border: #ddd;--color-toolkit-checkbox-input-border: #3050ff;--color-toolkit-engine-tooltip-border: #ddd;--color-toolkit-engine-tooltip-background: #fff;--color-toolkit-loader-border: rgba(0, 0, 0, .2);--color-toolkit-loader-borderleft: rgba(255, 255, 255, 0);--color-doc-code: #003;--color-doc-code-background: #ddeaff;--color-bar-chart-primary: #5bc0de;--color-bar-chart-secondary: #deb15b;--color-image-resolution-background: rgba(0, 0, 0, .5);--color-image-resolution-font: #fff;--color-loading-indicator: rgba(255, 255, 255, .2);--color-loading-indicator-gap: #fff;--color-line-number: #64708d;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}@media (prefers-color-scheme: dark){:root.theme-auto{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}}:root.theme-dark{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}:root.theme-black{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc;--color-base-background: #000;--color-base-background-mobile: #000;--color-header-background: #000;--color-footer-background: #000;--color-sidebar-background: #000}.code-highlight pre{line-height:100%}.code-highlight td.linenos .normal,.code-highlight span.linenos{color:inherit;background-color:transparent;padding-left:5px;padding-right:5px}.code-highlight td.linenos .special,.code-highlight span.linenos.special{color:#000;background-color:#ffffc0;padding-left:5px;padding-right:5px}.code-highlight .hll{background-color:#ffc}.code-highlight .c{color:#3d7b7b;font-style:italic}.code-highlight .err{border:1px solid #F00}.code-highlight .k{color:green;font-weight:700}.code-highlight .o{color:#666}.code-highlight .ch,.code-highlight .cm{color:#3d7b7b;font-style:italic}.code-highlight .cp{color:#9c6500}.code-highlight .cpf,.code-highlight .c1,.code-highlight .cs{color:#3d7b7b;font-style:italic}.code-highlight .gd{color:#a00000}.code-highlight .ge{font-style:italic}.code-highlight .ges{font-weight:700;font-style:italic}.code-highlight .gr{color:#e40000}.code-highlight .gh{color:navy;font-weight:700}.code-highlight .gi{color:#008400}.code-highlight .go{color:#717171}.code-highlight .gp{color:navy;font-weight:700}.code-highlight .gs{font-weight:700}.code-highlight .gu{color:purple;font-weight:700}.code-highlight .gt{color:#04d}.code-highlight .kc,.code-highlight .kd,.code-highlight .kn{color:green;font-weight:700}.code-highlight .kp{color:green}.code-highlight .kr{color:green;font-weight:700}.code-highlight .kt{color:#b00040}.code-highlight .m{color:#666}.code-highlight .s{color:#ba2121}.code-highlight .na{color:#687822}.code-highlight .nb{color:green}.code-highlight .nc{color:#00f;font-weight:700}.code-highlight .no{color:#800}.code-highlight .nd{color:#a2f}.code-highlight .ni{color:#717171;font-weight:700}.code-highlight .ne{color:#cb3f38;font-weight:700}.code-highlight .nf{color:#00f}.code-highlight .nl{color:#767600}.code-highlight .nn{color:#00f;font-weight:700}.code-highlight .nt{color:green;font-weight:700}.code-highlight .nv{color:#19177c}.code-highlight .ow{color:#a2f;font-weight:700}.code-highlight .w{color:#bbb}.code-highlight .mb,.code-highlight .mf,.code-highlight .mh,.code-highlight .mi,.code-highlight .mo{color:#666}.code-highlight .sa,.code-highlight .sb,.code-highlight .sc,.code-highlight .dl{color:#ba2121}.code-highlight .sd{color:#ba2121;font-style:italic}.code-highlight .s2{color:#ba2121}.code-highlight .se{color:#aa5d1f;font-weight:700}.code-highlight .sh{color:#ba2121}.code-highlight .si{color:#a45a77;font-weight:700}.code-highlight .sx{color:green}.code-highlight .sr{color:#a45a77}.code-highlight .s1{color:#ba2121}.code-highlight .ss{color:#19177c}.code-highlight .bp{color:green}.code-highlight .fm{color:#00f}.code-highlight .vc,.code-highlight .vg,.code-highlight .vi,.code-highlight .vm{color:#19177c}.code-highlight .il{color:#666}.codelines{margin:.125rem 0 0;padding:1rem 0 0}.code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}.code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}.code-highlight .linenos::selection{background:transparent}.code-highlight .linenos::-moz-selection{background:transparent}.code-highlight span.linenos{color:var(--color-line-number)}@media (prefers-color-scheme: dark){:root.theme-auto .code-highlight pre{line-height:100%}:root.theme-auto .code-highlight td.linenos .normal{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight span.linenos{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight td.linenos .special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight span.linenos.special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight .hll{background-color:#6e7681}:root.theme-auto .code-highlight .c{color:#7e8aa1}:root.theme-auto .code-highlight .err{color:#f88f7f}:root.theme-auto .code-highlight .esc{color:#d4d2c8}:root.theme-auto .code-highlight .g{color:#d4d2c8}:root.theme-auto .code-highlight .k{color:#ffad66}:root.theme-auto .code-highlight .l{color:#d5ff80}:root.theme-auto .code-highlight .n{color:#d4d2c8}:root.theme-auto .code-highlight .o{color:#ffad66}:root.theme-auto .code-highlight .x{color:#d4d2c8}:root.theme-auto .code-highlight .p{color:#d4d2c8}:root.theme-auto .code-highlight .ch{color:#f88f7f;font-style:italic}:root.theme-auto .code-highlight .cm{color:#7e8aa1}:root.theme-auto .code-highlight .cp{color:#ffad66;font-weight:700}:root.theme-auto .code-highlight .cpf{color:#7e8aa1}:root.theme-auto .code-highlight .c1{color:#7e8aa1}:root.theme-auto .code-highlight .cs{color:#7e8aa1;font-style:italic}:root.theme-auto .code-highlight .gd{color:#f88f7f;background-color:#3d1e20}:root.theme-auto .code-highlight .ge{color:#d4d2c8;font-style:italic}:root.theme-auto .code-highlight .ges{color:#d4d2c8}:root.theme-auto .code-highlight .gr{color:#f88f7f}:root.theme-auto .code-highlight .gh{color:#d4d2c8}:root.theme-auto .code-highlight .gi{color:#6ad4af;background-color:#19362c}:root.theme-auto .code-highlight .go{color:#7e8aa1}:root.theme-auto .code-highlight .gp{color:#d4d2c8}:root.theme-auto .code-highlight .gs{color:#d4d2c8;font-weight:700}:root.theme-auto .code-highlight .gu{color:#d4d2c8}:root.theme-auto .code-highlight .gt{color:#f88f7f}:root.theme-auto .code-highlight .kc{color:#ffad66}:root.theme-auto .code-highlight .kd{color:#ffad66}:root.theme-auto .code-highlight .kn{color:#ffad66}:root.theme-auto .code-highlight .kp{color:#ffad66}:root.theme-auto .code-highlight .kr{color:#ffad66}:root.theme-auto .code-highlight .kt{color:#73d0ff}:root.theme-auto .code-highlight .ld{color:#d5ff80}:root.theme-auto .code-highlight .m{color:#dfbfff}:root.theme-auto .code-highlight .s{color:#d5ff80}:root.theme-auto .code-highlight .na{color:#ffd173}:root.theme-auto .code-highlight .nb{color:#ffd173}:root.theme-auto .code-highlight .nc{color:#73d0ff}:root.theme-auto .code-highlight .no{color:#ffd173}:root.theme-auto .code-highlight .nd{color:#7e8aa1;font-weight:700;font-style:italic}:root.theme-auto .code-highlight .ni{color:#95e6cb}:root.theme-auto .code-highlight .ne{color:#73d0ff}:root.theme-auto .code-highlight .nf{color:#ffd173}:root.theme-auto .code-highlight .nl{color:#d4d2c8}:root.theme-auto .code-highlight .nn{color:#d4d2c8}:root.theme-auto .code-highlight .nx{color:#d4d2c8}:root.theme-auto .code-highlight .py{color:#ffd173}:root.theme-auto .code-highlight .nt{color:#5ccfe6}:root.theme-auto .code-highlight .nv{color:#d4d2c8}:root.theme-auto .code-highlight .ow{color:#ffad66}:root.theme-auto .code-highlight .pm{color:#d4d2c8}:root.theme-auto .code-highlight .w{color:#d4d2c8}:root.theme-auto .code-highlight .mb{color:#dfbfff}:root.theme-auto .code-highlight .mf{color:#dfbfff}:root.theme-auto .code-highlight .mh{color:#dfbfff}:root.theme-auto .code-highlight .mi{color:#dfbfff}:root.theme-auto .code-highlight .mo{color:#dfbfff}:root.theme-auto .code-highlight .sa{color:#f29e74}:root.theme-auto .code-highlight .sb{color:#d5ff80}:root.theme-auto .code-highlight .sc{color:#d5ff80}:root.theme-auto .code-highlight .dl{color:#d5ff80}:root.theme-auto .code-highlight .sd{color:#7e8aa1}:root.theme-auto .code-highlight .s2{color:#d5ff80}:root.theme-auto .code-highlight .se{color:#95e6cb}:root.theme-auto .code-highlight .sh{color:#d5ff80}:root.theme-auto .code-highlight .si{color:#95e6cb}:root.theme-auto .code-highlight .sx{color:#95e6cb}:root.theme-auto .code-highlight .sr{color:#95e6cb}:root.theme-auto .code-highlight .s1{color:#d5ff80}:root.theme-auto .code-highlight .ss{color:#dfbfff}:root.theme-auto .code-highlight .bp{color:#5ccfe6}:root.theme-auto .code-highlight .fm{color:#ffd173}:root.theme-auto .code-highlight .vc{color:#d4d2c8}:root.theme-auto .code-highlight .vg{color:#d4d2c8}:root.theme-auto .code-highlight .vi{color:#d4d2c8}:root.theme-auto .code-highlight .vm{color:#d4d2c8}:root.theme-auto .code-highlight .il{color:#dfbfff}:root.theme-auto .code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}:root.theme-auto .code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}:root.theme-auto .code-highlight .linenos::selection{background:transparent}:root.theme-auto .code-highlight .linenos::-moz-selection{background:transparent}:root.theme-auto .code-highlight span.linenos{color:var(--color-line-number)}}:root.theme-dark .code-highlight pre{line-height:100%}:root.theme-dark .code-highlight td.linenos .normal{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight span.linenos{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight td.linenos .special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight span.linenos.special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight .hll{background-color:#6e7681}:root.theme-dark .code-highlight .c{color:#7e8aa1}:root.theme-dark .code-highlight .err{color:#f88f7f}:root.theme-dark .code-highlight .esc{color:#d4d2c8}:root.theme-dark .code-highlight .g{color:#d4d2c8}:root.theme-dark .code-highlight .k{color:#ffad66}:root.theme-dark .code-highlight .l{color:#d5ff80}:root.theme-dark .code-highlight .n{color:#d4d2c8}:root.theme-dark .code-highlight .o{color:#ffad66}:root.theme-dark .code-highlight .x{color:#d4d2c8}:root.theme-dark .code-highlight .p{color:#d4d2c8}:root.theme-dark .code-highlight .ch{color:#f88f7f;font-style:italic}:root.theme-dark .code-highlight .cm{color:#7e8aa1}:root.theme-dark .code-highlight .cp{color:#ffad66;font-weight:700}:root.theme-dark .code-highlight .cpf{color:#7e8aa1}:root.theme-dark .code-highlight .c1{color:#7e8aa1}:root.theme-dark .code-highlight .cs{color:#7e8aa1;font-style:italic}:root.theme-dark .code-highlight .gd{color:#f88f7f;background-color:#3d1e20}:root.theme-dark .code-highlight .ge{color:#d4d2c8;font-style:italic}:root.theme-dark .code-highlight .ges{color:#d4d2c8}:root.theme-dark .code-highlight .gr{color:#f88f7f}:root.theme-dark .code-highlight .gh{color:#d4d2c8}:root.theme-dark .code-highlight .gi{color:#6ad4af;background-color:#19362c}:root.theme-dark .code-highlight .go{color:#7e8aa1}:root.theme-dark .code-highlight .gp{color:#d4d2c8}:root.theme-dark .code-highlight .gs{color:#d4d2c8;font-weight:700}:root.theme-dark .code-highlight .gu{color:#d4d2c8}:root.theme-dark .code-highlight .gt{color:#f88f7f}:root.theme-dark .code-highlight .kc{color:#ffad66}:root.theme-dark .code-highlight .kd{color:#ffad66}:root.theme-dark .code-highlight .kn{color:#ffad66}:root.theme-dark .code-highlight .kp{color:#ffad66}:root.theme-dark .code-highlight .kr{color:#ffad66}:root.theme-dark .code-highlight .kt{color:#73d0ff}:root.theme-dark .code-highlight .ld{color:#d5ff80}:root.theme-dark .code-highlight .m{color:#dfbfff}:root.theme-dark .code-highlight .s{color:#d5ff80}:root.theme-dark .code-highlight .na{color:#ffd173}:root.theme-dark .code-highlight .nb{color:#ffd173}:root.theme-dark .code-highlight .nc{color:#73d0ff}:root.theme-dark .code-highlight .no{color:#ffd173}:root.theme-dark .code-highlight .nd{color:#7e8aa1;font-weight:700;font-style:italic}:root.theme-dark .code-highlight .ni{color:#95e6cb}:root.theme-dark .code-highlight .ne{color:#73d0ff}:root.theme-dark .code-highlight .nf{color:#ffd173}:root.theme-dark .code-highlight .nl{color:#d4d2c8}:root.theme-dark .code-highlight .nn{color:#d4d2c8}:root.theme-dark .code-highlight .nx{color:#d4d2c8}:root.theme-dark .code-highlight .py{color:#ffd173}:root.theme-dark .code-highlight .nt{color:#5ccfe6}:root.theme-dark .code-highlight .nv{color:#d4d2c8}:root.theme-dark .code-highlight .ow{color:#ffad66}:root.theme-dark .code-highlight .pm{color:#d4d2c8}:root.theme-dark .code-highlight .w{color:#d4d2c8}:root.theme-dark .code-highlight .mb{color:#dfbfff}:root.theme-dark .code-highlight .mf{color:#dfbfff}:root.theme-dark .code-highlight .mh{color:#dfbfff}:root.theme-dark .code-highlight .mi{color:#dfbfff}:root.theme-dark .code-highlight .mo{color:#dfbfff}:root.theme-dark .code-highlight .sa{color:#f29e74}:root.theme-dark .code-highlight .sb{color:#d5ff80}:root.theme-dark .code-highlight .sc{color:#d5ff80}:root.theme-dark .code-highlight .dl{color:#d5ff80}:root.theme-dark .code-highlight .sd{color:#7e8aa1}:root.theme-dark .code-highlight .s2{color:#d5ff80}:root.theme-dark .code-highlight .se{color:#95e6cb}:root.theme-dark .code-highlight .sh{color:#d5ff80}:root.theme-dark .code-highlight .si{color:#95e6cb}:root.theme-dark .code-highlight .sx{color:#95e6cb}:root.theme-dark .code-highlight .sr{color:#95e6cb}:root.theme-dark .code-highlight .s1{color:#d5ff80}:root.theme-dark .code-highlight .ss{color:#dfbfff}:root.theme-dark .code-highlight .bp{color:#5ccfe6}:root.theme-dark .code-highlight .fm{color:#ffd173}:root.theme-dark .code-highlight .vc{color:#d4d2c8}:root.theme-dark .code-highlight .vg{color:#d4d2c8}:root.theme-dark .code-highlight .vi{color:#d4d2c8}:root.theme-dark .code-highlight .vm{color:#d4d2c8}:root.theme-dark .code-highlight .il{color:#dfbfff}:root.theme-dark .code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}:root.theme-dark .code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}:root.theme-dark .code-highlight .linenos::selection{background:transparent}:root.theme-dark .code-highlight .linenos::-moz-selection{background:transparent}:root.theme-dark .code-highlight span.linenos{color:var(--color-line-number)}html.no-js .hide_if_nojs,html.js .show_if_nojs{display:none}.center{text-align:center}.right{float:right}.left{float:left}.invisible{display:none!important}.list-unstyled{list-style-type:none}.list-unstyled li{margin-top:4px;margin-bottom:4px}.danger{background-color:var(--color-error-background)}.warning{background:var(--color-warning-background)}.success{background:var(--color-success-background)}.badge{display:inline-block;color:var(--color-toolkit-badge-font);background-color:var(--color-toolkit-badge-background);text-align:center;white-space:nowrap;vertical-align:baseline;min-width:10px;padding:1px 5px;border-radius:5px}kbd{padding:2px 4px;margin:1px;font-size:90%;color:var(--color-toolkit-kbd-font);background:var(--color-toolkit-kbd-background)}table{width:100%}table.striped tr{border-bottom:1px solid var(--color-settings-tr-hover)}th{padding:.4em}td{padding:0 4px}tr:hover{background:var(--color-settings-tr-hover)!important}div.selectable_url{display:block;border:1px solid var(--color-result-search-url-border);padding:4px;color:var(--color-result-search-url-font);margin:.1em;overflow:hidden;height:1.2em;line-height:1.2em;border-radius:5px}div.selectable_url pre{display:block;font-size:.8em;word-break:break-all;margin:.1em;-webkit-user-select:all;user-select:all}.dialog-error{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:right;border-radius:10px;color:var(--color-error);background:var(--color-error-background);border-color:var(--color-error)}.dialog-error .close{float:left;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error ul,.dialog-error ol,.dialog-error p{margin:1px 0 0}.dialog-error table{width:auto}.dialog-error tr{vertical-align:text-top}.dialog-error tr:hover{background:transparent!important}.dialog-error td{padding:0 1em 0 0;padding-left:1rem;padding-bottom:0;padding-right:0}.dialog-error h4{margin-top:.3em;margin-bottom:.3em}.dialog-error-block{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:right;border-radius:10px;display:block;color:var(--color-error);background:var(--color-error-background);border-color:var(--color-error)}.dialog-error-block .close{float:left;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error-block ul,.dialog-error-block ol,.dialog-error-block p{margin:1px 0 0}.dialog-error-block table{width:auto}.dialog-error-block tr{vertical-align:text-top}.dialog-error-block tr:hover{background:transparent!important}.dialog-error-block td{padding:0 1em 0 0;padding-left:1rem;padding-bottom:0;padding-right:0}.dialog-error-block h4{margin-top:.3em;margin-bottom:.3em}.dialog-warning{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:right;border-radius:10px;color:var(--color-warning);background:var(--color-warning-background);border-color:var(--color-warning)}.dialog-warning .close{float:left;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-warning ul,.dialog-warning ol,.dialog-warning p{margin:1px 0 0}.dialog-warning table{width:auto}.dialog-warning tr{vertical-align:text-top}.dialog-warning tr:hover{background:transparent!important}.dialog-warning td{padding:0 1em 0 0;padding-left:1rem;padding-bottom:0;padding-right:0}.dialog-warning h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal{position:relative;display:flex;padding:1rem;border:1px solid var(--color-toolkit-dialog-border);text-align:right;border-radius:10px;display:block;background:var(--color-toolkit-dialog-background);position:fixed;top:50%;left:50%;margin:0 auto;transform:translate(-50%,-50%);z-index:5000}.dialog-modal .close{float:left;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-modal ul,.dialog-modal ol,.dialog-modal p{margin:1px 0 0}.dialog-modal table{width:auto}.dialog-modal tr{vertical-align:text-top}.dialog-modal tr:hover{background:transparent!important}.dialog-modal td{padding:0 1em 0 0;padding-left:1rem;padding-bottom:0;padding-right:0}.dialog-modal h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal h3{margin-top:0}.btn-collapse{cursor:pointer}.scrollx{overflow:auto hidden;display:block;padding:0;margin:0;border:none}.tabs .tabs>label{font-size:90%}ul.tabs{border-bottom:1px solid var(--color-toolkit-tabs-section-border);list-style:none;padding-left:0}ul.tabs li{display:flex}.tabs{display:flex;flex-wrap:wrap;width:100%;min-width:100%}.tabs>*{order:2}.tabs>input[type=radio]{display:none}.tabs>label,.tabs>li>a{order:1;padding:.7em;margin:0 .7em;letter-spacing:.5px;text-transform:uppercase;border:solid var(--color-toolkit-tabs-label-border);border-width:0 0 2px 0;color:unset;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:pointer}.tabs>label.active,.tabs>li>a.active{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font)}.tabs>label:hover,.tabs>li>a:hover{border-bottom:2px solid var(--color-categories-item-border-selected)}.tabs>section{min-width:100%;padding:.7rem 0;box-sizing:border-box;border-top:1px solid var(--color-toolkit-tabs-section-border);display:none}.tabs>label:last-of-type{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font);letter-spacing:-.1px}.tabs>section:last-of-type{display:block}html body .tabs>input:checked~section{display:none}html body .tabs>input:checked~label{position:inherited;background:inherit;border-bottom:2px solid transparent;font-weight:400;color:inherit}html body .tabs>input:checked~label:hover{border-bottom:2px solid var(--color-categories-item-border-selected)}html body .tabs>input:checked+label{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font)}html body .tabs>input:checked+label+section{display:block}select{height:2.4rem;margin-top:0;margin-left:1rem;margin-bottom:0;margin-right:0;padding:.2rem!important;color:var(--color-search-font);font-size:.9rem;z-index:100}select:hover,select:focus{cursor:pointer}@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))){select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border-width:0 2rem 0 0;border-color:transparent;background:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E) no-repeat;background-position-x:calc(100% + 2rem);background-size:2rem;background-origin:content-box;background-color:var(--color-toolkit-select-background);outline:medium none;text-overflow:ellipsis;border-radius:5px}select:hover,select:focus{background-color:var(--color-toolkit-select-background-hover)}select option{background-color:var(--color-base-background)}@media (prefers-color-scheme: dark){html.theme-auto select,html.theme-dark select{background-image:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20fill%3D%22%23ddd%22%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E)}}html.theme-dark select{background-image:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20fill%3D%22%23ddd%22%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E)}}input.checkbox-onoff[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;display:inline-block;width:2.5em;height:.7em;box-shadow:none!important;margin:0 16px;border-radius:10px;position:relative}input.checkbox-onoff[type=checkbox]:focus,input.checkbox-onoff[type=checkbox]:hover{outline:none}input.checkbox-onoff[type=checkbox]:focus:after{content:"";position:absolute;width:3.5em;height:1.65em;border:1px solid var(--color-btn-background);border-radius:12px;box-shadow:var(--color-btn-background) 0 0 3px;z-index:1200;top:-.55em;left:-.6em}input.checkbox-onoff[type=checkbox]:before{position:absolute;top:-.5em;display:flex;justify-content:center;align-items:center;font-size:.75em;width:1.875em;height:1.875em;border-radius:50%}input.checkbox-onoff[type=checkbox],input.checkbox-onoff.reversed-checkbox[type=checkbox]:checked{background:var(--color-toolkit-checkbox-onoff-off-background)}input.checkbox-onoff[type=checkbox]:before,input.checkbox-onoff.reversed-checkbox[type=checkbox]:checked:before{left:-.5em;content:"✕";color:var(--color-toolkit-checkbox-onoff-off-mark-color);background:var(--color-toolkit-checkbox-onoff-off-mark-background)}input.checkbox-onoff[type=checkbox]:checked,input.checkbox-onoff.reversed-checkbox[type=checkbox]{background:var(--color-toolkit-checkbox-onoff-on-background)}input.checkbox-onoff[type=checkbox]:checked:before,input.checkbox-onoff.reversed-checkbox[type=checkbox]:before{left:calc(100% - 1.5em);content:"✓";color:var(--color-toolkit-checkbox-onoff-on-mark-color);background:var(--color-toolkit-checkbox-onoff-on-mark-background)}@supports (transform: rotate(-45deg)){input[type=checkbox]:not(.checkbox-onoff){-webkit-appearance:none;-moz-appearance:none;appearance:none;width:20px;height:20px;cursor:pointer;position:relative;top:0;left:0;border:2px solid var(--color-toolkit-checkbox-input-border);border-radius:.3em}input[type=checkbox]:not(.checkbox-onoff):after{content:"";width:9px;height:5px;position:absolute;top:3px;left:2px;border:3px solid var(--color-toolkit-checkbox-label-border);border-top:none;border-right:none;background:transparent;opacity:0;transform:rotate(-45deg)}input[type=checkbox]:not(.checkbox-onoff):checked:after{border-color:var(--color-toolkit-checkbox-input-border);opacity:1}input[type=checkbox][disabled]:not(.checkbox-onoff){border:inherit;background-color:transparent!important;cursor:inherit}input.checkbox[type=checkbox]:not(:checked,[disabled],.checkbox-onoff):hover:after{opacity:.5}}@media screen and (max-width: 50em){.tabs>label{width:100%}}.loader,.loader:after{border-radius:50%;width:2em;height:2em}.loader{margin:1em auto;font-size:10px;position:relative;text-indent:-9999em;border-top:.5em solid var(--color-toolkit-loader-border);border-right:.5em solid var(--color-toolkit-loader-border);border-bottom:.5em solid var(--color-toolkit-loader-border);border-left:.5em solid var(--color-toolkit-loader-borderleft);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.2s infinite linear;animation:load8 1.2s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.engine-tooltip{display:none;position:absolute;padding:.5rem 1rem;margin:0 0 0 2rem;border:1px solid var(--color-toolkit-engine-tooltip-border);background:var(--color-toolkit-engine-tooltip-background);font-size:14px;font-weight:400;z-index:5000;text-align:left;border-radius:10px}th:hover .engine-tooltip,td:hover .engine-tooltip,.engine-tooltip:hover{display:inline-block}.stacked-bar-chart{margin:0;padding:0 .125rem 0 4rem;width:100%;width:-moz-available;width:-webkit-fill-available;width:fill;flex-flow:row nowrap;align-items:center;display:inline-flex}.stacked-bar-chart-value{width:3rem;display:inline-block;position:absolute;padding:0 .5rem;text-align:right}.stacked-bar-chart-base{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset}.stacked-bar-chart-median{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:var(--color-base-font);border:1px solid rgba(var(--color-base-font-rgb),.9);padding:.3rem 0}.stacked-bar-chart-rate80{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border:1px solid rgba(var(--color-base-font-rgb),.3);padding:.3rem 0}.stacked-bar-chart-rate95{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border-bottom:1px dotted rgba(var(--color-base-font-rgb),.5);padding:0}.stacked-bar-chart-rate100{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border-left:1px solid rgba(var(--color-base-font-rgb),.9);padding:.4rem 0;width:1px}/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */.autocomplete{position:absolute;width:44rem;max-width:calc(100% - 1rem);max-height:0;overflow-y:hidden;text-align:right;border-radius:10px}.autocomplete:active,.autocomplete:focus,.autocomplete:hover{background-color:var(--color-autocomplete-background)}.autocomplete:empty{display:none}.autocomplete>ul{list-style-type:none;margin:0;padding:0}.autocomplete>ul>li{cursor:pointer;padding:.5rem 1rem}.autocomplete>ul>li.active,.autocomplete>ul>li:active,.autocomplete>ul>li:focus,.autocomplete>ul>li:hover{background-color:var(--color-autocomplete-background-hover)}.autocomplete>ul>li.active a:active,.autocomplete>ul>li:active a:active,.autocomplete>ul>li:focus a:active,.autocomplete>ul>li:hover a:active,.autocomplete>ul>li.active a:focus,.autocomplete>ul>li:active a:focus,.autocomplete>ul>li:focus a:focus,.autocomplete>ul>li:hover a:focus,.autocomplete>ul>li.active a:hover,.autocomplete>ul>li:active a:hover,.autocomplete>ul>li:focus a:hover,.autocomplete>ul>li:hover a:hover{text-decoration:none}.autocomplete>ul>li.locked{cursor:inherit}.autocomplete.open{display:block;background-color:var(--color-autocomplete-background);color:var(--color-autocomplete-font);max-height:32rem;overflow-y:auto;z-index:5000;margin-top:3.5rem;border-radius:.8rem}.autocomplete.open:empty{display:none}@media screen and (max-width: 50em){.autocomplete>ul>li{padding:1rem}}#main_results #results.image-detail-open.only_template_images{width:min(98%,59.25rem)!important}#main_results #results.only_template_images.image-detail-open #backToTop{right:56.75rem!important;left:inherit}article.result-images .detail{display:none}#results.image-detail-open article.result-images[data-vim-selected] .detail{display:flex;flex-direction:column;position:fixed;right:60rem;left:0;top:13rem;transition:top 64ms ease-in 0s;bottom:0;background:var(--color-result-detail-background);border:1px solid var(--color-result-detail-background);z-index:1000;padding:4rem 3rem 3rem;overflow-y:scroll}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source{display:block;flex:1;text-align:left;width:100%;border:none;text-decoration:none}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{padding:0;margin:0;border:none;object-fit:contain;width:inherit;height:inherit;max-width:100%;min-height:inherit;max-height:calc(100vh - 42rem);background:inherit}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels{color:var(--color-result-detail-font);height:19rem}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels hr{border-top:1px solid var(--color-result-detail-hr);border-bottom:none}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels h4{height:2rem;overflow:hidden;text-overflow:ellipsis;font-size:.9rem;margin-bottom:0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p{color:var(--color-result-detail-label-font);font-size:.9rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:.8rem 0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p span{display:inline-block;width:12rem}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels h4,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a{text-align:right}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-content{height:2rem;line-height:unset;overflow:hidden;text-overflow:ellipsis}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url{white-space:nowrap;overflow:hidden hidden;text-overflow:ellipsis}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-content:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url:hover{position:relative;overflow:inherit!important;background:var(--color-result-detail-background);text-overflow:inherit!important}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:active{color:var(--color-result-detail-link)}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:hover{text-decoration:underline}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close{top:1rem;right:1rem;padding:.4rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous{top:1rem;left:6rem;padding:.4rem .3rem .4rem .5rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next{top:1rem;left:2rem;padding:.4rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous{border-radius:50%;display:block;width:1.5rem;height:1.5rem;position:absolute;filter:opacity(40%);z-index:1200}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close span,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next span,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous span{display:block;width:1.5rem;height:1.5rem;text-align:center}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next span:before,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous span:before{vertical-align:sub}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:active,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:active,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:active{color:var(--color-result-detail-font);background:var(--color-result-detail-background);border:1px solid var(--color-result-detail-font)}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:hover{filter:opacity(80%)}#results.image-detail-open article.result-images[data-vim-selected] .detail .loader{position:absolute;top:1rem;left:50%;border-top:.5em solid var(--color-result-detail-loader-border);border-right:.5em solid var(--color-result-detail-loader-border);border-bottom:.5em solid var(--color-result-detail-loader-border);border-left:.5em solid var(--color-result-detail-loader-borderleft)}#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail{top:0}#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail a.result-images-source img{max-height:calc(100vh - 25rem)}@media screen and (max-width: 79.75em){#results.image-detail-open article.result-images[data-vim-selected] .detail{top:0;right:0}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source{display:flex;flex-direction:column;justify-content:center}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{width:100%;max-height:calc(100vh - 24rem)}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next{left:1rem}}@media screen and (max-width: 50em){#results.image-detail-open article.result-images[data-vim-selected] .detail{top:0;right:0;padding:1rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{width:100%;max-height:calc(100vh - 20rem);margin:0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p span{width:inherit;margin-left:1rem}}.dialog-modal{animation-name:dialogmodal;animation-duration:.13s}@keyframes dialogmodal{0%{opacity:0}50%{opacity:.5;transform:translate(-50%,-50%) scale(1.05)}}input.checkbox-onoff[type=checkbox]:before{transition:left .25s}iframe[src^="https://w.soundcloud.com"]{height:120px}iframe[src^="https://www.deezer.com"]{height:94px}iframe[src^="https://www.mixcloud.com"]{height:250px}iframe[src^="https://bandcamp.com/EmbeddedPlayer"]{height:350px}iframe[src^="https://bandcamp.com/EmbeddedPlayer/track"]{height:120px}iframe[src^="https://genius.com/songs"]{height:65px}.info-page code{font-family:monospace;border-radius:5px;background-color:var(--color-doc-code-background);color:var(--color-doc-code);padding:.2rem;border:0 none}.stats_endpoint .github-issue-button{display:block;font-size:16px}.stats_endpoint .issue-hide{display:none}.stats_endpoint input[type=checked]{position:absolute}.stats_endpoint label{margin:1rem 1rem 1rem 0}.stats_endpoint .step_content{margin:1rem 1rem 1rem 2rem}.stats_endpoint .step1,.stats_endpoint .step2{visibility:hidden}.stats_endpoint .step1_delay{transition:visibility 0s linear 4s}.stats_endpoint #step1:checked~.step1,.stats_endpoint #step2:checked~.step2{visibility:visible}.engine-stats{border-spacing:0;border-collapse:collapse}.engine-stats tr td,.engine-stats tr th{border-bottom:1px solid var(--color-result-border);padding:.25rem}.engine-stats table.engine-tooltip{border-spacing:0;border-collapse:collapse}.engine-stats table.engine-tooltip td,.engine-stats table.engine-tooltip th{border:none}.engine-stats .engine-name{width:20rem}.engine-stats .engine-score{width:7rem;text-align:right}.engine-stats .engine-reliability{text-align:right}table.engine-error th.engine-error-type,table.engine-error td.engine-error-type,failed-test{width:10rem}.engine-errors{margin-top:3rem}.engine-errors table.engine-error{max-width:1280px;margin:1rem 0 3rem;border:1px solid var(--color-result-border);text-align:right}.engine-errors table.engine-error tr th,.engine-errors table.engine-error tr td{padding:.5rem}.engine-errors table.engine-error span.log_parameters{border-right:1px solid solid var(--color-result-border);padding:0 1rem 0 0;margin:0 0 0 .5rem}.bar-chart-value{width:3em;display:inline-block;text-align:right;padding-right:.5rem}.bar-chart-graph{width:calc(100% - 5rem);display:inline-block}.bar-chart-bar{border:3px solid var(--color-bar-chart-primary);margin:1px 0}.bar-chart-serie1{border:3px solid var(--color-bar-chart-primary);margin:1px 0;float:left}.bar-chart-serie2{border:3px solid var(--color-bar-chart-secondary);margin:1px 0;float:left}.bar0{width:0;border:0}.bar1{width:1%}.bar2{width:2%}.bar3{width:3%}.bar4{width:4%}.bar5{width:5%}.bar6{width:6%}.bar7{width:7%}.bar8{width:8%}.bar9{width:9%}.bar10{width:10%}.bar11{width:11%}.bar12{width:12%}.bar13{width:13%}.bar14{width:14%}.bar15{width:15%}.bar16{width:16%}.bar17{width:17%}.bar18{width:18%}.bar19{width:19%}.bar20{width:20%}.bar21{width:21%}.bar22{width:22%}.bar23{width:23%}.bar24{width:24%}.bar25{width:25%}.bar26{width:26%}.bar27{width:27%}.bar28{width:28%}.bar29{width:29%}.bar30{width:30%}.bar31{width:31%}.bar32{width:32%}.bar33{width:33%}.bar34{width:34%}.bar35{width:35%}.bar36{width:36%}.bar37{width:37%}.bar38{width:38%}.bar39{width:39%}.bar40{width:40%}.bar41{width:41%}.bar42{width:42%}.bar43{width:43%}.bar44{width:44%}.bar45{width:45%}.bar46{width:46%}.bar47{width:47%}.bar48{width:48%}.bar49{width:49%}.bar50{width:50%}.bar51{width:51%}.bar52{width:52%}.bar53{width:53%}.bar54{width:54%}.bar55{width:55%}.bar56{width:56%}.bar57{width:57%}.bar58{width:58%}.bar59{width:59%}.bar60{width:60%}.bar61{width:61%}.bar62{width:62%}.bar63{width:63%}.bar64{width:64%}.bar65{width:65%}.bar66{width:66%}.bar67{width:67%}.bar68{width:68%}.bar69{width:69%}.bar70{width:70%}.bar71{width:71%}.bar72{width:72%}.bar73{width:73%}.bar74{width:74%}.bar75{width:75%}.bar76{width:76%}.bar77{width:77%}.bar78{width:78%}.bar79{width:79%}.bar80{width:80%}.bar81{width:81%}.bar82{width:82%}.bar83{width:83%}.bar84{width:84%}.bar85{width:85%}.bar86{width:86%}.bar87{width:87%}.bar88{width:88%}.bar89{width:89%}.bar90{width:90%}.bar91{width:91%}.bar92{width:92%}.bar93{width:93%}.bar94{width:94%}.bar95{width:95%}.bar96{width:96%}.bar97{width:97%}.bar98{width:98%}.bar99{width:99%}.bar100{width:100%}.osm-map-box{height:300px;width:100%;margin:10px 0}#main_index{margin-top:26vh}.index{text-align:center}.index .title{background:url(../img/searxng.png) no-repeat;min-height:4rem;margin:4rem auto;background-position:center;background-size:contain}.index h1{font-size:4em;visibility:hidden}.index #search,.index #search_header{margin:0 auto;background:inherit;border:inherit;padding:0;display:block}.index .search_filters{display:block;margin:1em 0}.index .category label{padding:6px 10px;border-bottom:initial!important}@media screen and (max-width: 79.75em){div.title h1{font-size:1em}#main_index{margin-top:6em}}table{border-collapse:collapse}table th,table td{text-align:center;padding:1rem .5rem;text-align:right}table tr.pref-group th{font-weight:400;text-align:right;background:var(--color-settings-table-group-background)}#main_preferences form{width:100%}#main_preferences fieldset{margin:8px;border:none}#main_preferences legend{margin:0;padding:5px 0 0;display:block;float:right;width:300px}#main_preferences input[type=text]{width:13.25rem;color:var(--color-toolkit-input-text-font);border:none;background:none repeat scroll 0 0 var(--color-toolkit-select-background);padding:.2rem .4rem;height:2rem;border-radius:5px}#main_preferences input[type=text]:hover,#main_preferences input[type=text]:focus{background-color:var(--color-toolkit-select-background-hover)}#main_preferences div.pref-group{width:100%;font-weight:400;padding:1rem .5rem;text-align:right;background:var(--color-settings-table-group-background)}#main_preferences .value{margin:0;padding:0;float:right;width:15em}#main_preferences .value select,#main_preferences .value input[type=text]{font-size:inherit!important;margin-top:0;margin-left:1rem;margin-bottom:0;margin-right:0}#main_preferences .value select{width:14rem}#main_preferences .value select:focus,#main_preferences .value input:focus{outline:none;box-shadow:0 0 1px 1px var(--color-btn-background)}#main_preferences .description{margin:0;padding:5px 0 0;float:left;width:50%;color:var(--color-settings-engine-description-font);font-size:90%}#main_preferences .bang{text-align:right;border-radius:5px;background-color:var(--color-doc-code-background);color:var(--color-doc-code);padding:.2rem;border:0 none}#main_preferences .category{margin-left:.5rem}#main_preferences .category label{border:2px solid transparent;padding:.2rem .4rem;border-radius:5px}#main_preferences .category input[type=checkbox]:checked+label{border:2px solid var(--color-categories-item-border-selected)}#main_preferences table.table_engines th.name label{cursor:pointer}#main_preferences table.table_engines th.name .engine-tooltip{margin-top:1.8rem;right:calc((100% - 85em)/2 + 10em);max-width:40rem}#main_preferences table.table_engines th.name .engine-tooltip .engine-description{margin-top:.5rem}#main_preferences table.table_engines th.name .engine-tooltip .bang{margin:.3rem}#main_preferences table.table_engines .checkbox-col,#main_preferences table.table_engines .name,#main_preferences table.table_engines .shortcut{text-align:right}#main_preferences table.cookies{width:100%;direction:ltr}#main_preferences table.cookies th,#main_preferences table.cookies td{text-align:left;font-family:monospace;font-size:1rem;padding:.5em;vertical-align:top}#main_preferences table.cookies td:first-child{word-break:keep-all;width:14rem;padding-right:1rem}#main_preferences table.cookies td:last-child{word-break:break-all}#main_preferences table.cookies>tbody>tr:nth-child(2n)>th,#main_preferences table.cookies>tbody>tr:nth-child(2n)>td{background-color:var(--color-settings-tr-hover)}#main_preferences .preferences_back{background:none repeat scroll 0 0 var(--color-btn-background);color:var(--color-btn-font);border:0 none;border-radius:10px;cursor:pointer;display:inline-block;margin:2px 4px;padding:.7em}#main_preferences .preferences_back a{color:var(--color-settings-return-font)}#main_preferences .preferences_back a:first-letter{text-transform:uppercase}#main_preferences #toggle-all-engines-container{width:max-content;margin-left:auto}#main_preferences div.selectable_url pre{width:100%}#main_preferences #copy-hash-container{display:flex;align-items:center;gap:.5rem}#main_preferences #copy-hash-container div.selectable_url pre{width:auto;flex-grow:1}#main_preferences #pref-hash-input{width:100%}@media screen and (max-width: 79.75em){.preferences_back{clear:both}.engine-tooltip{right:10em!important}}#search{padding:0;margin:0}#search_header{padding-top:1.5em;padding-left:2em;padding-right:7rem;margin:0;background:var(--color-header-background);border-bottom:1px solid var(--color-header-border);display:grid;gap:1rem 1.2rem;grid-template-columns:3rem 1fr;grid-template-areas:"logo search" "spacer categories"}.category_checkbox,.category_button{display:inline-block;position:relative;margin-left:1rem;padding:0}.category_checkbox input{display:none}.category_checkbox label{cursor:pointer;padding:.2rem 0;display:inline-flex;text-transform:capitalize;font-size:.9em;border-bottom:2px solid transparent;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.category_checkbox label svg{padding-right:.2rem}.category_checkbox label div.category_name{margin:auto 0}.category_checkbox input[type=checkbox]:checked+label{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}button.category_button{background-color:inherit;color:var(--color-base-font);cursor:pointer;padding:.2rem 0;display:inline-flex;align-items:center;text-transform:capitalize;font-size:.9em;border:none;border-bottom:2px solid transparent}button.category_button svg{padding-right:.2rem}button.category_button.selected,button.category_button:active{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}.no-js #categories_container:has(button.category_button:focus-within) button.category_button.selected{color:var(--color-base-font);border-bottom:none}.no-js #categories_container:has(button.category_button:focus-within) button.category_button:focus-within{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}#search_logo{padding:.5rem 10px 0;grid-area:logo;display:flex;align-items:center;justify-content:center}#search_logo svg{flex:1;width:30px;height:30px;margin:.5rem 0 auto}.search_categories{grid-area:categories}.search_categories .help{display:none}.search_categories:hover .help{display:block;position:absolute;background:var(--color-base-background);padding:1rem .6rem .6rem 0;z-index:1000;width:100%;left:-.1rem}#search_view{padding:.5rem .5rem 0;grid-area:search}body.results_endpoint #search_view{padding:.5rem 2.8rem 0 0}.search_box{border-radius:.8rem;width:100%;max-width:44rem;display:inline-flex;flex-direction:row;white-space:nowrap;box-shadow:var(--color-search-shadow)}#clear_search{display:block;border-collapse:separate;box-sizing:border-box;width:1.8rem;margin:0;padding:.8rem .2rem;background:none repeat scroll 0 0 var(--color-search-background);border:none;outline:none;color:var(--color-search-font);font-size:1.1rem;z-index:1000}#clear_search:hover{color:var(--color-search-background-hover)}#clear_search.empty *,html.no-js #clear_search.hide_if_nojs{display:none}#q,#send_search{display:block;margin:0;padding:.8rem;background:none repeat scroll 0 0 var(--color-search-background);border:none;outline:none;color:var(--color-search-font);font-size:1.1rem;z-index:100}#q{width:100%;padding-right:1rem;padding-left:0!important;border-radius:0 .8rem .8rem 0}#q::-ms-clear,#q::-webkit-search-cancel-button{display:none}#send_search{border-radius:.8rem 0 0 .8rem}#send_search:hover{cursor:pointer;background-color:var(--color-search-background-hover);color:var(--color-search-background)}.no-js #clear_search,.no-js #send_search{width:auto!important;border-right:1px solid var(--color-search-border)}.search_filters{margin-top:.6rem;margin-left:0;margin-bottom:0;margin-right:10.6rem;display:flex;overflow-x:auto;overscroll-behavior-inline:contain}.search_filters select{background-color:inherit}.search_filters select:hover,.search_filters select:focus{color:var(--color-base-font)}@media screen and (max-width: 79.75em){#search_header{padding:1.5em .5rem 0;column-gap:.5rem}.search_filters{margin-top:.6rem;margin-left:0;margin-bottom:0;margin-right:3.5rem}#categories{font-size:90%;clear:both}}@media screen and (max-width: 79.75em) and (hover: none){#main_index #categories_container,#main_results #categories_container{width:max-content}#main_index #categories_container .category_checkbox,#main_results #categories_container .category_checkbox{display:inline-block;width:auto}#main_index #categories,#main_results #categories{width:100%;text-align:right;overflow:scroll hidden;-webkit-overflow-scrolling:touch}}@media screen and (max-width: 50em){#search_header{width:100%;margin:0;padding:.1rem 0 0;gap:0 0;grid-template-areas:"logo search" "categories categories"}.search_logo{padding:0}.search_box{width:100%}#q{width:100%;flex:1}.search_filters{margin:0 10px;padding:.5rem 0}.category{display:inline-block;width:auto;margin:0}.category svg{display:none}.category_checkbox label,.category_button{padding:1rem!important;margin:0!important}#search_view:focus-within{display:block;background-color:var(--color-search-background);position:absolute;top:0;height:100%;width:100%;z-index:2000}#search_view:focus-within .search_box{border-bottom:1px solid var(--color-search-border);width:100%;border-radius:0;box-shadow:none}#search_view:focus-within .search_box #send_search{margin-left:0!important}#search_view:focus-within .search_box *{border:none;border-radius:0;box-shadow:none}#main_results #q:placeholder-shown~#send_search{margin-left:2.6rem;transition:margin .1s}}@media screen and (max-width: 20rem){#search_header{grid-template-areas:"search search" "categories categories"}#search_logo{display:none}}#categories{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}#categories::-webkit-scrollbar{width:0;height:0}#categories_container{position:relative}.favicon img{height:1.5rem;width:1.5rem;border-radius:10%;background-color:var(--color-favicon-background-color);border:1px solid var(--color-favicon-border-color);display:flex}@media screen and (min-width: 50em){.center-alignment-yes #main_results{--center-page-width: 48rem}}@media screen and (width >= 62rem){.center-alignment-yes #main_results{--center-page-width: 60rem}}@media screen and (min-width: 79.75em){.center-alignment-yes #main_results{--center-page-width: 73rem}}@media screen and (min-width: 50em) and (max-width: 79.75em){.center-alignment-yes #main_results #results{grid-template-columns:60% calc(40% - 5rem);margin-left:0;margin-right:0}.center-alignment-yes #main_results #urls{margin-right:3rem}.center-alignment-yes #main_results #sidebar{margin-left:1rem}.center-alignment-yes #main_results #backToTop{right:calc(60% + 1rem)}}@media screen and (min-width: 79.75em){.center-alignment-yes #main_results{display:flex;flex-direction:column;align-items:center}.center-alignment-yes #main_results #search{width:100%;display:flex;flex-direction:column;align-items:center}.center-alignment-yes #main_results #search_header{grid-template-columns:calc(50% - 4.5rem - var(--center-page-width) / 2) 3rem var(--center-page-width);grid-template-areas:"na logo search" "na spacer categories";column-gap:1.2rem;width:100%;padding-left:0;padding-right:0}.center-alignment-yes #main_results .search_filters{margin-right:.5rem;width:var(--center-page-width)}.center-alignment-yes #main_results #results{margin-left:2rem;margin-right:10rem}.center-alignment-yes #main_results #results.only_template_images,.center-alignment-yes #main_results #results.image-detail-open{align-self:flex-start}.center-alignment-yes #main_results #results:not(.only_template_images,.image-detail-open){margin-right:1.5rem;grid-template-columns:calc(var(--center-page-width) - 5rem - 25rem) 25rem}.center-alignment-yes #main_results #results:not(.only_template_images,.image-detail-open) #backToTop{right:calc(50% - 25rem - 5rem + 1rem + var(--center-page-width) / 2)}.center-alignment-yes #main_results #results .result .content{max-width:inherit}.center-alignment-yes #main_results #urls{margin-right:0}.center-alignment-yes #main_results #sidebar{margin-left:0}}.sxng-icon-set{display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scaleX(-1)}.sxng-icon-set-small{width:1rem;height:1rem;display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scaleX(-1)}.sxng-icon-set-big{width:1.5rem;height:1.5rem;display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scaleX(-1)}html{font-family:sans-serif;font-size:.9em;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:var(--color-base-font);background-color:var(--color-base-background);padding:0;margin:0;scroll-behavior:smooth}body,main{padding:0;margin:0}body{display:flex;flex-direction:column;height:100vh;margin:0}@supports (height: 100dvh){body{height:100dvh}}main{width:100%;margin-bottom:2rem;flex:1}.page_with_header{margin:2em auto;width:85em}footer{clear:both;min-height:4rem;padding:1rem 0;width:100%;text-align:center;background-color:var(--color-footer-background);border-top:1px solid var(--color-footer-border);overflow:hidden}footer p{font-size:.9em}.page_with_header .logo{height:40px}input[type=submit],#results button[type=submit],.button{padding:.7rem;display:inline-block;background:var(--color-btn-background);color:var(--color-btn-font);border-radius:10px;border:0;cursor:pointer}a{text-decoration:none;color:var(--color-url-font)}a:visited,a:visited .highlight{color:var(--color-url-visited-font)}article[data-vim-selected]{background:var(--color-result-vim-selected);border-right:.2rem solid var(--color-result-vim-arrow);border-radius:10px 0 0 10px}article.result-images[data-vim-selected]{background:var(--color-result-vim-arrow);border:none;border-radius:10px}article.result-images[data-vim-selected] .image_thumbnail{filter:opacity(60%)}article.result-images[data-vim-selected] span.title,article.result-images[data-vim-selected] span.source{color:var(--color-result-image-span-font-selected)}article[data-vim-selected].category-videos,article[data-vim-selected].category-news,article[data-vim-selected].category-map,article[data-vim-selected].category-music,article[data-vim-selected].category-files,article[data-vim-selected].category-social{border:1px solid var(--color-result-vim-arrow);border-radius:10px}.result{margin:.125rem 0;padding:1rem;box-sizing:border-box;width:100%;border-right:.2rem solid transparent}.result h3{font-size:1.2rem;word-wrap:break-word;margin:.4rem 0;padding:0}.result h3 a{color:var(--color-result-link-font);font-weight:400;font-size:1.1em}.result h3 a:visited{color:var(--color-result-link-visited-font)}.result h3 a:focus,.result h3 a:hover{text-decoration:underline;border:none;outline:none}.result .cache_link,.result .proxyfied_link{font-size:smaller!important;margin-left:.5rem}.result .content,.result .stat{font-size:.9em;margin:0;padding:0;max-width:54em;word-wrap:break-word;line-height:1.24}.result .content .highlight,.result .stat .highlight{color:var(--color-result-description-highlight-font);background:inherit;font-weight:700}.result .altlink a{font-size:.9em;margin:0 10px 0 0;padding:5px 10px;border-radius:5px;background:var(--color-show-btn-background);color:var(--color-show-btn-font);cursor:pointer}.result .altlink a:hover{background:var(--color-btn-background);color:var(--color-btn-font)}.result .codelines .highlight{color:inherit;background:inherit;font-weight:400}.result .url_header{display:flex;gap:.5rem}.result .url_wrapper{display:flex;align-items:center;font-size:1rem;color:var(--color-result-url-font);flex-flow:row nowrap;overflow:hidden;margin:0;padding:0}.result .url_wrapper .url_o1{white-space:nowrap;flex-shrink:1;padding-bottom:1px}.result .url_wrapper .url_o1 .url_i1{unicode-bidi:plaintext}.result .url_wrapper .url_o1:after{content:" ";width:1ch;display:inline-block}.result .url_wrapper .url_o2{overflow:hidden;white-space:nowrap;flex:0 1 content;text-align:right;padding-bottom:1px}.result .url_wrapper .url_o2 .url_i2{float:right}.result .published_date,.result .result_length,.result .result_views,.result .result_author,.result .result_shipping,.result .result_source_country{font-size:.8em;color:var(--color-result-publishdate-font)}.result .result_price{font-size:1.2em;color:var(--color-result-description-highlight-font)}.result img.thumbnail{float:right;padding-top:.6rem;padding-left:1rem;width:7rem;height:unset}.result .break{clear:both}.result-paper .attributes,.result-packages .attributes{display:table;border-spacing:.125rem}.result-paper .attributes div,.result-packages .attributes div{display:table-row}.result-paper .attributes div span,.result-packages .attributes div span{font-size:.9rem;margin-top:.25rem;display:table-cell}.result-paper .attributes div span time,.result-packages .attributes div span time{font-size:.9rem}.result-paper .attributes div span:first-child,.result-packages .attributes div span:first-child{color:var(--color-base-font);min-width:10rem}.result-paper .attributes div span:nth-child(2),.result-packages .attributes div span:nth-child(2){color:var(--color-result-publishdate-font)}.result-paper .content,.result-packages .content{margin-top:.25rem}.result-paper .comments,.result-packages .comments{font-size:.9rem;margin:.25rem 0 0;padding:0;word-wrap:break-word;line-height:1.24;font-style:italic}.result-packages .attributes{margin-top:.3rem}.template_group_images{display:flex;flex-wrap:wrap}.template_group_images:after{flex-grow:10;content:""}.category-videos,.category-news,.category-map,.category-music,.category-files,.category-social{border:1px solid var(--color-result-border);margin:0 .5rem 1rem!important;border-radius:10px}.category-social .image{width:auto!important;min-width:48px;min-height:48px;padding:0 5px 25px 0!important}.audio-control audio{width:100%;padding:10px 0 0}.embedded-content iframe{width:100%;padding:10px 0 0}.result-videos img.thumbnail{float:right;padding-top:.6rem;padding-left:1rem;width:20rem;height:unset}.result-videos .content{overflow:hidden}.result-videos .embedded-video iframe{width:100%;aspect-ratio:16 / 9;padding:10px 0 0}@supports not (aspect-ratio: 1 / 1){.result-videos .embedded-video iframe{height:25.3125rem}}.engines{float:left;display:flex;flex-wrap:wrap;justify-content:flex-end;color:var(--color-result-engines-font)}.engines span{font-size:smaller;margin-top:0;margin-bottom:0;margin-left:.5rem;margin-right:0}.small_font{font-size:.8em}.highlight{color:var(--color-result-link-font-highlight);background:inherit}.empty_element{font-style:italic}.result-images{flex-grow:1;padding:.5rem .5rem 3rem;margin:.25rem;border:none!important;height:12rem;width:unset}.result-images>a{position:relative;outline:none}.result-images img{margin:0;padding:0;border:none;height:100%;width:auto;object-fit:cover;vertical-align:bottom;background:var(--color-result-image-background)}.result-images .image_resolution{position:absolute;right:0;bottom:0;background:var(--color-image-resolution-background);padding:.3rem .5rem;font-size:.9rem;color:var(--color-image-resolution-font);border-top-left-radius:.3rem}.result-images span.title,.result-images span.source{display:block;position:absolute;width:100%;font-size:.9rem;color:var(--color-result-image-span-font);padding:.5rem 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.result-images span.source{padding:1.8rem 0 0;font-size:.7rem}.result-map img.image{float:left!important;height:100px!important;width:auto!important}.result-map table{font-size:.9em;width:auto;border-collapse:separate;border-spacing:0 .35rem}.result-map table th{font-weight:inherit;width:17rem;vertical-align:top;text-align:right}.result-map table td{vertical-align:top;text-align:right}.hidden{display:none!important}#results{margin-top:1rem;margin-left:2rem;margin-bottom:0;margin-right:10rem;display:grid;grid-template:"corrections sidebar" min-content "answers sidebar" min-content "urls sidebar" 1fr "pagination sidebar" min-content / 45rem 25rem;gap:0 5rem}#results #sidebar *:first-child{margin-top:0}#urls{padding:0;grid-area:urls}#apis .wrapper{display:flex}#suggestions .wrapper{display:flex;flex-flow:column;justify-content:flex-end}#suggestions .wrapper form{display:inline-block;flex:1 1 50%}#suggestions input,#infoboxes input{padding:0;margin:3px;font-size:.9em;display:inline-block;background:transparent;color:var(--color-result-search-url-font);cursor:pointer;width:100%;text-overflow:ellipsis;overflow:hidden;text-align:left}#suggestions input[type=submit],#infoboxes input[type=submit],#suggestions .infobox .url a,#infoboxes .infobox .url a{color:var(--color-result-link-font);text-decoration:none;font-size:.9rem}#suggestions input[type=submit]:hover,#infoboxes input[type=submit]:hover,#suggestions .infobox .url a:hover,#infoboxes .infobox .url a:hover{text-decoration:underline}#corrections{grid-area:corrections;display:flex;flex-flow:row wrap;margin:0 0 1em}#corrections h4,#corrections input[type=submit]{display:inline-block;padding:.5rem;margin:.5rem}#corrections input[type=submit]{font-size:.8rem;border-radius:5px}#infoboxes .title,#suggestions .title,#search_url .title,#engines_msg .title,#apis .title{margin:2em 0 .5em;color:var(--color-base-font)}summary.title{cursor:pointer;padding-top:1em}.sidebar-collapsible{border-top:1px solid var(--color-sidebar-border);padding-bottom:.5em}#sidebar-end-collapsible{border-bottom:1px solid var(--color-sidebar-border);width:100%}#answers{grid-area:answers;background:var(--color-answer-background);padding:1rem;margin:1rem 0;margin-top:0;color:var(--color-answer-font);border-radius:10px}#answers h4{display:none}#answers span{overflow-wrap:anywhere}#answers .answer{display:flex;flex-direction:column}#answers .answer-url{margin:5px 10px 10px auto}#infoboxes form{min-width:210px}#sidebar{grid-area:sidebar;word-wrap:break-word;color:var(--color-sidebar-font)}#sidebar .infobox{margin:10px 0;border:1px solid var(--color-sidebar-border);padding:1rem;font-size:.9em;border-radius:10px}#sidebar .infobox h2{margin:0 0 .5em}#sidebar .infobox img{max-width:100%;max-height:12em;display:block;margin:0 auto;padding:0}#sidebar .infobox dt{font-weight:700}#sidebar .infobox .attributes dl{margin:.5em 0}#sidebar .infobox .attributes dt{display:inline;margin:.5em 0 .5em .25em;padding:0}#sidebar .infobox .attributes dd{display:inline;margin:.5em 0;padding:0}#sidebar .infobox input{font-size:1em}#sidebar .infobox br,#sidebar .infobox .attributes,#sidebar .infobox .urls{clear:both}#apis input{font-size:.9em;margin:0 10px 0 0;padding:5px 10px;border-radius:5px;background:var(--color-show-btn-background);color:var(--color-show-btn-font);cursor:pointer}#apis input:hover{background:var(--color-btn-background);color:var(--color-btn-font)}#engines_msg .engine-name{width:10rem}#engines_msg .response-error{color:var(--color-error)}#engines_msg .bar-chart-value{width:auto}#search_url div.selectable_url pre{float:left;width:200em}#search_url button#copy_url{float:right;padding:.4rem;margin-left:.5rem;border-radius:.3rem;display:none}#links_on_top{position:absolute;left:1rem;text-align:left;top:2.7rem;padding:0;border:0;display:flex;align-items:center;font-size:1em;color:var(--color-search-font)}#links_on_top a{display:flex;align-items:center;margin-left:1em}#links_on_top a svg{font-size:1.2em;margin-left:.125em}#links_on_top a,#links_on_top a:link *,#links_on_top a:hover *,#links_on_top a:visited *,#links_on_top a:active *{color:var(--color-search-font)}#pagination{grid-area:pagination}#pagination br{clear:both}.numbered_pagination{display:flex;flex-direction:row;justify-content:center;align-items:center;overflow:hidden}.page_number{background:transparent!important;color:var(--color-result-link-font)!important;text-decoration:underline}.page_number_current{background:transparent;color:var(--color-result-link-visited-font);border:none}#backToTop{border:1px solid var(--color-backtotop-border);margin:0;padding:0;font-size:1em;background:var(--color-backtotop-background);position:fixed;bottom:8rem;right:56.3rem;transition:opacity .5s;opacity:0;pointer-events:none;border-radius:10px}#backToTop a{display:block;margin:0;padding:.7em}#backToTop a,#backToTop a:visited,#backToTop a:hover,#backToTop a:active{color:var(--color-backtotop-font)}#results.scrolling #backToTop{opacity:1;pointer-events:all}@media screen and (width <= calc(79.75em - .5px)){#links_on_top span{display:none}}@media screen and (width <= 52rem){body.results_endpoint #links_on_top .link_on_top_about,body.results_endpoint #links_on_top .link_on_top_donate{display:none}}@media screen and (min-width: 50em) and (max-width: 79.75em){.center-alignment-no #links_on_top span{display:none}.center-alignment-no .page_with_header{margin:2rem .5rem;width:auto}.center-alignment-no #infoboxes{position:inherit;max-width:inherit}.center-alignment-no #infoboxes .infobox{clear:both}.center-alignment-no #infoboxes .infobox img{float:right;max-width:10em;margin:.5em 0 .5em .5em}.center-alignment-no #sidebar{margin:0 .5rem .125rem;padding:0;float:none;border:none;width:auto}.center-alignment-no #sidebar input{border:0}.center-alignment-no .result .thumbnail{max-width:98%}.center-alignment-no .result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.center-alignment-no .result .engines{float:left;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:3px 0 0}.center-alignment-no .result-images{border-bottom:none!important}.center-alignment-no .image_result,.center-alignment-no .image_result img{max-width:98%}.center-alignment-no #backToTop{display:none}.center-alignment-no #pagination{margin:2rem 0 0!important}.center-alignment-no #main_results div#results{margin:0 auto;justify-content:center;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 45rem;gap:0}}#main_results div#results.only_template_images{margin:1rem .5rem 0;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 100%;gap:0}#main_results div#results.only_template_images #sidebar{display:none}#main_results div#results.only_template_images #urls{margin:0;display:flex;flex-wrap:wrap}#main_results div#results.only_template_images #urls:after{flex-grow:10;content:""}#main_results div#results.only_template_images #backToTop{right:auto;left:1rem}#main_results div#results.only_template_images #pagination{margin-left:4rem}@media screen and (max-width: 50em){#links_on_top span{display:none}.page_with_header{margin:2rem .5rem;width:auto}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:right;max-width:10em;margin:.5em 0 .5em .5em}#sidebar{margin:0 .5rem .125rem;padding:0;float:none;border:none;width:auto}#sidebar input{border:0}.result .thumbnail{max-width:98%}.result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.result .engines{float:left;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:3px 0 0}.result-images{border-bottom:none!important}.image_result,.image_result img{max-width:98%}#backToTop{display:none}#pagination{margin:2rem 0 0!important}#main_results div#results{margin:0 auto;justify-content:center;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 45rem;gap:0}html{background-color:var(--color-base-background-mobile)}#main_results div#results{grid-template-columns:100%;margin:0 auto}#links_on_top{top:1.4rem;left:10px}#main_index #links_on_top{top:.5rem;left:.5rem}#results{margin:0;padding:0}#pagination{margin:2rem 1rem 0!important}article[data-vim-selected]{border:1px solid var(--color-result-vim-arrow);border-radius:10px}.result{background:var(--color-result-background);border:1px solid var(--color-result-background);margin:1rem 2%;width:96%;border-radius:10px}.result-images{margin:0;height:10rem;background:var(--color-base-background-mobile);width:unset}.infobox{border:none!important;background-color:var(--color-sidebar-background)}.numbered_pagination{display:none}.result-paper .attributes,.result-packages .attributes,.result-paper .attributes div,.result-packages .attributes div{display:block}.result-paper .attributes div span,.result-packages .attributes div span{display:inline}.result-paper .attributes div span:first-child,.result-packages .attributes div span:first-child{font-weight:700}.result-paper .attributes div span:nth-child(2),.result-packages .attributes div span:nth-child(2){margin-right:.5rem}}@media screen and (max-width: 35em){.result-videos img.thumbnail{float:none!important}.result-videos .content{overflow:inherit}}pre code{white-space:pre-wrap}#main_results .result-keyvalue caption{padding:.8rem .5rem;font-style:italic;caption-side:bottom;background-color:var(--color-result-keyvalue-table)}#main_results .result-keyvalue .col-key{width:25%}#main_results .result-keyvalue table{word-break:break-word;table-layout:fixed;width:100%;background-color:var(--color-result-keyvalue-table)}#main_results .result-keyvalue tr.odd{background-color:var(--color-result-keyvalue-odd)}#main_results .result-keyvalue tr.even{background-color:var(--color-result-keyvalue-even)}#main_results .result-keyvalue th,#main_results .result-keyvalue td{padding:.3rem .5rem}#q,#sidebar .infobox dt bdi{direction:rtl}#urls{direction:initial;text-align:right}#urls .result .url_header{direction:rtl}#urls .result .url_wrapper{justify-content:end}#main_results div#results.only_template_images #urls{direction:rtl}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p{direction:rtl}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url{direction:ltr}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url span{direction:rtl;float:right}@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))){select{border-width:0 0 0 2rem;background-position-x:-2rem}}#vim-hotkeys-help table{direction:ltr;text-align:left}#main_preferences h1,#main_stats h1{background-position-x:100%}.bar-chart-serie1,.bar-chart-serie2{float:right}.engine-stats .engine-name,.engine-stats .engine-score,.engine-stats .result-count,.engine-stats .response-time,.engine-stats .engine-reliability{text-align:right} diff --git a/searx/static/themes/simple/css/searxng.min.css b/searx/static/themes/simple/css/searxng.min.css index 3721b0120..6ca440aad 100644 --- a/searx/static/themes/simple/css/searxng.min.css +++ b/searx/static/themes/simple/css/searxng.min.css @@ -1 +1 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}:root{--color-base-font: #444;--color-base-font-rgb: 68, 68, 68;--color-base-background: #fff;--color-base-background-mobile: #f2f5f8;--color-url-font: #334999;--color-url-visited-font: #9822c3;--color-header-background: #fdfbff;--color-header-border: #ddd;--color-footer-background: #fdfbff;--color-footer-border: #ddd;--color-sidebar-border: #ddd;--color-sidebar-font: #000;--color-sidebar-background: #fff;--color-backtotop-font: #444;--color-backtotop-border: #ddd;--color-backtotop-background: #fff;--color-btn-background: #3050ff;--color-btn-font: #fff;--color-show-btn-background: #bbb;--color-show-btn-font: #000;--color-search-border: #bbb;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #fff;--color-search-font: #222;--color-search-background-hover: #3050ff;--color-error: #db3434;--color-error-background: #fae1e1;--color-warning: #dbba34;--color-warning-background: #faf5e1;--color-success: #42db34;--color-success-background: #e3fae1;--color-categories-item-selected-font: #3050ff;--color-categories-item-border-selected: #3050ff;--color-autocomplete-font: #000;--color-autocomplete-border: #bbb;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #fff;--color-autocomplete-background-hover: #e3e3e3;--color-answer-font: #444;--color-answer-background: #fff;--color-result-keyvalue-col-table: #fdfbff;--color-result-keyvalue-odd: #fdfbff;--color-result-keyvalue-even: #fff;--color-result-background: #fff;--color-result-border: #ddd;--color-result-url-font: #000;--color-result-vim-selected: #f7f7f7;--color-result-vim-arrow: #000bbb;--color-result-description-highlight-font: #000;--color-result-link-font: #000bbb;--color-result-link-font-highlight: #000bbb;--color-result-link-visited-font: #9822c3;--color-result-publishdate-font: #777;--color-result-engines-font: #545454;--color-result-search-url-border: #ddd;--color-result-search-url-font: #000;--color-result-image-span-font: #444;--color-result-image-span-font-selected: #fff;--color-result-image-background: #fff;--color-settings-tr-hover: #ebebeb;--color-settings-engine-description-font: #545454;--color-settings-table-group-background: #0001;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #242424;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #545454;--color-toolkit-kbd-font: #fff;--color-toolkit-kbd-background: #000;--color-toolkit-dialog-border: #ddd;--color-toolkit-dialog-background: #fff;--color-toolkit-tabs-label-border: #fff;--color-toolkit-tabs-section-border: #ddd;--color-toolkit-select-background: #e1e1e1;--color-toolkit-select-border: #ddd;--color-toolkit-select-background-hover: #bbb;--color-toolkit-input-text-font: #222;--color-toolkit-checkbox-onoff-off-background: #ddd;--color-toolkit-checkbox-onoff-on-background: #ddd;--color-toolkit-checkbox-onoff-on-mark-background: #3050ff;--color-toolkit-checkbox-onoff-on-mark-color: #fff;--color-toolkit-checkbox-onoff-off-mark-background: #aaa;--color-toolkit-checkbox-onoff-off-mark-color: #fff;--color-toolkit-checkbox-label-background: #ddd;--color-toolkit-checkbox-label-border: #ddd;--color-toolkit-checkbox-input-border: #3050ff;--color-toolkit-engine-tooltip-border: #ddd;--color-toolkit-engine-tooltip-background: #fff;--color-toolkit-loader-border: rgba(0, 0, 0, .2);--color-toolkit-loader-borderleft: rgba(255, 255, 255, 0);--color-doc-code: #003;--color-doc-code-background: #ddeaff;--color-bar-chart-primary: #5bc0de;--color-bar-chart-secondary: #deb15b;--color-image-resolution-background: rgba(0, 0, 0, .5);--color-image-resolution-font: #fff;--color-loading-indicator: rgba(255, 255, 255, .2);--color-loading-indicator-gap: #fff;--color-line-number: #64708d;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}@media (prefers-color-scheme: dark){:root.theme-auto{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}}:root.theme-dark{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}:root.theme-black{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc;--color-base-background: #000;--color-base-background-mobile: #000;--color-header-background: #000;--color-footer-background: #000;--color-sidebar-background: #000}.code-highlight pre{line-height:100%}.code-highlight td.linenos .normal,.code-highlight span.linenos{color:inherit;background-color:transparent;padding-left:5px;padding-right:5px}.code-highlight td.linenos .special,.code-highlight span.linenos.special{color:#000;background-color:#ffffc0;padding-left:5px;padding-right:5px}.code-highlight .hll{background-color:#ffc}.code-highlight .c{color:#3d7b7b;font-style:italic}.code-highlight .err{border:1px solid #F00}.code-highlight .k{color:green;font-weight:700}.code-highlight .o{color:#666}.code-highlight .ch,.code-highlight .cm{color:#3d7b7b;font-style:italic}.code-highlight .cp{color:#9c6500}.code-highlight .cpf,.code-highlight .c1,.code-highlight .cs{color:#3d7b7b;font-style:italic}.code-highlight .gd{color:#a00000}.code-highlight .ge{font-style:italic}.code-highlight .ges{font-weight:700;font-style:italic}.code-highlight .gr{color:#e40000}.code-highlight .gh{color:navy;font-weight:700}.code-highlight .gi{color:#008400}.code-highlight .go{color:#717171}.code-highlight .gp{color:navy;font-weight:700}.code-highlight .gs{font-weight:700}.code-highlight .gu{color:purple;font-weight:700}.code-highlight .gt{color:#04d}.code-highlight .kc,.code-highlight .kd,.code-highlight .kn{color:green;font-weight:700}.code-highlight .kp{color:green}.code-highlight .kr{color:green;font-weight:700}.code-highlight .kt{color:#b00040}.code-highlight .m{color:#666}.code-highlight .s{color:#ba2121}.code-highlight .na{color:#687822}.code-highlight .nb{color:green}.code-highlight .nc{color:#00f;font-weight:700}.code-highlight .no{color:#800}.code-highlight .nd{color:#a2f}.code-highlight .ni{color:#717171;font-weight:700}.code-highlight .ne{color:#cb3f38;font-weight:700}.code-highlight .nf{color:#00f}.code-highlight .nl{color:#767600}.code-highlight .nn{color:#00f;font-weight:700}.code-highlight .nt{color:green;font-weight:700}.code-highlight .nv{color:#19177c}.code-highlight .ow{color:#a2f;font-weight:700}.code-highlight .w{color:#bbb}.code-highlight .mb,.code-highlight .mf,.code-highlight .mh,.code-highlight .mi,.code-highlight .mo{color:#666}.code-highlight .sa,.code-highlight .sb,.code-highlight .sc,.code-highlight .dl{color:#ba2121}.code-highlight .sd{color:#ba2121;font-style:italic}.code-highlight .s2{color:#ba2121}.code-highlight .se{color:#aa5d1f;font-weight:700}.code-highlight .sh{color:#ba2121}.code-highlight .si{color:#a45a77;font-weight:700}.code-highlight .sx{color:green}.code-highlight .sr{color:#a45a77}.code-highlight .s1{color:#ba2121}.code-highlight .ss{color:#19177c}.code-highlight .bp{color:green}.code-highlight .fm{color:#00f}.code-highlight .vc,.code-highlight .vg,.code-highlight .vi,.code-highlight .vm{color:#19177c}.code-highlight .il{color:#666}.codelines{margin:.125rem 0 0;padding:1rem 0 0}.code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}.code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}.code-highlight .linenos::selection{background:transparent}.code-highlight .linenos::-moz-selection{background:transparent}.code-highlight span.linenos{color:var(--color-line-number)}@media (prefers-color-scheme: dark){:root.theme-auto .code-highlight pre{line-height:100%}:root.theme-auto .code-highlight td.linenos .normal{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight span.linenos{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight td.linenos .special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight span.linenos.special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight .hll{background-color:#6e7681}:root.theme-auto .code-highlight .c{color:#7e8aa1}:root.theme-auto .code-highlight .err{color:#f88f7f}:root.theme-auto .code-highlight .esc{color:#d4d2c8}:root.theme-auto .code-highlight .g{color:#d4d2c8}:root.theme-auto .code-highlight .k{color:#ffad66}:root.theme-auto .code-highlight .l{color:#d5ff80}:root.theme-auto .code-highlight .n{color:#d4d2c8}:root.theme-auto .code-highlight .o{color:#ffad66}:root.theme-auto .code-highlight .x{color:#d4d2c8}:root.theme-auto .code-highlight .p{color:#d4d2c8}:root.theme-auto .code-highlight .ch{color:#f88f7f;font-style:italic}:root.theme-auto .code-highlight .cm{color:#7e8aa1}:root.theme-auto .code-highlight .cp{color:#ffad66;font-weight:700}:root.theme-auto .code-highlight .cpf{color:#7e8aa1}:root.theme-auto .code-highlight .c1{color:#7e8aa1}:root.theme-auto .code-highlight .cs{color:#7e8aa1;font-style:italic}:root.theme-auto .code-highlight .gd{color:#f88f7f;background-color:#3d1e20}:root.theme-auto .code-highlight .ge{color:#d4d2c8;font-style:italic}:root.theme-auto .code-highlight .ges{color:#d4d2c8}:root.theme-auto .code-highlight .gr{color:#f88f7f}:root.theme-auto .code-highlight .gh{color:#d4d2c8}:root.theme-auto .code-highlight .gi{color:#6ad4af;background-color:#19362c}:root.theme-auto .code-highlight .go{color:#7e8aa1}:root.theme-auto .code-highlight .gp{color:#d4d2c8}:root.theme-auto .code-highlight .gs{color:#d4d2c8;font-weight:700}:root.theme-auto .code-highlight .gu{color:#d4d2c8}:root.theme-auto .code-highlight .gt{color:#f88f7f}:root.theme-auto .code-highlight .kc{color:#ffad66}:root.theme-auto .code-highlight .kd{color:#ffad66}:root.theme-auto .code-highlight .kn{color:#ffad66}:root.theme-auto .code-highlight .kp{color:#ffad66}:root.theme-auto .code-highlight .kr{color:#ffad66}:root.theme-auto .code-highlight .kt{color:#73d0ff}:root.theme-auto .code-highlight .ld{color:#d5ff80}:root.theme-auto .code-highlight .m{color:#dfbfff}:root.theme-auto .code-highlight .s{color:#d5ff80}:root.theme-auto .code-highlight .na{color:#ffd173}:root.theme-auto .code-highlight .nb{color:#ffd173}:root.theme-auto .code-highlight .nc{color:#73d0ff}:root.theme-auto .code-highlight .no{color:#ffd173}:root.theme-auto .code-highlight .nd{color:#7e8aa1;font-weight:700;font-style:italic}:root.theme-auto .code-highlight .ni{color:#95e6cb}:root.theme-auto .code-highlight .ne{color:#73d0ff}:root.theme-auto .code-highlight .nf{color:#ffd173}:root.theme-auto .code-highlight .nl{color:#d4d2c8}:root.theme-auto .code-highlight .nn{color:#d4d2c8}:root.theme-auto .code-highlight .nx{color:#d4d2c8}:root.theme-auto .code-highlight .py{color:#ffd173}:root.theme-auto .code-highlight .nt{color:#5ccfe6}:root.theme-auto .code-highlight .nv{color:#d4d2c8}:root.theme-auto .code-highlight .ow{color:#ffad66}:root.theme-auto .code-highlight .pm{color:#d4d2c8}:root.theme-auto .code-highlight .w{color:#d4d2c8}:root.theme-auto .code-highlight .mb{color:#dfbfff}:root.theme-auto .code-highlight .mf{color:#dfbfff}:root.theme-auto .code-highlight .mh{color:#dfbfff}:root.theme-auto .code-highlight .mi{color:#dfbfff}:root.theme-auto .code-highlight .mo{color:#dfbfff}:root.theme-auto .code-highlight .sa{color:#f29e74}:root.theme-auto .code-highlight .sb{color:#d5ff80}:root.theme-auto .code-highlight .sc{color:#d5ff80}:root.theme-auto .code-highlight .dl{color:#d5ff80}:root.theme-auto .code-highlight .sd{color:#7e8aa1}:root.theme-auto .code-highlight .s2{color:#d5ff80}:root.theme-auto .code-highlight .se{color:#95e6cb}:root.theme-auto .code-highlight .sh{color:#d5ff80}:root.theme-auto .code-highlight .si{color:#95e6cb}:root.theme-auto .code-highlight .sx{color:#95e6cb}:root.theme-auto .code-highlight .sr{color:#95e6cb}:root.theme-auto .code-highlight .s1{color:#d5ff80}:root.theme-auto .code-highlight .ss{color:#dfbfff}:root.theme-auto .code-highlight .bp{color:#5ccfe6}:root.theme-auto .code-highlight .fm{color:#ffd173}:root.theme-auto .code-highlight .vc{color:#d4d2c8}:root.theme-auto .code-highlight .vg{color:#d4d2c8}:root.theme-auto .code-highlight .vi{color:#d4d2c8}:root.theme-auto .code-highlight .vm{color:#d4d2c8}:root.theme-auto .code-highlight .il{color:#dfbfff}:root.theme-auto .code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}:root.theme-auto .code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}:root.theme-auto .code-highlight .linenos::selection{background:transparent}:root.theme-auto .code-highlight .linenos::-moz-selection{background:transparent}:root.theme-auto .code-highlight span.linenos{color:var(--color-line-number)}}:root.theme-dark .code-highlight pre{line-height:100%}:root.theme-dark .code-highlight td.linenos .normal{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight span.linenos{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight td.linenos .special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight span.linenos.special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight .hll{background-color:#6e7681}:root.theme-dark .code-highlight .c{color:#7e8aa1}:root.theme-dark .code-highlight .err{color:#f88f7f}:root.theme-dark .code-highlight .esc{color:#d4d2c8}:root.theme-dark .code-highlight .g{color:#d4d2c8}:root.theme-dark .code-highlight .k{color:#ffad66}:root.theme-dark .code-highlight .l{color:#d5ff80}:root.theme-dark .code-highlight .n{color:#d4d2c8}:root.theme-dark .code-highlight .o{color:#ffad66}:root.theme-dark .code-highlight .x{color:#d4d2c8}:root.theme-dark .code-highlight .p{color:#d4d2c8}:root.theme-dark .code-highlight .ch{color:#f88f7f;font-style:italic}:root.theme-dark .code-highlight .cm{color:#7e8aa1}:root.theme-dark .code-highlight .cp{color:#ffad66;font-weight:700}:root.theme-dark .code-highlight .cpf{color:#7e8aa1}:root.theme-dark .code-highlight .c1{color:#7e8aa1}:root.theme-dark .code-highlight .cs{color:#7e8aa1;font-style:italic}:root.theme-dark .code-highlight .gd{color:#f88f7f;background-color:#3d1e20}:root.theme-dark .code-highlight .ge{color:#d4d2c8;font-style:italic}:root.theme-dark .code-highlight .ges{color:#d4d2c8}:root.theme-dark .code-highlight .gr{color:#f88f7f}:root.theme-dark .code-highlight .gh{color:#d4d2c8}:root.theme-dark .code-highlight .gi{color:#6ad4af;background-color:#19362c}:root.theme-dark .code-highlight .go{color:#7e8aa1}:root.theme-dark .code-highlight .gp{color:#d4d2c8}:root.theme-dark .code-highlight .gs{color:#d4d2c8;font-weight:700}:root.theme-dark .code-highlight .gu{color:#d4d2c8}:root.theme-dark .code-highlight .gt{color:#f88f7f}:root.theme-dark .code-highlight .kc{color:#ffad66}:root.theme-dark .code-highlight .kd{color:#ffad66}:root.theme-dark .code-highlight .kn{color:#ffad66}:root.theme-dark .code-highlight .kp{color:#ffad66}:root.theme-dark .code-highlight .kr{color:#ffad66}:root.theme-dark .code-highlight .kt{color:#73d0ff}:root.theme-dark .code-highlight .ld{color:#d5ff80}:root.theme-dark .code-highlight .m{color:#dfbfff}:root.theme-dark .code-highlight .s{color:#d5ff80}:root.theme-dark .code-highlight .na{color:#ffd173}:root.theme-dark .code-highlight .nb{color:#ffd173}:root.theme-dark .code-highlight .nc{color:#73d0ff}:root.theme-dark .code-highlight .no{color:#ffd173}:root.theme-dark .code-highlight .nd{color:#7e8aa1;font-weight:700;font-style:italic}:root.theme-dark .code-highlight .ni{color:#95e6cb}:root.theme-dark .code-highlight .ne{color:#73d0ff}:root.theme-dark .code-highlight .nf{color:#ffd173}:root.theme-dark .code-highlight .nl{color:#d4d2c8}:root.theme-dark .code-highlight .nn{color:#d4d2c8}:root.theme-dark .code-highlight .nx{color:#d4d2c8}:root.theme-dark .code-highlight .py{color:#ffd173}:root.theme-dark .code-highlight .nt{color:#5ccfe6}:root.theme-dark .code-highlight .nv{color:#d4d2c8}:root.theme-dark .code-highlight .ow{color:#ffad66}:root.theme-dark .code-highlight .pm{color:#d4d2c8}:root.theme-dark .code-highlight .w{color:#d4d2c8}:root.theme-dark .code-highlight .mb{color:#dfbfff}:root.theme-dark .code-highlight .mf{color:#dfbfff}:root.theme-dark .code-highlight .mh{color:#dfbfff}:root.theme-dark .code-highlight .mi{color:#dfbfff}:root.theme-dark .code-highlight .mo{color:#dfbfff}:root.theme-dark .code-highlight .sa{color:#f29e74}:root.theme-dark .code-highlight .sb{color:#d5ff80}:root.theme-dark .code-highlight .sc{color:#d5ff80}:root.theme-dark .code-highlight .dl{color:#d5ff80}:root.theme-dark .code-highlight .sd{color:#7e8aa1}:root.theme-dark .code-highlight .s2{color:#d5ff80}:root.theme-dark .code-highlight .se{color:#95e6cb}:root.theme-dark .code-highlight .sh{color:#d5ff80}:root.theme-dark .code-highlight .si{color:#95e6cb}:root.theme-dark .code-highlight .sx{color:#95e6cb}:root.theme-dark .code-highlight .sr{color:#95e6cb}:root.theme-dark .code-highlight .s1{color:#d5ff80}:root.theme-dark .code-highlight .ss{color:#dfbfff}:root.theme-dark .code-highlight .bp{color:#5ccfe6}:root.theme-dark .code-highlight .fm{color:#ffd173}:root.theme-dark .code-highlight .vc{color:#d4d2c8}:root.theme-dark .code-highlight .vg{color:#d4d2c8}:root.theme-dark .code-highlight .vi{color:#d4d2c8}:root.theme-dark .code-highlight .vm{color:#d4d2c8}:root.theme-dark .code-highlight .il{color:#dfbfff}:root.theme-dark .code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}:root.theme-dark .code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}:root.theme-dark .code-highlight .linenos::selection{background:transparent}:root.theme-dark .code-highlight .linenos::-moz-selection{background:transparent}:root.theme-dark .code-highlight span.linenos{color:var(--color-line-number)}html.no-js .hide_if_nojs,html.js .show_if_nojs{display:none}.center{text-align:center}.right{float:right}.left{float:left}.invisible{display:none!important}.list-unstyled{list-style-type:none}.list-unstyled li{margin-top:4px;margin-bottom:4px}.danger{background-color:var(--color-error-background)}.warning{background:var(--color-warning-background)}.success{background:var(--color-success-background)}.badge{display:inline-block;color:var(--color-toolkit-badge-font);background-color:var(--color-toolkit-badge-background);text-align:center;white-space:nowrap;vertical-align:baseline;min-width:10px;padding:1px 5px;border-radius:5px}kbd{padding:2px 4px;margin:1px;font-size:90%;color:var(--color-toolkit-kbd-font);background:var(--color-toolkit-kbd-background)}table{width:100%}table.striped tr{border-bottom:1px solid var(--color-settings-tr-hover)}th{padding:.4em}td{padding:0 4px}tr:hover{background:var(--color-settings-tr-hover)!important}div.selectable_url{display:block;border:1px solid var(--color-result-search-url-border);padding:4px;color:var(--color-result-search-url-font);margin:.1em;overflow:hidden;height:1.2em;line-height:1.2em;border-radius:5px}div.selectable_url pre{display:block;font-size:.8em;word-break:break-all;margin:.1em;-webkit-user-select:all;user-select:all}.dialog-error{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:left;border-radius:10px;color:var(--color-error);background:var(--color-error-background);border-color:var(--color-error)}.dialog-error .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error ul,.dialog-error ol,.dialog-error p{margin:1px 0 0}.dialog-error table{width:auto}.dialog-error tr{vertical-align:text-top}.dialog-error tr:hover{background:transparent!important}.dialog-error td{padding:0 1em 0 0;padding-right:1rem;padding-bottom:0;padding-left:0}.dialog-error h4{margin-top:.3em;margin-bottom:.3em}.dialog-error-block{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:left;border-radius:10px;display:block;color:var(--color-error);background:var(--color-error-background);border-color:var(--color-error)}.dialog-error-block .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error-block ul,.dialog-error-block ol,.dialog-error-block p{margin:1px 0 0}.dialog-error-block table{width:auto}.dialog-error-block tr{vertical-align:text-top}.dialog-error-block tr:hover{background:transparent!important}.dialog-error-block td{padding:0 1em 0 0;padding-right:1rem;padding-bottom:0;padding-left:0}.dialog-error-block h4{margin-top:.3em;margin-bottom:.3em}.dialog-warning{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:left;border-radius:10px;color:var(--color-warning);background:var(--color-warning-background);border-color:var(--color-warning)}.dialog-warning .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-warning ul,.dialog-warning ol,.dialog-warning p{margin:1px 0 0}.dialog-warning table{width:auto}.dialog-warning tr{vertical-align:text-top}.dialog-warning tr:hover{background:transparent!important}.dialog-warning td{padding:0 1em 0 0;padding-right:1rem;padding-bottom:0;padding-left:0}.dialog-warning h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal{position:relative;display:flex;padding:1rem;border:1px solid var(--color-toolkit-dialog-border);text-align:left;border-radius:10px;display:block;background:var(--color-toolkit-dialog-background);position:fixed;top:50%;left:50%;margin:0 auto;transform:translate(-50%,-50%);z-index:5000}.dialog-modal .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-modal ul,.dialog-modal ol,.dialog-modal p{margin:1px 0 0}.dialog-modal table{width:auto}.dialog-modal tr{vertical-align:text-top}.dialog-modal tr:hover{background:transparent!important}.dialog-modal td{padding:0 1em 0 0;padding-right:1rem;padding-bottom:0;padding-left:0}.dialog-modal h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal h3{margin-top:0}.btn-collapse{cursor:pointer}.scrollx{overflow:auto hidden;display:block;padding:0;margin:0;border:none}.tabs .tabs>label{font-size:90%}ul.tabs{border-bottom:1px solid var(--color-toolkit-tabs-section-border);list-style:none;padding-left:0}ul.tabs li{display:flex}.tabs{display:flex;flex-wrap:wrap;width:100%;min-width:100%}.tabs>*{order:2}.tabs>input[type=radio]{display:none}.tabs>label,.tabs>li>a{order:1;padding:.7em;margin:0 .7em;letter-spacing:.5px;text-transform:uppercase;border:solid var(--color-toolkit-tabs-label-border);border-width:0 0 2px 0;color:unset;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:pointer}.tabs>label.active,.tabs>li>a.active{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font)}.tabs>label:hover,.tabs>li>a:hover{border-bottom:2px solid var(--color-categories-item-border-selected)}.tabs>section{min-width:100%;padding:.7rem 0;box-sizing:border-box;border-top:1px solid var(--color-toolkit-tabs-section-border);display:none}.tabs>label:last-of-type{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font);letter-spacing:-.1px}.tabs>section:last-of-type{display:block}html body .tabs>input:checked~section{display:none}html body .tabs>input:checked~label{position:inherited;background:inherit;border-bottom:2px solid transparent;font-weight:400;color:inherit}html body .tabs>input:checked~label:hover{border-bottom:2px solid var(--color-categories-item-border-selected)}html body .tabs>input:checked+label{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font)}html body .tabs>input:checked+label+section{display:block}select{height:2.4rem;margin-top:0;margin-right:1rem;margin-bottom:0;margin-left:0;padding:.2rem!important;color:var(--color-search-font);font-size:.9rem;z-index:100}select:hover,select:focus{cursor:pointer}@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))){select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border-width:0 2rem 0 0;border-color:transparent;background:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E) no-repeat;background-position-x:calc(100% + 2rem);background-size:2rem;background-origin:content-box;background-color:var(--color-toolkit-select-background);outline:medium none;text-overflow:ellipsis;border-radius:5px}select:hover,select:focus{background-color:var(--color-toolkit-select-background-hover)}select option{background-color:var(--color-base-background)}@media (prefers-color-scheme: dark){html.theme-auto select,html.theme-dark select{background-image:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20fill%3D%22%23ddd%22%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E)}}html.theme-dark select{background-image:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20fill%3D%22%23ddd%22%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E)}}input.checkbox-onoff[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;display:inline-block;width:2.5em;height:.7em;box-shadow:none!important;margin:0 16px;border-radius:10px;position:relative}input.checkbox-onoff[type=checkbox]:focus,input.checkbox-onoff[type=checkbox]:hover{outline:none}input.checkbox-onoff[type=checkbox]:focus:after{content:"";position:absolute;width:3.5em;height:1.65em;border:1px solid var(--color-btn-background);border-radius:12px;box-shadow:var(--color-btn-background) 0 0 3px;z-index:1200;top:-.55em;left:-.6em}input.checkbox-onoff[type=checkbox]:before{position:absolute;top:-.5em;display:flex;justify-content:center;align-items:center;font-size:.75em;width:1.875em;height:1.875em;border-radius:50%}input.checkbox-onoff[type=checkbox],input.checkbox-onoff.reversed-checkbox[type=checkbox]:checked{background:var(--color-toolkit-checkbox-onoff-off-background)}input.checkbox-onoff[type=checkbox]:before,input.checkbox-onoff.reversed-checkbox[type=checkbox]:checked:before{left:-.5em;content:"✕";color:var(--color-toolkit-checkbox-onoff-off-mark-color);background:var(--color-toolkit-checkbox-onoff-off-mark-background)}input.checkbox-onoff[type=checkbox]:checked,input.checkbox-onoff.reversed-checkbox[type=checkbox]{background:var(--color-toolkit-checkbox-onoff-on-background)}input.checkbox-onoff[type=checkbox]:checked:before,input.checkbox-onoff.reversed-checkbox[type=checkbox]:before{left:calc(100% - 1.5em);content:"✓";color:var(--color-toolkit-checkbox-onoff-on-mark-color);background:var(--color-toolkit-checkbox-onoff-on-mark-background)}@supports (transform: rotate(-45deg)){input[type=checkbox]:not(.checkbox-onoff){-webkit-appearance:none;-moz-appearance:none;appearance:none;width:20px;height:20px;cursor:pointer;position:relative;top:0;left:0;border:2px solid var(--color-toolkit-checkbox-input-border);border-radius:.3em}input[type=checkbox]:not(.checkbox-onoff):after{content:"";width:9px;height:5px;position:absolute;top:3px;left:2px;border:3px solid var(--color-toolkit-checkbox-label-border);border-top:none;border-right:none;background:transparent;opacity:0;transform:rotate(-45deg)}input[type=checkbox]:not(.checkbox-onoff):checked:after{border-color:var(--color-toolkit-checkbox-input-border);opacity:1}input[type=checkbox][disabled]:not(.checkbox-onoff){border:inherit;background-color:transparent!important;cursor:inherit}input.checkbox[type=checkbox]:not(:checked,[disabled],.checkbox-onoff):hover:after{opacity:.5}}@media screen and (max-width: 50em){.tabs>label{width:100%}}.loader,.loader:after{border-radius:50%;width:2em;height:2em}.loader{margin:1em auto;font-size:10px;position:relative;text-indent:-9999em;border-top:.5em solid var(--color-toolkit-loader-border);border-right:.5em solid var(--color-toolkit-loader-border);border-bottom:.5em solid var(--color-toolkit-loader-border);border-left:.5em solid var(--color-toolkit-loader-borderleft);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.2s infinite linear;animation:load8 1.2s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.engine-tooltip{display:none;position:absolute;padding:.5rem 1rem;margin:0 0 0 2rem;border:1px solid var(--color-toolkit-engine-tooltip-border);background:var(--color-toolkit-engine-tooltip-background);font-size:14px;font-weight:400;z-index:5000;text-align:left;border-radius:10px}th:hover .engine-tooltip,td:hover .engine-tooltip,.engine-tooltip:hover{display:inline-block}.stacked-bar-chart{margin:0;padding:0 .125rem 0 4rem;width:100%;width:-moz-available;width:-webkit-fill-available;width:fill;flex-flow:row nowrap;align-items:center;display:inline-flex}.stacked-bar-chart-value{width:3rem;display:inline-block;position:absolute;padding:0 .5rem;text-align:right}.stacked-bar-chart-base{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset}.stacked-bar-chart-median{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:var(--color-base-font);border:1px solid rgba(var(--color-base-font-rgb),.9);padding:.3rem 0}.stacked-bar-chart-rate80{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border:1px solid rgba(var(--color-base-font-rgb),.3);padding:.3rem 0}.stacked-bar-chart-rate95{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border-bottom:1px dotted rgba(var(--color-base-font-rgb),.5);padding:0}.stacked-bar-chart-rate100{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border-left:1px solid rgba(var(--color-base-font-rgb),.9);padding:.4rem 0;width:1px}/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */.autocomplete{position:absolute;width:44rem;max-height:0;overflow-y:hidden;text-align:left;border-radius:10px}.autocomplete:active,.autocomplete:focus,.autocomplete:hover{background-color:var(--color-autocomplete-background)}.autocomplete:empty{display:none}.autocomplete>ul{list-style-type:none;margin:0;padding:0}.autocomplete>ul>li{cursor:pointer;padding:.5rem 1rem}.autocomplete>ul>li.active,.autocomplete>ul>li:active,.autocomplete>ul>li:focus,.autocomplete>ul>li:hover{background-color:var(--color-autocomplete-background-hover)}.autocomplete>ul>li.active a:active,.autocomplete>ul>li:active a:active,.autocomplete>ul>li:focus a:active,.autocomplete>ul>li:hover a:active,.autocomplete>ul>li.active a:focus,.autocomplete>ul>li:active a:focus,.autocomplete>ul>li:focus a:focus,.autocomplete>ul>li:hover a:focus,.autocomplete>ul>li.active a:hover,.autocomplete>ul>li:active a:hover,.autocomplete>ul>li:focus a:hover,.autocomplete>ul>li:hover a:hover{text-decoration:none}.autocomplete>ul>li.locked{cursor:inherit}.autocomplete.open{display:block;background-color:var(--color-autocomplete-background);color:var(--color-autocomplete-font);max-height:32rem;overflow-y:auto;z-index:5000;margin-top:3.5rem;border-radius:.8rem}.autocomplete.open:empty{display:none}@media screen and (max-width: 50em){.autocomplete{width:100%}.autocomplete>ul>li{padding:1rem}}#main_results #results.image-detail-open.only_template_images{width:min(98%,59.25rem)!important}#main_results #results.only_template_images.image-detail-open #backToTop{left:56.75rem!important;right:inherit}article.result-images .detail{display:none}#results.image-detail-open article.result-images[data-vim-selected] .detail{display:flex;flex-direction:column;position:fixed;left:60rem;right:0;top:13rem;transition:top 64ms ease-in 0s;bottom:0;background:var(--color-result-detail-background);border:1px solid var(--color-result-detail-background);z-index:1000;padding:4rem 3rem 3rem;overflow-y:scroll}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source{display:block;flex:1;text-align:left;width:100%;border:none;text-decoration:none}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{padding:0;margin:0;border:none;object-fit:contain;width:inherit;height:inherit;max-width:100%;min-height:inherit;max-height:calc(100vh - 42rem);background:inherit}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels{color:var(--color-result-detail-font);height:19rem}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels hr{border-top:1px solid var(--color-result-detail-hr);border-bottom:none}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels h4{height:2rem;overflow:hidden;text-overflow:ellipsis;font-size:.9rem;margin-bottom:0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p{color:var(--color-result-detail-label-font);font-size:.9rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:.8rem 0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p span{display:inline-block;width:12rem}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels h4,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a{text-align:left}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-content{height:2rem;line-height:unset;overflow:hidden;text-overflow:ellipsis}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url{white-space:nowrap;overflow:hidden hidden;text-overflow:ellipsis}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-content:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url:hover{position:relative;overflow:inherit!important;background:var(--color-result-detail-background);text-overflow:inherit!important}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:active{color:var(--color-result-detail-link)}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:hover{text-decoration:underline}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close{top:1rem;left:1rem;padding:.4rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous{top:1rem;right:6rem;padding:.4rem .5rem .4rem .3rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next{top:1rem;right:2rem;padding:.4rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous{border-radius:50%;display:block;width:1.5rem;height:1.5rem;position:absolute;filter:opacity(40%);z-index:1200}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close span,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next span,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous span{display:block;width:1.5rem;height:1.5rem;text-align:center}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next span:before,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous span:before{vertical-align:sub}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:active,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:active,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:active{color:var(--color-result-detail-font);background:var(--color-result-detail-background);border:1px solid var(--color-result-detail-font)}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:hover{filter:opacity(80%)}#results.image-detail-open article.result-images[data-vim-selected] .detail .loader{position:absolute;top:1rem;right:50%;border-top:.5em solid var(--color-result-detail-loader-border);border-right:.5em solid var(--color-result-detail-loader-border);border-bottom:.5em solid var(--color-result-detail-loader-border);border-left:.5em solid var(--color-result-detail-loader-borderleft)}#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail{top:0}#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail a.result-images-source img{max-height:calc(100vh - 25rem)}@media screen and (max-width: 79.75em){#results.image-detail-open article.result-images[data-vim-selected] .detail{top:0;left:0}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source{display:flex;flex-direction:column;justify-content:center}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{width:100%;max-height:calc(100vh - 24rem)}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next{right:1rem}}@media screen and (max-width: 50em){#results.image-detail-open article.result-images[data-vim-selected] .detail{top:0;left:0;padding:1rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{width:100%;max-height:calc(100vh - 20rem);margin:0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p span{width:inherit;margin-right:1rem}}.dialog-modal{animation-name:dialogmodal;animation-duration:.13s}@keyframes dialogmodal{0%{opacity:0}50%{opacity:.5;transform:translate(-50%,-50%) scale(1.05)}}input.checkbox-onoff[type=checkbox]:before{transition:left .25s}iframe[src^="https://w.soundcloud.com"]{height:120px}iframe[src^="https://www.deezer.com"]{height:94px}iframe[src^="https://www.mixcloud.com"]{height:250px}iframe[src^="https://bandcamp.com/EmbeddedPlayer"]{height:350px}iframe[src^="https://bandcamp.com/EmbeddedPlayer/track"]{height:120px}iframe[src^="https://genius.com/songs"]{height:65px}.info-page code{font-family:monospace;border-radius:5px;background-color:var(--color-doc-code-background);color:var(--color-doc-code);padding:.2rem;border:0 none}.stats_endpoint .github-issue-button{display:block;font-size:16px}.stats_endpoint .issue-hide{display:none}.stats_endpoint input[type=checked]{position:absolute}.stats_endpoint label{margin:1rem 1rem 1rem 0}.stats_endpoint .step_content{margin:1rem 1rem 1rem 2rem}.stats_endpoint .step1,.stats_endpoint .step2{visibility:hidden}.stats_endpoint .step1_delay{transition:visibility 0s linear 4s}.stats_endpoint #step1:checked~.step1,.stats_endpoint #step2:checked~.step2{visibility:visible}.engine-stats{border-spacing:0;border-collapse:collapse}.engine-stats tr td,.engine-stats tr th{border-bottom:1px solid var(--color-result-border);padding:.25rem}.engine-stats table.engine-tooltip{border-spacing:0;border-collapse:collapse}.engine-stats table.engine-tooltip td,.engine-stats table.engine-tooltip th{border:none}.engine-stats .engine-name{width:20rem}.engine-stats .engine-score{width:7rem;text-align:right}.engine-stats .engine-reliability{text-align:right}table.engine-error th.engine-error-type,table.engine-error td.engine-error-type,failed-test{width:10rem}.engine-errors{margin-top:3rem}.engine-errors table.engine-error{max-width:1280px;margin:1rem 0 3rem;border:1px solid var(--color-result-border);text-align:left}.engine-errors table.engine-error tr th,.engine-errors table.engine-error tr td{padding:.5rem}.engine-errors table.engine-error span.log_parameters{border-right:1px solid solid var(--color-result-border);padding:0 1rem 0 0;margin:0 0 0 .5rem}.bar-chart-value{width:3em;display:inline-block;text-align:right;padding-right:.5rem}.bar-chart-graph{width:calc(100% - 5rem);display:inline-block}.bar-chart-bar{border:3px solid var(--color-bar-chart-primary);margin:1px 0}.bar-chart-serie1{border:3px solid var(--color-bar-chart-primary);margin:1px 0;float:left}.bar-chart-serie2{border:3px solid var(--color-bar-chart-secondary);margin:1px 0;float:left}.bar0{width:0;border:0}.bar1{width:1%}.bar2{width:2%}.bar3{width:3%}.bar4{width:4%}.bar5{width:5%}.bar6{width:6%}.bar7{width:7%}.bar8{width:8%}.bar9{width:9%}.bar10{width:10%}.bar11{width:11%}.bar12{width:12%}.bar13{width:13%}.bar14{width:14%}.bar15{width:15%}.bar16{width:16%}.bar17{width:17%}.bar18{width:18%}.bar19{width:19%}.bar20{width:20%}.bar21{width:21%}.bar22{width:22%}.bar23{width:23%}.bar24{width:24%}.bar25{width:25%}.bar26{width:26%}.bar27{width:27%}.bar28{width:28%}.bar29{width:29%}.bar30{width:30%}.bar31{width:31%}.bar32{width:32%}.bar33{width:33%}.bar34{width:34%}.bar35{width:35%}.bar36{width:36%}.bar37{width:37%}.bar38{width:38%}.bar39{width:39%}.bar40{width:40%}.bar41{width:41%}.bar42{width:42%}.bar43{width:43%}.bar44{width:44%}.bar45{width:45%}.bar46{width:46%}.bar47{width:47%}.bar48{width:48%}.bar49{width:49%}.bar50{width:50%}.bar51{width:51%}.bar52{width:52%}.bar53{width:53%}.bar54{width:54%}.bar55{width:55%}.bar56{width:56%}.bar57{width:57%}.bar58{width:58%}.bar59{width:59%}.bar60{width:60%}.bar61{width:61%}.bar62{width:62%}.bar63{width:63%}.bar64{width:64%}.bar65{width:65%}.bar66{width:66%}.bar67{width:67%}.bar68{width:68%}.bar69{width:69%}.bar70{width:70%}.bar71{width:71%}.bar72{width:72%}.bar73{width:73%}.bar74{width:74%}.bar75{width:75%}.bar76{width:76%}.bar77{width:77%}.bar78{width:78%}.bar79{width:79%}.bar80{width:80%}.bar81{width:81%}.bar82{width:82%}.bar83{width:83%}.bar84{width:84%}.bar85{width:85%}.bar86{width:86%}.bar87{width:87%}.bar88{width:88%}.bar89{width:89%}.bar90{width:90%}.bar91{width:91%}.bar92{width:92%}.bar93{width:93%}.bar94{width:94%}.bar95{width:95%}.bar96{width:96%}.bar97{width:97%}.bar98{width:98%}.bar99{width:99%}.bar100{width:100%}.osm-map-box{height:300px;width:100%;margin:10px 0}#main_index{margin-top:26vh}.index{text-align:center}.index .title{background:url(../img/searxng.png) no-repeat;min-height:4rem;margin:4rem auto;background-position:center;background-size:contain}.index h1{font-size:4em;visibility:hidden}.index #search,.index #search_header{margin:0 auto;background:inherit;border:inherit;padding:0;display:block}.index .search_filters{display:block;margin:1em 0}.index .category label{padding:6px 10px;border-bottom:initial!important}@media screen and (max-width: 79.75em){div.title h1{font-size:1em}#main_index{margin-top:6em}}table{border-collapse:collapse}table th,table td{text-align:center;padding:1rem .5rem;text-align:left}table tr.pref-group th{font-weight:400;text-align:left;background:var(--color-settings-table-group-background)}#main_preferences form{width:100%}#main_preferences fieldset{margin:8px;border:none}#main_preferences legend{margin:0;padding:5px 0 0;display:block;float:left;width:300px}#main_preferences input[type=text]{width:13.25rem;color:var(--color-toolkit-input-text-font);border:none;background:none repeat scroll 0 0 var(--color-toolkit-select-background);padding:.2rem .4rem;height:2rem;border-radius:5px}#main_preferences input[type=text]:hover,#main_preferences input[type=text]:focus{background-color:var(--color-toolkit-select-background-hover)}#main_preferences div.pref-group{width:100%;font-weight:400;padding:1rem .5rem;text-align:left;background:var(--color-settings-table-group-background)}#main_preferences .value{margin:0;padding:0;float:left;width:15em}#main_preferences .value select,#main_preferences .value input[type=text]{font-size:inherit!important;margin-top:0;margin-right:1rem;margin-bottom:0;margin-left:0}#main_preferences .value select{width:14rem}#main_preferences .value select:focus,#main_preferences .value input:focus{outline:none;box-shadow:0 0 1px 1px var(--color-btn-background)}#main_preferences .description{margin:0;padding:5px 0 0;float:right;width:50%;color:var(--color-settings-engine-description-font);font-size:90%}#main_preferences .bang{text-align:left;border-radius:5px;background-color:var(--color-doc-code-background);color:var(--color-doc-code);padding:.2rem;border:0 none}#main_preferences .category{margin-right:.5rem}#main_preferences .category label{border:2px solid transparent;padding:.2rem .4rem;border-radius:5px}#main_preferences .category input[type=checkbox]:checked+label{border:2px solid var(--color-categories-item-border-selected)}#main_preferences table.table_engines th.name label{cursor:pointer}#main_preferences table.table_engines th.name .engine-tooltip{margin-top:1.8rem;left:calc((100% - 85em)/2 + 10em);max-width:40rem}#main_preferences table.table_engines th.name .engine-tooltip .engine-description{margin-top:.5rem}#main_preferences table.table_engines th.name .engine-tooltip .bang{margin:.3rem}#main_preferences table.table_engines .checkbox-col,#main_preferences table.table_engines .name,#main_preferences table.table_engines .shortcut{text-align:left}#main_preferences table.cookies{width:100%;direction:ltr}#main_preferences table.cookies th,#main_preferences table.cookies td{text-align:left;font-family:monospace;font-size:1rem;padding:.5em;vertical-align:top}#main_preferences table.cookies td:first-child{word-break:keep-all;width:14rem;padding-right:1rem}#main_preferences table.cookies td:last-child{word-break:break-all}#main_preferences table.cookies>tbody>tr:nth-child(2n)>th,#main_preferences table.cookies>tbody>tr:nth-child(2n)>td{background-color:var(--color-settings-tr-hover)}#main_preferences .preferences_back{background:none repeat scroll 0 0 var(--color-btn-background);color:var(--color-btn-font);border:0 none;border-radius:10px;cursor:pointer;display:inline-block;margin:2px 4px;padding:.7em}#main_preferences .preferences_back a{color:var(--color-settings-return-font)}#main_preferences .preferences_back a:first-letter{text-transform:uppercase}#main_preferences #toggle-all-engines-container{width:max-content;margin-left:auto}#main_preferences div.selectable_url pre{width:100%}#main_preferences #copy-hash-container{display:flex;align-items:center;gap:.5rem}#main_preferences #copy-hash-container div.selectable_url pre{width:auto;flex-grow:1}#main_preferences #pref-hash-input{width:100%}@media screen and (max-width: 79.75em){.preferences_back{clear:both}.engine-tooltip{left:10em!important}}#search{padding:0;margin:0}#search_header{padding-top:1.5em;padding-right:2em;padding-left:7rem;margin:0;background:var(--color-header-background);border-bottom:1px solid var(--color-header-border);display:grid;gap:1rem 1.2rem;grid-template-columns:3rem 1fr;grid-template-areas:"logo search" "spacer categories"}.category_checkbox,.category_button{display:inline-block;position:relative;margin-right:1rem;padding:0}.category_checkbox input{display:none}.category_checkbox label{cursor:pointer;padding:.2rem 0;display:inline-flex;text-transform:capitalize;font-size:.9em;border-bottom:2px solid transparent;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.category_checkbox label svg{padding-right:.2rem}.category_checkbox label div.category_name{margin:auto 0}.category_checkbox input[type=checkbox]:checked+label{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}button.category_button{background-color:inherit;color:var(--color-base-font);cursor:pointer;padding:.2rem 0;display:inline-flex;align-items:center;text-transform:capitalize;font-size:.9em;border:none;border-bottom:2px solid transparent}button.category_button svg{padding-right:.2rem}button.category_button.selected,button.category_button:active{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}.no-js #categories_container:has(button.category_button:focus-within) button.category_button.selected{color:var(--color-base-font);border-bottom:none}.no-js #categories_container:has(button.category_button:focus-within) button.category_button:focus-within{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}#search_logo{padding:.5rem 10px 0;grid-area:logo;display:flex;align-items:center;justify-content:center}#search_logo svg{flex:1;width:30px;height:30px;margin:.5rem 0 auto}.search_categories{grid-area:categories}.search_categories .help{display:none}.search_categories:hover .help{display:block;position:absolute;background:var(--color-base-background);padding:1rem .6rem .6rem 0;z-index:1000;width:100%;left:-.1rem}#search_view{padding:.5rem .3rem 0 .5rem;grid-area:search}body.results_endpoint #search_view{padding:.5rem 2.8rem 0 0}.search_box{border-radius:.8rem;width:44rem;display:inline-flex;flex-direction:row;white-space:nowrap;box-shadow:var(--color-search-shadow)}#clear_search{display:block;border-collapse:separate;box-sizing:border-box;width:1.8rem;margin:0;padding:.8rem .2rem;background:none repeat scroll 0 0 var(--color-search-background);border:none;outline:none;color:var(--color-search-font);font-size:1.1rem;z-index:1000}#clear_search:hover{color:var(--color-search-background-hover)}#clear_search.empty *,html.no-js #clear_search.hide_if_nojs{display:none}#q,#send_search{display:block;margin:0;padding:.8rem;background:none repeat scroll 0 0 var(--color-search-background);border:none;outline:none;color:var(--color-search-font);font-size:1.1rem;z-index:100}#q{width:100%;padding-left:1rem;padding-right:0!important;border-radius:.8rem 0 0 .8rem}#q::-ms-clear,#q::-webkit-search-cancel-button{display:none}#send_search{border-radius:0 .8rem .8rem 0}#send_search:hover{cursor:pointer;background-color:var(--color-search-background-hover);color:var(--color-search-background)}.no-js #clear_search,.no-js #send_search{width:auto!important;border-left:1px solid var(--color-search-border)}.search_filters{margin-top:.6rem;margin-right:0;margin-bottom:0;margin-left:10.6rem;display:flex;overflow-x:auto;overscroll-behavior-inline:contain}.search_filters select{background-color:inherit}.search_filters select:hover,.search_filters select:focus{color:var(--color-base-font)}@media screen and (max-width: 79.75em){#search_header{padding:1.5em .5rem 0;column-gap:.5rem}.search_filters{margin-top:.6rem;margin-right:0;margin-bottom:0;margin-left:3.5rem}#categories{font-size:90%;clear:both}}@media screen and (max-width: 79.75em) and (hover: none){#main_index #categories_container,#main_results #categories_container{width:max-content}#main_index #categories_container .category_checkbox,#main_results #categories_container .category_checkbox{display:inline-block;width:auto}#main_index #categories,#main_results #categories{width:100%;text-align:left;overflow:scroll hidden;-webkit-overflow-scrolling:touch}}@media screen and (max-width: 50em){#search_header{width:100%;margin:0;padding:.1rem 0 0;gap:0 0;grid-template-areas:"logo search" "categories categories"}.search_logo{padding:0}.search_box{width:98%;display:flex}#q{width:100%;flex:1}.search_filters{margin:0 10px;padding:.5rem 0}.category{display:inline-block;width:auto;margin:0}.category svg{display:none}.category_checkbox label,.category_button{padding:1rem!important;margin:0!important}#search_view:focus-within{display:block;background-color:var(--color-search-background);position:absolute;top:0;height:100%;width:100%;z-index:2000}#search_view:focus-within .search_box{border-bottom:1px solid var(--color-search-border);width:100%;border-radius:0;box-shadow:none}#search_view:focus-within .search_box #send_search{margin-right:0!important}#search_view:focus-within .search_box *{border:none;border-radius:0;box-shadow:none}#main_results #q:placeholder-shown~#send_search{margin-right:2.6rem;transition:margin .1s}}@media screen and (max-width: 20rem){#search_header{grid-template-areas:"search search" "categories categories"}#search_logo{display:none}}#categories{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}#categories::-webkit-scrollbar{width:0;height:0}#categories_container{position:relative}.favicon img{height:1.5rem;width:1.5rem;border-radius:10%;background-color:var(--color-favicon-background-color);border:1px solid var(--color-favicon-border-color);display:flex}@media screen and (min-width: 50em){.center-alignment-yes #main_results{--center-page-width: 48rem}}@media screen and (width >= 62rem){.center-alignment-yes #main_results{--center-page-width: 60rem}}@media screen and (min-width: 79.75em){.center-alignment-yes #main_results{--center-page-width: 73rem}}@media screen and (min-width: 50em) and (max-width: 79.75em){.center-alignment-yes #main_results #results{grid-template-columns:60% calc(40% - 5rem);margin-left:0;margin-right:0}.center-alignment-yes #main_results #urls{margin-left:3rem}.center-alignment-yes #main_results #sidebar{margin-right:1rem}.center-alignment-yes #main_results #backToTop{left:calc(60% + 1rem)}}@media screen and (min-width: 79.75em){.center-alignment-yes #main_results{display:flex;flex-direction:column;align-items:center}.center-alignment-yes #main_results #search{width:100%;display:flex;flex-direction:column;align-items:center}.center-alignment-yes #main_results #search_header{grid-template-columns:calc(50% - 4.5rem - var(--center-page-width) / 2) 3rem var(--center-page-width);grid-template-areas:"na logo search" "na spacer categories";column-gap:1.2rem;width:100%;padding-left:0;padding-right:0}.center-alignment-yes #main_results .search_filters{margin-left:.5rem;width:var(--center-page-width)}.center-alignment-yes #main_results #results{margin-right:2rem;margin-left:10rem}.center-alignment-yes #main_results #results.only_template_images,.center-alignment-yes #main_results #results.image-detail-open{align-self:flex-start}.center-alignment-yes #main_results #results:not(.only_template_images,.image-detail-open){margin-left:1.5rem;grid-template-columns:calc(var(--center-page-width) - 5rem - 25rem) 25rem}.center-alignment-yes #main_results #results:not(.only_template_images,.image-detail-open) #backToTop{left:calc(50% - 25rem - 5rem + 1rem + var(--center-page-width) / 2)}.center-alignment-yes #main_results #results .result .content{max-width:inherit}.center-alignment-yes #main_results #urls{margin-left:0}.center-alignment-yes #main_results #sidebar{margin-right:0}}.sxng-icon-set{display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scale(1)}.sxng-icon-set-small{width:1rem;height:1rem;display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scale(1)}.sxng-icon-set-big{width:1.5rem;height:1.5rem;display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scale(1)}html{font-family:sans-serif;font-size:.9em;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:var(--color-base-font);background-color:var(--color-base-background);padding:0;margin:0;scroll-behavior:smooth}body,main{padding:0;margin:0}body{display:flex;flex-direction:column;height:100vh;margin:0}@supports (height: 100dvh){body{height:100dvh}}main{width:100%;margin-bottom:2rem;flex:1}.page_with_header{margin:2em auto;width:85em}footer{clear:both;min-height:4rem;padding:1rem 0;width:100%;text-align:center;background-color:var(--color-footer-background);border-top:1px solid var(--color-footer-border);overflow:hidden}footer p{font-size:.9em}.page_with_header .logo{height:40px}input[type=submit],#results button[type=submit],.button{padding:.7rem;display:inline-block;background:var(--color-btn-background);color:var(--color-btn-font);border-radius:10px;border:0;cursor:pointer}a{text-decoration:none;color:var(--color-url-font)}a:visited,a:visited .highlight{color:var(--color-url-visited-font)}article[data-vim-selected]{background:var(--color-result-vim-selected);border-left:.2rem solid var(--color-result-vim-arrow);border-radius:0 10px 10px 0}article.result-images[data-vim-selected]{background:var(--color-result-vim-arrow);border:none;border-radius:10px}article.result-images[data-vim-selected] .image_thumbnail{filter:opacity(60%)}article.result-images[data-vim-selected] span.title,article.result-images[data-vim-selected] span.source{color:var(--color-result-image-span-font-selected)}article[data-vim-selected].category-videos,article[data-vim-selected].category-news,article[data-vim-selected].category-map,article[data-vim-selected].category-music,article[data-vim-selected].category-files,article[data-vim-selected].category-social{border:1px solid var(--color-result-vim-arrow);border-radius:10px}.result{margin:.125rem 0;padding:1rem;box-sizing:border-box;width:100%;border-left:.2rem solid transparent}.result h3{font-size:1.2rem;word-wrap:break-word;margin:.4rem 0;padding:0}.result h3 a{color:var(--color-result-link-font);font-weight:400;font-size:1.1em}.result h3 a:visited{color:var(--color-result-link-visited-font)}.result h3 a:focus,.result h3 a:hover{text-decoration:underline;border:none;outline:none}.result .cache_link,.result .proxyfied_link{font-size:smaller!important;margin-left:.5rem}.result .content,.result .stat{font-size:.9em;margin:0;padding:0;max-width:54em;word-wrap:break-word;line-height:1.24}.result .content .highlight,.result .stat .highlight{color:var(--color-result-description-highlight-font);background:inherit;font-weight:700}.result .altlink a{font-size:.9em;margin:0 10px 0 0;padding:5px 10px;border-radius:5px;background:var(--color-show-btn-background);color:var(--color-show-btn-font);cursor:pointer}.result .altlink a:hover{background:var(--color-btn-background);color:var(--color-btn-font)}.result .codelines .highlight{color:inherit;background:inherit;font-weight:400}.result .url_header{display:flex;gap:.5rem}.result .url_wrapper{display:flex;align-items:center;font-size:1rem;color:var(--color-result-url-font);flex-flow:row nowrap;overflow:hidden;margin:0;padding:0}.result .url_wrapper .url_o1{white-space:nowrap;flex-shrink:1;padding-bottom:1px}.result .url_wrapper .url_o1 .url_i1{unicode-bidi:plaintext}.result .url_wrapper .url_o1:after{content:" ";width:1ch;display:inline-block}.result .url_wrapper .url_o2{overflow:hidden;white-space:nowrap;flex:0 1 content;text-align:right;padding-bottom:1px}.result .url_wrapper .url_o2 .url_i2{float:right}.result .published_date,.result .result_length,.result .result_views,.result .result_author,.result .result_shipping,.result .result_source_country{font-size:.8em;color:var(--color-result-publishdate-font)}.result .result_price{font-size:1.2em;color:var(--color-result-description-highlight-font)}.result img.thumbnail{float:left;padding-top:.6rem;padding-right:1rem;width:7rem;height:unset}.result .break{clear:both}.result-paper .attributes,.result-packages .attributes{display:table;border-spacing:.125rem}.result-paper .attributes div,.result-packages .attributes div{display:table-row}.result-paper .attributes div span,.result-packages .attributes div span{font-size:.9rem;margin-top:.25rem;display:table-cell}.result-paper .attributes div span time,.result-packages .attributes div span time{font-size:.9rem}.result-paper .attributes div span:first-child,.result-packages .attributes div span:first-child{color:var(--color-base-font);min-width:10rem}.result-paper .attributes div span:nth-child(2),.result-packages .attributes div span:nth-child(2){color:var(--color-result-publishdate-font)}.result-paper .content,.result-packages .content{margin-top:.25rem}.result-paper .comments,.result-packages .comments{font-size:.9rem;margin:.25rem 0 0;padding:0;word-wrap:break-word;line-height:1.24;font-style:italic}.result-packages .attributes{margin-top:.3rem}.template_group_images{display:flex;flex-wrap:wrap}.template_group_images:after{flex-grow:10;content:""}.category-videos,.category-news,.category-map,.category-music,.category-files,.category-social{border:1px solid var(--color-result-border);margin:0 .5rem 1rem!important;border-radius:10px}.category-social .image{width:auto!important;min-width:48px;min-height:48px;padding:0 5px 25px 0!important}.audio-control audio{width:100%;padding:10px 0 0}.embedded-content iframe{width:100%;padding:10px 0 0}.result-videos img.thumbnail{float:left;padding-top:.6rem;padding-right:1rem;width:20rem;height:unset}.result-videos .content{overflow:hidden}.result-videos .embedded-video iframe{width:100%;aspect-ratio:16 / 9;padding:10px 0 0}@supports not (aspect-ratio: 1 / 1){.result-videos .embedded-video iframe{height:25.3125rem}}.engines{float:right;display:flex;flex-wrap:wrap;justify-content:flex-end;color:var(--color-result-engines-font)}.engines span{font-size:smaller;margin-top:0;margin-bottom:0;margin-right:.5rem;margin-left:0}.small_font{font-size:.8em}.highlight{color:var(--color-result-link-font-highlight);background:inherit}.empty_element{font-style:italic}.result-images{flex-grow:1;padding:.5rem .5rem 3rem;margin:.25rem;border:none!important;height:12rem;width:unset}.result-images>a{position:relative;outline:none}.result-images img{margin:0;padding:0;border:none;height:100%;width:auto;object-fit:cover;vertical-align:bottom;background:var(--color-result-image-background)}.result-images .image_resolution{position:absolute;right:0;bottom:0;background:var(--color-image-resolution-background);padding:.3rem .5rem;font-size:.9rem;color:var(--color-image-resolution-font);border-top-left-radius:.3rem}.result-images span.title,.result-images span.source{display:block;position:absolute;width:100%;font-size:.9rem;color:var(--color-result-image-span-font);padding:.5rem 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.result-images span.source{padding:1.8rem 0 0;font-size:.7rem}.result-map img.image{float:right!important;height:100px!important;width:auto!important}.result-map table{font-size:.9em;width:auto;border-collapse:separate;border-spacing:0 .35rem}.result-map table th{font-weight:inherit;width:17rem;vertical-align:top;text-align:left}.result-map table td{vertical-align:top;text-align:left}.hidden{display:none!important}#results{margin-top:1rem;margin-right:2rem;margin-bottom:0;margin-left:10rem;display:grid;grid-template:"corrections sidebar" min-content "answers sidebar" min-content "urls sidebar" 1fr "pagination sidebar" min-content / 45rem 25rem;gap:0 5rem}#results #sidebar *:first-child{margin-top:0}#urls{padding:0;grid-area:urls}#apis .wrapper{display:flex}#suggestions .wrapper{display:flex;flex-flow:column;justify-content:flex-end}#suggestions .wrapper form{display:inline-block;flex:1 1 50%}#suggestions input,#infoboxes input{padding:0;margin:3px;font-size:.9em;display:inline-block;background:transparent;color:var(--color-result-search-url-font);cursor:pointer;width:100%;text-overflow:ellipsis;overflow:hidden;text-align:left}#suggestions input[type=submit],#infoboxes input[type=submit],#suggestions .infobox .url a,#infoboxes .infobox .url a{color:var(--color-result-link-font);text-decoration:none;font-size:.9rem}#suggestions input[type=submit]:hover,#infoboxes input[type=submit]:hover,#suggestions .infobox .url a:hover,#infoboxes .infobox .url a:hover{text-decoration:underline}#corrections{grid-area:corrections;display:flex;flex-flow:row wrap;margin:0 0 1em}#corrections h4,#corrections input[type=submit]{display:inline-block;padding:.5rem;margin:.5rem}#corrections input[type=submit]{font-size:.8rem;border-radius:5px}#infoboxes .title,#suggestions .title,#search_url .title,#engines_msg .title,#apis .title{margin:2em 0 .5em;color:var(--color-base-font)}summary.title{cursor:pointer;padding-top:1em}.sidebar-collapsible{border-top:1px solid var(--color-sidebar-border);padding-bottom:.5em}#sidebar-end-collapsible{border-bottom:1px solid var(--color-sidebar-border);width:100%}#answers{grid-area:answers;background:var(--color-answer-background);padding:1rem;margin:1rem 0;margin-top:0;color:var(--color-answer-font);border-radius:10px}#answers h4{display:none}#answers span{overflow-wrap:anywhere}#answers .answer{display:flex;flex-direction:column}#answers .answer-url{margin:5px 10px 10px auto}#infoboxes form{min-width:210px}#sidebar{grid-area:sidebar;word-wrap:break-word;color:var(--color-sidebar-font)}#sidebar .infobox{margin:10px 0;border:1px solid var(--color-sidebar-border);padding:1rem;font-size:.9em;border-radius:10px}#sidebar .infobox h2{margin:0 0 .5em}#sidebar .infobox img{max-width:100%;max-height:12em;display:block;margin:0 auto;padding:0}#sidebar .infobox dt{font-weight:700}#sidebar .infobox .attributes dl{margin:.5em 0}#sidebar .infobox .attributes dt{display:inline;margin:.5em .25em .5em 0;padding:0}#sidebar .infobox .attributes dd{display:inline;margin:.5em 0;padding:0}#sidebar .infobox input{font-size:1em}#sidebar .infobox br,#sidebar .infobox .attributes,#sidebar .infobox .urls{clear:both}#apis input{font-size:.9em;margin:0 10px 0 0;padding:5px 10px;border-radius:5px;background:var(--color-show-btn-background);color:var(--color-show-btn-font);cursor:pointer}#apis input:hover{background:var(--color-btn-background);color:var(--color-btn-font)}#engines_msg .engine-name{width:10rem}#engines_msg .response-error{color:var(--color-error)}#engines_msg .bar-chart-value{width:auto}#search_url div.selectable_url pre{float:left;width:200em}#search_url button#copy_url{float:right;padding:.4rem;margin-left:.5rem;border-radius:.3rem;display:none}#links_on_top{position:absolute;right:1rem;text-align:right;top:2.7rem;padding:0;border:0;display:flex;align-items:center;font-size:1em;color:var(--color-search-font)}#links_on_top a{display:flex;align-items:center;margin-left:1em}#links_on_top a svg{font-size:1.2em;margin-right:.125em}#links_on_top a,#links_on_top a:link *,#links_on_top a:hover *,#links_on_top a:visited *,#links_on_top a:active *{color:var(--color-search-font)}#pagination{grid-area:pagination}#pagination br{clear:both}.numbered_pagination{display:flex;flex-direction:row;justify-content:center;align-items:center;overflow:hidden}.page_number{background:transparent!important;color:var(--color-result-link-font)!important;text-decoration:underline}.page_number_current{background:transparent;color:var(--color-result-link-visited-font);border:none}#backToTop{border:1px solid var(--color-backtotop-border);margin:0;padding:0;font-size:1em;background:var(--color-backtotop-background);position:fixed;bottom:8rem;left:56.3rem;transition:opacity .5s;opacity:0;pointer-events:none;border-radius:10px}#backToTop a{display:block;margin:0;padding:.7em}#backToTop a,#backToTop a:visited,#backToTop a:hover,#backToTop a:active{color:var(--color-backtotop-font)}#results.scrolling #backToTop{opacity:1;pointer-events:all}@media screen and (width <= calc(79.75em - .5px)){#links_on_top span{display:none}}@media screen and (width <= 52rem){body.results_endpoint #links_on_top .link_on_top_about,body.results_endpoint #links_on_top .link_on_top_donate{display:none}}@media screen and (min-width: 50em) and (max-width: 79.75em){.center-alignment-no #links_on_top span{display:none}.center-alignment-no .page_with_header{margin:2rem .5rem;width:auto}.center-alignment-no #infoboxes{position:inherit;max-width:inherit}.center-alignment-no #infoboxes .infobox{clear:both}.center-alignment-no #infoboxes .infobox img{float:left;max-width:10em;margin:.5em .5em .5em 0}.center-alignment-no #sidebar{margin:0 .5rem .125rem;padding:0;float:none;border:none;width:auto}.center-alignment-no #sidebar input{border:0}.center-alignment-no .result .thumbnail{max-width:98%}.center-alignment-no .result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.center-alignment-no .result .engines{float:right;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:3px 0 0}.center-alignment-no .result-images{border-bottom:none!important}.center-alignment-no .image_result,.center-alignment-no .image_result img{max-width:98%}.center-alignment-no #backToTop{display:none}.center-alignment-no #pagination{margin:2rem 0 0!important}.center-alignment-no #main_results div#results{margin:0 auto;justify-content:center;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 45rem;gap:0}}#main_results div#results.only_template_images{margin:1rem .5rem 0;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 100%;gap:0}#main_results div#results.only_template_images #sidebar{display:none}#main_results div#results.only_template_images #urls{margin:0;display:flex;flex-wrap:wrap}#main_results div#results.only_template_images #urls:after{flex-grow:10;content:""}#main_results div#results.only_template_images #backToTop{left:auto;right:1rem}#main_results div#results.only_template_images #pagination{margin-right:4rem}@media screen and (max-width: 50em){#links_on_top span{display:none}.page_with_header{margin:2rem .5rem;width:auto}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:left;max-width:10em;margin:.5em .5em .5em 0}#sidebar{margin:0 .5rem .125rem;padding:0;float:none;border:none;width:auto}#sidebar input{border:0}.result .thumbnail{max-width:98%}.result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.result .engines{float:right;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:3px 0 0}.result-images{border-bottom:none!important}.image_result,.image_result img{max-width:98%}#backToTop{display:none}#pagination{margin:2rem 0 0!important}#main_results div#results{margin:0 auto;justify-content:center;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 45rem;gap:0}html{background-color:var(--color-base-background-mobile)}#main_results div#results{grid-template-columns:100%;margin:0 auto}#links_on_top{top:1.4rem;right:10px}#main_index #links_on_top{top:.5rem;right:.5rem}#results{margin:0;padding:0}#pagination{margin:2rem 1rem 0!important}article[data-vim-selected]{border:1px solid var(--color-result-vim-arrow);border-radius:10px}.result{background:var(--color-result-background);border:1px solid var(--color-result-background);margin:1rem 2%;width:96%;border-radius:10px}.result-images{margin:0;height:10rem;background:var(--color-base-background-mobile);width:unset}.infobox{border:none!important;background-color:var(--color-sidebar-background)}.numbered_pagination{display:none}.result-paper .attributes,.result-packages .attributes,.result-paper .attributes div,.result-packages .attributes div{display:block}.result-paper .attributes div span,.result-packages .attributes div span{display:inline}.result-paper .attributes div span:first-child,.result-packages .attributes div span:first-child{font-weight:700}.result-paper .attributes div span:nth-child(2),.result-packages .attributes div span:nth-child(2){margin-left:.5rem}}@media screen and (max-width: 35em){.result-videos img.thumbnail{float:none!important}.result-videos .content{overflow:inherit}}pre code{white-space:pre-wrap}#main_results .result-keyvalue caption{padding:.8rem .5rem;font-style:italic;caption-side:bottom;background-color:var(--color-result-keyvalue-table)}#main_results .result-keyvalue .col-key{width:25%}#main_results .result-keyvalue table{word-break:break-word;table-layout:fixed;width:100%;background-color:var(--color-result-keyvalue-table)}#main_results .result-keyvalue tr.odd{background-color:var(--color-result-keyvalue-odd)}#main_results .result-keyvalue tr.even{background-color:var(--color-result-keyvalue-even)}#main_results .result-keyvalue th,#main_results .result-keyvalue td{padding:.3rem .5rem} +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}:root{--color-base-font: #444;--color-base-font-rgb: 68, 68, 68;--color-base-background: #fff;--color-base-background-mobile: #f2f5f8;--color-url-font: #334999;--color-url-visited-font: #9822c3;--color-header-background: #fdfbff;--color-header-border: #ddd;--color-footer-background: #fdfbff;--color-footer-border: #ddd;--color-sidebar-border: #ddd;--color-sidebar-font: #000;--color-sidebar-background: #fff;--color-backtotop-font: #444;--color-backtotop-border: #ddd;--color-backtotop-background: #fff;--color-btn-background: #3050ff;--color-btn-font: #fff;--color-show-btn-background: #bbb;--color-show-btn-font: #000;--color-search-border: #bbb;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #fff;--color-search-font: #222;--color-search-background-hover: #3050ff;--color-error: #db3434;--color-error-background: #fae1e1;--color-warning: #dbba34;--color-warning-background: #faf5e1;--color-success: #42db34;--color-success-background: #e3fae1;--color-categories-item-selected-font: #3050ff;--color-categories-item-border-selected: #3050ff;--color-autocomplete-font: #000;--color-autocomplete-border: #bbb;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #fff;--color-autocomplete-background-hover: #e3e3e3;--color-answer-font: #444;--color-answer-background: #fff;--color-result-keyvalue-col-table: #fdfbff;--color-result-keyvalue-odd: #fdfbff;--color-result-keyvalue-even: #fff;--color-result-background: #fff;--color-result-border: #ddd;--color-result-url-font: #000;--color-result-vim-selected: #f7f7f7;--color-result-vim-arrow: #000bbb;--color-result-description-highlight-font: #000;--color-result-link-font: #000bbb;--color-result-link-font-highlight: #000bbb;--color-result-link-visited-font: #9822c3;--color-result-publishdate-font: #777;--color-result-engines-font: #545454;--color-result-search-url-border: #ddd;--color-result-search-url-font: #000;--color-result-image-span-font: #444;--color-result-image-span-font-selected: #fff;--color-result-image-background: #fff;--color-settings-tr-hover: #ebebeb;--color-settings-engine-description-font: #545454;--color-settings-table-group-background: #0001;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #242424;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #545454;--color-toolkit-kbd-font: #fff;--color-toolkit-kbd-background: #000;--color-toolkit-dialog-border: #ddd;--color-toolkit-dialog-background: #fff;--color-toolkit-tabs-label-border: #fff;--color-toolkit-tabs-section-border: #ddd;--color-toolkit-select-background: #e1e1e1;--color-toolkit-select-border: #ddd;--color-toolkit-select-background-hover: #bbb;--color-toolkit-input-text-font: #222;--color-toolkit-checkbox-onoff-off-background: #ddd;--color-toolkit-checkbox-onoff-on-background: #ddd;--color-toolkit-checkbox-onoff-on-mark-background: #3050ff;--color-toolkit-checkbox-onoff-on-mark-color: #fff;--color-toolkit-checkbox-onoff-off-mark-background: #aaa;--color-toolkit-checkbox-onoff-off-mark-color: #fff;--color-toolkit-checkbox-label-background: #ddd;--color-toolkit-checkbox-label-border: #ddd;--color-toolkit-checkbox-input-border: #3050ff;--color-toolkit-engine-tooltip-border: #ddd;--color-toolkit-engine-tooltip-background: #fff;--color-toolkit-loader-border: rgba(0, 0, 0, .2);--color-toolkit-loader-borderleft: rgba(255, 255, 255, 0);--color-doc-code: #003;--color-doc-code-background: #ddeaff;--color-bar-chart-primary: #5bc0de;--color-bar-chart-secondary: #deb15b;--color-image-resolution-background: rgba(0, 0, 0, .5);--color-image-resolution-font: #fff;--color-loading-indicator: rgba(255, 255, 255, .2);--color-loading-indicator-gap: #fff;--color-line-number: #64708d;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}@media (prefers-color-scheme: dark){:root.theme-auto{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}}:root.theme-dark{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc}:root.theme-black{--color-base-font: #bbb;--color-base-font-rgb: 187, 187, 187;--color-base-background: #222428;--color-base-background-mobile: #222428;--color-url-font: #8af;--color-url-visited-font: #c09cd9;--color-header-background: #1e1e22;--color-header-border: #333;--color-footer-background: #1e1e22;--color-footer-border: #333;--color-sidebar-border: #555;--color-sidebar-font: #fff;--color-sidebar-background: #292c34;--color-backtotop-font: #bbb;--color-backtotop-border: #333;--color-backtotop-background: #2b2e36;--color-btn-background: #58f;--color-btn-font: #222;--color-show-btn-background: #555;--color-show-btn-font: #fff;--color-search-border: #555;--color-search-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-search-background: #2b2e36;--color-search-font: #fff;--color-search-background-hover: #58f;--color-error: #f55b5b;--color-error-background: #390a0a;--color-warning: #f1d561;--color-warning-background: #39300a;--color-success: #79f56e;--color-success-background: #0e390a;--color-categories-item-selected-font: #58f;--color-categories-item-border-selected: #58f;--color-autocomplete-font: #fff;--color-autocomplete-border: #555;--color-autocomplete-shadow: 0 2px 8px rgba(34, 38, 46, .25);--color-autocomplete-background: #2b2e36;--color-autocomplete-background-hover: #1e1e22;--color-answer-font: #bbb;--color-answer-background: #26292f;--color-result-keyvalue-col-table: #1e1e22;--color-result-keyvalue-odd: #1e1e22;--color-result-keyvalue-even: #26292f;--color-result-background: #26292f;--color-result-border: #333;--color-result-url-font: #fff;--color-result-vim-selected: #1f1f23cc;--color-result-vim-arrow: #8af;--color-result-description-highlight-font: #fff;--color-result-link-font: #8af;--color-result-link-font-highlight: #8af;--color-result-link-visited-font: #c09cd9;--color-result-publishdate-font: #888;--color-result-engines-font: #a4a4a4;--color-result-search-url-border: #555;--color-result-search-url-font: #fff;--color-result-detail-font: #fff;--color-result-detail-label-font: lightgray;--color-result-detail-background: #1a1a1c;--color-result-detail-hr: #555;--color-result-detail-link: #8af;--color-result-detail-loader-border: rgba(255, 255, 255, .2);--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);--color-result-image-span-font: #bbb;--color-result-image-span-font-selected: #222;--color-result-image-background: #222;--color-settings-tr-hover: #2c2c32;--color-settings-engine-description-font: #909090;--color-settings-table-group-background: #1b1b21;--color-toolkit-badge-font: #fff;--color-toolkit-badge-background: #555;--color-toolkit-kbd-font: #000;--color-toolkit-kbd-background: #fff;--color-toolkit-dialog-border: #555;--color-toolkit-dialog-background: #1e1e22;--color-toolkit-tabs-label-border: #222;--color-toolkit-tabs-section-border: #555;--color-toolkit-select-background: #313338;--color-toolkit-select-border: #555;--color-toolkit-select-background-hover: #373b49;--color-toolkit-input-text-font: #fff;--color-toolkit-checkbox-onoff-off-background: #313338;--color-toolkit-checkbox-onoff-on-background: #313338;--color-toolkit-checkbox-onoff-on-mark-background: #58f;--color-toolkit-checkbox-onoff-on-mark-color: #222;--color-toolkit-checkbox-onoff-off-mark-background: #ddd;--color-toolkit-checkbox-onoff-off-mark-color: #222;--color-toolkit-checkbox-label-background: #222;--color-toolkit-checkbox-label-border: #333;--color-toolkit-checkbox-input-border: #58f;--color-toolkit-engine-tooltip-border: #333;--color-toolkit-engine-tooltip-background: #222;--color-toolkit-loader-border: rgba(255, 255, 255, .2);--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);--color-doc-code: #ddd;--color-doc-code-background: #4d5a6f;--color-favicon-background-color: #ddd;--color-favicon-border-color: #ccc;--color-base-background: #000;--color-base-background-mobile: #000;--color-header-background: #000;--color-footer-background: #000;--color-sidebar-background: #000}.code-highlight pre{line-height:100%}.code-highlight td.linenos .normal,.code-highlight span.linenos{color:inherit;background-color:transparent;padding-left:5px;padding-right:5px}.code-highlight td.linenos .special,.code-highlight span.linenos.special{color:#000;background-color:#ffffc0;padding-left:5px;padding-right:5px}.code-highlight .hll{background-color:#ffc}.code-highlight .c{color:#3d7b7b;font-style:italic}.code-highlight .err{border:1px solid #F00}.code-highlight .k{color:green;font-weight:700}.code-highlight .o{color:#666}.code-highlight .ch,.code-highlight .cm{color:#3d7b7b;font-style:italic}.code-highlight .cp{color:#9c6500}.code-highlight .cpf,.code-highlight .c1,.code-highlight .cs{color:#3d7b7b;font-style:italic}.code-highlight .gd{color:#a00000}.code-highlight .ge{font-style:italic}.code-highlight .ges{font-weight:700;font-style:italic}.code-highlight .gr{color:#e40000}.code-highlight .gh{color:navy;font-weight:700}.code-highlight .gi{color:#008400}.code-highlight .go{color:#717171}.code-highlight .gp{color:navy;font-weight:700}.code-highlight .gs{font-weight:700}.code-highlight .gu{color:purple;font-weight:700}.code-highlight .gt{color:#04d}.code-highlight .kc,.code-highlight .kd,.code-highlight .kn{color:green;font-weight:700}.code-highlight .kp{color:green}.code-highlight .kr{color:green;font-weight:700}.code-highlight .kt{color:#b00040}.code-highlight .m{color:#666}.code-highlight .s{color:#ba2121}.code-highlight .na{color:#687822}.code-highlight .nb{color:green}.code-highlight .nc{color:#00f;font-weight:700}.code-highlight .no{color:#800}.code-highlight .nd{color:#a2f}.code-highlight .ni{color:#717171;font-weight:700}.code-highlight .ne{color:#cb3f38;font-weight:700}.code-highlight .nf{color:#00f}.code-highlight .nl{color:#767600}.code-highlight .nn{color:#00f;font-weight:700}.code-highlight .nt{color:green;font-weight:700}.code-highlight .nv{color:#19177c}.code-highlight .ow{color:#a2f;font-weight:700}.code-highlight .w{color:#bbb}.code-highlight .mb,.code-highlight .mf,.code-highlight .mh,.code-highlight .mi,.code-highlight .mo{color:#666}.code-highlight .sa,.code-highlight .sb,.code-highlight .sc,.code-highlight .dl{color:#ba2121}.code-highlight .sd{color:#ba2121;font-style:italic}.code-highlight .s2{color:#ba2121}.code-highlight .se{color:#aa5d1f;font-weight:700}.code-highlight .sh{color:#ba2121}.code-highlight .si{color:#a45a77;font-weight:700}.code-highlight .sx{color:green}.code-highlight .sr{color:#a45a77}.code-highlight .s1{color:#ba2121}.code-highlight .ss{color:#19177c}.code-highlight .bp{color:green}.code-highlight .fm{color:#00f}.code-highlight .vc,.code-highlight .vg,.code-highlight .vi,.code-highlight .vm{color:#19177c}.code-highlight .il{color:#666}.codelines{margin:.125rem 0 0;padding:1rem 0 0}.code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}.code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}.code-highlight .linenos::selection{background:transparent}.code-highlight .linenos::-moz-selection{background:transparent}.code-highlight span.linenos{color:var(--color-line-number)}@media (prefers-color-scheme: dark){:root.theme-auto .code-highlight pre{line-height:100%}:root.theme-auto .code-highlight td.linenos .normal{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight span.linenos{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight td.linenos .special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight span.linenos.special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-auto .code-highlight .hll{background-color:#6e7681}:root.theme-auto .code-highlight .c{color:#7e8aa1}:root.theme-auto .code-highlight .err{color:#f88f7f}:root.theme-auto .code-highlight .esc{color:#d4d2c8}:root.theme-auto .code-highlight .g{color:#d4d2c8}:root.theme-auto .code-highlight .k{color:#ffad66}:root.theme-auto .code-highlight .l{color:#d5ff80}:root.theme-auto .code-highlight .n{color:#d4d2c8}:root.theme-auto .code-highlight .o{color:#ffad66}:root.theme-auto .code-highlight .x{color:#d4d2c8}:root.theme-auto .code-highlight .p{color:#d4d2c8}:root.theme-auto .code-highlight .ch{color:#f88f7f;font-style:italic}:root.theme-auto .code-highlight .cm{color:#7e8aa1}:root.theme-auto .code-highlight .cp{color:#ffad66;font-weight:700}:root.theme-auto .code-highlight .cpf{color:#7e8aa1}:root.theme-auto .code-highlight .c1{color:#7e8aa1}:root.theme-auto .code-highlight .cs{color:#7e8aa1;font-style:italic}:root.theme-auto .code-highlight .gd{color:#f88f7f;background-color:#3d1e20}:root.theme-auto .code-highlight .ge{color:#d4d2c8;font-style:italic}:root.theme-auto .code-highlight .ges{color:#d4d2c8}:root.theme-auto .code-highlight .gr{color:#f88f7f}:root.theme-auto .code-highlight .gh{color:#d4d2c8}:root.theme-auto .code-highlight .gi{color:#6ad4af;background-color:#19362c}:root.theme-auto .code-highlight .go{color:#7e8aa1}:root.theme-auto .code-highlight .gp{color:#d4d2c8}:root.theme-auto .code-highlight .gs{color:#d4d2c8;font-weight:700}:root.theme-auto .code-highlight .gu{color:#d4d2c8}:root.theme-auto .code-highlight .gt{color:#f88f7f}:root.theme-auto .code-highlight .kc{color:#ffad66}:root.theme-auto .code-highlight .kd{color:#ffad66}:root.theme-auto .code-highlight .kn{color:#ffad66}:root.theme-auto .code-highlight .kp{color:#ffad66}:root.theme-auto .code-highlight .kr{color:#ffad66}:root.theme-auto .code-highlight .kt{color:#73d0ff}:root.theme-auto .code-highlight .ld{color:#d5ff80}:root.theme-auto .code-highlight .m{color:#dfbfff}:root.theme-auto .code-highlight .s{color:#d5ff80}:root.theme-auto .code-highlight .na{color:#ffd173}:root.theme-auto .code-highlight .nb{color:#ffd173}:root.theme-auto .code-highlight .nc{color:#73d0ff}:root.theme-auto .code-highlight .no{color:#ffd173}:root.theme-auto .code-highlight .nd{color:#7e8aa1;font-weight:700;font-style:italic}:root.theme-auto .code-highlight .ni{color:#95e6cb}:root.theme-auto .code-highlight .ne{color:#73d0ff}:root.theme-auto .code-highlight .nf{color:#ffd173}:root.theme-auto .code-highlight .nl{color:#d4d2c8}:root.theme-auto .code-highlight .nn{color:#d4d2c8}:root.theme-auto .code-highlight .nx{color:#d4d2c8}:root.theme-auto .code-highlight .py{color:#ffd173}:root.theme-auto .code-highlight .nt{color:#5ccfe6}:root.theme-auto .code-highlight .nv{color:#d4d2c8}:root.theme-auto .code-highlight .ow{color:#ffad66}:root.theme-auto .code-highlight .pm{color:#d4d2c8}:root.theme-auto .code-highlight .w{color:#d4d2c8}:root.theme-auto .code-highlight .mb{color:#dfbfff}:root.theme-auto .code-highlight .mf{color:#dfbfff}:root.theme-auto .code-highlight .mh{color:#dfbfff}:root.theme-auto .code-highlight .mi{color:#dfbfff}:root.theme-auto .code-highlight .mo{color:#dfbfff}:root.theme-auto .code-highlight .sa{color:#f29e74}:root.theme-auto .code-highlight .sb{color:#d5ff80}:root.theme-auto .code-highlight .sc{color:#d5ff80}:root.theme-auto .code-highlight .dl{color:#d5ff80}:root.theme-auto .code-highlight .sd{color:#7e8aa1}:root.theme-auto .code-highlight .s2{color:#d5ff80}:root.theme-auto .code-highlight .se{color:#95e6cb}:root.theme-auto .code-highlight .sh{color:#d5ff80}:root.theme-auto .code-highlight .si{color:#95e6cb}:root.theme-auto .code-highlight .sx{color:#95e6cb}:root.theme-auto .code-highlight .sr{color:#95e6cb}:root.theme-auto .code-highlight .s1{color:#d5ff80}:root.theme-auto .code-highlight .ss{color:#dfbfff}:root.theme-auto .code-highlight .bp{color:#5ccfe6}:root.theme-auto .code-highlight .fm{color:#ffd173}:root.theme-auto .code-highlight .vc{color:#d4d2c8}:root.theme-auto .code-highlight .vg{color:#d4d2c8}:root.theme-auto .code-highlight .vi{color:#d4d2c8}:root.theme-auto .code-highlight .vm{color:#d4d2c8}:root.theme-auto .code-highlight .il{color:#dfbfff}:root.theme-auto .code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}:root.theme-auto .code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}:root.theme-auto .code-highlight .linenos::selection{background:transparent}:root.theme-auto .code-highlight .linenos::-moz-selection{background:transparent}:root.theme-auto .code-highlight span.linenos{color:var(--color-line-number)}}:root.theme-dark .code-highlight pre{line-height:100%}:root.theme-dark .code-highlight td.linenos .normal{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight span.linenos{color:#3c4354;background-color:transparent;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight td.linenos .special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight span.linenos.special{color:#3c4354;background-color:#ffffc0;padding-left:5px;padding-right:5px}:root.theme-dark .code-highlight .hll{background-color:#6e7681}:root.theme-dark .code-highlight .c{color:#7e8aa1}:root.theme-dark .code-highlight .err{color:#f88f7f}:root.theme-dark .code-highlight .esc{color:#d4d2c8}:root.theme-dark .code-highlight .g{color:#d4d2c8}:root.theme-dark .code-highlight .k{color:#ffad66}:root.theme-dark .code-highlight .l{color:#d5ff80}:root.theme-dark .code-highlight .n{color:#d4d2c8}:root.theme-dark .code-highlight .o{color:#ffad66}:root.theme-dark .code-highlight .x{color:#d4d2c8}:root.theme-dark .code-highlight .p{color:#d4d2c8}:root.theme-dark .code-highlight .ch{color:#f88f7f;font-style:italic}:root.theme-dark .code-highlight .cm{color:#7e8aa1}:root.theme-dark .code-highlight .cp{color:#ffad66;font-weight:700}:root.theme-dark .code-highlight .cpf{color:#7e8aa1}:root.theme-dark .code-highlight .c1{color:#7e8aa1}:root.theme-dark .code-highlight .cs{color:#7e8aa1;font-style:italic}:root.theme-dark .code-highlight .gd{color:#f88f7f;background-color:#3d1e20}:root.theme-dark .code-highlight .ge{color:#d4d2c8;font-style:italic}:root.theme-dark .code-highlight .ges{color:#d4d2c8}:root.theme-dark .code-highlight .gr{color:#f88f7f}:root.theme-dark .code-highlight .gh{color:#d4d2c8}:root.theme-dark .code-highlight .gi{color:#6ad4af;background-color:#19362c}:root.theme-dark .code-highlight .go{color:#7e8aa1}:root.theme-dark .code-highlight .gp{color:#d4d2c8}:root.theme-dark .code-highlight .gs{color:#d4d2c8;font-weight:700}:root.theme-dark .code-highlight .gu{color:#d4d2c8}:root.theme-dark .code-highlight .gt{color:#f88f7f}:root.theme-dark .code-highlight .kc{color:#ffad66}:root.theme-dark .code-highlight .kd{color:#ffad66}:root.theme-dark .code-highlight .kn{color:#ffad66}:root.theme-dark .code-highlight .kp{color:#ffad66}:root.theme-dark .code-highlight .kr{color:#ffad66}:root.theme-dark .code-highlight .kt{color:#73d0ff}:root.theme-dark .code-highlight .ld{color:#d5ff80}:root.theme-dark .code-highlight .m{color:#dfbfff}:root.theme-dark .code-highlight .s{color:#d5ff80}:root.theme-dark .code-highlight .na{color:#ffd173}:root.theme-dark .code-highlight .nb{color:#ffd173}:root.theme-dark .code-highlight .nc{color:#73d0ff}:root.theme-dark .code-highlight .no{color:#ffd173}:root.theme-dark .code-highlight .nd{color:#7e8aa1;font-weight:700;font-style:italic}:root.theme-dark .code-highlight .ni{color:#95e6cb}:root.theme-dark .code-highlight .ne{color:#73d0ff}:root.theme-dark .code-highlight .nf{color:#ffd173}:root.theme-dark .code-highlight .nl{color:#d4d2c8}:root.theme-dark .code-highlight .nn{color:#d4d2c8}:root.theme-dark .code-highlight .nx{color:#d4d2c8}:root.theme-dark .code-highlight .py{color:#ffd173}:root.theme-dark .code-highlight .nt{color:#5ccfe6}:root.theme-dark .code-highlight .nv{color:#d4d2c8}:root.theme-dark .code-highlight .ow{color:#ffad66}:root.theme-dark .code-highlight .pm{color:#d4d2c8}:root.theme-dark .code-highlight .w{color:#d4d2c8}:root.theme-dark .code-highlight .mb{color:#dfbfff}:root.theme-dark .code-highlight .mf{color:#dfbfff}:root.theme-dark .code-highlight .mh{color:#dfbfff}:root.theme-dark .code-highlight .mi{color:#dfbfff}:root.theme-dark .code-highlight .mo{color:#dfbfff}:root.theme-dark .code-highlight .sa{color:#f29e74}:root.theme-dark .code-highlight .sb{color:#d5ff80}:root.theme-dark .code-highlight .sc{color:#d5ff80}:root.theme-dark .code-highlight .dl{color:#d5ff80}:root.theme-dark .code-highlight .sd{color:#7e8aa1}:root.theme-dark .code-highlight .s2{color:#d5ff80}:root.theme-dark .code-highlight .se{color:#95e6cb}:root.theme-dark .code-highlight .sh{color:#d5ff80}:root.theme-dark .code-highlight .si{color:#95e6cb}:root.theme-dark .code-highlight .sx{color:#95e6cb}:root.theme-dark .code-highlight .sr{color:#95e6cb}:root.theme-dark .code-highlight .s1{color:#d5ff80}:root.theme-dark .code-highlight .ss{color:#dfbfff}:root.theme-dark .code-highlight .bp{color:#5ccfe6}:root.theme-dark .code-highlight .fm{color:#ffd173}:root.theme-dark .code-highlight .vc{color:#d4d2c8}:root.theme-dark .code-highlight .vg{color:#d4d2c8}:root.theme-dark .code-highlight .vi{color:#d4d2c8}:root.theme-dark .code-highlight .vm{color:#d4d2c8}:root.theme-dark .code-highlight .il{color:#dfbfff}:root.theme-dark .code-highlight pre{overflow:auto;margin:0;padding:0 0 .75rem}:root.theme-dark .code-highlight .linenos{-webkit-user-select:none;user-select:none;cursor:default;margin-right:8px;text-align:right}:root.theme-dark .code-highlight .linenos::selection{background:transparent}:root.theme-dark .code-highlight .linenos::-moz-selection{background:transparent}:root.theme-dark .code-highlight span.linenos{color:var(--color-line-number)}html.no-js .hide_if_nojs,html.js .show_if_nojs{display:none}.center{text-align:center}.right{float:right}.left{float:left}.invisible{display:none!important}.list-unstyled{list-style-type:none}.list-unstyled li{margin-top:4px;margin-bottom:4px}.danger{background-color:var(--color-error-background)}.warning{background:var(--color-warning-background)}.success{background:var(--color-success-background)}.badge{display:inline-block;color:var(--color-toolkit-badge-font);background-color:var(--color-toolkit-badge-background);text-align:center;white-space:nowrap;vertical-align:baseline;min-width:10px;padding:1px 5px;border-radius:5px}kbd{padding:2px 4px;margin:1px;font-size:90%;color:var(--color-toolkit-kbd-font);background:var(--color-toolkit-kbd-background)}table{width:100%}table.striped tr{border-bottom:1px solid var(--color-settings-tr-hover)}th{padding:.4em}td{padding:0 4px}tr:hover{background:var(--color-settings-tr-hover)!important}div.selectable_url{display:block;border:1px solid var(--color-result-search-url-border);padding:4px;color:var(--color-result-search-url-font);margin:.1em;overflow:hidden;height:1.2em;line-height:1.2em;border-radius:5px}div.selectable_url pre{display:block;font-size:.8em;word-break:break-all;margin:.1em;-webkit-user-select:all;user-select:all}.dialog-error{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:left;border-radius:10px;color:var(--color-error);background:var(--color-error-background);border-color:var(--color-error)}.dialog-error .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error ul,.dialog-error ol,.dialog-error p{margin:1px 0 0}.dialog-error table{width:auto}.dialog-error tr{vertical-align:text-top}.dialog-error tr:hover{background:transparent!important}.dialog-error td{padding:0 1em 0 0;padding-right:1rem;padding-bottom:0;padding-left:0}.dialog-error h4{margin-top:.3em;margin-bottom:.3em}.dialog-error-block{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:left;border-radius:10px;display:block;color:var(--color-error);background:var(--color-error-background);border-color:var(--color-error)}.dialog-error-block .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error-block ul,.dialog-error-block ol,.dialog-error-block p{margin:1px 0 0}.dialog-error-block table{width:auto}.dialog-error-block tr{vertical-align:text-top}.dialog-error-block tr:hover{background:transparent!important}.dialog-error-block td{padding:0 1em 0 0;padding-right:1rem;padding-bottom:0;padding-left:0}.dialog-error-block h4{margin-top:.3em;margin-bottom:.3em}.dialog-warning{position:relative;display:flex;padding:1rem;margin:0 0 1em;border:1px solid var(--color-toolkit-dialog-border);text-align:left;border-radius:10px;color:var(--color-warning);background:var(--color-warning-background);border-color:var(--color-warning)}.dialog-warning .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-warning ul,.dialog-warning ol,.dialog-warning p{margin:1px 0 0}.dialog-warning table{width:auto}.dialog-warning tr{vertical-align:text-top}.dialog-warning tr:hover{background:transparent!important}.dialog-warning td{padding:0 1em 0 0;padding-right:1rem;padding-bottom:0;padding-left:0}.dialog-warning h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal{position:relative;display:flex;padding:1rem;border:1px solid var(--color-toolkit-dialog-border);text-align:left;border-radius:10px;display:block;background:var(--color-toolkit-dialog-background);position:fixed;top:50%;left:50%;margin:0 auto;transform:translate(-50%,-50%);z-index:5000}.dialog-modal .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-modal ul,.dialog-modal ol,.dialog-modal p{margin:1px 0 0}.dialog-modal table{width:auto}.dialog-modal tr{vertical-align:text-top}.dialog-modal tr:hover{background:transparent!important}.dialog-modal td{padding:0 1em 0 0;padding-right:1rem;padding-bottom:0;padding-left:0}.dialog-modal h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal h3{margin-top:0}.btn-collapse{cursor:pointer}.scrollx{overflow:auto hidden;display:block;padding:0;margin:0;border:none}.tabs .tabs>label{font-size:90%}ul.tabs{border-bottom:1px solid var(--color-toolkit-tabs-section-border);list-style:none;padding-left:0}ul.tabs li{display:flex}.tabs{display:flex;flex-wrap:wrap;width:100%;min-width:100%}.tabs>*{order:2}.tabs>input[type=radio]{display:none}.tabs>label,.tabs>li>a{order:1;padding:.7em;margin:0 .7em;letter-spacing:.5px;text-transform:uppercase;border:solid var(--color-toolkit-tabs-label-border);border-width:0 0 2px 0;color:unset;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:pointer}.tabs>label.active,.tabs>li>a.active{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font)}.tabs>label:hover,.tabs>li>a:hover{border-bottom:2px solid var(--color-categories-item-border-selected)}.tabs>section{min-width:100%;padding:.7rem 0;box-sizing:border-box;border-top:1px solid var(--color-toolkit-tabs-section-border);display:none}.tabs>label:last-of-type{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font);letter-spacing:-.1px}.tabs>section:last-of-type{display:block}html body .tabs>input:checked~section{display:none}html body .tabs>input:checked~label{position:inherited;background:inherit;border-bottom:2px solid transparent;font-weight:400;color:inherit}html body .tabs>input:checked~label:hover{border-bottom:2px solid var(--color-categories-item-border-selected)}html body .tabs>input:checked+label{border-bottom:2px solid var(--color-categories-item-border-selected);background:var(--color-categories-item-selected);color:var(--color-categories-item-selected-font)}html body .tabs>input:checked+label+section{display:block}select{height:2.4rem;margin-top:0;margin-right:1rem;margin-bottom:0;margin-left:0;padding:.2rem!important;color:var(--color-search-font);font-size:.9rem;z-index:100}select:hover,select:focus{cursor:pointer}@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))){select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border-width:0 2rem 0 0;border-color:transparent;background:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E) no-repeat;background-position-x:calc(100% + 2rem);background-size:2rem;background-origin:content-box;background-color:var(--color-toolkit-select-background);outline:medium none;text-overflow:ellipsis;border-radius:5px}select:hover,select:focus{background-color:var(--color-toolkit-select-background-hover)}select option{background-color:var(--color-base-background)}@media (prefers-color-scheme: dark){html.theme-auto select,html.theme-dark select{background-image:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20fill%3D%22%23ddd%22%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E)}}html.theme-dark select{background-image:url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22512%22%20viewBox%3D%220%200%20512%20512%22%3E%0A%3Cg%3E%3Cpolygon%20fill%3D%22%23ddd%22%20points%3D%22128%2C192%20256%2C320%20384%2C192%22%2F%3E%3C%2Fg%3E%0A%3C%2Fsvg%3E)}}input.checkbox-onoff[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;display:inline-block;width:2.5em;height:.7em;box-shadow:none!important;margin:0 16px;border-radius:10px;position:relative}input.checkbox-onoff[type=checkbox]:focus,input.checkbox-onoff[type=checkbox]:hover{outline:none}input.checkbox-onoff[type=checkbox]:focus:after{content:"";position:absolute;width:3.5em;height:1.65em;border:1px solid var(--color-btn-background);border-radius:12px;box-shadow:var(--color-btn-background) 0 0 3px;z-index:1200;top:-.55em;left:-.6em}input.checkbox-onoff[type=checkbox]:before{position:absolute;top:-.5em;display:flex;justify-content:center;align-items:center;font-size:.75em;width:1.875em;height:1.875em;border-radius:50%}input.checkbox-onoff[type=checkbox],input.checkbox-onoff.reversed-checkbox[type=checkbox]:checked{background:var(--color-toolkit-checkbox-onoff-off-background)}input.checkbox-onoff[type=checkbox]:before,input.checkbox-onoff.reversed-checkbox[type=checkbox]:checked:before{left:-.5em;content:"✕";color:var(--color-toolkit-checkbox-onoff-off-mark-color);background:var(--color-toolkit-checkbox-onoff-off-mark-background)}input.checkbox-onoff[type=checkbox]:checked,input.checkbox-onoff.reversed-checkbox[type=checkbox]{background:var(--color-toolkit-checkbox-onoff-on-background)}input.checkbox-onoff[type=checkbox]:checked:before,input.checkbox-onoff.reversed-checkbox[type=checkbox]:before{left:calc(100% - 1.5em);content:"✓";color:var(--color-toolkit-checkbox-onoff-on-mark-color);background:var(--color-toolkit-checkbox-onoff-on-mark-background)}@supports (transform: rotate(-45deg)){input[type=checkbox]:not(.checkbox-onoff){-webkit-appearance:none;-moz-appearance:none;appearance:none;width:20px;height:20px;cursor:pointer;position:relative;top:0;left:0;border:2px solid var(--color-toolkit-checkbox-input-border);border-radius:.3em}input[type=checkbox]:not(.checkbox-onoff):after{content:"";width:9px;height:5px;position:absolute;top:3px;left:2px;border:3px solid var(--color-toolkit-checkbox-label-border);border-top:none;border-right:none;background:transparent;opacity:0;transform:rotate(-45deg)}input[type=checkbox]:not(.checkbox-onoff):checked:after{border-color:var(--color-toolkit-checkbox-input-border);opacity:1}input[type=checkbox][disabled]:not(.checkbox-onoff){border:inherit;background-color:transparent!important;cursor:inherit}input.checkbox[type=checkbox]:not(:checked,[disabled],.checkbox-onoff):hover:after{opacity:.5}}@media screen and (max-width: 50em){.tabs>label{width:100%}}.loader,.loader:after{border-radius:50%;width:2em;height:2em}.loader{margin:1em auto;font-size:10px;position:relative;text-indent:-9999em;border-top:.5em solid var(--color-toolkit-loader-border);border-right:.5em solid var(--color-toolkit-loader-border);border-bottom:.5em solid var(--color-toolkit-loader-border);border-left:.5em solid var(--color-toolkit-loader-borderleft);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.2s infinite linear;animation:load8 1.2s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.engine-tooltip{display:none;position:absolute;padding:.5rem 1rem;margin:0 0 0 2rem;border:1px solid var(--color-toolkit-engine-tooltip-border);background:var(--color-toolkit-engine-tooltip-background);font-size:14px;font-weight:400;z-index:5000;text-align:left;border-radius:10px}th:hover .engine-tooltip,td:hover .engine-tooltip,.engine-tooltip:hover{display:inline-block}.stacked-bar-chart{margin:0;padding:0 .125rem 0 4rem;width:100%;width:-moz-available;width:-webkit-fill-available;width:fill;flex-flow:row nowrap;align-items:center;display:inline-flex}.stacked-bar-chart-value{width:3rem;display:inline-block;position:absolute;padding:0 .5rem;text-align:right}.stacked-bar-chart-base{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset}.stacked-bar-chart-median{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:var(--color-base-font);border:1px solid rgba(var(--color-base-font-rgb),.9);padding:.3rem 0}.stacked-bar-chart-rate80{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border:1px solid rgba(var(--color-base-font-rgb),.3);padding:.3rem 0}.stacked-bar-chart-rate95{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border-bottom:1px dotted rgba(var(--color-base-font-rgb),.5);padding:0}.stacked-bar-chart-rate100{display:flex;flex-shrink:0;flex-grow:0;flex-basis:unset;background:transparent;border-left:1px solid rgba(var(--color-base-font-rgb),.9);padding:.4rem 0;width:1px}/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */.autocomplete{position:absolute;width:44rem;max-width:calc(100% - 1rem);max-height:0;overflow-y:hidden;text-align:left;border-radius:10px}.autocomplete:active,.autocomplete:focus,.autocomplete:hover{background-color:var(--color-autocomplete-background)}.autocomplete:empty{display:none}.autocomplete>ul{list-style-type:none;margin:0;padding:0}.autocomplete>ul>li{cursor:pointer;padding:.5rem 1rem}.autocomplete>ul>li.active,.autocomplete>ul>li:active,.autocomplete>ul>li:focus,.autocomplete>ul>li:hover{background-color:var(--color-autocomplete-background-hover)}.autocomplete>ul>li.active a:active,.autocomplete>ul>li:active a:active,.autocomplete>ul>li:focus a:active,.autocomplete>ul>li:hover a:active,.autocomplete>ul>li.active a:focus,.autocomplete>ul>li:active a:focus,.autocomplete>ul>li:focus a:focus,.autocomplete>ul>li:hover a:focus,.autocomplete>ul>li.active a:hover,.autocomplete>ul>li:active a:hover,.autocomplete>ul>li:focus a:hover,.autocomplete>ul>li:hover a:hover{text-decoration:none}.autocomplete>ul>li.locked{cursor:inherit}.autocomplete.open{display:block;background-color:var(--color-autocomplete-background);color:var(--color-autocomplete-font);max-height:32rem;overflow-y:auto;z-index:5000;margin-top:3.5rem;border-radius:.8rem}.autocomplete.open:empty{display:none}@media screen and (max-width: 50em){.autocomplete>ul>li{padding:1rem}}#main_results #results.image-detail-open.only_template_images{width:min(98%,59.25rem)!important}#main_results #results.only_template_images.image-detail-open #backToTop{left:56.75rem!important;right:inherit}article.result-images .detail{display:none}#results.image-detail-open article.result-images[data-vim-selected] .detail{display:flex;flex-direction:column;position:fixed;left:60rem;right:0;top:13rem;transition:top 64ms ease-in 0s;bottom:0;background:var(--color-result-detail-background);border:1px solid var(--color-result-detail-background);z-index:1000;padding:4rem 3rem 3rem;overflow-y:scroll}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source{display:block;flex:1;text-align:left;width:100%;border:none;text-decoration:none}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{padding:0;margin:0;border:none;object-fit:contain;width:inherit;height:inherit;max-width:100%;min-height:inherit;max-height:calc(100vh - 42rem);background:inherit}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels{color:var(--color-result-detail-font);height:19rem}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels hr{border-top:1px solid var(--color-result-detail-hr);border-bottom:none}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels h4{height:2rem;overflow:hidden;text-overflow:ellipsis;font-size:.9rem;margin-bottom:0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p{color:var(--color-result-detail-label-font);font-size:.9rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:.8rem 0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p span{display:inline-block;width:12rem}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels h4,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a{text-align:left}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-content{height:2rem;line-height:unset;overflow:hidden;text-overflow:ellipsis}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url{white-space:nowrap;overflow:hidden hidden;text-overflow:ellipsis}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-content:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p.result-url:hover{position:relative;overflow:inherit!important;background:var(--color-result-detail-background);text-overflow:inherit!important}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:active{color:var(--color-result-detail-link)}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels a:hover{text-decoration:underline}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close{top:1rem;left:1rem;padding:.4rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous{top:1rem;right:6rem;padding:.4rem .5rem .4rem .3rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next{top:1rem;right:2rem;padding:.4rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous{border-radius:50%;display:block;width:1.5rem;height:1.5rem;position:absolute;filter:opacity(40%);z-index:1200}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close span,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next span,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous span{display:block;width:1.5rem;height:1.5rem;text-align:center}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next span:before,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous span:before{vertical-align:sub}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:active,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:active,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:visited,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:active{color:var(--color-result-detail-font);background:var(--color-result-detail-background);border:1px solid var(--color-result-detail-font)}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-close:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-previous:hover,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:focus,#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next:hover{filter:opacity(80%)}#results.image-detail-open article.result-images[data-vim-selected] .detail .loader{position:absolute;top:1rem;right:50%;border-top:.5em solid var(--color-result-detail-loader-border);border-right:.5em solid var(--color-result-detail-loader-border);border-bottom:.5em solid var(--color-result-detail-loader-border);border-left:.5em solid var(--color-result-detail-loader-borderleft)}#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail{top:0}#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail a.result-images-source img{max-height:calc(100vh - 25rem)}@media screen and (max-width: 79.75em){#results.image-detail-open article.result-images[data-vim-selected] .detail{top:0;left:0}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source{display:flex;flex-direction:column;justify-content:center}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{width:100%;max-height:calc(100vh - 24rem)}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-detail-next{right:1rem}}@media screen and (max-width: 50em){#results.image-detail-open article.result-images[data-vim-selected] .detail{top:0;left:0;padding:1rem}#results.image-detail-open article.result-images[data-vim-selected] .detail a.result-images-source img{width:100%;max-height:calc(100vh - 20rem);margin:0}#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p span{width:inherit;margin-right:1rem}}.dialog-modal{animation-name:dialogmodal;animation-duration:.13s}@keyframes dialogmodal{0%{opacity:0}50%{opacity:.5;transform:translate(-50%,-50%) scale(1.05)}}input.checkbox-onoff[type=checkbox]:before{transition:left .25s}iframe[src^="https://w.soundcloud.com"]{height:120px}iframe[src^="https://www.deezer.com"]{height:94px}iframe[src^="https://www.mixcloud.com"]{height:250px}iframe[src^="https://bandcamp.com/EmbeddedPlayer"]{height:350px}iframe[src^="https://bandcamp.com/EmbeddedPlayer/track"]{height:120px}iframe[src^="https://genius.com/songs"]{height:65px}.info-page code{font-family:monospace;border-radius:5px;background-color:var(--color-doc-code-background);color:var(--color-doc-code);padding:.2rem;border:0 none}.stats_endpoint .github-issue-button{display:block;font-size:16px}.stats_endpoint .issue-hide{display:none}.stats_endpoint input[type=checked]{position:absolute}.stats_endpoint label{margin:1rem 1rem 1rem 0}.stats_endpoint .step_content{margin:1rem 1rem 1rem 2rem}.stats_endpoint .step1,.stats_endpoint .step2{visibility:hidden}.stats_endpoint .step1_delay{transition:visibility 0s linear 4s}.stats_endpoint #step1:checked~.step1,.stats_endpoint #step2:checked~.step2{visibility:visible}.engine-stats{border-spacing:0;border-collapse:collapse}.engine-stats tr td,.engine-stats tr th{border-bottom:1px solid var(--color-result-border);padding:.25rem}.engine-stats table.engine-tooltip{border-spacing:0;border-collapse:collapse}.engine-stats table.engine-tooltip td,.engine-stats table.engine-tooltip th{border:none}.engine-stats .engine-name{width:20rem}.engine-stats .engine-score{width:7rem;text-align:right}.engine-stats .engine-reliability{text-align:right}table.engine-error th.engine-error-type,table.engine-error td.engine-error-type,failed-test{width:10rem}.engine-errors{margin-top:3rem}.engine-errors table.engine-error{max-width:1280px;margin:1rem 0 3rem;border:1px solid var(--color-result-border);text-align:left}.engine-errors table.engine-error tr th,.engine-errors table.engine-error tr td{padding:.5rem}.engine-errors table.engine-error span.log_parameters{border-right:1px solid solid var(--color-result-border);padding:0 1rem 0 0;margin:0 0 0 .5rem}.bar-chart-value{width:3em;display:inline-block;text-align:right;padding-right:.5rem}.bar-chart-graph{width:calc(100% - 5rem);display:inline-block}.bar-chart-bar{border:3px solid var(--color-bar-chart-primary);margin:1px 0}.bar-chart-serie1{border:3px solid var(--color-bar-chart-primary);margin:1px 0;float:left}.bar-chart-serie2{border:3px solid var(--color-bar-chart-secondary);margin:1px 0;float:left}.bar0{width:0;border:0}.bar1{width:1%}.bar2{width:2%}.bar3{width:3%}.bar4{width:4%}.bar5{width:5%}.bar6{width:6%}.bar7{width:7%}.bar8{width:8%}.bar9{width:9%}.bar10{width:10%}.bar11{width:11%}.bar12{width:12%}.bar13{width:13%}.bar14{width:14%}.bar15{width:15%}.bar16{width:16%}.bar17{width:17%}.bar18{width:18%}.bar19{width:19%}.bar20{width:20%}.bar21{width:21%}.bar22{width:22%}.bar23{width:23%}.bar24{width:24%}.bar25{width:25%}.bar26{width:26%}.bar27{width:27%}.bar28{width:28%}.bar29{width:29%}.bar30{width:30%}.bar31{width:31%}.bar32{width:32%}.bar33{width:33%}.bar34{width:34%}.bar35{width:35%}.bar36{width:36%}.bar37{width:37%}.bar38{width:38%}.bar39{width:39%}.bar40{width:40%}.bar41{width:41%}.bar42{width:42%}.bar43{width:43%}.bar44{width:44%}.bar45{width:45%}.bar46{width:46%}.bar47{width:47%}.bar48{width:48%}.bar49{width:49%}.bar50{width:50%}.bar51{width:51%}.bar52{width:52%}.bar53{width:53%}.bar54{width:54%}.bar55{width:55%}.bar56{width:56%}.bar57{width:57%}.bar58{width:58%}.bar59{width:59%}.bar60{width:60%}.bar61{width:61%}.bar62{width:62%}.bar63{width:63%}.bar64{width:64%}.bar65{width:65%}.bar66{width:66%}.bar67{width:67%}.bar68{width:68%}.bar69{width:69%}.bar70{width:70%}.bar71{width:71%}.bar72{width:72%}.bar73{width:73%}.bar74{width:74%}.bar75{width:75%}.bar76{width:76%}.bar77{width:77%}.bar78{width:78%}.bar79{width:79%}.bar80{width:80%}.bar81{width:81%}.bar82{width:82%}.bar83{width:83%}.bar84{width:84%}.bar85{width:85%}.bar86{width:86%}.bar87{width:87%}.bar88{width:88%}.bar89{width:89%}.bar90{width:90%}.bar91{width:91%}.bar92{width:92%}.bar93{width:93%}.bar94{width:94%}.bar95{width:95%}.bar96{width:96%}.bar97{width:97%}.bar98{width:98%}.bar99{width:99%}.bar100{width:100%}.osm-map-box{height:300px;width:100%;margin:10px 0}#main_index{margin-top:26vh}.index{text-align:center}.index .title{background:url(../img/searxng.png) no-repeat;min-height:4rem;margin:4rem auto;background-position:center;background-size:contain}.index h1{font-size:4em;visibility:hidden}.index #search,.index #search_header{margin:0 auto;background:inherit;border:inherit;padding:0;display:block}.index .search_filters{display:block;margin:1em 0}.index .category label{padding:6px 10px;border-bottom:initial!important}@media screen and (max-width: 79.75em){div.title h1{font-size:1em}#main_index{margin-top:6em}}table{border-collapse:collapse}table th,table td{text-align:center;padding:1rem .5rem;text-align:left}table tr.pref-group th{font-weight:400;text-align:left;background:var(--color-settings-table-group-background)}#main_preferences form{width:100%}#main_preferences fieldset{margin:8px;border:none}#main_preferences legend{margin:0;padding:5px 0 0;display:block;float:left;width:300px}#main_preferences input[type=text]{width:13.25rem;color:var(--color-toolkit-input-text-font);border:none;background:none repeat scroll 0 0 var(--color-toolkit-select-background);padding:.2rem .4rem;height:2rem;border-radius:5px}#main_preferences input[type=text]:hover,#main_preferences input[type=text]:focus{background-color:var(--color-toolkit-select-background-hover)}#main_preferences div.pref-group{width:100%;font-weight:400;padding:1rem .5rem;text-align:left;background:var(--color-settings-table-group-background)}#main_preferences .value{margin:0;padding:0;float:left;width:15em}#main_preferences .value select,#main_preferences .value input[type=text]{font-size:inherit!important;margin-top:0;margin-right:1rem;margin-bottom:0;margin-left:0}#main_preferences .value select{width:14rem}#main_preferences .value select:focus,#main_preferences .value input:focus{outline:none;box-shadow:0 0 1px 1px var(--color-btn-background)}#main_preferences .description{margin:0;padding:5px 0 0;float:right;width:50%;color:var(--color-settings-engine-description-font);font-size:90%}#main_preferences .bang{text-align:left;border-radius:5px;background-color:var(--color-doc-code-background);color:var(--color-doc-code);padding:.2rem;border:0 none}#main_preferences .category{margin-right:.5rem}#main_preferences .category label{border:2px solid transparent;padding:.2rem .4rem;border-radius:5px}#main_preferences .category input[type=checkbox]:checked+label{border:2px solid var(--color-categories-item-border-selected)}#main_preferences table.table_engines th.name label{cursor:pointer}#main_preferences table.table_engines th.name .engine-tooltip{margin-top:1.8rem;left:calc((100% - 85em)/2 + 10em);max-width:40rem}#main_preferences table.table_engines th.name .engine-tooltip .engine-description{margin-top:.5rem}#main_preferences table.table_engines th.name .engine-tooltip .bang{margin:.3rem}#main_preferences table.table_engines .checkbox-col,#main_preferences table.table_engines .name,#main_preferences table.table_engines .shortcut{text-align:left}#main_preferences table.cookies{width:100%;direction:ltr}#main_preferences table.cookies th,#main_preferences table.cookies td{text-align:left;font-family:monospace;font-size:1rem;padding:.5em;vertical-align:top}#main_preferences table.cookies td:first-child{word-break:keep-all;width:14rem;padding-right:1rem}#main_preferences table.cookies td:last-child{word-break:break-all}#main_preferences table.cookies>tbody>tr:nth-child(2n)>th,#main_preferences table.cookies>tbody>tr:nth-child(2n)>td{background-color:var(--color-settings-tr-hover)}#main_preferences .preferences_back{background:none repeat scroll 0 0 var(--color-btn-background);color:var(--color-btn-font);border:0 none;border-radius:10px;cursor:pointer;display:inline-block;margin:2px 4px;padding:.7em}#main_preferences .preferences_back a{color:var(--color-settings-return-font)}#main_preferences .preferences_back a:first-letter{text-transform:uppercase}#main_preferences #toggle-all-engines-container{width:max-content;margin-left:auto}#main_preferences div.selectable_url pre{width:100%}#main_preferences #copy-hash-container{display:flex;align-items:center;gap:.5rem}#main_preferences #copy-hash-container div.selectable_url pre{width:auto;flex-grow:1}#main_preferences #pref-hash-input{width:100%}@media screen and (max-width: 79.75em){.preferences_back{clear:both}.engine-tooltip{left:10em!important}}#search{padding:0;margin:0}#search_header{padding-top:1.5em;padding-right:2em;padding-left:7rem;margin:0;background:var(--color-header-background);border-bottom:1px solid var(--color-header-border);display:grid;gap:1rem 1.2rem;grid-template-columns:3rem 1fr;grid-template-areas:"logo search" "spacer categories"}.category_checkbox,.category_button{display:inline-block;position:relative;margin-right:1rem;padding:0}.category_checkbox input{display:none}.category_checkbox label{cursor:pointer;padding:.2rem 0;display:inline-flex;text-transform:capitalize;font-size:.9em;border-bottom:2px solid transparent;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.category_checkbox label svg{padding-right:.2rem}.category_checkbox label div.category_name{margin:auto 0}.category_checkbox input[type=checkbox]:checked+label{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}button.category_button{background-color:inherit;color:var(--color-base-font);cursor:pointer;padding:.2rem 0;display:inline-flex;align-items:center;text-transform:capitalize;font-size:.9em;border:none;border-bottom:2px solid transparent}button.category_button svg{padding-right:.2rem}button.category_button.selected,button.category_button:active{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}.no-js #categories_container:has(button.category_button:focus-within) button.category_button.selected{color:var(--color-base-font);border-bottom:none}.no-js #categories_container:has(button.category_button:focus-within) button.category_button:focus-within{color:var(--color-categories-item-selected-font);border-bottom:2px solid var(--color-categories-item-border-selected)}#search_logo{padding:.5rem 10px 0;grid-area:logo;display:flex;align-items:center;justify-content:center}#search_logo svg{flex:1;width:30px;height:30px;margin:.5rem 0 auto}.search_categories{grid-area:categories}.search_categories .help{display:none}.search_categories:hover .help{display:block;position:absolute;background:var(--color-base-background);padding:1rem .6rem .6rem 0;z-index:1000;width:100%;left:-.1rem}#search_view{padding:.5rem .5rem 0;grid-area:search}body.results_endpoint #search_view{padding:.5rem 2.8rem 0 0}.search_box{border-radius:.8rem;width:100%;max-width:44rem;display:inline-flex;flex-direction:row;white-space:nowrap;box-shadow:var(--color-search-shadow)}#clear_search{display:block;border-collapse:separate;box-sizing:border-box;width:1.8rem;margin:0;padding:.8rem .2rem;background:none repeat scroll 0 0 var(--color-search-background);border:none;outline:none;color:var(--color-search-font);font-size:1.1rem;z-index:1000}#clear_search:hover{color:var(--color-search-background-hover)}#clear_search.empty *,html.no-js #clear_search.hide_if_nojs{display:none}#q,#send_search{display:block;margin:0;padding:.8rem;background:none repeat scroll 0 0 var(--color-search-background);border:none;outline:none;color:var(--color-search-font);font-size:1.1rem;z-index:100}#q{width:100%;padding-left:1rem;padding-right:0!important;border-radius:.8rem 0 0 .8rem}#q::-ms-clear,#q::-webkit-search-cancel-button{display:none}#send_search{border-radius:0 .8rem .8rem 0}#send_search:hover{cursor:pointer;background-color:var(--color-search-background-hover);color:var(--color-search-background)}.no-js #clear_search,.no-js #send_search{width:auto!important;border-left:1px solid var(--color-search-border)}.search_filters{margin-top:.6rem;margin-right:0;margin-bottom:0;margin-left:10.6rem;display:flex;overflow-x:auto;overscroll-behavior-inline:contain}.search_filters select{background-color:inherit}.search_filters select:hover,.search_filters select:focus{color:var(--color-base-font)}@media screen and (max-width: 79.75em){#search_header{padding:1.5em .5rem 0;column-gap:.5rem}.search_filters{margin-top:.6rem;margin-right:0;margin-bottom:0;margin-left:3.5rem}#categories{font-size:90%;clear:both}}@media screen and (max-width: 79.75em) and (hover: none){#main_index #categories_container,#main_results #categories_container{width:max-content}#main_index #categories_container .category_checkbox,#main_results #categories_container .category_checkbox{display:inline-block;width:auto}#main_index #categories,#main_results #categories{width:100%;text-align:left;overflow:scroll hidden;-webkit-overflow-scrolling:touch}}@media screen and (max-width: 50em){#search_header{width:100%;margin:0;padding:.1rem 0 0;gap:0 0;grid-template-areas:"logo search" "categories categories"}.search_logo{padding:0}.search_box{width:100%}#q{width:100%;flex:1}.search_filters{margin:0 10px;padding:.5rem 0}.category{display:inline-block;width:auto;margin:0}.category svg{display:none}.category_checkbox label,.category_button{padding:1rem!important;margin:0!important}#search_view:focus-within{display:block;background-color:var(--color-search-background);position:absolute;top:0;height:100%;width:100%;z-index:2000}#search_view:focus-within .search_box{border-bottom:1px solid var(--color-search-border);width:100%;border-radius:0;box-shadow:none}#search_view:focus-within .search_box #send_search{margin-right:0!important}#search_view:focus-within .search_box *{border:none;border-radius:0;box-shadow:none}#main_results #q:placeholder-shown~#send_search{margin-right:2.6rem;transition:margin .1s}}@media screen and (max-width: 20rem){#search_header{grid-template-areas:"search search" "categories categories"}#search_logo{display:none}}#categories{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}#categories::-webkit-scrollbar{width:0;height:0}#categories_container{position:relative}.favicon img{height:1.5rem;width:1.5rem;border-radius:10%;background-color:var(--color-favicon-background-color);border:1px solid var(--color-favicon-border-color);display:flex}@media screen and (min-width: 50em){.center-alignment-yes #main_results{--center-page-width: 48rem}}@media screen and (width >= 62rem){.center-alignment-yes #main_results{--center-page-width: 60rem}}@media screen and (min-width: 79.75em){.center-alignment-yes #main_results{--center-page-width: 73rem}}@media screen and (min-width: 50em) and (max-width: 79.75em){.center-alignment-yes #main_results #results{grid-template-columns:60% calc(40% - 5rem);margin-left:0;margin-right:0}.center-alignment-yes #main_results #urls{margin-left:3rem}.center-alignment-yes #main_results #sidebar{margin-right:1rem}.center-alignment-yes #main_results #backToTop{left:calc(60% + 1rem)}}@media screen and (min-width: 79.75em){.center-alignment-yes #main_results{display:flex;flex-direction:column;align-items:center}.center-alignment-yes #main_results #search{width:100%;display:flex;flex-direction:column;align-items:center}.center-alignment-yes #main_results #search_header{grid-template-columns:calc(50% - 4.5rem - var(--center-page-width) / 2) 3rem var(--center-page-width);grid-template-areas:"na logo search" "na spacer categories";column-gap:1.2rem;width:100%;padding-left:0;padding-right:0}.center-alignment-yes #main_results .search_filters{margin-left:.5rem;width:var(--center-page-width)}.center-alignment-yes #main_results #results{margin-right:2rem;margin-left:10rem}.center-alignment-yes #main_results #results.only_template_images,.center-alignment-yes #main_results #results.image-detail-open{align-self:flex-start}.center-alignment-yes #main_results #results:not(.only_template_images,.image-detail-open){margin-left:1.5rem;grid-template-columns:calc(var(--center-page-width) - 5rem - 25rem) 25rem}.center-alignment-yes #main_results #results:not(.only_template_images,.image-detail-open) #backToTop{left:calc(50% - 25rem - 5rem + 1rem + var(--center-page-width) / 2)}.center-alignment-yes #main_results #results .result .content{max-width:inherit}.center-alignment-yes #main_results #urls{margin-left:0}.center-alignment-yes #main_results #sidebar{margin-right:0}}.sxng-icon-set{display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scale(1)}.sxng-icon-set-small{width:1rem;height:1rem;display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scale(1)}.sxng-icon-set-big{width:1.5rem;height:1.5rem;display:inline-block;vertical-align:bottom;line-height:1;text-decoration:inherit;transform:scale(1)}html{font-family:sans-serif;font-size:.9em;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:var(--color-base-font);background-color:var(--color-base-background);padding:0;margin:0;scroll-behavior:smooth}body,main{padding:0;margin:0}body{display:flex;flex-direction:column;height:100vh;margin:0}@supports (height: 100dvh){body{height:100dvh}}main{width:100%;margin-bottom:2rem;flex:1}.page_with_header{margin:2em auto;width:85em}footer{clear:both;min-height:4rem;padding:1rem 0;width:100%;text-align:center;background-color:var(--color-footer-background);border-top:1px solid var(--color-footer-border);overflow:hidden}footer p{font-size:.9em}.page_with_header .logo{height:40px}input[type=submit],#results button[type=submit],.button{padding:.7rem;display:inline-block;background:var(--color-btn-background);color:var(--color-btn-font);border-radius:10px;border:0;cursor:pointer}a{text-decoration:none;color:var(--color-url-font)}a:visited,a:visited .highlight{color:var(--color-url-visited-font)}article[data-vim-selected]{background:var(--color-result-vim-selected);border-left:.2rem solid var(--color-result-vim-arrow);border-radius:0 10px 10px 0}article.result-images[data-vim-selected]{background:var(--color-result-vim-arrow);border:none;border-radius:10px}article.result-images[data-vim-selected] .image_thumbnail{filter:opacity(60%)}article.result-images[data-vim-selected] span.title,article.result-images[data-vim-selected] span.source{color:var(--color-result-image-span-font-selected)}article[data-vim-selected].category-videos,article[data-vim-selected].category-news,article[data-vim-selected].category-map,article[data-vim-selected].category-music,article[data-vim-selected].category-files,article[data-vim-selected].category-social{border:1px solid var(--color-result-vim-arrow);border-radius:10px}.result{margin:.125rem 0;padding:1rem;box-sizing:border-box;width:100%;border-left:.2rem solid transparent}.result h3{font-size:1.2rem;word-wrap:break-word;margin:.4rem 0;padding:0}.result h3 a{color:var(--color-result-link-font);font-weight:400;font-size:1.1em}.result h3 a:visited{color:var(--color-result-link-visited-font)}.result h3 a:focus,.result h3 a:hover{text-decoration:underline;border:none;outline:none}.result .cache_link,.result .proxyfied_link{font-size:smaller!important;margin-left:.5rem}.result .content,.result .stat{font-size:.9em;margin:0;padding:0;max-width:54em;word-wrap:break-word;line-height:1.24}.result .content .highlight,.result .stat .highlight{color:var(--color-result-description-highlight-font);background:inherit;font-weight:700}.result .altlink a{font-size:.9em;margin:0 10px 0 0;padding:5px 10px;border-radius:5px;background:var(--color-show-btn-background);color:var(--color-show-btn-font);cursor:pointer}.result .altlink a:hover{background:var(--color-btn-background);color:var(--color-btn-font)}.result .codelines .highlight{color:inherit;background:inherit;font-weight:400}.result .url_header{display:flex;gap:.5rem}.result .url_wrapper{display:flex;align-items:center;font-size:1rem;color:var(--color-result-url-font);flex-flow:row nowrap;overflow:hidden;margin:0;padding:0}.result .url_wrapper .url_o1{white-space:nowrap;flex-shrink:1;padding-bottom:1px}.result .url_wrapper .url_o1 .url_i1{unicode-bidi:plaintext}.result .url_wrapper .url_o1:after{content:" ";width:1ch;display:inline-block}.result .url_wrapper .url_o2{overflow:hidden;white-space:nowrap;flex:0 1 content;text-align:right;padding-bottom:1px}.result .url_wrapper .url_o2 .url_i2{float:right}.result .published_date,.result .result_length,.result .result_views,.result .result_author,.result .result_shipping,.result .result_source_country{font-size:.8em;color:var(--color-result-publishdate-font)}.result .result_price{font-size:1.2em;color:var(--color-result-description-highlight-font)}.result img.thumbnail{float:left;padding-top:.6rem;padding-right:1rem;width:7rem;height:unset}.result .break{clear:both}.result-paper .attributes,.result-packages .attributes{display:table;border-spacing:.125rem}.result-paper .attributes div,.result-packages .attributes div{display:table-row}.result-paper .attributes div span,.result-packages .attributes div span{font-size:.9rem;margin-top:.25rem;display:table-cell}.result-paper .attributes div span time,.result-packages .attributes div span time{font-size:.9rem}.result-paper .attributes div span:first-child,.result-packages .attributes div span:first-child{color:var(--color-base-font);min-width:10rem}.result-paper .attributes div span:nth-child(2),.result-packages .attributes div span:nth-child(2){color:var(--color-result-publishdate-font)}.result-paper .content,.result-packages .content{margin-top:.25rem}.result-paper .comments,.result-packages .comments{font-size:.9rem;margin:.25rem 0 0;padding:0;word-wrap:break-word;line-height:1.24;font-style:italic}.result-packages .attributes{margin-top:.3rem}.template_group_images{display:flex;flex-wrap:wrap}.template_group_images:after{flex-grow:10;content:""}.category-videos,.category-news,.category-map,.category-music,.category-files,.category-social{border:1px solid var(--color-result-border);margin:0 .5rem 1rem!important;border-radius:10px}.category-social .image{width:auto!important;min-width:48px;min-height:48px;padding:0 5px 25px 0!important}.audio-control audio{width:100%;padding:10px 0 0}.embedded-content iframe{width:100%;padding:10px 0 0}.result-videos img.thumbnail{float:left;padding-top:.6rem;padding-right:1rem;width:20rem;height:unset}.result-videos .content{overflow:hidden}.result-videos .embedded-video iframe{width:100%;aspect-ratio:16 / 9;padding:10px 0 0}@supports not (aspect-ratio: 1 / 1){.result-videos .embedded-video iframe{height:25.3125rem}}.engines{float:right;display:flex;flex-wrap:wrap;justify-content:flex-end;color:var(--color-result-engines-font)}.engines span{font-size:smaller;margin-top:0;margin-bottom:0;margin-right:.5rem;margin-left:0}.small_font{font-size:.8em}.highlight{color:var(--color-result-link-font-highlight);background:inherit}.empty_element{font-style:italic}.result-images{flex-grow:1;padding:.5rem .5rem 3rem;margin:.25rem;border:none!important;height:12rem;width:unset}.result-images>a{position:relative;outline:none}.result-images img{margin:0;padding:0;border:none;height:100%;width:auto;object-fit:cover;vertical-align:bottom;background:var(--color-result-image-background)}.result-images .image_resolution{position:absolute;right:0;bottom:0;background:var(--color-image-resolution-background);padding:.3rem .5rem;font-size:.9rem;color:var(--color-image-resolution-font);border-top-left-radius:.3rem}.result-images span.title,.result-images span.source{display:block;position:absolute;width:100%;font-size:.9rem;color:var(--color-result-image-span-font);padding:.5rem 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.result-images span.source{padding:1.8rem 0 0;font-size:.7rem}.result-map img.image{float:right!important;height:100px!important;width:auto!important}.result-map table{font-size:.9em;width:auto;border-collapse:separate;border-spacing:0 .35rem}.result-map table th{font-weight:inherit;width:17rem;vertical-align:top;text-align:left}.result-map table td{vertical-align:top;text-align:left}.hidden{display:none!important}#results{margin-top:1rem;margin-right:2rem;margin-bottom:0;margin-left:10rem;display:grid;grid-template:"corrections sidebar" min-content "answers sidebar" min-content "urls sidebar" 1fr "pagination sidebar" min-content / 45rem 25rem;gap:0 5rem}#results #sidebar *:first-child{margin-top:0}#urls{padding:0;grid-area:urls}#apis .wrapper{display:flex}#suggestions .wrapper{display:flex;flex-flow:column;justify-content:flex-end}#suggestions .wrapper form{display:inline-block;flex:1 1 50%}#suggestions input,#infoboxes input{padding:0;margin:3px;font-size:.9em;display:inline-block;background:transparent;color:var(--color-result-search-url-font);cursor:pointer;width:100%;text-overflow:ellipsis;overflow:hidden;text-align:left}#suggestions input[type=submit],#infoboxes input[type=submit],#suggestions .infobox .url a,#infoboxes .infobox .url a{color:var(--color-result-link-font);text-decoration:none;font-size:.9rem}#suggestions input[type=submit]:hover,#infoboxes input[type=submit]:hover,#suggestions .infobox .url a:hover,#infoboxes .infobox .url a:hover{text-decoration:underline}#corrections{grid-area:corrections;display:flex;flex-flow:row wrap;margin:0 0 1em}#corrections h4,#corrections input[type=submit]{display:inline-block;padding:.5rem;margin:.5rem}#corrections input[type=submit]{font-size:.8rem;border-radius:5px}#infoboxes .title,#suggestions .title,#search_url .title,#engines_msg .title,#apis .title{margin:2em 0 .5em;color:var(--color-base-font)}summary.title{cursor:pointer;padding-top:1em}.sidebar-collapsible{border-top:1px solid var(--color-sidebar-border);padding-bottom:.5em}#sidebar-end-collapsible{border-bottom:1px solid var(--color-sidebar-border);width:100%}#answers{grid-area:answers;background:var(--color-answer-background);padding:1rem;margin:1rem 0;margin-top:0;color:var(--color-answer-font);border-radius:10px}#answers h4{display:none}#answers span{overflow-wrap:anywhere}#answers .answer{display:flex;flex-direction:column}#answers .answer-url{margin:5px 10px 10px auto}#infoboxes form{min-width:210px}#sidebar{grid-area:sidebar;word-wrap:break-word;color:var(--color-sidebar-font)}#sidebar .infobox{margin:10px 0;border:1px solid var(--color-sidebar-border);padding:1rem;font-size:.9em;border-radius:10px}#sidebar .infobox h2{margin:0 0 .5em}#sidebar .infobox img{max-width:100%;max-height:12em;display:block;margin:0 auto;padding:0}#sidebar .infobox dt{font-weight:700}#sidebar .infobox .attributes dl{margin:.5em 0}#sidebar .infobox .attributes dt{display:inline;margin:.5em .25em .5em 0;padding:0}#sidebar .infobox .attributes dd{display:inline;margin:.5em 0;padding:0}#sidebar .infobox input{font-size:1em}#sidebar .infobox br,#sidebar .infobox .attributes,#sidebar .infobox .urls{clear:both}#apis input{font-size:.9em;margin:0 10px 0 0;padding:5px 10px;border-radius:5px;background:var(--color-show-btn-background);color:var(--color-show-btn-font);cursor:pointer}#apis input:hover{background:var(--color-btn-background);color:var(--color-btn-font)}#engines_msg .engine-name{width:10rem}#engines_msg .response-error{color:var(--color-error)}#engines_msg .bar-chart-value{width:auto}#search_url div.selectable_url pre{float:left;width:200em}#search_url button#copy_url{float:right;padding:.4rem;margin-left:.5rem;border-radius:.3rem;display:none}#links_on_top{position:absolute;right:1rem;text-align:right;top:2.7rem;padding:0;border:0;display:flex;align-items:center;font-size:1em;color:var(--color-search-font)}#links_on_top a{display:flex;align-items:center;margin-left:1em}#links_on_top a svg{font-size:1.2em;margin-right:.125em}#links_on_top a,#links_on_top a:link *,#links_on_top a:hover *,#links_on_top a:visited *,#links_on_top a:active *{color:var(--color-search-font)}#pagination{grid-area:pagination}#pagination br{clear:both}.numbered_pagination{display:flex;flex-direction:row;justify-content:center;align-items:center;overflow:hidden}.page_number{background:transparent!important;color:var(--color-result-link-font)!important;text-decoration:underline}.page_number_current{background:transparent;color:var(--color-result-link-visited-font);border:none}#backToTop{border:1px solid var(--color-backtotop-border);margin:0;padding:0;font-size:1em;background:var(--color-backtotop-background);position:fixed;bottom:8rem;left:56.3rem;transition:opacity .5s;opacity:0;pointer-events:none;border-radius:10px}#backToTop a{display:block;margin:0;padding:.7em}#backToTop a,#backToTop a:visited,#backToTop a:hover,#backToTop a:active{color:var(--color-backtotop-font)}#results.scrolling #backToTop{opacity:1;pointer-events:all}@media screen and (width <= calc(79.75em - .5px)){#links_on_top span{display:none}}@media screen and (width <= 52rem){body.results_endpoint #links_on_top .link_on_top_about,body.results_endpoint #links_on_top .link_on_top_donate{display:none}}@media screen and (min-width: 50em) and (max-width: 79.75em){.center-alignment-no #links_on_top span{display:none}.center-alignment-no .page_with_header{margin:2rem .5rem;width:auto}.center-alignment-no #infoboxes{position:inherit;max-width:inherit}.center-alignment-no #infoboxes .infobox{clear:both}.center-alignment-no #infoboxes .infobox img{float:left;max-width:10em;margin:.5em .5em .5em 0}.center-alignment-no #sidebar{margin:0 .5rem .125rem;padding:0;float:none;border:none;width:auto}.center-alignment-no #sidebar input{border:0}.center-alignment-no .result .thumbnail{max-width:98%}.center-alignment-no .result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.center-alignment-no .result .engines{float:right;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:3px 0 0}.center-alignment-no .result-images{border-bottom:none!important}.center-alignment-no .image_result,.center-alignment-no .image_result img{max-width:98%}.center-alignment-no #backToTop{display:none}.center-alignment-no #pagination{margin:2rem 0 0!important}.center-alignment-no #main_results div#results{margin:0 auto;justify-content:center;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 45rem;gap:0}}#main_results div#results.only_template_images{margin:1rem .5rem 0;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 100%;gap:0}#main_results div#results.only_template_images #sidebar{display:none}#main_results div#results.only_template_images #urls{margin:0;display:flex;flex-wrap:wrap}#main_results div#results.only_template_images #urls:after{flex-grow:10;content:""}#main_results div#results.only_template_images #backToTop{left:auto;right:1rem}#main_results div#results.only_template_images #pagination{margin-right:4rem}@media screen and (max-width: 50em){#links_on_top span{display:none}.page_with_header{margin:2rem .5rem;width:auto}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:left;max-width:10em;margin:.5em .5em .5em 0}#sidebar{margin:0 .5rem .125rem;padding:0;float:none;border:none;width:auto}#sidebar input{border:0}.result .thumbnail{max-width:98%}.result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.result .engines{float:right;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:3px 0 0}.result-images{border-bottom:none!important}.image_result,.image_result img{max-width:98%}#backToTop{display:none}#pagination{margin:2rem 0 0!important}#main_results div#results{margin:0 auto;justify-content:center;display:grid;grid-template:"corrections" min-content "answers" min-content "sidebar" min-content "urls" 1fr "pagination" min-content / 45rem;gap:0}html{background-color:var(--color-base-background-mobile)}#main_results div#results{grid-template-columns:100%;margin:0 auto}#links_on_top{top:1.4rem;right:10px}#main_index #links_on_top{top:.5rem;right:.5rem}#results{margin:0;padding:0}#pagination{margin:2rem 1rem 0!important}article[data-vim-selected]{border:1px solid var(--color-result-vim-arrow);border-radius:10px}.result{background:var(--color-result-background);border:1px solid var(--color-result-background);margin:1rem 2%;width:96%;border-radius:10px}.result-images{margin:0;height:10rem;background:var(--color-base-background-mobile);width:unset}.infobox{border:none!important;background-color:var(--color-sidebar-background)}.numbered_pagination{display:none}.result-paper .attributes,.result-packages .attributes,.result-paper .attributes div,.result-packages .attributes div{display:block}.result-paper .attributes div span,.result-packages .attributes div span{display:inline}.result-paper .attributes div span:first-child,.result-packages .attributes div span:first-child{font-weight:700}.result-paper .attributes div span:nth-child(2),.result-packages .attributes div span:nth-child(2){margin-left:.5rem}}@media screen and (max-width: 35em){.result-videos img.thumbnail{float:none!important}.result-videos .content{overflow:inherit}}pre code{white-space:pre-wrap}#main_results .result-keyvalue caption{padding:.8rem .5rem;font-style:italic;caption-side:bottom;background-color:var(--color-result-keyvalue-table)}#main_results .result-keyvalue .col-key{width:25%}#main_results .result-keyvalue table{word-break:break-word;table-layout:fixed;width:100%;background-color:var(--color-result-keyvalue-table)}#main_results .result-keyvalue tr.odd{background-color:var(--color-result-keyvalue-odd)}#main_results .result-keyvalue tr.even{background-color:var(--color-result-keyvalue-even)}#main_results .result-keyvalue th,#main_results .result-keyvalue td{padding:.3rem .5rem} diff --git a/searx/static/themes/simple/js/searxng.min.js b/searx/static/themes/simple/js/searxng.min.js index f2c49fb32..ce8fd6aa7 100644 --- a/searx/static/themes/simple/js/searxng.min.js +++ b/searx/static/themes/simple/js/searxng.min.js @@ -3,12 +3,12 @@ * (C) Copyright Contributors to the SearXNG project. * (C) Copyright Contributors to the searx project (2014 - 2021). * SPDX-License-Identifier: AGPL-3.0-or-later - */window.searxng=function(h,d){h.Element&&function(r){r.matches=r.matches||r.matchesSelector||r.webkitMatchesSelector||r.msMatchesSelector||function(a){for(var l=this,n=(l.parentNode||l.document).querySelectorAll(a),e=-1;n[++e]&&n[e]!=l;);return!!n[e]}}(Element.prototype);function u(r,a,l){try{r.call(a,l)}catch(n){console.log(n)}}var p=window.searxng||{};p.on=function(r,a,l,n){n=n||!1,typeof r!="string"?r.addEventListener(a,l,n):d.addEventListener(a,function(e){for(var t=e.target||e.srcElement,o=!1;t&&t.matches&&t!==d&&!(o=t.matches(r));)t=t.parentElement;o&&u(l,t,e)},n)},p.ready=function(r){document.readyState!="loading"?r.call(h):h.addEventListener("DOMContentLoaded",r.bind(h))},p.http=function(r,a,l=null){return new Promise(function(n,e){try{var t=new XMLHttpRequest;t.open(r,a,!0),t.timeout=2e4,t.onload=function(){t.status==200?n(t.response,t.responseType):e(Error(t.statusText))},t.onerror=function(){e(Error("Network Error"))},t.onabort=function(){e(Error("Transaction is aborted"))},t.ontimeout=function(){e(Error("Timeout"))},l?t.send(l):t.send()}catch(o){e(o)}})},p.loadStyle=function(r){var a=p.settings.theme_static_path+"/"+r,l="style_"+r.replace(".","_"),n=d.getElementById(l);n===null&&(n=d.createElement("link"),n.setAttribute("id",l),n.setAttribute("rel","stylesheet"),n.setAttribute("type","text/css"),n.setAttribute("href",a),d.body.appendChild(n))},p.loadScript=function(r,a){var l=p.settings.theme_static_path+"/"+r,n="script_"+r.replace(".","_"),e=d.getElementById(n);if(e===null)e=d.createElement("script"),e.setAttribute("id",n),e.setAttribute("src",l),e.onload=a,e.onerror=function(){e.setAttribute("error","1")},d.body.appendChild(e);else if(e.hasAttribute("error"))console.log("callback not executed : script '"+l+"' not loaded.");else try{a.apply(e,[])}catch(t){console.log(t)}},p.insertBefore=function(r,a){a.parentNode.insertBefore(r,a)},p.insertAfter=function(r,a){a.parentNode.insertAfter(r,a.nextSibling)},p.on(".close","click",function(){this.parentNode.classList.add("invisible")});function m(){for(var r of d.getElementsByTagName("body")[0].classList.values())if(r.endsWith("_endpoint"))return r.split("_")[0];return""}return p.endpoint=m(),p}(window,document);searxng.ready(function(){if(searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype,searxng.endpoint!=="results")return;if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}let h=document;var d=h.getElementById("results").classList.contains("only_template_images");function u(){var r=h.createElement("div");return r.classList.add("loader"),r}function p(r,a){r.textContent="",a.forEach(l=>r.appendChild(l))}function m(r){var a=h.querySelector("#pagination form.next_page");if(a){p(h.querySelector("#pagination"),[u()]);var l=new FormData(a);searxng.http("POST",h.querySelector("#search").getAttribute("action"),l).then(function(n){var e=new DOMParser().parseFromString(n,"text/html"),t=e.querySelectorAll("#urls article"),o=e.querySelector("#pagination");h.querySelector("#pagination").remove(),t.length>0&&!d&&h.querySelector("#urls").appendChild(h.createElement("hr")),t.forEach(c=>{h.querySelector("#urls").appendChild(c)}),o&&(h.querySelector("#results").appendChild(o),r())}).catch(function(n){console.log(n);var e=h.createElement("div");e.textContent=searxng.settings.translations.error_loading_next_page,e.classList.add("dialog-error"),e.setAttribute("role","alert"),p(h.querySelector("#pagination"),[e])})}}if(searxng.settings.infinite_scroll&&searxng.infinite_scroll_supported){const r={rootMargin:"20rem"},a="article.result:last-child",l=new IntersectionObserver(n=>{const e=n[0];e.isIntersecting&&(l.unobserve(e.target),m(()=>l.observe(h.querySelector(a),r)))});l.observe(h.querySelector(a),r)}});searxng.ready(function(){function h(i){for(;i!==void 0;){if(i.classList.contains("detail"))return!0;if(i.classList.contains("result"))return!1;i=i.parentNode}return!1}function d(i){for(;i!==void 0;){if(i.classList.contains("result"))return i;i=i.parentNode}}function u(i){return i&&i.classList.contains("result-images")}searxng.on(".result","click",function(i){if(!h(i.target)){a(this)(!0,!0);let f=d(i.target);u(f)&&(i.preventDefault(),searxng.selectImage(f))}}),searxng.on(".result a","focus",function(i){if(!h(i.target)){let f=d(i.target);f&&f.getAttribute("data-vim-selected")===null&&a(f)(!0),u(f)&&searxng.selectImage(f)}},!0);var p={Escape:{key:"ESC",fun:n,des:"remove focus from the focused input",cat:"Control"},c:{key:"c",fun:O,des:"copy url of the selected result to the clipboard",cat:"Results"},h:{key:"h",fun:_,des:"toggle help window",cat:"Other"},i:{key:"i",fun:v,des:"focus on the search input",cat:"Control"},n:{key:"n",fun:t(),des:"go to next page",cat:"Results"},o:{key:"o",fun:b(!1),des:"open search result",cat:"Results"},p:{key:"p",fun:o(),des:"go to previous page",cat:"Results"},r:{key:"r",fun:l,des:"reload page from the server",cat:"Control"},t:{key:"t",fun:b(!0),des:"open the result in a new tab",cat:"Results"}},m={default:Object.assign({ArrowLeft:{key:"←",fun:a("up"),des:"select previous search result",cat:"Results"},ArrowRight:{key:"→",fun:a("down"),des:"select next search result",cat:"Results"}},p),vim:Object.assign({b:{key:"b",fun:s(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},f:{key:"f",fun:s(window.innerHeight),des:"scroll one page down",cat:"Navigation"},u:{key:"u",fun:s(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},d:{key:"d",fun:s(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},g:{key:"g",fun:g(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},v:{key:"v",fun:g(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},k:{key:"k",fun:a("up"),des:"select previous search result",cat:"Results"},j:{key:"j",fun:a("down"),des:"select next search result",cat:"Results"},y:{key:"y",fun:O,des:"copy url of the selected result to the clipboard",cat:"Results"}},p)},r=m[searxng.settings.hotkeys]||m.default;searxng.on(document,"keydown",function(i){if(Object.prototype.hasOwnProperty.call(r,i.key)&&!i.ctrlKey&&!i.altKey&&!i.shiftKey&&!i.metaKey){var f=i.target.tagName.toLowerCase();i.key==="Escape"?r[i.key].fun(i):(i.target===document.body||f==="a"||f==="button")&&(i.preventDefault(),r[i.key].fun())}});function a(i){return function(f,M){var E=document.querySelector(".result[data-vim-selected]"),A=i;if(E===null){if(E=document.querySelector(".result"),E===null)return;(i==="down"||i==="up")&&(A=E)}var y,w=document.querySelectorAll(".result");if(w=Array.from(w),typeof A!="string")y=A;else switch(A){case"visible":for(var T=document.documentElement.scrollTop||document.body.scrollTop,x=T+document.documentElement.clientHeight,I=0;IT)break}break;case"down":y=w[w.indexOf(E)+1]||E;break;case"up":y=w[w.indexOf(E)-1]||E;break;case"bottom":y=w[w.length-1];break;case"top":default:y=w[0]}if(y){if(E.removeAttribute("data-vim-selected"),y.setAttribute("data-vim-selected","true"),!M){var D=y.querySelector("h3 a")||y.querySelector("a");D!==null&&D.focus()}f||c()}}}function l(){document.location.reload(!0)}function n(i){const f=i.target.tagName.toLowerCase();document.activeElement&&(f==="input"||f==="select"||f==="textarea")?document.activeElement.blur():searxng.closeDetail()}function e(i){return function(){var f=document.querySelector(i);f&&f.click()}}function t(){return e('nav#pagination .next_page button[type="submit"]')}function o(){return e('nav#pagination .previous_page button[type="submit"]')}function c(){var i=document.querySelector(".result[data-vim-selected]");if(i!==null){var f=document.documentElement.scrollTop||document.body.scrollTop,M=document.documentElement.clientHeight,E=i.offsetTop,A=E+i.clientHeight,y=120;if(i.previousElementSibling===null&&AE-y)window.scroll(window.scrollX,E-y);else{var w=f+M;w a")),f!==null){var M=f.getAttribute("href");i?window.open(M):window.location.href=M}}}function k(i){var f={};for(var M in r){var E=r[M];f[E.cat]=f[E.cat]||[],f[E.cat].push(E)}var A=Object.keys(f).sort(function(N,D){return f[D].length-f[N].length});if(A.length!==0){var y='
    ×';y+="

    How to navigate SearXNG with hotkeys

    ",y+="";for(var w=0;w"),y+="",(!I||x)&&(y+="")}y+="
    ",y+="

    "+T[0].cat+"

    ",y+='
      ';for(var R in T)y+="
    • "+T[R].key+" "+T[R].des+"
    • ";y+="
    ",y+="
    ",i.innerHTML=y}}function _(){var i=document.querySelector("#vim-hotkeys-help");if(i==null){i=document.createElement("div"),i.id="vim-hotkeys-help",i.className="dialog-modal",k(i);var f=document.getElementsByTagName("body")[0];f.appendChild(i)}else{i.classList.toggle("invisible");return}}function O(){var i=document.querySelector(".result[data-vim-selected] h3 a");if(i===null)return;const f=i.getAttribute("href");navigator.clipboard.writeText(f)}searxng.scrollPageToSelected=c,searxng.selectNext=a("down"),searxng.selectPrevious=a("up")});(function(h,d,u){u.ready(function(){u.on(".searxng_init_map","click",function(p){this.classList.remove("searxng_init_map");var m=this.dataset.leafletTarget,r=parseFloat(this.dataset.mapLon),a=parseFloat(this.dataset.mapLat),l=parseFloat(this.dataset.mapZoom),n=JSON.parse(this.dataset.mapBoundingbox),e=JSON.parse(this.dataset.mapGeojson);u.loadStyle("css/leaflet.css"),u.loadScript("js/leaflet.js",function(){var t=null;if(n){var o=L.latLng(n[0],n[2]),c=L.latLng(n[1],n[3]);t=L.latLngBounds(o,c)}var s=L.map(m),g="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",v='Map data © OpenStreetMap contributors',b=new L.TileLayer(g,{minZoom:1,maxZoom:19,attribution:v}),k="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",_='Wikimedia maps | Maps data © OpenStreetMap contributors',O=new L.TileLayer(k,{minZoom:1,maxZoom:19,attribution:_});t?setTimeout(function(){s.fitBounds(t,{maxZoom:17})},0):r&&a&&(l?s.setView(new L.latLng(a,r),l):s.setView(new L.latLng(a,r),8)),s.addLayer(b);var i={"OSM Mapnik":b,"OSM Wikimedia":O};L.control.layers(i).addTo(s),e&&L.geoJson(e).addTo(s)}),p.preventDefault()})})})(window,document,window.searxng);(function(h,d,u){u.endpoint==="preferences"&&u.ready(function(){let p=null;function m(){p==null&&u.http("GET","engine_descriptions.json").then(function(t){p=JSON.parse(t);for(const[o,c]of Object.entries(p)){let s=d.querySelectorAll('[data-engine-name="'+o+'"] .engine-description');for(const g of s){let v=" ("+u.settings.translations.Source+": "+c[1]+")";g.innerHTML=c[0]+v}}})}for(const t of d.querySelectorAll("[data-engine-name]"))u.on(t,"mouseenter",m);const r=d.querySelectorAll(".enable-all-engines"),a=d.querySelectorAll(".disable-all-engines"),l=d.querySelectorAll("tbody input[type=checkbox][class~=checkbox-onoff]"),n=t=>{for(const o of l)o.offsetParent!==null&&(o.checked=!t)};for(const t of r)u.on(t,"click",()=>n(!0));for(const t of a)u.on(t,"click",()=>n(!1));const e=d.querySelector("#copy-hash");u.on(e,"click",t=>{t.preventDefault(),navigator.clipboard.writeText(e.dataset.hash),e.innerText=e.dataset.copiedText})})})(window,document,window.searxng);/*! + */window.searxng=function(h,s){h.Element&&function(o){o.matches=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.msMatchesSelector||function(l){for(var n=this,r=(n.parentNode||n.document).querySelectorAll(l),t=-1;r[++t]&&r[t]!=n;);return!!r[t]}}(Element.prototype);function i(o,l,n){try{o.call(l,n)}catch(r){console.log(r)}}var p=window.searxng||{};p.on=function(o,l,n,r){r=r||!1,typeof o!="string"?o.addEventListener(l,n,r):s.addEventListener(l,function(t){for(var a=t.target||t.srcElement,f=!1;a&&a.matches&&a!==s&&!(f=a.matches(o));)a=a.parentElement;f&&i(n,a,t)},r)},p.ready=function(o){document.readyState!="loading"?o.call(h):h.addEventListener("DOMContentLoaded",o.bind(h))},p.http=function(o,l,n=null){return new Promise(function(r,t){try{var a=new XMLHttpRequest;a.open(o,l,!0),a.timeout=2e4,a.onload=function(){a.status==200?r(a.response,a.responseType):t(Error(a.statusText))},a.onerror=function(){t(Error("Network Error"))},a.onabort=function(){t(Error("Transaction is aborted"))},a.ontimeout=function(){t(Error("Timeout"))},n?a.send(n):a.send()}catch(f){t(f)}})},p.loadStyle=function(o){var l=p.settings.theme_static_path+"/"+o,n="style_"+o.replace(".","_"),r=s.getElementById(n);r===null&&(r=s.createElement("link"),r.setAttribute("id",n),r.setAttribute("rel","stylesheet"),r.setAttribute("type","text/css"),r.setAttribute("href",l),s.body.appendChild(r))},p.loadScript=function(o,l){var n=p.settings.theme_static_path+"/"+o,r="script_"+o.replace(".","_"),t=s.getElementById(r);if(t===null)t=s.createElement("script"),t.setAttribute("id",r),t.setAttribute("src",n),t.onload=l,t.onerror=function(){t.setAttribute("error","1")},s.body.appendChild(t);else if(t.hasAttribute("error"))console.log("callback not executed : script '"+n+"' not loaded.");else try{l.apply(t,[])}catch(a){console.log(a)}},p.insertBefore=function(o,l){l.parentNode.insertBefore(o,l)},p.insertAfter=function(o,l){l.parentNode.insertAfter(o,l.nextSibling)},p.on(".close","click",function(){this.parentNode.classList.add("invisible")});function g(){for(var o of s.getElementsByTagName("body")[0].classList.values())if(o.endsWith("_endpoint"))return o.split("_")[0];return""}return p.endpoint=g(),p}(window,document);searxng.ready(function(){if(searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype,searxng.endpoint!=="results")return;if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}let h=document;var s=h.getElementById("results").classList.contains("only_template_images");function i(){var o=h.createElement("div");return o.classList.add("loader"),o}function p(o,l){o.textContent="",l.forEach(n=>o.appendChild(n))}function g(o){var l=h.querySelector("#pagination form.next_page");if(l){p(h.querySelector("#pagination"),[i()]);var n=new FormData(l);searxng.http("POST",h.querySelector("#search").getAttribute("action"),n).then(function(r){var t=new DOMParser().parseFromString(r,"text/html"),a=t.querySelectorAll("#urls article"),f=t.querySelector("#pagination");h.querySelector("#pagination").remove(),a.length>0&&!s&&h.querySelector("#urls").appendChild(h.createElement("hr")),a.forEach(b=>{h.querySelector("#urls").appendChild(b)}),f&&(h.querySelector("#results").appendChild(f),o())}).catch(function(r){console.log(r);var t=h.createElement("div");t.textContent=searxng.settings.translations.error_loading_next_page,t.classList.add("dialog-error"),t.setAttribute("role","alert"),p(h.querySelector("#pagination"),[t])})}}if(searxng.settings.infinite_scroll&&searxng.infinite_scroll_supported){const o={rootMargin:"20rem"},l="article.result:last-child",n=new IntersectionObserver(r=>{const t=r[0];t.isIntersecting&&(n.unobserve(t.target),g(()=>n.observe(h.querySelector(l),o)))});n.observe(h.querySelector(l),o)}});searxng.ready(function(){function h(e){for(;e!==void 0;){if(e.classList.contains("detail"))return!0;if(e.classList.contains("result"))return!1;e=e.parentNode}return!1}function s(e){for(;e!==void 0;){if(e.classList.contains("result"))return e;e=e.parentNode}}function i(e){return e&&e.classList.contains("result-images")}searxng.on(".result","click",function(e){if(!h(e.target)){l(this)(!0,!0);let u=s(e.target);i(u)&&(e.preventDefault(),searxng.selectImage(u))}}),searxng.on(".result a","focus",function(e){if(!h(e.target)){let u=s(e.target);u&&u.getAttribute("data-vim-selected")===null&&l(u)(!0),i(u)&&searxng.selectImage(u)}},!0);var p={Escape:{key:"ESC",fun:r,des:"remove focus from the focused input",cat:"Control"},c:{key:"c",fun:A,des:"copy url of the selected result to the clipboard",cat:"Results"},h:{key:"h",fun:T,des:"toggle help window",cat:"Other"},i:{key:"i",fun:m,des:"focus on the search input",cat:"Control"},n:{key:"n",fun:a(),des:"go to next page",cat:"Results"},o:{key:"o",fun:y(!1),des:"open search result",cat:"Results"},p:{key:"p",fun:f(),des:"go to previous page",cat:"Results"},r:{key:"r",fun:n,des:"reload page from the server",cat:"Control"},t:{key:"t",fun:y(!0),des:"open the result in a new tab",cat:"Results"}},g={default:Object.assign({ArrowLeft:{key:"←",fun:l("up"),des:"select previous search result",cat:"Results"},ArrowRight:{key:"→",fun:l("down"),des:"select next search result",cat:"Results"}},p),vim:Object.assign({b:{key:"b",fun:c(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},f:{key:"f",fun:c(window.innerHeight),des:"scroll one page down",cat:"Navigation"},u:{key:"u",fun:c(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},d:{key:"d",fun:c(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},g:{key:"g",fun:d(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},v:{key:"v",fun:d(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},k:{key:"k",fun:l("up"),des:"select previous search result",cat:"Results"},j:{key:"j",fun:l("down"),des:"select next search result",cat:"Results"},y:{key:"y",fun:A,des:"copy url of the selected result to the clipboard",cat:"Results"}},p)},o=g[searxng.settings.hotkeys]||g.default;searxng.on(document,"keydown",function(e){if(Object.prototype.hasOwnProperty.call(o,e.key)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var u=e.target.tagName.toLowerCase();e.key==="Escape"?o[e.key].fun(e):(e.target===document.body||u==="a"||u==="button")&&(e.preventDefault(),o[e.key].fun())}});function l(e){return function(u,_){var E=document.querySelector(".result[data-vim-selected]"),k=e;if(E===null){if(E=document.querySelector(".result"),E===null)return;(e==="down"||e==="up")&&(k=E)}var v,w=document.querySelectorAll(".result");if(w=Array.from(w),typeof k!="string")v=k;else switch(k){case"visible":for(var q=document.documentElement.scrollTop||document.body.scrollTop,B=q+document.documentElement.clientHeight,x=0;xq)break}break;case"down":v=w[w.indexOf(E)+1]||E;break;case"up":v=w[w.indexOf(E)-1]||E;break;case"bottom":v=w[w.length-1];break;case"top":default:v=w[0]}if(v){if(E.removeAttribute("data-vim-selected"),v.setAttribute("data-vim-selected","true"),!_){var C=v.querySelector("h3 a")||v.querySelector("a");C!==null&&C.focus()}u||b()}}}function n(){document.location.reload(!0)}function r(e){const u=e.target.tagName.toLowerCase();document.activeElement&&(u==="input"||u==="select"||u==="textarea")?document.activeElement.blur():searxng.closeDetail()}function t(e){return function(){var u=document.querySelector(e);u&&u.click()}}function a(){return t('nav#pagination .next_page button[type="submit"]')}function f(){return t('nav#pagination .previous_page button[type="submit"]')}function b(){var e=document.querySelector(".result[data-vim-selected]");if(e!==null){var u=document.documentElement.scrollTop||document.body.scrollTop,_=document.documentElement.clientHeight,E=e.offsetTop,k=E+e.clientHeight,v=120;if(e.previousElementSibling===null&&k<_){window.scroll(window.scrollX,0);return}if(u>E-v)window.scroll(window.scrollX,E-v);else{var w=u+_;w a")),u!==null){var _=u.getAttribute("href");e?window.open(_):window.location.href=_}}}function S(e){var u={};for(var _ in o){var E=o[_];u[E.cat]=u[E.cat]||[],u[E.cat].push(E)}var k=Object.keys(u).sort(function(M,C){return u[C].length-u[M].length});if(k.length!==0){var v='×';v+="

    How to navigate SearXNG with hotkeys

    ",v+="";for(var w=0;w"),v+="",(!x||B)&&(v+="")}v+="
    ",v+="

    "+q[0].cat+"

    ",v+='
      ';for(var I in q)v+="
    • "+q[I].key+" "+q[I].des+"
    • ";v+="
    ",v+="
    ",e.innerHTML=v}}function T(){var e=document.querySelector("#vim-hotkeys-help");if(e==null){e=document.createElement("div"),e.id="vim-hotkeys-help",e.className="dialog-modal",S(e);var u=document.getElementsByTagName("body")[0];u.appendChild(e)}else{e.classList.toggle("invisible");return}}function A(){var e=document.querySelector(".result[data-vim-selected] h3 a");if(e===null)return;const u=e.getAttribute("href");navigator.clipboard.writeText(u)}searxng.scrollPageToSelected=b,searxng.selectNext=l("down"),searxng.selectPrevious=l("up")});(function(h,s,i){i.ready(function(){i.on(".searxng_init_map","click",function(p){this.classList.remove("searxng_init_map");var g=this.dataset.leafletTarget,o=parseFloat(this.dataset.mapLon),l=parseFloat(this.dataset.mapLat),n=parseFloat(this.dataset.mapZoom),r=JSON.parse(this.dataset.mapBoundingbox),t=JSON.parse(this.dataset.mapGeojson);i.loadStyle("css/leaflet.css"),i.loadScript("js/leaflet.js",function(){var a=null;if(r){var f=L.latLng(r[0],r[2]),b=L.latLng(r[1],r[3]);a=L.latLngBounds(f,b)}var c=L.map(g),d="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",m='Map data © OpenStreetMap contributors',y=new L.TileLayer(d,{minZoom:1,maxZoom:19,attribution:m}),S="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",T='Wikimedia maps | Maps data © OpenStreetMap contributors',A=new L.TileLayer(S,{minZoom:1,maxZoom:19,attribution:T});a?setTimeout(function(){c.fitBounds(a,{maxZoom:17})},0):o&&l&&(n?c.setView(new L.latLng(l,o),n):c.setView(new L.latLng(l,o),8)),c.addLayer(y);var e={"OSM Mapnik":y,"OSM Wikimedia":A};L.control.layers(e).addTo(c),t&&L.geoJson(t).addTo(c)}),p.preventDefault()})})})(window,document,window.searxng);(function(h,s,i){i.endpoint==="preferences"&&i.ready(function(){let p=null;function g(){p==null&&i.http("GET","engine_descriptions.json").then(function(a){p=JSON.parse(a);for(const[f,b]of Object.entries(p)){let c=s.querySelectorAll('[data-engine-name="'+f+'"] .engine-description');for(const d of c){let m=" ("+i.settings.translations.Source+": "+b[1]+")";d.innerHTML=b[0]+m}}})}for(const a of s.querySelectorAll("[data-engine-name]"))i.on(a,"mouseenter",g);const o=s.querySelectorAll(".enable-all-engines"),l=s.querySelectorAll(".disable-all-engines"),n=s.querySelectorAll("tbody input[type=checkbox][class~=checkbox-onoff]"),r=a=>{for(const f of n)f.offsetParent!==null&&(f.checked=!a)};for(const a of o)i.on(a,"click",()=>r(!0));for(const a of l)i.on(a,"click",()=>r(!1));const t=s.querySelector("#copy-hash");i.on(t,"click",a=>{a.preventDefault(),navigator.clipboard.writeText(t.dataset.hash),t.innerText=t.dataset.copiedText})})})(window,document,window.searxng);/*! * swiped-events.js - v@version@ * Pure JavaScript swipe events * https://github.com/john-doherty/swiped-events * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element * @author John Doherty * @license MIT - */(function(h,d){typeof h.CustomEvent!="function"&&(h.CustomEvent=function(s,g){g=g||{bubbles:!1,cancelable:!1,detail:void 0};var v=d.createEvent("CustomEvent");return v.initCustomEvent(s,g.bubbles,g.cancelable,g.detail),v},h.CustomEvent.prototype=h.Event.prototype),d.addEventListener("touchstart",t,!1),d.addEventListener("touchmove",o,!1),d.addEventListener("touchend",e,!1);var u=null,p=null,m=null,r=null,a=null,l=null,n=0;function e(s){if(l===s.target){var g=parseInt(c(l,"data-swipe-threshold","20"),10),v=c(l,"data-swipe-unit","px"),b=parseInt(c(l,"data-swipe-timeout","500"),10),k=Date.now()-a,_="",O=s.changedTouches||s.touches||[];if(v==="vh"&&(g=Math.round(g/100*d.documentElement.clientHeight)),v==="vw"&&(g=Math.round(g/100*d.documentElement.clientWidth)),Math.abs(m)>Math.abs(r)?Math.abs(m)>g&&k0?_="swiped-left":_="swiped-right"):Math.abs(r)>g&&k0?_="swiped-up":_="swiped-down"),_!==""){var i={dir:_.replace(/swiped-/,""),touchType:(O[0]||{}).touchType||"direct",fingers:n,xStart:parseInt(u,10),xEnd:parseInt((O[0]||{}).clientX||-1,10),yStart:parseInt(p,10),yEnd:parseInt((O[0]||{}).clientY||-1,10)};l.dispatchEvent(new CustomEvent("swiped",{bubbles:!0,cancelable:!0,detail:i})),l.dispatchEvent(new CustomEvent(_,{bubbles:!0,cancelable:!0,detail:i}))}u=null,p=null,a=null}}function t(s){s.target.getAttribute("data-swipe-ignore")!=="true"&&(l=s.target,a=Date.now(),u=s.touches[0].clientX,p=s.touches[0].clientY,m=0,r=0,n=s.touches.length)}function o(s){if(!(!u||!p)){var g=s.touches[0].clientX,v=s.touches[0].clientY;m=u-g,r=p-v}}function c(s,g,v){for(;s&&s!==d.documentElement;){var b=s.getAttribute(g);if(b)return b;s=s.parentNode}return v}})(window,document);(function(h,d,u){u.endpoint==="results"&&u.ready(function(){d.querySelectorAll("#urls img").forEach(l=>l.addEventListener("error",()=>{l.src=window.searxng.settings.theme_static_path+"/img/img_load_error.svg"},{once:!0})),d.querySelector("#search_url button#copy_url")&&(d.querySelector("#search_url button#copy_url").style.display="block"),u.on(".btn-collapse","click",function(){var l=this.getAttribute("data-btn-text-collapsed"),n=this.getAttribute("data-btn-text-not-collapsed"),e=this.getAttribute("data-target"),t=d.querySelector(e),o=this.innerHTML;this.classList.contains("collapsed")?o=o.replace(l,n):o=o.replace(n,l),this.innerHTML=o,this.classList.toggle("collapsed"),t.classList.toggle("invisible")}),u.on(".media-loader","click",function(){var l=this.getAttribute("data-target"),n=d.querySelector(l+" > iframe"),e=n.getAttribute("src");(e==null||e===!1)&&n.setAttribute("src",n.getAttribute("data-src"))}),u.on("#copy_url","click",function(){var l=this.parentElement.querySelector("pre");navigator.clipboard.writeText(l.innerText),this.innerText=this.dataset.copiedText});let p;const m=d.createElement("div");m.classList.add("loader");const r=new Image,a=(l,n)=>{p&&clearTimeout(p),p=setTimeout(()=>{r.src=l},1e3),r.onload=()=>{n(),m.remove()},r.onerror=()=>{m.remove()}};u.selectImage=l=>{if(d.getElementById("results").classList.add("image-detail-open"),window.location.hash="#image-viewer",u.scrollPageToSelected(),!l)return;const n=l.querySelector(".result-images-source img");if(!n)return;const e=n.getAttribute("data-src");if(!e)return;const t=l.querySelector(".image_thumbnail");n.src=t.src,l.querySelector(".detail").appendChild(m),a(e,()=>{n.src=e,n.removeAttribute("data-src")})},u.closeDetail=function(){d.getElementById("results").classList.remove("image-detail-open"),window.location.hash=="#image-viewer"&&window.history.back(),u.scrollPageToSelected()},u.on(".result-detail-close","click",l=>{l.preventDefault(),u.closeDetail()}),u.on(".result-detail-previous","click",l=>{l.preventDefault(),u.selectPrevious(!1)}),u.on(".result-detail-next","click",l=>{l.preventDefault(),u.selectNext(!1)}),window.addEventListener("hashchange",()=>{window.location.hash!="#image-viewer"&&u.closeDetail()}),d.querySelectorAll(".swipe-horizontal").forEach(l=>{l.addEventListener("swiped-left",function(){u.selectNext(!1)}),l.addEventListener("swiped-right",function(){u.selectPrevious(!1)})}),h.addEventListener("scroll",function(){var l=d.getElementById("backToTop"),n=document.documentElement.scrollTop||document.body.scrollTop,e=d.getElementById("results");l!==null&&(n>=100?e.classList.add("scrolling"):e.classList.remove("scrolling"))},!0)})})(window,document,window.searxng);function P(h){return h&&h.__esModule&&Object.prototype.hasOwnProperty.call(h,"default")?h.default:h}function C(h){throw new Error('Could not dynamically require "'+h+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var q={exports:{}},H;function B(){return H||(H=1,function(h,d){(function(u){h.exports=u()})(function(){return function(){function u(p,m,r){function a(e,t){if(!m[e]){if(!p[e]){var o=typeof C=="function"&&C;if(!t&&o)return o(e,!0);if(l)return l(e,!0);var c=new Error("Cannot find module '"+e+"'");throw c.code="MODULE_NOT_FOUND",c}var s=m[e]={exports:{}};p[e][0].call(s.exports,function(g){var v=p[e][1][g];return a(v||g)},s,s.exports,u,p,m,r)}return m[e].exports}for(var l=typeof C=="function"&&C,n=0;n=b.From&&o.keyCode<=b.To?v=!b.Not:v=b.Not))};for(var s in n.prototype.getEventsByType(e,t)){var g=n.merge({Operator:r.AND},e.KeyboardMappings[s]),v=r.AND==g.Operator;g.Conditions.forEach(c),v===!0&&g.Callback.call(e,o)}},n.prototype.makeRequest=function(e,t,o){var c=Object.getOwnPropertyNames(e.HttpHeaders),s=new XMLHttpRequest,g=e._HttpMethod(),v=e._Url(),b=e._Pre(),k=encodeURIComponent(e._QueryArg())+"="+encodeURIComponent(b);g.match(/^GET$/i)&&(v.indexOf("?")!==-1?v+="&"+k:v+="?"+k),s.open(g,v,!0);for(var _=c.length-1;_>=0;_--)s.setRequestHeader(c[_],e.HttpHeaders[c[_]]);return s.onreadystatechange=function(){s.readyState==4&&s.status==200?(e.$Cache[b]=s.response,t(s.response)):s.status>=400&&o()},s},n.prototype.ajax=function(e,t,o){o===void 0&&(o=!0),e.$AjaxTimer&&window.clearTimeout(e.$AjaxTimer),o===!0?e.$AjaxTimer=window.setTimeout(n.prototype.ajax.bind(null,e,t,!1),e.Delay):(e.Request&&e.Request.abort(),e.Request=t,e.Request.send(e._QueryArg()+"="+e._Pre()))},n.prototype.cache=function(e,t,o){var c=e._Cache(e._Pre());if(c===void 0){var s=n.prototype.makeRequest(e,t,o);n.prototype.ajax(e,s)}else t(c)},n.prototype.destroy=function(e){for(var t in e.$Listeners)e.Input.removeEventListener(t,e.$Listeners[t]);e.DOMResults.parentNode.removeChild(e.DOMResults)},n.merge=function(){for(var e={},t,o=0;o"+e+""}},HttpHeaders:{"Content-type":"application/x-www-form-urlencoded"},Limit:0,MinChars:0,HttpMethod:"GET",QueryArg:"q",Url:null,KeyboardMappings:{Enter:{Conditions:[{Is:13,Not:!1}],Callback:function(e){if(this.DOMResults.getAttribute("class").indexOf("open")!=-1){var t=this.DOMResults.querySelector("li.active");t!==null&&(e.preventDefault(),this._Select(t),this.DOMResults.setAttribute("class","autocomplete"))}},Operator:r.AND,Event:a.KEYDOWN},KeyUpAndDown_down:{Conditions:[{Is:38,Not:!1},{Is:40,Not:!1}],Callback:function(e){e.preventDefault()},Operator:r.OR,Event:a.KEYDOWN},KeyUpAndDown_up:{Conditions:[{Is:38,Not:!1},{Is:40,Not:!1}],Callback:function(e){e.preventDefault();var t=this.DOMResults.querySelector("li:first-child:not(.locked)"),o=this.DOMResults.querySelector("li:last-child:not(.locked)"),c=this.DOMResults.querySelector("li.active");if(c){var s=Array.prototype.indexOf.call(c.parentNode.children,c),g=s+(e.keyCode-39),v=this.DOMResults.getElementsByTagName("li").length;g<0?g=v-1:g>=v&&(g=0),c.classList.remove("active"),c.parentElement.children.item(g).classList.add("active")}else o&&e.keyCode==38?o.classList.add("active"):t&&t.classList.add("active")},Operator:r.OR,Event:a.KEYUP},AlphaNum:{Conditions:[{Is:13,Not:!0},{From:35,To:40,Not:!0}],Callback:function(){var e=this.Input.getAttribute("data-autocomplete-old-value"),t=this._Pre();t!==""&&t.length>=this._MinChars()?((!e||t!=e)&&this.DOMResults.setAttribute("class","autocomplete open"),n.prototype.cache(this,(function(o){this._Render(this._Post(o)),this._Open()}).bind(this),this._Error)):this._Close()},Operator:r.AND,Event:a.KEYUP}},DOMResults:null,Request:null,Input:null,_EmptyMessage:function(){var e="";return this.Input.hasAttribute("data-autocomplete-empty-message")?e=this.Input.getAttribute("data-autocomplete-empty-message"):this.EmptyMessage!==!1?e=this.EmptyMessage:e="",e},_Limit:function(){var e=this.Input.getAttribute("data-autocomplete-limit");return isNaN(e)||e===null?this.Limit:parseInt(e,10)},_MinChars:function(){var e=this.Input.getAttribute("data-autocomplete-minchars");return isNaN(e)||e===null?this.MinChars:parseInt(e,10)},_Highlight:function(e){return e.replace(this.Highlight.getRegex(this._Pre()),this.Highlight.transform)},_HttpMethod:function(){return this.Input.hasAttribute("data-autocomplete-method")?this.Input.getAttribute("data-autocomplete-method"):this.HttpMethod},_QueryArg:function(){return this.Input.hasAttribute("data-autocomplete-param-name")?this.Input.getAttribute("data-autocomplete-param-name"):this.QueryArg},_Url:function(){return this.Input.hasAttribute("data-autocomplete")?this.Input.getAttribute("data-autocomplete"):this.Url},_Blur:function(e){if(e===void 0&&(e=!1),e)this._Close();else{var t=this;setTimeout(function(){t._Blur(!0)},150)}},_Cache:function(e){return this.$Cache[e]},_Focus:function(){var e=this.Input.getAttribute("data-autocomplete-old-value");(!e||this.Input.value!=e)&&this._MinChars()<=this.Input.value.length&&this.DOMResults.setAttribute("class","autocomplete open")},_Open:function(){var e=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(t){t.getAttribute("class")!="locked"&&(t.onclick=function(){e._Select(t)})})},_Close:function(){this.DOMResults.setAttribute("class","autocomplete")},_Position:function(){this.DOMResults.setAttribute("class","autocomplete"),this.DOMResults.setAttribute("style","top:"+(this.Input.offsetTop+this.Input.offsetHeight)+"px;left:"+this.Input.offsetLeft+"px;width:"+this.Input.clientWidth+"px;")},_Render:function(e){var t;typeof e=="string"?t=this._RenderRaw(e):t=this._RenderResponseItems(e),this.DOMResults.hasChildNodes()&&this.DOMResults.removeChild(this.DOMResults.childNodes[0]),this.DOMResults.appendChild(t)},_RenderResponseItems:function(e){var t=document.createElement("ul"),o=document.createElement("li"),c=this._Limit();c<0?e=e.reverse():c===0&&(c=e.length);for(var s=0;s0)this.DOMResults.innerHTML=e;else{var c=this._EmptyMessage();c!==""&&(o.innerHTML=c,o.setAttribute("class","locked"),t.appendChild(o))}return t},_Post:function(e){try{var t=[],o=JSON.parse(e);if(Object.keys(o).length===0)return"";if(Array.isArray(o))for(var c=0;c0){var n=document.getElementById("search");setTimeout(n.submit.bind(n),0)}}function l(n){var e=document.getElementById("clear_search"),t=function(){n.value.length===0?e.classList.add("empty"):e.classList.remove("empty")};t(),e.addEventListener("click",function(o){n.value="",n.focus(),t(),o.preventDefault()}),n.addEventListener("input",t,!1)}u.ready(function(){m=d.getElementById(p),m!==null&&(l(m),u.settings.autocomplete&&(u.autocomplete=S.call(h,{Url:"./autocompleter",EmptyMessage:u.settings.translations.no_item_found,HttpMethod:u.settings.method,HttpHeaders:{"Content-type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},MinChars:u.settings.autocomplete_min,Delay:300,_Position:function(){},_Open:function(){var t=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(o){o.getAttribute("class")!="locked"&&(o.onmousedown=function(){t._Select(o)})})},_Select:function(t){S.defaults._Select.call(this,t);var o=t.closest("form");o&&o.submit()},_MinChars:function(){return this.Input.value.indexOf("!")>-1?0:S.defaults._MinChars.call(this)},KeyboardMappings:Object.assign({},S.defaults.KeyboardMappings,{KeyUpAndDown_up:Object.assign({},S.defaults.KeyboardMappings.KeyUpAndDown_up,{Callback:function(t){S.defaults.KeyboardMappings.KeyUpAndDown_up.Callback.call(this,t);var o=this.DOMResults.querySelector("li.active");o&&S.defaults._Select.call(this,o)}}),Tab:Object.assign({},S.defaults.KeyboardMappings.Enter,{Conditions:[{Is:9,Not:!1}],Callback:function(t){if(this.DOMResults.getAttribute("class").indexOf("open")!=-1){var o=this.DOMResults.querySelector("li.active");o!==null&&(S.defaults._Select.call(this,o),t.preventDefault())}}})})},"#"+p)),S.prototype.ajax=function(t,o,c){c===void 0&&(c=!0),t.$AjaxTimer&&window.clearTimeout(t.$AjaxTimer),c===!0?t.$AjaxTimer=window.setTimeout(S.prototype.ajax.bind(null,t,o,!1),t.Delay):(t.Request&&t.Request.abort(),t.Request=o,t.Request.send(encodeURIComponent(t._QueryArg())+"="+encodeURIComponent(t._Pre())))},!r&&document.querySelector(".index_endpoint")&&m.focus()),m!==null&&u.settings.search_on_category_select&&d.querySelector(".search_filters")!=null&&(u.on(d.getElementById("safesearch"),"change",a),u.on(d.getElementById("time_range"),"change",a),u.on(d.getElementById("language"),"change",a));const n=d.querySelectorAll("button.category_button");for(let t of n)u.on(t,"click",o=>{if(o.shiftKey){o.preventDefault(),t.classList.toggle("selected");return}const c=d.querySelectorAll("button.category_button.selected");for(let s of c)s.classList.remove("selected");t.classList.add("selected")});const e=d.querySelector("#search");e!=null&&u.on(e,"submit",t=>{t.preventDefault();const o=d.querySelector("#selected-categories");if(o){let c=[];for(let s of n)s.classList.contains("selected")&&c.push(s.name.replace("category_",""));o.value=c.join(",")}e.submit()})})})(window,document,window.searxng); + */(function(h,s){typeof h.CustomEvent!="function"&&(h.CustomEvent=function(c,d){d=d||{bubbles:!1,cancelable:!1,detail:void 0};var m=s.createEvent("CustomEvent");return m.initCustomEvent(c,d.bubbles,d.cancelable,d.detail),m},h.CustomEvent.prototype=h.Event.prototype),s.addEventListener("touchstart",a,!1),s.addEventListener("touchmove",f,!1),s.addEventListener("touchend",t,!1);var i=null,p=null,g=null,o=null,l=null,n=null,r=0;function t(c){if(n===c.target){var d=parseInt(b(n,"data-swipe-threshold","20"),10),m=b(n,"data-swipe-unit","px"),y=parseInt(b(n,"data-swipe-timeout","500"),10),S=Date.now()-l,T="",A=c.changedTouches||c.touches||[];if(m==="vh"&&(d=Math.round(d/100*s.documentElement.clientHeight)),m==="vw"&&(d=Math.round(d/100*s.documentElement.clientWidth)),Math.abs(g)>Math.abs(o)?Math.abs(g)>d&&S0?T="swiped-left":T="swiped-right"):Math.abs(o)>d&&S0?T="swiped-up":T="swiped-down"),T!==""){var e={dir:T.replace(/swiped-/,""),touchType:(A[0]||{}).touchType||"direct",fingers:r,xStart:parseInt(i,10),xEnd:parseInt((A[0]||{}).clientX||-1,10),yStart:parseInt(p,10),yEnd:parseInt((A[0]||{}).clientY||-1,10)};n.dispatchEvent(new CustomEvent("swiped",{bubbles:!0,cancelable:!0,detail:e})),n.dispatchEvent(new CustomEvent(T,{bubbles:!0,cancelable:!0,detail:e}))}i=null,p=null,l=null}}function a(c){c.target.getAttribute("data-swipe-ignore")!=="true"&&(n=c.target,l=Date.now(),i=c.touches[0].clientX,p=c.touches[0].clientY,g=0,o=0,r=c.touches.length)}function f(c){if(!(!i||!p)){var d=c.touches[0].clientX,m=c.touches[0].clientY;g=i-d,o=p-m}}function b(c,d,m){for(;c&&c!==s.documentElement;){var y=c.getAttribute(d);if(y)return y;c=c.parentNode}return m}})(window,document);(function(h,s,i){i.endpoint==="results"&&i.ready(function(){s.querySelectorAll("#urls img").forEach(n=>n.addEventListener("error",()=>{n.src=window.searxng.settings.theme_static_path+"/img/img_load_error.svg"},{once:!0})),s.querySelector("#search_url button#copy_url")&&(s.querySelector("#search_url button#copy_url").style.display="block"),i.on(".btn-collapse","click",function(){var n=this.getAttribute("data-btn-text-collapsed"),r=this.getAttribute("data-btn-text-not-collapsed"),t=this.getAttribute("data-target"),a=s.querySelector(t),f=this.innerHTML;this.classList.contains("collapsed")?f=f.replace(n,r):f=f.replace(r,n),this.innerHTML=f,this.classList.toggle("collapsed"),a.classList.toggle("invisible")}),i.on(".media-loader","click",function(){var n=this.getAttribute("data-target"),r=s.querySelector(n+" > iframe"),t=r.getAttribute("src");(t==null||t===!1)&&r.setAttribute("src",r.getAttribute("data-src"))}),i.on("#copy_url","click",function(){var n=this.parentElement.querySelector("pre");navigator.clipboard.writeText(n.innerText),this.innerText=this.dataset.copiedText});let p;const g=s.createElement("div");g.classList.add("loader");const o=new Image,l=(n,r)=>{p&&clearTimeout(p),p=setTimeout(()=>{o.src=n},1e3),o.onload=()=>{r(),g.remove()},o.onerror=()=>{g.remove()}};i.selectImage=n=>{if(s.getElementById("results").classList.add("image-detail-open"),window.location.hash="#image-viewer",i.scrollPageToSelected(),!n)return;const r=n.querySelector(".result-images-source img");if(!r)return;const t=r.getAttribute("data-src");if(!t)return;const a=n.querySelector(".image_thumbnail");r.src=a.src,n.querySelector(".detail").appendChild(g),l(t,()=>{r.src=t,r.removeAttribute("data-src")})},i.closeDetail=function(){s.getElementById("results").classList.remove("image-detail-open"),window.location.hash=="#image-viewer"&&window.history.back(),i.scrollPageToSelected()},i.on(".result-detail-close","click",n=>{n.preventDefault(),i.closeDetail()}),i.on(".result-detail-previous","click",n=>{n.preventDefault(),i.selectPrevious(!1)}),i.on(".result-detail-next","click",n=>{n.preventDefault(),i.selectNext(!1)}),window.addEventListener("hashchange",()=>{window.location.hash!="#image-viewer"&&i.closeDetail()}),s.querySelectorAll(".swipe-horizontal").forEach(n=>{n.addEventListener("swiped-left",function(){i.selectNext(!1)}),n.addEventListener("swiped-right",function(){i.selectPrevious(!1)})}),h.addEventListener("scroll",function(){var n=s.getElementById("backToTop"),r=document.documentElement.scrollTop||document.body.scrollTop,t=s.getElementById("results");n!==null&&(r>=100?t.classList.add("scrolling"):t.classList.remove("scrolling"))},!0)})})(window,document,window.searxng);(function(h,s,i){var p="q",g;const o=window.matchMedia("only screen and (max-width: 50em)").matches;function l(){if(g.value.length>0){var t=document.getElementById("search");setTimeout(t.submit.bind(t),0)}}function n(t){var a=document.getElementById("clear_search"),f=function(){t.value.length===0?a.classList.add("empty"):a.classList.remove("empty")};f(),a.addEventListener("click",function(b){t.value="",t.focus(),f(),b.preventDefault()}),t.addEventListener("input",f,!1)}const r=async t=>{let a;if(i.settings.method==="GET"){const f=new URLSearchParams;f.append("q",t),a=fetch("./autocompleter?"+f.toString())}else{const f=new FormData;f.append("q",t),a=fetch("./autocompleter",{method:"POST",body:f})}a.then(async function(f){const b=await f.json();if(!b)return;const c=s.querySelector(".autocomplete"),d=s.querySelector(".autocomplete ul");if(c.classList.add("open"),d.innerHTML="",!b[1]||b[1].length==0){const m=document.createElement("li");m.classList.add("no-item-found"),m.innerHTML=i.settings.translations.no_item_found,d.appendChild(m);return}for(let m of b[1]){const y=document.createElement("li");y.innerText=m,i.on(y,"mousedown",()=>{g.value=m,s.querySelector("#search").submit(),c.classList.remove("open")}),d.appendChild(y)}})};i.ready(function(){o||document.getElementById("q").focus(),g=s.getElementById(p);const t=s.querySelector(".autocomplete"),a=s.querySelector(".autocomplete ul");g!==null&&(n(g),i.settings.autocomplete&&(i.on(g,"input",()=>{const c=g.value;c.length{c==g.value&&r(c)},300)}),i.on(g,"keyup",c=>{let d=-1;const m=a.children;for(let S=0;S=0&&m[d].classList.remove("active"),y=(d-1+m.length)%m.length):c.key==="ArrowDown"?(d>=0&&m[d].classList.remove("active"),y=(d+1)%m.length):(c.key==="Tab"||c.key==="Enter")&&t.classList.remove("open"),y!=-1){const S=m[y];S.classList.add("active"),S.classList.contains("no-item-found")||(g.value=S.innerText)}}))),g!==null&&i.settings.search_on_category_select&&s.querySelector(".search_filters")!=null&&(i.on(s.getElementById("safesearch"),"change",l),i.on(s.getElementById("time_range"),"change",l),i.on(s.getElementById("language"),"change",l));const f=s.querySelectorAll("button.category_button");for(let c of f)i.on(c,"click",d=>{if(d.shiftKey){d.preventDefault(),c.classList.toggle("selected");return}const m=s.querySelectorAll("button.category_button.selected");for(let y of m)y.classList.remove("selected");c.classList.add("selected")});const b=s.querySelector("#search");b!=null&&i.on(b,"submit",c=>{c.preventDefault();const d=s.querySelector("#selected-categories");if(d){let m=[];for(let y of f)y.classList.contains("selected")&&m.push(y.name.replace("category_",""));d.value=m.join(",")}b.submit()})})})(window,document,window.searxng); //# sourceMappingURL=searxng.min.js.map diff --git a/searx/static/themes/simple/js/searxng.min.js.map b/searx/static/themes/simple/js/searxng.min.js.map index ded00532a..f454d84c0 100644 --- a/searx/static/themes/simple/js/searxng.min.js.map +++ b/searx/static/themes/simple/js/searxng.min.js.map @@ -1 +1 @@ -{"version":3,"file":"searxng.min.js","sources":["../../../../../client/simple/src/js/main/00_toolkit.js","../../../../../client/simple/src/js/main/infinite_scroll.js","../../../../../client/simple/src/js/main/keyboard.js","../../../../../client/simple/src/js/main/mapresult.js","../../../../../client/simple/src/js/main/preferences.js","../../../../../client/simple/node_modules/swiped-events/src/swiped-events.js","../../../../../client/simple/src/js/main/results.js","../../../../../client/simple/node_modules/autocomplete-js/dist/autocomplete.js","../../../../../client/simple/src/js/main/search.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n 'use strict';\n\n // not invented here toolkit with bugs fixed elsewhere\n // purposes : be just good enough and as small as possible\n\n // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n if (w.Element) {\n (function (ElementPrototype) {\n ElementPrototype.matches = ElementPrototype.matches ||\n ElementPrototype.matchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n function (selector) {\n var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n while (nodes[++i] && nodes[i] != node);\n return !!nodes[i];\n };\n })(Element.prototype);\n }\n\n function callbackSafe (callback, el, e) {\n try {\n callback.call(el, e);\n } catch (exception) {\n console.log(exception);\n }\n }\n\n var searxng = window.searxng || {};\n\n searxng.on = function (obj, eventType, callback, useCapture) {\n useCapture = useCapture || false;\n if (typeof obj !== 'string') {\n // obj HTMLElement, HTMLDocument\n obj.addEventListener(eventType, callback, useCapture);\n } else {\n // obj is a selector\n d.addEventListener(eventType, function (e) {\n var el = e.target || e.srcElement, found = false;\n while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n if (found) callbackSafe(callback, el, e);\n }, useCapture);\n }\n };\n\n searxng.ready = function (callback) {\n if (document.readyState != 'loading') {\n callback.call(w);\n } else {\n w.addEventListener('DOMContentLoaded', callback.bind(w));\n }\n };\n\n searxng.http = function (method, url, data = null) {\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n req.open(method, url, true);\n req.timeout = 20000;\n\n // On load\n req.onload = function () {\n if (req.status == 200) {\n resolve(req.response, req.responseType);\n } else {\n reject(Error(req.statusText));\n }\n };\n\n // Handle network errors\n req.onerror = function () {\n reject(Error(\"Network Error\"));\n };\n\n req.onabort = function () {\n reject(Error(\"Transaction is aborted\"));\n };\n\n req.ontimeout = function () {\n reject(Error(\"Timeout\"));\n }\n\n // Make the request\n if (data) {\n req.send(data)\n } else {\n req.send();\n }\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n searxng.loadStyle = function (src) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"style_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('link');\n s.setAttribute('id', id);\n s.setAttribute('rel', 'stylesheet');\n s.setAttribute('type', 'text/css');\n s.setAttribute('href', path);\n d.body.appendChild(s);\n }\n };\n\n searxng.loadScript = function (src, callback) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"script_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('script');\n s.setAttribute('id', id);\n s.setAttribute('src', path);\n s.onload = callback;\n s.onerror = function () {\n s.setAttribute('error', '1');\n };\n d.body.appendChild(s);\n } else if (!s.hasAttribute('error')) {\n try {\n callback.apply(s, []);\n } catch (exception) {\n console.log(exception);\n }\n } else {\n console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n }\n };\n\n searxng.insertBefore = function (newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n };\n\n searxng.insertAfter = function (newNode, referenceNode) {\n referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n };\n\n searxng.on('.close', 'click', function () {\n this.parentNode.classList.add('invisible');\n });\n\n function getEndpoint () {\n for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n if (className.endsWith('_endpoint')) {\n return className.split('_')[0];\n }\n }\n return '';\n }\n\n searxng.endpoint = getEndpoint();\n\n return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n 'use strict';\n\n searxng.infinite_scroll_supported = (\n 'IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n if (!searxng.infinite_scroll_supported) {\n console.log('IntersectionObserver not supported');\n return;\n }\n\n let d = document;\n var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n function newLoadSpinner () {\n var loader = d.createElement('div');\n loader.classList.add('loader');\n return loader;\n }\n\n function replaceChildrenWith (element, children) {\n element.textContent = '';\n children.forEach(child => element.appendChild(child));\n }\n\n function loadNextPage (callback) {\n var form = d.querySelector('#pagination form.next_page');\n if (!form) {\n return\n }\n replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n var formData = new FormData(form);\n searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n function (response) {\n var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n var articleList = nextPageDoc.querySelectorAll('#urls article');\n var paginationElement = nextPageDoc.querySelector('#pagination');\n d.querySelector('#pagination').remove();\n if (articleList.length > 0 && !onlyImages) {\n // do not add
    element when there are only images\n d.querySelector('#urls').appendChild(d.createElement('hr'));\n }\n articleList.forEach(articleElement => {\n d.querySelector('#urls').appendChild(articleElement);\n });\n if (paginationElement) {\n d.querySelector('#results').appendChild(paginationElement);\n callback();\n }\n }\n ).catch(\n function (err) {\n console.log(err);\n var e = d.createElement('div');\n e.textContent = searxng.settings.translations.error_loading_next_page;\n e.classList.add('dialog-error');\n e.setAttribute('role', 'alert');\n replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n }\n )\n }\n\n if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) {\n const intersectionObserveOptions = {\n rootMargin: \"20rem\",\n };\n const observedSelector = 'article.result:last-child';\n const observer = new IntersectionObserver(entries => {\n const paginationEntry = entries[0];\n if (paginationEntry.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n }\n });\n observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n function isElementInDetail (el) {\n while (el !== undefined) {\n if (el.classList.contains('detail')) {\n return true;\n }\n if (el.classList.contains('result')) {\n // we found a result, no need to go to the root of the document:\n // el is not inside a
    element\n return false;\n }\n el = el.parentNode;\n }\n return false;\n }\n\n function getResultElement (el) {\n while (el !== undefined) {\n if (el.classList.contains('result')) {\n return el;\n }\n el = el.parentNode;\n }\n return undefined;\n }\n\n function isImageResult (resultElement) {\n return resultElement && resultElement.classList.contains('result-images');\n }\n\n searxng.on('.result', 'click', function (e) {\n if (!isElementInDetail(e.target)) {\n highlightResult(this)(true, true);\n let resultElement = getResultElement(e.target);\n if (isImageResult(resultElement)) {\n e.preventDefault();\n searxng.selectImage(resultElement);\n }\n }\n });\n\n searxng.on('.result a', 'focus', function (e) {\n if (!isElementInDetail(e.target)) {\n let resultElement = getResultElement(e.target);\n if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n highlightResult(resultElement)(true);\n }\n if (isImageResult(resultElement)) {\n searxng.selectImage(resultElement);\n }\n }\n }, true);\n\n /* common base for layouts */\n var baseKeyBinding = {\n 'Escape': {\n key: 'ESC',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 'c': {\n key: 'c',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n 'h': {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n },\n 'i': {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 'n': {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 'o': {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 'p': {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 'r': {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 't': {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n };\n var keyBindingLayouts = {\n\n \"default\": Object.assign(\n { /* SearXNG layout */\n 'ArrowLeft': {\n key: '←',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'ArrowRight': {\n key: '→',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n }, baseKeyBinding),\n\n 'vim': Object.assign(\n { /* Vim-like Key Layout. */\n 'b': {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 'f': {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 'u': {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 'd': {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 'g': {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 'v': {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 'k': {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'j': {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n 'y': {\n key: 'y',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n }, baseKeyBinding)\n }\n\n var keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default;\n\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (\n Object.prototype.hasOwnProperty.call(keyBindings, e.key)\n && !e.ctrlKey && !e.altKey\n && !e.shiftKey && !e.metaKey\n ) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.key === 'Escape') {\n keyBindings[e.key].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n keyBindings[e.key].fun();\n }\n }\n }\n });\n\n function highlightResult (which) {\n return function (noScroll, keepFocus) {\n var current = document.querySelector('.result[data-vim-selected]'),\n effectiveWhich = which;\n if (current === null) {\n // no selection : choose the first one\n current = document.querySelector('.result');\n if (current === null) {\n // no first one : there are no results\n return;\n }\n // replace up/down actions by selecting first one\n if (which === \"down\" || which === \"up\") {\n effectiveWhich = current;\n }\n }\n\n var next, results = document.querySelectorAll('.result');\n results = Array.from(results); // convert NodeList to Array for further use\n\n if (typeof effectiveWhich !== 'string') {\n next = effectiveWhich;\n } else {\n switch (effectiveWhich) {\n case 'visible':\n var top = document.documentElement.scrollTop || document.body.scrollTop;\n var bot = top + document.documentElement.clientHeight;\n\n for (var i = 0; i < results.length; i++) {\n next = results[i];\n var etop = next.offsetTop;\n var ebot = etop + next.clientHeight;\n\n if ((ebot <= bot) && (etop > top)) {\n break;\n }\n }\n break;\n case 'down':\n next = results[results.indexOf(current) + 1] || current;\n break;\n case 'up':\n next = results[results.indexOf(current) - 1] || current;\n break;\n case 'bottom':\n next = results[results.length - 1];\n break;\n case 'top':\n /* falls through */\n default:\n next = results[0];\n }\n }\n\n if (next) {\n current.removeAttribute('data-vim-selected');\n next.setAttribute('data-vim-selected', 'true');\n if (!keepFocus) {\n var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\n }\n }\n if (!noScroll) {\n scrollPageToSelected();\n }\n }\n };\n }\n\n function reloadPage () {\n document.location.reload(true);\n }\n\n function removeFocus (e) {\n const tagName = e.target.tagName.toLowerCase();\n if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n document.activeElement.blur();\n } else {\n searxng.closeDetail();\n }\n }\n\n function pageButtonClick (css_selector) {\n return function () {\n var button = document.querySelector(css_selector);\n if (button) {\n button.click();\n }\n };\n }\n\n function GoToNextPage () {\n return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n }\n\n function GoToPreviousPage () {\n return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n }\n\n function scrollPageToSelected () {\n var sel = document.querySelector('.result[data-vim-selected]');\n if (sel === null) {\n return;\n }\n var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n wheight = document.documentElement.clientHeight,\n etop = sel.offsetTop,\n ebot = etop + sel.clientHeight,\n offset = 120;\n // first element ?\n if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n // set to the top of page if the first element\n // is fully included in the viewport\n window.scroll(window.scrollX, 0);\n return;\n }\n if (wtop > (etop - offset)) {\n window.scroll(window.scrollX, etop - offset);\n } else {\n var wbot = wtop + wheight;\n if (wbot < (ebot + offset)) {\n window.scroll(window.scrollX, ebot - wheight + offset);\n }\n }\n }\n\n function scrollPage (amount) {\n return function () {\n window.scrollBy(0, amount);\n highlightResult('visible')();\n };\n }\n\n function scrollPageTo (position, nav) {\n return function () {\n window.scrollTo(0, position);\n highlightResult(nav)();\n };\n }\n\n function searchInputFocus () {\n window.scrollTo(0, 0);\n var q = document.querySelector('#q');\n q.focus();\n if (q.setSelectionRange) {\n var len = q.value.length;\n q.setSelectionRange(len, len);\n }\n }\n\n function openResult (newTab) {\n return function () {\n var link = document.querySelector('.result[data-vim-selected] h3 a');\n if (link === null) {\n link = document.querySelector('.result[data-vim-selected] > a');\n }\n if (link !== null) {\n var url = link.getAttribute('href');\n if (newTab) {\n window.open(url);\n } else {\n window.location.href = url;\n }\n }\n };\n }\n\n function initHelpContent (divElement) {\n var categories = {};\n\n for (var k in keyBindings) {\n var key = keyBindings[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '×';\n html += '

    How to navigate SearXNG with hotkeys

    ';\n html += '';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '';\n }\n html += ''; // col-sm-*\n\n if (!first || lastCategory) {\n html += ''; // row\n }\n }\n\n html += '
    ';\n\n html += '

    ' + cat[0].cat + '

    ';\n html += '
      ';\n\n for (var cj in cat) {\n html += '
    • ' + cat[cj].key + ' ' + cat[cj].des + '
    • ';\n }\n\n html += '
    ';\n html += '
    ';\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp () {\n var helpPanel = document.querySelector('#vim-hotkeys-help');\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement('div');\n helpPanel.id = 'vim-hotkeys-help';\n helpPanel.className = 'dialog-modal';\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // toggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n function copyURLToClipboard () {\n var currentUrlElement = document.querySelector('.result[data-vim-selected] h3 a');\n if (currentUrlElement === null) return;\n\n const url = currentUrlElement.getAttribute('href');\n navigator.clipboard.writeText(url);\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data © OpenStreetMap contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data © OpenStreetMap contributors';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occur only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (' + searxng.settings.translations.Source + ': ' + description[1] + ')';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n\n const enableAllEngines = d.querySelectorAll(\".enable-all-engines\");\n const disableAllEngines = d.querySelectorAll(\".disable-all-engines\");\n const engineToggles = d.querySelectorAll('tbody input[type=checkbox][class~=checkbox-onoff]');\n const toggleEngines = (enable) => {\n for (const el of engineToggles) {\n // check if element visible, so that only engines of the current category are modified\n if (el.offsetParent !== null) el.checked = !enable;\n }\n };\n for (const el of enableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(true));\n }\n for (const el of disableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(false));\n }\n\n const copyHashButton = d.querySelector(\"#copy-hash\");\n searxng.on(copyHashButton, 'click', (e) => {\n e.preventDefault();\n navigator.clipboard.writeText(copyHashButton.dataset.hash);\n copyHashButton.innerText = copyHashButton.dataset.copiedText;\n });\n });\n})(window, document, window.searxng);\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty \n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n\nimport \"../../../node_modules/swiped-events/src/swiped-events.js\";\n\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n searxng.ready(function () {\n d.querySelectorAll('#urls img').forEach(\n img =>\n img.addEventListener(\n 'error', () => {\n // console.log(\"ERROR can't load: \" + img.src);\n img.src = window.searxng.settings.theme_static_path + \"/img/img_load_error.svg\";\n },\n {once: true}\n ));\n\n if (d.querySelector('#search_url button#copy_url')) {\n d.querySelector('#search_url button#copy_url').style.display = \"block\";\n }\n\n searxng.on('.btn-collapse', 'click', function () {\n var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n var target = this.getAttribute('data-target');\n var targetElement = d.querySelector(target);\n var html = this.innerHTML;\n if (this.classList.contains('collapsed')) {\n html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n } else {\n html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n }\n this.innerHTML = html;\n this.classList.toggle('collapsed');\n targetElement.classList.toggle('invisible');\n });\n\n searxng.on('.media-loader', 'click', function () {\n var target = this.getAttribute('data-target');\n var iframe_load = d.querySelector(target + ' > iframe');\n var srctest = iframe_load.getAttribute('src');\n if (srctest === null || srctest === undefined || srctest === false) {\n iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n }\n });\n\n searxng.on('#copy_url', 'click', function () {\n var target = this.parentElement.querySelector('pre');\n navigator.clipboard.writeText(target.innerText);\n this.innerText = this.dataset.copiedText;\n });\n\n // searxng.selectImage (gallery)\n // -----------------------------\n\n // setTimeout() ID, needed to cancel *last* loadImage\n let imgTimeoutID;\n\n // progress spinner, while an image is loading\n const imgLoaderSpinner = d.createElement('div');\n imgLoaderSpinner.classList.add('loader');\n\n // singleton image object, which is used for all loading processes of a\n // detailed image\n const imgLoader = new Image();\n\n const loadImage = (imgSrc, onSuccess) => {\n // if defered image load exists, stop defered task.\n if (imgTimeoutID) clearTimeout(imgTimeoutID);\n\n // defer load of the detail image for 1 sec\n imgTimeoutID = setTimeout(() => {\n imgLoader.src = imgSrc;\n }, 1000);\n\n // set handlers in the on-properties\n imgLoader.onload = () => {\n onSuccess();\n imgLoaderSpinner.remove();\n };\n imgLoader.onerror = () => {\n imgLoaderSpinner.remove();\n };\n };\n\n searxng.selectImage = (resultElement) => {\n\n // add a class that can be evaluated in the CSS and indicates that the\n // detail view is open\n d.getElementById('results').classList.add('image-detail-open');\n\n // add a hash to the browser history so that pressing back doesn't return\n // to the previous page this allows us to dismiss the image details on\n // pressing the back button on mobile devices\n window.location.hash = '#image-viewer';\n\n searxng.scrollPageToSelected();\n\n // if there is none element given by the caller, stop here\n if (!resultElement) return;\n\n // find object in the element, if there is none, stop here.\n const img = resultElement.querySelector('.result-images-source img');\n if (!img) return;\n\n // \n const src = img.getAttribute('data-src');\n\n // already loaded high-res image or no high-res image available\n if (!src) return;\n\n // use the image thumbnail until the image is fully loaded\n const thumbnail = resultElement.querySelector('.image_thumbnail');\n img.src = thumbnail.src;\n\n // show a progress spinner\n const detailElement = resultElement.querySelector('.detail');\n detailElement.appendChild(imgLoaderSpinner);\n\n // load full size image in background\n loadImage(src, () => {\n // after the singelton loadImage has loaded the detail image into the\n // cache, it can be used in the origin as src property.\n img.src = src;\n img.removeAttribute('data-src');\n });\n };\n\n searxng.closeDetail = function () {\n d.getElementById('results').classList.remove('image-detail-open');\n // remove #image-viewer hash from url by navigating back\n if (window.location.hash == '#image-viewer') window.history.back();\n searxng.scrollPageToSelected();\n };\n searxng.on('.result-detail-close', 'click', e => {\n e.preventDefault();\n searxng.closeDetail();\n });\n searxng.on('.result-detail-previous', 'click', e => {\n e.preventDefault();\n searxng.selectPrevious(false);\n });\n searxng.on('.result-detail-next', 'click', e => {\n e.preventDefault();\n searxng.selectNext(false);\n });\n\n // listen for the back button to be pressed and dismiss the image details when called\n window.addEventListener('hashchange', () => {\n if (window.location.hash != '#image-viewer') searxng.closeDetail();\n });\n\n d.querySelectorAll('.swipe-horizontal').forEach(\n obj => {\n obj.addEventListener('swiped-left', function () {\n searxng.selectNext(false);\n });\n obj.addEventListener('swiped-right', function () {\n searxng.selectPrevious(false);\n });\n }\n );\n\n w.addEventListener('scroll', function () {\n var e = d.getElementById('backToTop'),\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n results = d.getElementById('results');\n if (e !== null) {\n if (scrollTop >= 100) {\n results.classList.add('scrolling');\n } else {\n results.classList.remove('scrolling');\n }\n }\n }, true);\n\n });\n\n})(window, document, window.searxng);\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i @baptistedonaux\n */\nvar AutoComplete = /** @class */ (function () {\n // Constructor\n function AutoComplete(params, selector) {\n if (params === void 0) { params = {}; }\n if (selector === void 0) { selector = \"[data-autocomplete]\"; }\n if (Array.isArray(selector)) {\n selector.forEach(function (s) {\n new AutoComplete(params, s);\n });\n }\n else if (typeof selector == \"string\") {\n var elements = document.querySelectorAll(selector);\n Array.prototype.forEach.call(elements, function (input) {\n new AutoComplete(params, input);\n });\n }\n else {\n var specificParams = AutoComplete.merge(AutoComplete.defaults, params, {\n DOMResults: document.createElement(\"div\")\n });\n AutoComplete.prototype.create(specificParams, selector);\n return specificParams;\n }\n }\n AutoComplete.prototype.create = function (params, element) {\n params.Input = element;\n if (params.Input.nodeName.match(/^INPUT$/i) && (params.Input.hasAttribute(\"type\") === false || params.Input.getAttribute(\"type\").match(/^TEXT|SEARCH$/i))) {\n params.Input.setAttribute(\"autocomplete\", \"off\");\n params._Position(params);\n params.Input.parentNode.appendChild(params.DOMResults);\n params.$Listeners = {\n blur: params._Blur.bind(params),\n destroy: AutoComplete.prototype.destroy.bind(null, params),\n focus: params._Focus.bind(params),\n keyup: AutoComplete.prototype.event.bind(null, params, EventType.KEYUP),\n keydown: AutoComplete.prototype.event.bind(null, params, EventType.KEYDOWN),\n position: params._Position.bind(params)\n };\n for (var event in params.$Listeners) {\n params.Input.addEventListener(event, params.$Listeners[event]);\n }\n }\n };\n AutoComplete.prototype.getEventsByType = function (params, type) {\n var mappings = {};\n for (var key in params.KeyboardMappings) {\n var event = EventType.KEYUP;\n if (params.KeyboardMappings[key].Event !== undefined) {\n event = params.KeyboardMappings[key].Event;\n }\n if (event == type) {\n mappings[key] = params.KeyboardMappings[key];\n }\n }\n return mappings;\n };\n AutoComplete.prototype.event = function (params, type, event) {\n var eventIdentifier = function (condition) {\n if ((match === true && mapping.Operator == ConditionOperator.AND) || (match === false && mapping.Operator == ConditionOperator.OR)) {\n condition = AutoComplete.merge({\n Not: false\n }, condition);\n if (condition.hasOwnProperty(\"Is\")) {\n if (condition.Is == event.keyCode) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n else if (condition.hasOwnProperty(\"From\") && condition.hasOwnProperty(\"To\")) {\n if (event.keyCode >= condition.From && event.keyCode <= condition.To) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n }\n };\n for (var name in AutoComplete.prototype.getEventsByType(params, type)) {\n var mapping = AutoComplete.merge({\n Operator: ConditionOperator.AND\n }, params.KeyboardMappings[name]), match = ConditionOperator.AND == mapping.Operator;\n mapping.Conditions.forEach(eventIdentifier);\n if (match === true) {\n mapping.Callback.call(params, event);\n }\n }\n };\n AutoComplete.prototype.makeRequest = function (params, callback, callbackErr) {\n var propertyHttpHeaders = Object.getOwnPropertyNames(params.HttpHeaders), request = new XMLHttpRequest(), method = params._HttpMethod(), url = params._Url(), queryParams = params._Pre(), queryParamsStringify = encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(queryParams);\n if (method.match(/^GET$/i)) {\n if (url.indexOf(\"?\") !== -1) {\n url += \"&\" + queryParamsStringify;\n }\n else {\n url += \"?\" + queryParamsStringify;\n }\n }\n request.open(method, url, true);\n for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) {\n request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]);\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4 && request.status == 200) {\n params.$Cache[queryParams] = request.response;\n callback(request.response);\n }\n else if (request.status >= 400) {\n callbackErr();\n }\n };\n return request;\n };\n AutoComplete.prototype.ajax = function (params, request, timeout) {\n if (timeout === void 0) { timeout = true; }\n if (params.$AjaxTimer) {\n window.clearTimeout(params.$AjaxTimer);\n }\n if (timeout === true) {\n params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n }\n else {\n if (params.Request) {\n params.Request.abort();\n }\n params.Request = request;\n params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n }\n };\n AutoComplete.prototype.cache = function (params, callback, callbackErr) {\n var response = params._Cache(params._Pre());\n if (response === undefined) {\n var request = AutoComplete.prototype.makeRequest(params, callback, callbackErr);\n AutoComplete.prototype.ajax(params, request);\n }\n else {\n callback(response);\n }\n };\n AutoComplete.prototype.destroy = function (params) {\n for (var event in params.$Listeners) {\n params.Input.removeEventListener(event, params.$Listeners[event]);\n }\n params.DOMResults.parentNode.removeChild(params.DOMResults);\n };\n AutoComplete.merge = function () {\n var merge = {}, tmp;\n for (var i = 0; i < arguments.length; i++) {\n for (tmp in arguments[i]) {\n merge[tmp] = arguments[i][tmp];\n }\n }\n return merge;\n };\n AutoComplete.defaults = {\n Delay: 150,\n EmptyMessage: \"No result here\",\n Highlight: {\n getRegex: function (value) {\n return new RegExp(value, \"ig\");\n },\n transform: function (value) {\n return \"\" + value + \"\";\n }\n },\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\"\n },\n Limit: 0,\n MinChars: 0,\n HttpMethod: \"GET\",\n QueryArg: \"q\",\n Url: null,\n KeyboardMappings: {\n \"Enter\": {\n Conditions: [{\n Is: 13,\n Not: false\n }],\n Callback: function (event) {\n if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive !== null) {\n event.preventDefault();\n this._Select(liActive);\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n }\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_down\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_up\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n var first = this.DOMResults.querySelector(\"li:first-child:not(.locked)\"), last = this.DOMResults.querySelector(\"li:last-child:not(.locked)\"), active = this.DOMResults.querySelector(\"li.active\");\n if (active) {\n var currentIndex = Array.prototype.indexOf.call(active.parentNode.children, active), position = currentIndex + (event.keyCode - 39), lisCount = this.DOMResults.getElementsByTagName(\"li\").length;\n if (position < 0) {\n position = lisCount - 1;\n }\n else if (position >= lisCount) {\n position = 0;\n }\n active.classList.remove(\"active\");\n active.parentElement.children.item(position).classList.add(\"active\");\n }\n else if (last && event.keyCode == 38) {\n last.classList.add(\"active\");\n }\n else if (first) {\n first.classList.add(\"active\");\n }\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYUP\n },\n \"AlphaNum\": {\n Conditions: [{\n Is: 13,\n Not: true\n }, {\n From: 35,\n To: 40,\n Not: true\n }],\n Callback: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\"), currentValue = this._Pre();\n if (currentValue !== \"\" && currentValue.length >= this._MinChars()) {\n if (!oldValue || currentValue != oldValue) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n AutoComplete.prototype.cache(this, function (response) {\n this._Render(this._Post(response));\n this._Open();\n }.bind(this), this._Error);\n }\n else {\n this._Close();\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYUP\n }\n },\n DOMResults: null,\n Request: null,\n Input: null,\n /**\n * Return the message when no result returns\n */\n _EmptyMessage: function () {\n var emptyMessage = \"\";\n if (this.Input.hasAttribute(\"data-autocomplete-empty-message\")) {\n emptyMessage = this.Input.getAttribute(\"data-autocomplete-empty-message\");\n }\n else if (this.EmptyMessage !== false) {\n emptyMessage = this.EmptyMessage;\n }\n else {\n emptyMessage = \"\";\n }\n return emptyMessage;\n },\n /**\n * Returns the maximum number of results\n */\n _Limit: function () {\n var limit = this.Input.getAttribute(\"data-autocomplete-limit\");\n if (isNaN(limit) || limit === null) {\n return this.Limit;\n }\n return parseInt(limit, 10);\n },\n /**\n * Returns the minimum number of characters entered before firing ajax\n */\n _MinChars: function () {\n var minchars = this.Input.getAttribute(\"data-autocomplete-minchars\");\n if (isNaN(minchars) || minchars === null) {\n return this.MinChars;\n }\n return parseInt(minchars, 10);\n },\n /**\n * Apply transformation on labels response\n */\n _Highlight: function (label) {\n return label.replace(this.Highlight.getRegex(this._Pre()), this.Highlight.transform);\n },\n /**\n * Returns the HHTP method to use\n */\n _HttpMethod: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-method\")) {\n return this.Input.getAttribute(\"data-autocomplete-method\");\n }\n return this.HttpMethod;\n },\n /**\n * Returns the query param to use\n */\n _QueryArg: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-param-name\")) {\n return this.Input.getAttribute(\"data-autocomplete-param-name\");\n }\n return this.QueryArg;\n },\n /**\n * Returns the URL to use for AJAX request\n */\n _Url: function () {\n if (this.Input.hasAttribute(\"data-autocomplete\")) {\n return this.Input.getAttribute(\"data-autocomplete\");\n }\n return this.Url;\n },\n /**\n * Manage the close\n */\n _Blur: function (now) {\n if (now === void 0) { now = false; }\n if (now) {\n this._Close();\n }\n else {\n var params = this;\n setTimeout(function () {\n params._Blur(true);\n }, 150);\n }\n },\n /**\n * Manage the cache\n */\n _Cache: function (value) {\n return this.$Cache[value];\n },\n /**\n * Manage the open\n */\n _Focus: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\");\n if ((!oldValue || this.Input.value != oldValue) && this._MinChars() <= this.Input.value.length) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n },\n /**\n * Bind all results item if one result is opened\n */\n _Open: function () {\n var params = this;\n Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n if (li.getAttribute(\"class\") != \"locked\") {\n li.onclick = function () {\n params._Select(li);\n };\n }\n });\n },\n _Close: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n },\n /**\n * Position the results HTML element\n */\n _Position: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n this.DOMResults.setAttribute(\"style\", \"top:\" + (this.Input.offsetTop + this.Input.offsetHeight) + \"px;left:\" + this.Input.offsetLeft + \"px;width:\" + this.Input.clientWidth + \"px;\");\n },\n /**\n * Execute the render of results DOM element\n */\n _Render: function (response) {\n var ul;\n if (typeof response == \"string\") {\n ul = this._RenderRaw(response);\n }\n else {\n ul = this._RenderResponseItems(response);\n }\n if (this.DOMResults.hasChildNodes()) {\n this.DOMResults.removeChild(this.DOMResults.childNodes[0]);\n }\n this.DOMResults.appendChild(ul);\n },\n /**\n * ResponseItems[] rendering\n */\n _RenderResponseItems: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\"), limit = this._Limit();\n // Order\n if (limit < 0) {\n response = response.reverse();\n }\n else if (limit === 0) {\n limit = response.length;\n }\n for (var item = 0; item < Math.min(Math.abs(limit), response.length); item++) {\n li.innerHTML = response[item].Label;\n li.setAttribute(\"data-autocomplete-value\", response[item].Value);\n ul.appendChild(li);\n li = document.createElement(\"li\");\n }\n return ul;\n },\n /**\n * string response rendering (RAW HTML)\n */\n _RenderRaw: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\");\n if (response.length > 0) {\n this.DOMResults.innerHTML = response;\n }\n else {\n var emptyMessage = this._EmptyMessage();\n if (emptyMessage !== \"\") {\n li.innerHTML = emptyMessage;\n li.setAttribute(\"class\", \"locked\");\n ul.appendChild(li);\n }\n }\n return ul;\n },\n /**\n * Deal with request response\n */\n _Post: function (response) {\n try {\n var returnResponse = [];\n //JSON return\n var json = JSON.parse(response);\n if (Object.keys(json).length === 0) {\n return \"\";\n }\n if (Array.isArray(json)) {\n for (var i = 0; i < Object.keys(json).length; i++) {\n returnResponse[returnResponse.length] = { \"Value\": json[i], \"Label\": this._Highlight(json[i]) };\n }\n }\n else {\n for (var value in json) {\n returnResponse.push({\n \"Value\": value,\n \"Label\": this._Highlight(json[value])\n });\n }\n }\n return returnResponse;\n }\n catch (event) {\n //HTML return\n return response;\n }\n },\n /**\n * Return the autocomplete value to send (before request)\n */\n _Pre: function () {\n return this.Input.value;\n },\n /**\n * Choice one result item\n */\n _Select: function (item) {\n if (item.hasAttribute(\"data-autocomplete-value\")) {\n this.Input.value = item.getAttribute(\"data-autocomplete-value\");\n }\n else {\n this.Input.value = item.innerHTML;\n }\n this.Input.setAttribute(\"data-autocomplete-old-value\", this.Input.value);\n },\n /**\n * Handle HTTP error on the request\n */\n _Error: function () {\n },\n $AjaxTimer: null,\n $Cache: {},\n $Listeners: {}\n };\n return AutoComplete;\n}());\nmodule.exports = AutoComplete;\n\n},{}]},{},[1])(1)\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* exported AutoComplete */\n\nimport AutoComplete from \"../../../node_modules/autocomplete-js/dist/autocomplete.js\";\n\n(function (w, d, searxng) {\n 'use strict';\n\n var qinput_id = \"q\", qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function (ev) {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener('input', updateClearButton, false);\n }\n\n searxng.ready(function () {\n qinput = d.getElementById(qinput_id);\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.settings.autocomplete) {\n searxng.autocomplete = AutoComplete.call(w, {\n Url: \"./autocompleter\",\n EmptyMessage: searxng.settings.translations.no_item_found,\n HttpMethod: searxng.settings.method,\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n },\n MinChars: searxng.settings.autocomplete_min,\n Delay: 300,\n _Position: function () {},\n _Open: function () {\n var params = this;\n Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n if (li.getAttribute(\"class\") != \"locked\") {\n li.onmousedown = function () {\n params._Select(li);\n };\n }\n });\n },\n _Select: function (item) {\n AutoComplete.defaults._Select.call(this, item);\n var form = item.closest('form');\n if (form) {\n form.submit();\n }\n },\n _MinChars: function () {\n if (this.Input.value.indexOf('!') > -1) {\n return 0;\n } else {\n return AutoComplete.defaults._MinChars.call(this);\n }\n },\n KeyboardMappings: Object.assign({}, AutoComplete.defaults.KeyboardMappings, {\n \"KeyUpAndDown_up\": Object.assign({}, AutoComplete.defaults.KeyboardMappings.KeyUpAndDown_up, {\n Callback: function (event) {\n AutoComplete.defaults.KeyboardMappings.KeyUpAndDown_up.Callback.call(this, event);\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive) {\n AutoComplete.defaults._Select.call(this, liActive);\n }\n },\n }),\n \"Tab\": Object.assign({}, AutoComplete.defaults.KeyboardMappings.Enter, {\n Conditions: [{\n Is: 9,\n Not: false\n }],\n Callback: function (event) {\n if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive !== null) {\n AutoComplete.defaults._Select.call(this, liActive);\n event.preventDefault();\n }\n }\n },\n })\n }),\n }, \"#\" + qinput_id);\n }\n\n /*\n Monkey patch autocomplete.js to fix a bug\n With the POST method, the values are not URL encoded: query like \"1 + 1\" are sent as \"1 1\" since space are URL encoded as plus.\n See HTML specifications:\n * HTML5: https://url.spec.whatwg.org/#concept-urlencoded-serializer\n * HTML4: https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n\n autocomplete.js does not URL encode the name and values:\n https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/src/autocomplete.ts#L665\n\n The monkey patch overrides the compiled version of the ajax function.\n See https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/dist/autocomplete.js#L143-L158\n The patch changes only the line 156 from\n params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n to\n params.Request.send(encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(params._Pre()));\n\n Related to:\n * https://github.com/autocompletejs/autocomplete.js/issues/78\n * https://github.com/searxng/searxng/issues/1695\n */\n AutoComplete.prototype.ajax = function (params, request, timeout) {\n if (timeout === void 0) { timeout = true; }\n if (params.$AjaxTimer) {\n window.clearTimeout(params.$AjaxTimer);\n }\n if (timeout === true) {\n params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n } else {\n if (params.Request) {\n params.Request.abort();\n }\n params.Request = request;\n params.Request.send(encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(params._Pre()));\n }\n };\n\n if (!isMobile && document.querySelector('.index_endpoint')) {\n qinput.focus();\n }\n }\n\n // Additionally to searching when selecting a new category, we also\n // automatically start a new search request when the user changes a search\n // filter (safesearch, time range or language) (this requires JavaScript\n // though)\n if (\n qinput !== null\n && searxng.settings.search_on_category_select\n // If .search_filters is undefined (invisible) we are on the homepage and\n // hence don't have to set any listeners\n && d.querySelector(\".search_filters\") != null\n ) {\n searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n }\n\n const categoryButtons = d.querySelectorAll(\"button.category_button\");\n for (let button of categoryButtons) {\n searxng.on(button, 'click', (event) => {\n if (event.shiftKey) {\n event.preventDefault();\n button.classList.toggle(\"selected\");\n return;\n }\n\n // manually deselect the old selection when a new category is selected\n const selectedCategories = d.querySelectorAll(\"button.category_button.selected\");\n for (let categoryButton of selectedCategories) {\n categoryButton.classList.remove(\"selected\");\n }\n button.classList.add(\"selected\");\n })\n }\n\n // override form submit action to update the actually selected categories\n const form = d.querySelector(\"#search\");\n if (form != null) {\n searxng.on(form, 'submit', (event) => {\n event.preventDefault();\n const categoryValuesInput = d.querySelector(\"#selected-categories\");\n if (categoryValuesInput) {\n let categoryValues = [];\n for (let categoryButton of categoryButtons) {\n if (categoryButton.classList.contains(\"selected\")) {\n categoryValues.push(categoryButton.name.replace(\"category_\", \"\"));\n }\n }\n categoryValuesInput.value = categoryValues.join(\",\");\n }\n form.submit();\n });\n }\n });\n\n})(window, document, window.searxng);\n"],"names":["w","ElementPrototype","selector","node","nodes","i","callbackSafe","callback","el","e","exception","searxng","obj","eventType","useCapture","found","method","url","data","resolve","reject","req","ex","src","path","id","s","newNode","referenceNode","getEndpoint","className","d","onlyImages","newLoadSpinner","loader","replaceChildrenWith","element","children","child","loadNextPage","form","formData","response","nextPageDoc","articleList","paginationElement","articleElement","err","intersectionObserveOptions","observedSelector","observer","entries","paginationEntry","isElementInDetail","getResultElement","isImageResult","resultElement","highlightResult","baseKeyBinding","removeFocus","copyURLToClipboard","toggleHelp","searchInputFocus","GoToNextPage","openResult","GoToPreviousPage","reloadPage","keyBindingLayouts","scrollPage","scrollPageTo","keyBindings","tagName","which","noScroll","keepFocus","current","effectiveWhich","next","results","top","bot","etop","ebot","link","scrollPageToSelected","pageButtonClick","css_selector","button","sel","wtop","wheight","offset","wbot","amount","position","nav","q","len","newTab","initHelpContent","divElement","categories","k","key","sorted","a","b","html","cat","lastCategory","first","cj","helpPanel","body","currentUrlElement","event","leaflet_target","map_lon","map_lat","map_zoom","map_boundingbox","map_geojson","map_bounds","southWest","northEast","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","baseLayers","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","enableAllEngines","disableAllEngines","engineToggles","toggleEngines","enable","copyHashButton","window","document","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","changedTouches","eventData","xUp","yUp","attributeName","defaultValue","attributeValue","img","btnLabelCollapsed","btnLabelNotCollapsed","target","targetElement","iframe_load","srctest","imgTimeoutID","imgLoaderSpinner","imgLoader","loadImage","imgSrc","onSuccess","thumbnail","scrollTop","f","module","r","n","t","o","c","require","u","p","exports","ConditionOperator","EventType","AutoComplete","input","specificParams","type","mappings","eventIdentifier","condition","match","mapping","name","callbackErr","propertyHttpHeaders","request","queryParams","queryParamsStringify","timeout","merge","tmp","value","liActive","last","active","currentIndex","lisCount","oldValue","currentValue","emptyMessage","limit","minchars","label","now","li","ul","item","returnResponse","json","qinput_id","qinput","isMobile","submitIfQuery","search","createClearButton","cs","updateClearButton","ev","categoryButtons","selectedCategories","categoryButton","categoryValuesInput","categoryValues"],"mappings":"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","x_google_ignoreList":[5,7]} \ No newline at end of file +{"version":3,"file":"searxng.min.js","sources":["../../../../../client/simple/src/js/main/00_toolkit.js","../../../../../client/simple/src/js/main/infinite_scroll.js","../../../../../client/simple/src/js/main/keyboard.js","../../../../../client/simple/src/js/main/mapresult.js","../../../../../client/simple/src/js/main/preferences.js","../../../../../client/simple/node_modules/swiped-events/src/swiped-events.js","../../../../../client/simple/src/js/main/results.js","../../../../../client/simple/src/js/main/search.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n 'use strict';\n\n // not invented here toolkit with bugs fixed elsewhere\n // purposes : be just good enough and as small as possible\n\n // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n if (w.Element) {\n (function (ElementPrototype) {\n ElementPrototype.matches = ElementPrototype.matches ||\n ElementPrototype.matchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n function (selector) {\n var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n while (nodes[++i] && nodes[i] != node);\n return !!nodes[i];\n };\n })(Element.prototype);\n }\n\n function callbackSafe (callback, el, e) {\n try {\n callback.call(el, e);\n } catch (exception) {\n console.log(exception);\n }\n }\n\n var searxng = window.searxng || {};\n\n searxng.on = function (obj, eventType, callback, useCapture) {\n useCapture = useCapture || false;\n if (typeof obj !== 'string') {\n // obj HTMLElement, HTMLDocument\n obj.addEventListener(eventType, callback, useCapture);\n } else {\n // obj is a selector\n d.addEventListener(eventType, function (e) {\n var el = e.target || e.srcElement, found = false;\n while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n if (found) callbackSafe(callback, el, e);\n }, useCapture);\n }\n };\n\n searxng.ready = function (callback) {\n if (document.readyState != 'loading') {\n callback.call(w);\n } else {\n w.addEventListener('DOMContentLoaded', callback.bind(w));\n }\n };\n\n searxng.http = function (method, url, data = null) {\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n req.open(method, url, true);\n req.timeout = 20000;\n\n // On load\n req.onload = function () {\n if (req.status == 200) {\n resolve(req.response, req.responseType);\n } else {\n reject(Error(req.statusText));\n }\n };\n\n // Handle network errors\n req.onerror = function () {\n reject(Error(\"Network Error\"));\n };\n\n req.onabort = function () {\n reject(Error(\"Transaction is aborted\"));\n };\n\n req.ontimeout = function () {\n reject(Error(\"Timeout\"));\n }\n\n // Make the request\n if (data) {\n req.send(data)\n } else {\n req.send();\n }\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n searxng.loadStyle = function (src) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"style_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('link');\n s.setAttribute('id', id);\n s.setAttribute('rel', 'stylesheet');\n s.setAttribute('type', 'text/css');\n s.setAttribute('href', path);\n d.body.appendChild(s);\n }\n };\n\n searxng.loadScript = function (src, callback) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"script_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('script');\n s.setAttribute('id', id);\n s.setAttribute('src', path);\n s.onload = callback;\n s.onerror = function () {\n s.setAttribute('error', '1');\n };\n d.body.appendChild(s);\n } else if (!s.hasAttribute('error')) {\n try {\n callback.apply(s, []);\n } catch (exception) {\n console.log(exception);\n }\n } else {\n console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n }\n };\n\n searxng.insertBefore = function (newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n };\n\n searxng.insertAfter = function (newNode, referenceNode) {\n referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n };\n\n searxng.on('.close', 'click', function () {\n this.parentNode.classList.add('invisible');\n });\n\n function getEndpoint () {\n for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n if (className.endsWith('_endpoint')) {\n return className.split('_')[0];\n }\n }\n return '';\n }\n\n searxng.endpoint = getEndpoint();\n\n return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n 'use strict';\n\n searxng.infinite_scroll_supported = (\n 'IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n if (!searxng.infinite_scroll_supported) {\n console.log('IntersectionObserver not supported');\n return;\n }\n\n let d = document;\n var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n function newLoadSpinner () {\n var loader = d.createElement('div');\n loader.classList.add('loader');\n return loader;\n }\n\n function replaceChildrenWith (element, children) {\n element.textContent = '';\n children.forEach(child => element.appendChild(child));\n }\n\n function loadNextPage (callback) {\n var form = d.querySelector('#pagination form.next_page');\n if (!form) {\n return\n }\n replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n var formData = new FormData(form);\n searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n function (response) {\n var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n var articleList = nextPageDoc.querySelectorAll('#urls article');\n var paginationElement = nextPageDoc.querySelector('#pagination');\n d.querySelector('#pagination').remove();\n if (articleList.length > 0 && !onlyImages) {\n // do not add
    element when there are only images\n d.querySelector('#urls').appendChild(d.createElement('hr'));\n }\n articleList.forEach(articleElement => {\n d.querySelector('#urls').appendChild(articleElement);\n });\n if (paginationElement) {\n d.querySelector('#results').appendChild(paginationElement);\n callback();\n }\n }\n ).catch(\n function (err) {\n console.log(err);\n var e = d.createElement('div');\n e.textContent = searxng.settings.translations.error_loading_next_page;\n e.classList.add('dialog-error');\n e.setAttribute('role', 'alert');\n replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n }\n )\n }\n\n if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) {\n const intersectionObserveOptions = {\n rootMargin: \"20rem\",\n };\n const observedSelector = 'article.result:last-child';\n const observer = new IntersectionObserver(entries => {\n const paginationEntry = entries[0];\n if (paginationEntry.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n }\n });\n observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n function isElementInDetail (el) {\n while (el !== undefined) {\n if (el.classList.contains('detail')) {\n return true;\n }\n if (el.classList.contains('result')) {\n // we found a result, no need to go to the root of the document:\n // el is not inside a
    element\n return false;\n }\n el = el.parentNode;\n }\n return false;\n }\n\n function getResultElement (el) {\n while (el !== undefined) {\n if (el.classList.contains('result')) {\n return el;\n }\n el = el.parentNode;\n }\n return undefined;\n }\n\n function isImageResult (resultElement) {\n return resultElement && resultElement.classList.contains('result-images');\n }\n\n searxng.on('.result', 'click', function (e) {\n if (!isElementInDetail(e.target)) {\n highlightResult(this)(true, true);\n let resultElement = getResultElement(e.target);\n if (isImageResult(resultElement)) {\n e.preventDefault();\n searxng.selectImage(resultElement);\n }\n }\n });\n\n searxng.on('.result a', 'focus', function (e) {\n if (!isElementInDetail(e.target)) {\n let resultElement = getResultElement(e.target);\n if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n highlightResult(resultElement)(true);\n }\n if (isImageResult(resultElement)) {\n searxng.selectImage(resultElement);\n }\n }\n }, true);\n\n /* common base for layouts */\n var baseKeyBinding = {\n 'Escape': {\n key: 'ESC',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 'c': {\n key: 'c',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n 'h': {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n },\n 'i': {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 'n': {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 'o': {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 'p': {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 'r': {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 't': {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n };\n var keyBindingLayouts = {\n\n \"default\": Object.assign(\n { /* SearXNG layout */\n 'ArrowLeft': {\n key: '←',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'ArrowRight': {\n key: '→',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n }, baseKeyBinding),\n\n 'vim': Object.assign(\n { /* Vim-like Key Layout. */\n 'b': {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 'f': {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 'u': {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 'd': {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 'g': {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 'v': {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 'k': {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'j': {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n 'y': {\n key: 'y',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n }, baseKeyBinding)\n }\n\n var keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default;\n\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (\n Object.prototype.hasOwnProperty.call(keyBindings, e.key)\n && !e.ctrlKey && !e.altKey\n && !e.shiftKey && !e.metaKey\n ) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.key === 'Escape') {\n keyBindings[e.key].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n keyBindings[e.key].fun();\n }\n }\n }\n });\n\n function highlightResult (which) {\n return function (noScroll, keepFocus) {\n var current = document.querySelector('.result[data-vim-selected]'),\n effectiveWhich = which;\n if (current === null) {\n // no selection : choose the first one\n current = document.querySelector('.result');\n if (current === null) {\n // no first one : there are no results\n return;\n }\n // replace up/down actions by selecting first one\n if (which === \"down\" || which === \"up\") {\n effectiveWhich = current;\n }\n }\n\n var next, results = document.querySelectorAll('.result');\n results = Array.from(results); // convert NodeList to Array for further use\n\n if (typeof effectiveWhich !== 'string') {\n next = effectiveWhich;\n } else {\n switch (effectiveWhich) {\n case 'visible':\n var top = document.documentElement.scrollTop || document.body.scrollTop;\n var bot = top + document.documentElement.clientHeight;\n\n for (var i = 0; i < results.length; i++) {\n next = results[i];\n var etop = next.offsetTop;\n var ebot = etop + next.clientHeight;\n\n if ((ebot <= bot) && (etop > top)) {\n break;\n }\n }\n break;\n case 'down':\n next = results[results.indexOf(current) + 1] || current;\n break;\n case 'up':\n next = results[results.indexOf(current) - 1] || current;\n break;\n case 'bottom':\n next = results[results.length - 1];\n break;\n case 'top':\n /* falls through */\n default:\n next = results[0];\n }\n }\n\n if (next) {\n current.removeAttribute('data-vim-selected');\n next.setAttribute('data-vim-selected', 'true');\n if (!keepFocus) {\n var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\n }\n }\n if (!noScroll) {\n scrollPageToSelected();\n }\n }\n };\n }\n\n function reloadPage () {\n document.location.reload(true);\n }\n\n function removeFocus (e) {\n const tagName = e.target.tagName.toLowerCase();\n if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n document.activeElement.blur();\n } else {\n searxng.closeDetail();\n }\n }\n\n function pageButtonClick (css_selector) {\n return function () {\n var button = document.querySelector(css_selector);\n if (button) {\n button.click();\n }\n };\n }\n\n function GoToNextPage () {\n return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n }\n\n function GoToPreviousPage () {\n return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n }\n\n function scrollPageToSelected () {\n var sel = document.querySelector('.result[data-vim-selected]');\n if (sel === null) {\n return;\n }\n var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n wheight = document.documentElement.clientHeight,\n etop = sel.offsetTop,\n ebot = etop + sel.clientHeight,\n offset = 120;\n // first element ?\n if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n // set to the top of page if the first element\n // is fully included in the viewport\n window.scroll(window.scrollX, 0);\n return;\n }\n if (wtop > (etop - offset)) {\n window.scroll(window.scrollX, etop - offset);\n } else {\n var wbot = wtop + wheight;\n if (wbot < (ebot + offset)) {\n window.scroll(window.scrollX, ebot - wheight + offset);\n }\n }\n }\n\n function scrollPage (amount) {\n return function () {\n window.scrollBy(0, amount);\n highlightResult('visible')();\n };\n }\n\n function scrollPageTo (position, nav) {\n return function () {\n window.scrollTo(0, position);\n highlightResult(nav)();\n };\n }\n\n function searchInputFocus () {\n window.scrollTo(0, 0);\n var q = document.querySelector('#q');\n q.focus();\n if (q.setSelectionRange) {\n var len = q.value.length;\n q.setSelectionRange(len, len);\n }\n }\n\n function openResult (newTab) {\n return function () {\n var link = document.querySelector('.result[data-vim-selected] h3 a');\n if (link === null) {\n link = document.querySelector('.result[data-vim-selected] > a');\n }\n if (link !== null) {\n var url = link.getAttribute('href');\n if (newTab) {\n window.open(url);\n } else {\n window.location.href = url;\n }\n }\n };\n }\n\n function initHelpContent (divElement) {\n var categories = {};\n\n for (var k in keyBindings) {\n var key = keyBindings[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '×';\n html += '

    How to navigate SearXNG with hotkeys

    ';\n html += '';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '';\n }\n html += ''; // col-sm-*\n\n if (!first || lastCategory) {\n html += ''; // row\n }\n }\n\n html += '
    ';\n\n html += '

    ' + cat[0].cat + '

    ';\n html += '
      ';\n\n for (var cj in cat) {\n html += '
    • ' + cat[cj].key + ' ' + cat[cj].des + '
    • ';\n }\n\n html += '
    ';\n html += '
    ';\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp () {\n var helpPanel = document.querySelector('#vim-hotkeys-help');\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement('div');\n helpPanel.id = 'vim-hotkeys-help';\n helpPanel.className = 'dialog-modal';\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // toggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n function copyURLToClipboard () {\n var currentUrlElement = document.querySelector('.result[data-vim-selected] h3 a');\n if (currentUrlElement === null) return;\n\n const url = currentUrlElement.getAttribute('href');\n navigator.clipboard.writeText(url);\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data © OpenStreetMap contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data © OpenStreetMap contributors';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occur only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (' + searxng.settings.translations.Source + ': ' + description[1] + ')';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n\n const enableAllEngines = d.querySelectorAll(\".enable-all-engines\");\n const disableAllEngines = d.querySelectorAll(\".disable-all-engines\");\n const engineToggles = d.querySelectorAll('tbody input[type=checkbox][class~=checkbox-onoff]');\n const toggleEngines = (enable) => {\n for (const el of engineToggles) {\n // check if element visible, so that only engines of the current category are modified\n if (el.offsetParent !== null) el.checked = !enable;\n }\n };\n for (const el of enableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(true));\n }\n for (const el of disableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(false));\n }\n\n const copyHashButton = d.querySelector(\"#copy-hash\");\n searxng.on(copyHashButton, 'click', (e) => {\n e.preventDefault();\n navigator.clipboard.writeText(copyHashButton.dataset.hash);\n copyHashButton.innerText = copyHashButton.dataset.copiedText;\n });\n });\n})(window, document, window.searxng);\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty \n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n\nimport \"../../../node_modules/swiped-events/src/swiped-events.js\";\n\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n searxng.ready(function () {\n d.querySelectorAll('#urls img').forEach(\n img =>\n img.addEventListener(\n 'error', () => {\n // console.log(\"ERROR can't load: \" + img.src);\n img.src = window.searxng.settings.theme_static_path + \"/img/img_load_error.svg\";\n },\n {once: true}\n ));\n\n if (d.querySelector('#search_url button#copy_url')) {\n d.querySelector('#search_url button#copy_url').style.display = \"block\";\n }\n\n searxng.on('.btn-collapse', 'click', function () {\n var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n var target = this.getAttribute('data-target');\n var targetElement = d.querySelector(target);\n var html = this.innerHTML;\n if (this.classList.contains('collapsed')) {\n html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n } else {\n html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n }\n this.innerHTML = html;\n this.classList.toggle('collapsed');\n targetElement.classList.toggle('invisible');\n });\n\n searxng.on('.media-loader', 'click', function () {\n var target = this.getAttribute('data-target');\n var iframe_load = d.querySelector(target + ' > iframe');\n var srctest = iframe_load.getAttribute('src');\n if (srctest === null || srctest === undefined || srctest === false) {\n iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n }\n });\n\n searxng.on('#copy_url', 'click', function () {\n var target = this.parentElement.querySelector('pre');\n navigator.clipboard.writeText(target.innerText);\n this.innerText = this.dataset.copiedText;\n });\n\n // searxng.selectImage (gallery)\n // -----------------------------\n\n // setTimeout() ID, needed to cancel *last* loadImage\n let imgTimeoutID;\n\n // progress spinner, while an image is loading\n const imgLoaderSpinner = d.createElement('div');\n imgLoaderSpinner.classList.add('loader');\n\n // singleton image object, which is used for all loading processes of a\n // detailed image\n const imgLoader = new Image();\n\n const loadImage = (imgSrc, onSuccess) => {\n // if defered image load exists, stop defered task.\n if (imgTimeoutID) clearTimeout(imgTimeoutID);\n\n // defer load of the detail image for 1 sec\n imgTimeoutID = setTimeout(() => {\n imgLoader.src = imgSrc;\n }, 1000);\n\n // set handlers in the on-properties\n imgLoader.onload = () => {\n onSuccess();\n imgLoaderSpinner.remove();\n };\n imgLoader.onerror = () => {\n imgLoaderSpinner.remove();\n };\n };\n\n searxng.selectImage = (resultElement) => {\n\n // add a class that can be evaluated in the CSS and indicates that the\n // detail view is open\n d.getElementById('results').classList.add('image-detail-open');\n\n // add a hash to the browser history so that pressing back doesn't return\n // to the previous page this allows us to dismiss the image details on\n // pressing the back button on mobile devices\n window.location.hash = '#image-viewer';\n\n searxng.scrollPageToSelected();\n\n // if there is none element given by the caller, stop here\n if (!resultElement) return;\n\n // find object in the element, if there is none, stop here.\n const img = resultElement.querySelector('.result-images-source img');\n if (!img) return;\n\n // \n const src = img.getAttribute('data-src');\n\n // already loaded high-res image or no high-res image available\n if (!src) return;\n\n // use the image thumbnail until the image is fully loaded\n const thumbnail = resultElement.querySelector('.image_thumbnail');\n img.src = thumbnail.src;\n\n // show a progress spinner\n const detailElement = resultElement.querySelector('.detail');\n detailElement.appendChild(imgLoaderSpinner);\n\n // load full size image in background\n loadImage(src, () => {\n // after the singelton loadImage has loaded the detail image into the\n // cache, it can be used in the origin as src property.\n img.src = src;\n img.removeAttribute('data-src');\n });\n };\n\n searxng.closeDetail = function () {\n d.getElementById('results').classList.remove('image-detail-open');\n // remove #image-viewer hash from url by navigating back\n if (window.location.hash == '#image-viewer') window.history.back();\n searxng.scrollPageToSelected();\n };\n searxng.on('.result-detail-close', 'click', e => {\n e.preventDefault();\n searxng.closeDetail();\n });\n searxng.on('.result-detail-previous', 'click', e => {\n e.preventDefault();\n searxng.selectPrevious(false);\n });\n searxng.on('.result-detail-next', 'click', e => {\n e.preventDefault();\n searxng.selectNext(false);\n });\n\n // listen for the back button to be pressed and dismiss the image details when called\n window.addEventListener('hashchange', () => {\n if (window.location.hash != '#image-viewer') searxng.closeDetail();\n });\n\n d.querySelectorAll('.swipe-horizontal').forEach(\n obj => {\n obj.addEventListener('swiped-left', function () {\n searxng.selectNext(false);\n });\n obj.addEventListener('swiped-right', function () {\n searxng.selectPrevious(false);\n });\n }\n );\n\n w.addEventListener('scroll', function () {\n var e = d.getElementById('backToTop'),\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n results = d.getElementById('results');\n if (e !== null) {\n if (scrollTop >= 100) {\n results.classList.add('scrolling');\n } else {\n results.classList.remove('scrolling');\n }\n }\n }, true);\n\n });\n\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* exported AutoComplete */\n\n(function (w, d, searxng) {\n 'use strict';\n\n var qinput_id = \"q\", qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function (ev) {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener('input', updateClearButton, false);\n }\n\n const fetchResults = async (query) => {\n let request;\n if (searxng.settings.method === 'GET') {\n const reqParams = new URLSearchParams();\n reqParams.append(\"q\", query);\n request = fetch(\"./autocompleter?\" + reqParams.toString());\n } else {\n const formData = new FormData();\n formData.append(\"q\", query);\n request = fetch(\"./autocompleter\", {\n method: 'POST',\n body: formData,\n });\n }\n\n request.then(async function (response) {\n const results = await response.json();\n\n if (!results) return;\n\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n autocomplete.classList.add(\"open\");\n autocompleteList.innerHTML = \"\";\n\n // show an error message that no result was found\n if (!results[1] || results[1].length == 0) {\n const noItemFoundMessage = document.createElement(\"li\");\n noItemFoundMessage.classList.add('no-item-found');\n noItemFoundMessage.innerHTML = searxng.settings.translations.no_item_found;\n autocompleteList.appendChild(noItemFoundMessage);\n return;\n }\n\n for (let result of results[1]) {\n const li = document.createElement(\"li\");\n li.innerText = result;\n\n searxng.on(li, 'mousedown', () => {\n qinput.value = result;\n const form = d.querySelector(\"#search\");\n form.submit();\n autocomplete.classList.remove('open');\n });\n autocompleteList.appendChild(li);\n }\n });\n };\n\n searxng.ready(function () {\n // focus search input on large screens\n if (!isMobile) document.getElementById(\"q\").focus();\n\n qinput = d.getElementById(qinput_id);\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.settings.autocomplete) {\n searxng.on(qinput, 'input', () => {\n const query = qinput.value;\n if (query.length < searxng.settings.autocomplete_min) return;\n\n setTimeout(() => {\n if (query == qinput.value) fetchResults(query);\n }, 300);\n });\n\n searxng.on(qinput, 'keyup', (e) => {\n let currentIndex = -1;\n const listItems = autocompleteList.children;\n for (let i = 0; i < listItems.length; i++) {\n if (listItems[i].classList.contains('active')) {\n currentIndex = i;\n break;\n }\n }\n\n let newCurrentIndex = -1;\n if (e.key === \"ArrowUp\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove('active');\n // we need to add listItems.length to the index calculation here because the JavaScript modulos\n // operator doesn't work with negative numbers\n newCurrentIndex = (currentIndex - 1 + listItems.length) % listItems.length;\n } else if (e.key === \"ArrowDown\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove('active');\n newCurrentIndex = (currentIndex + 1) % listItems.length;\n } else if (e.key === \"Tab\" || e.key === \"Enter\") {\n autocomplete.classList.remove('open');\n }\n\n if (newCurrentIndex != -1) {\n const selectedItem = listItems[newCurrentIndex];\n selectedItem.classList.add('active');\n\n if (!selectedItem.classList.contains('no-item-found')) qinput.value = selectedItem.innerText;\n }\n });\n }\n }\n\n // Additionally to searching when selecting a new category, we also\n // automatically start a new search request when the user changes a search\n // filter (safesearch, time range or language) (this requires JavaScript\n // though)\n if (\n qinput !== null\n && searxng.settings.search_on_category_select\n // If .search_filters is undefined (invisible) we are on the homepage and\n // hence don't have to set any listeners\n && d.querySelector(\".search_filters\") != null\n ) {\n searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n }\n\n const categoryButtons = d.querySelectorAll(\"button.category_button\");\n for (let button of categoryButtons) {\n searxng.on(button, 'click', (event) => {\n if (event.shiftKey) {\n event.preventDefault();\n button.classList.toggle(\"selected\");\n return;\n }\n\n // manually deselect the old selection when a new category is selected\n const selectedCategories = d.querySelectorAll(\"button.category_button.selected\");\n for (let categoryButton of selectedCategories) {\n categoryButton.classList.remove(\"selected\");\n }\n button.classList.add(\"selected\");\n });\n }\n\n // override form submit action to update the actually selected categories\n const form = d.querySelector(\"#search\");\n if (form != null) {\n searxng.on(form, 'submit', (event) => {\n event.preventDefault();\n const categoryValuesInput = d.querySelector(\"#selected-categories\");\n if (categoryValuesInput) {\n let categoryValues = [];\n for (let categoryButton of categoryButtons) {\n if (categoryButton.classList.contains(\"selected\")) {\n categoryValues.push(categoryButton.name.replace(\"category_\", \"\"));\n }\n }\n categoryValuesInput.value = categoryValues.join(\",\");\n }\n form.submit();\n });\n }\n });\n\n})(window, document, window.searxng);\n"],"names":["w","d","ElementPrototype","selector","node","nodes","i","callbackSafe","callback","el","e","exception","searxng","obj","eventType","useCapture","found","method","url","data","resolve","reject","req","ex","src","path","id","s","newNode","referenceNode","getEndpoint","className","onlyImages","newLoadSpinner","loader","replaceChildrenWith","element","children","child","loadNextPage","form","formData","response","nextPageDoc","articleList","paginationElement","articleElement","err","intersectionObserveOptions","observedSelector","observer","entries","paginationEntry","isElementInDetail","getResultElement","isImageResult","resultElement","highlightResult","baseKeyBinding","removeFocus","copyURLToClipboard","toggleHelp","searchInputFocus","GoToNextPage","openResult","GoToPreviousPage","reloadPage","keyBindingLayouts","scrollPage","scrollPageTo","keyBindings","tagName","which","noScroll","keepFocus","current","effectiveWhich","next","results","top","bot","etop","ebot","link","scrollPageToSelected","pageButtonClick","css_selector","button","sel","wtop","wheight","offset","wbot","amount","position","nav","q","len","newTab","initHelpContent","divElement","categories","k","key","sorted","a","b","html","cat","lastCategory","first","cj","helpPanel","body","currentUrlElement","event","leaflet_target","map_lon","map_lat","map_zoom","map_boundingbox","map_geojson","map_bounds","southWest","northEast","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","baseLayers","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","enableAllEngines","disableAllEngines","engineToggles","toggleEngines","enable","copyHashButton","window","document","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","changedTouches","eventData","xUp","yUp","attributeName","defaultValue","attributeValue","img","btnLabelCollapsed","btnLabelNotCollapsed","target","targetElement","iframe_load","srctest","imgTimeoutID","imgLoaderSpinner","imgLoader","loadImage","imgSrc","onSuccess","thumbnail","scrollTop","qinput_id","qinput","isMobile","submitIfQuery","search","createClearButton","cs","updateClearButton","ev","fetchResults","query","request","reqParams","autocomplete","autocompleteList","noItemFoundMessage","result","li","currentIndex","listItems","newCurrentIndex","selectedItem","categoryButtons","selectedCategories","categoryButton","categoryValuesInput","categoryValues"],"mappings":"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","x_google_ignoreList":[5]} \ No newline at end of file From d29cf64ce4932916affd68232aed19d01c6758b5 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Thu, 22 May 2025 16:23:30 +0200 Subject: [PATCH 49/74] [mod] searx.data: lazy load of the data objects (databases) (#4834) In the previous implementation, all databases were loaded into memory when importing the searx.data package, regardless of whether they were ever needed. Regardless of this, it is an antipattern to load entire databases into memory when importing a package or module; databases should be loaded when needed. Lazy loading is a first step toward improving memory usage and also improves performance when setting up the runtime environment. Building on this, subsequent PRs will be able to further optimize memory behavior, e.g., by using a real database application such as the one already available via searx.cache.ExpireCache Related: - https://github.com/searxng/searxng/discussions/1892 - https://github.com/searxng/searxng/pull/3458 - https://github.com/searxng/searxng/pull/4650 Signed-off-by: Markus Heiser --- searx/data/__init__.py | 81 ++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 26 deletions(-) diff --git a/searx/data/__init__.py b/searx/data/__init__.py index 28a3974fa..48455ebe3 100644 --- a/searx/data/__init__.py +++ b/searx/data/__init__.py @@ -5,28 +5,68 @@ """ -__all__ = [ - 'ENGINE_TRAITS', - 'CURRENCIES', - 'USER_AGENTS', - 'EXTERNAL_URLS', - 'WIKIDATA_UNITS', - 'EXTERNAL_BANGS', - 'OSM_KEYS_TAGS', - 'ENGINE_DESCRIPTIONS', - 'LOCALES', - 'ahmia_blacklist_loader', -] + +__all__ = ["ahmia_blacklist_loader"] import json from pathlib import Path +import typing + +from searx import logger + +log = logger.getChild("data") data_dir = Path(__file__).parent +CURRENCIES: dict[str, typing.Any] +USER_AGENTS: dict[str, typing.Any] +EXTERNAL_URLS: dict[str, typing.Any] +WIKIDATA_UNITS: dict[str, typing.Any] +EXTERNAL_BANGS: dict[str, typing.Any] +OSM_KEYS_TAGS: dict[str, typing.Any] +ENGINE_DESCRIPTIONS: dict[str, typing.Any] +ENGINE_TRAITS: dict[str, typing.Any] +LOCALES: dict[str, typing.Any] -def _load(filename): - with open(data_dir / filename, encoding='utf-8') as f: - return json.load(f) +lazy_globals = { + "CURRENCIES": None, + "USER_AGENTS": None, + "EXTERNAL_URLS": None, + "WIKIDATA_UNITS": None, + "EXTERNAL_BANGS": None, + "OSM_KEYS_TAGS": None, + "ENGINE_DESCRIPTIONS": None, + "ENGINE_TRAITS": None, + "LOCALES": None, +} + +data_json_files = { + "CURRENCIES": "currencies.json", + "USER_AGENTS": "useragents.json", + "EXTERNAL_URLS": "external_urls.json", + "WIKIDATA_UNITS": "wikidata_units.json", + "EXTERNAL_BANGS": "external_bangs.json", + "OSM_KEYS_TAGS": "osm_keys_tags.json", + "ENGINE_DESCRIPTIONS": "engine_descriptions.json", + "ENGINE_TRAITS": "engine_traits.json", + "LOCALES": "locales.json", +} + + +def __getattr__(name): + # lazy init of the global objects + if name not in lazy_globals: + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + data = lazy_globals[name] + if data is not None: + return data + + log.debug("init searx.data.%s", name) + with open(data_dir / data_json_files[name], encoding='utf-8') as f: + lazy_globals[name] = json.load(f) + + return lazy_globals[name] def ahmia_blacklist_loader(): @@ -40,14 +80,3 @@ def ahmia_blacklist_loader(): """ with open(data_dir / 'ahmia_blacklist.txt', encoding='utf-8') as f: return f.read().split() - - -CURRENCIES = _load('currencies.json') -USER_AGENTS = _load('useragents.json') -EXTERNAL_URLS = _load('external_urls.json') -WIKIDATA_UNITS = _load('wikidata_units.json') -EXTERNAL_BANGS = _load('external_bangs.json') -OSM_KEYS_TAGS = _load('osm_keys_tags.json') -ENGINE_DESCRIPTIONS = _load('engine_descriptions.json') -ENGINE_TRAITS = _load('engine_traits.json') -LOCALES = _load('locales.json') From 98badc9cd0cfd00405014f843de7dd883d75ecca Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Thu, 22 May 2025 17:43:11 +0200 Subject: [PATCH 50/74] [fix] searx.data: fetch-traits - z-library (httpx.ConnectError) (#4835) There is currently no known z-library, and all known URLs are dead [1]. To avoid interrupting automated updates, a connection error to a z-library is treated as a *known error*, and the old properties of the z-library are retained. [1] https://github.com/searxng/searxng/issues/3610 Signed-off-by: Markus Heiser --- searx/engines/zlibrary.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/searx/engines/zlibrary.py b/searx/engines/zlibrary.py index c9acb28fe..6357232af 100644 --- a/searx/engines/zlibrary.py +++ b/searx/engines/zlibrary.py @@ -180,6 +180,8 @@ def fetch_traits(engine_traits: EngineTraits) -> None: # pylint: disable=import-outside-toplevel, too-many-branches import babel + import httpx + from searx.network import get # see https://github.com/searxng/searxng/issues/762 from searx.locales import language_tag @@ -191,7 +193,7 @@ def fetch_traits(engine_traits: EngineTraits) -> None: try: resp = get(base_url, verify=False) - except SearxException as exc: + except (SearxException, httpx.ConnectError) as exc: print(f"ERROR: zlibrary domain '{base_url}' is seized?") print(f" --> {exc}") _use_old_values() From 4fa7de80334deee51845550c4cfa11f94edb5e88 Mon Sep 17 00:00:00 2001 From: useralias <212567668+useralias@users.noreply.github.com> Date: Fri, 23 May 2025 07:01:10 -0400 Subject: [PATCH 51/74] [refactor] duckduckgo engine: improve request logic and code structure (#4837) Changes: - Add trailing slash to base URL to prevent potential redirects - Remove advanced search syntax filtering (no longer guarantees a CAPTCHA) - Correct pagination offset calculation: Page 2 now starts at offset 10, subsequent pages use 10 + (n-2)*15 formula instead of the previous broken 20 + (n-2)*50 calculation that caused CAPTCHAs - Restructure request parameter building to better match a real request - "kt" cookie is no longer an empty string if the language/region is "all" - Group related parameter assignments together - Add header logging to debugging output Related: - https://github.com/searxng/searxng/issues/4824 --- searx/engines/duckduckgo.py | 117 ++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 66 deletions(-) diff --git a/searx/engines/duckduckgo.py b/searx/engines/duckduckgo.py index 2b6888af7..d877d596b 100644 --- a/searx/engines/duckduckgo.py +++ b/searx/engines/duckduckgo.py @@ -58,7 +58,7 @@ paging = True time_range_support = True safesearch = True # user can't select but the results are filtered -url = "https://html.duckduckgo.com/html" +url = "https://html.duckduckgo.com/html/" time_range_dict = {'day': 'd', 'week': 'w', 'month': 'm', 'year': 'y'} form_data = {'v': 'l', 'api': 'd.js', 'o': 'json'} @@ -248,7 +248,6 @@ def quote_ddg_bangs(query): def request(query, params): - query = quote_ddg_bangs(query) if len(query) >= 500: @@ -256,93 +255,79 @@ def request(query, params): params["url"] = None return - # Advanced search syntax ends in CAPTCHA - # https://duckduckgo.com/duckduckgo-help-pages/results/syntax/ - query = " ".join( - [ - x.removeprefix("site:").removeprefix("intitle:").removeprefix("inurl:").removeprefix("filetype:") - for x in query.split() - ] - ) eng_region: str = traits.get_region(params['searxng_locale'], traits.all_locale) # type: ignore - if eng_region == "wt-wt": - # https://html.duckduckgo.com/html sets an empty value for "all". - eng_region = "" - params['data']['kl'] = eng_region - params['cookies']['kl'] = eng_region + # Note: The API is reverse-engineered from DuckDuckGo's HTML webpage + # (https://html.duckduckgo.com/html/) and may be subject to additional bot detection mechanisms + # and breaking changes in the future. + # + # The params['data'] dictionary can have the following key parameters, in this order: + # - q (str): Search query string + # - b (str): Beginning parameter - empty string for first page requests + # - s (int): Search offset for pagination + # - nextParams (str): Continuation parameters from previous page response, typically empty + # - v (str): Typically 'l' for subsequent pages + # - o (str): Output format, typically 'json' + # - dc (int): Display count - value equal to offset (s) + 1 + # - api (str): API endpoint identifier, typically 'd.js' + # - vqd (str): Validation query digest + # - kl (str): Keyboard language/region code (e.g., 'en-us') + # - df (str): Time filter, maps to values like 'd' (day), 'w' (week), 'm' (month), 'y' (year) - # eng_lang = get_ddg_lang(traits, params['searxng_locale']) - - params['url'] = url - params['method'] = 'POST' params['data']['q'] = query - # The API is not documented, so we do some reverse engineering and emulate - # what https://html.duckduckgo.com/html does when you press "next Page" link - # again and again .. - - params['headers']['Content-Type'] = 'application/x-www-form-urlencoded' - - params['headers']['Sec-Fetch-Dest'] = "document" - params['headers']['Sec-Fetch-Mode'] = "navigate" # at least this one is used by ddg's bot detection - params['headers']['Sec-Fetch-Site'] = "same-origin" - params['headers']['Sec-Fetch-User'] = "?1" - - # Form of the initial search page does have empty values in the form if params['pageno'] == 1: - params['data']['b'] = "" - - params['data']['df'] = '' - if params['time_range'] in time_range_dict: - - params['data']['df'] = time_range_dict[params['time_range']] - params['cookies']['df'] = time_range_dict[params['time_range']] - - if params['pageno'] == 2: - - # second page does have an offset of 20 - offset = (params['pageno'] - 1) * 20 + elif params['pageno'] >= 2: + offset = 10 + (params['pageno'] - 2) * 15 # Page 2 = 10, Page 3+ = 10 + n*15 params['data']['s'] = offset - params['data']['dc'] = offset + 1 - - elif params['pageno'] > 2: - - # third and following pages do have an offset of 20 + n*50 - offset = 20 + (params['pageno'] - 2) * 50 - params['data']['s'] = offset - params['data']['dc'] = offset + 1 - - if params['pageno'] > 1: - - # initial page does not have these additional data in the input form - params['data']['o'] = form_data.get('o', 'json') - params['data']['api'] = form_data.get('api', 'd.js') params['data']['nextParams'] = form_data.get('nextParams', '') params['data']['v'] = form_data.get('v', 'l') - params['headers']['Referer'] = url + params['data']['o'] = form_data.get('o', 'json') + params['data']['dc'] = offset + 1 + params['data']['api'] = form_data.get('api', 'd.js') + # vqd is required to request other pages after the first one vqd = get_vqd(query, eng_region, force_request=False) - - # Certain conditions must be met in order to call up one of the - # following pages ... - if vqd: - params['data']['vqd'] = vqd # follow up pages / requests needs a vqd argument + params['data']['vqd'] = vqd else: - # Don't try to call follow up pages without a vqd value. DDG - # recognizes this as a request from a bot. This lowers the + # Don't try to call follow up pages without a vqd value. + # DDG recognizes this as a request from a bot. This lowers the # reputation of the SearXNG IP and DDG starts to activate CAPTCHAs. params["url"] = None return if params['searxng_locale'].startswith("zh"): - # Some locales (at least China) do not have a "next page" button and ddg + # Some locales (at least China) do not have a "next page" button and DDG # will return a HTTP/2 403 Forbidden for a request of such a page. params["url"] = None return + # Put empty kl in form data if language/region set to all + if eng_region == "wt-wt": + params['data']['kl'] = "" + else: + params['data']['kl'] = eng_region + + params['data']['df'] = '' + if params['time_range'] in time_range_dict: + params['data']['df'] = time_range_dict[params['time_range']] + params['cookies']['df'] = time_range_dict[params['time_range']] + + params['cookies']['kl'] = eng_region + + params['url'] = url + params['method'] = 'POST' + + params['headers']['Content-Type'] = 'application/x-www-form-urlencoded' + params['headers']['Referer'] = url + params['headers']['Sec-Fetch-Dest'] = "document" + params['headers']['Sec-Fetch-Mode'] = "navigate" # at least this one is used by ddg's bot detection + params['headers']['Sec-Fetch-Site'] = "same-origin" + params['headers']['Sec-Fetch-User'] = "?1" + + logger.debug("param headers: %s", params['headers']) logger.debug("param data: %s", params['data']) logger.debug("param cookies: %s", params['cookies']) From 1ef5c03962de29085b63d7df457764a180f36967 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Fri, 23 May 2025 14:55:22 +0200 Subject: [PATCH 52/74] [fix] ddg engine: IndexError exception is raised on empty contend (#4843) Sometimes (e.g. when ddg does not have a result item) there is no content and the engine will fail with an IndexError: * Error: IndexError * Percentage: 10 * Parameters: `()` * File name: `searx/engines/duckduckgo.py:375` * Function: `response` * Code: `item["content"] = extract_text(eval_xpath(div_result, './/a[contains(@class, "result__snippet")]')[0])` Signed-off-by: Markus Heiser --- searx/engines/duckduckgo.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/searx/engines/duckduckgo.py b/searx/engines/duckduckgo.py index d877d596b..06299e6aa 100644 --- a/searx/engines/duckduckgo.py +++ b/searx/engines/duckduckgo.py @@ -372,8 +372,9 @@ def response(resp) -> EngineResults: continue item["title"] = extract_text(title) item["url"] = eval_xpath(div_result, './/h2/a/@href')[0] - item["content"] = extract_text(eval_xpath(div_result, './/a[contains(@class, "result__snippet")]')[0]) - + item["content"] = extract_text( + eval_xpath_getindex(div_result, './/a[contains(@class, "result__snippet")]', 0, []) + ) results.append(item) zero_click_info_xpath = '//div[@id="zero_click_abstract"]' From 230215c250ac7937f7c0d6690f6ed64cd03350a9 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Fri, 23 May 2025 17:11:41 +0200 Subject: [PATCH 53/74] [fix] preferences: description not localized for all UI languages (#4844) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous implementation for determining the description of an engine did not take into account that the UI languages ​​can also have a region tag and/or a script tag: el-GR: Ελληνικά, Ελλάδα (Greek, Greece) fa-IR: فارسی, ایران (Persian, Iran) nb-NO: Norsk bokmål, Norge (Norwegian bokmål, Norway) nl-BE: Nederlands, België (Dutch, Belgium) pt-BR: Português, Brasil (Portuguese, Brazil) zh-HK: 中文, 中國香港特別行政區 (Chinese, Hong Kong SAR China) zh-Hans-CN: 中文, 中国 (Chinese, China) zh-Hant-TW: 中文, 台灣 (Chinese, Taiwan) Closes: https://github.com/searxng/searxng/issues/4842 Signed-off-by: Markus Heiser --- searx/webapp.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/searx/webapp.py b/searx/webapp.py index aaa2608c4..22e31fb5c 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -106,6 +106,7 @@ from searx.metrics import get_engines_stats, get_engine_errors, get_reliabilitie from searx.flaskfix import patch_application from searx.locales import ( + LOCALE_BEST_MATCH, LOCALE_NAMES, RTL_LOCALES, localeselector, @@ -1059,10 +1060,12 @@ def image_proxy(): @app.route('/engine_descriptions.json', methods=['GET']) def engine_descriptions(): - locale = get_locale().split('_')[0] + sxng_ui_lang_tag = get_locale().replace("_", "-") + sxng_ui_lang_tag = LOCALE_BEST_MATCH.get(sxng_ui_lang_tag, sxng_ui_lang_tag) + result = ENGINE_DESCRIPTIONS['en'].copy() - if locale != 'en': - for engine, description in ENGINE_DESCRIPTIONS.get(locale, {}).items(): + if sxng_ui_lang_tag != 'en': + for engine, description in ENGINE_DESCRIPTIONS.get(sxng_ui_lang_tag, {}).items(): result[engine] = description for engine, description in result.items(): if len(description) == 2 and description[1] == 'ref': From 9ed9a9aa53a17df476437fb16c24c44e7c345f56 Mon Sep 17 00:00:00 2001 From: Alexandre Flament Date: Sat, 24 May 2025 12:40:05 +0200 Subject: [PATCH 54/74] [fix] searx.network: don't trigger DeprecationWarning (#4845) Avoid a confusing warning: DeprecationWarning: Setting per-request cookies=<...> is being deprecated Code based on httpx unit test [1] [1] https://github.com/encode/httpx/blob/6a99f6f2b3a638719f70200de9983f80d618ee1c/tests/client/test_cookies.py#L123-L137 Closes: https://github.com/searxng/searxng/issues/4833 --- searx/network/network.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/searx/network/network.py b/searx/network/network.py index 178ebcbf2..8e2a1f12d 100644 --- a/searx/network/network.py +++ b/searx/network/network.py @@ -180,7 +180,7 @@ class Network: Network._TOR_CHECK_RESULT[proxies] = result return result - async def get_client(self, verify=None, max_redirects=None): + async def get_client(self, verify=None, max_redirects=None) -> httpx.AsyncClient: verify = self.verify if verify is None else verify max_redirects = self.max_redirects if max_redirects is None else max_redirects local_address = next(self._local_addresses_cycle) @@ -269,6 +269,8 @@ class Network: kwargs_clients = Network.extract_kwargs_clients(kwargs) while retries >= 0: # pragma: no cover client = await self.get_client(**kwargs_clients) + cookies = kwargs.pop("cookies", None) + client.cookies = httpx.Cookies(cookies) try: if stream: response = client.stream(method, url, **kwargs) From 064eb504733c250d2e43b6db8ac37812ad18d2fa Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Sat, 24 May 2025 13:14:13 +0200 Subject: [PATCH 55/74] [mod] engines: Yahoo in different languages (#4826) BTW fix issue reported in [1] [1] https://github.com/searxng/searxng/pull/4814#issuecomment-2896948787 Signed-off-by: Markus Heiser Co-authored-by: Bnyro --- searx/engines/yahoo.py | 107 +++++++++++++++++++++++++++-------------- 1 file changed, 70 insertions(+), 37 deletions(-) diff --git a/searx/engines/yahoo.py b/searx/engines/yahoo.py index 92da30e23..63b007729 100644 --- a/searx/engines/yahoo.py +++ b/searx/engines/yahoo.py @@ -44,6 +44,29 @@ time_range_dict = { 'month': ('1m', 'm'), } +region2domain = { + "CO": "co.search.yahoo.com", # Colombia + "TH": "th.search.yahoo.com", # Thailand + "VE": "ve.search.yahoo.com", # Venezuela + "CL": "cl.search.yahoo.com", # Chile + "HK": "hk.search.yahoo.com", # Hong Kong + "PE": "pe.search.yahoo.com", # Peru + "CA": "ca.search.yahoo.com", # Canada + "DE": "de.search.yahoo.com", # Germany + "FR": "fr.search.yahoo.com", # France + "TW": "tw.search.yahoo.com", # Taiwan + "GB": "uk.search.yahoo.com", # United Kingdom + "UK": "uk.search.yahoo.com", + "BR": "br.search.yahoo.com", # Brazil + "IN": "in.search.yahoo.com", # India + "ES": "espanol.search.yahoo.com", # Espanol + "PH": "ph.search.yahoo.com", # Philippines + "AR": "ar.search.yahoo.com", # Argentina + "MX": "mx.search.yahoo.com", # Mexico + "SG": "sg.search.yahoo.com", # Singapore +} +"""Map regions to domain""" + lang2domain = { 'zh_chs': 'hk.search.yahoo.com', 'zh_cht': 'tw.search.yahoo.com', @@ -65,40 +88,40 @@ lang2domain = { yahoo_languages = { "all": "any", - "ar": "ar", - "bg": "bg", - "cs": "cs", - "da": "da", - "de": "de", - "el": "el", - "en": "en", - "es": "es", - "et": "et", - "fi": "fi", - "fr": "fr", - "he": "he", - "hr": "hr", - "hu": "hu", - "it": "it", - "ja": "ja", - "ko": "ko", - "lt": "lt", - "lv": "lv", - "nl": "nl", - "no": "no", - "pl": "pl", - "pt": "pt", - "ro": "ro", - "ru": "ru", - "sk": "sk", - "sl": "sl", - "sv": "sv", - "th": "th", - "tr": "tr", - "zh": "zh_chs", + "ar": "ar", # Arabic + "bg": "bg", # Bulgarian + "cs": "cs", # Czech + "da": "da", # Danish + "de": "de", # German + "el": "el", # Greek + "en": "en", # English + "es": "es", # Spanish + "et": "et", # Estonian + "fi": "fi", # Finnish + "fr": "fr", # French + "he": "he", # Hebrew + "hr": "hr", # Croatian + "hu": "hu", # Hungarian + "it": "it", # Italian + "ja": "ja", # Japanese + "ko": "ko", # Korean + "lt": "lt", # Lithuanian + "lv": "lv", # Latvian + "nl": "nl", # Dutch + "no": "no", # Norwegian + "pl": "pl", # Polish + "pt": "pt", # Portuguese + "ro": "ro", # Romanian + "ru": "ru", # Russian + "sk": "sk", # Slovak + "sl": "sl", # Slovenian + "sv": "sv", # Swedish + "th": "th", # Thai + "tr": "tr", # Turkish + "zh": "zh_chs", # Chinese (Simplified) "zh_Hans": "zh_chs", 'zh-CN': "zh_chs", - "zh_Hant": "zh_cht", + "zh_Hant": "zh_cht", # Chinese (Traditional) "zh-HK": "zh_cht", 'zh-TW': "zh_cht", } @@ -107,7 +130,7 @@ yahoo_languages = { def request(query, params): """build request""" - lang = params["language"].split("-")[0] + lang, region = (params["language"].split("-") + [None])[:2] lang = yahoo_languages.get(lang, "any") offset = (params['pageno'] - 1) * 7 + 1 @@ -127,9 +150,11 @@ def request(query, params): } ) - domain = lang2domain.get(lang, '%s.search.yahoo.com' % lang) + domain = region2domain.get(region) + if not domain: + domain = lang2domain.get(lang, '%s.search.yahoo.com' % lang) params['url'] = 'https://%s/search?%s' % (domain, args) - return params + params['domain'] = domain def parse_url(url_string): @@ -157,14 +182,22 @@ def response(resp): results = [] dom = html.fromstring(resp.text) + url_xpath = './/div[contains(@class,"compTitle")]/h3/a/@href' + title_xpath = './/h3//a/@aria-label' + + domain = resp.search_params['domain'] + if domain == "search.yahoo.com": + url_xpath = './/div[contains(@class,"compTitle")]/a/@href' + title_xpath = './/div[contains(@class,"compTitle")]/a/h3/span' + # parse results for result in eval_xpath_list(dom, '//div[contains(@class,"algo-sr")]'): - url = eval_xpath_getindex(result, './/div[contains(@class,"compTitle")]/a/@href', 0, default=None) + url = eval_xpath_getindex(result, url_xpath, 0, default=None) if url is None: continue url = parse_url(url) - title = eval_xpath_getindex(result, './/div[contains(@class,"compTitle")]/a/h3/span', 0, default='') + title = eval_xpath_getindex(result, title_xpath, 0, default='') title: str = extract_text(title) content = eval_xpath_getindex(result, './/div[contains(@class, "compText")]', 0, default='') content: str = extract_text(content, allow_none=True) From e46187e3ce1fd118951c0e40eb8432af75acad7c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 25 May 2025 10:36:27 +0200 Subject: [PATCH 56/74] [l10n] update translations from Weblate (#4840) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 51e0a154c - 2025-05-22 - Priit Jõerüüt 256b8cb8e - 2025-05-16 - wetinee ac12b76a8 - 2025-05-16 - wetinee Co-authored-by: searxng-bot --- searx/translations/et/LC_MESSAGES/messages.mo | Bin 21062 -> 21066 bytes searx/translations/et/LC_MESSAGES/messages.po | 14 ++--- searx/translations/th/LC_MESSAGES/messages.mo | Bin 29675 -> 32249 bytes searx/translations/th/LC_MESSAGES/messages.po | 52 ++++++++++-------- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/searx/translations/et/LC_MESSAGES/messages.mo b/searx/translations/et/LC_MESSAGES/messages.mo index c6990d0e71519cd3b69b2c5e67b70eb52b2bddf5..4ca574548ed1bb397b22579194579a6a2f57cc1c 100644 GIT binary patch delta 1411 zcmXZbTS!z<6vpvwO=;dn9WQAaV`VvX8!xE{DdM%%av-!MvOrTyO~^1J8Wl;13JF8( zDN+IpA{s2H9zr3-2m*U3goJ#^hX^8we2M-aXTvbRv-WlEwaNY0M^^MA3el(F$y1HIzGo_{D^V*9sT$hlh9XgOf;5Y4Axqk%1zLu z($G%BDICOHTt-dsR2UP1UQ}W})W+GU#13H|c3~DiM2&lo8n=jAe;IYaHQbM`N+-^( z3>uS0L$Pf*iCUn=#+|5>^`R2GgBx%L`I&kCw6MF%IawOIiL)>f3sDEC!whUdRp1J4 z#2Y~#l<93$DaY|DzC>-5Q|ChnnjKU$*gc0j~bP-RY7pL$dF4*>>I%5imOOP{}J}ku3H>irt+4zI?Gb*7K8?U0q{YF)44Yi&*<{T&j zwQeG2VLH0l-&EQGHK>V=sEMahcYV(GU&mHRpji0dbV^l&fZ2a0fhgxsZx`aB| z3I^5jlLvj*e{elU);q?c`V%k~(@-1wP*>wey)#9qd3ClwU_F7F-)!SH)Kz!exWAtI z>qNse=*~w`C3=8yIE69z3e`Vv<4>rBzFB{v5;6g2d?ad}&8U|(1GP^fuEPq{{OUlJ zGq8~co$L&1VjHTIJ-7`o;~pGEeNJytpVtzqa`_=&(($d42lwUVdi@1O+5XUQ_O1Ao h((ab7)(dAldM~y1%ucs=bj?op_O`Z!c9nVE{{dF3sa600 delta 1407 zcmXZbOGs2v9LMovnVPRrM-59uOVJ+csFT%5kZC?j%U3PbMUzpE307kfqKz07g@h3W zL1cs$w8&_nT7(lbmA2(!$s5r*Fj@qFcXzn9_rviRAPJ4ivcXahp2h)Q1j+d`!Av{xPnD!YMi*Z zCS=S;VxR3ehT7nSjk{4d3!)OciR*A0`I%Y%v~gUmbF*}G5$9qmdQlgs#~f@yRiGcE za3n-SnchH^@-7Zw7b@gvN}N$kTp+h5*j%x>Ze+0=zqqPmSzQe{{s7KvnRY9q@rHdEYvw(T!WRU_0`R_ z&cs$abhA!W0$r$5_Tpwdk2`P-^*OyoeO?Qw%9Vz, 2025. msgid "" msgstr "" -"Project-Id-Version: searx\n" +"Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2025-05-13 19:13+0000\n" -"PO-Revision-Date: 2025-03-30 01:58+0000\n" +"PO-Revision-Date: 2025-05-23 07:10+0000\n" "Last-Translator: Priit Jõerüüt \n" +"Language-Team: Estonian \n" "Language: et\n" -"Language-Team: Estonian " -"\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.11.4\n" "Generated-By: Babel 2.17.0\n" #. CONSTANT_NAMES['NO_SUBGROUPING'] @@ -685,7 +686,7 @@ msgstr "Avalikud serverid" #: searx/templates/simple/base.html:75 msgid "Privacy policy" -msgstr "Privaatsuspoliitika" +msgstr "Andmekaitsepõhimõtted" #: searx/templates/simple/base.html:78 msgid "Contact instance maintainer" @@ -2074,4 +2075,3 @@ msgstr "peida video" #~ msgid "proxied" #~ msgstr "proksiserveris" - diff --git a/searx/translations/th/LC_MESSAGES/messages.mo b/searx/translations/th/LC_MESSAGES/messages.mo index 42dea257fadea1ac27b07dde5075236c84b14112..88eddc80cb3ed94269e6cd641c3cbea86e4b3c71 100644 GIT binary patch delta 7460 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 Gmj4aVuX9BJ delta 5393 zcmYM&3v^9a9>?*0Z?0DoiH5w8#3LjUA_+m#c*HA&CX|vI)=)vcQca?xEWKo8VOF)c z-b2-Rtg5j(!!zlCCazj@T;fCn3m`ZRrK?(+f9wBNBAwq;lD5%!<*UbZLl?Qs*8)T0r4juqi{HChh?Y*W;+*RGVwAb7qbWR@FZ$s zU%VX`hKgIFHqzF`8L0Vk(647vKtqq97`213sGXLfGGE}XuW`PC4Y|GpRhf5?wavSz ziO-=Dzk*u$E^3{BqsBF8Zf(+>`bTgfo(tMZDk|gNuERi7LM7M=M`J$DLG|B@s@Q4g zSyTd_qY}T0O5h=KZcPZgQev^Fc~e_Ze`S=(gWAFJ|BfRE4Wi3ol2lyUy<#TTq$4jVkG0=V8=s^b@5+O{p(Qu zZ=oieG71#__p~a|Ez7};hb|MGge2DGv5_0INf08}@K4(MJnFvQE(gL;9c36s;n1@T< z^^csNpdQgBROxS^5`Tb7Tn9)yjzG;HgP~f#9Sz;cL=EhL+Tmaq&q57Yh)QTVa*)ji z)DCM=3m?PIcn;Oy%U4K=KY>c1CF-oCp$=nrEMk2#ghoePgBoxIRnkABp5=LW{StN} zzK;3Ww2d)caTscW8dT{6s06p7#vej{n~(TI8@%bRKSaMe{FjDyP`|C6APQB1HmLi9 zQ40=3^;?Fj*m`$=3-X4Uw@?*2g1iXk4C)d51GS-lqQ*Z!mNX&B)c<7~?UU_cdlS`R z2d3d3R3cyE2=sAseu1S(5lk)iz|V0wM$(ysZzkY!d<8X6WQsA*VIHc&n^2W_D~0;k zqwy{m^h^$;-rw`+!yA~5w@^DtOtllFV143j)U(b-%`*raU@>l!fYf*laE?p5-P!IsQG?{ntwj35;dst zD=<{={|4JI+ffVu0ll~nHNgRQ{e9E~$1w!YyZe7Z?fgqr0=H1}eCOf^sCgct7WSsw z{$W^O?|(cEb!dfQ*dDb&w!7X9HF3U+3s5^MM19dpPzz2$?Ytbra2~4PV$@-K9hJbF z7>YZk-v3$}8h99Wm`-CDUPeuD6P4gy)CcE2s(*uywo=Vd3&f%lO+_Wt2{o=OYD0Ob z*RmJtk&QvWcJON&rsGsxj2ibnMxrm% z{`hT%`u3+GzfC{>(08N?FW?_DsXvd!EY9Mj;vNjg6})rF_y%^tBdDL}4{$Oz=3+Oj z!ZO^2L$C>-LnS&E^o< ziKn3Yy^R`o4EaH3TJsf(!ak^Y1ga7hn2Xgoj*1>cZLB#z!Bn~4ej0ijmB?&V1y{NF1ghdUk*90?Q9W&jeNY4D z;uu_y+VMS1!tT9nWk#bCD#I2yAD_bYsDy7~EQa^CaWWZUq)4Mox5L)s@%t@ele6; z;|fp-jK;@*|1YD_)MLzxs0nHY+i&|8)PP;61V6wcyoNg683gLz3uiEXjEj%6YO?wv zxtoSV?T_ygoK3tHLoog+>aRuuCrGwN4Qz*6u*f+Bj}yO!YjISut;(HEdxgpFa{VGIfs+&M zTXhwq_5Qakv;QK=#&|lEqDo(ZdZyKwhGCOzNxPvcH4U}%m8cC|KrQe$T!;@b8Rt&6 zk7zUMQSL!)^cY67zPYLfKEys4F~$COObON}UiQ2(pW-S^#Yt0b0)mr*5ufSNFAroEqydIWtj z9BWYbSGxP#Q5D;ZO5h6Wt-0s!mz7h0EmT!*56>dhGx`8^{Q~MWx{gX9p3$wb00-ej zRKMS2Z#;-f_z^0RxLJIxFdengYShlRxcGpdh6Y?jEpXq(2`}1=b5R3JQ1{E7Yfw9W z4^@FvsCgnP?80fN`#qgSIG%Vk4#xeMj#1u9`x<3n5*JQY2GXK)1E-=>10gZr1$?n< zg8O2lJ%QVCI|4`JZ#Al%STS{0)zlZt1J|3^1V3!i&J$>pkQf+{@M*Ap;sQ_bXwvkM zVE48^c!Pc0|KJN0rsoFNq?dStlRCBbg?8(4VCl>i!Q%1^U$CmOCiH*qk%@%> diff --git a/searx/translations/th/LC_MESSAGES/messages.po b/searx/translations/th/LC_MESSAGES/messages.po index 25c143420..7ed43cea6 100644 --- a/searx/translations/th/LC_MESSAGES/messages.po +++ b/searx/translations/th/LC_MESSAGES/messages.po @@ -13,20 +13,22 @@ # Anonymous , 2025. # yuttct , 2025. # return42 , 2025. +# wetinee , 2025. msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2025-05-13 19:13+0000\n" -"PO-Revision-Date: 2025-04-15 10:37+0000\n" -"Last-Translator: return42 \n" +"PO-Revision-Date: 2025-05-17 15:04+0000\n" +"Last-Translator: wetinee \n" +"Language-Team: Thai \n" "Language: th\n" -"Language-Team: Thai " -"\n" -"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.11.4\n" "Generated-By: Babel 2.17.0\n" #. CONSTANT_NAMES['NO_SUBGROUPING'] @@ -445,11 +447,11 @@ msgstr "ทำการสุ่มค่าที่แตกต่างกั #: searx/answerers/statistics.py:36 #, python-brace-format msgid "Compute {func} of the arguments" -msgstr "" +msgstr "คำนวณ {func} ของอาร์กิวเมนต์" #: searx/engines/openstreetmap.py:158 msgid "Show route in map .." -msgstr "" +msgstr "แสดงเส้นทางบนแผนที่ .." #: searx/engines/pdbe.py:96 #, python-brace-format @@ -522,15 +524,15 @@ msgstr "คุณภาพไฟล์" #: searx/plugins/ahmia_filter.py:32 msgid "Ahmia blacklist" -msgstr "" +msgstr "แบล็กลิสต์ Ahmia" #: searx/plugins/ahmia_filter.py:33 msgid "Filter out onion results that appear in Ahmia's blacklist." -msgstr "" +msgstr "กรองผลการค้นหา onion ที่อยู่ในแบล็กลิสต์ Ahmia" #: searx/plugins/calculator.py:38 msgid "Basic Calculator" -msgstr "" +msgstr "เครื่องคิดเลขพื้นฐาน" #: searx/plugins/calculator.py:39 msgid "Calculate mathematical expressions via the search bar" @@ -538,7 +540,7 @@ msgstr "คำนวณนิพจน์คณิตศาสตร์ผ่า #: searx/plugins/hash_plugin.py:34 msgid "Hash plugin" -msgstr "" +msgstr "ปลั๊กอินแฮช" #: searx/plugins/hash_plugin.py:35 msgid "Converts strings to different hash digests." @@ -575,6 +577,8 @@ msgid "" "Displays your IP if the query is \"ip\" and your user agent if the query " "is \"user-agent\"." msgstr "" +"จะแสดง IP ของคุณหากคำค้นคือ 'ip' และแสดงข้อมูล User Agent ของคุณหากคำค้นคือ 'user-" +"agent'" #: searx/plugins/self_info.py:52 msgid "Your IP is: " @@ -599,15 +603,15 @@ msgstr "" #: searx/plugins/tor_check.py:65 msgid "Could not download the list of Tor exit-nodes from" -msgstr "" +msgstr "ไม่สามารถดาวน์โหลดรายการของโหนดทางออกของ Tor จาก" #: searx/plugins/tor_check.py:72 msgid "You are using Tor and it looks like you have the external IP address" -msgstr "" +msgstr "คุณกำลังใช้ Tor และดูเหมือนว่าคุณมีที่อยู่ IP ภายนอก" #: searx/plugins/tor_check.py:76 msgid "You are not using Tor and you have the external IP address" -msgstr "" +msgstr "คุณไม่ได้ใช้ Tor และคุณมีที่อยู่ IP ภายนอก" #: searx/plugins/tracker_url_remover.py:37 msgid "Tracker URL remover" @@ -619,7 +623,7 @@ msgstr "ลบอาร์กิวเมนต์ตัวติดตามอ #: searx/plugins/unit_converter.py:49 msgid "Unit converter plugin" -msgstr "" +msgstr "ปลั๊กอินแปลงหน่วย" #: searx/plugins/unit_converter.py:50 msgid "Convert between units" @@ -931,7 +935,7 @@ msgstr "ตัวอย่าง" #: searx/templates/simple/answer/translations.html:21 msgid "Definitions" -msgstr "" +msgstr "คำนิยาม" #: searx/templates/simple/answer/translations.html:30 msgid "Synonyms" @@ -1090,7 +1094,7 @@ msgstr "อนุญาต" #: searx/templates/simple/preferences/answerers.html:5 msgid "Keywords (first word in query)" -msgstr "" +msgstr "คำหลัก (คำแรกของคำค้นหา)" #: searx/templates/simple/preferences/answerers.html:6 #: searx/templates/simple/result_templates/packages.html:7 @@ -1164,6 +1168,7 @@ msgid "" "A URL containing your preferences. This URL can be used to restore your " "settings on a different device." msgstr "" +"ลิงก์ URL ที่บรรจุค่าการตั้งค่าของคุณ ซึ่งสามารถนำไปใช้กู้คืนการตั้งค่าเหล่านั้นบนอุปกรณ์อื่นได้" #: searx/templates/simple/preferences/cookies.html:46 msgid "Copy preferences hash" @@ -1179,7 +1184,7 @@ msgstr "การตั้งค่าแฮช" #: searx/templates/simple/preferences/doi_resolver.html:1 msgid "Digital Object Identifier (DOI)" -msgstr "" +msgstr "รหัส DOI" #: searx/templates/simple/preferences/doi_resolver.html:6 msgid "Open Access DOI resolver" @@ -1373,23 +1378,23 @@ msgstr "เปลี่ยนภาษาของเค้าโครง" #: searx/templates/simple/preferences/urlformatting.html:2 msgid "URL formatting" -msgstr "" +msgstr "การจัดรูปแบบ URL" #: searx/templates/simple/preferences/urlformatting.html:8 msgid "Pretty" -msgstr "" +msgstr "แบบสวยงาม" #: searx/templates/simple/preferences/urlformatting.html:13 msgid "Full" -msgstr "" +msgstr "แบบเต็ม" #: searx/templates/simple/preferences/urlformatting.html:18 msgid "Host" -msgstr "" +msgstr "โฮสต์" #: searx/templates/simple/preferences/urlformatting.html:23 msgid "Change result URL formatting" -msgstr "" +msgstr "เปลี่ยนรูปแบบ URL ผลการค้นหา" #: searx/templates/simple/result_templates/code.html:13 msgid "repo" @@ -1787,4 +1792,3 @@ msgstr "ซ่อนวิดีโอ" #~ msgid "proxied" #~ msgstr "พร็อกซี่" - From 848c8d0544eb0138da4414a750f79b22883f91b2 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Sun, 25 May 2025 10:40:57 +0200 Subject: [PATCH 57/74] [mod] data: implement a simple currencies (SQL) database (#4836) To reduce the memory footprint, this patch no longer loads the JSON data completely into memory. Instead, there is an SQL database based on `ExpireCacheSQLite`. The class CurrenciesDB is a simple DB application that encapsulates the DB (queries and initialization) and provides convenient methods like `name_to_iso4217` and `iso4217_to_name`. Related: - https://github.com/searxng/searxng/discussions/1892 - https://github.com/searxng/searxng/pull/3458#issuecomment-2900807671 - https://github.com/searxng/searxng/pull/4650 Signed-off-by: Markus Heiser --- searx/data/__init__.py | 16 +++---- searx/data/core.py | 29 ++++++++++++ searx/data/currencies.py | 55 ++++++++++++++++++++++ searx/engines/currency_convert.py | 11 +++-- searx/search/processors/online_currency.py | 24 +++------- searxng_extra/update/update_currencies.py | 6 +-- 6 files changed, 106 insertions(+), 35 deletions(-) create mode 100644 searx/data/core.py create mode 100644 searx/data/currencies.py diff --git a/searx/data/__init__.py b/searx/data/__init__.py index 48455ebe3..9be1cd67e 100644 --- a/searx/data/__init__.py +++ b/searx/data/__init__.py @@ -4,21 +4,17 @@ make data.all """ - +from __future__ import annotations __all__ = ["ahmia_blacklist_loader"] import json -from pathlib import Path import typing -from searx import logger +from .core import log, data_dir +from .currencies import CurrenciesDB -log = logger.getChild("data") - -data_dir = Path(__file__).parent - -CURRENCIES: dict[str, typing.Any] +CURRENCIES: CurrenciesDB USER_AGENTS: dict[str, typing.Any] EXTERNAL_URLS: dict[str, typing.Any] WIKIDATA_UNITS: dict[str, typing.Any] @@ -29,7 +25,7 @@ ENGINE_TRAITS: dict[str, typing.Any] LOCALES: dict[str, typing.Any] lazy_globals = { - "CURRENCIES": None, + "CURRENCIES": CurrenciesDB(), "USER_AGENTS": None, "EXTERNAL_URLS": None, "WIKIDATA_UNITS": None, @@ -41,7 +37,6 @@ lazy_globals = { } data_json_files = { - "CURRENCIES": "currencies.json", "USER_AGENTS": "useragents.json", "EXTERNAL_URLS": "external_urls.json", "WIKIDATA_UNITS": "wikidata_units.json", @@ -63,6 +58,7 @@ def __getattr__(name): return data log.debug("init searx.data.%s", name) + with open(data_dir / data_json_files[name], encoding='utf-8') as f: lazy_globals[name] = json.load(f) diff --git a/searx/data/core.py b/searx/data/core.py new file mode 100644 index 000000000..14cc77eb7 --- /dev/null +++ b/searx/data/core.py @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# pylint: disable=missing-module-docstring +from __future__ import annotations + +import pathlib + +from searx import logger +from searx.cache import ExpireCacheCfg, ExpireCacheSQLite + +log = logger.getChild("data") + +data_dir = pathlib.Path(__file__).parent + +_DATA_CACHE: ExpireCacheSQLite = None # type: ignore + + +def get_cache(): + + global _DATA_CACHE # pylint: disable=global-statement + + if _DATA_CACHE is None: + _DATA_CACHE = ExpireCacheSQLite.build_cache( + ExpireCacheCfg( + name="DATA_CACHE", + # MAX_VALUE_LEN=1024 * 200, # max. 200kB length for a *serialized* value. + # MAXHOLD_TIME=60 * 60 * 24 * 7 * 4, # 4 weeks + ) + ) + return _DATA_CACHE diff --git a/searx/data/currencies.py b/searx/data/currencies.py new file mode 100644 index 000000000..a4f2901f0 --- /dev/null +++ b/searx/data/currencies.py @@ -0,0 +1,55 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Simple implementation to store currencies data in a SQL database.""" + +from __future__ import annotations + +__all__ = ["CurrenciesDB"] + +import json +import pathlib + +from .core import get_cache, log + + +class CurrenciesDB: + # pylint: disable=missing-class-docstring + + ctx_names = "data_currencies_names" + ctx_iso4217 = "data_currencies_iso4217" + + json_file = pathlib.Path(__file__).parent / "currencies.json" + + def __init__(self): + self.cache = get_cache() + + def init(self): + if self.cache.properties("currencies loaded") != "OK": + self.load() + self.cache.properties.set("currencies loaded", "OK") + # F I X M E: + # do we need a maintenance .. rember: database is stored + # in /tmp and will be rebuild during the reboot anyway + + def load(self): + log.debug("init searx.data.CURRENCIES") + with open(self.json_file, encoding="utf-8") as f: + data_dict = json.load(f) + for key, value in data_dict["names"].items(): + self.cache.set(key=key, value=value, ctx=self.ctx_names, expire=None) + for key, value in data_dict["iso4217"].items(): + self.cache.set(key=key, value=value, ctx=self.ctx_iso4217, expire=None) + + def name_to_iso4217(self, name): + self.init() + + ret_val = self.cache.get(key=name, default=name, ctx=self.ctx_names) + if isinstance(ret_val, list): + # if more alternatives, use the last in the list + ret_val = ret_val[-1] + return ret_val + + def iso4217_to_name(self, iso4217, language): + self.init() + + iso4217_languages: dict = self.cache.get(key=iso4217, default={}, ctx=self.ctx_names) + return iso4217_languages.get(language, iso4217) diff --git a/searx/engines/currency_convert.py b/searx/engines/currency_convert.py index cbb1d6cc4..c4c757e3f 100644 --- a/searx/engines/currency_convert.py +++ b/searx/engines/currency_convert.py @@ -3,6 +3,7 @@ """ import json +from searx.result_types import EngineResults # about about = { @@ -28,13 +29,15 @@ def request(_query, params): return params -def response(resp): +def response(resp) -> EngineResults: + res = EngineResults() + # remove first and last lines to get only json json_resp = resp.text[resp.text.find('\n') + 1 : resp.text.rfind('\n') - 2] try: conversion_rate = float(json.loads(json_resp)["to"][0]["mid"]) except IndexError: - return [] + return res answer = '{0} {1} = {2} {3}, 1 {1} ({5}) = {4} {3} ({6})'.format( resp.search_params['amount'], resp.search_params['from'], @@ -46,5 +49,5 @@ def response(resp): ) url = f"https://duckduckgo.com/?q={resp.search_params['from']}+to+{resp.search_params['to']}" - - return [{"answer": answer, "url": url}] + res.add(res.types.Answer(answer=answer, url=url)) + return res diff --git a/searx/search/processors/online_currency.py b/searx/search/processors/online_currency.py index 197e0e061..0d7900616 100644 --- a/searx/search/processors/online_currency.py +++ b/searx/search/processors/online_currency.py @@ -12,24 +12,13 @@ from .online import OnlineProcessor parser_re = re.compile('.*?(\\d+(?:\\.\\d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)', re.I) -def normalize_name(name): +def normalize_name(name: str): + name = name.strip() name = name.lower().replace('-', ' ').rstrip('s') name = re.sub(' +', ' ', name) return unicodedata.normalize('NFKD', name).lower() -def name_to_iso4217(name): - name = normalize_name(name) - currency = CURRENCIES['names'].get(name, [name]) - if isinstance(currency, str): - return currency - return currency[-1] - - -def iso4217_to_name(iso4217, language): - return CURRENCIES['iso4217'].get(iso4217, {}).get(language, iso4217) - - class OnlineCurrencyProcessor(OnlineProcessor): """Processor class used by ``online_currency`` engines.""" @@ -52,14 +41,15 @@ class OnlineCurrencyProcessor(OnlineProcessor): amount = float(amount_str) except ValueError: return None - from_currency = name_to_iso4217(from_currency.strip()) - to_currency = name_to_iso4217(to_currency.strip()) + + from_currency = CURRENCIES.name_to_iso4217(normalize_name(from_currency)) + to_currency = CURRENCIES.name_to_iso4217(normalize_name(to_currency)) params['amount'] = amount params['from'] = from_currency params['to'] = to_currency - params['from_name'] = iso4217_to_name(from_currency, 'en') - params['to_name'] = iso4217_to_name(to_currency, 'en') + params['from_name'] = CURRENCIES.iso4217_to_name(from_currency, "en") + params['to_name'] = CURRENCIES.iso4217_to_name(to_currency, "en") return params def get_default_tests(self): diff --git a/searxng_extra/update/update_currencies.py b/searxng_extra/update/update_currencies.py index 903bdcb44..288f0994e 100755 --- a/searxng_extra/update/update_currencies.py +++ b/searxng_extra/update/update_currencies.py @@ -15,9 +15,7 @@ import json from searx.locales import LOCALE_NAMES, locales_initialize from searx.engines import wikidata, set_loggers -from searx.data import data_dir - -DATA_FILE = data_dir / 'currencies.json' +from searx.data.currencies import CurrenciesDB set_loggers(wikidata, 'wikidata') locales_initialize() @@ -149,7 +147,7 @@ def main(): if len(db['names'][name]) == 1: db['names'][name] = db['names'][name][0] - with DATA_FILE.open('w', encoding='utf8') as f: + with CurrenciesDB.json_file.open('w', encoding='utf8') as f: json.dump(db, f, indent=4, sort_keys=True, ensure_ascii=False) From 14b8a999f3929975756ed6f9dc33c54977b5cedc Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sun, 25 May 2025 14:54:27 +0200 Subject: [PATCH 58/74] [mod] ci: exclude some workflows from forks (#4849) Excludes some workflows/jobs unneeded on forks. Closes https://github.com/searxng/searxng/issues/4847 --- .github/workflows/cleanup.yml | 2 ++ .github/workflows/container.yml | 17 ++++++++++------- .github/workflows/security.yml | 3 ++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index 85e22ce9d..d6af8feee 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -16,6 +16,8 @@ permissions: jobs: container-cache: + # FIXME: On forks it fails with "Failed to fetch packages: missing field `id` at line 1 column 141" + if: github.repository_owner == 'searxng' || github.event_name == 'workflow_dispatch' name: Container cache runs-on: ubuntu-24.04 permissions: diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index ccdba770e..0285bcd5c 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -36,16 +36,19 @@ jobs: packages: write steps: - - name: Checkout + - if: github.repository_owner == 'searxng' + name: Checkout uses: actions/checkout@v4 with: persist-credentials: "false" - - name: Get date + - if: github.repository_owner == 'searxng' + name: Get date id: date run: echo "date=$(date +'%Y%m%d')" >>$GITHUB_OUTPUT - - name: Check cache apko + - if: github.repository_owner == 'searxng' + name: Check cache apko id: cache-apko uses: actions/cache/restore@v4 with: @@ -54,7 +57,7 @@ jobs: path: "/tmp/.apko/" lookup-only: true - - if: steps.cache-apko.outputs.cache-hit != 'true' + - if: github.repository_owner == 'searxng' && steps.cache-apko.outputs.cache-hit != 'true' name: Setup cache apko uses: actions/cache@v4 with: @@ -63,13 +66,13 @@ jobs: restore-keys: "apko-${{ steps.date.outputs.date }}-" path: "/tmp/.apko/" - - if: steps.cache-apko.outputs.cache-hit != 'true' + - if: github.repository_owner == 'searxng' && steps.cache-apko.outputs.cache-hit != 'true' name: Setup apko run: | eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" brew install apko - - if: steps.cache-apko.outputs.cache-hit != 'true' + - if: github.repository_owner == 'searxng' && steps.cache-apko.outputs.cache-hit != 'true' name: Login to GHCR uses: docker/login-action@v3 with: @@ -77,7 +80,7 @@ jobs: username: "${{ github.repository_owner }}" password: "${{ secrets.GITHUB_TOKEN }}" - - if: steps.cache-apko.outputs.cache-hit != 'true' + - if: github.repository_owner == 'searxng' && steps.cache-apko.outputs.cache-hit != 'true' name: Build run: | eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index e994306b8..73a5fd77f 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -16,6 +16,7 @@ permissions: jobs: container: + if: github.repository_owner == 'searxng' name: Container runs-on: ubuntu-24.04-arm permissions: @@ -30,7 +31,7 @@ jobs: - name: Run Trivy scanner uses: aquasecurity/trivy-action@0.30.0 with: - image-ref: "docker.io/searxng/searxng:latest" + image-ref: "ghcr.io/searxng/searxng:latest" vuln-type: "os,library" severity: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL" ignore-unfixed: "false" From 9dfdd30da0c5d13398947fce0c35fc996552f8f6 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 25 May 2025 11:49:04 +0200 Subject: [PATCH 59/74] [fix] search: autocomplete focus on results page This has been a regression introduced with the removal of the unmaintained autocomplete.js library. We should only focus the search bar on the main search page at `/` and not at the results page located at `/search`. I'm not sure if there's a better way to figure out if we're on the results page than checking if the id of the main element is `#main_results`, checking the path obviously isn't a better solution because it can differ depending on the instance / reverse proxy / .... - related to https://github.com/searxng/searxng/commit/32823ecb69b115a6726475d6421f0a1c0327fafa - closes https://github.com/searxng/searxng/issues/4846 --- client/simple/src/js/main/search.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/simple/src/js/main/search.js b/client/simple/src/js/main/search.js index 99062fc40..c252dfdb5 100644 --- a/client/simple/src/js/main/search.js +++ b/client/simple/src/js/main/search.js @@ -7,6 +7,7 @@ var qinput_id = "q", qinput; const isMobile = window.matchMedia("only screen and (max-width: 50em)").matches; + const isResultsPage = document.querySelector("main").id == "main_results"; function submitIfQuery () { if (qinput.value.length > 0) { @@ -87,7 +88,7 @@ searxng.ready(function () { // focus search input on large screens - if (!isMobile) document.getElementById("q").focus(); + if (!isMobile && !isResultsPage) document.getElementById("q").focus(); qinput = d.getElementById(qinput_id); const autocomplete = d.querySelector(".autocomplete"); From 7a5a499795e7e34739038510737b8b6c5b607d5b Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 25 May 2025 11:49:28 +0200 Subject: [PATCH 60/74] [build] /static --- searx/static/themes/simple/js/searxng.min.js | 4 ++-- searx/static/themes/simple/js/searxng.min.js.map | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/searx/static/themes/simple/js/searxng.min.js b/searx/static/themes/simple/js/searxng.min.js index ce8fd6aa7..8d0362fab 100644 --- a/searx/static/themes/simple/js/searxng.min.js +++ b/searx/static/themes/simple/js/searxng.min.js @@ -3,12 +3,12 @@ * (C) Copyright Contributors to the SearXNG project. * (C) Copyright Contributors to the searx project (2014 - 2021). * SPDX-License-Identifier: AGPL-3.0-or-later - */window.searxng=function(h,s){h.Element&&function(o){o.matches=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.msMatchesSelector||function(l){for(var n=this,r=(n.parentNode||n.document).querySelectorAll(l),t=-1;r[++t]&&r[t]!=n;);return!!r[t]}}(Element.prototype);function i(o,l,n){try{o.call(l,n)}catch(r){console.log(r)}}var p=window.searxng||{};p.on=function(o,l,n,r){r=r||!1,typeof o!="string"?o.addEventListener(l,n,r):s.addEventListener(l,function(t){for(var a=t.target||t.srcElement,f=!1;a&&a.matches&&a!==s&&!(f=a.matches(o));)a=a.parentElement;f&&i(n,a,t)},r)},p.ready=function(o){document.readyState!="loading"?o.call(h):h.addEventListener("DOMContentLoaded",o.bind(h))},p.http=function(o,l,n=null){return new Promise(function(r,t){try{var a=new XMLHttpRequest;a.open(o,l,!0),a.timeout=2e4,a.onload=function(){a.status==200?r(a.response,a.responseType):t(Error(a.statusText))},a.onerror=function(){t(Error("Network Error"))},a.onabort=function(){t(Error("Transaction is aborted"))},a.ontimeout=function(){t(Error("Timeout"))},n?a.send(n):a.send()}catch(f){t(f)}})},p.loadStyle=function(o){var l=p.settings.theme_static_path+"/"+o,n="style_"+o.replace(".","_"),r=s.getElementById(n);r===null&&(r=s.createElement("link"),r.setAttribute("id",n),r.setAttribute("rel","stylesheet"),r.setAttribute("type","text/css"),r.setAttribute("href",l),s.body.appendChild(r))},p.loadScript=function(o,l){var n=p.settings.theme_static_path+"/"+o,r="script_"+o.replace(".","_"),t=s.getElementById(r);if(t===null)t=s.createElement("script"),t.setAttribute("id",r),t.setAttribute("src",n),t.onload=l,t.onerror=function(){t.setAttribute("error","1")},s.body.appendChild(t);else if(t.hasAttribute("error"))console.log("callback not executed : script '"+n+"' not loaded.");else try{l.apply(t,[])}catch(a){console.log(a)}},p.insertBefore=function(o,l){l.parentNode.insertBefore(o,l)},p.insertAfter=function(o,l){l.parentNode.insertAfter(o,l.nextSibling)},p.on(".close","click",function(){this.parentNode.classList.add("invisible")});function g(){for(var o of s.getElementsByTagName("body")[0].classList.values())if(o.endsWith("_endpoint"))return o.split("_")[0];return""}return p.endpoint=g(),p}(window,document);searxng.ready(function(){if(searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype,searxng.endpoint!=="results")return;if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}let h=document;var s=h.getElementById("results").classList.contains("only_template_images");function i(){var o=h.createElement("div");return o.classList.add("loader"),o}function p(o,l){o.textContent="",l.forEach(n=>o.appendChild(n))}function g(o){var l=h.querySelector("#pagination form.next_page");if(l){p(h.querySelector("#pagination"),[i()]);var n=new FormData(l);searxng.http("POST",h.querySelector("#search").getAttribute("action"),n).then(function(r){var t=new DOMParser().parseFromString(r,"text/html"),a=t.querySelectorAll("#urls article"),f=t.querySelector("#pagination");h.querySelector("#pagination").remove(),a.length>0&&!s&&h.querySelector("#urls").appendChild(h.createElement("hr")),a.forEach(b=>{h.querySelector("#urls").appendChild(b)}),f&&(h.querySelector("#results").appendChild(f),o())}).catch(function(r){console.log(r);var t=h.createElement("div");t.textContent=searxng.settings.translations.error_loading_next_page,t.classList.add("dialog-error"),t.setAttribute("role","alert"),p(h.querySelector("#pagination"),[t])})}}if(searxng.settings.infinite_scroll&&searxng.infinite_scroll_supported){const o={rootMargin:"20rem"},l="article.result:last-child",n=new IntersectionObserver(r=>{const t=r[0];t.isIntersecting&&(n.unobserve(t.target),g(()=>n.observe(h.querySelector(l),o)))});n.observe(h.querySelector(l),o)}});searxng.ready(function(){function h(e){for(;e!==void 0;){if(e.classList.contains("detail"))return!0;if(e.classList.contains("result"))return!1;e=e.parentNode}return!1}function s(e){for(;e!==void 0;){if(e.classList.contains("result"))return e;e=e.parentNode}}function i(e){return e&&e.classList.contains("result-images")}searxng.on(".result","click",function(e){if(!h(e.target)){l(this)(!0,!0);let u=s(e.target);i(u)&&(e.preventDefault(),searxng.selectImage(u))}}),searxng.on(".result a","focus",function(e){if(!h(e.target)){let u=s(e.target);u&&u.getAttribute("data-vim-selected")===null&&l(u)(!0),i(u)&&searxng.selectImage(u)}},!0);var p={Escape:{key:"ESC",fun:r,des:"remove focus from the focused input",cat:"Control"},c:{key:"c",fun:A,des:"copy url of the selected result to the clipboard",cat:"Results"},h:{key:"h",fun:T,des:"toggle help window",cat:"Other"},i:{key:"i",fun:m,des:"focus on the search input",cat:"Control"},n:{key:"n",fun:a(),des:"go to next page",cat:"Results"},o:{key:"o",fun:y(!1),des:"open search result",cat:"Results"},p:{key:"p",fun:f(),des:"go to previous page",cat:"Results"},r:{key:"r",fun:n,des:"reload page from the server",cat:"Control"},t:{key:"t",fun:y(!0),des:"open the result in a new tab",cat:"Results"}},g={default:Object.assign({ArrowLeft:{key:"←",fun:l("up"),des:"select previous search result",cat:"Results"},ArrowRight:{key:"→",fun:l("down"),des:"select next search result",cat:"Results"}},p),vim:Object.assign({b:{key:"b",fun:c(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},f:{key:"f",fun:c(window.innerHeight),des:"scroll one page down",cat:"Navigation"},u:{key:"u",fun:c(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},d:{key:"d",fun:c(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},g:{key:"g",fun:d(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},v:{key:"v",fun:d(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},k:{key:"k",fun:l("up"),des:"select previous search result",cat:"Results"},j:{key:"j",fun:l("down"),des:"select next search result",cat:"Results"},y:{key:"y",fun:A,des:"copy url of the selected result to the clipboard",cat:"Results"}},p)},o=g[searxng.settings.hotkeys]||g.default;searxng.on(document,"keydown",function(e){if(Object.prototype.hasOwnProperty.call(o,e.key)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var u=e.target.tagName.toLowerCase();e.key==="Escape"?o[e.key].fun(e):(e.target===document.body||u==="a"||u==="button")&&(e.preventDefault(),o[e.key].fun())}});function l(e){return function(u,_){var E=document.querySelector(".result[data-vim-selected]"),k=e;if(E===null){if(E=document.querySelector(".result"),E===null)return;(e==="down"||e==="up")&&(k=E)}var v,w=document.querySelectorAll(".result");if(w=Array.from(w),typeof k!="string")v=k;else switch(k){case"visible":for(var q=document.documentElement.scrollTop||document.body.scrollTop,B=q+document.documentElement.clientHeight,x=0;xq)break}break;case"down":v=w[w.indexOf(E)+1]||E;break;case"up":v=w[w.indexOf(E)-1]||E;break;case"bottom":v=w[w.length-1];break;case"top":default:v=w[0]}if(v){if(E.removeAttribute("data-vim-selected"),v.setAttribute("data-vim-selected","true"),!_){var C=v.querySelector("h3 a")||v.querySelector("a");C!==null&&C.focus()}u||b()}}}function n(){document.location.reload(!0)}function r(e){const u=e.target.tagName.toLowerCase();document.activeElement&&(u==="input"||u==="select"||u==="textarea")?document.activeElement.blur():searxng.closeDetail()}function t(e){return function(){var u=document.querySelector(e);u&&u.click()}}function a(){return t('nav#pagination .next_page button[type="submit"]')}function f(){return t('nav#pagination .previous_page button[type="submit"]')}function b(){var e=document.querySelector(".result[data-vim-selected]");if(e!==null){var u=document.documentElement.scrollTop||document.body.scrollTop,_=document.documentElement.clientHeight,E=e.offsetTop,k=E+e.clientHeight,v=120;if(e.previousElementSibling===null&&k<_){window.scroll(window.scrollX,0);return}if(u>E-v)window.scroll(window.scrollX,E-v);else{var w=u+_;w a")),u!==null){var _=u.getAttribute("href");e?window.open(_):window.location.href=_}}}function S(e){var u={};for(var _ in o){var E=o[_];u[E.cat]=u[E.cat]||[],u[E.cat].push(E)}var k=Object.keys(u).sort(function(M,C){return u[C].length-u[M].length});if(k.length!==0){var v='×';v+="

    How to navigate SearXNG with hotkeys

    ",v+="";for(var w=0;w"),v+="",(!x||B)&&(v+="")}v+="
    ",v+="

    "+q[0].cat+"

    ",v+='
      ';for(var I in q)v+="
    • "+q[I].key+" "+q[I].des+"
    • ";v+="
    ",v+="
    ",e.innerHTML=v}}function T(){var e=document.querySelector("#vim-hotkeys-help");if(e==null){e=document.createElement("div"),e.id="vim-hotkeys-help",e.className="dialog-modal",S(e);var u=document.getElementsByTagName("body")[0];u.appendChild(e)}else{e.classList.toggle("invisible");return}}function A(){var e=document.querySelector(".result[data-vim-selected] h3 a");if(e===null)return;const u=e.getAttribute("href");navigator.clipboard.writeText(u)}searxng.scrollPageToSelected=b,searxng.selectNext=l("down"),searxng.selectPrevious=l("up")});(function(h,s,i){i.ready(function(){i.on(".searxng_init_map","click",function(p){this.classList.remove("searxng_init_map");var g=this.dataset.leafletTarget,o=parseFloat(this.dataset.mapLon),l=parseFloat(this.dataset.mapLat),n=parseFloat(this.dataset.mapZoom),r=JSON.parse(this.dataset.mapBoundingbox),t=JSON.parse(this.dataset.mapGeojson);i.loadStyle("css/leaflet.css"),i.loadScript("js/leaflet.js",function(){var a=null;if(r){var f=L.latLng(r[0],r[2]),b=L.latLng(r[1],r[3]);a=L.latLngBounds(f,b)}var c=L.map(g),d="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",m='Map data © OpenStreetMap contributors',y=new L.TileLayer(d,{minZoom:1,maxZoom:19,attribution:m}),S="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",T='Wikimedia maps | Maps data © OpenStreetMap contributors',A=new L.TileLayer(S,{minZoom:1,maxZoom:19,attribution:T});a?setTimeout(function(){c.fitBounds(a,{maxZoom:17})},0):o&&l&&(n?c.setView(new L.latLng(l,o),n):c.setView(new L.latLng(l,o),8)),c.addLayer(y);var e={"OSM Mapnik":y,"OSM Wikimedia":A};L.control.layers(e).addTo(c),t&&L.geoJson(t).addTo(c)}),p.preventDefault()})})})(window,document,window.searxng);(function(h,s,i){i.endpoint==="preferences"&&i.ready(function(){let p=null;function g(){p==null&&i.http("GET","engine_descriptions.json").then(function(a){p=JSON.parse(a);for(const[f,b]of Object.entries(p)){let c=s.querySelectorAll('[data-engine-name="'+f+'"] .engine-description');for(const d of c){let m=" ("+i.settings.translations.Source+": "+b[1]+")";d.innerHTML=b[0]+m}}})}for(const a of s.querySelectorAll("[data-engine-name]"))i.on(a,"mouseenter",g);const o=s.querySelectorAll(".enable-all-engines"),l=s.querySelectorAll(".disable-all-engines"),n=s.querySelectorAll("tbody input[type=checkbox][class~=checkbox-onoff]"),r=a=>{for(const f of n)f.offsetParent!==null&&(f.checked=!a)};for(const a of o)i.on(a,"click",()=>r(!0));for(const a of l)i.on(a,"click",()=>r(!1));const t=s.querySelector("#copy-hash");i.on(t,"click",a=>{a.preventDefault(),navigator.clipboard.writeText(t.dataset.hash),t.innerText=t.dataset.copiedText})})})(window,document,window.searxng);/*! + */window.searxng=function(h,s){h.Element&&function(n){n.matches=n.matches||n.matchesSelector||n.webkitMatchesSelector||n.msMatchesSelector||function(l){for(var t=this,r=(t.parentNode||t.document).querySelectorAll(l),o=-1;r[++o]&&r[o]!=t;);return!!r[o]}}(Element.prototype);function a(n,l,t){try{n.call(l,t)}catch(r){console.log(r)}}var f=window.searxng||{};f.on=function(n,l,t,r){r=r||!1,typeof n!="string"?n.addEventListener(l,t,r):s.addEventListener(l,function(o){for(var i=o.target||o.srcElement,p=!1;i&&i.matches&&i!==s&&!(p=i.matches(n));)i=i.parentElement;p&&a(t,i,o)},r)},f.ready=function(n){document.readyState!="loading"?n.call(h):h.addEventListener("DOMContentLoaded",n.bind(h))},f.http=function(n,l,t=null){return new Promise(function(r,o){try{var i=new XMLHttpRequest;i.open(n,l,!0),i.timeout=2e4,i.onload=function(){i.status==200?r(i.response,i.responseType):o(Error(i.statusText))},i.onerror=function(){o(Error("Network Error"))},i.onabort=function(){o(Error("Transaction is aborted"))},i.ontimeout=function(){o(Error("Timeout"))},t?i.send(t):i.send()}catch(p){o(p)}})},f.loadStyle=function(n){var l=f.settings.theme_static_path+"/"+n,t="style_"+n.replace(".","_"),r=s.getElementById(t);r===null&&(r=s.createElement("link"),r.setAttribute("id",t),r.setAttribute("rel","stylesheet"),r.setAttribute("type","text/css"),r.setAttribute("href",l),s.body.appendChild(r))},f.loadScript=function(n,l){var t=f.settings.theme_static_path+"/"+n,r="script_"+n.replace(".","_"),o=s.getElementById(r);if(o===null)o=s.createElement("script"),o.setAttribute("id",r),o.setAttribute("src",t),o.onload=l,o.onerror=function(){o.setAttribute("error","1")},s.body.appendChild(o);else if(o.hasAttribute("error"))console.log("callback not executed : script '"+t+"' not loaded.");else try{l.apply(o,[])}catch(i){console.log(i)}},f.insertBefore=function(n,l){l.parentNode.insertBefore(n,l)},f.insertAfter=function(n,l){l.parentNode.insertAfter(n,l.nextSibling)},f.on(".close","click",function(){this.parentNode.classList.add("invisible")});function m(){for(var n of s.getElementsByTagName("body")[0].classList.values())if(n.endsWith("_endpoint"))return n.split("_")[0];return""}return f.endpoint=m(),f}(window,document);searxng.ready(function(){if(searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype,searxng.endpoint!=="results")return;if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}let h=document;var s=h.getElementById("results").classList.contains("only_template_images");function a(){var n=h.createElement("div");return n.classList.add("loader"),n}function f(n,l){n.textContent="",l.forEach(t=>n.appendChild(t))}function m(n){var l=h.querySelector("#pagination form.next_page");if(l){f(h.querySelector("#pagination"),[a()]);var t=new FormData(l);searxng.http("POST",h.querySelector("#search").getAttribute("action"),t).then(function(r){var o=new DOMParser().parseFromString(r,"text/html"),i=o.querySelectorAll("#urls article"),p=o.querySelector("#pagination");h.querySelector("#pagination").remove(),i.length>0&&!s&&h.querySelector("#urls").appendChild(h.createElement("hr")),i.forEach(b=>{h.querySelector("#urls").appendChild(b)}),p&&(h.querySelector("#results").appendChild(p),n())}).catch(function(r){console.log(r);var o=h.createElement("div");o.textContent=searxng.settings.translations.error_loading_next_page,o.classList.add("dialog-error"),o.setAttribute("role","alert"),f(h.querySelector("#pagination"),[o])})}}if(searxng.settings.infinite_scroll&&searxng.infinite_scroll_supported){const n={rootMargin:"20rem"},l="article.result:last-child",t=new IntersectionObserver(r=>{const o=r[0];o.isIntersecting&&(t.unobserve(o.target),m(()=>t.observe(h.querySelector(l),n)))});t.observe(h.querySelector(l),n)}});searxng.ready(function(){function h(e){for(;e!==void 0;){if(e.classList.contains("detail"))return!0;if(e.classList.contains("result"))return!1;e=e.parentNode}return!1}function s(e){for(;e!==void 0;){if(e.classList.contains("result"))return e;e=e.parentNode}}function a(e){return e&&e.classList.contains("result-images")}searxng.on(".result","click",function(e){if(!h(e.target)){l(this)(!0,!0);let u=s(e.target);a(u)&&(e.preventDefault(),searxng.selectImage(u))}}),searxng.on(".result a","focus",function(e){if(!h(e.target)){let u=s(e.target);u&&u.getAttribute("data-vim-selected")===null&&l(u)(!0),a(u)&&searxng.selectImage(u)}},!0);var f={Escape:{key:"ESC",fun:r,des:"remove focus from the focused input",cat:"Control"},c:{key:"c",fun:A,des:"copy url of the selected result to the clipboard",cat:"Results"},h:{key:"h",fun:w,des:"toggle help window",cat:"Other"},i:{key:"i",fun:g,des:"focus on the search input",cat:"Control"},n:{key:"n",fun:i(),des:"go to next page",cat:"Results"},o:{key:"o",fun:v(!1),des:"open search result",cat:"Results"},p:{key:"p",fun:p(),des:"go to previous page",cat:"Results"},r:{key:"r",fun:t,des:"reload page from the server",cat:"Control"},t:{key:"t",fun:v(!0),des:"open the result in a new tab",cat:"Results"}},m={default:Object.assign({ArrowLeft:{key:"←",fun:l("up"),des:"select previous search result",cat:"Results"},ArrowRight:{key:"→",fun:l("down"),des:"select next search result",cat:"Results"}},f),vim:Object.assign({b:{key:"b",fun:c(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},f:{key:"f",fun:c(window.innerHeight),des:"scroll one page down",cat:"Navigation"},u:{key:"u",fun:c(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},d:{key:"d",fun:c(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},g:{key:"g",fun:d(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},v:{key:"v",fun:d(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},k:{key:"k",fun:l("up"),des:"select previous search result",cat:"Results"},j:{key:"j",fun:l("down"),des:"select next search result",cat:"Results"},y:{key:"y",fun:A,des:"copy url of the selected result to the clipboard",cat:"Results"}},f)},n=m[searxng.settings.hotkeys]||m.default;searxng.on(document,"keydown",function(e){if(Object.prototype.hasOwnProperty.call(n,e.key)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var u=e.target.tagName.toLowerCase();e.key==="Escape"?n[e.key].fun(e):(e.target===document.body||u==="a"||u==="button")&&(e.preventDefault(),n[e.key].fun())}});function l(e){return function(u,_){var k=document.querySelector(".result[data-vim-selected]"),T=e;if(k===null){if(k=document.querySelector(".result"),k===null)return;(e==="down"||e==="up")&&(T=k)}var y,S=document.querySelectorAll(".result");if(S=Array.from(S),typeof T!="string")y=T;else switch(T){case"visible":for(var q=document.documentElement.scrollTop||document.body.scrollTop,B=q+document.documentElement.clientHeight,x=0;xq)break}break;case"down":y=S[S.indexOf(k)+1]||k;break;case"up":y=S[S.indexOf(k)-1]||k;break;case"bottom":y=S[S.length-1];break;case"top":default:y=S[0]}if(y){if(k.removeAttribute("data-vim-selected"),y.setAttribute("data-vim-selected","true"),!_){var C=y.querySelector("h3 a")||y.querySelector("a");C!==null&&C.focus()}u||b()}}}function t(){document.location.reload(!0)}function r(e){const u=e.target.tagName.toLowerCase();document.activeElement&&(u==="input"||u==="select"||u==="textarea")?document.activeElement.blur():searxng.closeDetail()}function o(e){return function(){var u=document.querySelector(e);u&&u.click()}}function i(){return o('nav#pagination .next_page button[type="submit"]')}function p(){return o('nav#pagination .previous_page button[type="submit"]')}function b(){var e=document.querySelector(".result[data-vim-selected]");if(e!==null){var u=document.documentElement.scrollTop||document.body.scrollTop,_=document.documentElement.clientHeight,k=e.offsetTop,T=k+e.clientHeight,y=120;if(e.previousElementSibling===null&&T<_){window.scroll(window.scrollX,0);return}if(u>k-y)window.scroll(window.scrollX,k-y);else{var S=u+_;S a")),u!==null){var _=u.getAttribute("href");e?window.open(_):window.location.href=_}}}function E(e){var u={};for(var _ in n){var k=n[_];u[k.cat]=u[k.cat]||[],u[k.cat].push(k)}var T=Object.keys(u).sort(function(M,C){return u[C].length-u[M].length});if(T.length!==0){var y='×';y+="

    How to navigate SearXNG with hotkeys

    ",y+="";for(var S=0;S"),y+="",(!x||B)&&(y+="")}y+="
    ",y+="

    "+q[0].cat+"

    ",y+='
      ';for(var I in q)y+="
    • "+q[I].key+" "+q[I].des+"
    • ";y+="
    ",y+="
    ",e.innerHTML=y}}function w(){var e=document.querySelector("#vim-hotkeys-help");if(e==null){e=document.createElement("div"),e.id="vim-hotkeys-help",e.className="dialog-modal",E(e);var u=document.getElementsByTagName("body")[0];u.appendChild(e)}else{e.classList.toggle("invisible");return}}function A(){var e=document.querySelector(".result[data-vim-selected] h3 a");if(e===null)return;const u=e.getAttribute("href");navigator.clipboard.writeText(u)}searxng.scrollPageToSelected=b,searxng.selectNext=l("down"),searxng.selectPrevious=l("up")});(function(h,s,a){a.ready(function(){a.on(".searxng_init_map","click",function(f){this.classList.remove("searxng_init_map");var m=this.dataset.leafletTarget,n=parseFloat(this.dataset.mapLon),l=parseFloat(this.dataset.mapLat),t=parseFloat(this.dataset.mapZoom),r=JSON.parse(this.dataset.mapBoundingbox),o=JSON.parse(this.dataset.mapGeojson);a.loadStyle("css/leaflet.css"),a.loadScript("js/leaflet.js",function(){var i=null;if(r){var p=L.latLng(r[0],r[2]),b=L.latLng(r[1],r[3]);i=L.latLngBounds(p,b)}var c=L.map(m),d="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",g='Map data © OpenStreetMap contributors',v=new L.TileLayer(d,{minZoom:1,maxZoom:19,attribution:g}),E="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",w='Wikimedia maps | Maps data © OpenStreetMap contributors',A=new L.TileLayer(E,{minZoom:1,maxZoom:19,attribution:w});i?setTimeout(function(){c.fitBounds(i,{maxZoom:17})},0):n&&l&&(t?c.setView(new L.latLng(l,n),t):c.setView(new L.latLng(l,n),8)),c.addLayer(v);var e={"OSM Mapnik":v,"OSM Wikimedia":A};L.control.layers(e).addTo(c),o&&L.geoJson(o).addTo(c)}),f.preventDefault()})})})(window,document,window.searxng);(function(h,s,a){a.endpoint==="preferences"&&a.ready(function(){let f=null;function m(){f==null&&a.http("GET","engine_descriptions.json").then(function(i){f=JSON.parse(i);for(const[p,b]of Object.entries(f)){let c=s.querySelectorAll('[data-engine-name="'+p+'"] .engine-description');for(const d of c){let g=" ("+a.settings.translations.Source+": "+b[1]+")";d.innerHTML=b[0]+g}}})}for(const i of s.querySelectorAll("[data-engine-name]"))a.on(i,"mouseenter",m);const n=s.querySelectorAll(".enable-all-engines"),l=s.querySelectorAll(".disable-all-engines"),t=s.querySelectorAll("tbody input[type=checkbox][class~=checkbox-onoff]"),r=i=>{for(const p of t)p.offsetParent!==null&&(p.checked=!i)};for(const i of n)a.on(i,"click",()=>r(!0));for(const i of l)a.on(i,"click",()=>r(!1));const o=s.querySelector("#copy-hash");a.on(o,"click",i=>{i.preventDefault(),navigator.clipboard.writeText(o.dataset.hash),o.innerText=o.dataset.copiedText})})})(window,document,window.searxng);/*! * swiped-events.js - v@version@ * Pure JavaScript swipe events * https://github.com/john-doherty/swiped-events * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element * @author John Doherty * @license MIT - */(function(h,s){typeof h.CustomEvent!="function"&&(h.CustomEvent=function(c,d){d=d||{bubbles:!1,cancelable:!1,detail:void 0};var m=s.createEvent("CustomEvent");return m.initCustomEvent(c,d.bubbles,d.cancelable,d.detail),m},h.CustomEvent.prototype=h.Event.prototype),s.addEventListener("touchstart",a,!1),s.addEventListener("touchmove",f,!1),s.addEventListener("touchend",t,!1);var i=null,p=null,g=null,o=null,l=null,n=null,r=0;function t(c){if(n===c.target){var d=parseInt(b(n,"data-swipe-threshold","20"),10),m=b(n,"data-swipe-unit","px"),y=parseInt(b(n,"data-swipe-timeout","500"),10),S=Date.now()-l,T="",A=c.changedTouches||c.touches||[];if(m==="vh"&&(d=Math.round(d/100*s.documentElement.clientHeight)),m==="vw"&&(d=Math.round(d/100*s.documentElement.clientWidth)),Math.abs(g)>Math.abs(o)?Math.abs(g)>d&&S0?T="swiped-left":T="swiped-right"):Math.abs(o)>d&&S0?T="swiped-up":T="swiped-down"),T!==""){var e={dir:T.replace(/swiped-/,""),touchType:(A[0]||{}).touchType||"direct",fingers:r,xStart:parseInt(i,10),xEnd:parseInt((A[0]||{}).clientX||-1,10),yStart:parseInt(p,10),yEnd:parseInt((A[0]||{}).clientY||-1,10)};n.dispatchEvent(new CustomEvent("swiped",{bubbles:!0,cancelable:!0,detail:e})),n.dispatchEvent(new CustomEvent(T,{bubbles:!0,cancelable:!0,detail:e}))}i=null,p=null,l=null}}function a(c){c.target.getAttribute("data-swipe-ignore")!=="true"&&(n=c.target,l=Date.now(),i=c.touches[0].clientX,p=c.touches[0].clientY,g=0,o=0,r=c.touches.length)}function f(c){if(!(!i||!p)){var d=c.touches[0].clientX,m=c.touches[0].clientY;g=i-d,o=p-m}}function b(c,d,m){for(;c&&c!==s.documentElement;){var y=c.getAttribute(d);if(y)return y;c=c.parentNode}return m}})(window,document);(function(h,s,i){i.endpoint==="results"&&i.ready(function(){s.querySelectorAll("#urls img").forEach(n=>n.addEventListener("error",()=>{n.src=window.searxng.settings.theme_static_path+"/img/img_load_error.svg"},{once:!0})),s.querySelector("#search_url button#copy_url")&&(s.querySelector("#search_url button#copy_url").style.display="block"),i.on(".btn-collapse","click",function(){var n=this.getAttribute("data-btn-text-collapsed"),r=this.getAttribute("data-btn-text-not-collapsed"),t=this.getAttribute("data-target"),a=s.querySelector(t),f=this.innerHTML;this.classList.contains("collapsed")?f=f.replace(n,r):f=f.replace(r,n),this.innerHTML=f,this.classList.toggle("collapsed"),a.classList.toggle("invisible")}),i.on(".media-loader","click",function(){var n=this.getAttribute("data-target"),r=s.querySelector(n+" > iframe"),t=r.getAttribute("src");(t==null||t===!1)&&r.setAttribute("src",r.getAttribute("data-src"))}),i.on("#copy_url","click",function(){var n=this.parentElement.querySelector("pre");navigator.clipboard.writeText(n.innerText),this.innerText=this.dataset.copiedText});let p;const g=s.createElement("div");g.classList.add("loader");const o=new Image,l=(n,r)=>{p&&clearTimeout(p),p=setTimeout(()=>{o.src=n},1e3),o.onload=()=>{r(),g.remove()},o.onerror=()=>{g.remove()}};i.selectImage=n=>{if(s.getElementById("results").classList.add("image-detail-open"),window.location.hash="#image-viewer",i.scrollPageToSelected(),!n)return;const r=n.querySelector(".result-images-source img");if(!r)return;const t=r.getAttribute("data-src");if(!t)return;const a=n.querySelector(".image_thumbnail");r.src=a.src,n.querySelector(".detail").appendChild(g),l(t,()=>{r.src=t,r.removeAttribute("data-src")})},i.closeDetail=function(){s.getElementById("results").classList.remove("image-detail-open"),window.location.hash=="#image-viewer"&&window.history.back(),i.scrollPageToSelected()},i.on(".result-detail-close","click",n=>{n.preventDefault(),i.closeDetail()}),i.on(".result-detail-previous","click",n=>{n.preventDefault(),i.selectPrevious(!1)}),i.on(".result-detail-next","click",n=>{n.preventDefault(),i.selectNext(!1)}),window.addEventListener("hashchange",()=>{window.location.hash!="#image-viewer"&&i.closeDetail()}),s.querySelectorAll(".swipe-horizontal").forEach(n=>{n.addEventListener("swiped-left",function(){i.selectNext(!1)}),n.addEventListener("swiped-right",function(){i.selectPrevious(!1)})}),h.addEventListener("scroll",function(){var n=s.getElementById("backToTop"),r=document.documentElement.scrollTop||document.body.scrollTop,t=s.getElementById("results");n!==null&&(r>=100?t.classList.add("scrolling"):t.classList.remove("scrolling"))},!0)})})(window,document,window.searxng);(function(h,s,i){var p="q",g;const o=window.matchMedia("only screen and (max-width: 50em)").matches;function l(){if(g.value.length>0){var t=document.getElementById("search");setTimeout(t.submit.bind(t),0)}}function n(t){var a=document.getElementById("clear_search"),f=function(){t.value.length===0?a.classList.add("empty"):a.classList.remove("empty")};f(),a.addEventListener("click",function(b){t.value="",t.focus(),f(),b.preventDefault()}),t.addEventListener("input",f,!1)}const r=async t=>{let a;if(i.settings.method==="GET"){const f=new URLSearchParams;f.append("q",t),a=fetch("./autocompleter?"+f.toString())}else{const f=new FormData;f.append("q",t),a=fetch("./autocompleter",{method:"POST",body:f})}a.then(async function(f){const b=await f.json();if(!b)return;const c=s.querySelector(".autocomplete"),d=s.querySelector(".autocomplete ul");if(c.classList.add("open"),d.innerHTML="",!b[1]||b[1].length==0){const m=document.createElement("li");m.classList.add("no-item-found"),m.innerHTML=i.settings.translations.no_item_found,d.appendChild(m);return}for(let m of b[1]){const y=document.createElement("li");y.innerText=m,i.on(y,"mousedown",()=>{g.value=m,s.querySelector("#search").submit(),c.classList.remove("open")}),d.appendChild(y)}})};i.ready(function(){o||document.getElementById("q").focus(),g=s.getElementById(p);const t=s.querySelector(".autocomplete"),a=s.querySelector(".autocomplete ul");g!==null&&(n(g),i.settings.autocomplete&&(i.on(g,"input",()=>{const c=g.value;c.length{c==g.value&&r(c)},300)}),i.on(g,"keyup",c=>{let d=-1;const m=a.children;for(let S=0;S=0&&m[d].classList.remove("active"),y=(d-1+m.length)%m.length):c.key==="ArrowDown"?(d>=0&&m[d].classList.remove("active"),y=(d+1)%m.length):(c.key==="Tab"||c.key==="Enter")&&t.classList.remove("open"),y!=-1){const S=m[y];S.classList.add("active"),S.classList.contains("no-item-found")||(g.value=S.innerText)}}))),g!==null&&i.settings.search_on_category_select&&s.querySelector(".search_filters")!=null&&(i.on(s.getElementById("safesearch"),"change",l),i.on(s.getElementById("time_range"),"change",l),i.on(s.getElementById("language"),"change",l));const f=s.querySelectorAll("button.category_button");for(let c of f)i.on(c,"click",d=>{if(d.shiftKey){d.preventDefault(),c.classList.toggle("selected");return}const m=s.querySelectorAll("button.category_button.selected");for(let y of m)y.classList.remove("selected");c.classList.add("selected")});const b=s.querySelector("#search");b!=null&&i.on(b,"submit",c=>{c.preventDefault();const d=s.querySelector("#selected-categories");if(d){let m=[];for(let y of f)y.classList.contains("selected")&&m.push(y.name.replace("category_",""));d.value=m.join(",")}b.submit()})})})(window,document,window.searxng); + */(function(h,s){typeof h.CustomEvent!="function"&&(h.CustomEvent=function(c,d){d=d||{bubbles:!1,cancelable:!1,detail:void 0};var g=s.createEvent("CustomEvent");return g.initCustomEvent(c,d.bubbles,d.cancelable,d.detail),g},h.CustomEvent.prototype=h.Event.prototype),s.addEventListener("touchstart",i,!1),s.addEventListener("touchmove",p,!1),s.addEventListener("touchend",o,!1);var a=null,f=null,m=null,n=null,l=null,t=null,r=0;function o(c){if(t===c.target){var d=parseInt(b(t,"data-swipe-threshold","20"),10),g=b(t,"data-swipe-unit","px"),v=parseInt(b(t,"data-swipe-timeout","500"),10),E=Date.now()-l,w="",A=c.changedTouches||c.touches||[];if(g==="vh"&&(d=Math.round(d/100*s.documentElement.clientHeight)),g==="vw"&&(d=Math.round(d/100*s.documentElement.clientWidth)),Math.abs(m)>Math.abs(n)?Math.abs(m)>d&&E0?w="swiped-left":w="swiped-right"):Math.abs(n)>d&&E0?w="swiped-up":w="swiped-down"),w!==""){var e={dir:w.replace(/swiped-/,""),touchType:(A[0]||{}).touchType||"direct",fingers:r,xStart:parseInt(a,10),xEnd:parseInt((A[0]||{}).clientX||-1,10),yStart:parseInt(f,10),yEnd:parseInt((A[0]||{}).clientY||-1,10)};t.dispatchEvent(new CustomEvent("swiped",{bubbles:!0,cancelable:!0,detail:e})),t.dispatchEvent(new CustomEvent(w,{bubbles:!0,cancelable:!0,detail:e}))}a=null,f=null,l=null}}function i(c){c.target.getAttribute("data-swipe-ignore")!=="true"&&(t=c.target,l=Date.now(),a=c.touches[0].clientX,f=c.touches[0].clientY,m=0,n=0,r=c.touches.length)}function p(c){if(!(!a||!f)){var d=c.touches[0].clientX,g=c.touches[0].clientY;m=a-d,n=f-g}}function b(c,d,g){for(;c&&c!==s.documentElement;){var v=c.getAttribute(d);if(v)return v;c=c.parentNode}return g}})(window,document);(function(h,s,a){a.endpoint==="results"&&a.ready(function(){s.querySelectorAll("#urls img").forEach(t=>t.addEventListener("error",()=>{t.src=window.searxng.settings.theme_static_path+"/img/img_load_error.svg"},{once:!0})),s.querySelector("#search_url button#copy_url")&&(s.querySelector("#search_url button#copy_url").style.display="block"),a.on(".btn-collapse","click",function(){var t=this.getAttribute("data-btn-text-collapsed"),r=this.getAttribute("data-btn-text-not-collapsed"),o=this.getAttribute("data-target"),i=s.querySelector(o),p=this.innerHTML;this.classList.contains("collapsed")?p=p.replace(t,r):p=p.replace(r,t),this.innerHTML=p,this.classList.toggle("collapsed"),i.classList.toggle("invisible")}),a.on(".media-loader","click",function(){var t=this.getAttribute("data-target"),r=s.querySelector(t+" > iframe"),o=r.getAttribute("src");(o==null||o===!1)&&r.setAttribute("src",r.getAttribute("data-src"))}),a.on("#copy_url","click",function(){var t=this.parentElement.querySelector("pre");navigator.clipboard.writeText(t.innerText),this.innerText=this.dataset.copiedText});let f;const m=s.createElement("div");m.classList.add("loader");const n=new Image,l=(t,r)=>{f&&clearTimeout(f),f=setTimeout(()=>{n.src=t},1e3),n.onload=()=>{r(),m.remove()},n.onerror=()=>{m.remove()}};a.selectImage=t=>{if(s.getElementById("results").classList.add("image-detail-open"),window.location.hash="#image-viewer",a.scrollPageToSelected(),!t)return;const r=t.querySelector(".result-images-source img");if(!r)return;const o=r.getAttribute("data-src");if(!o)return;const i=t.querySelector(".image_thumbnail");r.src=i.src,t.querySelector(".detail").appendChild(m),l(o,()=>{r.src=o,r.removeAttribute("data-src")})},a.closeDetail=function(){s.getElementById("results").classList.remove("image-detail-open"),window.location.hash=="#image-viewer"&&window.history.back(),a.scrollPageToSelected()},a.on(".result-detail-close","click",t=>{t.preventDefault(),a.closeDetail()}),a.on(".result-detail-previous","click",t=>{t.preventDefault(),a.selectPrevious(!1)}),a.on(".result-detail-next","click",t=>{t.preventDefault(),a.selectNext(!1)}),window.addEventListener("hashchange",()=>{window.location.hash!="#image-viewer"&&a.closeDetail()}),s.querySelectorAll(".swipe-horizontal").forEach(t=>{t.addEventListener("swiped-left",function(){a.selectNext(!1)}),t.addEventListener("swiped-right",function(){a.selectPrevious(!1)})}),h.addEventListener("scroll",function(){var t=s.getElementById("backToTop"),r=document.documentElement.scrollTop||document.body.scrollTop,o=s.getElementById("results");t!==null&&(r>=100?o.classList.add("scrolling"):o.classList.remove("scrolling"))},!0)})})(window,document,window.searxng);(function(h,s,a){var f="q",m;const n=window.matchMedia("only screen and (max-width: 50em)").matches,l=document.querySelector("main").id=="main_results";function t(){if(m.value.length>0){var i=document.getElementById("search");setTimeout(i.submit.bind(i),0)}}function r(i){var p=document.getElementById("clear_search"),b=function(){i.value.length===0?p.classList.add("empty"):p.classList.remove("empty")};b(),p.addEventListener("click",function(c){i.value="",i.focus(),b(),c.preventDefault()}),i.addEventListener("input",b,!1)}const o=async i=>{let p;if(a.settings.method==="GET"){const b=new URLSearchParams;b.append("q",i),p=fetch("./autocompleter?"+b.toString())}else{const b=new FormData;b.append("q",i),p=fetch("./autocompleter",{method:"POST",body:b})}p.then(async function(b){const c=await b.json();if(!c)return;const d=s.querySelector(".autocomplete"),g=s.querySelector(".autocomplete ul");if(d.classList.add("open"),g.innerHTML="",!c[1]||c[1].length==0){const v=document.createElement("li");v.classList.add("no-item-found"),v.innerHTML=a.settings.translations.no_item_found,g.appendChild(v);return}for(let v of c[1]){const E=document.createElement("li");E.innerText=v,a.on(E,"mousedown",()=>{m.value=v,s.querySelector("#search").submit(),d.classList.remove("open")}),g.appendChild(E)}})};a.ready(function(){!n&&!l&&document.getElementById("q").focus(),m=s.getElementById(f);const i=s.querySelector(".autocomplete"),p=s.querySelector(".autocomplete ul");m!==null&&(r(m),a.settings.autocomplete&&(a.on(m,"input",()=>{const d=m.value;d.length{d==m.value&&o(d)},300)}),a.on(m,"keyup",d=>{let g=-1;const v=p.children;for(let w=0;w=0&&v[g].classList.remove("active"),E=(g-1+v.length)%v.length):d.key==="ArrowDown"?(g>=0&&v[g].classList.remove("active"),E=(g+1)%v.length):(d.key==="Tab"||d.key==="Enter")&&i.classList.remove("open"),E!=-1){const w=v[E];w.classList.add("active"),w.classList.contains("no-item-found")||(m.value=w.innerText)}}))),m!==null&&a.settings.search_on_category_select&&s.querySelector(".search_filters")!=null&&(a.on(s.getElementById("safesearch"),"change",t),a.on(s.getElementById("time_range"),"change",t),a.on(s.getElementById("language"),"change",t));const b=s.querySelectorAll("button.category_button");for(let d of b)a.on(d,"click",g=>{if(g.shiftKey){g.preventDefault(),d.classList.toggle("selected");return}const v=s.querySelectorAll("button.category_button.selected");for(let E of v)E.classList.remove("selected");d.classList.add("selected")});const c=s.querySelector("#search");c!=null&&a.on(c,"submit",d=>{d.preventDefault();const g=s.querySelector("#selected-categories");if(g){let v=[];for(let E of b)E.classList.contains("selected")&&v.push(E.name.replace("category_",""));g.value=v.join(",")}c.submit()})})})(window,document,window.searxng); //# sourceMappingURL=searxng.min.js.map diff --git a/searx/static/themes/simple/js/searxng.min.js.map b/searx/static/themes/simple/js/searxng.min.js.map index f454d84c0..551c8741c 100644 --- a/searx/static/themes/simple/js/searxng.min.js.map +++ b/searx/static/themes/simple/js/searxng.min.js.map @@ -1 +1 @@ -{"version":3,"file":"searxng.min.js","sources":["../../../../../client/simple/src/js/main/00_toolkit.js","../../../../../client/simple/src/js/main/infinite_scroll.js","../../../../../client/simple/src/js/main/keyboard.js","../../../../../client/simple/src/js/main/mapresult.js","../../../../../client/simple/src/js/main/preferences.js","../../../../../client/simple/node_modules/swiped-events/src/swiped-events.js","../../../../../client/simple/src/js/main/results.js","../../../../../client/simple/src/js/main/search.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n 'use strict';\n\n // not invented here toolkit with bugs fixed elsewhere\n // purposes : be just good enough and as small as possible\n\n // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n if (w.Element) {\n (function (ElementPrototype) {\n ElementPrototype.matches = ElementPrototype.matches ||\n ElementPrototype.matchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n function (selector) {\n var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n while (nodes[++i] && nodes[i] != node);\n return !!nodes[i];\n };\n })(Element.prototype);\n }\n\n function callbackSafe (callback, el, e) {\n try {\n callback.call(el, e);\n } catch (exception) {\n console.log(exception);\n }\n }\n\n var searxng = window.searxng || {};\n\n searxng.on = function (obj, eventType, callback, useCapture) {\n useCapture = useCapture || false;\n if (typeof obj !== 'string') {\n // obj HTMLElement, HTMLDocument\n obj.addEventListener(eventType, callback, useCapture);\n } else {\n // obj is a selector\n d.addEventListener(eventType, function (e) {\n var el = e.target || e.srcElement, found = false;\n while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n if (found) callbackSafe(callback, el, e);\n }, useCapture);\n }\n };\n\n searxng.ready = function (callback) {\n if (document.readyState != 'loading') {\n callback.call(w);\n } else {\n w.addEventListener('DOMContentLoaded', callback.bind(w));\n }\n };\n\n searxng.http = function (method, url, data = null) {\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n req.open(method, url, true);\n req.timeout = 20000;\n\n // On load\n req.onload = function () {\n if (req.status == 200) {\n resolve(req.response, req.responseType);\n } else {\n reject(Error(req.statusText));\n }\n };\n\n // Handle network errors\n req.onerror = function () {\n reject(Error(\"Network Error\"));\n };\n\n req.onabort = function () {\n reject(Error(\"Transaction is aborted\"));\n };\n\n req.ontimeout = function () {\n reject(Error(\"Timeout\"));\n }\n\n // Make the request\n if (data) {\n req.send(data)\n } else {\n req.send();\n }\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n searxng.loadStyle = function (src) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"style_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('link');\n s.setAttribute('id', id);\n s.setAttribute('rel', 'stylesheet');\n s.setAttribute('type', 'text/css');\n s.setAttribute('href', path);\n d.body.appendChild(s);\n }\n };\n\n searxng.loadScript = function (src, callback) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"script_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('script');\n s.setAttribute('id', id);\n s.setAttribute('src', path);\n s.onload = callback;\n s.onerror = function () {\n s.setAttribute('error', '1');\n };\n d.body.appendChild(s);\n } else if (!s.hasAttribute('error')) {\n try {\n callback.apply(s, []);\n } catch (exception) {\n console.log(exception);\n }\n } else {\n console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n }\n };\n\n searxng.insertBefore = function (newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n };\n\n searxng.insertAfter = function (newNode, referenceNode) {\n referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n };\n\n searxng.on('.close', 'click', function () {\n this.parentNode.classList.add('invisible');\n });\n\n function getEndpoint () {\n for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n if (className.endsWith('_endpoint')) {\n return className.split('_')[0];\n }\n }\n return '';\n }\n\n searxng.endpoint = getEndpoint();\n\n return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n 'use strict';\n\n searxng.infinite_scroll_supported = (\n 'IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n if (!searxng.infinite_scroll_supported) {\n console.log('IntersectionObserver not supported');\n return;\n }\n\n let d = document;\n var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n function newLoadSpinner () {\n var loader = d.createElement('div');\n loader.classList.add('loader');\n return loader;\n }\n\n function replaceChildrenWith (element, children) {\n element.textContent = '';\n children.forEach(child => element.appendChild(child));\n }\n\n function loadNextPage (callback) {\n var form = d.querySelector('#pagination form.next_page');\n if (!form) {\n return\n }\n replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n var formData = new FormData(form);\n searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n function (response) {\n var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n var articleList = nextPageDoc.querySelectorAll('#urls article');\n var paginationElement = nextPageDoc.querySelector('#pagination');\n d.querySelector('#pagination').remove();\n if (articleList.length > 0 && !onlyImages) {\n // do not add
    element when there are only images\n d.querySelector('#urls').appendChild(d.createElement('hr'));\n }\n articleList.forEach(articleElement => {\n d.querySelector('#urls').appendChild(articleElement);\n });\n if (paginationElement) {\n d.querySelector('#results').appendChild(paginationElement);\n callback();\n }\n }\n ).catch(\n function (err) {\n console.log(err);\n var e = d.createElement('div');\n e.textContent = searxng.settings.translations.error_loading_next_page;\n e.classList.add('dialog-error');\n e.setAttribute('role', 'alert');\n replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n }\n )\n }\n\n if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) {\n const intersectionObserveOptions = {\n rootMargin: \"20rem\",\n };\n const observedSelector = 'article.result:last-child';\n const observer = new IntersectionObserver(entries => {\n const paginationEntry = entries[0];\n if (paginationEntry.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n }\n });\n observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n function isElementInDetail (el) {\n while (el !== undefined) {\n if (el.classList.contains('detail')) {\n return true;\n }\n if (el.classList.contains('result')) {\n // we found a result, no need to go to the root of the document:\n // el is not inside a
    element\n return false;\n }\n el = el.parentNode;\n }\n return false;\n }\n\n function getResultElement (el) {\n while (el !== undefined) {\n if (el.classList.contains('result')) {\n return el;\n }\n el = el.parentNode;\n }\n return undefined;\n }\n\n function isImageResult (resultElement) {\n return resultElement && resultElement.classList.contains('result-images');\n }\n\n searxng.on('.result', 'click', function (e) {\n if (!isElementInDetail(e.target)) {\n highlightResult(this)(true, true);\n let resultElement = getResultElement(e.target);\n if (isImageResult(resultElement)) {\n e.preventDefault();\n searxng.selectImage(resultElement);\n }\n }\n });\n\n searxng.on('.result a', 'focus', function (e) {\n if (!isElementInDetail(e.target)) {\n let resultElement = getResultElement(e.target);\n if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n highlightResult(resultElement)(true);\n }\n if (isImageResult(resultElement)) {\n searxng.selectImage(resultElement);\n }\n }\n }, true);\n\n /* common base for layouts */\n var baseKeyBinding = {\n 'Escape': {\n key: 'ESC',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 'c': {\n key: 'c',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n 'h': {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n },\n 'i': {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 'n': {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 'o': {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 'p': {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 'r': {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 't': {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n };\n var keyBindingLayouts = {\n\n \"default\": Object.assign(\n { /* SearXNG layout */\n 'ArrowLeft': {\n key: '←',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'ArrowRight': {\n key: '→',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n }, baseKeyBinding),\n\n 'vim': Object.assign(\n { /* Vim-like Key Layout. */\n 'b': {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 'f': {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 'u': {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 'd': {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 'g': {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 'v': {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 'k': {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'j': {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n 'y': {\n key: 'y',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n }, baseKeyBinding)\n }\n\n var keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default;\n\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (\n Object.prototype.hasOwnProperty.call(keyBindings, e.key)\n && !e.ctrlKey && !e.altKey\n && !e.shiftKey && !e.metaKey\n ) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.key === 'Escape') {\n keyBindings[e.key].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n keyBindings[e.key].fun();\n }\n }\n }\n });\n\n function highlightResult (which) {\n return function (noScroll, keepFocus) {\n var current = document.querySelector('.result[data-vim-selected]'),\n effectiveWhich = which;\n if (current === null) {\n // no selection : choose the first one\n current = document.querySelector('.result');\n if (current === null) {\n // no first one : there are no results\n return;\n }\n // replace up/down actions by selecting first one\n if (which === \"down\" || which === \"up\") {\n effectiveWhich = current;\n }\n }\n\n var next, results = document.querySelectorAll('.result');\n results = Array.from(results); // convert NodeList to Array for further use\n\n if (typeof effectiveWhich !== 'string') {\n next = effectiveWhich;\n } else {\n switch (effectiveWhich) {\n case 'visible':\n var top = document.documentElement.scrollTop || document.body.scrollTop;\n var bot = top + document.documentElement.clientHeight;\n\n for (var i = 0; i < results.length; i++) {\n next = results[i];\n var etop = next.offsetTop;\n var ebot = etop + next.clientHeight;\n\n if ((ebot <= bot) && (etop > top)) {\n break;\n }\n }\n break;\n case 'down':\n next = results[results.indexOf(current) + 1] || current;\n break;\n case 'up':\n next = results[results.indexOf(current) - 1] || current;\n break;\n case 'bottom':\n next = results[results.length - 1];\n break;\n case 'top':\n /* falls through */\n default:\n next = results[0];\n }\n }\n\n if (next) {\n current.removeAttribute('data-vim-selected');\n next.setAttribute('data-vim-selected', 'true');\n if (!keepFocus) {\n var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\n }\n }\n if (!noScroll) {\n scrollPageToSelected();\n }\n }\n };\n }\n\n function reloadPage () {\n document.location.reload(true);\n }\n\n function removeFocus (e) {\n const tagName = e.target.tagName.toLowerCase();\n if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n document.activeElement.blur();\n } else {\n searxng.closeDetail();\n }\n }\n\n function pageButtonClick (css_selector) {\n return function () {\n var button = document.querySelector(css_selector);\n if (button) {\n button.click();\n }\n };\n }\n\n function GoToNextPage () {\n return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n }\n\n function GoToPreviousPage () {\n return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n }\n\n function scrollPageToSelected () {\n var sel = document.querySelector('.result[data-vim-selected]');\n if (sel === null) {\n return;\n }\n var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n wheight = document.documentElement.clientHeight,\n etop = sel.offsetTop,\n ebot = etop + sel.clientHeight,\n offset = 120;\n // first element ?\n if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n // set to the top of page if the first element\n // is fully included in the viewport\n window.scroll(window.scrollX, 0);\n return;\n }\n if (wtop > (etop - offset)) {\n window.scroll(window.scrollX, etop - offset);\n } else {\n var wbot = wtop + wheight;\n if (wbot < (ebot + offset)) {\n window.scroll(window.scrollX, ebot - wheight + offset);\n }\n }\n }\n\n function scrollPage (amount) {\n return function () {\n window.scrollBy(0, amount);\n highlightResult('visible')();\n };\n }\n\n function scrollPageTo (position, nav) {\n return function () {\n window.scrollTo(0, position);\n highlightResult(nav)();\n };\n }\n\n function searchInputFocus () {\n window.scrollTo(0, 0);\n var q = document.querySelector('#q');\n q.focus();\n if (q.setSelectionRange) {\n var len = q.value.length;\n q.setSelectionRange(len, len);\n }\n }\n\n function openResult (newTab) {\n return function () {\n var link = document.querySelector('.result[data-vim-selected] h3 a');\n if (link === null) {\n link = document.querySelector('.result[data-vim-selected] > a');\n }\n if (link !== null) {\n var url = link.getAttribute('href');\n if (newTab) {\n window.open(url);\n } else {\n window.location.href = url;\n }\n }\n };\n }\n\n function initHelpContent (divElement) {\n var categories = {};\n\n for (var k in keyBindings) {\n var key = keyBindings[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '×';\n html += '

    How to navigate SearXNG with hotkeys

    ';\n html += '';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '';\n }\n html += ''; // col-sm-*\n\n if (!first || lastCategory) {\n html += ''; // row\n }\n }\n\n html += '
    ';\n\n html += '

    ' + cat[0].cat + '

    ';\n html += '
      ';\n\n for (var cj in cat) {\n html += '
    • ' + cat[cj].key + ' ' + cat[cj].des + '
    • ';\n }\n\n html += '
    ';\n html += '
    ';\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp () {\n var helpPanel = document.querySelector('#vim-hotkeys-help');\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement('div');\n helpPanel.id = 'vim-hotkeys-help';\n helpPanel.className = 'dialog-modal';\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // toggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n function copyURLToClipboard () {\n var currentUrlElement = document.querySelector('.result[data-vim-selected] h3 a');\n if (currentUrlElement === null) return;\n\n const url = currentUrlElement.getAttribute('href');\n navigator.clipboard.writeText(url);\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data © OpenStreetMap contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data © OpenStreetMap contributors';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occur only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (' + searxng.settings.translations.Source + ': ' + description[1] + ')';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n\n const enableAllEngines = d.querySelectorAll(\".enable-all-engines\");\n const disableAllEngines = d.querySelectorAll(\".disable-all-engines\");\n const engineToggles = d.querySelectorAll('tbody input[type=checkbox][class~=checkbox-onoff]');\n const toggleEngines = (enable) => {\n for (const el of engineToggles) {\n // check if element visible, so that only engines of the current category are modified\n if (el.offsetParent !== null) el.checked = !enable;\n }\n };\n for (const el of enableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(true));\n }\n for (const el of disableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(false));\n }\n\n const copyHashButton = d.querySelector(\"#copy-hash\");\n searxng.on(copyHashButton, 'click', (e) => {\n e.preventDefault();\n navigator.clipboard.writeText(copyHashButton.dataset.hash);\n copyHashButton.innerText = copyHashButton.dataset.copiedText;\n });\n });\n})(window, document, window.searxng);\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty \n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n\nimport \"../../../node_modules/swiped-events/src/swiped-events.js\";\n\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n searxng.ready(function () {\n d.querySelectorAll('#urls img').forEach(\n img =>\n img.addEventListener(\n 'error', () => {\n // console.log(\"ERROR can't load: \" + img.src);\n img.src = window.searxng.settings.theme_static_path + \"/img/img_load_error.svg\";\n },\n {once: true}\n ));\n\n if (d.querySelector('#search_url button#copy_url')) {\n d.querySelector('#search_url button#copy_url').style.display = \"block\";\n }\n\n searxng.on('.btn-collapse', 'click', function () {\n var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n var target = this.getAttribute('data-target');\n var targetElement = d.querySelector(target);\n var html = this.innerHTML;\n if (this.classList.contains('collapsed')) {\n html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n } else {\n html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n }\n this.innerHTML = html;\n this.classList.toggle('collapsed');\n targetElement.classList.toggle('invisible');\n });\n\n searxng.on('.media-loader', 'click', function () {\n var target = this.getAttribute('data-target');\n var iframe_load = d.querySelector(target + ' > iframe');\n var srctest = iframe_load.getAttribute('src');\n if (srctest === null || srctest === undefined || srctest === false) {\n iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n }\n });\n\n searxng.on('#copy_url', 'click', function () {\n var target = this.parentElement.querySelector('pre');\n navigator.clipboard.writeText(target.innerText);\n this.innerText = this.dataset.copiedText;\n });\n\n // searxng.selectImage (gallery)\n // -----------------------------\n\n // setTimeout() ID, needed to cancel *last* loadImage\n let imgTimeoutID;\n\n // progress spinner, while an image is loading\n const imgLoaderSpinner = d.createElement('div');\n imgLoaderSpinner.classList.add('loader');\n\n // singleton image object, which is used for all loading processes of a\n // detailed image\n const imgLoader = new Image();\n\n const loadImage = (imgSrc, onSuccess) => {\n // if defered image load exists, stop defered task.\n if (imgTimeoutID) clearTimeout(imgTimeoutID);\n\n // defer load of the detail image for 1 sec\n imgTimeoutID = setTimeout(() => {\n imgLoader.src = imgSrc;\n }, 1000);\n\n // set handlers in the on-properties\n imgLoader.onload = () => {\n onSuccess();\n imgLoaderSpinner.remove();\n };\n imgLoader.onerror = () => {\n imgLoaderSpinner.remove();\n };\n };\n\n searxng.selectImage = (resultElement) => {\n\n // add a class that can be evaluated in the CSS and indicates that the\n // detail view is open\n d.getElementById('results').classList.add('image-detail-open');\n\n // add a hash to the browser history so that pressing back doesn't return\n // to the previous page this allows us to dismiss the image details on\n // pressing the back button on mobile devices\n window.location.hash = '#image-viewer';\n\n searxng.scrollPageToSelected();\n\n // if there is none element given by the caller, stop here\n if (!resultElement) return;\n\n // find object in the element, if there is none, stop here.\n const img = resultElement.querySelector('.result-images-source img');\n if (!img) return;\n\n // \n const src = img.getAttribute('data-src');\n\n // already loaded high-res image or no high-res image available\n if (!src) return;\n\n // use the image thumbnail until the image is fully loaded\n const thumbnail = resultElement.querySelector('.image_thumbnail');\n img.src = thumbnail.src;\n\n // show a progress spinner\n const detailElement = resultElement.querySelector('.detail');\n detailElement.appendChild(imgLoaderSpinner);\n\n // load full size image in background\n loadImage(src, () => {\n // after the singelton loadImage has loaded the detail image into the\n // cache, it can be used in the origin as src property.\n img.src = src;\n img.removeAttribute('data-src');\n });\n };\n\n searxng.closeDetail = function () {\n d.getElementById('results').classList.remove('image-detail-open');\n // remove #image-viewer hash from url by navigating back\n if (window.location.hash == '#image-viewer') window.history.back();\n searxng.scrollPageToSelected();\n };\n searxng.on('.result-detail-close', 'click', e => {\n e.preventDefault();\n searxng.closeDetail();\n });\n searxng.on('.result-detail-previous', 'click', e => {\n e.preventDefault();\n searxng.selectPrevious(false);\n });\n searxng.on('.result-detail-next', 'click', e => {\n e.preventDefault();\n searxng.selectNext(false);\n });\n\n // listen for the back button to be pressed and dismiss the image details when called\n window.addEventListener('hashchange', () => {\n if (window.location.hash != '#image-viewer') searxng.closeDetail();\n });\n\n d.querySelectorAll('.swipe-horizontal').forEach(\n obj => {\n obj.addEventListener('swiped-left', function () {\n searxng.selectNext(false);\n });\n obj.addEventListener('swiped-right', function () {\n searxng.selectPrevious(false);\n });\n }\n );\n\n w.addEventListener('scroll', function () {\n var e = d.getElementById('backToTop'),\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n results = d.getElementById('results');\n if (e !== null) {\n if (scrollTop >= 100) {\n results.classList.add('scrolling');\n } else {\n results.classList.remove('scrolling');\n }\n }\n }, true);\n\n });\n\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* exported AutoComplete */\n\n(function (w, d, searxng) {\n 'use strict';\n\n var qinput_id = \"q\", qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function (ev) {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener('input', updateClearButton, false);\n }\n\n const fetchResults = async (query) => {\n let request;\n if (searxng.settings.method === 'GET') {\n const reqParams = new URLSearchParams();\n reqParams.append(\"q\", query);\n request = fetch(\"./autocompleter?\" + reqParams.toString());\n } else {\n const formData = new FormData();\n formData.append(\"q\", query);\n request = fetch(\"./autocompleter\", {\n method: 'POST',\n body: formData,\n });\n }\n\n request.then(async function (response) {\n const results = await response.json();\n\n if (!results) return;\n\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n autocomplete.classList.add(\"open\");\n autocompleteList.innerHTML = \"\";\n\n // show an error message that no result was found\n if (!results[1] || results[1].length == 0) {\n const noItemFoundMessage = document.createElement(\"li\");\n noItemFoundMessage.classList.add('no-item-found');\n noItemFoundMessage.innerHTML = searxng.settings.translations.no_item_found;\n autocompleteList.appendChild(noItemFoundMessage);\n return;\n }\n\n for (let result of results[1]) {\n const li = document.createElement(\"li\");\n li.innerText = result;\n\n searxng.on(li, 'mousedown', () => {\n qinput.value = result;\n const form = d.querySelector(\"#search\");\n form.submit();\n autocomplete.classList.remove('open');\n });\n autocompleteList.appendChild(li);\n }\n });\n };\n\n searxng.ready(function () {\n // focus search input on large screens\n if (!isMobile) document.getElementById(\"q\").focus();\n\n qinput = d.getElementById(qinput_id);\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.settings.autocomplete) {\n searxng.on(qinput, 'input', () => {\n const query = qinput.value;\n if (query.length < searxng.settings.autocomplete_min) return;\n\n setTimeout(() => {\n if (query == qinput.value) fetchResults(query);\n }, 300);\n });\n\n searxng.on(qinput, 'keyup', (e) => {\n let currentIndex = -1;\n const listItems = autocompleteList.children;\n for (let i = 0; i < listItems.length; i++) {\n if (listItems[i].classList.contains('active')) {\n currentIndex = i;\n break;\n }\n }\n\n let newCurrentIndex = -1;\n if (e.key === \"ArrowUp\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove('active');\n // we need to add listItems.length to the index calculation here because the JavaScript modulos\n // operator doesn't work with negative numbers\n newCurrentIndex = (currentIndex - 1 + listItems.length) % listItems.length;\n } else if (e.key === \"ArrowDown\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove('active');\n newCurrentIndex = (currentIndex + 1) % listItems.length;\n } else if (e.key === \"Tab\" || e.key === \"Enter\") {\n autocomplete.classList.remove('open');\n }\n\n if (newCurrentIndex != -1) {\n const selectedItem = listItems[newCurrentIndex];\n selectedItem.classList.add('active');\n\n if (!selectedItem.classList.contains('no-item-found')) qinput.value = selectedItem.innerText;\n }\n });\n }\n }\n\n // Additionally to searching when selecting a new category, we also\n // automatically start a new search request when the user changes a search\n // filter (safesearch, time range or language) (this requires JavaScript\n // though)\n if (\n qinput !== null\n && searxng.settings.search_on_category_select\n // If .search_filters is undefined (invisible) we are on the homepage and\n // hence don't have to set any listeners\n && d.querySelector(\".search_filters\") != null\n ) {\n searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n }\n\n const categoryButtons = d.querySelectorAll(\"button.category_button\");\n for (let button of categoryButtons) {\n searxng.on(button, 'click', (event) => {\n if (event.shiftKey) {\n event.preventDefault();\n button.classList.toggle(\"selected\");\n return;\n }\n\n // manually deselect the old selection when a new category is selected\n const selectedCategories = d.querySelectorAll(\"button.category_button.selected\");\n for (let categoryButton of selectedCategories) {\n categoryButton.classList.remove(\"selected\");\n }\n button.classList.add(\"selected\");\n });\n }\n\n // override form submit action to update the actually selected categories\n const form = d.querySelector(\"#search\");\n if (form != null) {\n searxng.on(form, 'submit', (event) => {\n event.preventDefault();\n const categoryValuesInput = d.querySelector(\"#selected-categories\");\n if (categoryValuesInput) {\n let categoryValues = [];\n for (let categoryButton of categoryButtons) {\n if (categoryButton.classList.contains(\"selected\")) {\n categoryValues.push(categoryButton.name.replace(\"category_\", \"\"));\n }\n }\n categoryValuesInput.value = categoryValues.join(\",\");\n }\n form.submit();\n });\n }\n });\n\n})(window, document, window.searxng);\n"],"names":["w","d","ElementPrototype","selector","node","nodes","i","callbackSafe","callback","el","e","exception","searxng","obj","eventType","useCapture","found","method","url","data","resolve","reject","req","ex","src","path","id","s","newNode","referenceNode","getEndpoint","className","onlyImages","newLoadSpinner","loader","replaceChildrenWith","element","children","child","loadNextPage","form","formData","response","nextPageDoc","articleList","paginationElement","articleElement","err","intersectionObserveOptions","observedSelector","observer","entries","paginationEntry","isElementInDetail","getResultElement","isImageResult","resultElement","highlightResult","baseKeyBinding","removeFocus","copyURLToClipboard","toggleHelp","searchInputFocus","GoToNextPage","openResult","GoToPreviousPage","reloadPage","keyBindingLayouts","scrollPage","scrollPageTo","keyBindings","tagName","which","noScroll","keepFocus","current","effectiveWhich","next","results","top","bot","etop","ebot","link","scrollPageToSelected","pageButtonClick","css_selector","button","sel","wtop","wheight","offset","wbot","amount","position","nav","q","len","newTab","initHelpContent","divElement","categories","k","key","sorted","a","b","html","cat","lastCategory","first","cj","helpPanel","body","currentUrlElement","event","leaflet_target","map_lon","map_lat","map_zoom","map_boundingbox","map_geojson","map_bounds","southWest","northEast","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","baseLayers","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","enableAllEngines","disableAllEngines","engineToggles","toggleEngines","enable","copyHashButton","window","document","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","changedTouches","eventData","xUp","yUp","attributeName","defaultValue","attributeValue","img","btnLabelCollapsed","btnLabelNotCollapsed","target","targetElement","iframe_load","srctest","imgTimeoutID","imgLoaderSpinner","imgLoader","loadImage","imgSrc","onSuccess","thumbnail","scrollTop","qinput_id","qinput","isMobile","submitIfQuery","search","createClearButton","cs","updateClearButton","ev","fetchResults","query","request","reqParams","autocomplete","autocompleteList","noItemFoundMessage","result","li","currentIndex","listItems","newCurrentIndex","selectedItem","categoryButtons","selectedCategories","categoryButton","categoryValuesInput","categoryValues"],"mappings":"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","x_google_ignoreList":[5]} \ No newline at end of file +{"version":3,"file":"searxng.min.js","sources":["../../../../../client/simple/src/js/main/00_toolkit.js","../../../../../client/simple/src/js/main/infinite_scroll.js","../../../../../client/simple/src/js/main/keyboard.js","../../../../../client/simple/src/js/main/mapresult.js","../../../../../client/simple/src/js/main/preferences.js","../../../../../client/simple/node_modules/swiped-events/src/swiped-events.js","../../../../../client/simple/src/js/main/results.js","../../../../../client/simple/src/js/main/search.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n 'use strict';\n\n // not invented here toolkit with bugs fixed elsewhere\n // purposes : be just good enough and as small as possible\n\n // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n if (w.Element) {\n (function (ElementPrototype) {\n ElementPrototype.matches = ElementPrototype.matches ||\n ElementPrototype.matchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n function (selector) {\n var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n while (nodes[++i] && nodes[i] != node);\n return !!nodes[i];\n };\n })(Element.prototype);\n }\n\n function callbackSafe (callback, el, e) {\n try {\n callback.call(el, e);\n } catch (exception) {\n console.log(exception);\n }\n }\n\n var searxng = window.searxng || {};\n\n searxng.on = function (obj, eventType, callback, useCapture) {\n useCapture = useCapture || false;\n if (typeof obj !== 'string') {\n // obj HTMLElement, HTMLDocument\n obj.addEventListener(eventType, callback, useCapture);\n } else {\n // obj is a selector\n d.addEventListener(eventType, function (e) {\n var el = e.target || e.srcElement, found = false;\n while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n if (found) callbackSafe(callback, el, e);\n }, useCapture);\n }\n };\n\n searxng.ready = function (callback) {\n if (document.readyState != 'loading') {\n callback.call(w);\n } else {\n w.addEventListener('DOMContentLoaded', callback.bind(w));\n }\n };\n\n searxng.http = function (method, url, data = null) {\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n req.open(method, url, true);\n req.timeout = 20000;\n\n // On load\n req.onload = function () {\n if (req.status == 200) {\n resolve(req.response, req.responseType);\n } else {\n reject(Error(req.statusText));\n }\n };\n\n // Handle network errors\n req.onerror = function () {\n reject(Error(\"Network Error\"));\n };\n\n req.onabort = function () {\n reject(Error(\"Transaction is aborted\"));\n };\n\n req.ontimeout = function () {\n reject(Error(\"Timeout\"));\n }\n\n // Make the request\n if (data) {\n req.send(data)\n } else {\n req.send();\n }\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n searxng.loadStyle = function (src) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"style_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('link');\n s.setAttribute('id', id);\n s.setAttribute('rel', 'stylesheet');\n s.setAttribute('type', 'text/css');\n s.setAttribute('href', path);\n d.body.appendChild(s);\n }\n };\n\n searxng.loadScript = function (src, callback) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"script_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('script');\n s.setAttribute('id', id);\n s.setAttribute('src', path);\n s.onload = callback;\n s.onerror = function () {\n s.setAttribute('error', '1');\n };\n d.body.appendChild(s);\n } else if (!s.hasAttribute('error')) {\n try {\n callback.apply(s, []);\n } catch (exception) {\n console.log(exception);\n }\n } else {\n console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n }\n };\n\n searxng.insertBefore = function (newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n };\n\n searxng.insertAfter = function (newNode, referenceNode) {\n referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n };\n\n searxng.on('.close', 'click', function () {\n this.parentNode.classList.add('invisible');\n });\n\n function getEndpoint () {\n for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n if (className.endsWith('_endpoint')) {\n return className.split('_')[0];\n }\n }\n return '';\n }\n\n searxng.endpoint = getEndpoint();\n\n return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n 'use strict';\n\n searxng.infinite_scroll_supported = (\n 'IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n if (!searxng.infinite_scroll_supported) {\n console.log('IntersectionObserver not supported');\n return;\n }\n\n let d = document;\n var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n function newLoadSpinner () {\n var loader = d.createElement('div');\n loader.classList.add('loader');\n return loader;\n }\n\n function replaceChildrenWith (element, children) {\n element.textContent = '';\n children.forEach(child => element.appendChild(child));\n }\n\n function loadNextPage (callback) {\n var form = d.querySelector('#pagination form.next_page');\n if (!form) {\n return\n }\n replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n var formData = new FormData(form);\n searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n function (response) {\n var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n var articleList = nextPageDoc.querySelectorAll('#urls article');\n var paginationElement = nextPageDoc.querySelector('#pagination');\n d.querySelector('#pagination').remove();\n if (articleList.length > 0 && !onlyImages) {\n // do not add
    element when there are only images\n d.querySelector('#urls').appendChild(d.createElement('hr'));\n }\n articleList.forEach(articleElement => {\n d.querySelector('#urls').appendChild(articleElement);\n });\n if (paginationElement) {\n d.querySelector('#results').appendChild(paginationElement);\n callback();\n }\n }\n ).catch(\n function (err) {\n console.log(err);\n var e = d.createElement('div');\n e.textContent = searxng.settings.translations.error_loading_next_page;\n e.classList.add('dialog-error');\n e.setAttribute('role', 'alert');\n replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n }\n )\n }\n\n if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) {\n const intersectionObserveOptions = {\n rootMargin: \"20rem\",\n };\n const observedSelector = 'article.result:last-child';\n const observer = new IntersectionObserver(entries => {\n const paginationEntry = entries[0];\n if (paginationEntry.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n }\n });\n observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n function isElementInDetail (el) {\n while (el !== undefined) {\n if (el.classList.contains('detail')) {\n return true;\n }\n if (el.classList.contains('result')) {\n // we found a result, no need to go to the root of the document:\n // el is not inside a
    element\n return false;\n }\n el = el.parentNode;\n }\n return false;\n }\n\n function getResultElement (el) {\n while (el !== undefined) {\n if (el.classList.contains('result')) {\n return el;\n }\n el = el.parentNode;\n }\n return undefined;\n }\n\n function isImageResult (resultElement) {\n return resultElement && resultElement.classList.contains('result-images');\n }\n\n searxng.on('.result', 'click', function (e) {\n if (!isElementInDetail(e.target)) {\n highlightResult(this)(true, true);\n let resultElement = getResultElement(e.target);\n if (isImageResult(resultElement)) {\n e.preventDefault();\n searxng.selectImage(resultElement);\n }\n }\n });\n\n searxng.on('.result a', 'focus', function (e) {\n if (!isElementInDetail(e.target)) {\n let resultElement = getResultElement(e.target);\n if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n highlightResult(resultElement)(true);\n }\n if (isImageResult(resultElement)) {\n searxng.selectImage(resultElement);\n }\n }\n }, true);\n\n /* common base for layouts */\n var baseKeyBinding = {\n 'Escape': {\n key: 'ESC',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 'c': {\n key: 'c',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n 'h': {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n },\n 'i': {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 'n': {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 'o': {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 'p': {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 'r': {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 't': {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n };\n var keyBindingLayouts = {\n\n \"default\": Object.assign(\n { /* SearXNG layout */\n 'ArrowLeft': {\n key: '←',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'ArrowRight': {\n key: '→',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n }, baseKeyBinding),\n\n 'vim': Object.assign(\n { /* Vim-like Key Layout. */\n 'b': {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 'f': {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 'u': {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 'd': {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 'g': {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 'v': {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 'k': {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'j': {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n 'y': {\n key: 'y',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n }, baseKeyBinding)\n }\n\n var keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default;\n\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (\n Object.prototype.hasOwnProperty.call(keyBindings, e.key)\n && !e.ctrlKey && !e.altKey\n && !e.shiftKey && !e.metaKey\n ) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.key === 'Escape') {\n keyBindings[e.key].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n keyBindings[e.key].fun();\n }\n }\n }\n });\n\n function highlightResult (which) {\n return function (noScroll, keepFocus) {\n var current = document.querySelector('.result[data-vim-selected]'),\n effectiveWhich = which;\n if (current === null) {\n // no selection : choose the first one\n current = document.querySelector('.result');\n if (current === null) {\n // no first one : there are no results\n return;\n }\n // replace up/down actions by selecting first one\n if (which === \"down\" || which === \"up\") {\n effectiveWhich = current;\n }\n }\n\n var next, results = document.querySelectorAll('.result');\n results = Array.from(results); // convert NodeList to Array for further use\n\n if (typeof effectiveWhich !== 'string') {\n next = effectiveWhich;\n } else {\n switch (effectiveWhich) {\n case 'visible':\n var top = document.documentElement.scrollTop || document.body.scrollTop;\n var bot = top + document.documentElement.clientHeight;\n\n for (var i = 0; i < results.length; i++) {\n next = results[i];\n var etop = next.offsetTop;\n var ebot = etop + next.clientHeight;\n\n if ((ebot <= bot) && (etop > top)) {\n break;\n }\n }\n break;\n case 'down':\n next = results[results.indexOf(current) + 1] || current;\n break;\n case 'up':\n next = results[results.indexOf(current) - 1] || current;\n break;\n case 'bottom':\n next = results[results.length - 1];\n break;\n case 'top':\n /* falls through */\n default:\n next = results[0];\n }\n }\n\n if (next) {\n current.removeAttribute('data-vim-selected');\n next.setAttribute('data-vim-selected', 'true');\n if (!keepFocus) {\n var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\n }\n }\n if (!noScroll) {\n scrollPageToSelected();\n }\n }\n };\n }\n\n function reloadPage () {\n document.location.reload(true);\n }\n\n function removeFocus (e) {\n const tagName = e.target.tagName.toLowerCase();\n if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n document.activeElement.blur();\n } else {\n searxng.closeDetail();\n }\n }\n\n function pageButtonClick (css_selector) {\n return function () {\n var button = document.querySelector(css_selector);\n if (button) {\n button.click();\n }\n };\n }\n\n function GoToNextPage () {\n return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n }\n\n function GoToPreviousPage () {\n return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n }\n\n function scrollPageToSelected () {\n var sel = document.querySelector('.result[data-vim-selected]');\n if (sel === null) {\n return;\n }\n var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n wheight = document.documentElement.clientHeight,\n etop = sel.offsetTop,\n ebot = etop + sel.clientHeight,\n offset = 120;\n // first element ?\n if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n // set to the top of page if the first element\n // is fully included in the viewport\n window.scroll(window.scrollX, 0);\n return;\n }\n if (wtop > (etop - offset)) {\n window.scroll(window.scrollX, etop - offset);\n } else {\n var wbot = wtop + wheight;\n if (wbot < (ebot + offset)) {\n window.scroll(window.scrollX, ebot - wheight + offset);\n }\n }\n }\n\n function scrollPage (amount) {\n return function () {\n window.scrollBy(0, amount);\n highlightResult('visible')();\n };\n }\n\n function scrollPageTo (position, nav) {\n return function () {\n window.scrollTo(0, position);\n highlightResult(nav)();\n };\n }\n\n function searchInputFocus () {\n window.scrollTo(0, 0);\n var q = document.querySelector('#q');\n q.focus();\n if (q.setSelectionRange) {\n var len = q.value.length;\n q.setSelectionRange(len, len);\n }\n }\n\n function openResult (newTab) {\n return function () {\n var link = document.querySelector('.result[data-vim-selected] h3 a');\n if (link === null) {\n link = document.querySelector('.result[data-vim-selected] > a');\n }\n if (link !== null) {\n var url = link.getAttribute('href');\n if (newTab) {\n window.open(url);\n } else {\n window.location.href = url;\n }\n }\n };\n }\n\n function initHelpContent (divElement) {\n var categories = {};\n\n for (var k in keyBindings) {\n var key = keyBindings[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '×';\n html += '

    How to navigate SearXNG with hotkeys

    ';\n html += '';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '';\n }\n html += ''; // col-sm-*\n\n if (!first || lastCategory) {\n html += ''; // row\n }\n }\n\n html += '
    ';\n\n html += '

    ' + cat[0].cat + '

    ';\n html += '
      ';\n\n for (var cj in cat) {\n html += '
    • ' + cat[cj].key + ' ' + cat[cj].des + '
    • ';\n }\n\n html += '
    ';\n html += '
    ';\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp () {\n var helpPanel = document.querySelector('#vim-hotkeys-help');\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement('div');\n helpPanel.id = 'vim-hotkeys-help';\n helpPanel.className = 'dialog-modal';\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // toggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n function copyURLToClipboard () {\n var currentUrlElement = document.querySelector('.result[data-vim-selected] h3 a');\n if (currentUrlElement === null) return;\n\n const url = currentUrlElement.getAttribute('href');\n navigator.clipboard.writeText(url);\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data © OpenStreetMap contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data © OpenStreetMap contributors';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occur only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (' + searxng.settings.translations.Source + ': ' + description[1] + ')';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n\n const enableAllEngines = d.querySelectorAll(\".enable-all-engines\");\n const disableAllEngines = d.querySelectorAll(\".disable-all-engines\");\n const engineToggles = d.querySelectorAll('tbody input[type=checkbox][class~=checkbox-onoff]');\n const toggleEngines = (enable) => {\n for (const el of engineToggles) {\n // check if element visible, so that only engines of the current category are modified\n if (el.offsetParent !== null) el.checked = !enable;\n }\n };\n for (const el of enableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(true));\n }\n for (const el of disableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(false));\n }\n\n const copyHashButton = d.querySelector(\"#copy-hash\");\n searxng.on(copyHashButton, 'click', (e) => {\n e.preventDefault();\n navigator.clipboard.writeText(copyHashButton.dataset.hash);\n copyHashButton.innerText = copyHashButton.dataset.copiedText;\n });\n });\n})(window, document, window.searxng);\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty \n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n\nimport \"../../../node_modules/swiped-events/src/swiped-events.js\";\n\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n searxng.ready(function () {\n d.querySelectorAll('#urls img').forEach(\n img =>\n img.addEventListener(\n 'error', () => {\n // console.log(\"ERROR can't load: \" + img.src);\n img.src = window.searxng.settings.theme_static_path + \"/img/img_load_error.svg\";\n },\n {once: true}\n ));\n\n if (d.querySelector('#search_url button#copy_url')) {\n d.querySelector('#search_url button#copy_url').style.display = \"block\";\n }\n\n searxng.on('.btn-collapse', 'click', function () {\n var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n var target = this.getAttribute('data-target');\n var targetElement = d.querySelector(target);\n var html = this.innerHTML;\n if (this.classList.contains('collapsed')) {\n html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n } else {\n html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n }\n this.innerHTML = html;\n this.classList.toggle('collapsed');\n targetElement.classList.toggle('invisible');\n });\n\n searxng.on('.media-loader', 'click', function () {\n var target = this.getAttribute('data-target');\n var iframe_load = d.querySelector(target + ' > iframe');\n var srctest = iframe_load.getAttribute('src');\n if (srctest === null || srctest === undefined || srctest === false) {\n iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n }\n });\n\n searxng.on('#copy_url', 'click', function () {\n var target = this.parentElement.querySelector('pre');\n navigator.clipboard.writeText(target.innerText);\n this.innerText = this.dataset.copiedText;\n });\n\n // searxng.selectImage (gallery)\n // -----------------------------\n\n // setTimeout() ID, needed to cancel *last* loadImage\n let imgTimeoutID;\n\n // progress spinner, while an image is loading\n const imgLoaderSpinner = d.createElement('div');\n imgLoaderSpinner.classList.add('loader');\n\n // singleton image object, which is used for all loading processes of a\n // detailed image\n const imgLoader = new Image();\n\n const loadImage = (imgSrc, onSuccess) => {\n // if defered image load exists, stop defered task.\n if (imgTimeoutID) clearTimeout(imgTimeoutID);\n\n // defer load of the detail image for 1 sec\n imgTimeoutID = setTimeout(() => {\n imgLoader.src = imgSrc;\n }, 1000);\n\n // set handlers in the on-properties\n imgLoader.onload = () => {\n onSuccess();\n imgLoaderSpinner.remove();\n };\n imgLoader.onerror = () => {\n imgLoaderSpinner.remove();\n };\n };\n\n searxng.selectImage = (resultElement) => {\n\n // add a class that can be evaluated in the CSS and indicates that the\n // detail view is open\n d.getElementById('results').classList.add('image-detail-open');\n\n // add a hash to the browser history so that pressing back doesn't return\n // to the previous page this allows us to dismiss the image details on\n // pressing the back button on mobile devices\n window.location.hash = '#image-viewer';\n\n searxng.scrollPageToSelected();\n\n // if there is none element given by the caller, stop here\n if (!resultElement) return;\n\n // find object in the element, if there is none, stop here.\n const img = resultElement.querySelector('.result-images-source img');\n if (!img) return;\n\n // \n const src = img.getAttribute('data-src');\n\n // already loaded high-res image or no high-res image available\n if (!src) return;\n\n // use the image thumbnail until the image is fully loaded\n const thumbnail = resultElement.querySelector('.image_thumbnail');\n img.src = thumbnail.src;\n\n // show a progress spinner\n const detailElement = resultElement.querySelector('.detail');\n detailElement.appendChild(imgLoaderSpinner);\n\n // load full size image in background\n loadImage(src, () => {\n // after the singelton loadImage has loaded the detail image into the\n // cache, it can be used in the origin as src property.\n img.src = src;\n img.removeAttribute('data-src');\n });\n };\n\n searxng.closeDetail = function () {\n d.getElementById('results').classList.remove('image-detail-open');\n // remove #image-viewer hash from url by navigating back\n if (window.location.hash == '#image-viewer') window.history.back();\n searxng.scrollPageToSelected();\n };\n searxng.on('.result-detail-close', 'click', e => {\n e.preventDefault();\n searxng.closeDetail();\n });\n searxng.on('.result-detail-previous', 'click', e => {\n e.preventDefault();\n searxng.selectPrevious(false);\n });\n searxng.on('.result-detail-next', 'click', e => {\n e.preventDefault();\n searxng.selectNext(false);\n });\n\n // listen for the back button to be pressed and dismiss the image details when called\n window.addEventListener('hashchange', () => {\n if (window.location.hash != '#image-viewer') searxng.closeDetail();\n });\n\n d.querySelectorAll('.swipe-horizontal').forEach(\n obj => {\n obj.addEventListener('swiped-left', function () {\n searxng.selectNext(false);\n });\n obj.addEventListener('swiped-right', function () {\n searxng.selectPrevious(false);\n });\n }\n );\n\n w.addEventListener('scroll', function () {\n var e = d.getElementById('backToTop'),\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n results = d.getElementById('results');\n if (e !== null) {\n if (scrollTop >= 100) {\n results.classList.add('scrolling');\n } else {\n results.classList.remove('scrolling');\n }\n }\n }, true);\n\n });\n\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* exported AutoComplete */\n\n(function (w, d, searxng) {\n 'use strict';\n\n var qinput_id = \"q\", qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n const isResultsPage = document.querySelector(\"main\").id == \"main_results\";\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function (ev) {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener('input', updateClearButton, false);\n }\n\n const fetchResults = async (query) => {\n let request;\n if (searxng.settings.method === 'GET') {\n const reqParams = new URLSearchParams();\n reqParams.append(\"q\", query);\n request = fetch(\"./autocompleter?\" + reqParams.toString());\n } else {\n const formData = new FormData();\n formData.append(\"q\", query);\n request = fetch(\"./autocompleter\", {\n method: 'POST',\n body: formData,\n });\n }\n\n request.then(async function (response) {\n const results = await response.json();\n\n if (!results) return;\n\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n autocomplete.classList.add(\"open\");\n autocompleteList.innerHTML = \"\";\n\n // show an error message that no result was found\n if (!results[1] || results[1].length == 0) {\n const noItemFoundMessage = document.createElement(\"li\");\n noItemFoundMessage.classList.add('no-item-found');\n noItemFoundMessage.innerHTML = searxng.settings.translations.no_item_found;\n autocompleteList.appendChild(noItemFoundMessage);\n return;\n }\n\n for (let result of results[1]) {\n const li = document.createElement(\"li\");\n li.innerText = result;\n\n searxng.on(li, 'mousedown', () => {\n qinput.value = result;\n const form = d.querySelector(\"#search\");\n form.submit();\n autocomplete.classList.remove('open');\n });\n autocompleteList.appendChild(li);\n }\n });\n };\n\n searxng.ready(function () {\n // focus search input on large screens\n if (!isMobile && !isResultsPage) document.getElementById(\"q\").focus();\n\n qinput = d.getElementById(qinput_id);\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.settings.autocomplete) {\n searxng.on(qinput, 'input', () => {\n const query = qinput.value;\n if (query.length < searxng.settings.autocomplete_min) return;\n\n setTimeout(() => {\n if (query == qinput.value) fetchResults(query);\n }, 300);\n });\n\n searxng.on(qinput, 'keyup', (e) => {\n let currentIndex = -1;\n const listItems = autocompleteList.children;\n for (let i = 0; i < listItems.length; i++) {\n if (listItems[i].classList.contains('active')) {\n currentIndex = i;\n break;\n }\n }\n\n let newCurrentIndex = -1;\n if (e.key === \"ArrowUp\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove('active');\n // we need to add listItems.length to the index calculation here because the JavaScript modulos\n // operator doesn't work with negative numbers\n newCurrentIndex = (currentIndex - 1 + listItems.length) % listItems.length;\n } else if (e.key === \"ArrowDown\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove('active');\n newCurrentIndex = (currentIndex + 1) % listItems.length;\n } else if (e.key === \"Tab\" || e.key === \"Enter\") {\n autocomplete.classList.remove('open');\n }\n\n if (newCurrentIndex != -1) {\n const selectedItem = listItems[newCurrentIndex];\n selectedItem.classList.add('active');\n\n if (!selectedItem.classList.contains('no-item-found')) qinput.value = selectedItem.innerText;\n }\n });\n }\n }\n\n // Additionally to searching when selecting a new category, we also\n // automatically start a new search request when the user changes a search\n // filter (safesearch, time range or language) (this requires JavaScript\n // though)\n if (\n qinput !== null\n && searxng.settings.search_on_category_select\n // If .search_filters is undefined (invisible) we are on the homepage and\n // hence don't have to set any listeners\n && d.querySelector(\".search_filters\") != null\n ) {\n searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n }\n\n const categoryButtons = d.querySelectorAll(\"button.category_button\");\n for (let button of categoryButtons) {\n searxng.on(button, 'click', (event) => {\n if (event.shiftKey) {\n event.preventDefault();\n button.classList.toggle(\"selected\");\n return;\n }\n\n // manually deselect the old selection when a new category is selected\n const selectedCategories = d.querySelectorAll(\"button.category_button.selected\");\n for (let categoryButton of selectedCategories) {\n categoryButton.classList.remove(\"selected\");\n }\n button.classList.add(\"selected\");\n });\n }\n\n // override form submit action to update the actually selected categories\n const form = d.querySelector(\"#search\");\n if (form != null) {\n searxng.on(form, 'submit', (event) => {\n event.preventDefault();\n const categoryValuesInput = d.querySelector(\"#selected-categories\");\n if (categoryValuesInput) {\n let categoryValues = [];\n for (let categoryButton of categoryButtons) {\n if (categoryButton.classList.contains(\"selected\")) {\n categoryValues.push(categoryButton.name.replace(\"category_\", \"\"));\n }\n }\n categoryValuesInput.value = categoryValues.join(\",\");\n }\n form.submit();\n });\n }\n });\n\n})(window, document, window.searxng);\n"],"names":["w","d","ElementPrototype","selector","node","nodes","i","callbackSafe","callback","el","e","exception","searxng","obj","eventType","useCapture","found","method","url","data","resolve","reject","req","ex","src","path","id","s","newNode","referenceNode","getEndpoint","className","onlyImages","newLoadSpinner","loader","replaceChildrenWith","element","children","child","loadNextPage","form","formData","response","nextPageDoc","articleList","paginationElement","articleElement","err","intersectionObserveOptions","observedSelector","observer","entries","paginationEntry","isElementInDetail","getResultElement","isImageResult","resultElement","highlightResult","baseKeyBinding","removeFocus","copyURLToClipboard","toggleHelp","searchInputFocus","GoToNextPage","openResult","GoToPreviousPage","reloadPage","keyBindingLayouts","scrollPage","scrollPageTo","keyBindings","tagName","which","noScroll","keepFocus","current","effectiveWhich","next","results","top","bot","etop","ebot","link","scrollPageToSelected","pageButtonClick","css_selector","button","sel","wtop","wheight","offset","wbot","amount","position","nav","q","len","newTab","initHelpContent","divElement","categories","k","key","sorted","a","b","html","cat","lastCategory","first","cj","helpPanel","body","currentUrlElement","event","leaflet_target","map_lon","map_lat","map_zoom","map_boundingbox","map_geojson","map_bounds","southWest","northEast","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","baseLayers","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","enableAllEngines","disableAllEngines","engineToggles","toggleEngines","enable","copyHashButton","window","document","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","changedTouches","eventData","xUp","yUp","attributeName","defaultValue","attributeValue","img","btnLabelCollapsed","btnLabelNotCollapsed","target","targetElement","iframe_load","srctest","imgTimeoutID","imgLoaderSpinner","imgLoader","loadImage","imgSrc","onSuccess","thumbnail","scrollTop","qinput_id","qinput","isMobile","isResultsPage","submitIfQuery","search","createClearButton","cs","updateClearButton","ev","fetchResults","query","request","reqParams","autocomplete","autocompleteList","noItemFoundMessage","result","li","currentIndex","listItems","newCurrentIndex","selectedItem","categoryButtons","selectedCategories","categoryButton","categoryValuesInput","categoryValues"],"mappings":"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","x_google_ignoreList":[5]} \ No newline at end of file From 20b40351b9e36dffc06b44dfaf3c4846b569d63e Mon Sep 17 00:00:00 2001 From: Bnyro Date: Mon, 26 May 2025 12:34:04 +0200 Subject: [PATCH 61/74] [chore] il post: disable by default --- searx/settings.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/searx/settings.yml b/searx/settings.yml index 64affcadc..1fdf221b0 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -1116,6 +1116,7 @@ engines: - name: il post engine: il_post shortcut: pst + disabled: true - name: huggingface engine: huggingface From 2288f07d621d67d6b39f0d0073cdcc951ec22726 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 28 May 2025 11:36:37 +0200 Subject: [PATCH 62/74] [fix] presearch: reuse response cookies from token extraction Why? - presearch requires the response cookies of the first request to be sent within the second request - otherwise we miss auth information and the engine doesn't work Related: - https://github.com/searxng/searxng/pull/4858 - closes https://github.com/searxng/searxng/issues/4854 Co-authored-by: Aadniz <8147434+Aadniz@users.noreply.github.com> --- searx/engines/presearch.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/searx/engines/presearch.py b/searx/engines/presearch.py index 1093b5cff..36b754f87 100644 --- a/searx/engines/presearch.py +++ b/searx/engines/presearch.py @@ -137,19 +137,20 @@ def _get_request_id(query, params): if l.territory: headers['Accept-Language'] = f"{l.language}-{l.territory},{l.language};" "q=0.9,*;" "q=0.5" - resp_text = get(url, headers=headers).text # type: ignore + resp = get(url, headers=headers) - for line in resp_text.split("\n"): + for line in resp.text.split("\n"): if "window.searchId = " in line: - return line.split("= ")[1][:-1].replace('"', "") + return line.split("= ")[1][:-1].replace('"', ""), resp.cookies - return None + raise RuntimeError("Couldn't find any request id for presearch") def request(query, params): - request_id = _get_request_id(query, params) + request_id, cookies = _get_request_id(query, params) params["headers"]["Accept"] = "application/json" params["url"] = f"{base_url}/results?id={request_id}" + params["cookies"] = cookies return params From 70a387a48fc08bd1984ed162ebc3cc181e6ac162 Mon Sep 17 00:00:00 2001 From: searxng-bot Date: Thu, 29 May 2025 00:38:04 +0000 Subject: [PATCH 63/74] [data] update searx.data - update_engine_descriptions.py --- searx/data/engine_descriptions.json | 539 ++++++++++++++++++++++------ 1 file changed, 439 insertions(+), 100 deletions(-) diff --git a/searx/data/engine_descriptions.json b/searx/data/engine_descriptions.json index fbccee24b..47ab4fcf7 100644 --- a/searx/data/engine_descriptions.json +++ b/searx/data/engine_descriptions.json @@ -88,23 +88,23 @@ }, "ar":{ "1337x":"1337x هو موقع ويب يوفر دليلًا لملفات التورنت وروابط التورنت المستخدمة لمشاركة الملفات من نظير إلى نظير من خلال بروتوكول بت تورنت. وفقًا لمدونة أخبار تورنت فريك، فإن 1337x هو ثالث أشهر مواقع التورنت اعتبارًا من عام 2021.", - "9gag":"9جاج ‏ هو موقع صور قائم على مواقع الإعلام الاجتماعي ويتمحور حول الصور التي يرفعها المستخدمون والصور الهزلية، يزور الموقع شهريا مليارا زائر كما في شهر ديسمبر 2011 حسب موسس الموقع راي تشان. ويعرف الموقع بشكل رئيسي باستخدام ميم إنترنت.", - "alpine linux packages":"ألباين لينكس ‏ هي توزيعة لينكس مستقلة صممت لتكون صغيرة وبسيطة وآمنة. تستخدم التوزيعة مسل، وبيزي بوكس، وأوبن آر سي بدلًا من مكتبة جنو لسي، وأدوات جنو الأساسية، وسيستم دي الاعتياديين الموجودين في أغلب التوزيعات، مما يجعلها أحد التوزيعات القليلة التي لا تعتمد على جنو.", - "ansa":"وكالة الأنباء الإيطالية أو الوكالة القومية المشتركة للأنباء (بالإيطالية: Agenzia Nazionale Stampa Associata)‏ «أنسا». هي أكبر وكالة للمعلومات في إيطاليا وإحدى كبريات وكالات الأنباء العالمية. تعتبر أنسا وكالة أنباء تعاونية غير ربحية. كما أن أعضائها والمالكون لها هم 36 من كبريات شبكات ووكالات الأنباء في إيطاليا. ومهمتها تكمن في بث تقارير موضوعية ومحايدة للأخبار.", - "apple app store":"متجر التطبيقات ‏ هي خدمة أنتجت لجهازي آي فون وآي بود تاتش وآي باد. صممته وتملكه شركة أبل والتي تمكن المستخدمين من تحميل التطبيقات المختلفة من خلال البرنامج نفسه على الجهاز دون الحاجة لبرنامج آي تيونز ستور بعد تحديث نظام التشغيل iOS 10. بلغ متوسط القيمة التقديرية لحجم المتجر 6 مليارات و200 مليون في عام 2010.", - "apple maps":"خرائط أبل ‏ هي خدمة خرائط ويب طورتها شركة أبل وهو نظام الخرائط الافتراضي الخاص بالأجهزة المستخدمة لأنظمة آي أو إس وماك أوس وووتش أو إس. توفر الخدمة معلومات الاتجاهات والزمن التقديري لوصول السيارات والمشاة وملاحة النقل العام. كما تُقدم خرائط أبل ميزة خاصة تُمكن المستخدم من استكشاف بعض المراكز الحضرية المكتظة بالسكان وغيرها من الأماكن الهامة بمشاهد ثلاثية الأبعاد تُظهر الأبنية.", + "9gag":"9جاج هو موقع صور قائم على مواقع الإعلام الاجتماعي ويتمحور حول الصور التي يرفعها المستخدمون والصور الهزلية، يزور الموقع شهريا مليارا زائر كما في شهر ديسمبر 2011 حسب موسس الموقع راي تشان. ويعرف الموقع بشكل رئيسي باستخدام ميم إنترنت.", + "alpine linux packages":"ألباين لينكس هي توزيعة لينكس مستقلة صممت لتكون صغيرة وبسيطة وآمنة. تستخدم التوزيعة مسل، وبيزي بوكس، وأوبن آر سي بدلًا من مكتبة جنو لسي، وأدوات جنو الأساسية، وسيستم دي الاعتياديين الموجودين في أغلب التوزيعات، مما يجعلها أحد التوزيعات القليلة التي لا تعتمد على جنو.", + "ansa":"وكالة الأنباء الإيطالية أو الوكالة القومية المشتركة للأنباء (بالإيطالية: Agenzia Nazionale Stampa Associata) «أنسا». هي أكبر وكالة للمعلومات في إيطاليا وإحدى كبريات وكالات الأنباء العالمية. تعتبر أنسا وكالة أنباء تعاونية غير ربحية. كما أن أعضائها والمالكون لها هم 36 من كبريات شبكات ووكالات الأنباء في إيطاليا. ومهمتها تكمن في بث تقارير موضوعية ومحايدة للأخبار.", + "apple app store":"متجر التطبيقات هي خدمة أنتجت لجهازي آي فون وآي بود تاتش وآي باد. صممته وتملكه شركة أبل والتي تمكن المستخدمين من تحميل التطبيقات المختلفة من خلال البرنامج نفسه على الجهاز دون الحاجة لبرنامج آي تيونز ستور بعد تحديث نظام التشغيل iOS 10. بلغ متوسط القيمة التقديرية لحجم المتجر 6 مليارات و200 مليون في عام 2010.", + "apple maps":"خرائط أبل هي خدمة خرائط ويب طورتها شركة أبل وهو نظام الخرائط الافتراضي الخاص بالأجهزة المستخدمة لأنظمة آي أو إس وماك أوس وووتش أو إس. توفر الخدمة معلومات الاتجاهات والزمن التقديري لوصول السيارات والمشاة وملاحة النقل العام. كما تُقدم خرائط أبل ميزة خاصة تُمكن المستخدم من استكشاف بعض المراكز الحضرية المكتظة بالسكان وغيرها من الأماكن الهامة بمشاهد ثلاثية الأبعاد تُظهر الأبنية.", "arch linux wiki":[ "توثيق آرتش لينكس على الوِب", "wikidata" ], "artic":"معهد الفن في شيكاغو متحف عام للفن، ومركز ثقافي وتعليمي في الولايات المتحدة. تأسس معهد الفن عام 1866 باسم أكاديمية شيكاغو للتصميم، تضم المجموعات المعروضة في المعهد اللوحات والمنحوتات، والمطبوعات والرسومات والفنون الزخرفية الأوروبية والأمريكية والفن الشرقي والكلاسيكي وفن التصوير الضوئي والمنسوجات وفنون وحرف أفريقيا وأمريكا اللاتينية وجزر المحيط الهادئ وأمريكا ما قبل كولمبوس.", - "arxiv":"أرخايف ‏ بحيث تُنطق في النهاية «أركايف» أو «أرخايف». أرخايف هو أرشيف لمسودات أوراق علمية إلكترونية مكتوبة في مجالات الفيزياء، الرياضيات، الفلك، علم الحاسوب، والإحصاء التي يمكن الوصول إليها عبر الإنترنت. هذه الأرشيفات موجودة على موقع arXiv.org.", - "ask":"أسك دوت كوم ‏ هو باحوث ‏ يركز على الرد على الأسئلة. تأسس الموقع في العام 1996 من قبل غاريت جرونر وديفيد وارثن في بيركلي، كاليفورنيا.", + "arxiv":"أرخايف بحيث تُنطق في النهاية «أركايف» أو «أرخايف». أرخايف هو أرشيف لمسودات أوراق علمية إلكترونية مكتوبة في مجالات الفيزياء، الرياضيات، الفلك، علم الحاسوب، والإحصاء التي يمكن الوصول إليها عبر الإنترنت. هذه الأرشيفات موجودة على موقع arXiv.org.", + "ask":"أسك دوت كوم هو باحوث يركز على الرد على الأسئلة. تأسس الموقع في العام 1996 من قبل غاريت جرونر وديفيد وارثن في بيركلي، كاليفورنيا.", "askubuntu":[ "stackoverflow:ar", "ref" ], - "baidu":"بايدو ‏ هو محرك بحث صيني انطلق يوم 18 يناير 2000. وهو المصنف رقم واحد في الصين والثالث عالمياً حسب عدد الزيارات حسب تصنيف أليكسا، حيث يمكن هذا الموقع من البحث في أكثر من 57 تصنيف مختلف، منها الصور، الفيديو، الأخبار والوثائق وغيرها الكثير. قام بإنشاء موقع بايدو الصينيان روبن لي وإريك تشو، وكلاهما درسا خارج الصين قبل العودة إليها بشهادات عليا حيث أسسا شركة بايدو. وفي سنة 2007، صارت شركة بايدو أول شركة صينية تُسَجل في بورصة نازداك الأمريكية.واتخذ بايدو كشعار له، بايدو يعرف الصينيين أفضل، أو أفضل من غيره، مشيراً بذلك إلى منافسيه الذين يعملون أساساً من قارات بعيدة عن الصين كجوجل.", + "baidu":"بايدو هو محرك بحث صيني انطلق يوم 18 يناير 2000. وهو المصنف رقم واحد في الصين والثالث عالمياً حسب عدد الزيارات حسب تصنيف أليكسا، حيث يمكن هذا الموقع من البحث في أكثر من 57 تصنيف مختلف، منها الصور، الفيديو، الأخبار والوثائق وغيرها الكثير. قام بإنشاء موقع بايدو الصينيان روبن لي وإريك تشو، وكلاهما درسا خارج الصين قبل العودة إليها بشهادات عليا حيث أسسا شركة بايدو. وفي سنة 2007، صارت شركة بايدو أول شركة صينية تُسَجل في بورصة نازداك الأمريكية.واتخذ بايدو كشعار له، بايدو يعرف الصينيين أفضل، أو أفضل من غيره، مشيراً بذلك إلى منافسيه الذين يعملون أساساً من قارات بعيدة عن الصين كجوجل.", "baidu images":[ "baidu:ar", "ref" @@ -114,7 +114,7 @@ "ref" ], "bilibili":"بيليبيلي (بالأنجليزية:bilibili) هو موقع ويب من نوع خدمة استضافة فيديو وتطبيق محمول أنشئ في 26 يونيو 2009، يقع مقره الرئيسي في الصين، وهو متوفر باللغة الصينية. يعد Bilibili واحداً من أهم منصات الفيديو الناشئة في الصين. يحظى الموقع بشعبية ضخمة بين الجيل Z في الصين. يميل محتوى Bilibili إلى أن يكون حول الألعاب والرسوم المتحركة والقصص المصورة. ومع ذلك، فإن عدد أنواع الفيديو الشائعة يتغير مع تزايد شعبية المنصة، ويرتبط معظمها بأسلوب الحياة والجمال. وهو يتشابه إلى حد كبير مع موقع اليوتيوب.", - "bing":"مايكروسوفت بينغ ‏ واختصارًا وهو الاسم السابق: بينغ ‏ ؛ هو محرك بحث أعلن عنه تحت اسم ، طور تحت اسم بالعربية: كومو وإنجليزية: kumo, هو محرك بحث في ويب لشركة مايكروسوفت، صمم لمنافسة رواد هذا المجال جوجل وياهو!، تم الإفصاح عنه من قبل ستيف بالمر الرئيس التنفيذي السابق في مايكروسوفت في 28 مايو 2009 في مؤتمر All Things D في سان دييغو، بينغ هو بديل لايف سيرش Live Search، بدأ عمله بالكامل في 3 يونيو 2009.", + "bing":"مايكروسوفت بينغ واختصارًا وهو الاسم السابق: بينغ ؛ هو محرك بحث أعلن عنه تحت اسم ، طور تحت اسم بالعربية: كومو وإنجليزية: kumo, هو محرك بحث في ويب لشركة مايكروسوفت، صمم لمنافسة رواد هذا المجال جوجل وياهو!، تم الإفصاح عنه من قبل ستيف بالمر الرئيس التنفيذي السابق في مايكروسوفت في 28 مايو 2009 في مؤتمر All Things D في سان دييغو، بينغ هو بديل لايف سيرش Live Search، بدأ عمله بالكامل في 3 يونيو 2009.", "bing images":[ "bing:ar", "ref" @@ -131,8 +131,8 @@ "خدمة استضافة على شبكة الإنترنت لمشاريع تطوير البرمجيات", "wikidata" ], - "bitchute":"بيتشيوت ‏ هو موقع وتطبيق خدمة فيديوهات تم إنشائه في إنجلترا في يناير 2017 من قبل راي فاهي لينافس يوتيوب، حاز هذا الموقع على شعبية عند مدوني اليمين الأقصى مثل أليكس جونس ومن ألذين تم منعهم بسبب سياسات يوتيوب، وقد أتهم الموقع بإثارة الكراهية.", - "brave":"بريف ‏ وتعني شجاع هو متصفح ويب مفتوح المصدر مبني على كروميوم، يعمل المتصفح على نظم تشغيل مايكروسوفت ويندوز وماك أو إس وجنو/لينكس، وكذلك يعمل على نظامي آي أو إس وأندرويد. ترأس بريندان أيخ، منشئ جافاسكربت وأحد مؤسسي مؤسسة موزيلا، مشروع تطوير هذا المتصفح.", + "bitchute":"بيتشيوت هو موقع وتطبيق خدمة فيديوهات تم إنشائه في إنجلترا في يناير 2017 من قبل راي فاهي لينافس يوتيوب، حاز هذا الموقع على شعبية عند مدوني اليمين الأقصى مثل أليكس جونس ومن ألذين تم منعهم بسبب سياسات يوتيوب، وقد أتهم الموقع بإثارة الكراهية.", + "brave":"بريف وتعني شجاع هو متصفح ويب مفتوح المصدر مبني على كروميوم، يعمل المتصفح على نظم تشغيل مايكروسوفت ويندوز وماك أو إس وجنو/لينكس، وكذلك يعمل على نظامي آي أو إس وأندرويد. ترأس بريندان أيخ، منشئ جافاسكربت وأحد مؤسسي مؤسسة موزيلا، مشروع تطوير هذا المتصفح.", "brave.images":[ "brave:ar", "ref" @@ -145,14 +145,14 @@ "brave:ar", "ref" ], - "currency":"دك دك غو أو داك داك غو ‏ هو محرك بحث على الإنترنت يركز على حماية خصوصية الباحثين وتجنب فقاعة التصفية لنتائج البحث المخصصة. يميز DuckDuckGo نفسه عن محركات البحث الأخرى من خلال عدم تحديد سمات مستخدميه وإظهار نفس نتائج البحث لجميع المستخدمين لمصطلح بحث معين.", + "currency":"دك دك غو أو داك داك غو هو محرك بحث على الإنترنت يركز على حماية خصوصية الباحثين وتجنب فقاعة التصفية لنتائج البحث المخصصة. يميز DuckDuckGo نفسه عن محركات البحث الأخرى من خلال عدم تحديد سمات مستخدميه وإظهار نفس نتائج البحث لجميع المستخدمين لمصطلح بحث معين.", "dailymotion":"ديلي موشن (Dailymotion) هو موقع ويب شهير متخصص بمشاركة الفيديو، يعتبر منافس ليوتويب، يسمح للمستخدمين برفع ومشاهدة ومشاركة مقاطع الفيديو بشكل مجاني. في نوفمبر 2012 احتل الموقع المرتبة 31 لأكثر المواقع زيارة في العالم بحجم زائرين يصل إلى 116 مليون زائر في الشهر.", "ddg definitions":[ "currency:ar", "ref" ], - "deezer":"ديزر ‏ وهي منصة إلكترونية تقدم خدمة بث الموسيقى. وتتيح للمستخدمين الاستماع إلى الموسيقى من شركات إنتاج موسيقية، مثل: سوني للترفيه الموسيقي، ومجموعة يونيفرسال ميوزيك، ووارنر ميوزيك على مختلف الأجهزة سواء باستخدام الإنترنت أو من دون اتصال. تم إنشاء المنصّة في باريس، فرنسا، لدى دييزر حاليا 56 مليون ملف صوتي في المكتبة، مع أكثر من 60,000 قناة راديو، و18 مليون مستخدم نشط شهريا، منهم 7 ملايين مشترك اشتراك مدفوع منذ 3 أبريل 2020. الخدمة متاحة على شبكة الإنترنت، ونظام اندرويد، ونظام آي أو اس، وويندوز موبايل، ونظام التشغيل بلاك بيري، وويندوز، وماك.", - "deviantart":"ديڤينت‌آرت ‏ هو هو مجتمع فن أمريكي يتناول الأعمال الفنية، والتصوير الفيديوي والفوتوغرافي. أطلق في 7 أغسطس، 2000، من قبل انجيلو سوتيرا، سكوت جاركوف، ماثيو ستيفنز، وآخرين. تنظم الأعمال الفنية بحسب تصنيفات، وتشمل التصنيفات، التصوير الفوتوغرافي، والفن الرقمي، والفن التقليدي، والأدب، وفلاش، وصناعة الإفلام أو تصوير الأفلام، والأغلفة للتطبيقات، وأدوات تخصيص نظام التشغيل وغيرها، بالإضافة إلى المواد القابلة للتنزيل مثل الدورات التعليمية، والصور الفوتوغرافية. بالإضافة إلى مزايا إضافية مثل المجلات، والاستفتاءات، والمجموعات، ووملفات الأعمال الفنية.", + "deezer":"ديزر وهي منصة إلكترونية تقدم خدمة بث الموسيقى. وتتيح للمستخدمين الاستماع إلى الموسيقى من شركات إنتاج موسيقية، مثل: سوني للترفيه الموسيقي، ومجموعة يونيفرسال ميوزيك، ووارنر ميوزيك على مختلف الأجهزة سواء باستخدام الإنترنت أو من دون اتصال. تم إنشاء المنصّة في باريس، فرنسا، لدى دييزر حاليا 56 مليون ملف صوتي في المكتبة، مع أكثر من 60,000 قناة راديو، و18 مليون مستخدم نشط شهريا، منهم 7 ملايين مشترك اشتراك مدفوع منذ 3 أبريل 2020. الخدمة متاحة على شبكة الإنترنت، ونظام اندرويد، ونظام آي أو اس، وويندوز موبايل، ونظام التشغيل بلاك بيري، وويندوز، وماك.", + "deviantart":"ديڤينت‌آرت هو هو مجتمع فن أمريكي يتناول الأعمال الفنية، والتصوير الفيديوي والفوتوغرافي. أطلق في 7 أغسطس، 2000، من قبل انجيلو سوتيرا، سكوت جاركوف، ماثيو ستيفنز، وآخرين. تنظم الأعمال الفنية بحسب تصنيفات، وتشمل التصنيفات، التصوير الفوتوغرافي، والفن الرقمي، والفن التقليدي، والأدب، وفلاش، وصناعة الإفلام أو تصوير الأفلام، والأغلفة للتطبيقات، وأدوات تخصيص نظام التشغيل وغيرها، بالإضافة إلى المواد القابلة للتنزيل مثل الدورات التعليمية، والصور الفوتوغرافية. بالإضافة إلى مزايا إضافية مثل المجلات، والاستفتاءات، والمجموعات، ووملفات الأعمال الفنية.", "duckduckgo":[ "currency:ar", "ref" @@ -173,32 +173,32 @@ "currency:ar", "ref" ], - "emojipedia":"إيموجي بيديا ‏ هو موقع على الإنترنت مختص بمراجع الإيموجي، قام بإنشائه متخصص الإيموجي جيرمي بورج في 2013.", + "emojipedia":"إيموجي بيديا هو موقع على الإنترنت مختص بمراجع الإيموجي، قام بإنشائه متخصص الإيموجي جيرمي بورج في 2013.", "etymonline":"قاموس علم اشتقاق الألفاظ هو قاموس حر على الانترنت يصف أصول الكلمات باللغة الإنجليزية.", - "fdroid":"إف-درويد ‏ هو مستودع برامج أو «متجر تطبيقات» لتطبيقات الأندرويد، مماثل ومشابه ل جوجل بلاي ستور . المستودع الرئيسي مستضاف من طرف مشروع يحتوي فقط على تطبيقات ذات برامج حرة أو مفتوحة المصدر. التطبيقات يمكن تصفحها وتحميلها من الموقع الرسمي ل إف-درويد بدون حاجة المستخدم إلى تسجيل أو فتح حساب. «مضاد الميزات» على غرار الإعلانات تستعمل التتبع أو أنها تعتمد على برامج غير حرة ويتم ذكر هذا في الوصف. يقدم الموقع أيضا مصدر الكود للتطبيقات ، حيث أن مضيفي البرامج يستعملون خادم ف-درويد، وبالتالي يسمحون لأي شخص من المجموعة في أن يصبح ملك تطبيق معين في المستودع.", - "flickr":"فليكر ‏ هي خدمة استضافة الصور والفيديو بالإضافة إلى كونها مجتمعًا عبر الإنترنت. تأسَّست فليكر من قِبل لوديكورب ‏ عام 2004 وأصبحت منصّة شائعة للمصورين الهواة والمحترفين لاستضافة صور عاليّة الدقة. تغيّرت ملكية فليكر عدة مرات إلى أن امتلكتها سموج موج ‏ منذ العشرين من نيسان/أبريل 2018.", + "fdroid":"إف-درويد هو مستودع برامج أو «متجر تطبيقات» لتطبيقات الأندرويد، مماثل ومشابه ل جوجل بلاي ستور . المستودع الرئيسي مستضاف من طرف مشروع يحتوي فقط على تطبيقات ذات برامج حرة أو مفتوحة المصدر. التطبيقات يمكن تصفحها وتحميلها من الموقع الرسمي ل إف-درويد بدون حاجة المستخدم إلى تسجيل أو فتح حساب. «مضاد الميزات» على غرار الإعلانات تستعمل التتبع أو أنها تعتمد على برامج غير حرة ويتم ذكر هذا في الوصف. يقدم الموقع أيضا مصدر الكود للتطبيقات ، حيث أن مضيفي البرامج يستعملون خادم ف-درويد، وبالتالي يسمحون لأي شخص من المجموعة في أن يصبح ملك تطبيق معين في المستودع.", + "flickr":"فليكر هي خدمة استضافة الصور والفيديو بالإضافة إلى كونها مجتمعًا عبر الإنترنت. تأسَّست فليكر من قِبل لوديكورب عام 2004 وأصبحت منصّة شائعة للمصورين الهواة والمحترفين لاستضافة صور عاليّة الدقة. تغيّرت ملكية فليكر عدة مرات إلى أن امتلكتها سموج موج منذ العشرين من نيسان/أبريل 2018.", "free software directory":"دليل البرمجيات الحرة (FSD) هو مشروع تابع لمؤسسة البرمجيات الحرة (FSF). يقوم بفهرسة البرامج المجانية التي تعمل في ظل أنظمة التشغيل الحرة - خاصة جنو و لينكس. غالبًا ما تكون المشاريع المفهرسة قادرة على العمل في العديد من أنظمة التشغيل الأخرى. كان المشروع في السابق بالاشتراك مع اليونسكو.", "genius":"جينيس (بالإنجليزية:Genius) كان اسمها سابقاً راب جينيس وهي شركة أمريكية للإعلام الرقمي, أسس الموقع في آب 2009 من قبل توم ليهمان، إيلان زيخوري، ومهبود موغادام، والموقع يتيح للمستخدمين تقديم شروح وتفسير كلمات الأغاني، وقصص إخبارية، ومصادر، ووثائق.", "gentoo":[ "gentoo:en", "ref" ], - "github":"غيت هاب ‏ هي شركة تابعة لمايكروسوفت توفر استضافة لتطوير البرامج والتحكم في الإصدار باستخدام غيت. توفر الشركة وظائف التحكم في الإصدار الموزع وإدارة كود المصدر (SCM) لـ «غيت»، بالإضافة إلى ميزاته الخاصة. يوفر النظام التحكم في الوصول والعديد من ميزات التعاون مثل تتبع الأخطاء وطلبات الميزات البرمجية وإدارة المهام والتركيب المتواصل ومواقع ويكي لكل مشروع غيت هاب. يقع مقرها الرئيسي في كاليفورنيا، وهي شركة تابعة لشركة مايكروسوفت منذ عام 2018.", - "gitlab":"غيت لاب ‏ هي شركة مفتوحة النواة تشتهر بتقديم مدير مستودعات غيت الذي يحمل نفس اسم الشركة.", - "goodreads":"جودريدز أو غودريدز ‏ تترجم للعربية بـ القراءات الجيدة هي شبكة اجتماعية تهتم بالكتب وبتوصيات وآراء المستخدمين حول الكتب والمؤلفين، أسس الموقع في عام 2006 من جهد المبرمج الأمريكي أوتيس تشاندلر. انطلق الموقع في ديسمبر 2006 ووصل عدد الأعضاء المسجلين في جود ريدز إلى أكثر من المليون عضو حتى اليوم، شاركوا بما يزيد على 10 ملايين كتاب، ورغم ذلك فإن الموقع لم يكن هادفاً للربح عند إطلاقه وبعد عام واحد فقط تلقى تمويلاً من إحدى الشركات لدفعه إلى الأمام والمحافظة على خدمته المتميزة. في آذار 2013 أعلنت شركة أمازون استحواذها عليه بدون الإفصاح عن مبلغ العقد.", - "google":"بحث جوجل ‏ أو جوجل ‏، هو محرك بحث صممته شركة جوجل. وهو محرك البحث الأكثر استخدامًا على شبكة الويب العالمية عبر جميع الأنظمة الأساسية، مع حصة سوقية تبلغ 92.16٪ اعتبارًا من ديسمبر 2020، ويتعامل مع أكثر من 5.4 مليار عملية بحث يوميًا.", - "google images":"صور جوجل ‏: هو محرك بحث مصمم خصيصاً للبحث عن الصور، بلغ عدد الصور التي تحتويه 10 مليارات صورة، بينما يبلغ عدد متصفحيه مليار مستخدم يومياً. أطلقت هذه الخدمة منذ يوليو 2001.", - "google news":"أخبار جوجل ‏ هو برنامج مبني على الويب، تقدمه شركة جوجل. البرنامج عبارة عن مجمع أخبار. يستخدم البرنامج خوارزمية Storyrank التي يمكن القول أنها الخوارزمية الشقيقة لخوارزمية Pagerank التي جعلت باحوث جوجل من أفضل محركات البحث على الإنترنت. تم تطوير الخوارزمية بواسطة كاريشنا باهارات في العام 2001. تم تقديم أخبار جوجل كنسخة بيتا في أبريل 2002. خرج البرنامج من مرحلة البيتا في 23 يناير 2006. هناك عدة نسخ من البرنامج مخصصة ل 20 إقليما في العالم تستخدم 12 لغة. اللغات المتاحة حالياً هي: العربية، العبرية، الصينية ، اليبانية، الكورية، الفرنسية، الألمانية، الإسبانية، الإنجليزية، الإيطالية، البرتغالية، الهولندية، النرويجية، والسويدية.", - "google play apps":"جوجل بلاي ‏ وسابقًا سوق أندرويد ‏ هي خدمة توزيع رقمية يتم تشغيلها وتطويرها بواسطة جوجل، وهو بمثابة متجر التطبيقات الرسميّ للأجهزة المُعتمدة التي تعمل على نظام التشغيل أندرويد، ممَّا يسمح للمستخدمين بتصفح وتنزيل التطبيقات التي تمَّ تطويرها بِاستخدام مجموعة تطوير برامج أندرويد (SDK) ونشرها عبر جوجل. يُعد جوجل بلاي أيضًا بمثابة متجر وسائط رقمية، حيثُ يعرضُ المُوسيقى، والكتب، والأفلام، والبرامج التلفزيونية. عرض المتجر سابقًا أجهزة جوجل للشراء حتّى طُرح متجر تجزئة منفصل للأجهزة عبر الإنترنت والمسمى متجر جوجل وذلك في 11 مارس 2015. عرض المتجر أيضًا منشورات إخباريَّة ومجلات قبل تجديد أخبار جوجل في 15 مايو 2018. عرض المتجر أيضاً المُوسيقى والبودكاست كجزء من موسيقى جوجل بلاي حتّى ديسمبر 2020 عندما تمَّ استبدال الخدمة بيوتيوب ميوزيك وجوجل بودكاست.", + "github":"غيت هاب هي شركة تابعة لمايكروسوفت توفر استضافة لتطوير البرامج والتحكم في الإصدار باستخدام غيت. توفر الشركة وظائف التحكم في الإصدار الموزع وإدارة كود المصدر (SCM) لـ «غيت»، بالإضافة إلى ميزاته الخاصة. يوفر النظام التحكم في الوصول والعديد من ميزات التعاون مثل تتبع الأخطاء وطلبات الميزات البرمجية وإدارة المهام والتركيب المتواصل ومواقع ويكي لكل مشروع غيت هاب. يقع مقرها الرئيسي في كاليفورنيا، وهي شركة تابعة لشركة مايكروسوفت منذ عام 2018.", + "gitlab":"غيت لاب هي شركة مفتوحة النواة تشتهر بتقديم مدير مستودعات غيت الذي يحمل نفس اسم الشركة.", + "goodreads":"جودريدز أو غودريدز تترجم للعربية بـ القراءات الجيدة هي شبكة اجتماعية تهتم بالكتب وبتوصيات وآراء المستخدمين حول الكتب والمؤلفين، أسس الموقع في عام 2006 من جهد المبرمج الأمريكي أوتيس تشاندلر. انطلق الموقع في ديسمبر 2006 ووصل عدد الأعضاء المسجلين في جود ريدز إلى أكثر من المليون عضو حتى اليوم، شاركوا بما يزيد على 10 ملايين كتاب، ورغم ذلك فإن الموقع لم يكن هادفاً للربح عند إطلاقه وبعد عام واحد فقط تلقى تمويلاً من إحدى الشركات لدفعه إلى الأمام والمحافظة على خدمته المتميزة. في آذار 2013 أعلنت شركة أمازون استحواذها عليه بدون الإفصاح عن مبلغ العقد.", + "google":"بحث جوجل أو جوجل ، هو محرك بحث صممته شركة جوجل. وهو محرك البحث الأكثر استخدامًا على شبكة الويب العالمية عبر جميع الأنظمة الأساسية، مع حصة سوقية تبلغ 92.16٪ اعتبارًا من ديسمبر 2020، ويتعامل مع أكثر من 5.4 مليار عملية بحث يوميًا.", + "google images":"صور جوجل : هو محرك بحث مصمم خصيصاً للبحث عن الصور، بلغ عدد الصور التي تحتويه 10 مليارات صورة، بينما يبلغ عدد متصفحيه مليار مستخدم يومياً. أطلقت هذه الخدمة منذ يوليو 2001.", + "google news":"أخبار جوجل هو برنامج مبني على الويب، تقدمه شركة جوجل. البرنامج عبارة عن مجمع أخبار. يستخدم البرنامج خوارزمية Storyrank التي يمكن القول أنها الخوارزمية الشقيقة لخوارزمية Pagerank التي جعلت باحوث جوجل من أفضل محركات البحث على الإنترنت. تم تطوير الخوارزمية بواسطة كاريشنا باهارات في العام 2001. تم تقديم أخبار جوجل كنسخة بيتا في أبريل 2002. خرج البرنامج من مرحلة البيتا في 23 يناير 2006. هناك عدة نسخ من البرنامج مخصصة ل 20 إقليما في العالم تستخدم 12 لغة. اللغات المتاحة حالياً هي: العربية، العبرية، الصينية ، اليبانية، الكورية، الفرنسية، الألمانية، الإسبانية، الإنجليزية، الإيطالية، البرتغالية، الهولندية، النرويجية، والسويدية.", + "google play apps":"جوجل بلاي وسابقًا سوق أندرويد هي خدمة توزيع رقمية يتم تشغيلها وتطويرها بواسطة جوجل، وهو بمثابة متجر التطبيقات الرسميّ للأجهزة المُعتمدة التي تعمل على نظام التشغيل أندرويد، ممَّا يسمح للمستخدمين بتصفح وتنزيل التطبيقات التي تمَّ تطويرها بِاستخدام مجموعة تطوير برامج أندرويد (SDK) ونشرها عبر جوجل. يُعد جوجل بلاي أيضًا بمثابة متجر وسائط رقمية، حيثُ يعرضُ المُوسيقى، والكتب، والأفلام، والبرامج التلفزيونية. عرض المتجر سابقًا أجهزة جوجل للشراء حتّى طُرح متجر تجزئة منفصل للأجهزة عبر الإنترنت والمسمى متجر جوجل وذلك في 11 مارس 2015. عرض المتجر أيضًا منشورات إخباريَّة ومجلات قبل تجديد أخبار جوجل في 15 مايو 2018. عرض المتجر أيضاً المُوسيقى والبودكاست كجزء من موسيقى جوجل بلاي حتّى ديسمبر 2020 عندما تمَّ استبدال الخدمة بيوتيوب ميوزيك وجوجل بودكاست.", "google play movies":[ "google play apps:ar", "ref" ], - "google scholar":"جوجل سكولار أو الباحث العلمي من جوجل ‏ هو محرك بحث خاص بالمؤلفات العلمية والأكاديمية التي يحتاج إليها الباحثون والدارسون. من مكان واحد، يمكنك البحث عبر العديد من المجالات العلمية ومصادر المعلومات: أبحاث معتمدة ورسائل علمية وكتب وملخصات ومقالات من ناشرين أكاديميين وجمعيات متخصصة ومراكز جمع المعلومات قبل طباعتها والجامعات وغير ذلك من مؤسسات البحث العلمي. يساعدك الباحث العلمي من جوجل على التعرف على أكثر الأبحاث العلمية صلة بمجال بحثك في عالم البحث العلمي.", + "google scholar":"جوجل سكولار أو الباحث العلمي من جوجل هو محرك بحث خاص بالمؤلفات العلمية والأكاديمية التي يحتاج إليها الباحثون والدارسون. من مكان واحد، يمكنك البحث عبر العديد من المجالات العلمية ومصادر المعلومات: أبحاث معتمدة ورسائل علمية وكتب وملخصات ومقالات من ناشرين أكاديميين وجمعيات متخصصة ومراكز جمع المعلومات قبل طباعتها والجامعات وغير ذلك من مؤسسات البحث العلمي. يساعدك الباحث العلمي من جوجل على التعرف على أكثر الأبحاث العلمية صلة بمجال بحثك في عالم البحث العلمي.", "google videos":"جوجل فيديو هو موقع فيديو مجاني، وكذلك محرك بحث للفيديو من غوغل. غوغل فيديو يسمح للفيديو أن يكون جزءًا لا يتجزأ من مواقع أخرى بعيدة ويوفر ما يلزم من كود HTML ويسمح كذلك للمواقع باستضافة كميات كبيرة من الفيديو عن بعد على جوجل فيديو دون الوقوع في عرض النطاق الترددي. بعض أشرطة الفيديو معروضة أيضاً للبيع من خلال متجر غوغل فيديو.", - "hackernews":"هاكر نيوز ‏ هو موقع إخباري اجتماعي يركز على علوم الكمبيوتر وريادة الأعمال. يدار من قبل صندوق الاستثمار وحاضنة الشركات الناشئة Y Combinator الخاصة بـ بول غراهام. بشكل عام يتم تعريف المحتوى الذي يمكن تقديمه على أنه «أي شيء يرضي فضول الفرد الفكري».", + "hackernews":"هاكر نيوز هو موقع إخباري اجتماعي يركز على علوم الكمبيوتر وريادة الأعمال. يدار من قبل صندوق الاستثمار وحاضنة الشركات الناشئة Y Combinator الخاصة بـ بول غراهام. بشكل عام يتم تعريف المحتوى الذي يمكن تقديمه على أنه «أي شيء يرضي فضول الفرد الفكري».", "hoogle":"هاسكل هي لغة برمجة مطابقة للمعايير، للأغراض العامة، وهي لغة وظيفية إلى حد كبير، دون دلالات ألفاظ ملزمة وبكتابة ثابتة وقوية. وقد سُميت بـ هاسكل علي اسم عالم المنطق «هاسكل كوري». وفي اللغة هاسكل، «تمثل الوظيفة مواطن من الدرجة الأولى» من لغة البرمجة. ولكونها لغة برمجة وظيفية فإن بنية التحكم الرئيسية هي الوظيفة. وترجع أصول اللغة إلى ملاحظات هاسكل كوري وأتباعه من المفكرين، بأن «الإثبات هو برنامج؛ والمعادلة التي يثبتها هي نوع للبرنامج».", - "huggingface":"شركة هجينج فيس ‏ هي شركة أمريكية مسجلة بموجب قانون الشركات العام لولاية ديلاوير ومقرها في مدينة نيويورك، وتعمل على تطوير أدوات حوسبة لبناء تطبيقات تستند إلى تعلم الآلة. تشتهر بشكل خاص بمكتبة المحولات (ترانسفورمرز) التي طورتها لتطبيقات معالجة اللغة الطبيعية، ومنصتها التي تتيح للمستخدمين مشاركة نماذج تعلم الآلة ومجاميع البيانات وعرض أعمالهم.", + "huggingface":"شركة هجينج فيس هي شركة أمريكية مسجلة بموجب قانون الشركات العام لولاية ديلاوير ومقرها في مدينة نيويورك، وتعمل على تطوير أدوات حوسبة لبناء تطبيقات تستند إلى تعلم الآلة. تشتهر بشكل خاص بمكتبة المحولات (ترانسفورمرز) التي طورتها لتطبيقات معالجة اللغة الطبيعية، ومنصتها التي تتيح للمستخدمين مشاركة نماذج تعلم الآلة ومجاميع البيانات وعرض أعمالهم.", "huggingface datasets":[ "huggingface:ar", "ref" @@ -207,10 +207,10 @@ "huggingface:ar", "ref" ], - "imdb":"قاعدة بيانات الأفلام على الإنترنت وتُعرف اختصارًا بـ آي إم دي بي ‏ هي قاعدة بيانات عبر الإنترنت للمعلومات المتعلقة بالأفلام والبرامج التلفزيونية ومقاطع الفيديو المنزلية وألعاب الفيديو والمحتوى المتدفق عبر الإنترنت - بما في ذلك الممثلون وطاقم الإنتاج والسير الذاتية الشخصية وملخصات الحبكة، التقييمات وآراء المعجبين وكذا المراجعات النقدية. كان موقع قاعدة بيانات الأفلام على الإنترنت في الأصل موقع ويب يُديره المعجبون إلى أن سيطرت عليهِ شركة آي إم دي بي دوت كوم إنكوايرر ‏ وهي شركةٌ تابعةٌ لشركة أمازون. بدأ الموقع كقاعدة بيانات أفلام على مجموعة يوزنت ‏ على المسار ريك دوت آرتس دوت موفيز ‏ في عام 1990 وانتقلَ إلى الويب في عام 1993.", + "imdb":"قاعدة بيانات الأفلام على الإنترنت وتُعرف اختصارًا بـ آي إم دي بي هي قاعدة بيانات عبر الإنترنت للمعلومات المتعلقة بالأفلام والبرامج التلفزيونية ومقاطع الفيديو المنزلية وألعاب الفيديو والمحتوى المتدفق عبر الإنترنت - بما في ذلك الممثلون وطاقم الإنتاج والسير الذاتية الشخصية وملخصات الحبكة، التقييمات وآراء المعجبين وكذا المراجعات النقدية. كان موقع قاعدة بيانات الأفلام على الإنترنت في الأصل موقع ويب يُديره المعجبون إلى أن سيطرت عليهِ شركة آي إم دي بي دوت كوم إنكوايرر وهي شركةٌ تابعةٌ لشركة أمازون. بدأ الموقع كقاعدة بيانات أفلام على مجموعة يوزنت على المسار ريك دوت آرتس دوت موفيز في عام 1990 وانتقلَ إلى الويب في عام 1993.", "imgur":"إمجور هو مجتمع إلكتروني عبر الإنترنت يقدم خدمات الاستضافة للصور والمشاركة والاستمتاع بأشهر الصور المنتشرة عبر الإنترنت من جميع دول العالم. أسسه آلان شاف ويستخدم البرنامج حاليًا ملايين المتصفحين بشكل يومي.", "iqiyi":"آي تشي يي ، هي منصة فيديو عبر الإنترنت مقرها في بكين، الصين، تم إطلاقها في 22 أبريل 2010.", - "kickass":"كيك اس تورنت ‏ هو موقع على شبكة الانترنت، تأسس في عام 2008، يوفر ملفات وروابط تورنت لتسهيل تبادل الملفات الند للند باستخدام بروتوكول بت تورنت. وتوقف الموقع عن الخدمة في 20 يوليوز عام 2016، بعد أن تم الحجز على اسم نطاقه من قبل حكومة الولايات المتحدة. وأغلقت خوادم بروكسي الموقع من طرف موظفيه في نفس الوقت.", + "kickass":"كيك اس تورنت هو موقع على شبكة الانترنت، تأسس في عام 2008، يوفر ملفات وروابط تورنت لتسهيل تبادل الملفات الند للند باستخدام بروتوكول بت تورنت. وتوقف الموقع عن الخدمة في 20 يوليوز عام 2016، بعد أن تم الحجز على اسم نطاقه من قبل حكومة الولايات المتحدة. وأغلقت خوادم بروكسي الموقع من طرف موظفيه في نفس الوقت.", "lemmy comments":[ "lemmy communities:ar", "ref" @@ -224,16 +224,16 @@ "lemmy communities:ar", "ref" ], - "library genesis":"مكتبة التكوين ‏ وتُدعى اختصارًا LibGen هي محرك بحث للمقالات والكتب حول مواضيع مختلفة، يتيح الموقع الوصول المجاني إلى المحتوى الذي يكون مدفوعًا أو غير رقمي في مكان آخر. من بين أمور أخرى، تتضمن ملفات بي دي اف محتوى من بوابة إلزيفير المعروفة باسم سيانس دايركت", - "library of congress":"مكتبة الكونغرس ‏ تعرف اختصاراً LOC هي مكتبة الأبحاث والتي تخص رسمياً كونغرس الولايات المتحدة وهي المكتبة الوطنية للولايات المتحدة بحكم الأمر الواقع. وهي أقدم مؤسسة ثقافية اتحادية في الولايات المتحدة. تقع المكتبة في ثلاثة مبان في كابيتول هيل في واشنطن دي سي. كما أنها تحتفظ بالمركز الوطني للمحافظة على السمعيات والبصريات في كولبيبر بولاية فيرجينيا. يشرف أمين مكتبة الكونغرس على وظائف المكتبة، ويحافظ مهندس مبنى الكابيتول على مبانيها. تعد مكتبة الكونجرس من أكبر المكتبات في العالم. «مجموعاتها عالمية ولا تقتصر على الموضوع أو التنسيق أو الحدود الوطنية، وتتضمن مواد بحثية من جميع أنحاء العالم وبأكثر من 450 لغة.»", + "library genesis":"مكتبة التكوين وتُدعى اختصارًا LibGen هي محرك بحث للمقالات والكتب حول مواضيع مختلفة، يتيح الموقع الوصول المجاني إلى المحتوى الذي يكون مدفوعًا أو غير رقمي في مكان آخر. من بين أمور أخرى، تتضمن ملفات بي دي اف محتوى من بوابة إلزيفير المعروفة باسم سيانس دايركت", + "library of congress":"مكتبة الكونغرس تعرف اختصاراً LOC هي مكتبة الأبحاث والتي تخص رسمياً كونغرس الولايات المتحدة وهي المكتبة الوطنية للولايات المتحدة بحكم الأمر الواقع. وهي أقدم مؤسسة ثقافية اتحادية في الولايات المتحدة. تقع المكتبة في ثلاثة مبان في كابيتول هيل في واشنطن دي سي. كما أنها تحتفظ بالمركز الوطني للمحافظة على السمعيات والبصريات في كولبيبر بولاية فيرجينيا. يشرف أمين مكتبة الكونغرس على وظائف المكتبة، ويحافظ مهندس مبنى الكابيتول على مبانيها. تعد مكتبة الكونجرس من أكبر المكتبات في العالم. «مجموعاتها عالمية ولا تقتصر على الموضوع أو التنسيق أو الحدود الوطنية، وتتضمن مواد بحثية من جميع أنحاء العالم وبأكثر من 450 لغة.»", "mastodon hashtags":[ "mastodon users:ar", "ref" ], "mastodon users":"ماستدون هو برنامج حُر ومفتوح المصدر لتشغيل خدمات الشبكات الاجتماعية ذاتية الاستضافة. يوفر ميزات التدوينات المصغرة المشابهة لخدمة تويتر، يتم تقديم ماستدون من قبل عدد كبير من عقد ماستدون التي يتم تشغيلها بشكل مستقل ، لكل منها قواعد السلوك الخاصة بها، شروط الخدمة ، خيارات الخصوصية وسياسات الإشراف.", - "mdn":"شبكة مطوري موزيلا ‏ ويختصر إلى MDN هو موقع مؤسسة موزيلا الرسمي لوثائق تطوير وأخبار متصفح الويب فيرفكس، وعميل البريد الإلكتروني ثندربرد ومشاريع مؤسسة موزيلا الأخرى.", + "mdn":"شبكة مطوري موزيلا ويختصر إلى MDN هو موقع مؤسسة موزيلا الرسمي لوثائق تطوير وأخبار متصفح الويب فيرفكس، وعميل البريد الإلكتروني ثندربرد ومشاريع مؤسسة موزيلا الأخرى.", "metacpan":"شبكة أرشيف بريل الشاملة (CPAN) تعد مستودعاً لأكثر من 250000 وحدة برمجية وتحتوي على 39000 وثيقة مصاحبة والتوزيع مكتوبة فيها باللغة بيرل البرمجية بواسطة أكثر من12000 مساهم. كما أن سي بي اي إن تشير إلى شبكة الأرشيف أو برنامج بريل الذي يعمل كواجهة للشبكة وكمثبت برنامج ألي كما أن معظم البرامج الموجودة على سي بي اي إن هي برامج حرة ومفتوحة المصدر.", - "microsoft learn":"مايكروسوفت التعليمية ‏ هي مكتبة من الوثائق التقنية والتدريبية و مبادرة استراتيجية من شركة مايكروسوفت للمستخدمين النهائيين، والمطورين،من خلال تقديم مجموعة متنوعة من الموارد التعليمية والدورات التدريبية. قدمت مايكروسوفت التعليمية في سبتمبر 2018. ، نقلت مستندات مايكروسوفت في عام 2022، حلت مكتبة الوثائق التقنية التي كانت قد استبدلت MSDN وTechNet في عام 2016، إلى Microsoft Learn.", + "microsoft learn":"مايكروسوفت التعليمية هي مكتبة من الوثائق التقنية والتدريبية و مبادرة استراتيجية من شركة مايكروسوفت للمستخدمين النهائيين، والمطورين،من خلال تقديم مجموعة متنوعة من الموارد التعليمية والدورات التدريبية. قدمت مايكروسوفت التعليمية في سبتمبر 2018. ، نقلت مستندات مايكروسوفت في عام 2022، حلت مكتبة الوثائق التقنية التي كانت قد استبدلت MSDN وTechNet في عام 2016، إلى Microsoft Learn.", "mojeek":[ "محرك بحث ويب", "wikidata" @@ -246,19 +246,31 @@ "mojeek:ar", "ref" ], - "mullvadleta":"مولفاد ‏ هو مزود شبكة خاصة افتراضية ومقره السويد. إنه يلتزم بسياسة صارمة لعدم الاحتفاظ بالسجلات وسياسة خصوصية شاملة للغاية. لا تجمع مولفاد أي معلومات منك عند التسجيل. بدلاً من ذلك ، يتم إنشاء رقم عشوائي واستخدامه كمعرف خاص بك. تدعم اوبن في بي إن و وايرجارد. ويدعم أيضًا قفزات خادم متعددة مع ميزة التجسير. تقدم مولفاد خدمة جيدة للغاية مع تركيز قوي على الخصوصية.", + "mullvadleta":"مولفاد هو مزود شبكة خاصة افتراضية ومقره السويد. إنه يلتزم بسياسة صارمة لعدم الاحتفاظ بالسجلات وسياسة خصوصية شاملة للغاية. لا تجمع مولفاد أي معلومات منك عند التسجيل. بدلاً من ذلك ، يتم إنشاء رقم عشوائي واستخدامه كمعرف خاص بك. تدعم اوبن في بي إن و وايرجارد. ويدعم أيضًا قفزات خادم متعددة مع ميزة التجسير. تقدم مولفاد خدمة جيدة للغاية مع تركيز قوي على الخصوصية.", "mullvadleta brave":[ "mullvadleta:ar", "ref" ], "naver":"نافير هي منصة كورية جنوبية على الإنترنت تديرها شركة نافير. ظهرت لأول مرة في عام 1999 كأول بوابة ويب في كوريا الجنوبية لتطوير واستخدام محرك البحث الخاص بها. كما كانت أول مشغل في العالم يقدم ميزة البحث الشامل، والتي تجمع نتائج البحث من مختلف الفئات وتقدمها في صفحة واحدة. أضافت نافير منذ ذلك الحين العديد من الخدمات الجديدة التي تتراوح من الميزات الأساسية مثل البريد الإلكتروني والأخبار إلى أول منصة للأسئلة والأجوبة عبر الإنترنت في العالم يعرف ب«نولج ان».", + "naver images":[ + "naver:ar", + "ref" + ], + "naver news":[ + "naver:ar", + "ref" + ], + "naver videos":[ + "naver:ar", + "ref" + ], "niconico":"نيكونيكو (Niconico)‏ هو موقع ويب معروف متخصص بمشاركة الفيديو في اليابان. تديره شركة نيوانغو وهي شركة تابعة لشركة دوانغو. «نيكو نيكو» هو المحاكاة الصوتية اليابانية ليبتسم. هذا هو الثالث عشر الموقع الزار الأكثر في اليابان.", "nixos wiki":[ "nixos wiki:en", "ref" ], - "npm":"مدير نود جي إس للحزم ‏ أكبر نظام تسجيل حزم برمجية، يعد إن بي أم مدير الحزم الافتراضي لبيئة تشغيل جافا سكريبت Node.js. وهو يتكون من واجهة سطر الأوامر وقاعدة بيانات على الإنترنت، تُدعى سجل إن بي أم. كما يتيح موقع إن بي أم تصفح الحزم واستعراضها.", - "odysee":"أوديسي ‏ هي منصة استضافة فيديو غير مركزية أمريكية مبنية على سلسلة كتل ليبيراري ‏. يشير إلى نفسه كبديل للخدمات السائدة مثل يوتيوب ولكن مع التركيز على حرية التعبير واللامركزية.", + "npm":"مدير نود جي إس للحزم أكبر نظام تسجيل حزم برمجية، يعد إن بي أم مدير الحزم الافتراضي لبيئة تشغيل جافا سكريبت Node.js. وهو يتكون من واجهة سطر الأوامر وقاعدة بيانات على الإنترنت، تُدعى سجل إن بي أم. كما يتيح موقع إن بي أم تصفح الحزم واستعراضها.", + "odysee":"أوديسي هي منصة استضافة فيديو غير مركزية أمريكية مبنية على سلسلة كتل ليبيراري. يشير إلى نفسه كبديل للخدمات السائدة مثل يوتيوب ولكن مع التركيز على حرية التعبير واللامركزية.", "openairedatasets":[ "منظمة في اليونان", "wikidata" @@ -267,19 +279,19 @@ "openairedatasets:ar", "ref" ], - "openlibrary":"المكتبة المفتوحة ‏ مشروع على الإنترنت، يضم مكتبة عامة تحتوي على عدد من الكتب الإلكترونية، وهي مفتوحة المصدر، وهو مشروع قابل للتعديل، حيث يمكن لأي شخص المشاركة. ويتضمن الموقع فهارس مكتبية من مكتبات عديدة.", - "openstreetmap":"خريطة الشارع المفتوحة ‏ مشروع تعاوني يهدف إلى إنشاء خرائط منشورة برخصة حرة. تُرسم الخرائط بطريق جمع البيانات الجغرافية بالمسح الأرضي باستخدام مستقبلات نظام التموضع العالمي المحمولة، وكذلك بالاستعانة بمصادر حرة أخرى. يمكن للمستخدمين تحرير المسارات والطرق وتحديثها من خلال وسائل التحرير المتاحة.", + "openlibrary":"المكتبة المفتوحة مشروع على الإنترنت، يضم مكتبة عامة تحتوي على عدد من الكتب الإلكترونية، وهي مفتوحة المصدر، وهو مشروع قابل للتعديل، حيث يمكن لأي شخص المشاركة. ويتضمن الموقع فهارس مكتبية من مكتبات عديدة.", + "openstreetmap":"خريطة الشارع المفتوحة مشروع تعاوني يهدف إلى إنشاء خرائط منشورة برخصة حرة. تُرسم الخرائط بطريق جمع البيانات الجغرافية بالمسح الأرضي باستخدام مستقبلات نظام التموضع العالمي المحمولة، وكذلك بالاستعانة بمصادر حرة أخرى. يمكن للمستخدمين تحرير المسارات والطرق وتحديثها من خلال وسائل التحرير المتاحة.", "peertube":[ "برنامج مجاني لاستعادة السيطرة على مقاطعك الفيديو! مع أكثر من ٦٠٠٬٠٠٠ مقطع فيديو مُستضاف، وشوهد أكثر من ٧٠ مليون مرة و ١٥٠٬٠٠٠ مستخدم، فإن بييرتيوب هو البرنامج المجاني اللامركزي البديل لمنصات الفيديو التي طورتها Framasoft", "https://joinpeertube.org" ], - "pinterest":"بنترست ‏ هي شبكة اجتماعية أمريكية لنشر الصور و الفيديوهات، أُطلقت عام 2010. مبدأ عمل بنترست مختلف قليلاً عن وسائل التواصل الاجتماعي الأخرى. فكل مشترك في بنترست بإمكانه عمل لوحة حائط \"Board\" أو عدة لوحات حائط افتراضية. ثم يقوم المشترك بعد ذلك بتدبيس \"Pin\" أو تعليق صوراً أو مقاطع فيديو يجدها مثيرة لاهتمامه ويرغب بالاحتفاظ بها في أحد لوحات الحائط الخاصة به. وتكون الصور ومقاطع الفيديو مأخوذة من عدة مواقع في الإنترنت ولذلك يكون دوماً هناك رابط إلكتروني يشير إلى مصدر الصورة. في حال ضغط أحد المستخدمين على الصورة، يأخذه الرابط للموقع الذي أُخِذت منه الصورة. وإذا أُعجب مستخدم آخر بالصور أو الفيديوهات التي قمت بتعليقها بإمكانه تدبيس نفس الصورة أو الفيديو في لوحة الحائط الخاصة به وتسمى هذه العملية بإعادة التدبيس أو إعادة التعليق \"Repin\". وبإمكان أي شخص الاطلاع على هذا الموقع والبحث عن الصور فيه ولكن يشترط التسجيل فيه. إذا أراد المستخدم مشاركة الصور أو إبداء الإعجاب ببعضها أو التعليق عليها. تم تأسيس الموقع من قبل بن سيلبرمان، بول سيارا وإيفان شارب. وتتم إدارة الموقع من قبل مختبرات كولد برو أمّا تمويله فهو من قِبَل مجموعة صغيرة من رجال الأعمال والمخترعين.", - "piratebay":"ذا بايرت بي ‏ ، وهو موقع سويدي يُفَهْرِس ملفات التورنت torrent. وصل تصنيفه في يناير 2010 للمرتبة 99 ضمن تصنيف ألكسا ضمن أكثر المواقع زيارةً عالميًا. في 10 لشهر ديسمبر سنه 2014 حُظِّر الموقع، وذلك بعد مداهمة الشرطة السويدية لخوادم الموقع وفي الأول من فبراير 2015 عاد الموقع للعمل بستة نطاقات جديدة.", - "pubmed":"مدلاين ‏ هي قاعدة بيانات ببليوغرافية في علوم الحياة والعلوم الحيوية الطبية. تحتوي على معلومات ببليوغرافية حول المجلات الأكاديمية في علوم الطب والتمريض والصيدلة وطب الأسنان والطب البيطري والرعاية الصحية. كما يحتوي مدلاين على مواضيع في علم الأحياء والكيمياء الحيوية وكذلك مجالات التطور الجزيئي والطب الحيوي.", + "pinterest":"بنترست هي شبكة اجتماعية أمريكية لنشر الصور و الفيديوهات، أُطلقت عام 2010. مبدأ عمل بنترست مختلف قليلاً عن وسائل التواصل الاجتماعي الأخرى. فكل مشترك في بنترست بإمكانه عمل لوحة حائط \"Board\" أو عدة لوحات حائط افتراضية. ثم يقوم المشترك بعد ذلك بتدبيس \"Pin\" أو تعليق صوراً أو مقاطع فيديو يجدها مثيرة لاهتمامه ويرغب بالاحتفاظ بها في أحد لوحات الحائط الخاصة به. وتكون الصور ومقاطع الفيديو مأخوذة من عدة مواقع في الإنترنت ولذلك يكون دوماً هناك رابط إلكتروني يشير إلى مصدر الصورة. في حال ضغط أحد المستخدمين على الصورة، يأخذه الرابط للموقع الذي أُخِذت منه الصورة. وإذا أُعجب مستخدم آخر بالصور أو الفيديوهات التي قمت بتعليقها بإمكانه تدبيس نفس الصورة أو الفيديو في لوحة الحائط الخاصة به وتسمى هذه العملية بإعادة التدبيس أو إعادة التعليق \"Repin\". وبإمكان أي شخص الاطلاع على هذا الموقع والبحث عن الصور فيه ولكن يشترط التسجيل فيه. إذا أراد المستخدم مشاركة الصور أو إبداء الإعجاب ببعضها أو التعليق عليها. تم تأسيس الموقع من قبل بن سيلبرمان، بول سيارا وإيفان شارب. وتتم إدارة الموقع من قبل مختبرات كولد برو أمّا تمويله فهو من قِبَل مجموعة صغيرة من رجال الأعمال والمخترعين.", + "piratebay":"ذا بايرت بي ، وهو موقع سويدي يُفَهْرِس ملفات التورنت torrent. وصل تصنيفه في يناير 2010 للمرتبة 99 ضمن تصنيف ألكسا ضمن أكثر المواقع زيارةً عالميًا. في 10 لشهر ديسمبر سنه 2014 حُظِّر الموقع، وذلك بعد مداهمة الشرطة السويدية لخوادم الموقع وفي الأول من فبراير 2015 عاد الموقع للعمل بستة نطاقات جديدة.", + "pubmed":"مدلاين هي قاعدة بيانات ببليوغرافية في علوم الحياة والعلوم الحيوية الطبية. تحتوي على معلومات ببليوغرافية حول المجلات الأكاديمية في علوم الطب والتمريض والصيدلة وطب الأسنان والطب البيطري والرعاية الصحية. كما يحتوي مدلاين على مواضيع في علم الأحياء والكيمياء الحيوية وكذلك مجالات التطور الجزيئي والطب الحيوي.", "reddit":"ريديت هو مجتمع إخباري على الإنترنت، إلا أنه يعتبر من مواقع مشاركة الروابط ومناقشتها حتى بات يشبه المنتديات، يعرف ريديت بالصفحة الرئيسية للإنترنت.", "reuters":"رويترز هي مؤسسة إخبارية دولية مملوكة لشركة تومسون رويترز. تأسَّست الوكالة في لندن عام 1851 من قِبل الألماني المولد بول رويتر إلى أن استُحوذَ عليها من قِبل شركة تومسون عام 2008 حيث تُشكّل الآن قسم الإعلام في تومسون رويترز. تُوظّف المؤسّسة – التي تُعتبر واحدةً من أكبر وكالات الأنباء في العالم – حوالي 2500 صحفي و600 مصور صحفي في حوالي مائتي موقع حول العالم.", - "rottentomatoes":"روتن توميتوز ‏ وتعني حرفيًا الطماطم الفاسدة، هو موقع ويب مُتَخصّصٌ في تقييماتٍ وأخبارٍ ومعلوماتٍ حولَ الأفلام والمسلسلات، معروفٌ عالمياً بأنه مُجمّع للتقييمات حيث يجمع تقييمَ النُقّاد لأي فيلم أو مسلسل ويعطي متوسط تقييم له إضافة إلى نسبة مئوية بالمراجعات الإيجابية، كما صارَ يَشمَلُ أيضاً تقييماتٍ للمُسلسلات. وعلى الرغم من ارتباط الاسمُ بتقليد تاريخي حيثُ كان الجماهيرُ يرمونَ الطماطم الفاسدة والخضروات على الأداء السيئ في المسرح، إلا أن الاسم كان مستوحى في الأصل من مشهد يظهر الطماطم في فيلم كندي صدر في عام 1992 بعنوان ليولو (Léolo). بدأ الموقِع في عامِ 1998 على يَد ثلاثة طلاب جامعيين يدرسون في جامعة كاليفورنيا، بمدينة ييركيلي، وهم سين دوونج، وباتريك واي لي، وستيفن وانج. وفي 2010 استَحوذَت عليه شَركة Flixster التي مَلَكتْها وارنر برذرز في 2011. ورئيس تحرير الموقع منذ 2007 هو مات آتشي. الموقِعُ مُتَوفّرٌ بِنُسخةٍ بريطانيّة وأستراليّة وهنديّة. وبدءاً مِن يناير 2015 دَخَلَ الموقع ضِمنَ نِطاقِ أشهَر 500 موقع في تصنيفاتِ موقِع أليكسا.", - "rumble":"رامبل ‏ هو موقع صناعة محتويات فيديو كندي. تم تأسيسه في سنة 2013 من قبل كريس بافلوفسكي. بدأ كموقع لنشر فيديوهات عن الحيوانات الأليفة والأطفال الرضع وثم زادت شهرته ليكون منصة بديلة للمحافظين واليمينيين عن يوتيوب. في يوم 11 يناير 2021 رفع الموقع دعوى ضد غوغل بتهمة التلاعب بنتائج البحث عن الموقع واخفائه وطالب بتعويض ملياري دولار على ذلك. يدير الموقع حالياً دان بونجينو.", + "rottentomatoes":"روتن توميتوز وتعني حرفيًا الطماطم الفاسدة، هو موقع ويب مُتَخصّصٌ في تقييماتٍ وأخبارٍ ومعلوماتٍ حولَ الأفلام والمسلسلات، معروفٌ عالمياً بأنه مُجمّع للتقييمات حيث يجمع تقييمَ النُقّاد لأي فيلم أو مسلسل ويعطي متوسط تقييم له إضافة إلى نسبة مئوية بالمراجعات الإيجابية، كما صارَ يَشمَلُ أيضاً تقييماتٍ للمُسلسلات. وعلى الرغم من ارتباط الاسمُ بتقليد تاريخي حيثُ كان الجماهيرُ يرمونَ الطماطم الفاسدة والخضروات على الأداء السيئ في المسرح، إلا أن الاسم كان مستوحى في الأصل من مشهد يظهر الطماطم في فيلم كندي صدر في عام 1992 بعنوان ليولو (Léolo). بدأ الموقِع في عامِ 1998 على يَد ثلاثة طلاب جامعيين يدرسون في جامعة كاليفورنيا، بمدينة ييركيلي، وهم سين دوونج، وباتريك واي لي، وستيفن وانج. وفي 2010 استَحوذَت عليه شَركة Flixster التي مَلَكتْها وارنر برذرز في 2011. ورئيس تحرير الموقع منذ 2007 هو مات آتشي. الموقِعُ مُتَوفّرٌ بِنُسخةٍ بريطانيّة وأستراليّة وهنديّة. وبدءاً مِن يناير 2015 دَخَلَ الموقع ضِمنَ نِطاقِ أشهَر 500 موقع في تصنيفاتِ موقِع أليكسا.", + "rumble":"رامبل هو موقع صناعة محتويات فيديو كندي. تم تأسيسه في سنة 2013 من قبل كريس بافلوفسكي. بدأ كموقع لنشر فيديوهات عن الحيوانات الأليفة والأطفال الرضع وثم زادت شهرته ليكون منصة بديلة للمحافظين واليمينيين عن يوتيوب. في يوم 11 يناير 2021 رفع الموقع دعوى ضد غوغل بتهمة التلاعب بنتائج البحث عن الموقع واخفائه وطالب بتعويض ملياري دولار على ذلك. يدير الموقع حالياً دان بونجينو.", "semantic scholar":"سيمانتك سكولر هو مشروعٌ طُور في معهد ألن للذكاء الاصطناعي، وصدر للجمهور في نوفمبر 2015، وهو مصممٌ ليكون محرك بحث مدعومًا بالذكاء الاصطناعي للمنشورات الأكاديمية. يستخدم المشروع مزيجًا من التعلم الآلي ومعالجة اللغة الطبيعية والرؤية الآلية لإضافة طبقة من التحليل الدلالي إلى الأساليب التقليدية لتحليل الاقتباس واستخراج الأشكال والكيانات والأماكن ذات الصلة من الأوراق. مقارنةً مع جوجل سكولار وببمد، فإنَّ سيمانتك سكولر مصممٌ لإبراز أهم الأوراق والأكثر تأثيرًا، وتحديد الروابط بينهما.", "seznam":[ "شركة تشيكية", @@ -290,17 +302,17 @@ "مستودع تطوير برمجيات", "wikidata" ], - "stackoverflow":"ستاك إكستشينج ‏ هي شبكة من مواقع الأسئلة والأجوبة التي يهتم كل منها باختصاص معين، ويقوم المستخدمون فيها بطرح الأسئلة، الإجابة عليها، وتقييم الأسئلة والأجوبة بشكل تعاوني غير مركزي.", - "steam":"ستيم ‏ هي منصة توزيع رقمي وإدارة حقوق رقمية ولعب جماعي عبر الإنترنت واتصال طورتها شركة فالف. يتم استخدامها لتوزيع الألعاب والوسائط ذات الصلة عبر الإنترنت، من مطورين مستقلين إلى شركات الألعاب الكبرى. في أكتوبر 2012 وسعت فالف الخدمة لتشمل برمجيات غير الألعاب. توفر ستيم المستخدمين إمكانية التثبيت والإدارة التلقائية للبرمجيات عبر أجهزة كمبيوتر متعددة، بالإضافة للميزات الاجتماعية مثل قوائم الأصدقاء والمجموعات، وأيضا التخزين السحابي ووظيفة المحادثة الصوتية والكتابية في الألعاب. يتم توفير واجهة برمجة التطبيقات وتسمى «ستيم ووركز» (Steamworks) والتي تمكن المطورين من الاستفادة منها لدمج العديد من وظائف ستيم داخل منتجاتهم البرمجية، بما في ذلك الحماية من النسخ، والربط بالشبكة، والإنجازات في الألعاب، ودعم المحتوى الذي يتم إنشائه من قبل المستخدمين.", + "stackoverflow":"ستاك إكستشينج هي شبكة من مواقع الأسئلة والأجوبة التي يهتم كل منها باختصاص معين، ويقوم المستخدمون فيها بطرح الأسئلة، الإجابة عليها، وتقييم الأسئلة والأجوبة بشكل تعاوني غير مركزي.", + "steam":"ستيم هي منصة توزيع رقمي وإدارة حقوق رقمية ولعب جماعي عبر الإنترنت واتصال طورتها شركة فالف. يتم استخدامها لتوزيع الألعاب والوسائط ذات الصلة عبر الإنترنت، من مطورين مستقلين إلى شركات الألعاب الكبرى. في أكتوبر 2012 وسعت فالف الخدمة لتشمل برمجيات غير الألعاب. توفر ستيم المستخدمين إمكانية التثبيت والإدارة التلقائية للبرمجيات عبر أجهزة كمبيوتر متعددة، بالإضافة للميزات الاجتماعية مثل قوائم الأصدقاء والمجموعات، وأيضا التخزين السحابي ووظيفة المحادثة الصوتية والكتابية في الألعاب. يتم توفير واجهة برمجة التطبيقات وتسمى «ستيم ووركز» (Steamworks) والتي تمكن المطورين من الاستفادة منها لدمج العديد من وظائف ستيم داخل منتجاتهم البرمجية، بما في ذلك الحماية من النسخ، والربط بالشبكة، والإنجازات في الألعاب، ودعم المحتوى الذي يتم إنشائه من قبل المستخدمين.", "superuser":[ "stackoverflow:ar", "ref" ], "tagesschau":"تاغسشاو هي خدمة إخبارية تلفزيونية وطنية ودولية ألمانية تنتجها هيئة التحرير فيARD-aktuelll لصالح شبكة التلفزيون العامة الألمانية ARD.", - "tineye":"تِن آي ‏ هو محرك البحث للصور وهي خدمة أنشأتها شركة ‏ مقرها في تورونتو كندا. حيث يقوم المستخدم بإرسال الصورة الي الموقع لكي يقوم محرك بالبحث عن مصدرها.", - "vimeo":"فيميو ‏ هي شركة أمريكية مقرها في مدينة نيويورك تقدم منصة لاستضافة مقاطع الفيديو ومشاركتها وخدماتها. يركز فيميو على تقديم فيديو عالي الوضوح عبر مجموعة من الأجهزة. يعتمد نموذج أعمال فيميو على البرمجيات كخدمة (SaaS). تحصل الشركة على الإيرادات من خلال توفير خطط الاشتراك للشركات وصانعي المحتوى. توفر فيميو لمشتركيها أدوات لإنشاء الفيديو وتحريره وبثه، وحلول برامج المؤسسات، كما تعمل المنصة أيضًا على تسهيل الاتصالات بين محترفي الفيديو والعملاء وخبراء الصناعة الآخرين. اعتبارًا من ديسمبر 2021، بلغ عدد مستخدمي الموقع 260 مليون مستخدم، بما في ذلك 1.6 مليون مشترك في خدماته.", + "tineye":"تِن آي هو محرك البحث للصور وهي خدمة أنشأتها شركة مقرها في تورونتو كندا. حيث يقوم المستخدم بإرسال الصورة الي الموقع لكي يقوم محرك بالبحث عن مصدرها.", + "vimeo":"فيميو هي شركة أمريكية مقرها في مدينة نيويورك تقدم منصة لاستضافة مقاطع الفيديو ومشاركتها وخدماتها. يركز فيميو على تقديم فيديو عالي الوضوح عبر مجموعة من الأجهزة. يعتمد نموذج أعمال فيميو على البرمجيات كخدمة (SaaS). تحصل الشركة على الإيرادات من خلال توفير خطط الاشتراك للشركات وصانعي المحتوى. توفر فيميو لمشتركيها أدوات لإنشاء الفيديو وتحريره وبثه، وحلول برامج المؤسسات، كما تعمل المنصة أيضًا على تسهيل الاتصالات بين محترفي الفيديو والعملاء وخبراء الصناعة الآخرين. اعتبارًا من ديسمبر 2021، بلغ عدد مستخدمي الموقع 260 مليون مستخدم، بما في ذلك 1.6 مليون مشترك في خدماته.", "voidlinux":"فويد لينكس هو توزيعة لينكس مستقلة تعمل بنظام إدارة الحزم X Binary Package System (XBPS) ، والذي تم تصميمه وتنفيذه من البداية، نظام تمهيد. باستثناء عمليات النواة الثنائية، يتكون التثبيت الأساسي بالكامل من البرامج المجانية، ولكن يمكن للمستخدمين الوصول إلى مستودع رسمي غير مجاني لتثبيت البرامج الاحتكارية.", - "wikibooks":"ويكي الكتب ‏ هو مشروع شقيق لويكيبيديا وجزء من مشاريع مؤسسة ويكيميديا. وهو ويكي للكتب تستضيفه مؤسسة ويكيميديا لإيجاد كتب ومراجع للاستخدام المجاني الحر يمكن لأي شخص التعديل والإسهام فيها تحت بنود رخصة جنو للوثائق الحرة؛ بدأ المشروع في 10 يوليو 2003 وكان باللغة الإنجليزية فقط، ثم توسع ليشمل إصدارات بلغات أخرى في يوليو 2004، وبدأت النسخة العربية في 12 سبتمبر 2004. واعتبارًا من يناير 2021 أصبح هناك إصدارات من ويكي الكتب بـ76 لغة، تحتوي على 286482 مقالة، وتضم 1490 محررًا نشطًا.", + "wikibooks":"ويكي الكتب هو مشروع شقيق لويكيبيديا وجزء من مشاريع مؤسسة ويكيميديا. وهو ويكي للكتب تستضيفه مؤسسة ويكيميديا لإيجاد كتب ومراجع للاستخدام المجاني الحر يمكن لأي شخص التعديل والإسهام فيها تحت بنود رخصة جنو للوثائق الحرة؛ بدأ المشروع في 10 يوليو 2003 وكان باللغة الإنجليزية فقط، ثم توسع ليشمل إصدارات بلغات أخرى في يوليو 2004، وبدأت النسخة العربية في 12 سبتمبر 2004. واعتبارًا من يناير 2021 أصبح هناك إصدارات من ويكي الكتب بـ76 لغة، تحتوي على 286482 مقالة، وتضم 1490 محررًا نشطًا.", "wikicommons.audio":[ "wikicommons.images:ar", "ref" @@ -309,7 +321,7 @@ "wikicommons.images:ar", "ref" ], - "wikicommons.images":"ويكيميديا كومنز أو ويكي كومنز ‏ هو أحد مشاريع مؤسسة ويكيميديا هو مخزن الوسائط المتعددة مفتوحة المصدر مثل الصور وملفات الصوت وملفات الوسائط المتعددة الأخرى بحيث يمكن استخدامها في أي مشروع من مشاريع ويكيميديا. وفي أي لغة من لغات ويكيبيديا، أو تحميلها للاستخدام خارج ويكيميديا.", + "wikicommons.images":"ويكيميديا كومنز أو ويكي كومنز هو أحد مشاريع مؤسسة ويكيميديا هو مخزن الوسائط المتعددة مفتوحة المصدر مثل الصور وملفات الصوت وملفات الوسائط المتعددة الأخرى بحيث يمكن استخدامها في أي مشروع من مشاريع ويكيميديا. وفي أي لغة من لغات ويكيبيديا، أو تحميلها للاستخدام خارج ويكيميديا.", "wikicommons.videos":[ "wikicommons.images:ar", "ref" @@ -321,25 +333,25 @@ "wikisource":"ويكي مصدر هي مكتبة رقمية متصلة بالشبكة العنكبوتية مفتوحة للجميع، ويمكن تحميلها على شكل ملف pdf.في هذا المشروع العربي تضم 79٬518 صفحة حتى تاريخ 2020 من الرسائل الأدبية، والكتب والنصوص الدينية والتراثية والتاريخية، والشعر. بدأت ويكي مصدر في نوفمبر 2003 كمجموعة للنصوص الحرة الداعمة لمقالات ويكيبيديا المشروع الأساسي لمؤسسة ويكيميديا. سميت في أول الأمر مشروع سورس بيرغ كمحاولةٍ لنحت اسم ما يعرف بمشروع غوتنبرغ، ثمّ تغيّر اسم المشروع في 6 ديسمبر 2003 إلى ويكي المصدر. وهو مشروع مؤسسة ويكيميديا لجمع وتخزين نصوص الملكية العامة المنشورة سابقًا أو النصوص الحرة التي نفدت حقوق طبعها أو المترجمة ومتوفرة بعدة لغات. انتقل المشروع إلى عنوان موقعه الدائم في 23 يوليو 2004.", "wikispecies":"ويكي أنواع هو أحد مشاريع مؤسسة ويكيميديا، وهو يهدف إلى إنشاء دليل بكل أنواع الكائنات. بدأ المشروع في 13 سبتمبر 2004.", "wikiversity":"ويكي الجامعة هو أحد مشاريع مؤسسة ويكيميديا، يهدف إلى دعم التعليم الحر واستضافة مواد تعليمية مجانية. المشروع بدأ في 15 أغسطس 2006؛ وبدأت النسخة العربية منه في 12 يوليو 2011.", - "wikivoyage":"ويكي الرحلات ‏ هي دليل سياحي على شبكة الإنترنت، كتب بطريقة تشاركية من عدد من الكتاب المتطوعين، ومحتواه هو تحت رخصة حرة.", + "wikivoyage":"ويكي الرحلات هي دليل سياحي على شبكة الإنترنت، كتب بطريقة تشاركية من عدد من الكتاب المتطوعين، ومحتواه هو تحت رخصة حرة.", "wiktionary":"ويكاموس هو مشروع مُتعدد اللغات، أحد مشاريع مؤسسة ويكيميديا على شبكة الإنترنت يهدف إلى إيجاد قاموس حر بلغة الويكي لكل اللغات. يتم تحريرها بشكل تعاوني عن طريق ويكي، وهو متاح في 172 لغة من بينها العربية. مُعظم مفردات اللغة في ويكاموس توفر تعريفات وترجمات للكلمات إلى لغات عديدة، وبعض المفردات متصلة بمعلومات إضافية موجودة عادة في المكنز أو المعجم اللغوي، كما تضم مرادفات الكلمة.", - "wolframalpha":"ولفرام ألفا ‏، هو محرك بحث أطلق عند الساعة الثالثة من صباح 16 مايو 2009. على خلاف محركات البحث التقليدية، فإن ولفرام يقوم بالإجابة عن الأسئلة التي تطرح عليه في حين تقوم البواحيث التقليدية بمجرد عرض قائمة من مواقع الإنترنت ذات العلاقة بالكلمات المفتاحية التي يتم البحث عبرها.", + "wolframalpha":"ولفرام ألفا ، هو محرك بحث أطلق عند الساعة الثالثة من صباح 16 مايو 2009. على خلاف محركات البحث التقليدية، فإن ولفرام يقوم بالإجابة عن الأسئلة التي تطرح عليه في حين تقوم البواحيث التقليدية بمجرد عرض قائمة من مواقع الإنترنت ذات العلاقة بالكلمات المفتاحية التي يتم البحث عبرها.", "wttr.in":[ "Des Moines, Iowa, United States تقرير حالة ألطقس", "https://wttr.in" ], - "yacy":"ياسي ‏ – هو محرك بحثي موزع يستخدم بالمجان، مبني علي مبادئ شبكة النظير للنظير. محتوى المحرك عبار عن برنامج مكتوب بلغة الجافا موزع على العديد من الحواسب الالية في شهر سبتمبر 2006 وكان يسمى ب «نظراء الياسي» كل نظير بمفرده يبحث في شبكة الإنترنت، يحلل ويسجل الصفحات التي وجدت ويخزن التسجيلات في قاعدة بيانات مشتركة بين الاخرون طبقا لمبادئ شبكة النظير للنظير. هو محرك بحث لأي شخص ويمكنه بناء مدخل بحثي لشبكته الداخلية ومساعدته في البحث على الإنترنت العام.", + "yacy":"ياسي – هو محرك بحثي موزع يستخدم بالمجان، مبني علي مبادئ شبكة النظير للنظير. محتوى المحرك عبار عن برنامج مكتوب بلغة الجافا موزع على العديد من الحواسب الالية في شهر سبتمبر 2006 وكان يسمى ب «نظراء الياسي» كل نظير بمفرده يبحث في شبكة الإنترنت، يحلل ويسجل الصفحات التي وجدت ويخزن التسجيلات في قاعدة بيانات مشتركة بين الاخرون طبقا لمبادئ شبكة النظير للنظير. هو محرك بحث لأي شخص ويمكنه بناء مدخل بحثي لشبكته الداخلية ومساعدته في البحث على الإنترنت العام.", "yacy images":[ "yacy:ar", "ref" ], "yahoo news":"ياهو! نيوز بالإنجليزية موقع أخباري تابع لشركة ياهو الأمريكية تقوم بجمع الأخبار من جميع الوكلات والصحف ووضعها في الموقع.", - "youtube":"يوتيوب ‏ هو موقع ويب أمريكي يسمح لمستخدميه برفع، بث، ومشاركة التسجيلات المرئية مجانًا، بالإضافة إلى إمكانية التعليق والتفاعل مع المحتوى. تأسس الموقع في 14 فبراير 2005 على يد تشاد هيرلي وستيف تشين وجاود كريم، وهم ثلاثة موظفين سابقين في شركة باي بال، وكان مقره في مدينة سان برونو، كاليفورنيا. في البداية، اعتمد يوتيوب على تقنية أدوبي فلاش لعرض الفيديوهات، لكنه انتقل لاحقًا إلى تقنية إتش تي إم إل 5 الأكثر حداثة.", + "youtube":"يوتيوب هو موقع ويب أمريكي يسمح لمستخدميه برفع، بث، ومشاركة التسجيلات المرئية مجانًا، بالإضافة إلى إمكانية التعليق والتفاعل مع المحتوى. تأسس الموقع في 14 فبراير 2005 على يد تشاد هيرلي وستيف تشين وجاود كريم، وهم ثلاثة موظفين سابقين في شركة باي بال، وكان مقره في مدينة سان برونو، كاليفورنيا. في البداية، اعتمد يوتيوب على تقنية أدوبي فلاش لعرض الفيديوهات، لكنه انتقل لاحقًا إلى تقنية إتش تي إم إل 5 الأكثر حداثة.", "yummly":[ "تطبيق محمول", "wikidata" ], - "z-library":"مكتبة-زد ‏ هو مشروعshadow library لمشاركه الملفات للوصول إلى مقالات العلميه والنصوص الادبيه وكتب المصالح العامه. ونشآت كمرآه لLibrary Genesis،و اغلبيه كتبها من Library Genesis." + "z-library":"مكتبة-زد هو مشروعshadow library لمشاركه الملفات للوصول إلى مقالات العلميه والنصوص الادبيه وكتب المصالح العامه. ونشآت كمرآه لLibrary Genesis،و اغلبيه كتبها من Library Genesis." }, "bg":{ "1337x":"1337x е уебсайт за споделяне на файлове чрез метода peer-to-peer посредством протокола BitTorrent. Към 2022 г. това е третият най-популярен торент тракер. Създаден е през 2007 г. С нарастващата му популярност десетки търсачки го премахват от резултатите си. Поради естеството на услугата, която предоставя, не са рядкост и правните действия към уебсайта, както и временните прекъсвания на функционалността.", @@ -653,6 +665,18 @@ ], "mastodon users":"মাস্টোডন হল স্ব-হোস্ট করা সামাজিক নেটওয়ার্কিং পরিষেবাগুলি চালানোর জন্য একটি বিনামূল্যের এবং ওপেন-সোর্স সফ্টওয়্যার৷ নিজস্ব আচরণবিধি, পরিষেবার শর্তাবলী, গোপনীয়তা নীতি, গোপনীয়তার বিকল্প এবং বিষয়বস্তু সংযম নীতি।", "naver":"নেইভার একটি দক্ষিণ কোরীয় ইন্টারনেট ভিত্তিমঞ্চ। কোরিয়ার নেইভার কর্পোরেশন এটির পরিচালক। ১৯৯৯ সালে দক্ষিণ কোরিয়ার স্ব-উদ্ভাবিত অনুসন্ধান ইঞ্জিন ব্যবহারকারী প্রথম আন্তর্জাল প্রবেশদ্বার হিসেবে এটি যাত্রা শুরু করে। এটি ছিল বিশ্বের প্রথম পূর্ণাঙ্গ অনুসন্ধান সুবিধা প্রদানকারী ওয়েবসাইট, যেখানে বিভিন্ন শ্রেণীর অনুসন্ধান ফলাফল সংকলিত একটিমাত্র ফলাফল পাতায় সেগুলিকে প্রকাশ করা হত। এরপর নেইভার আরও বেশ কিছু নতুন সেবা যোগ করেছে, যাদের মধ্যে বৈদ্যুতিন ডাক (ই-মেইল) ও সংবাদের মতো প্রাথমিক সুবিধাগুলি থেকে শুরু করে বিশ্বের প্রথম ইন্টারনেটভিত্তিক প্রশ্নোত্তর ভিত্তিমঞ্চ \"নলেজ ইন\" অন্তর্ভুক্ত।", + "naver images":[ + "naver:bn", + "ref" + ], + "naver news":[ + "naver:bn", + "ref" + ], + "naver videos":[ + "naver:bn", + "ref" + ], "nixos wiki":[ "nixos wiki:en", "ref" @@ -878,6 +902,18 @@ "portal web sud-coreà", "wikidata" ], + "naver images":[ + "naver:ca", + "ref" + ], + "naver news":[ + "naver:ca", + "ref" + ], + "naver videos":[ + "naver:ca", + "ref" + ], "nixos wiki":[ "nixos wiki:en", "ref" @@ -1076,11 +1112,23 @@ "mastodon users:cs", "ref" ], - "mastodon users":"Mastodon je sociální síť podobná známější síti X. Na rozdíl od většiny sociálních sítí je Mastodon open source a každý si může založit svoji vlastní instanci. Každá instance má vlastní podmínky užívání, ochrany soukromí a pravidel pro příspěvky; zároveň je propojená s ostatními instancemi, a je tedy možné se na ně připojit pomocí jednoho účtu.", + "mastodon users":"Mastodon je sociální síť podobná síti X. Na rozdíl od většiny sociálních sítí je Mastodon open source a každý si může založit svoji vlastní instanci. Každá instance má vlastní podmínky užívání, ochrany soukromí a pravidel pro příspěvky; zároveň je propojená s ostatními instancemi, a je tedy možné se na ně připojit pomocí jednoho účtu.", "mdn":"MDN Web Docs jsou webové stránky provozované Mozilla Foundation, které obsahují dokumentaci k projektům založených na Mozille jako Firefox či Thunderbird a webových standardům a technologiím. Veškerý editovatelný obsah je ukládán v Git repozitáři na GitHub.com, který umožňuje každému uživateli navrhovat úpravy a diskutovat změny. Server byl založen v roce 2005 pod názvem Mozilla Developer Center a část jeho obsahu pocházela z dnes již zrušeného serveru Netscape DevEdge.", "metacpan":"CPAN je softwarový repozitář obsahující jednak moduly pro programovací jazyk Perl a jednak aplikace napsané v tomto jazyce. První myšlenky k jeho zřízení se objevily už v roce 1993 inspirované repozitářem CTAN typografického systému TeX, ale do provozu byl oficiálně uveden až v roce 1995. Jméno CPAN nese kromě samotného repozitáře i perlový program, který slouží k stažení a instalaci modulů. Kromě toho je možné do repozitáře přistupovat i přes webové rozhraní, kde je například možné i bez instalace číst dokumentaci patřičného modulu generovanou ze standardního formátu POD.", "microsoft learn":"Microsoft Learn je webový portál a elektronická knihovna technické dokumentace a školení pro koncové uživatele, vývojáře a IT profesionály, kteří pracují s produkty společnosti Microsoft. Microsoft Learn byl veřejnosti představen v září 2018. V roce 2022 byla původní knihovna technické dokumentace, která se jmenovala Microsoft Docs, a která v roce 2016 nahradila MSDN a Microsoft TechNet, přesunuta do elektronické knihovny Microsoft Learn.", "naver":"Naver je jihokorejská online platforma provozovaná společností Naver Corporation. Debutoval v roce 1999 jako první webový portál v Jižní Koreji. Byl také prvním operátorem na světě, který zavedl funkci komplexního vyhledávání, která sestavuje výsledky vyhledávání z různých kategorií a prezentuje je na jediné stránce. Naver od té doby přidal množství nových služeb, od základních funkcí, jako je e-mail a zprávy, až po světově první online platformu otázek a odpovědí Knowledge iN.", + "naver images":[ + "naver:cs", + "ref" + ], + "naver news":[ + "naver:cs", + "ref" + ], + "naver videos":[ + "naver:cs", + "ref" + ], "npm":"npm je správce balíčků pro JavaScript, výchozí správce balíčků pro prostředí Node.js.", "odysee":"Odysee je americká decentralizovaná platforma pro sdílení videa postavená na blockchainu LBRY. Staví se jako alternativa k hlavním webům pro sdílení videí, ale s důrazem na svobodu slova a decentralizaci.", "openlibrary":"Open Library je internetová databáze knih. Je provozována v rámci projektu Internet Archive a její ambicí je mít informace o úplně všech vydaných knihách. Podporuje různé klasifikace, například ISBN, Deweyův desetinný systém DDC nebo klasifikaci LCC podle Kongresové knihovny.", @@ -1430,10 +1478,10 @@ "alpine linux packages":"Alpine Linux ist eine auf musl und BusyBox basierende Linux-Distribution, die in erster Linie für „Power-User entwickelt wurde, die Sicherheit, Einfachheit und Ressourceneffizienz schätzen“. Sie verwendet einen gehärteten Kernel und kompiliert alle Programme des Benutzerraums standardmäßig als position-independent Code mit Schutz vor Pufferüberlauf. Seit 2016 wird bei Docker, einer Software für Containervirtualisierung, überwiegend Alpine Linux als virtuelles Betriebssystem der Container eingesetzt. Hierdurch stieg das allgemeine Interesse an der Distribution erheblich, außerdem entstanden personelle Verflechtungen. Ein Fork von Alpine Linux, postmarketOS, wurde entwickelt, um auf mobilen Geräten zu laufen.", "annas archive":"Anna’s Archive ist eine kostenfrei nutzbare Metasuchmaschine für Schattenbibliotheken. Als solche bietet sie freien Zugang zu Büchern, wissenschaftlichen Aufsätzen, Comics und Zeitschriften. Die Website wird von einem anonymen Team von Archivaren betrieben, die sich Anna und das „Pirate Library Mirror (PiLiMi) team“ nennen, und finanziert sich über Spenden. Nach eigenen Angaben stehen Metadaten zu über 120 Millionen Werken zur Verfügung.", "ansa":"Die Agenzia Nazionale Stampa Associata (ANSA) ist eine italienische Nachrichten- und Presseagentur, die am 15. Januar 1945 in Rom gegründet wurde. Sie ist eine Genossenschaft aus 30 assoziierten Verlagen und 43 Tageszeitungen Italiens und gilt als führende Nachrichtenagentur Italiens vor Adnkronos und AGI.", - "apple app store":"Der App Store ist eine digitale Vertriebsplattform für Anwendungssoftware vom US-amerikanischen Unternehmen Apple. Die Plattform wurde 2008 eingeführt und bietet Mobile Apps für iOS- und iPadOS-Geräte und Software für tvOS und watchOS.", + "apple app store":"Der App Store ist eine digitale Vertriebsplattform für Anwendungssoftware vom US-amerikanischen Unternehmen Apple. Die Plattform wurde 2008 eingeführt und bietet Mobile Apps für iOS- und iPadOS-Geräte, Software für tvOS, watchOS und visionOS, sowie Anwendungen für macOS.", "apple maps":"Apple Karten ist ein Kartendienst von Apple, der im September 2012 mit dem hauseigenen Betriebssystem iOS 6 gestartet wurde. Die iOS-eigene Anwendung Karten ist die lokalisierte Anwendung für den Kartendienst auf dem iPhone, iPad und iPod touch. Seit OS X Mavericks ist die Anwendung Karten auch auf dem Mac vorinstalliert.", "artic":"Das Art Institute of Chicago ist ein 1866 gegründetes Kunstmuseum, verbunden mit der seit 1866 tätigen Kunsthochschule, 1882 umbenannt in School of the Art Institute of Chicago (SAIC) in Chicago, Illinois, (USA).", - "arxiv":"arXiv.org ist ein Dokumentenserver für Preprints aus den Bereichen Physik, Mathematik, Informatik, Statistik, Finanzmathematik und Biologie. Ausgesprochen wird arXiv als „archive“ (englisch), wobei das X für das griechische χ steht.", + "arxiv":"arXiv.org ist eine kuratierte digitale Plattform zum Austausch von Forschungsergebnissen aus den Bereichen Physik, Mathematik, Informatik, Statistik, Finanzmathematik, Biologie, Elektroingenieurwesen und Systemwissenschaft sowie Wirtschaftswissenschaften. Ausgesprochen wird arXiv als „archive“ (englisch), wobei das X für das griechische χ steht.", "ask":"Ask.com ist ein Internetportal, das ursprünglich als Suchmaschine funktionierte, inzwischen aber nur noch Antworten aus einem festen Frage-Antwort-Reservoir generiert.", "askubuntu":[ "stackoverflow:de", @@ -1615,6 +1663,18 @@ "https://www.moviepilot.de" ], "naver":"Naver ist ein südkoreanisches Webportal, das 1999 entwickelt wurde. Es umfasst eine Suchmaschine und diverse weitere Dienste.", + "naver images":[ + "naver:de", + "ref" + ], + "naver news":[ + "naver:de", + "ref" + ], + "naver videos":[ + "naver:de", + "ref" + ], "niconico":"Nico Nico Douga ist ein japanischer Videoportal- und Livestream-Anbieter, der von Niwango geleitet wird. Seine Spitznamen sind Nico Nico und Nico-dō, wobei nikoniko das japanische Ideophon (Gitaigo) für „lächeln“ ist und dōga für „Video“ steht. Nico Nico Douga ist die am neuntmeisten besuchte Website in Japan. Die Seite hat 2007 den Japanese Good Design Award gewonnen und eine Anerkennung in der Kategorie Digital Communities beim Prix Ars Electronica 2008.", "npm":"npm ist ein Paketmanager für die JavaScript-Laufzeitumgebung Node.js. npm wurde 2010 von Isaac Schlueter als Mitarbeiter des kalifornischen Cloud-Plattform-Anbieters Joyent programmiert. 2014 gründete er die „npm, inc.“", "odysee":"Odysee ist eine amerikanische, dezentralisierte Videoplattform, die auf der LBRY Blockchain basiert. Sie positioniert sich als Alternative zu Diensten wie YouTube mit einem Fokus auf freie Meinungsäußerung und Dezentralisierung.", @@ -2006,7 +2066,7 @@ "ref" ], "deezer":"Deezer is a French music streaming service and media service provider founded in 2007 that provides users with access to a vast library of music tracks, podcasts, and radio stations. It offers streaming services in over 180 countries and features a catalog of more than 90 million licensed tracks, making it one of the largest streaming platforms available. Deezer is available on various devices, including Android, iOS, macOS and others. The company is 41.4% owned by the Access Industries investment fund since 2016, 8.1% by Orange Group and 4.5% by the Pinault family through Artémis Group.", - "deviantart":"DeviantArt is an American online community that features artwork, videography, photography, and literature, launched on August 7, 2000, by Angelo Sotira, Scott Jarkoff, and Matthew Stephens, among others.", + "deviantart":"DeviantArt is an American online community that features artwork, videography, photography, and literature, launched on August 7, 2000, by Mathew Stephens, Scott Jarkoff and Angelo Sotira, among others.", "discuss.python":"Discourse is an open source Internet forum system released on August 26, 2014. It was founded by Jeff Atwood, Robin Ward, and Sam Saffron.", "docker hub":[ "hosting service for Docker repository", @@ -2037,6 +2097,10 @@ "wikidata" ], "emojipedia":"Emojipedia is an emoji reference website which documents the meaning and common usage of emoji characters in the Unicode Standard. Most commonly described as an emoji encyclopedia or emoji dictionary, Emojipedia also publishes articles and provides tools for tracking new emoji characters, design changes and usage trends. It has been owned by Zedge since 2021.", + "encyclosearch":[ + "Search over two dozen encyclopedias at once with EncycloSearch! EncycloSearch is an ad-free, open-source encyclopedia search engine and reader. Supported by the Knowledge Standards Foundation.", + "https://encyclosearch.org" + ], "erowid":"Erowid, also called Erowid Center, is a non-profit educational organization that provides information about psychoactive plants and chemicals.", "etymonline":"Etymonline, or Online Etymology Dictionary, sometimes abbreviated as OED, is a free online dictionary that describes the origins of English words, written and compiled by Douglas R. Harper.", "fdroid":"F-Droid is a free and open source app store and software repository for Android, serving a similar function to the Google Play store. The main repository, hosted by the project, contains only free and open source apps. Applications can be browsed, downloaded and installed from the F-Droid website or client app without the need to register an account. \"Anti-features\" such as advertising, user tracking, or dependence on non-free software are flagged in app descriptions.", @@ -2068,7 +2132,7 @@ "google":"Google Search is a search engine operated by Google. It allows users to search for information on the Web by entering keywords or phrases. Google Search uses algorithms to analyze and rank websites based on their relevance to the search query. It is the most popular search engine worldwide.", "google images":"Google Images is a search engine owned by Gsuite that allows users to search the World Wide Web for images. It was introduced on July 12, 2001, due to a demand for pictures of the green Versace dress of Jennifer Lopez worn in February 2000. In 2011, Gsuite image search functionality was added.", "google news":"Google News is a news aggregator service developed by Google. It presents a continuous flow of links to articles organized from thousands of publishers and magazines.", - "google play apps":"Google Play, also known as the Google Play Store or the Play Store, is a digital distribution service operated and developed by Google. It serves as the official app store for certified devices running on the Android operating system and its derivatives, as well as ChromeOS, allowing users to browse and download applications developed with the Android software development kit and published through Google. Google Play has also served as a digital media store, with it offering various media for purchase such as books, movies, musical singles, television programs, and video games.", + "google play apps":"Google Play, also known as the Google Play Store, Play Store, or sometimes the Android Store, is a digital distribution service operated and developed by Google. It serves as the official app store for certified devices running on the Android operating system and its derivatives, as well as ChromeOS, allowing users to browse and download applications developed with the Android software development kit and published through Google. Google Play has also served as a digital media store, with it offering various media for purchase such as books, movies, musical singles, television programs, and video games.", "google play movies":[ "google play apps:en", "ref" @@ -2091,14 +2155,10 @@ "huggingface:en", "ref" ], - "il post":"Il Post is an Italian online daily newspaper, founded and directed in 2010 by Luca Sofri. The editorial staff includes assistant editors Francesco Costa and Elena Zacchetti and journalists Arianna Cavallo, Luca Misculin, Giulia Balducci and Emanuele Menietti, as well as contributions from Luca Sofri and a number of other collaborators.", - "imdb":"The Internet Movie Database (IMDb) is an online database of information related to films, television series, podcasts, home videos, video games, and streaming content online – including cast, production crew and personal biographies, plot summaries, trivia, ratings, and fan and critical reviews. IMDb began as a fan-operated movie database on the Usenet group \"rec.arts.movies\" in 1990, and moved to the Web in 1993. Since 1998, it has been owned and operated by IMDb.com, Inc., a subsidiary of Amazon.", + "il post":"Il Post is an Italian online daily newspaper, founded in 2010 by Luca Sofri and directed by Francesco Costa. The editorial staff includes assistant editors Francesco Costa and Elena Zacchetti and journalists Arianna Cavallo, Luca Misculin, Giulia Balducci and Emanuele Menietti, as well as contributions from Luca Sofri and a number of other collaborators.", + "imdb":"IMDb, historically known as the Internet Movie Database, is an online database of information related to films, television series, podcasts, home videos, video games, and streaming content online – including cast, production crew and personal biographies, plot summaries, trivia, ratings, and fan and critical reviews. IMDb began as a fan-operated movie database on the Usenet group \"rec.arts.movies\" in 1990, and moved to the Web in 1993. Since 1998, it has been owned and operated by IMDb.com, Inc., a subsidiary of Amazon.", "imgur":"Imgur is an American online image sharing and image hosting service with a focus on social gossip that was founded by Alan Schaaf in 2009. The service has hosted viral images and memes, particularly those posted on Reddit.", "ina":"The Institut national de l'audiovisuel is a repository of all French radio and television audiovisual archives. Additionally it provides free access to archives of countries such as Afghanistan and Cambodia. It has its headquarters in Bry-sur-Marne.", - "invidious":[ - "Invidious Instances", - "https://api.invidious.io/" - ], "ipernity":[ "The worlds largest non-commercial photo, video and blog sharing community - financed only by membership dues, without any intention of making a profit.", "https://www.ipernity.com" @@ -2127,7 +2187,7 @@ "https://lib.rs" ], "library genesis":"Library Genesis is a shadow library project for file-sharing access to scholarly journal articles, academic and general-interest books, images, comics, audiobooks, and magazines. The site enables free access to content that is otherwise paywalled or not digitized elsewhere. LibGen describes itself as a \"links aggregator\", providing a searchable database of items \"collected from publicly available public Internet resources\" as well as files uploaded \"from users\". The URL libgen.is was down in January to March of 2025.", - "library of congress":"The Library of Congress (LOC) is a research library in Washington, D.C., serving as the library and research service for the United States Congress and the de facto national library of the United States. It also administers copyright law through the United States Copyright Office.", + "library of congress":"The Library of Congress (LOC) is a research library in Washington, D.C., serving as the library and research service for the United States Congress and the de facto national library of the United States. It also administers copyright law through the United States Copyright Office, and it houses the Congressional Research Service.", "libretranslate":[ "Free and Open Source Machine Translation API. Free to download, offline capable and easy to setup. Run your own API server in just a few minutes.Free and Open Source Machine Translation API. Free to download, offline capable and easy to setup. Run your own API server in just a few minutes.", "https://libretranslate.com" @@ -2185,6 +2245,18 @@ "https://mymemory.translated.net/" ], "naver":"Naver is a South Korean online platform operated by the Naver Corporation. The company's products include a search engine, email hosting, blogs, maps, and mobile payment.", + "naver images":[ + "naver:en", + "ref" + ], + "naver news":[ + "naver:en", + "ref" + ], + "naver videos":[ + "naver:en", + "ref" + ], "niconico":"Niconico, Inc. , known before 2012 as Nico Nico Douga , is a Japanese video sharing service based in Tokyo, Japan. \"Niconico\" or \"nikoniko\" is the Japanese ideophone for smiling. As of 2021, Niconico is the 34th most-visited website in Japan, according to Alexa Internet.", "nixos wiki":[ "NixOS Wiki - NixOS Wiki", @@ -2260,7 +2332,7 @@ ], "pubmed":"MEDLINE is a bibliographic database of life sciences and biomedical information. It includes bibliographic information for articles from academic journals covering medicine, nursing, pharmacy, dentistry, veterinary medicine, and health care. MEDLINE also covers much of the literature in biology and biochemistry, as well as fields such as molecular evolution.", "pypi":"The Python Package Index, abbreviated as PyPI and also known as the Cheese Shop, is the official third-party software repository for Python. It is analogous to the CPAN repository for Perl and to the CRAN repository for R. PyPI is run by the Python Software Foundation, a charity. Some package managers, including pip, use PyPI as the default source for packages and their dependencies.", - "quark":"Shenma Inc. is a \"mobile-first\" search engine for China that was launched in April 2014. It is a joint venture between Alibaba Group and UCWeb. In April 2017, according to China Internet Watch, Shenma had an 8.8% of the China search engine market share, which made it the second most used search engine after Baidu. Shenma comes with UC Browser, a mobile browser with an estimated 20% share of China's browser market and over 30% of China's mobile browser marketshare. Shenma search was co-founded as a mobile search engine by UCWeb and Alibaba in 2013. In 2014, Alibaba acquired UCWeb.", + "quark":"Shenma Inc. is a \"mobile-first\" search engine for China that was launched in April 2014. It is a joint venture between Alibaba Group and UCWeb.", "quark images":[ "quark:en", "ref" @@ -2282,7 +2354,7 @@ "online database of internet radio stations", "wikidata" ], - "reddit":"Reddit is an American proprietary social news aggregation and forum social media platform. Registered users submit content to the site such as links, text posts, images, and videos, which are then voted up or down by other members. Posts are organized by subject into user-created boards called \"subreddits\". Submissions with more upvotes appear towards the top of their subreddit and, if they receive enough upvotes, ultimately on the site's front page. Reddit administrators moderate the communities. Moderation is also conducted by community-specific moderators, who are unpaid volunteers. It is operated by Reddit Inc., based in San Francisco.", + "reddit":"Reddit is an American proprietary social news aggregation and forum social media platform. Registered users submit content to the site such as links, text posts, images, and videos, which are then voted up or down by other members. Posts are organized by subject into user-created boards called \"subreddits\". Submissions with more upvotes appear towards the top of their subreddit and, if they receive enough upvotes, ultimately on the site's front page. Reddit administrators moderate the communities. Moderation is also conducted by community-specific moderators, who are unpaid volunteers. It is operated by Reddit, Inc., based in San Francisco.", "reuters":"Reuters is a news agency owned by Thomson Reuters. It employs around 2,500 journalists and 600 photojournalists in about 200 locations worldwide writing in 16 languages. Reuters is one of the largest news agencies in the world.", "rottentomatoes":"Rotten Tomatoes is an American review-aggregation website for film and television. The company was launched in August 1998 by three undergraduate students at the University of California, Berkeley: Senh Duong, Patrick Y. Lee, and Stephen Wang. Although the name \"Rotten Tomatoes\" connects to the practice of audiences throwing rotten tomatoes in disapproval of a poor stage performance, the direct inspiration for the name from Duong, Lee, and Wang came from an equivalent scene in the 1992 Canadian film Léolo.", "rubygems":"RubyGems is a package manager for the Ruby programming language that provides a standard format for distributing Ruby programs and libraries, a tool designed to easily manage the installation of gems, and a server for distributing them. It was created by Chad Fowler, Jim Weirich, David Alan Black, Paul Brannan and Richard Kilmer in 2004.", @@ -2332,7 +2404,7 @@ "wikidata" ], "stackoverflow":"Stack Exchange is a network of question-and-answer (Q&A) websites on topics in diverse fields, each site covering a specific topic, where questions, answers, and users are subject to a reputation award process. The reputation system allows the sites to be self-moderating. Currently, Stack Exchange is composed of 173 communities bringing in over 100 million unique visitors each month. As of February 2025 the three most active sites in the network are Stack Overflow, Mathematics, and Ask Ubuntu.", - "startpage":"Startpage is a Dutch search engine company that highlights privacy as its distinguishing feature. The website advertises that it allows users to obtain Bing Search and Google Search results while protecting users' privacy by not storing personal information or search data and removing all trackers. Startpage.com also includes an Anonymous View browsing feature that allows users the option to open search results via proxy for increased anonymity.", + "startpage":"Startpage.com is a Dutch search engine website that highlights privacy as its distinguishing feature. The website advertises that it allows users to obtain Bing Search and Google Search results while protecting users' privacy by not storing personal information or search data and removing all trackers. Startpage.com also includes an Anonymous View browsing feature that allows users the option to open search results via proxy for increased anonymity. Startpage is owned and operated by Surfboard Holding BV, The Hague, the Netherlands.", "startpage images":[ "startpage:en", "ref" @@ -2361,7 +2433,11 @@ "https://www.tokyotosho.info/" ], "unsplash":"Unsplash is a website dedicated to proprietary stock photography. Since 2021, it has been owned by Getty Images. The website claims over 330,000 contributing photographers and generates more than 13 billion photo impressions per month on their growing library of over 5 million photos. Unsplash has been cited as one of the world's leading photography websites by Forbes, Design Hub, CNET, Medium and The Next Web.", - "vimeo":"Vimeo, Inc. is an American video hosting, sharing, and services provider founded in 2004 and headquartered in New York City. Vimeo focuses on the delivery of high-definition video across a range of devices and operates on a software as a service (SaaS) business model. The platform provides tools for video creation, editing, and broadcasting along with enterprise software solutions and the means for video professionals to connect with clients and other professionals. As of December 2021, the site has 260 million users, with around 1.6 million subscribers to its services.", + "uxwing":[ + "Exclusive Free icons SVG images easily copy paste SVG code or download SVG vector & PNG for commercial use no attribution required. You can use this icons library for websites, PowerPoint, applications, Android, etc", + "https://uxwing.com" + ], + "vimeo":"Vimeo is an American video hosting, sharing, and services provider founded in 2004 and headquartered in New York City. Vimeo focuses on the delivery of high-definition video across a range of devices and operates on a software as a service (SaaS) business model. The platform provides tools for video creation, editing, and broadcasting along with enterprise software solutions and the means for video professionals to connect with clients and other professionals. As of December 2021, the site has 260 million users, with around 1.6 million subscribers to its services.", "voidlinux":"Void Linux is an independent Linux distribution that uses the X Binary Package System (XBPS) package manager, which was designed and implemented from scratch, and the runit init system. Excluding binary kernel blobs, a base install is composed entirely of free software.", "wallhaven":[ "Your source for the best high quality wallpapers on the Net!", @@ -2385,13 +2461,13 @@ "wikicommons.images:en", "ref" ], - "wikidata":"Wikidata is a collaboratively edited multilingual knowledge graph hosted by the Wikimedia Foundation. It is a common source of open data that Wikimedia projects such as Wikipedia, and anyone else, are able to use under the CC0 public domain license. Wikidata is a wiki powered by the software MediaWiki, including its extension for semi-structured data, the Wikibase. As of early-2025, Wikidata had 1.65 billion item statements.", + "wikidata":"Wikidata is a collaboratively edited multilingual knowledge graph hosted by the Wikimedia Foundation. It is a common source of open data that Wikimedia projects such as Wikipedia, and anyone else, are able to use under the CC0 public domain license. Wikidata is a wiki powered by the software MediaWiki, including its extension for semi-structured data, the Wikibase. As of early 2025, Wikidata had 1.65 billion item statements.", "wikimini":[ "family of online encyclopedias for children", "wikidata" ], "wikinews":"Wikinews is a free-content news wiki and a project of the Wikimedia Foundation that works through collaborative journalism through user-created content. Wikipedia co-founder Jimmy Wales has distinguished Wikinews from Wikipedia by saying, \"On Wikinews, each story is to be written as a news story as opposed to an encyclopedia article.\" Wikinews's neutral point of view policy aims to distinguish it from other citizen journalism efforts such as Indymedia and OhmyNews. In contrast to most Wikimedia Foundation projects, Wikinews allows original work in the form of original reporting and interviews. In contrast to newspapers, Wikinews does not permit op-ed.", - "wikipedia":"Wikipedia is a free online encyclopedia, written and maintained by a community of volunteers, known as Wikipedians, through open collaboration and the wiki software MediaWiki. Founded by Jimmy Wales and Larry Sanger on January 15, 2001, Wikipedia has been hosted since 2003 by the Wikimedia Foundation, an American nonprofit organization funded mainly by donations from readers. Wikipedia is the largest and most-read reference work in history.", + "wikipedia":"Wikipedia is a free online encyclopedia, written and maintained by a community of volunteers, known as Wikipedians, through open collaboration and the wiki software MediaWiki. Founded by Jimmy Wales and Larry Sanger in 2001, Wikipedia has been hosted since 2003 by the Wikimedia Foundation, an American nonprofit organization funded mainly by donations from readers. Wikipedia is the largest and most-read reference work in history.", "wikiquote":"Wikiquote is part of a family of wiki-based projects run by the Wikimedia Foundation using MediaWiki software. The project's objective is to collaboratively produce a vast reference of quotations from prominent people, books, films, proverbs, etc. and writings about them. The website aims to be as accurate as possible regarding the provenance and sourcing of the quotations.", "wikisource":"Wikisource is an online wiki-based digital library of free-content textual sources operated by the Wikimedia Foundation. Wikisource is the name of the project as a whole; it is also the name for each instance of that project, one for each language. The project's aim is to host all forms of free text, in many languages, and translations. Originally conceived as an archive to store useful or important historical texts, it has expanded to become a general-content library. The project officially began on November 24, 2003, under the name Project Sourceberg, a play on Project Gutenberg. The name Wikisource was adopted later that year and it received its own domain name.", "wikispecies":"Wikispecies is a wiki-based online project supported by the Wikimedia Foundation. Its aim is to create a comprehensive open content catalogue of all species; the project is directed at scientists, rather than at the general public. Jimmy Wales stated that editors are not required to fax in their degrees, but that submissions will have to pass muster with a technical audience. Wikispecies is available under the GNU Free Documentation License and CC BY-SA 4.0.", @@ -2711,7 +2787,7 @@ "google":"El buscador de Google o buscador web de Google es un motor de búsqueda en la web propiedad de Alphabet Inc. Es el motor de búsqueda más utilizado en la Web y recibe cientos de millones de consultas cada día a través de sus diferentes servicios. El objetivo principal del buscador de Google es buscar texto en las páginas web, en lugar de otro tipo de datos. Fue desarrollado originalmente por Larry Page y Sergey Brin en 1997.", "google images":"Google Imágenes es una especialización del buscador principal para imágenes, se introdujo el 12 de julio de 2001 debido a la demanda de imágenes del vestido verde de Versace que usó Jennifer López en febrero de 2000. En 2011, se agregó la función de búsqueda inversa de imágenes.", "google news":"Google Noticias, conocido en España como Google News, es un agregador y buscador de noticias automatizado que rastrea de forma constante la información de los principales medios de comunicación en línea.", - "google play apps":"Google Play o Google Play Store es una plataforma de distribución digital de aplicaciones móviles para los dispositivos con sistema operativo Android, así como una tienda en línea desarrollada y operada por Google. Esta plataforma permite a los usuarios navegar y descargar aplicaciones, juegos, música, libros, revistas y películas. También se pueden adquirir dispositivos móviles como ordenadores Chromebook, teléfonos inteligentes Nexus y Pixel, Google Chromecast, entre otros. También cuenta con versiones para Wear OS y Android TV.", + "google play apps":"Google Play o Google Play Store es una plataforma de distribución digital de aplicaciones móviles para los dispositivos con sistema operativo Android, así como una tienda en línea desarrollada y operada por play store Esta plataforma permite a los usuarios navegar y descargar aplicaciones, juegos, música, libros, revistas y películas. También se pueden adquirir dispositivos móviles como ordenadores Chromebook, teléfonos inteligentes Nexus y Pixel, Google Chromecast, entre otros. También cuenta con versiones para Wear OS y Android TV.", "google play movies":[ "google play apps:es", "ref" @@ -2735,6 +2811,10 @@ "imdb":"Internet Movie Database es una base de datos en línea que en un principio almacena información relacionada con películas, y con el tiempo se transforma en la base de datos más grande del mundo donde se encuentran programas de televisión, eventos en vivo y difundidos en televisión o en la web, entrega de premios, especiales y videojuegos. Se encuentra el personal de equipo de producción, actores, series y programas de televisión, videojuegos, actores de doblaje y personajes ficticios que aparecen en los medios de entretenimiento visual. Recibe más de 100 millones de usuarios únicos al mes y cuenta con una versión móvil. IMDb fue inaugurada el 17 de octubre de 1990, y en 1998 fue adquirida por Amazon.com.", "imgur":"Imgur es un sitio web para alojar imágenes en línea, fundado por Alan Schaaf en el 2009 en Ohio, Estados Unidos, como un regalo para la comunidad de Reddit. Imgur es, actualmente, una de las mayores webs de contenido de imágenes de Internet donde son juzgadas en tiempo real por una comunidad de usuarios a través de comentarios y votos.", "ina":"El Instituto nacional del audiovisual (INA) es un organismo público francés cuya misión principal es archivar las producciones audiovisuales y producir, editar, publicar, comercializar y distribuir contenidos audiovisuales y multimedia para todos los públicos, ya sean profesionales, empresas o particulares, para todas las pantallas o plataformas de difusión, incluido el audio. El INA también incluye un centro de formación e investigación destinado a desarrollar y transmitir conocimientos y experiencia en los campos audiovisual, mediático y digital.", + "ipernity":[ + "La comunidad de intercambio de fotos, vídeos y blogs no comerciales más grande del mundo, financiada únicamente por las cuotas de los miembros, sin ánimo de lucro.", + "https://www.ipernity.com" + ], "iqiyi":"iQIYI, anteriormente Qiyi, es una plataforma de vídeo en línea basada en Pekín, lanzada el 22 de abril de 2010. iQIYI es una de las plataformas de vídeo en línea de mayor tamaño del mundo, con casi 6 mil millones de horas de reproducciones en su servicio cada mes, y con más de 500 millones de usuarios activos al mes.", "kickass":"KickassTorrents es un sitio web que proporciona un directorio de archivos torrent y enlaces magnéticos para facilitar el intercambio de archivos peer-to-peer mediante el protocolo BitTorrent. Fue fundada en 2008 y fue puesto fuera de línea el 20 de julio de 2016, cuando el dominio fue capturado por el gobierno de Estados Unidos. Los servidores proxy del sitio fueron cerrados por su personal, al mismo tiempo.", "lemmy comments":[ @@ -2783,6 +2863,18 @@ "ref" ], "naver":"Naver es el principal portal de Internet de Corea del Sur. Naver fue lanzado en junio de 1999 y fue el primer portal coreano que disponía de un buscador propio e independiente integrado con la página. Desde entonces ha liderado la carrera del desarrollo de buscadores en Corea. Además Naver proporciona muchos servicios a los internautas: posee una agencia de noticias propia que cubre exhaustivamente más de 90 medios de comunicación, un servicio de correo electrónico y un buscador de tesis doctorales. Su contenido más popular son los de los manhwas Torre de Dios y Girls of the Wilds. También es dueña de la aplicación de llamadas gratis LINE.", + "naver images":[ + "naver:es", + "ref" + ], + "naver news":[ + "naver:es", + "ref" + ], + "naver videos":[ + "naver:es", + "ref" + ], "niconico":"Niconico , anteriormente conocido como Nico Nico Douga , es una web de alojamiento de vídeos de origen japonés creada por Niwango. Nico Nico Douga, según Alexa, es la duodécima web más visitada en Japón.", "nixos wiki":[ "nixos wiki:en", @@ -2816,7 +2908,7 @@ ], "reddit":"Reddit es un sitio web de marcadores sociales y agregador de noticias donde los usuarios pueden añadir textos, imágenes, videos o enlaces. Los usuarios pueden votar a favor o en contra del contenido, haciendo que aparezcan en las publicaciones destacadas. Su público es mayoritariamente anglosajón y la mayoría de la actividad se realiza en inglés. Reddit fue software libre desde el 19 de junio de 2009 hasta septiembre de 2017, cuando la compañía archivó y cerró el acceso a sus repositorios en Github, que incluían todo el código escrito para Reddit excepto las partes antispam.", "reuters":"Reuters es una agencia de noticias con sede en el Reino Unido, conocida por suministrar información a medios de comunicación y mercados financieros.", - "rottentomatoes":"Rotten Tomatoes es un sitio web estadounidense de revisión y reseñas para cine y televisión. La compañía fue fundada en agosto de 1998 por tres estudiantes universitarios de la Universidad de California, Berkeley: Senh Duong, Patrick Y. Lee y Stephen Wang. Aunque el nombre \"Rotten Tomatoes\" se conecta con la práctica de audiencias arrojando tomates podridos cuando desaprueba una pobre actuación en el escenario, la inspiración original proviene de una escena con tomates en la película canadiense de 1992 Léolo.", + "rottentomatoes":"Rotten Tomatoes es un sitio web estadounidense de revisión y reseñas para cine y televisión. La compañía fue fundada en agosto de 1998 por tres estudiantes universitarios de la Universidad de California, Berkeley: Senh Duong, Patrick Y. Lee y Stephen Wang. Aunque el nombre «Rotten Tomatoes» se conecta con la práctica de audiencias arrojando tomates podridos cuando desaprueba una pobre actuación en el escenario, la inspiración original proviene de una escena con tomates en la película canadiense de 1992 Léolo.", "rubygems":"RubyGems es un gestor de paquetes para el lenguaje de programación Ruby que proporciona un formato estándar y autocontenido para poder distribuir programas o bibliotecas en Ruby, una herramienta destinada a gestionar la instalación de estos, y un servidor para su distribución. Es, por tanto, equivalente al papel que juegan CPAN y PEAR en los lenguajes Perl y PHP, respectivamente. RubyGems es parte de la librería estándar a partir de la versión 1.9 de Ruby.", "rumble":"Rumble es una plataforma de video en línea canadiense con sede en Toronto. Fue fundada en 2013 por Chris Pavlovski, un emprendedor tecnológico de Canadá. El recuento mensual de usuarios de Rumble ha experimentado un rápido crecimiento desde julio de 2020, pasando de 1,6 millones de usuarios mensuales a 31,9 millones al final del primer trimestre de 2021.", "semantic scholar":"Semantic Scholar es un motor de búsqueda respaldado por un sistema de inteligencia artificial dedicado a trabajar con publicaciones académicas. Desarrollado en el Allen Institute for Artificial Intelligence, se lanzó al público en noviembre de 2015. Utiliza avances recientes en el procesamiento del lenguaje natural para proporcionar resúmenes de artículos académicos.", @@ -3190,7 +3282,7 @@ "ref" ], "wikidata":"Wikidata elkarlanean sortutako datu-base eleanitz bat da, Wikimedia Fundazioak kudeatua. Wikidataren xedea da iturri bateratu bat eskaintzea zenbait datutarako (adibidez, pertsonen jaiotegunak eta jarduerak, edo Wikipediako artikulu bat nola den beste hizkuntzen Wikipedietan. Informazio hori Wikimediaren proiektuetan erabiltzen da gero, adibidez Wikipedian. Wikipediako artikulu askotan goian eskuinaldean hainbat daturekin agertzen den infotaula, kasu askotan automatikoki sortu izan da artikulu horri buruz Wikidatan dagoen informazioarekin.", - "wikipedia":"Wikipedia eduki askeko entziklopedia bat da, lankidetzaz editatua, eleanitza, Interneten argitaratua, Wikimedia Fundazioa irabazi asmorik gabeko erakundeak sustengatua. Wikipedia mundu osoko boluntarioek idazten dute. Internetera konektatutako edonork parte har dezake Wikipediako artikuluetan, aldatu lotura sakatuz. 2015ko azaroaren bostean, 291 hizkuntzatako edizioak zituen, eta horietatik 275 zeuden aktibo. Proiektuaren xedea da ahalik eta hizkuntza gehienetan idatzitako entziklopedia sortu eta hedatzea. Guztira 37 milioi artikulu ditu, horietatik 461.286 euskaraz eta bost milioitik gora ingelesez.", + "wikipedia":"Wikipedia eduki askeko entziklopedia bat da, lankidetzaz editatua, eleanitza, Interneten argitaratua, Wikimedia Fundazioa irabazi asmorik gabeko erakundeak sustengatua. Wikipedia mundu osoko boluntarioek idazten dute. Internetera konektatutako edonork parte har dezake Wikipediako artikuluetan, aldatu lotura sakatuz. 2015ko azaroaren bostean, 291 hizkuntzatako edizioak zituen, eta horietatik 275 zeuden aktibo. Proiektuaren xedea da ahalik eta hizkuntza gehienetan idatzitako entziklopedia sortu eta hedatzea. Guztira 37 milioi artikulu ditu, horietatik 464.025 euskaraz eta bost milioitik gora ingelesez.", "wikiquote":"Wikiesanak Wikimedia Fundazioaren aipu ezagunen bilduma da. Bertan pertsona entzutetsuen esanak, liburu ospetsuetako aipamenak eta herrialde ezberdinetako esaera zaharrak edo atsotitzak aurki daitezke. Wikipedia bezala, internet bidezko elkarlanean eta wiki softwarean oinarritzen den webgunea da. GFDL lizentziapean argitaratzen da. Hastapenetan ingelesez soilik bazen ere, 2004 urteaz geroztik 79 hizkuntza ezberdinetan dago. Ingelesezko bertsioa artikulu gehien duena izan da ordutik, 2010 urteko hasieran ia ehun mila orri eta hamazazpi mila bat aipuak biltzeko artikulu duela. 2010. urtearen hasieran euskarazko bertsioak mila orrialde baino gehiago zituen, eta horietako ehun baino gehiago, aipu-orrialdeak.", "wikisource":"Wikiteka wikian dagoen testu eduki askeko Interneteko liburutegi digitala da, Wikimedia Fundazioak kudeatutakoa. Wikiteka da proiektu osoaren izena, baita proiektu horretako ale bakoitzaren izena ere, non ale bakoitza hizkuntza desberdin bati dagokion. Beraz, hizkuntza askotako iturriek osatzen dute Wikiteka.", "wikispecies":"Wikiespezieak Wikimedia Fundazioaren proiektu bat da. Bertan, naturako izaki espezie ezberdinen informazioa aurki dezakegu; animaliak, landareak, onddoak, bakteriak, eta gainontzeko bizi-formak.", @@ -3264,7 +3356,7 @@ "ref" ], "deezer":"دیزر رسانه جاری موسیقی و پادکست مبتنی بر اینترنت است. این سرویس در اوت ۲۰۰۷ در پاریس فرانسه پایه‌گذاری شد. تا تاریخ ۳ آوریل ۲۰۱۸، ۱۴ میلیون کاربر ماهانه فعال و ۶ میلیون مشترک پولی برای دیزر گزارش شده‌است.", - "deviantart":"دوینت‌آرت یک شبکه اجتماعی آنلاین با محوریت هنر است. پایگاه رسمی آن در ۷ آگوست سال ۲۰۰۰ توسط چند طراح وب با ایده‌های نو راه‌اندازی شد. آثار هنری در این ‍‍ پایگاه عبارتند از; عکاسی، هنر دیجیتال، نقاشی دیجیتال، هنر سنتی، ادبیات، پویانمایی، فیلم سازی، پوسته برای برنامه‌های کاربردی و غیره که با دیگران به اشتراک گذاشته می‌شوند.", + "deviantart":"دوینت‌آرت یک شبکه اجتماعی آنلاین با محوریت هنر است. پایگاه رسمی آن در ۷ اوت سال ۲۰۰۰ توسط چند طراح وب با ایده‌های نو راه‌اندازی شد. آثار هنری در این ‍‍ پایگاه عبارتند از; عکاسی، هنر دیجیتال، نقاشی دیجیتال، هنر سنتی، ادبیات، پویانمایی، فیلم سازی، پوسته برای برنامه‌های کاربردی و غیره که با دیگران به اشتراک گذاشته می‌شوند.", "duckduckgo":[ "currency:fa-IR", "ref" @@ -3340,6 +3432,18 @@ "ref" ], "naver":"موتور جستجوی ناور (به کره‌ای: 네이버) یک موتور جستجوی معروف در کره است که در حدود ۷۰ درصد بازار مشترک را در مقابل ۲ درصد گوگل داراست .Naver در سال ۱۹۹۹ توسط گروهی از مهندسان شرکت Sumsong ایجاد شد. و به عنوان اولین وب پورتال کره جنوبی شناخته می‌شود و یک پورتال بومی اختصاصی محسوب می گردد.", + "naver images":[ + "naver:fa-IR", + "ref" + ], + "naver news":[ + "naver:fa-IR", + "ref" + ], + "naver videos":[ + "naver:fa-IR", + "ref" + ], "niconico":"نیکونیکو ، یک سرویس اشتراک‌گذاری ویدیوی ژاپنی مستقر در توکیو، ژاپن است. «نیکونیکو» ایدئوفون ژاپنی برای لبخند زدن است. طبق گزارش الکسا اینترنت از سال ۲۰۲۱، نیکونیکو سی و چهارمین وب سایت پربازدید در ژاپن است.", "nixos wiki":[ "nixos wiki:en", @@ -3413,6 +3517,7 @@ }, "fi":{ "9gag":"9GAG on vuonna 2008 perustettu meemeihin ja muuhun internethuumoriin keskittyvä verkkosivusto. Se syntyi hongkonglaisen opiskelijaryhmän työnä, johon kuului Ray Chan, Chris Chan, Derek Chan, Marco Fung ja Brian Yu, koska Facebook ei ollut saatavilla Hongkongissa. 9GAG-sovellus on saatavilla Androidille, iOS:lle, Windows Phonelle ja BlackBerry 10:lle. 9GAG on saavuttanut sosiaalisen median kuten Facebookin, Twitterin ja Instagramin avulla suuren suosion. Marraskuussa 2017 9GAG:in sivuilla oli käynyt yli 223 miljoonaa vierailijaa.", + "alpine linux packages":"Alpine Linux on riippumaton Linux-jakelu, joka on suunniteltu käyttöön reittimissä, palomuureissa, säiliöissä ja palvelimissa. Alpine Linux on suunniteltu pieneksi, ja se voidaan ajaa suoraan RAM-muistista. Alpine Linux perustuu musl-kirjastolle ja Busyboxille. Alpine Linux on suosittu säiliöissä, joissa hyökkäyspinta-ala minimoidaan ja suoritus tehdään kustannustehokkaaksi. Alpine Linuxista on saatavilla 32- ja 64-bittisiä versioita useille alustoille: i386 (x86), AMD64, ARMv6, ARMv8, PowerPC ja IBM System z (s390x) arkkitehtuureille.", "ansa":[ "italialainen uutistoimisto", "wikidata" @@ -3726,12 +3831,12 @@ "apple maps":"Apple Plans est une application de cartographie en ligne développée par Apple. Il s'agit de l'application de cartographie par défaut sur iOS, iPadOS, macOS et watchOS. Elle permet de donner les directions et l'heure d'arrivée estimée que l'on soit en voiture, à pied, en bicyclette ou en transport en commun. Une fonctionnalité appelée « tour Flyover » permet d'explorer certaines zones urbaines et autres points d'intérêt modélisés en 3D.", "artic":"L'Art Institute of Chicago est un musée situé à Chicago aux États-Unis. Deuxième plus grand musée d'art du pays après le Metropolitan Museum of Art de New York, il abrite l'une des plus importantes collections d'art des États-Unis.", "arxiv":"arXiv est une archive ouverte de prépublications électroniques d'articles scientifiques dans les domaines de la physique, des mathématiques, de l'informatique, de la biologie quantitative, de la finance quantitative, de la statistique, de l'ingénierie électrique et des systèmes, et de l'économie, et qui est accessible gratuitement par Internet.", - "ask":"Ask.com anciennement Ask Jeeves, est un moteur de recherche sur Internet fondé en 1996 par Garrett Gruener et David Warthen à Berkeley en Californie. Le moteur initial fut conçu et implémenté par Gary Chevsky.", + "ask":"Ask.com anciennement Ask Jeves, est un moteur de recherche sur Internet fondé en 1996 par Garrett Gruener et David Warthen à Berkeley en Californie. Le moteur initial fut conçu et implémenté par Gary Chevsky.", "askubuntu":[ "stackoverflow:fr", "ref" ], - "baidu":"Baidu est une entreprise Internet chinoise. Son moteur de recherche en chinois peut chercher du texte et des images. En juin 2013, c'est le site le plus consulté de Chine et, en 2019, c'est le 3e site le plus consulté sur Internet. Baidu signifie « Cent degrés » en chinois. En 2023, l'entreprise propose un index de plus de 3 milliards de pages web. Elle participe activement à la communauté du logiciel libre, notamment dans le domaine de l'intelligence artificielle.", + "baidu":"Baidu est une entreprise Internet chinoise. Son moteur de recherche en chinois peut chercher du texte et des images. En juin 2013, c'est le site le plus consulté de Chine et, en 2019, c'est le troisième site le plus consulté au monde. En 2023, l'entreprise propose un index de plus de 3 milliards de pages web. Elle participe activement à la communauté du logiciel libre, notamment dans le domaine de l'intelligence artificielle.", "baidu images":[ "baidu:fr", "ref" @@ -3821,7 +3926,7 @@ "github":"GitHub est un service web d'hébergement et de gestion de développement de logiciels, utilisant le logiciel de gestion de versions Git. Ce site est développé en Ruby on Rails et Erlang par Chris Wanstrath, PJ Hyett et Tom Preston-Werner. GitHub propose des comptes professionnels payants, ainsi que des comptes gratuits pour les projets de logiciels libres.", "gitlab":"GitLab est un logiciel libre de forge basé sur git proposant les fonctionnalités de wiki, un système de suivi des bugs, l’intégration continue et la livraison continue. Développé par GitLab Inc et créé par Dmitriy Zaporozhets et par Valery Sizov, le logiciel est utilisé par plusieurs grandes entreprises informatiques, dont IBM, Sony, le centre de recherche de Jülich, la NASA, Alibaba, Oracle, Invincea, O’Reilly Media, Leibniz Rechenzentrum, le CERN, European XFEL, la GNOME Foundation, KDE, Boeing, Autodata, SpaceX, Symbio et Altares.", "goodreads":"Goodreads est un site web de critiques et de notation de livres. Fondé en décembre 2006, puis lancé en janvier 2007 par Otis Chandler II, un ingénieur informatique et entrepreneur, et Elizabeth Khuri, ce site se base sur des notions de catalogage social et permet aux individus de faire des recherches dans une vaste base de données comprenant des livres, des annotations et des critiques littéraires. Les usagers peuvent y créer un compte pour consigner leurs impressions de lecture, ce qui génère des listes de suggestions personnalisées. Ils ont également la possibilité de créer leurs propres clubs de lecture, des sondages, des blogs et de lancer des discussions.", - "google":"Google /ˈgu.gəl/ est un moteur de recherche sur Internet gratuit et libre d'accès sur le World Wide Web, ayant donné son nom à la société Google. C'est aujourd'hui le moteur de recherche et le site web le plus visité au monde : 90 % des internautes l'utilisaient en 2018.", + "google":"Google /ˈgu.gəl/ est un moteur de recherche sur Internet gratuit et libre d'accès sur le World Wide Web, ayant donné son nom à la société Google.", "google images":"Google Images est un service proposé depuis 2001 par le moteur de recherche Google pour permettre de trouver sur le web des images en rapport avec un sujet donné.", "google news":"Google Actualités ou Google News est un service en ligne gratuit de Google qui présente de façon automatisée des articles d'information en provenance de sources sur le Web. Il fonctionne de la même manière qu'un moteur de recherche, en n'indexant que les articles de presse. Ce service, disponible dans vingt-deux pays, a été créé en avril 2002. La partie française du service est sortie de son statut bêta le 14 mai 2009. En juin 2017, Google change le design de Google Actualités pour une version plus épurée et plus claire pour l'utilisateur. Elle propose également des articles dont les faits sont vérifiés dans la version américaine.", "google play apps":"Google Play est une suite d'applications et un magasin d'applications créée par Google le 22 octobre 2008 par fusion des services Android Market, Google Movies, Google ebookstor et Google Music. Elle regroupe Play Store, le magasin d'applications officiel pour les appareils fonctionnant sous Android et Chrome OS, Play Films et séries, une boutique de location de films et de séries télévisées, Play Livres, une boutique d'achat en ligne de livres et de magazines, et Play Jeux, un service de sauvegarde, de récompense et de défis autour des jeux mobiles disponibles sur le Play Store.", @@ -3846,6 +3951,10 @@ "imdb":"L’Internet Movie Database, abrégé en IMDb, est une base de données en ligne sur le cinéma mondial, sur la télévision, et plus secondairement les jeux vidéo. IMDb restitue un grand nombre d’informations concernant les films, les acteurs, les réalisateurs, les scénaristes et toutes personnes et entreprises intervenant dans l’élaboration d’un film, d’un téléfilm, d’une série télévisée ou d’un jeu vidéo. L’accès aux informations publiques est gratuit. Un service payant, IMDbPro, donne accès aux informations supplémentaires susceptibles d’intéresser les professionnels. Créé le 17 octobre 1990 par l'Anglais Col Needham, c’est un site visité, en 2010, par plus de 57 millions d’usagers uniques chaque mois, ce qui le plaçait au 39e rang des sites les plus visités au monde. Il appartient depuis 1998 à Amazon.", "imgur":"imgur est une société américaine fondée par Alan Schaaf en 2009 qui exploite un site d'hébergement d'images.", "ina":"L'Institut national de l'audiovisuel (INA) est un établissement public à caractère industriel et commercial français ayant pour mission principale d'archiver les productions audiovisuelles et de produire, d'éditer, de publier, de commercialiser et de distribuer des contenus audiovisuels et multimédias à destination de tous les publics, professionnels, entreprises ou particuliers, pour tous les écrans ou plateformes de diffusion, y compris audio. L'INA comprend également un centre de formation et de recherche visant à développer et transmettre les savoirs et expertises dans les domaines de l'audiovisuel, des médias et du numérique.", + "ipernity":[ + "La plus grande communauté non commerciale de partage de photos, vidéos et blogs au monde, financée uniquement par les cotisations des membres, à but non lucratif.", + "https://www.ipernity.com" + ], "iqiyi":"iQiyi est un site de publication de vidéos en ligne créé le 22 avril 2010 en République populaire de Chine. Il cumulait plus de 50 millions de vidéos visionnées quotidiennement en mai 2013. Le public chinois visualise en tout plus d'1,28 milliard d'émissions de télévision et de films par mois d'après des statistiques de septembre 2014.", "kickass":"KickassTorrents est un annuaire web de fichiers torrent et de liens magnet destiné à faciliter le partage de fichiers. Le site a été fondé en 2008 et a été mis hors ligne le 20 juillet 2016, lorsque le domaine a été saisi par le gouvernement des États-Unis. Les sites proxy ont été fermés par les membres de son équipe le même jour. Le 16 décembre 2016, KickassTorrents est de retour en ligne sur une nouvelle adresse, créée par l'équipe originale.", "lemmy comments":[ @@ -3871,7 +3980,7 @@ "mastodon users:fr", "ref" ], - "mastodon users":"Mastodon est un réseau social et logiciel de microblogage auto-hébergé, libre, distribué et décentralisé via ActivityPub au sein du Fediverse. Il permet de partager des messages, images, médias et autres contenus. C'est une alternative à Twitter. Des instances sont publiquement mises à disposition afin de faciliter son utilisation.", + "mastodon users":"Mastodon est un logiciel de microblogage libre et open source fonctionnant sur le protocole ActivityPub.", "mdn":"MDN Web Docs, précédemment Mozilla Developer Network et anciennement Mozilla Developer Center, est un dépôt de documentation et une ressource d'apprentissage pour les développeurs web utilisés par Mozilla, Microsoft, Google et Samsung.", "metacpan":"Le Comprehensive Perl Archive Network, ou CPAN, est un site Web consacré au langage de programmation Perl. CPAN désigne également un module Perl servant à accéder à ce site. Son nom vient du Comprehensive TeX Archive Network, ou CTAN, son homologue consacré à TeX.", "microsoft learn":[ @@ -3894,6 +4003,18 @@ "ref" ], "naver":"Naver est une plateforme en ligne sud-coréenne gérée par la société Naver Corporation. Le site a été créé en 1999 en tant que premier portail Web en Corée à développer et utiliser son propre moteur de recherche. Il a également été le premier opérateur au monde à introduire la fonction de recherche intégrée, qui compile les résultats de recherche de différentes catégories et les présente sur une seule page. Depuis, Naver a ajouté une multitude de nouveaux services telles que le courrier électronique et les nouvelles, puis aussi la première plateforme de questions-réponses en ligne Knowledge iN.", + "naver images":[ + "naver:fr", + "ref" + ], + "naver news":[ + "naver:fr", + "ref" + ], + "naver videos":[ + "naver:fr", + "ref" + ], "niconico":"Niconico (ニコニコ, Nikoniko, litt. « Sourire ») anciennement connu sous le nom Nico Nico Dōga (ニコニコ動画, litt. « Sourire vidéos ») ou Nico-dō est un site web de partage de vidéos, très populaire au Japon, géré par Niwango (en). Le site est surnommé « Niconico » ou « Nico-dō », sachant que « nico nico » est l'onomatopée pour le sourire. Niconico est classé 13e parmi les sites web les plus visités au Japon. Le site a gagné le Good Design Award japonais en 2007, et le Honoray Mentions Awards de la catégorie des communautés digitales au Prix Ars Electronica 2008. Sa particularité est que les commentaires de la vidéo s'affichent directement sur celle-ci au même moment qu'ils ont été écrits, ils sont appelés « danmaku » (弾幕). Cette fonctionnalité est aussi développée par le chinois bilibili.", "nixos wiki":[ "nixos wiki:ru", @@ -3972,7 +4093,7 @@ "wikicommons.images:fr", "ref" ], - "wikicommons.images":"Wikimedia Commons est une base de données multimédia. Elle héberge des images, des sons, d'autres médias audiovisuels et des données JSON sous licence libre. Elle centralise des médias libres, tels que photographies, dessins, schémas, partitions, cartes géographiques, textes écrits et parlés, animations et vidéos, objets 3D qui ont une utilité pour les projets du mouvement Wikimédia. En novembre 2023, elle passe la barre des 100 millions de fichiers hébergés.", + "wikicommons.images":"Wikimedia Commons est une bibliothèque numérique collaborative et gratuite lancée en 2004. Elle héberge des images, des sons, d'autres médias audiovisuels et des données JSON. Elle centralise des médias tels que photographies, dessins, schémas, fichiers son, partitions, cartes géographiques, textes écrits et parlés, animations et vidéos, objets 3D qui ont une utilité pour les projets du mouvement Wikimédia. En novembre 2023, elle passe la barre des 100 millions de fichiers hébergés.", "wikicommons.videos":[ "wikicommons.images:fr", "ref" @@ -4266,7 +4387,7 @@ "annas archive":"הארכיון של אנה היא ספריית צללים חינמית וללא מטרת רווח, המספקת גישה מקוונת לספרים וחומרים כתובים ולמידע עליהם ממגוון מקורות באמצעות רב מנוע. הספרייה הוקמה על ידי צוות ארכיונאים אנונימיים כתגובה למאמצי איגוד המוציאים לאור הבריטי וגילדת המחברים האמריקאית יחד עם רשויות החוק לסגור את האתר Z-library בנובמבר 2022.", "apple app store":"App Store היא חנות אפליקציות ייעודית למכשירי iOS, אשר מפותחת ומתוחזקת על ידי חברת אפל. השירות מאפשר למשתמשים להוריד יישומים (אפליקציות) מחנות ה-iTunes. היישומים בחנות פותחו על ידי ערכת פיתוח התוכנה של ה-iOS‏, ופורסמו על ידי אפל.", "apple maps":"אפל מפות הוא יישום מובנה במערכת ההפעלה iOS של המכשירים מבית חברת אפל, ומציע דרכי הגעה ליעדים, עדכוני תנועה, בתי עסק בסביבה ותכונות נוספות.", - "artic":"מכון האמנות של שיקגו הוא מוזיאון לאמנות יפה בפארק גרנט בשיקגו שבמדינת אילינוי בארצות הברית. מכון האמנות מכיל את אחד האוספים הגדולים ביותר בעולם של אמנות אימפרסיוניסטית ופוסט-אימפרסיוניסטית. כמו כן, קיימים במוזיאון מגוון אוספים הכוללים אמנות אסייתית, אמריקאית, אמנות מודרנית ואמנות עכשווית.", + "artic":"מכון האמנות של שיקגו הוא מוזיאון לאמנויות יפות בפארק גרנט בשיקגו שבמדינת אילינוי בארצות הברית. מכון האמנות מכיל את אחד האוספים הגדולים ביותר בעולם של אמנות אימפרסיוניסטית ופוסט-אימפרסיוניסטית. כמו כן, קיימים במוזיאון מגוון אוספים הכוללים אמנות אסייתית, אמריקאית, אמנות מודרנית ואמנות עכשווית.", "ask":"Ask.com הוא מנוע חיפוש אינטרנטי למענה שאלות שהוקם בשנת 1996 על ידי גרט גרונר ודייוויד וורט'ן בברקלי, קליפורניה. מטרתו של מנוע החיפוש היא לכוון את המחפש במהירות ובדיוק מיטבי אל העמוד העונה על שאלתו. במקרה בו הוא אינו מצליח למצוא מידע במאגר המידע שלו, הוא מפנה את המשתמש לאתרים אחרים על ידי מנועי החיפוש. התכונות המיוחדות של מנוע חיפוש Ask.com כוללות, בין היתר, מדריך מיוחד המוקדש רק לקניות יחד עם צפייה בשאלות שנשאלות ברגעים אלו ממש על ידי משתמשים אחרים. נכון ל-2008, מנוע חיפוש זה היה אחראי רק לכ-5% מכלל החיפושים בעולם.", "baidu":"Baidu הוא תאגיד טכנולוגיה בינלאומי שמרכזו ברפובליקה העממית של סין. מטה החברה נמצא ב\"Baidu Campus\" במחוז הֵידִיאַן, בייג'ינג.", "baidu images":[ @@ -4690,6 +4811,18 @@ "ref" ], "naver":"A Naver dél-koreai internetes portál és keresőmotor, melyet 1999-ben hozott létre egy korábbi Samsung-alkalmazott. A Naver saját keresőmotort fejlesztett, ami kifejezetten koreai nyelvű tartalomra specializálódik. 2009-ben a keresőmotorok között az ötödik helyen szerepelt a világon, a Google, a Yahoo!, a Baidu és a Microsoft után. A Naver a koreai piac domináns keresője, a keresések mintegy 70%-át itt bonyolítják és mintegy 25 millió felhasználónak ez a kezdőoldala a böngészőben. A Woori Investment and Securities elemzése szerint a Google-nek azért nem sikerült megvetnie a lábát a koreai piacon a Naverrel szemben, mert túl kevés koreai nyelvű tartalmat szolgáltat.", + "naver images":[ + "naver:hu", + "ref" + ], + "naver news":[ + "naver:hu", + "ref" + ], + "naver videos":[ + "naver:hu", + "ref" + ], "niconico":"Niconico, korábban Nico Nico Douga vagy röviden „Niko-dó”-ként ismert weboldal, egy japán videómegosztó portál, amit a Niwango, a Dwango egy leányvállalata üzemeltet. A „Niconico” vagy „nikoniko” egy japán hangulatfestő szó a mosolygásra. 2012. április 18. óta a 14. és 10. helyek között mozog a leglátogatottabb oldalak listáján Japánban. 2007-ben ez az oldal nyerte meg a Good Design Award-ot, és „Tiszteletbeli díjazott” volt „Digitális közösségek” kategóriában a 2008-as Ars Electronica-díj díjkiosztó rendezvényén.", "odysee":"Az Odysee egy amerikai decentralizált videómegosztó platform, amely az LBRY blokkláncra épül. A nagy videomegosztó oldalak alternatívájaként pozicionálja magát, de a szólásszabadságra és a decentralizációra helyezi a hangsúlyt.", "openstreetmap":"Az OpenStreetMap (OSM) csoportmunkán alapuló térképfejlesztés, melynek célja egy szabadon szerkeszthető és felhasználható térkép készítése az egész világról.", @@ -4892,7 +5025,7 @@ "google scholar":"Google Cendekia adalah layanan yang memungkinkan pengguna untuk melakukan pencarian materi-materi pelajaran berupa teks dalam berbagai format publikasi. Diluncurkan pada tahun 2004, indeks Google Cendekia mencakup jurnal-jurnal daring dari publikasi ilmiah. Google Cendekia menyediakan cara yang mudah untuk mencari literatur akademis secara luas. Seseorang dapat mencari di seluruh bidang ilmu dan referensi dari satu tempat: makalah peer-reviewed, tesis, buku, abstrak, dan artikel, dari penerbit akademis, komunitas profesional, pusat data pracetak, universitas, dan organisasi akademis lainnya. Google Cendekia akan membantu seseorang mengidentifikasi penelitian paling relevan dari seluruh penelitian akademis. Google Cendekia bertujuan menyusun artikel seperti yang dilakukan peneliti, dengan memperhatikan kelengkapan teks setiap artikel, penulis, publikasi yang menampilkan artikel, dan frekuensi penggunaan kutipan artikel dalam literatur akademis lainnya. Hasil paling relevan akan selalu muncul pada halaman pertama.", "google videos":"Google Videos merupakan layanan saling berbagi video dari situs Google. Lewat layanan ini bahkan pengguna Blogspot/Blogger tidak perlu login untuk dapat memajang video sebagai suntingan. Google Video menyediakan layanan video yang mudah digunakan.", "hackernews":"Hacker News adalah situs web berita sosial berfokus pada ilmu komputer dan kewirausahaan. Dijalankan oleh dana investasi Paul Graham dan inkubator startup, Y Combinator. Secara umum, konten yang dapat dikirimkan didefinisikan sebagai \"segala sesuatu yang memuaskan keingintahuan intelektual seseorang\".", - "hoogle":"Haskell adalah bahasa pemrograman fungsional murni. Nama bahasa pemrograman Haskell diambil dari nama seseorang matematikawan Haskell Curry, yang terkenal akan karyanya di bidang combinatory logic. Haskell hanya mengenal expression dan equation.", + "hoogle":"Haskell adalah merupakan bahasa pemrograman fungsional murni. Nama bahasa pemrograman Haskell diambil dari nama seseorang matematikawan Haskell Curry, yang terkenal akan karyanya di bidang combinatory logic. Haskell hanya mengenal expression dan equation.", "huggingface":"Hugging Face, Inc. adalah sebuah perusahaan Amerika Serikat yang mengembangkan perkakas untuk mengembangkan aplikasi menggunakan pembelajaran mesin. Perusahaan ini membangun sebuah perpustakaan transformer untuk aplikasi pengolahan bahasa alami dan sebuah platform yang digunakan oleh pengguna untuk berbagi model pembelajaran mesin dan kumpulan data.", "huggingface datasets":[ "huggingface:id", @@ -4928,6 +5061,18 @@ "https://learn.microsoft.com" ], "naver":"Naver adalah sebuah portal web populer di Korea Selatan, yang dimiliki oleh Naver Corporation. Naver diluncurkan pada bulan Juni 1999 oleh mantan karyawan Samsung, dan menjadi portal web pertama di Korea Selatan yang menggunakan sistem mesin pencari mereka sendiri. Salah satu di antara fitur Naver adalah \"Comprehensive Search\", yang diluncurkan pada 2000, yang menampilkan hasil dari berbagai kategori dalam satu laman.", + "naver images":[ + "naver:id", + "ref" + ], + "naver news":[ + "naver:id", + "ref" + ], + "naver videos":[ + "naver:id", + "ref" + ], "niconico":"Niconico , sebelum 2012 dikenal sebagai Nico Nico Douga , adalah sebuah layanan berbagi video Jepang di dunia maya. \"Niconico\" atau \"nikoniko\" adalah ideofon Jepang untuk tersenyum. Pada 2021, Niconico adalah situs web paling banyak dikunjungi ke-30 di Jepang, menurut Alexa Internet.", "nixos wiki":[ "nixos wiki:en", @@ -5159,6 +5304,18 @@ "ref" ], "naver":"Naver è una piattaforma online sudcoreana gestita da Naver Corporation. Ha debuttato nel 1999 come il primo portale web in Corea del Sud a sviluppare e utilizzare il proprio motore di ricerca. È stato anche il primo operatore al mondo a introdurre la funzione di ricerca completa, che raccoglie i risultati della ricerca da varie categorie e li presenta in un'unica pagina. Da allora Naver ha aggiunto una moltitudine di nuovi servizi che vanno dalle funzionalità di base come casella e-mail e sito di notizie alla prima piattaforma di domande e risposte online al mondo Knowledge iN.", + "naver images":[ + "naver:it", + "ref" + ], + "naver news":[ + "naver:it", + "ref" + ], + "naver videos":[ + "naver:it", + "ref" + ], "niconico":"Niconico , precedentemente conosciuto come Nico Nico Dōga , è un popolare sito web giapponese di video sharing gestito da Niwango, sussidiaria di Dwango.", "nixos wiki":[ "nixos wiki:en", @@ -5265,7 +5422,7 @@ "ref" ], "alpine linux packages":"Alpine Linux (アルパイン・リナックス) は、muslとBusyBoxをベースとしたLinuxディストリビューションである。セキュリティ・シンプルさ・リソース効率を重視するパワーユーザー向けに設計されている。Alpine Linuxではgrsecurity/PaXを適用したLinuxカーネルを使用しており、全てのユーザ空間バイナリがスタックスマッシング保護 付きの位置独立実行ファイル (PIE) としてコンパイルされている。", - "annas archive":"Anna's Archiveは、様々な書籍リソースへのアクセスを提供する無料の非営利オンラインシャドウライブラリメタサーチエンジンで、匿名のアーキビストのチーム によって、2022年11月にあったZ-Libraryに対する法的措置に対抗する目的で作られた。", + "annas archive":"Anna's Archiveは、2022年のZ-Libraryを閉鎖しようとする法執行機関の動きの直後、アンナという偽名の人物によって開設されたオープンソースの検索エンジンであり、シャドウライブラリを対象としている。Z-Library、Sci-Hub、Library Genesisを含む主要なシャドウライブラリなどの記録を集約している。自身を「人類史上最大の真にオープンな図書館」と称し、「存在するすべての書籍をカタログ化し、これらすべての書籍をデジタル形式で簡単に利用可能にするという人類の進展を追跡する」ことを目指すと述べている。このサイトは著作権のある資料のダウンロードについて責任を負わないと主張している。これは、このサイトがメタデータをインデックス化するのみで、ファイル自体は直接ホストせず、第三者によるダウンロードリンクを提供するのみであるためである。しかしながら、政府によるネット検閲や出版社および出版業界の業界団体による訴訟の対象となっており、大規模な著作権侵害に関与しているとされている。", "ansa":"ANSA通信 はイタリアの通信社。イタリアの主要新聞社36社が加盟する非営利の協同組合という形になっている。", "apple app store":"App Store(アップ・ストア)は、Appleが運営するiPhone、iPod touch、iPad向けアプリケーションのダウンロードサービスである。Mac OS X 10.6.6以降を搭載したMacにも同様のサービスがあるが、こちらは Mac App Store を参考のこと。", "apple maps":"マップ は、Appleが運営・開発する地図アプリケーション。iOS、iPadOS、macOS、watchOSのデフォルトの地図アプリケーションである。", @@ -5316,6 +5473,7 @@ "brave:ja", "ref" ], + "btdigg":"BTDiggは、初めてMainline DHTに対応した検索エンジンである。このサービスはBitTorrent DHTネットワークに参加し、ネットワークの維持や、マグネットリンクといくつかのトレント属性(名称、サイズ、ファイル一覧)の対応を支援していた。これらの属性はインデックス化されてデータベースに挿入されていた。エンドユーザーに対しては、BTDiggはWebインターフェースを通じて全文検索データベース検索を提供していた。検索システムのWeb部分は、ユーザーのテキストクエリにより適切な情報を取得していた。Web検索は欧州およびアジアの言語によるクエリに対応していた。プロジェクト名は「BitTorrent Digger」の略称であり、この文脈において「digger」はトレジャーハンターを意味する。2016年6月には検索エンジンスパムが原因とされる理由でサービスはオフラインとなった。しかし2025年現在、サービスは再びオンラインとなっていると報告されているが、IPフィルタリングの影響により通常のクリアネット接続からはアクセス困難な場合が多い。サービスはTorネットワークやTor Browser経由でアクセス可能である。", "currency":"DuckDuckGo(ダックダックゴー)は、インターネット検索エンジンである。利用者のプライバシーの保護と利用履歴等を記録保存しないことを運営方針としている。VivaldiやTor Browserの標準検索エンジンにも採用されている。また、DuckDuckGoは検索結果のパーソナライズを行わないため「フィルターバブル」に陥らない(DuckDuckGoはGoogleのフィルターバブル問題についてブログで指摘している)。", "dailymotion":"Dailymotion(デイリーモーション)は、Canal+傘下のDAILYMOTION SAが運営する、フランスの動画共有サービス。", "ddg definitions":[ @@ -5379,7 +5537,7 @@ "imgur":"Imgur は、アラン・シャーフが2009年にアメリカ合衆国オハイオ州アセンズで立ち上げたオンライン画像共有と画像管理サービスである。「家庭から、コメント、投票、共有によってコミュニティがリアルタイムでウェブにおける最も人気のある画像にアクセスする場所」と自称している。1日100万人以上のユーザーに無料の画像管理サービスとコメント型ソーシャルコミュニティを提供している。運営企業は広告販売や商用ホスティング、グッズ販売で収益を上げている。", "ina":"フランス国立視聴覚研究所 は、フランスの全ラジオ・テレビの視聴覚アーカイヴの宝庫である。ラジオフランスが主催し、放送局本部の建物内にある。内部にフランス音楽研究グループ を有する。", "iqiyi":"iQIYI は、中華人民共和国のビデオ・オン・デマンド及び動画配信サービスであり、百度傘下のオンラインエンターテイメント企業である。", - "library genesis":"Library Genesis(LibGen)は、様々な分野の論文・書籍の検索エンジンであり、有料で配布されていたり、どこにおいてもデジタル化されていなかったりするコンテンツを無料でアクセス可能にしている。特に、エルゼビアのScienceDirectウェブポータルで配布されているPDFファイルを収録している。", + "library genesis":"Library Genesis(LibGen)は、シャドウライブラリプロジェクトであり、ファイル共有によって学術雑誌の記事や学術書、一般向け書籍、画像、コミック、オーディオブック、雑誌などへのアクセスを提供している。他ではペイウォールで保護されていたり、デジタル化されていなかったりするコンテンツを無料でアクセス可能にしている。", "library of congress":"アメリカ議会図書館 は、アメリカ合衆国の事実上の国立図書館。蔵書数・予算額・職員数全ての点で世界最大規模の図書館である。", "mastodon hashtags":[ "mastodon users:ja", @@ -5389,6 +5547,18 @@ "mdn":"MDN Web Docsは、ウェブ標準及びMozillaプロジェクトの開発文書のためのMozillaの公式ウェブサイトである。以前の名称はMozilla Developer Network。", "metacpan":"CPAN とは、Perlのライブラリ・モジュールやその他のPerlで書かれたソフトウェアを集めた巨大なアーカイブで、世界中のサーバにその内容がミラーリングされている。再利用性・汎用性の高いモジュールが登録されており、Perlプログラマができるだけ車輪の再発明をせずに済むための支援環境となっている。登録モジュールの検索システムも提供されているため、Perlプログラマは望む機能を持ったモジュールを容易に入手することができる。", "naver":"ネイバー は、ネイバー (企業)が運営する、大韓民国(韓国)の最大手ポータルサイトである。", + "naver images":[ + "naver:ja", + "ref" + ], + "naver news":[ + "naver:ja", + "ref" + ], + "naver videos":[ + "naver:ja", + "ref" + ], "nixos wiki":[ "nixos wiki:en", "ref" @@ -5397,7 +5567,7 @@ "openlibrary":"Open Library(オープンライブラリ)とは「これまでに出版された本のウェブページ」を作るためのオンラインプロジェクトである。カリフォルニア州立図書館とケール・オースチン財団による非営利プロジェクト「インターネットアーカイブ」の一環として進められている。", "openstreetmap":"オープンストリートマップ は、自由に利用でき、なおかつ編集機能のある世界地図を作るオープンコラボレーションプロジェクトである。GPS機能を持った携帯機器、空中写真、衛星画像、他の地理情報システムからのデータをもとに作られていくのが基本だが、編集ツール上で道1本から手入力での追加も可能である。与えられた画像とベクトルデータセットはオープンデータベースライセンス (ODbL) 1.0のもと再利用可能である。", "pinterest":"Pinterest(ピンタレスト)とは、アメリカ合衆国カリフォルニア州サンフランシスコに本拠を置くPinterest, Inc.(ピンタレスト社)が運営・管理する写真共有サービス。アプリやウェブサイト方式によって提供され、ピンボード風の画面構成となっている。ユーザーはイベント・関心事・趣味などテーマ別の画像コレクションを作成・管理することができ、また他のユーザーが作成したピンボードを閲覧して自身のコレクションに加えたり、「好み」の写真として画像を「リピン」することもできるという特徴がある。", - "piratebay":"パイレート・ベイ は、デジタルコンテンツのトレントファイルを検索できるインデックスサイトである。2003年に、スウェーデンの反著作権団体Piratbyrånによって設立された。利用者はマグネットリンクおよびトレントファイルの検索、ダウンロード、掲載が可能である。マグネットリンクとトレントファイルは、BitTorrentプロトコルを用いたP2Pファイル共有に使用される。", + "piratebay":"パイレート・ベイ(The Pirate Bay、略称: TPB)は、無料の検索可能なオンラインインデックスで、「映画」「音楽」「ゲーム」「ポルノ」「ソフトウェア」を検索できる。2003年にスウェーデンのシンクタンクPiratbyrånによって設立された。パイレート・ベイではP2Pトレントプロトコルのユーザー間の接続を容易にし、ユーザーはマグネットリンクを追加することでサイトに貢献することができる。パイレート・ベイは一貫して世界で最も訪問されたトレントサイトの一つにランクしている。", "pubmed":"MEDLINE(メドライン)またはMEDLARS Online は、医学を中心とする生命科学の文献情報を収集したオンラインデータベースである。1964年に米国国立医学図書館 が作成したコンピューター化医学文献データベース「MEDLARS」は、1971年10月27日にオンライン検索サービスが開始され、1997年にはPubMedの名でインターネットに無料公開された後、改良が重ねられて成長を続け、2007年現在、月に7000万回程度のアクセスがある世界で最もよく使用される生物医学系データベースである。", "pypi":"Python Package Index は、プログラミング言語Pythonの、サードパーティーソフトウェアリポジトリである。すべてのオープンソースなPythonパッケージの包括的なカタログととらえることができる。 Pipなどのパッケージマネージャは、パッケージやその依存パッケージをPyPIからダウンロードしてインストールする機能を持つ。", "reddit":"Reddit(レディット)はアメリカ合衆国の掲示板型ソーシャルニュースサイト。主に英語圏のユーザーを対象とする。ニュース記事、画像のリンクやテキストを投稿し、コメントを付けることが可能。カリフォルニア州サンフランシスコに拠点を置くReddit, Inc.が運営する。2021年1月時点の月間利用者数は4億3000万人。欧米ではTwitterユーザー数並び利用時間を超える。", @@ -5440,7 +5610,7 @@ "wikidata":"ウィキデータ はウィキメディア財団が提供する共同編集型のデータベース(知識基盤)である。パブリックドメイン・ライセンスの下で、誰もが使用できるオープンデータを提供することを目的としている。ウィキメディア・コモンズがメディアファイルの格納場所を提供して他のウィキメディアプロジェクトがそれを利用する方法と同様に、データに対してこれを行う。ウィキデータはウィキベースソフトウェアを用いて稼働している。", "wikipedia":"ウィキペディア は、世界中のボランティアの共同作業によって執筆及び作成されるフリーの多言語インターネット百科事典。収録されている全ての内容がオープンコンテントで商業広告が存在しないということを特徴とし、主に寄付に依って活動している非営利団体「ウィキメディア財団」が所有・運営している。「ウィキペディア(Wikipedia)」という名前は、ウェブブラウザ上でウェブページを編集することができる「ウィキ(Wiki)」というシステムを使用した「百科事典」 であることに由来する造語である。設立者の1人であるラリー・サンガーにより命名された。", "wikisource":"ウィキソース (Wikisource) は、ウィキメディア財団が運営するウィキを利用した自由に利用できるテキストを集めた電子図書館である。ウィキソースはプロジェクトの名前でもあり、またプロジェクトのインスタンス(実体)である個々のサイト(主に各言語版)もウィキソースと呼ばれ、複数のウィキソースが集まって大きなウィキソースプロジェクトを形成している。ウィキソースの目的はあらゆる形態のフリーテキストを、多数の言語および翻訳においても提供することである。元々は有用または重要な歴史的文書を保存するアーカイブとして着想され、今では幅広いコンテンツを扱うライブラリとなっている。", - "wikispecies":"ウィキスピーシーズ (Wikispecies) は、ウィキメディア財団により運用されているウィキメディア・プロジェクトの一つ。言語別サイトには分かれておらず、コモンズと同じく各ページ内に多言語を併載する。 ウィキペディアやウィクショナリー等と同じく、ウィキベースのオンラインプロジェクトである。 動物界、植物界、菌界、真正細菌(細菌界)、古細菌、原生生物等々、ドメインや界から種や亜種に至るまであらゆる生物の分類の目録をフリーコンテントとして収集している。", + "wikispecies":"ウィキスピーシーズ は、ウィキメディア財団により運用されているウィキメディア・プロジェクトの一つ。言語別サイトには分かれておらず、コモンズと同じく各ページ内に多言語を併載する。ウィキペディアやウィクショナリー等と同じく、ウィキベースのオンラインプロジェクトである。動物界、植物界、菌界、真正細菌(細菌界)、古細菌、原生生物等々、ドメインや界から種や亜種に至るまであらゆる生物の分類の目録をフリーコンテントとして収集している。", "wiktionary":"ウィクショナリー (Wiktionary) は、コピーレフトなライセンス・オープンコンテントの辞書兼シソーラス(類語辞典)を作成し、配布することを目的としたウィキメディア財団によるプロジェクトである。GNU Free Documentation License (GFDL) およびクリエイティブ・コモンズ 表示 - 継承 3.0 非移植 のデュアルライセンスで公開される。2002年12月12日に活動を開始した。", "wolframalpha":"Wolfram Alpha(WolframAlphaともWolfram|Alphaとも表記される)は、ウルフラム・リサーチが開発した質問応答システム。事実についての質問に対して、構造化されたデータを使って計算し、直接答えを返すオンラインサービスである。他の検索エンジンのように、答えを含んでいる可能性のあるドキュメントやウェブページのリストを返すわけではない。このサービスは2009年3月に英国人科学者スティーブン・ウルフラムが発表し、同年5月15日に公開された。また、2018年6月18日には日本語版のWolfram Alphaも公開された。2022年時点では日本語に対応しているのは数学関連のクエリのみであるが、「5個のボールの並べ方は何通りあるか」「ニュートン法を使ってxcos x=0 を解く」などの質問に対して日本語で答えることができる。", "yacy":"YaCy(ヤシー、ヤスィー)とは、「人民による人民のためのウェブ検索」を標語する、オープンソースの分散型検索エンジンである。GPLv2でライセンスされている。YaCyのコアはJavaによって記述されており、ネットワークはピア・ツー・ピア (P2P)で構築されている。", @@ -5451,7 +5621,8 @@ "youtube":[ "YouTube でお気に入りの動画や音楽を楽しみ、オリジナルのコンテンツをアップロードして友だちや家族、世界中の人たちと共有しましょう。", "https://www.youtube.com/" - ] + ], + "z-library":"Z-Library は、シャドウライブラリプロジェクトであり、ファイル共有を通じて学術雑誌の記事、学術書、一般向け書籍へのアクセスを提供している。当初はLibrary Genesisのミラーサイトとして始まったが、その後劇的に広まった。" }, "ko":{ "9gag":"9GAG는 홍콩의 이미지 기반 소셜 미디어 사이트이다. 2011년 12월 기준 월 페이지뷰가 10억 건을 넘었다. 인터넷에 유행하는 이미지가 주로 올라오는 것으로 알려져 있다. 레딧과 같은 다른 비슷한 사이트와 마찬가지로 게시글에 덧글과 추천을 할 수 있다.", @@ -5600,7 +5771,19 @@ "mullvadleta:ko", "ref" ], - "naver":"네이버(영어: NAVER)는 1999년 6월에 출시된 대한민국의 포털사이트이다. 또한 네이버는 1997년 2월 26일 이해진, 권혁일, 김보경, 구창진, 오승환, 최재영, 강석호 등으로 구성된 삼성SDS의 사내 벤처에서 '웹글라이더'라는 이름으로 시작해서 1998년 1월에 분리된 네이버컴 주식회사에서 운영하다가 2000년 자회사인 한게임과 합병하여 NHN이 된 후 재분리하여 현재는 네이버(주)에서 운영하고 있다.(검색창;네이버)", + "naver":"네이버(영어: NAVER)는 1999년 6월에 출시된 대한민국의 포털사이트이다. 또한 네이버는 1997년 2월 26일 이해진, 권혁일, 김보경, 구창진, 오승환, 최재영, 강석호 등으로 구성된 삼성SDS의 사내 벤처에서 '웹글라이더'라는 이름으로 시작해서 1998년 1월에 분리된 네이버컴 주식회사에서 운영하다가 2000년 자회사인 한게임과 합병하여 NHN이 된 후 재분리하여 현재는 네이버(주)에서 운영하고 있다.(검색창;네이버) 네이버가 사실 삼성전자 이랑 합병하려고 했으나 실패했다", + "naver images":[ + "naver:ko", + "ref" + ], + "naver news":[ + "naver:ko", + "ref" + ], + "naver videos":[ + "naver:ko", + "ref" + ], "niconico":"니코니코 동화(일본어: ニコニコ動画 니코니코 도가[*], 영어: Niconico)는 일본의 동영상 사이트이다. 가도카와 디완고에서 운영하고 있다. 줄여서 니코동이나 니코니코로도 칭하며, 동영상 시청자가 직접 영상 화면에 코멘트를 삽입할 수 있다는 것이 큰 특징이다. 니코니코 동화 모바일 서비스를 운영하여, 일본에서는 모바일로도 사이트에 접속할 수 있다. 니코니코(にこにこ, ニコニコ)는 일본어로 \"싱글벙글\" 또는 \"생글생글\"을, 동화(動畵)는 이야기가 아닌 \"동영상\"을 뜻한다.", "nixos wiki":[ "nixos wiki:en", @@ -5631,7 +5814,7 @@ "ref" ], "reddit":"레딧(Reddit)은 미국의 소셜 뉴스 집계, 콘텐츠 등급 및 토론 웹사이트이다. 등록된 사용자(일반적으로 \"레디터\"라고 함)는 링크, 텍스트 게시물, 이미지, 동영상 등의 콘텐츠를 사이트에 제출한 후 다른 회원에 의해 투표된다. 게시물은 주제별로 \"커뮤니티\" 또는 \"서브레딧\"이라고 불리는 사용자가 만든 게시판으로 구성된다. 더 많은 업보트가 있는 제출물은 하위 레딧의 맨 위에 표시되며, 충분한 업보트를 받은 경우 최종적으로 사이트의 첫 페이지에 표시된다. 레딧 관리자는 커뮤니티를 관리하며 중재는 레딧 직원이 아닌 커뮤니티별 중재자에 의해 수행된다.", - "reuters":"로이터(Reuters)는 통신사의 하나다. 독일인 파울 율리우스 로이터(Paul Julius Baron von Reuter)가 설립한 영국의 뉴스 및 정보제공기업이다. 현재는 신문, 방송 등에 뉴스를 공급하는 전통적인 통신사의 기능보다 증시 시황 속보 등 금융정보 제공 등의 비중이 커져 있다.", + "reuters":"로이터(Reuters)는 통신사의 하나로, 독일인 파울 율리우스 로이터(Paul Julius Baron von Reuter)가 설립한 영국의 뉴스 및 정보제공기업이다. 현재는 신문, 방송 등에 뉴스를 공급하는 전통적인 통신사의 기능보다는, 오히려 경제 증시 시황 속보 등 금융 정보 제공 등의 비중이 커져 있다.", "rottentomatoes":"로튼 토마토(Rotten Tomatoes)는 영화 관련 웹사이트 가운데 하나이다. 영화에 대한 소식, 비평, 정보 등을 제공한다. 주로 비평가 위주의 평점을 매기는 곳이다. 사이트 이름은 옛날 공연을 보던 관객들이 연기력이 매우 나쁜 연기자들에게 토마토를 던졌던 것에서 비롯되었다.", "rubygems":"RubyGems는 루비 프로그래밍 언어를 위한 패키지 관리자이다. 루비 프로그램들과 라이브러리들을 배포하기 위한 표준 포맷을 제공한다. 그 외에 gems의 설치를 쉽게 관리하도록 설계된 도구와 이들을 배포하기 위한 서버도 제공한다. RubyConf 2004 기간 중 Chad Fowler, Jim Weirich, David Alan Black, Paul Brannan, Richard Kilmer에 의해 개발되었다.", "rumble":"럼블(Rumble)은 온타리오주 토론토에 본사를 두고 플로리다주 롱보트 키에 미국 본사를 두고 있는 온라인 비디오 플랫폼, 웹 호스팅, 클라우드 서비스 기업이다. 캐나다의 기술 기업가인 크리스 파블롭스키(Chris Pavlovski)가 2013년에 설립했다. 럼블의 클라우드 서비스 사업은 트루스 소셜을 호스팅하며, 비디오 플랫폼은 미국 우익 및 극우 사용자들 사이에서 인기가 있다. 럼블은 \"알트테크\"(alt-tech)로 설명되었다.", @@ -5674,7 +5857,7 @@ "wikinews":"위키뉴스(영어: Wikinews)는 위키미디어 재단의 뉴스 소스이다. 위키뉴스는 GNU 자유 문서 사용 허가서 1.2 이상에 따라 배포되는 위키미디어 재단의 다른 프로젝트와는 달리 크리에이티브 커먼즈의 저작자표시 사용 허가서 2.5 이상의 라이선스를 가진다. 위키뉴스에서 지지하는 중립적 시각 정책은 오마이뉴스와 같은 시민 언론의 노력과는 구별된다. 위키미디어 재단의 대부분의 프로젝트와 달리 위키뉴스는 독자적인 리포트와 인터뷰 형태의 독자적인 기사를 허용한다.", "wikipedia":"위키백과(위키百科, IPA: [ɥikçibɛ̝k̚k͈wa̠], [ykçibɛ̝k̚k͈wa̠] ) 또는 위키피디아(영어: Wikipedia, IPA: [ˌwɪkɪˈpiːdɪə] )는 누구나 자유롭게 쓰는 다언어판 온라인 백과사전이다. 협업을 개방한 위키 기반 편집 시스템을 사용하여 자발적인 위키백과 사용자 공동체가 작성하고 관리한다. 위키백과는 대표적인 집단 지성의 사례로 평가받으며 역사상 최대로 가장 많이 읽는 참고서이기도 하다. 시밀러웹과 (과거) 알렉사 인터넷에서 가장 인기있는 웹사이트 10곳 중 하나로 꾸준히 순위를 올린다. 2024년 1월 기준으로 위키백과는 세계에서 7번째로 인기있는 사이트로 순위를 올렸다. 위키백과는 자유 저작물을 보유하고 상업적인 광고가 없다. 주로 기부금으로 지원을 받는 비영리 단체인 위키미디어 재단이 소유하고 지원한다.", "wikiquote":"위키인용집(Wikiquote)은 위키백과의 자매 프로젝트로, 2004년 7월부터 영어판 위키인용집을 시작으로 여러 언어로 프로젝트가 번역되었다. 이 프로젝트의 목표는 유명한 인물이 한 말이나 책의 문장 등을 인용하고 해석하는 것이니 일종의 어록이라고 할 수 있다.", - "wikisource":"위키문헌(-文獻, 영어: Wikisource)은 위키미디어 재단에서 추진하고 있는 프로젝트이다. 위키문헌 프로젝트의 목표는 모든 사람들이 자유로이 쓸 수 있는 정보자료를 한 곳에 모으는 것이다. 자비 출판 문서나 서적을 올리는 것은 허용되지 않는다.", + "wikisource":"위키문헌(-文獻, 영어: Wikisource)은 위키미디어 재단이 운영하는 자유 콘텐츠 문헌의 온라인 위키 기반 디지털 도서관이다. 위키문헌 프로젝트의 목표는 모든 사람들이 자유로이 쓸 수 있는 정보자료를 한 곳에 모으는 것이다. 자비 출판 문서나 서적을 올리는 것은 허용되지 않는다.", "wikispecies":"위키생물종(Wikispecies 위키스피시즈[*])은 위키미디어 재단의 지원을 받는 생물 분류 도감용 프로젝트이다.", "wikiversity":"위키배움터(영어: Wikiversity 위키버시티[*])는 위키미디어 재단의 프로젝트이다. URL은 www.wikiversity.org이다. 위키버시티는 2006년 8월 15일 영어판이 제일 먼저 시작했으며 새로운 언어판들이 위키배움터 베타에서 시험판으로 생기고 있다. 위키배움터는 모두에게 열린 학습공간을 지향한다.", "wikivoyage":"위키여행(Wikivoyage, 프랑스어 발음: //, 비키부아야주; 영어 발음: //, 위키보이지)은 자발적 참여자가 함께 만들어가는 여행 가이드북 웹사이트이다. 이름은 위키(wiki)와 여행을 뜻하는 프랑스어 부아야주(voyage)를 합쳐 만들었다.", @@ -6118,7 +6301,7 @@ "youtube":"ഗൂഗിൾ ഉടമസ്ഥതയിലുള്ള ഇന്റർനെറ്റ് വീഡിയോ ഷെയറിംഗ് വെബ്‌സൈറ്റാണ്‌ യൂട്യൂബ്. ഈ സംവിധാനത്തിലൂടെ ലോകത്തെവിടെനിന്നും ഉപഭോക്താക്കൾക്ക് വീഡിയോ ഖണ്ഡങ്ങൾ മറ്റുള്ളവരുമായി പങ്കുവയ്ക്കുവാൻ കഴിയുന്നു. 2005 ഫെബ്രുവരിയിൽ പേയ്പാൽ എന്ന ഇ-വ്യാപാര കമ്പനിയിൽ ജോലി ചെയ്തിരുന്ന സ്റ്റീവ് ചെൻ, ചാഡ് ഹർലി, ജാവേദ് കരീം എന്നിവരാണ് യൂട്യൂബ് സ്ഥാപിച്ചത്. കാലിഫോർണിയയിലെ സാൻ ബ്രൂണൊ അസ്ഥാനമാക്കി പ്രവർത്തനമാരംഭിച്ച ഈ വെബ് സേവന കമ്പനി അഡോബ് ഫ്ലാഷ് സാങ്കേതിക വിദ്യ അടിസ്ഥാനമാക്കിയാണു പ്രവർത്തിക്കുന്നത്. വീഡിയോ ഖണ്ഡങ്ങൾ, സംഗീതം, ടെലിവിഷൻ പരിപാടികൾ തുടങ്ങിയവയെല്ലാം ഈ വെബ് സൈറ്റ് വഴി പങ്കുവയ്ക്കപ്പെടുന്നുണ്ട്. യുട്യൂബിൽ അംഗമായാൽ ആർക്കും വീഡിയോകൾ അപ്‌ലോഡ് ചെയ്യാവുന്നതാണ്. ശ്ലീലമായ വീഡിയോകൾ മാത്രമാണ് അനുവദിക്കുക. പുതിയ ഉപഭോക്താക്കൾക്ക് 10 മിനുട്ടിൽ കൂടുതൽ വീഡിയോ കയറ്റാൻ അനുമതി നൽകുന്നില്ല. ഓർക്കുട്ട് പോലെ തന്നെ എല്ലാ രാജ്യങ്ങളിലും യുട്യൂബിനു അനുമതി നൽകിയിട്ടില്ല. ഉപഭോക്താക്കൾക്ക് യൂട്യൂബിൽ നിന്ന് വീഡിയോ ഖണ്ഡങ്ങൾ ഡൗൺലോഡ് ചെയ്യാനും സാധിക്കും.വെബ്‌സൈറ്റ്, മൊബൈൽ അപ്ലിക്കേഷനുകൾ എന്നിവ ഉൾപ്പെടെ വീഡിയോകൾ കാണാനും മറ്റ് വെബ്‌സൈറ്റുകൾ കൂട്ടിച്ചേർക്കാനായി യൂട്യൂബ് നിരവധി മാർഗങ്ങൾ നൽകുന്നു. ലഭ്യമായ ഉള്ളടക്കത്തിൽ സംഗീത വീഡിയോകൾ, വീഡിയോ ക്ലിപ്പുകൾ, ഹ്രസ്വ, ഡോക്യുമെന്ററി ഫിലിമുകൾ, ഓഡിയോ റെക്കോർഡിംഗുകൾ, മൂവി ട്രെയിലറുകൾ, തത്സമയ സ്ട്രീമുകൾ, വീഡിയോ ബ്ലോഗുകൾ എന്നിവ ഉൾപ്പെടുന്നു. മിക്ക ഉള്ളടക്കവും സൃഷ്ടിക്കുന്നത് വ്യക്തികളാണ്, പക്ഷേ മീഡിയ കോർപ്പറേഷനുകളും വീഡിയോകൾ പ്രസിദ്ധീകരിക്കുന്നു. കാണുന്നതിനും അപ്‌ലോഡുചെയ്യുന്നതിനും പുറമെ, രജിസ്റ്റർ ചെയ്ത ഉപയോക്താക്കൾക്ക് വീഡിയോകളിൽ അഭിപ്രായമിടാനും റേറ്റുചെയ്യാനും പ്ലേലിസ്റ്റുകൾ സൃഷ്ടിക്കാനും മറ്റ് ഉപയോക്താക്കൾക്ക് സബ്സ്ക്രൈബ് ചെയ്യാനും കഴിയും. 2005 ൽ സ്ഥാപിതമായ യുട്യൂബ് തൊട്ടടുത്ത വർഷം ഗൂഗിൾ 1.65 ബില്യൺ യുഎസ് ഡോളറിന് സ്വന്തമാക്കി. 2020 ൽ 19.8 ബില്യൺ ഡോളർ സമ്പാദിച്ച യൂട്യൂബ് ഗൂഗിളിന്റെ ഏറ്റവും ലാഭകരമായ അനുബന്ധ സ്ഥാപനങ്ങളിലൊന്നായി ഇത് മാറി. ഗൂഗിളിന്റെ ആഡ്സെൻസ്(AdSense) പ്രോഗ്രാമിൽ നിന്ന് യൂട്യൂബും തിരഞ്ഞെടുത്ത സ്രഷ്‌ടാക്കളും പരസ്യ വരുമാനം നേടുന്നു. ഭൂരിഭാഗം വീഡിയോകളും കാണാൻ സൗജന്യമാണ്, പക്ഷേ ചിലതിന് സംഗീതമോ പ്രീമിയം സബ്സ്ക്രിപ്ഷനോ ആവശ്യമാണ്." }, "ms":{ - "annas archive":"Anna's Archive ialah enjin metasearch perpustakaan bayangan dalam talian percuma yang menyediakan akses kepada pelbagai sumber buku. Laman web ini ditubuhkan oleh pasukan arkivis tanpa nama dan dilancarkan sebagai tindak balas langsung kepada usaha penguatkuasaan undang-undang untuk menutup Z-Library pada November 2022 yang dibantu oleh Persatuan Penerbit dan Persatuan Pengarang.", + "annas archive":"Anna's Archive ialah enjin carian meta perpustakaan bayangan dalam talian percuma yang menyediakan akses kepada pelbagai sumber buku. Laman web ini ditubuhkan oleh pasukan arkivis tanpa nama dan dilancarkan sebagai tindak balas langsung kepada usaha penguatkuasaan undang-undang untuk menutup Z-Library pada November 2022 yang dibantu oleh Persatuan Penerbit dan Persatuan Pengarang.", "apple app store":"App Store adalah platform pengedaran digital, dibangunkan dan diselenggarakan oleh Apple Inc., untuk aplikasi mudah alih pada sistem operasi iOS. Kedai ini membolehkan pengguna melayari dan memuat turun aplikasi yang dibangunkan dengan kit pembangunan perisian iOS Apple. Apl boleh dimuat turun di telefon pintar iPhone, komputer pegang tangan iPod Touch, atau komputer tablet iPad, dan sesetengahnya boleh dipindahkan ke Apple Watchsmartwatch atau generasi ke-4 atau lebih baru Apple TV sebagai sambungan aplikasi iPhone.", "apple maps":"Peta ialah sebuah aplikasi dan perkhidmatan peta dalam talian oleh Apple.", "artic":"Institut Seni Chicago ialah sebuah muzium seni halus luas yang terletak di Grant Park, Chicago, Illinois. Institut seni ini menempatkan salah sebuah koleksi seni Impresionis dan Pasca-Impresionis yang terpenting di dunia. Antara pegangan-pegangannya yang beraneka termasuk karya Pelukis Agung, seni Amerika Syarikat, seni perhiasan Eropah dan Amerika, seni Asia dan seni moden dan kontemporari tersohor. Ia terletak di 111 South Michigan Avenue di Chicago Landmark Historic Michigan Boulevard District. Muzium ini bergabung dengan Sekolah Institut Seni Chicago. Pada keluasan sejuta kaki persegi, institut ini adalah muzium seni kedua terbesar di Amerika Syarikat, mengekori Muzium Seni Metropolitan di New York.", @@ -6223,6 +6406,18 @@ ], "mastodon users":"Mastodon adalah perisian khidmat rangkaian sosial bersumber terbuka dan bebas yang swarumah. Ia memiliki ciri mikroblog mirip infrastruktur Twitter yang ditawarkan oleh sejumlah besar pelayan Mastodon yang dijalankan secara mandiri melalui titik-titik sambung dikelola dengan aturan tatalaku, kawalan edaran kandungan dan ketentuan penggunaan yang tersendiri.", "naver":"Naver ialah platform dalam talian Korea Selatan yang dikendalikan oleh Naver Corporation. Ia dimulakan pada tahun 1999 sebagai portal web pertama di Korea yang membangun dan menggunakan enjin carian sendiri. Ia juga merupakan operator pertama di dunia untuk memperkenalkan ciri carian komprehensif yang mennyusun hasil carian dari pelbagai kategori dan membentangkannya dalam satu halaman. Sejak itu, Naver telah menambahkan banyak perkhidmatan baru dari ciri-ciri asas seperti e-mel dan berita sehingga ke platform Q&A dalam talian pertama yang dikenali sebagai Knowledge iN.", + "naver images":[ + "naver:ms", + "ref" + ], + "naver news":[ + "naver:ms", + "ref" + ], + "naver videos":[ + "naver:ms", + "ref" + ], "nixos wiki":[ "nixos wiki:en", "ref" @@ -7382,6 +7577,18 @@ "ref" ], "naver":"Naver – popularny południowokoreański serwis internetowy będący własnością Naver Corporation. Został uruchomiony w czerwcu 1999 roku przez byłych pracowników Samsunga. Zadebiutował jako pierwszy południowokoreański serwis wykorzystujący autorskie algorytmy przeszukiwania. Posiadał co najmniej 70% udziałów na koreańskim rynku w 2011 roku.", + "naver images":[ + "naver:pl", + "ref" + ], + "naver news":[ + "naver:pl", + "ref" + ], + "naver videos":[ + "naver:pl", + "ref" + ], "niconico":"Niconico , dawniej Nico Nico Douga lub w skrócie „Nico-dō” – japoński serwis internetowy umożliwiający udostępnianie filmów, zarządzany przez Niwango, filię Dwango. „Niconico” jest onomatopeją uśmiechu. Do 18 kwietnia 2012 roku platforma Niconico była czternastym najczęściej odwiedzanym serwisem internetowym. Strona zdobyła japońską nagrodę Good Design Award w 2007 roku i Honorary Mention w kategorii Digital Communities podczas Prix Ars Electronica w 2008 roku.", "npm":"npm – domyślny manager pakietów dla środowiska Node.js, może być także używany do zarządzania warstwą front-end aplikacji WWW. NPM to także repozytorium pakietów oraz nazwa firmy która nim zarządza. Istnieją także inne managery pakietów, które korzystają z repozytorium npm., np. Yarn.", "openlibrary":"Open Library – projekt online mający na celu stworzenie „one web page for every book ever published” [jedną stronę internetową dla każdej opublikowanej książki], z danymi o książkach na licencji CC0, oraz o kodzie źródłowym na licencji AGPLv3. Stworzony przez Aarona Swartza, Brewstera Kahle’a, Alexisa Rossiego, Ananda Chitipothu, oraz Rebeccę Hargrave Malamud, jest projektem Internet Archive, organizacji non-profit. Został częściowo sfinansowany z dotacji Biblioteki Stanowej Kalifornii i Fundacji Kahle/Austin. Open Library udostępnia cyfrowe kopie online w wielu formatach, utworzone z obrazów wielu książek należących do domeny publicznej, o wyczerpanym nakładzie, oraz te w druku.", @@ -7508,14 +7715,14 @@ ], "btdigg":"O BTDigg é o primeiro mecanismo de pesquisa BitTorrent DHT. Ele participou da rede BitTorrent DHT, suportando a rede e fazendo correspondência entre links magnéticos e alguns atributos de torrent que são indexados e inseridos em um banco de dados. Para usuários finais, o BTDigg fornece uma pesquisa de banco de dados em texto completo via interface da web. A web part de seu sistema de pesquisa recuperou informações adequadas por meio de uma consulta de texto do usuário. A pesquisa na Web suportava consultas nos idiomas europeu e asiático. O nome do projeto era um acrônimo de BitTorrent Digger. Ficou offline em junho de 2016, devido a um índice de spam. O site retornou no final de 2016 em um domínio pontocom, ficou offline novamente e agora está online. O site btdig.com tem a fonte de origem do rastreador de torrents listada no Github, dhtcrawler2.", "crossref":"A Crossref é uma organização sem fins lucrativos de infraestrutura digital aberta voltada à comunidade global de pesquisa acadêmica. É a maior agência de registro de Identificadores Digitais de Objetos da Fundação Internacional DOI. Tem mais de 19.000 membros de mais de 150 países que representam editoras, bibliotecas, instituições de pesquisa e agências de fomento, tendo sido lançado no início de 2000 como um esforço cooperativo entre editoras para permitir links de citação persistentes entre plataformas distintas. Até julho de 2023, a Crossref havia identificado e conectado 150 milhões de registros de metadados para objetos de pesquisa, disponibilizando-os abertamente para reuso sem restrições. Eles intermediam uma média de 1,1 bilhão de resoluções de DOIs todo mês e recebem por volta de 1 bilhão de consultas de metadados todo mês.", - "currency":"DuckDuckGo é um motor de pesquisa sediado em Paoli, Pensilvânia que tem a particularidade de utilizar informações de contribuições colaborativas para melhorar a relevância dos resultados. O motor de pesquisa se define como tendo foco na privacidade ao não registrar as informações dos usuários.", + "currency":"DuckDuckGo é um motor de pesquisa sediado em Paoli, Pensilvânia, do qual tem a particularidade de utilizar informações de contribuições colaborativas para melhorar a relevância dos resultados. Além disso, este motor se define como focado na privacidade dos usuários ao não registrar as suas informações.", "dailymotion":"Dailymotion é uma plataforma de compartilhamento de vídeos fundada em março de 2005 na França. Ela disponibiliza vídeos dos mais variados conteúdos aos seus usuários. É um dos mais acessados do mundo. De acordo com dados fornecidos em novembro de 2006, o serviço recebia cerca de dezesseis milhões de acessos e nove mil vídeos diariamente.", "ddg definitions":[ "currency:pt", "ref" ], "deezer":"Deezer é um serviço de streaming de áudio lançado em 2007. Disponível para usuários de mais de 180 países, a plataforma possui atualmente mais de 90 milhões de músicas, mais de 100 milhões de playlists e mais de 4 milhões de programas de áudio, como podcasts, em seu acervo. É uma empresa de capital fechado, com sede em Paris, e escritórios em Londres, Berlim, Miami, São Paulo e em outros lugares do mundo. Criada em Paris, França, a Deezer possui 16 milhões de usuários ativos mensais, permitindo que os usuários ouçam conteúdo de música de gravadoras incluindo EMI, Sony, Universal Music Group e Warner Music Group.", - "deviantart":"DeviantArt, Inc é uma empresa virtual estadunidense, formando um site que voltado para artistas. Ela permite que iniciantes ou profissionais compartilhem, promovam e interajam por meio de obras de arte digitalizadas, incorporando tanto a fotografia, videografia, literatura, fotomanipulação, arte tradicional, arte clássica e arte contemporânea.", + "deviantart":"DeviantArt, Inc é uma empresa virtual, criada nos Estados Unidos, na forma de um website direcionado para artistas. Ele permite que iniciantes ou profissionais compartilhem, promovam e interajam por meio de obras de arte digitalizadas, incorporando tanto a fotografia, videografia, literatura, foto-manipulação, arte tradicional, arte clássica e arte contemporânea.", "duckduckgo":[ "currency:pt", "ref" @@ -7574,6 +7781,10 @@ "imdb":"IMDb, por extenso Internet Movie Database, é uma base de dados online de informação sobre cinema, TV, música e games, hoje pertencente à Amazon.", "imgur":"Imgur é um servidor de hospedagem de imagem fundado em 2009 por Alan Schaaf. O lema da empresa é \"O lar da hospedagem de imagens mais popular da internet, com auxilio em tempo real por uma comunidade dedicada que comenta, vota e compartilha”.", "ina":"Institut national de l'audiovisuel (Ina) é uma instituição pública francesa, de caráter industrial e comercial, encarregada principalmente do arquivamento de produções audiovisuais. Também é responsável pela produção, edição, cessão de conteúdos audiovisuais e multimídia destinados a todos os públicos, profissionais ou particulares. O Ina é também um centro de formação e pesquisa que visa desenvolver e transmitir conhecimento nas áreas ligadas à produção audiovisual. É associado à Federação Internacional da Indústria Fonográfica - IFPI.", + "ipernity":[ + "A maior comunidade não-comercial de partilha de fotos, vídeos e blogues do mundo - apenas financiada pelas cotas dos membros, sem fins de lucro.", + "https://www.ipernity.com" + ], "iqiyi":"iQIYI, anteriormente Qiyi, é uma plataforma de streaming com sede em Pequim, China, lançada em 22 de abril de 2010.", "kickass":"O KickassTorrents é um site fundado em 2008 que fornece arquivos de torrent e links magnéticos para facilitar a partilha de ficheiros peer-to-peer usando o protocolo BitTorrent. Em novembro de 2014, o KAT tornou-se o site torrent mais visitado no mundo, ultrapassando o The Pirate Bay, segundo o ranking Alexa.", "lemmy comments":[ @@ -7607,6 +7818,18 @@ "https://learn.microsoft.com" ], "naver":"Naver é um popular portal de busca da Coreia do Sul, com um market share superior a 70%, comparado com 2% do Google. O Naver foi lançado em junho de 1999 por ex-funcionários da Samsung, e estreou como o primeiro portal da Coreia do Sul a usar seu próprio motor de busca. Entre os recursos do Naver está a \"Comprehensive Search\", lançada em 2000, que fornece resultados de várias categorias em uma única página. Desde então, tem agregado novos serviços, como a \"Knowledge Search\", lançada em 2002. Ele também oferece serviços de Internet, incluindo um serviço de notícias, um serviço de e-mail, um serviço de busca de teses acadêmicas e um portal para crianças. Em 2005, Naver lançou Happybean, o primeiro portal de doações online do mundo, que permite aos usuários encontrar informações e fazer doações para mais de 20.000 organizações da sociedade civil e de assistência social.", + "naver images":[ + "naver:pt", + "ref" + ], + "naver news":[ + "naver:pt", + "ref" + ], + "naver videos":[ + "naver:pt", + "ref" + ], "niconico":"Niconico é um serviço de armazenamento de vídeo japonês online. \"Niconico\" ou \"nikoniko\" é uma palavra japonesa para sorriso. Até setembro de 2015, Niconico era o 10.º sítio eletrônico mais visitado do Japão, de acordo com os rankings de tráfego do Alexa. O sítio venceu o Prêmio Good Design Japonês em 2007 e recebeu uma Menção Honrosa na categoria Comunidades Digitais na Prix Ars Electronica 2008.", "nixos wiki":[ "nixos wiki:en", @@ -7999,6 +8222,18 @@ "naver:pt", "ref" ], + "naver images":[ + "naver:pt", + "ref" + ], + "naver news":[ + "naver:pt", + "ref" + ], + "naver videos":[ + "naver:pt", + "ref" + ], "niconico":[ "niconico:pt", "ref" @@ -8512,6 +8747,18 @@ "ref" ], "naver":"Naver — крупнейший интернет-портал и самая популярная поисковая система в Южной Корее. На него приходится 70 % поисковых запросов в стране. Принадлежит компании Naver Corporation. Был открыт в 1999 году. Тогда Naver первым из корейских интернет-порталов разработал свою собственную поисковую систему.", + "naver images":[ + "naver:ru", + "ref" + ], + "naver news":[ + "naver:ru", + "ref" + ], + "naver videos":[ + "naver:ru", + "ref" + ], "niconico":"Nico Nico Douga (яп. ニコニコ動画 Нико Нико До:га) или niconico — японский видеохостинг. Основан в 2006 году. Одна из особенностей дизайна – всплывающие комментарии с таймкодом. Также зрители могут маркировать видеофайл тегами, классифицируя его содержимое. Регистрация не является обязательной для просмотра и поиска видео.", "nixos wiki":[ "NixOS Wiki — NixOS Wiki", @@ -8545,7 +8792,7 @@ ], "reddit":"Reddit — сайт, сочетающий черты социальной сети и форума, на котором зарегистрированные пользователи могут размещать ссылки на какую-либо понравившуюся информацию в интернете и обсуждать её. Как и многие другие подобные сайты, Reddit поддерживает систему голосования за понравившиеся сообщения — наиболее популярные из них оказываются на заглавной странице сайта. Один из наиболее популярных сайтов в мире — 20-е место по посещаемости по данным SimilarWeb.", "reuters":"«Рейтер» — одно из крупнейших в мире международных агентств новостей и финансовой информации, существует с 1851 года.", - "rottentomatoes":"Rotten Tomatoes — сайт-агрегатор рецензий, на котором собирают обзоры фильмов и сериалов из различных изданий, информацию о фильмах и новости кинематографа. На основе отзывов, оставленных критиками в СМИ, Rotten Tomatoes вычисляет рейтинг одобрения каждого фильма.", + "rottentomatoes":"Rotten Tomatoes — сайт-агрегатор рецензий, на котором собирают обзоры фильмов и сериалов из различных изданий, информацию о фильмах и новости кинематографа. На основе отзывов, оставленных критиками в СМИ, Rotten Tomatoes вычисляет рейтинг одобрения каждого фильма. Данные Rotten Tomatoes и его главного конкурента Metacritic часто используют как способ измерить качество фильма или его успех у профессиональных критиков.", "rubygems":"RubyGems (от англ. gem, gems— драгоценный камень) — система управления пакетами для языка программирования Руби, которая предоставляет стандартный формат для программ и библиотек Руби, инструменты, предназначенные для простого управления установкой «gems», и сервер для их распространения.", "rumble":"Rumble — канадский видеохостинг и облачная система хранения, имеющий штаб-квартиры в канадском Торонто и Лонгбот-Ки. Основан в октябре 2013 года канадским предпринимателем Крисом Павловски.", "semantic scholar":"Semantic Scholar (англ. Semantic Scholar — поисковая интернет-платформа, разработанная в Институте искусственного интеллекта Аллена. Проект был запущен в 2015 году. Поиск научных публикаций производится с поддержкой искусственного интеллекта для статей в научных журналах. Поисковый сервис комбинирует машинное обучение, обработку естественного языка и машинного зрения, чтобы добавить слой семантического анализа к традиционным методам анализа цитирования. Semantic Scholar выделяет наиболее важные статьи, а также связи между ними.", @@ -8853,7 +9100,7 @@ "wikivoyage":"Wikicesty je webový cestovateľský sprievodca pre turistické destinácie a cestovateľské témy písaný dobrovoľníkmi. Ide o sesterský projekt Wikipédie a spravuje ho Nadácia Wikimedia.", "wiktionary":"Wikislovník je mnohojazyčný a otvorený webový projekt určený na vytvorenie slobodného úplného slovníka vo všetkých prirodzených jazykoch a niekoľkých umelých. Jeho heslá môžu obsahovať definície, výslovnosť, skloňovanie, príklady použitia, podobné výrazy, obrázky na ilustráciu a ďalšie možnosti. Stránka je spoločne upravovaná cez wiki a jej názov vznikol spojením slov wiki a slovník. Rovnako ako jeho sesterské projekty, akou napríklad Wikipédia, je prevádzkovaný Wikimedia Foundation a písaný dobrovoľníkmi, ktorí sa volajú Wikislovníkári. Je dostupný v 171 jazykoch a jednej jazykovej verzii pre jednoduchú angličtinu. Jeho slovenská mutácia dosiahla dňa 18. januára 2019 25 000 hesiel. Vďaka softvéru MediaWiki môže skoro každý s prístupom na internet vytvárať a upravovať heslá.", "wolframalpha":"Wolfram Alpha je internetová služba slúžiaca k vyhľadávaniu a znázorneniu informácií prevažne súvisiacich s matematikou a súvisiacimi vedeckými oblasťami. Služba bola vyvinutá spoločnosťou Wolfram Research a je založená na softvéri Mathematica. Služba bola spustená v máji 2009 Stephenom Wolframom. V roku 2009 bola vyhlásená americkým magazínom Popular Science ako najväčšia počítačová inovácia roku.", - "youtube":"YouTube je internetová databáza videí, väčšinou krátkych. YouTube založil Chad Hurley v roku 2005 a v novembri 2006 ho kúpil Google. V súčasnosti ide o najväčší svetový systém na zdieľanie video súborov na internete." + "youtube":"YouTube je internetová databáza videí, väčšinou krátkych. YouTube založil Chad Hurley v roku 2005 a v novembri 2006 ho odkúpila spoločnosť Google. V súčasnosti ide o najväčší svetový systém na zdieľanie video súborov na internete." }, "sl":{ "acfun":[ @@ -8974,6 +9221,10 @@ "github":"GitHub je spletni gostiteljski servis za repozitorije v Git. Ponuja distribuirano upravljanje z izvorno kodo (SCM) z Git ter nekatere dodatne storitve. V nasprotju z Git-om, ki je ukazno orodje, ponuja GitHub spletni grafični vmesnik. Zagotavlja tudi kontrolo dostopa in številne storitve za kolaborativni razvoj, npr. sledenje napakam, zahteve za lastnosti, upravljanje z nalogami in wiki za vsak projekt.", "goodreads":"Goodreads je spletna stran, ki omogoča uporabnikom iskanje knjig za branje in izdelavo lastnih seznamov, baz, kritik ter citatov. Prijavljenim uporabnikom je omogočeno ustvarjanje interesnih skupin, blogov, anket, diskusijskih baz in podobno, v bazo pa lahko vpisujejo tudi nove knjige. Sedež podjetja je v San Franciscu, njegov trenutni lastnik pa je Amazon.", "google":"Iskanje Google ali pa preprosto Google je spletni iskalnik, ki ga je razvilo podjetje Google. Je najbolj uporabljen iskalnik na svetovnem spletu, ki poskrbi za več kot tri milijarde iskanj vsak dan. Od Februarja 2016 je najbolj uporabljen iskalnik v ZDA s 64.0% tržnim deležem.", + "google images":[ + "Google Slike. Najobsežnejše iskanje slik v spletu.", + "https://images.google.com" + ], "google news":[ "agregator novic in aplikacija, ki jo je razvilo podjetje Google", "wikidata" @@ -9018,6 +9269,18 @@ "južnokorejski iskalnik in spletni portal", "wikidata" ], + "naver images":[ + "naver:sl", + "ref" + ], + "naver news":[ + "naver:sl", + "ref" + ], + "naver videos":[ + "naver:sl", + "ref" + ], "niconico":[ "japonski ponudnik gostovanja videoposnetkov in živih prenosov", "wikidata" @@ -9163,6 +9426,10 @@ "gitlab":"GitLab је веб-алатка животног циклуса DevOps с отвореним изворним кодом. Алатка пружа менаџер спремишта за Git који нуди функције викија, функцију праћења проблема и канал за непрекидну интеграцију. Софтвер је развила компанија GitLab Inc., а првобитно су га направили Украјинци Дмитриј Запорожец и Валериј Сизов.", "goodreads":"Гудридс је компанија у власништву Амазона, чији веб-сајт омогућава корисницима да обележавају, оцењују и пишу рецензије за књиге које су прочитали, да би на основу тога од стране веб-сајта могли да добију предлоге за књиге које би такође могле да их интересују. Сајт је покренут 2007. године и данас има преко 900.000.000 наслова, и око 30.000.000 чланова. Такође веб-сајт функционише и као друштвена мрежа, и могуће је додавати пријатеље, као и видети књиге које они читају. Повремено се и организују такмичања, као и награде за најбољу књигу године. Један интернет портал из Хрватске је веб-сајт Goodreads описао као „друштвену мрежу за љубитеље књига”.", "google":"Гугл претрага, позната и као Гугл веб-претрага или једноставно Гугл, веб-претраживач је ког је развио Гугл ЛЛЦ. Он је најкоришћенији претраживач веба на светској комуникационој мрежи на свим платформама, са тржишним уделом од 92,74 % у октобру 2018, вршећи више од 3,5 милијарди претрага сваки дан.", + "google images":[ + "Google слике. Најопсежнија претрага слика на вебу.", + "https://images.google.com" + ], "google news":[ "Свеобухватно, ажурно извештавање о вестима које Google вести прикупља из извора широм света.", "https://news.google.com" @@ -9492,8 +9759,8 @@ "Google Images. வலையில் கிடைக்கக்கூடிய மிக விரிவான படத் தேடல்.", "https://images.google.com" ], - "google news":"கூகிள் செய்திகள், கூகிள் நிறுவனத்தால் வழங்கப்படும் இலவச செய்தி திரட்டி ஆகும். ஒரு தானியங்கி திரட்டல் வழிமுறை மூலம் ஆயிரக்கணக்கான பிரசுரங்களின் சமீபத்திய செய்திகளை இது தேர்ந்தெடுக்கிறது.", - "google play apps":"கூகுள்பிளே என்பது இலக்கமுறை தகவல்களை வழங்கும் ஒரு சேவையாகும். இது கூகிள் நிறுவனத்தால் வழங்கப்படுகிறது. இது ஆன்டிராய்டு பயன்பாடுகள், இசைக்கோப்புகள், புத்தகங்கள், திரைப்படங்கள், விளையாட்டுகள் போன்றவற்றை கொண்ட ஓர் இணையக் கடை ஆகும். மார்ச் 2012ல் கூகுள்தனது ஆன்டிராய்டு அங்காடியையும், இசைச் சேவையையும் இணைத்து கூகுள்பிளேவை ஆரம்பித்தது. 2017 ஆம் ஆண்டு புள்ளிவிவரப்படி, 35 இலட்சம் பதிவிறக்கங்கள், இத்தளத்தில் நடந்துள்ளன.", + "google news":"கூகிள் செய்திகள், கூகிள் நிறுவனத்தால் வழங்கப்படும் இலவச செய்தி திரட்டி ஆகும். ஒரு தானியங்கி திரட்டல் வழிமுறை மூலம் ஆயிரக்கணக்கான பிரசுரங்களின் அண்மைய செய்திகளை இது தேர்ந்தெடுக்கிறது.", + "google play apps":"கூகுள்பிளே என்பது இலக்கமுறை தகவல்களை வழங்கும் ஒரு சேவையாகும். இது கூகிள் நிறுவனத்தால் வழங்கப்படுகிறது. இது ஆன்டிராய்டு பயன்பாடுகள், இசைக்கோப்புகள், புத்தகங்கள், திரைப்படங்கள், விளையாட்டுகள் போன்றவற்றை கொண்ட ஓர் இணையக் கடை ஆகும். மார்ச் 2012ல் கூகுள் தனது ஆன்டிராய்டு அங்காடியையும், இசைச் சேவையையும் இணைத்து கூகுள்பிளேவை ஆரம்பித்தது. 2017 ஆம் ஆண்டு புள்ளிவிவரப்படி, இத்தளத்தில் 35 இலட்சம் பதிவிறக்கங்கள் நடந்துள்ளன.", "google play movies":[ "google play apps:ta", "ref" @@ -9531,7 +9798,7 @@ ], "wikidata":"விக்கித்தரவு (Wikidata) என்பது விக்கிமீடியா நிறுவனத்தால் இயக்கப்படும் பன்மொழி விக்கி அறிவுத் தளம் ஆகும். விக்கிப்பீடியா போன்ற விக்கிமீடியத் திட்டங்களில் பயன்படுத்துவதற்கான தரவுகளை வழங்கும் பொதுமூலமாக இது தொழிற்படுகின்றது. விக்கிபேசு என்ற மென்பொருளில் இது கட்டமைக்கப்பட்டுள்ளது.", "wikinews":"விக்கிசெய்தி, விக்கிமீடியா நிறுவனத்திரால் நடத்தப்படும் கட்டற்ற செய்திக் களமாகும். இது உலகளாவிய தன்னார்வலர்கள் தாமாகவே செய்திகளை உடனுக்குடன் மேலேற்றம் செய்யும் முறையாகும்.", - "wikipedia":"விக்கிப்பீடியா என்பது, வணிக நோக்கற்ற விக்கிமீடியா நிறுவனத்தின் உதவியுடன் நடத்தப்படும், கூட்டாகத் தொகுக்கப்படும், பன்மொழி, கட்டற்ற இணையக் கலைக்களஞ்சியமாகும். தமிழ் விக்கிப்பீடியாவின் 1,73,614 கட்டுரைகளுடன் சேர்த்து இதன் மொத்தக் கட்டுரைகளான 24 மில்லியன் கட்டுரைகளும் உலகெங்கிலுமுள்ள தன்னார்வலர்களால் கூட்டாக எழுதப்படுகின்றன. பெரும்பாலும் இதன் எல்லாக் கட்டுரைகளும், இதனைப் பயன்படுத்தும் எவராலும், தொகுக்கப்படக் கூடுவன. மேலும் இது கிட்டத்தட்ட 100,000 முனைப்பான பங்களிப்பாளர்களையும் கொண்டுள்ளது. ஏப்ரல் 2025 வரையில், விக்கிப்பீடியா 285 மொழிகளில் செயற்படுகிறது. இது இணையத்தளத்தில் இயங்கும் உசாத்துணைப் பகுதிகளிலேயே மிகவும் பெரியதும், அதிகப் புகழ்பெற்றதுமாகும். மேலும், இது அலெக்சா இணையத்தளத்தில் காணப்படும் இணையத்தளங்களின் தரவரிசையில் ஆறாவது இடத்தில் உள்ளதோடு, உலகளவில் அண்ணளவாக 365 மில்லியன் வாசகர்களையும் கொண்டுள்ளது.", + "wikipedia":"விக்கிப்பீடியா என்பது, வணிக நோக்கற்ற விக்கிமீடியா நிறுவனத்தின் உதவியுடன் நடத்தப்படும், கூட்டாகத் தொகுக்கப்படும், பன்மொழி, கட்டற்ற இணையக் கலைக்களஞ்சியமாகும். தமிழ் விக்கிப்பீடியாவின் 1,74,023 கட்டுரைகளுடன் சேர்த்து இதன் மொத்தக் கட்டுரைகளான 24 மில்லியன் கட்டுரைகளும் உலகெங்கிலுமுள்ள தன்னார்வலர்களால் கூட்டாக எழுதப்படுகின்றன. பெரும்பாலும் இதன் எல்லாக் கட்டுரைகளும், இதனைப் பயன்படுத்தும் எவராலும், தொகுக்கப்படக் கூடுவன. மேலும் இது கிட்டத்தட்ட 100,000 முனைப்பான பங்களிப்பாளர்களையும் கொண்டுள்ளது. மே 2025 வரையில், விக்கிப்பீடியா 285 மொழிகளில் செயற்படுகிறது. இது இணையத்தளத்தில் இயங்கும் உசாத்துணைப் பகுதிகளிலேயே மிகவும் பெரியதும், அதிகப் புகழ்பெற்றதுமாகும். மேலும், இது அலெக்சா இணையத்தளத்தில் காணப்படும் இணையத்தளங்களின் தரவரிசையில் ஆறாவது இடத்தில் உள்ளதோடு, உலகளவில் அண்ணளவாக 365 மில்லியன் வாசகர்களையும் கொண்டுள்ளது.", "wikiquote":"விக்கி மேற்கோள் (Wikiquote), விக்கிப்பீடியாவை நடத்தும் விக்கிமீடியா நிறுவனத்தின் இன்னொரு திட்டமாகும். இத்திட்டமும் விக்கி மென்பொருளை பயன்படுத்துகிறது. அனைத்து மொழிகளில் உள்ள மேற்கோள்களின் கட்டற்ற இணையத் தொகுப்பை உருவாக்குவது இத்திட்டத்தின் நோக்கமாகும். மேலும் இது புகழ்பெற்ற மக்கள், திரைப்படங்கள், புத்தகங்கள் மற்றும் பழமொழி ஆகியவற்றின் மேற்கோள்களை உள்ளடக்கிய ஒரு மேற்கோள் களஞ்சியமாகும்.", "wikisource":"விக்கிமூலம் (Wikisource) ஓர் இலவச இணைய நூலகம் ஆகும். விக்கிமீடியா அறக்கட்டளை நடத்தும் விக்கித் திட்டங்களுள் இதுவும் ஒன்று. இது கட்டற்ற உள்ளடக்கம் (பகிர்வுரிமம்) கொண்ட மூல நூல்களின் இணையத் தொகுப்பாகும்.", "wikispecies":"விக்கியினங்கள் விக்கி‎யை அடிப்படையாகக் கொண்ட விக்கிமீடியா நிறுவனத்தின் ஒரு இணையத் திட்டமாகும். இத்திட்டம் உலகிலுள்ள உயிரினங்களின் பெயர் அட்டவணையை தயாரிப்பதற்காக ஆகத்து 2004ம் வருடம் உருவாக்கப்பட்ட திட்டம் ஆகும்.", @@ -9754,7 +10021,7 @@ ], "openstreetmap":"โอเพินสตรีตแมป เป็นโครงการความร่วมมือเพื่อสร้างแผนที่เสรีที่แก้ไขได้ของโลก", "pinterest":"พินเทอเรสต์ เป็นบริการการแบ่งปันรูปภาพและบริการโซเชียลมีเดียที่ออกแบบมาเพื่อเปิดใช้งานการบันทึกและค้นหาข้อมูล บนเวิลด์ไวด์เว็บโดยใช้รูปภาพ และในขนาดเล็กกว่า กิฟและวิดีโอ ในรูปแบบของพินบอร์ด เว็บไซต์นี้สร้างโดยเบน ซิลเบอร์แมน, พอล สเกียร์รา และอีวาน ชาร์ป และมีผู้ใช้งานรายเดือน 300 ล้านคนในเดือนสิงหาคม ค.ศ. 2019 บริการนี้ดำเนินการโดยพินเทอเรสต์ อิงค์ ซึ่งตั้งอยู่ในซานฟรานซิสโก", - "piratebay":"เดอะไพเรตเบย์ เป็นเว็บไซต์สัญชาติสวีเดนที่ให้บริการบิตทอร์เรนต์ ซึ่งเปิดให้บริการมาตั้งแต่เดือนพฤศจิกายน พ.ศ. 2546 และกล่าวอ้างว่าเป็น \"เว็บไซต์บิตทอร์เรนต์แทร็กเกอร์ที่ใหญ่ที่สุดในโลก\" ได้รับการจัดอันดับจากอเล็กซา ให้เป็นเว็บไซต์ที่มีผู้เข้าชมมากเป็นอันดับที่ 106 เมื่อวันที่ 15 พฤศจิกายน พ.ศ. 2551 ทางเว็บไซต์ได้ประกาศว่ามีจำนวนผู้ใช้พร้อมกันถึง 25 ล้านเพียร์ และมีจำนวนผู้ใช้ที่ลงทะเบียนเข้าใช้งานทั้งสิ้น 3,500,000 ล้านชื่อ โดยในปัจจุบันเดอะไพเรตเบย์ได้ปิดระบบสมัครสมาชิกและอัปโหลดแบบไร้บัญชีไปแล้วเนึ่องจากมีไฟล์ทอร์เรนต์ที่ฝังไวรัสคอมพิวเตอร์มากเกินไป และในปี พ.ศ. 2565 เดอะไพเรตเบย์มีไฟล์ทอร์เรนต์รวมกันทั้งหมดถึง 6.7 เพตะไบต์ และไฟล์ทอร์เรนต์ที่มีการ Seed อยู่ถึง 2.5 เพตะไบต์", + "piratebay":"เดอะไพเรตเบย์ เป็นดัชนีออนไลน์ที่สามารถค้นหาภาพยนตร์, ดนตรี, วิดีโอเกม, สื่อลามก และซอฟต์แวร์ได้ฟรี ก่อตั้งใน ค.ศ. 2003 โดย think tank ชาวสวีเดน Piratbyrån เดอะไพเรตเบย์อำนวยความสะดวกในการเชื่อมต่อโพรโทคอลทอร์เรนต์เพียร์ทูเพียร์ระหว่างผู้ใช้ที่สามารถมีส่วนสนับสนุนเว็บไซต์ได้ โดยการเพิ่มลิงก์แม่เหล็ก เดอะไพเรตเบย์ได้รับการจัดอันดับให้เป็นหนึ่งในเว็บไซต์ทอร์เรนต์ที่มีผู้เยี่ยมชมมากที่สุดในโลกอย่างต่อเนื่อง", "reddit":"เรดดิต เป็นเว็บรวบรวมข่าวสาร จัดลำดับข้อมูลออนไลน์ และเว็บสนทนาสัญชาติอเมริกัน ผู้ใช้ที่ลงทะเบียนแล้วสามารถโพสต์เนื้อหา เช่น ลิงก์ ข้อความ และรูปภาพ ให้ผู้ใช้อื่น ๆ สามารถโหวตขึ้นหรือลงได้ โพสต์ถูกแบ่งตามหมวดหมู่จัดโดยผู้ใช้ เรียกว่า \"ซับเรดดิต” ซึ่งมีหมวดหมู่หลากหลาย เช่น ข่าวสาร กีฬา หนัง เกม ดนตรี หนังสือ การออกกำลังกาย อาหาร ภาพถ่าย เป็นต้น โพสต์ที่ได้รับโหวตขึ้นมาก ๆ จะมีโอกาสอยู่บนหน้าแรก ๆ ของซับเรดดิตนั้น ๆ และหากได้รับความนิยมมาก ๆ จะสามารถขึ้นไปยังหน้าแรกของเรดดิตในที่สุด แม้จะมีกฎป้องกันการดูหมิ่นออนไลน์อยู่มาก ผู้ดูแลของเรดดิตใช้เวลามากในการดูแลเรดดิต", "reuters":"สำนักข่าวรอยเตอร์ส คือผู้ให้บริการข้อมูลทางการเงินและรายงานข่าวต่าง ๆ ให้แก่สำนักข่าวต่าง ๆ ของโลก สำนักงานใหญ่ตั้งอยู่ที่กรุงลอนดอน ประเทศอังกฤษ โดยรอยเตอร์สได้รับรายได้ส่วนมาก จากการให้บริการข้อมูลทางการเงินต่าง ๆ เช่น ราคาหุ้นในตลาดต่างๆ อัตราแลกเปลี่ยน ราคาน้ำมัน รายงานการวิเคราะห์หลักทรัพย์ เป็นต้น และการให้บริการซื้อขายผ่านอินเทอร์เน็ตต่าง ๆ โดยปัจจุบันนี้รอยเตอร์สมีส่วนแบ่งการตลาดในด้านการบริการข้อมูลทางการเงินมากเป็นอันดับสอง ประมาณร้อยละ 23 รองจาก บลูมเบิร์ก (Bloomberg) ที่ควบคุมส่วนแบ่งการตลาดมากถึงร้อยละ 33", "rottentomatoes":"รอตเทนโทเมโทส์ เป็นเว็บไซต์ที่เปิดตัวในปี 2541 อุทิศให้กับการรบทปริทัศน์ภาพยนตร์และข่าว รู้จักกันอย่างกว้างขวางว่าเป็นผู้รวบรวมบทปริทัศน์ภาพยนตร์ ปัจจุบันครอบคลุมเนื้อหาโทรทัศน์ด้วย ชื่อของรอตเทนโทเมโทส์ นั้น เกิดจากการปฏิบัติที่ผู้ชมจะโยนมะเขือเทศเน่าเมื่อไม่เห็นชอบกับการแสดงเวทีที่เลว บริษัทก่อตั้งขึ้นโดย Senh Duong และตั้งแต่เดือนมกราคม 2553 ได้รับการเป็นเจ้าของโดยฟิลค์สเตอร์ แต่ต่อมาฟิลค์สเตอร์ถูกซื้อต่อกิจการในปี 2554 โดยวอร์เนอร์บราเธอร์ส", @@ -9933,6 +10200,18 @@ "ref" ], "naver":"Naver, Güney Kore merkezli bir arama motoru ve internet portalıdır. Site, Haziran 1999 tarihinde eski Samsung çalışanları tarafından kurulmuş olup Güney Kore'nin kendi arama motoruna sahip ilk internet portalıdır. Günümüzde Naver Corporation bünyesinde faaliyet göstermektedir.", + "naver images":[ + "naver:tr", + "ref" + ], + "naver news":[ + "naver:tr", + "ref" + ], + "naver videos":[ + "naver:tr", + "ref" + ], "niconico":"Niconico, Inc., eskiden Nico Nico Douga , Japonya merkezli bir video barındırma sitesidir. Site, 12 Aralık 2006 tarihinde kurulmuştur. Eylül 2015 tarihi itibarı ile Japonya'da en çok ziyaret edilen sekizinci web sitedir. 2007 yılında site İyi Tasarım Ödülü ve 2008'de Prix Ars Electronica Dijital Topluluklar kategorisinde Onursal Anma kazanmıştır.", "nixos wiki":[ "nixos wiki:en", @@ -10240,6 +10519,18 @@ ], "mixcloud":"Mixcloud онлайн сервіс зі стримінгу музики, який забезпечує прослуховування і розповсюдження радіо-шоу, DJ-міксів і подкастів, які надаються його ж зареєстрованими користувачами.", "naver":"Навіер або Найвер, ориг. Naver від англ. navigate – направляти — найбільший інтернет-портал і найпопулярніша пошукова система в Південній Кореї, що належить корпорації Naver Corporation. Був запущений у червні 1999 року групою колишніх співробітників Samsung. Дебютував в якості першого порталу який використовував свої власні алгоритми пошуку. Займав у 2011 році – 70%, 77% в 2015 р. а в 2017 вже 74,7% пошукового ринку країни.", + "naver images":[ + "naver:uk", + "ref" + ], + "naver news":[ + "naver:uk", + "ref" + ], + "naver videos":[ + "naver:uk", + "ref" + ], "niconico":"Nico Nico Douga або Niconico — японський відеохостинг. Перегляд відеофайлів на сайті потребує реєстрації; перегляд заголовків, описів та пошук — ні. Глядачі можуть залишати коментарі до будь-якого моменту відео і маркувати відеофайл тегами, класифікуючи його вміст. Сайт надає користувачам різні додаткові сервіси [Архівовано 8 серпня 2020 у Wayback Machine.]. Автоматично складаються рейтинги популярності [Архівовано 22 червня 2013 у Wayback Machine.] відео різних жанрів.", "nixos wiki":[ "nixos wiki:ru", @@ -10454,6 +10745,18 @@ "https://learn.microsoft.com" ], "naver":"Naver là một nền tảng trực tuyến của Hàn Quốc được điều hành bởi Naver Corporation. Được ra mắt lần đầu năm 1999, Naver vốn là cổng thông tin điện tử đầu tiên tại Hàn Quốc, sau đó được phát triển thành một công cụ tìm kiếm riêng. Đây cũng là nhà điều hành đầu tiên trên thế giới ra mắt tính năng tìm kiếm toàn diện, tính toán các kết quả tìm kiếm từ nhiều danh mục tìm kiếm khác nhau và trình bày chúng trong một trang duy nhất. Từ đó, Naver cũng đã xây dựng thêm vô số các dịch vụ từ cơ bản như e-mail, tin tức đến nền tảng trực tuyến Q&A đầu tiên trên thế giới Knowledge iN.", + "naver images":[ + "naver:vi", + "ref" + ], + "naver news":[ + "naver:vi", + "ref" + ], + "naver videos":[ + "naver:vi", + "ref" + ], "niconico":"Niconico , trước đây là Nico Nico Douga hay gọi tắt là \"Nico-dō\", là một website chia sẻ video của Nhật Bản được điều hành bởi Dwango, bắt đầu hoạt động từ ngày 12 tháng 12 năm 2006.", "npm":"npm là chương trình quản lý thư viện ngầm định trong môi trường Node.js. Nó bao gồm một trình gọi dòng lệnh (CLI) từ máy khách Client với tên gọi là npm, và cơ sở dữ liệu trực tuyến chứa các gói public và private còn được gọi là npm registry. npm registry được gọi từ npm client và trên web browser. Tất cả được quản lý trực tiếp từ npm, Inc.", "openstreetmap":"OpenStreetMap là một dịch vụ bản đồ thế giới trực tuyến có nội dung mở. OpenStreetMap nhằm mục đích cung cấp dữ liệu địa lý do nhiều người cùng cộng tác với nhau trên hệ thống wiki. Nó thường được gọi \"Wikipedia của bản đồ\". Dự án OpenStreetMap được sáng lập năm 2004, chủ yếu để cạnh tranh với các công ty và cơ quan chính phủ cung cấp dữ liệu địa lý theo các điều khoản sử dụng được coi là quá chặt chẽ.", @@ -10575,6 +10878,18 @@ "mdn":"MDN Web Docs 是一個汇集众多Mozilla基金會產品和網路技術開發文档的免费網站。", "metacpan":"CPAN 中譯為“Perl綜合典藏網”,“Perl综合档案网”或者“Perl程序库”。它包含了極多用Perl寫成的軟體和其文件。", "naver":"NAVER(韓語:)是韩国著名入口/搜索引擎网站,它使用獨有的搜尋引擎,並且在韓文搜尋服務中獨佔鰲頭。除了搜尋之外也提供入口網站的許多服務,例如新聞、電子信箱、電子地圖服務(含街景地圖)等。在Alexa排名上是韓國國內第一大的入口網站。 据ComScore统计,Naver在2007年8月收到二十亿次搜索,占70%以上的韩国搜索查询,它是世界上排名第十五的网民最常用的搜索引擎,超过25万韩国人选择Naver作为浏览器起始页。", + "naver images":[ + "naver:zh-HK", + "ref" + ], + "naver news":[ + "naver:zh-HK", + "ref" + ], + "naver videos":[ + "naver:zh-HK", + "ref" + ], "niconico":"Niconico動畫 是日本多玩國公司營運的在线弹幕视频分享网站。其中「Niconico」()意爲微笑,「動畫」()意爲視頻。Niconico動畫與YouTube等视频共享网站相似,但Niconico動畫提供观看者可在视频画面上留言并以弹幕的形式出現在视频上的功能。", "npm":"npm 是Node.js預設的、用JavaScript編寫的軟體套件管理系統。", "openlibrary":"开放图书馆(英文:)是互联网档案馆旗下的非营利网站暨在线图书馆项目,收录了许多公有领域图书的在线版本,旨在为每一本已出版的图书创建一个网页。本网站由亚伦·斯沃茨、布魯斯特·卡利、Alexis Rossi、Anand Chitipothu和 Rebecca Malamud在2006年创建,其部分资金来自加州州立图书馆與 Kahle/Austin 基金会。", @@ -10813,6 +11128,18 @@ "naver:zh-HK", "ref" ], + "naver images":[ + "naver:zh-HK", + "ref" + ], + "naver news":[ + "naver:zh-HK", + "ref" + ], + "naver videos":[ + "naver:zh-HK", + "ref" + ], "niconico":[ "niconico:zh-HK", "ref" @@ -11111,6 +11438,18 @@ "naver:zh-HK", "ref" ], + "naver images":[ + "naver:zh-HK", + "ref" + ], + "naver news":[ + "naver:zh-HK", + "ref" + ], + "naver videos":[ + "naver:zh-HK", + "ref" + ], "niconico":[ "niconico:zh-HK", "ref" From 9d8592afd71b4ab43be7202082e9679945e8c321 Mon Sep 17 00:00:00 2001 From: searxng-bot Date: Thu, 29 May 2025 00:15:12 +0000 Subject: [PATCH 64/74] [data] update searx.data - update_engine_traits.py --- searx/data/engine_traits.json | 1 - 1 file changed, 1 deletion(-) diff --git a/searx/data/engine_traits.json b/searx/data/engine_traits.json index 6f80992ec..d687d116e 100644 --- a/searx/data/engine_traits.json +++ b/searx/data/engine_traits.json @@ -7381,7 +7381,6 @@ "ko": "korean", "ks": "kashmiri", "ku": "kurdish", - "kw": "cornish", "la": "latin", "lb": "luxembourgish", "ln": "lingala", From b2727e1be934a20b9fd33c50ab87befff0a81c54 Mon Sep 17 00:00:00 2001 From: searxng-bot Date: Thu, 29 May 2025 00:15:00 +0000 Subject: [PATCH 65/74] [data] update searx.data - update_currencies.py --- searx/data/currencies.json | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/searx/data/currencies.json b/searx/data/currencies.json index 09bee0ea0..b0096673d 100644 --- a/searx/data/currencies.json +++ b/searx/data/currencies.json @@ -1428,7 +1428,7 @@ }, "CZK": { "ar": "كرونة تشيكية", - "bg": "крони", + "bg": "Чешка крона", "bn": "চেক কোরুনা", "ca": "corona txeca", "cs": "koruna česká", @@ -2687,7 +2687,7 @@ "uk": "Йорданський динар" }, "JPY": { - "af": "Jen", + "af": "jen", "ar": "ين ياباني", "bg": "японска йена", "bn": "জাপানি ইয়েন", @@ -4329,7 +4329,7 @@ "PLN": { "af": "Złoty", "ar": "زواتي بولندي", - "bg": "Полска злотаПолска злота", + "bg": "Полска злота", "ca": "złoty", "cs": "zlotý", "da": "zloty", @@ -4375,7 +4375,7 @@ "PLZ": { "af": "Złoty", "ar": "زواتي بولندي", - "bg": "Полска злотаПолска злота", + "bg": "Полска злота", "ca": "złoty", "cs": "zlotý", "da": "zloty", @@ -5881,6 +5881,10 @@ "tt": "самоа таласы", "uk": "Самоанська тала" }, + "XAD": { + "en": "Arab accounting dinar", + "fr": "dinar arabe" + }, "XAF": { "ar": "فرنك وسط إفريقي", "bg": "Централноафрикански CFA франк", @@ -6375,6 +6379,7 @@ "$usd": "USD", "1000 lira": "LBP", "100ドル紙幣": "NIO", + "1億ベネズエラ・ボリバル": "VES", "2019 zimbabwean dollar": "ZWL", "5th zimbabwean dollar": "ZWL", "A$": "AUD", @@ -6511,6 +6516,7 @@ "Z$": "ZWL", "ZK": "ZMW", "a$": "AUD", + "aad": "XAD", "abd doları": "USD", "adb unit of account": "XUA", "ae92 0530 0000 1514 1185 002": "AED", @@ -6610,6 +6616,7 @@ "aoa": "AOA", "apvienotās karalistes sterliņu mārciņa": "GBP", "ar": "MGA", + "arab accounting dinar": "XAD", "arabiemiraattien dirhami": "AED", "arany mint befektetés": "XAU", "arg$": "ARS", @@ -7438,6 +7445,7 @@ "dinar algierski": "DZD", "dinar aljazair": "DZD", "dinar alxeriano": "DZD", + "dinar arabe": "XAD", "dinar argelino": "DZD", "dinar bahrain": "BHD", "dinar bahraini": "BHD", @@ -7458,6 +7466,7 @@ "dinar bhairéin": "BHD", "dinar chuáit": "KWD", "dinar coaitiano": "KWD", + "dinar comptable arabe": "XAD", "dinar couaitiano": "KWD", "dinar covaitiano": "KWD", "dinar coveiteano": "KWD", @@ -9162,7 +9171,6 @@ "jordán dinár": "JOD", "jordánsky dinár": "JOD", "jordánský dinár": "JOD", - "jpy": "JPY", "juan": "CNY", "juanis": "CNY", "juaņa": "CNY", @@ -9813,7 +9821,6 @@ "livre de sainte hélène": "SHP", "livre des îles falkland": "FKP", "livre des îles malouines": "FKP", - "livre egyptienne": "EGP", "livre égyptienne": "EGP", "livre libanaise": "LBP", "livre soudanaise": "SDG", @@ -13367,7 +13374,6 @@ ], "крона чеська": "CZK", "крона швеции": "SEK", - "крони": "CZK", "куба писысы": "CUP", "кубански пезос": "CUP", "кубански песо": "CUP", @@ -13645,10 +13651,6 @@ "PLZ", "PLN" ], - "полска злотаполска злота": [ - "PLZ", - "PLN" - ], "польский злотый": [ "PLZ", "PLN" From dbe6a6f4fad096cc324000526ddb927c33046f66 Mon Sep 17 00:00:00 2001 From: searxng-bot Date: Thu, 29 May 2025 00:14:56 +0000 Subject: [PATCH 66/74] [data] update searx.data - update_wikidata_units.py --- searx/data/wikidata_units.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/searx/data/wikidata_units.json b/searx/data/wikidata_units.json index 545f289fa..c9bcad24c 100644 --- a/searx/data/wikidata_units.json +++ b/searx/data/wikidata_units.json @@ -4199,11 +4199,6 @@ "symbol": "St", "to_si_factor": 13450.0 }, - "Q235729": { - "si_name": "Q11574", - "symbol": "y (365 days)", - "to_si_factor": 31536000.0 - }, "Q23823681": { "si_name": "Q25236", "symbol": "TW", From 23396f5a1d2bafd13b86f54b31c2454321655227 Mon Sep 17 00:00:00 2001 From: searxng-bot Date: Thu, 29 May 2025 00:14:55 +0000 Subject: [PATCH 67/74] [data] update searx.data - update_firefox_version.py --- searx/data/useragents.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/searx/data/useragents.json b/searx/data/useragents.json index 6b806e372..95a245560 100644 --- a/searx/data/useragents.json +++ b/searx/data/useragents.json @@ -5,7 +5,7 @@ ], "ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}", "versions": [ - "138.0", - "137.0" + "139.0", + "138.0" ] } \ No newline at end of file From 7448a18efa1d47ee1424db935ba8463fdf2809b3 Mon Sep 17 00:00:00 2001 From: searxng-bot Date: Thu, 29 May 2025 00:14:56 +0000 Subject: [PATCH 68/74] [data] update searx.data - update_ahmia_blacklist.py --- searx/data/ahmia_blacklist.txt | 208 +++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) diff --git a/searx/data/ahmia_blacklist.txt b/searx/data/ahmia_blacklist.txt index 065bd8208..9a05bdb3f 100644 --- a/searx/data/ahmia_blacklist.txt +++ b/searx/data/ahmia_blacklist.txt @@ -5,6 +5,7 @@ 0005267c3295eeb612e9e7d2d7939970 00068777b8c3937133e788cd84229143 000914d0c175724e20a84518b1cb587a +000bb12a3fa367e1442fc9fada841457 000ca35ba2095b1443968d4b0ff584de 0013a67e08315e293c274799fa865e01 00145453e48c99747fd7bb981cca0798 @@ -435,12 +436,14 @@ 0251da7034024e7f4a38af608d6a2717 0251df6c4de395e40201f49f460af671 0253d36abff6b07a63e76f6936eb225e +02543885df081a208d9983fbc267d127 025511df343ea2bf7451edf96a1177fb 02551fd7b9390cd9d5221052b24d0c81 0256647357d27acb21ed2de48e784065 0259e254c258e7ffdb51c350ef5eaacc 025a6e40958e34e996e4b03698984827 025b8f1a86222f25aa7ea4709499352e +025c49b129b65ad81f2335a3ca9cacba 025cf1341b8dc023045bf0b8c4d2b43c 025e8ceea86b8b6a95ab56a2ef8d5e81 0261003d3d876d9c236ff7d3ddff9744 @@ -485,6 +488,7 @@ 0295234924c5e11f293d34e9d449cba0 0295ea4ab97988b8145ae756937435cc 029778e7a2c43224635d8315151870e5 +029981242bcbea18dc8746f289bf6397 029aad6a569e9e5aaf05ef93c9197784 029b98a25eff95a2c409f317c52bc2a9 029bef519d3fc5e7e471dd61c9356e05 @@ -609,6 +613,7 @@ 034dd3de1aeeb36cbdb9d6d56a62166b 0351e0d2c113dc8dba239f699ec02d4c 0351ee6dc13b41686001cab8ea2488d3 +0353152c49a1da7454dfffbb7e4a3558 0355dfcc33108181db526ac37ef673d8 0355f17a3d208dd1c908faa0f2f9e93f 0356b4e31a9d13be51790c68ba28547d @@ -780,6 +785,7 @@ 0425f1c3459237cd37ca97424493af25 04270668bda73f4609b7ad3ddbfd0d94 04286bf4dedb2dbd9723474c2a1f217b +0428fd6aaea85ee8a8216389517c36bf 0429f459757ae450c312b3f4fda43fe6 042ab4ed0bd703331efdcdbff54a1471 042acd38b594f6a5744edc478ae3c8ad @@ -1373,6 +1379,7 @@ 07424ccf8c8a24c6cbe752e5a9fc3812 07424d3e5933262a691315419a28462e 07451a915f5b043135ee4d013287e09d +074626a19cfc491ae97f85efb520685b 07473e90e994a61931d33cc18ea9dc39 07477bfbd67a71588324c3e9c11b5370 0747e2f11ae1a5dc077649ecfa250b40 @@ -1610,6 +1617,7 @@ 08a2bf6db54af53fd03b461ba95d7eed 08a3e379c63dddab3890e765e8585430 08a44f882721208bfc54745d3f55db31 +08a46a8ce28df914deebd6148fb0be53 08a6cb00a5d07b8524c0e0d512b4dba5 08a72c40624802259b58b551d2cdeacf 08a9d464024c1b94ee99c08a4e1d61d1 @@ -1917,6 +1925,7 @@ 0a6960746b5556b557cf543fa276ba9a 0a6b9ff75963121b22c9b7f42cb1d524 0a6c5fb79e7cf454d23445b391c08180 +0a6c6deec7369397efd80788607a293f 0a6d4b62e1dc10e0e502df8243d7f3ce 0a70a665f5f8a752d5550d7520aee426 0a71a55d452e5f059fc1d1f889b7ee4d @@ -2112,6 +2121,7 @@ 0b7c13df18404beaae998694a0d6d3a2 0b7c21a239b30e670d6d024c4f29bca2 0b7ccdf4688c4992d81fdee8d6e357e7 +0b7dbde24d5f6852987eb1d7bed68a5b 0b7feffaf8d4b91d8c618e5bbe602e92 0b803f83d985858b304f7081c8549562 0b814c2b2b04bfaec204b2df7a82aaa0 @@ -2734,6 +2744,7 @@ 0eddb1ebef0dedf7438c3953cb40c1c3 0ede9f742cc16451ac616b17c401790d 0ee3ca15dc2d3a43d4174beac14f81e7 +0ee451f7de2d185a89d47d785b1f594c 0eea546b46a48211c407062119b05169 0eeb10443f206a77fa8f555f4165a01b 0eedfdcb06271288eb40aa41d163fdff @@ -2772,6 +2783,7 @@ 0f1dddcae4a97d15da0a02eef4b6e8fe 0f1e17031e3fde4d2221c865aad9a3d5 0f1e25b58f84ac6d22b988d78e2cca17 +0f1eb9508491b97ebed0d4be19493fb9 0f2117237746ecd2fb3ca29be246be2e 0f22018b7ea2cb0d3e653a3640223deb 0f2293b7d4bec3f83b96b62ae6f98517 @@ -2887,6 +2899,7 @@ 0fb04b5ab393b4aa64bb512d1e06fc75 0fb085b2eb9474cee43950434f45a5fd 0fb2418a5718cccd73398d1b659385ed +0fb637ac874447d39c08b730bf161158 0fb82f76000499d915b83a1ddef63eb6 0fb8477a52fb18854441f57bc266a012 0fb90f728807750145a7d7b0c9c5a990 @@ -3193,6 +3206,7 @@ 1166dbbadfe2bc6c0ca60028b4ce5d5c 1166f356caf638c8f2dbb3ba21300028 1167501c494d049744db1ebeab2c4996 +11687d357c714ba02785ef68c6702898 11698d424ee245ff6d2d8199f39c00dd 116b97ed2fa6bded481f9b38eedb4505 116dd01f9b14bb5c621a98cb25045202 @@ -3661,6 +3675,7 @@ 13c68806d5bea1144414ff6adf614f8c 13c6dcc3911fd9e80b78cc118ad6a855 13c81d82802fb195d1375a168dba834f +13c8747ba6dbe6b515930a4ab4c5a9f0 13c878f5e10d4cb6a052d7cca21fed5a 13ca196cebca0f84445ca520ef716074 13ca32082fbd23791283ebc0eecc0966 @@ -4146,6 +4161,7 @@ 164ac234e744c62dcb3b5994dab07009 164e7f0642f1c8f9606add19ee3dc0f0 164eb5ec53f7929eb73a605a3fc35e22 +164ff12c6949772c32df9f68d8278a8a 1652309be7e2a093125b0858551ae7e4 16545275331852b182b785574b2bedfa 16545c5182accbd81059ce9e8053ee71 @@ -4167,6 +4183,7 @@ 167654a6325c7ef6c60bdccd896c2a4b 1676a13396a4f78080662dd0419a45c1 1677b760edcf80a0ff07f308ebe300e4 +1678444681936cb3038a17ca6c55a702 1678639220d10cf30df4a1ea5add8a34 1678e345417c9592d26eecac92546a13 1678ea4e5910d7d433d5eab5309a1864 @@ -4251,6 +4268,7 @@ 16eb61044968f29101651e5cc83b52c3 16ed77594af8d590360ceaab1aa9d049 16ed8827f10bedbbfda1d17699242c44 +16ee0d16b5107699b27ecd9251c5ec79 16eeb4f73d22550f42a67b120b754326 16f168ff9bff0b81d12741d2b94fce4a 16f2261b876c60908dfe30d8ca9d4edf @@ -4349,6 +4367,7 @@ 177e15ee9ab07b74af6000ceae0cb2f9 177e4059ed4cd7ae4266634ec00e9c10 177f24f33529cca0708befea74693dc9 +17801eca49afd689dfc40d45f1ca8e16 17803f1148ea883641b9c4e96f4cfcae 1780b44492ed31c5ebbc0994bfcee9ac 1782151c47e1c5b3bad69b5ca952ae33 @@ -5035,6 +5054,7 @@ 1b4697cc86ea66c62f761ee377cd818b 1b4887d9532e2e07bda5ed2a9b9b87f2 1b48cb2da599ad766c7bf0451a85df73 +1b48f4f9b3d10661b9ac610a2f480fc4 1b496d5a1006d4958b92d4976f28481e 1b4a2b8150239956a7961b37ee70d9d4 1b4a63b804f9e556aa7bb7187074e327 @@ -5308,6 +5328,7 @@ 1ca0770673e44d26e1d4ff2a16cc4cbe 1ca153b82f15856669a8277f228d7b84 1ca2f7ad9ac214f45e8ffe8e63fc2754 +1ca40db2e8e0a3dd8c66c0e673cc572e 1ca4f0e7494a7beb445cd6dfe4f3c461 1ca51ea82c5eee246c89677041b5c780 1ca5df78c3297f213655fecfedd3ac3b @@ -6177,6 +6198,7 @@ 217630ce668d5317dbc7a8248337a521 2176e4fb6722df48bef98b27650046e6 217722e245d3502b156db853c73b7b17 +2177d0759ee703908972a1b91b675214 2177e2b99d89bb2509e1d3babd1bf199 21784c5b00966e217057e37443898c5f 21789af6c870a60cbed83e64cf3e5463 @@ -6538,6 +6560,7 @@ 2364e8462945adde9b041e506f24acbd 23655a0f04b06ee4e67d0d95c00148dc 23657ec88157711235f8a9b52351dafe +23694f10047d2bd64a62c7f49eeb71a1 23698e1d9c4ced0c960ccc0c275043f6 236de1c21a89c567837752013eb5ee23 236ea4fcf59a70d632c6547a3d0451d1 @@ -7014,6 +7037,8 @@ 260b137532694cd8a9a87074ddf31ca5 260d4da49476b8edf04d8793f05febd6 260f6d2a0a82bbdfb7f7766454793658 +260fe149214dc8c66232131c41cc263e +261043514ca8fded2b27b490e62d3038 2612167ed24bea70b3c2e8c7a8f1d60a 261245ae37c5901ebb2cedb1fd88af13 2617e6af0f0e30955694a93bc1453f74 @@ -7527,6 +7552,7 @@ 28d25a82c04c5fcc231e980e4f1b8bcb 28d465fa943affe9e4a8d2bfe5e17548 28d610caef84bec33a19c864b4b14bf9 +28d6dc8965d3dc95f54c625eaf75910a 28d6e03376e226a55e4ad9974db0960f 28d79b60fb216c681e608d7a2966dba7 28d93c57421e2bd6d1e001884899bb9f @@ -7538,6 +7564,7 @@ 28e17088fde3dd1d00f0ba208e7b4797 28e2f81c81908c2fecf7d85a6b7ffd3e 28e329d8bda4acc6d4e1266aaf343155 +28e34145a1d57f1d6f48e7d115147cd8 28e3a32b505dff3420decc88103601ed 28e605db574af11481e1a00bbe645ad0 28e6d60cc9d47404fae7b5df9f62b49b @@ -7830,6 +7857,7 @@ 2a667936f25a943fdb96abeef23cd981 2a68802d6d188fa53d98bd03296b4b60 2a6934d1ff6187490781620b5e1f2df2 +2a6b97db8c050130da7ae2803e2fd273 2a6c8463ccc4fec7d6367aa264a6ea5d 2a6da9abe15822278af2d7e087c246fb 2a6f6ee7170dca45ea644e0ab87c28c9 @@ -8106,6 +8134,7 @@ 2bd017e38367f7c6d998af2ef38087fd 2bd38f4e598f978dbfd5b55546f1bb51 2bd4b7f8a68e5f830eb86e7f01d679e3 +2bd5a49af5f420e751b87028ecddff03 2bd5c83d815f543e24e5041c02ae0799 2bdaac06653f5e57848b69416ee4a6e9 2bdd0bb805f7a24f7528077b1319b8fb @@ -8780,6 +8809,7 @@ 2f6f00b04ad16c1a6d80be858101e223 2f7073c4225b9aa7b1c570a6a92328ca 2f70cfaa4f5d55ff4693e94936acc845 +2f718c5f111a9adc639edf4c2ee465a8 2f71f2706524be1bd387bb7d0b6eae86 2f753ede59bb097edfde6f23e69bc373 2f754f53a50c3ce017f407508358798f @@ -8820,6 +8850,7 @@ 2faa7393187509976167b601abf59986 2faa8f74216aa7c7a3bbab7585ad06e6 2faaa4cb4fd6bd622e037f0fd08fd288 +2fab984ea26758fdda39759469e98bbc 2fac5bad535410943b367dc515bc8dab 2facea7bc3a70adcde954f3a92b46b39 2faddb1bbfecefba6f0262bce5043e07 @@ -8886,6 +8917,7 @@ 2ff1d0043715903d5bf500a346580f96 2ff1e62a192ff56015af810b29064a07 2ff3d45207511f4933f5edf61a8634e0 +2ff4811e65aa1e897a170ea822754042 2ff557c7eb3e55eb40baf48486d912e7 2ff690a74b955b7025afbc6ee7276e99 2ff69747d51087d4f526f413632d741b @@ -9098,6 +9130,7 @@ 3100b8257162244abb54229c31a0d286 3100fdeb8d0e1780cf2777d54ee33cf1 31012dedb15099d66316b7f9d5244270 +3101a714bf4d8412ceba46045b9c8fca 3102ee4948b07ebea379accf358f4523 3106fed0993b88c4b1ce2a30aa85056a 3107ec64b531336e5a23cb7c0cb3b58c @@ -9164,6 +9197,7 @@ 315ba540431d5a3eeda56c65e44d46b4 315c8c0b4f52bb81b4d828acc2452e7a 315e65cc1f34c1811a37f332e87afe00 +315eabdcd44620d32a81ed91caa69b88 315fa325085bc0f2032b48304014a07c 316019a760a7e6d275a10e07af16a9e9 31625ec9963c9f959ddd11f847ac911b @@ -9272,6 +9306,7 @@ 31f2257d432e18e93a55a45ba8ed8c5c 31f26b99be9daffd665d7acf85a35e08 31f2c254f68524c9c0aef4ca32977c60 +31f36083e351d658036e752f4f1a5fbf 31f3ed765c203ed0c548bda622da8299 31f45e7b6b07273ac71eb44f46fba8d3 31f62cad5ae8b19813a4cae58f349b07 @@ -9467,6 +9502,7 @@ 32f1a7f57b512db5b681d9d5da68263a 32f45aa1b9b38292483ab8666d8ac9cc 32f4b8bad803a08f17adb0b3aa3cf4e3 +32f5d69850195952f4211e1f2d9e028e 32f79d43474946ec1c31ab71eb83163b 32f8f9b79832f90bdf4433fc6be69587 32f902e59aa7f0e29cf4512b142e3716 @@ -9608,6 +9644,7 @@ 33d1fd357388cc918d7cd6547a742457 33d30382ab9e0e2166549b25bf97f31b 33d4701ab79f8df24ba2ab0c1d8d149f +33d5fa01b8e70a4aadef9ed32f05ec7a 33d7c5866c32276d154120c672208a53 33d842cedeade74108a9f7efead305ed 33db469e01631389d3e6eaacc5d08454 @@ -9796,6 +9833,7 @@ 34bb80469543da184f6c4687a7dbbc08 34bb9abcdea4f0bcfe24c6efcad5e3ba 34bc9c5319ce936460cdcf6597b71c23 +34be4885055445fd2690d5581082a350 34c0fe8d3d1b1c6850d519951ad971b1 34c2af1244f7ba549f6ad52ab15fbfe7 34c2bf58dde33d8392733df2857c14ce @@ -9964,6 +10002,7 @@ 35954958024018046d1f1b286a582cd3 3595d0b74e1cd8f9c9ccb1e51a1f0554 3595e6d58e506f0cd754d3af1f4446a3 +359729f10a3dc23a33c840b08e4b15a0 359a62e408cc78676438468cf8900c74 359b76c2b9774f59a828cfa0d6ec9531 359e97b8ea9ec5fc427af5b0d2e28c75 @@ -10508,6 +10547,7 @@ 387a4e5fec020b8da0f317f4fe7721d2 387bd966560c303cedd79921e5b78b9f 387f7889a14750f96f60415eb7fd8c74 +387fb115e32520e9bc91fd9dddd845af 3884f3f21019fe7023adedf9b960d208 3885d6825c8c388bb6c617d1fbd27e77 38870a3f87cbd7f163d739ccefee1afb @@ -10597,6 +10637,7 @@ 38fd5093d7dc284070e9b34028ff788e 38fde3d022d5f870933e44bd82f555ed 39027c02cd003145bc74c563c2059c67 +3903e95fa1e05615940a0bc2153c8793 39047b72ea9f2a256d6fa4edd04b7d36 3904c189b0a64f80797627e3399b5911 39057283f2ba7290242b8c13ca720d6a @@ -10991,6 +11032,7 @@ 3b31e02cdd65585d8c21e8cadf3f0d97 3b33311b30793dd887c185a0febd5c8b 3b3446d5e0402dd6830f8202e65bbd4b +3b34a138152f71f7f437c146fafed625 3b358900d7e5e2130918b2803d61bb20 3b372957e901b62ffb0d85f4390e8d40 3b38b355d44989d3aa7c6a84301bd1a4 @@ -11050,6 +11092,7 @@ 3b79c08a1f5d1c836fa0afb1c70a16d6 3b7b99a2c8e1a883c69b0f4272d26369 3b7c84f7e97bf9659c312cd3b2eaa8db +3b7ebea3e5eff21445ecb659a90a334c 3b7f744494f37c19a126e79482758cba 3b7fe83b78e3d169d3f05eb7d6a45daf 3b81d0b8ea2b4b89062a394894f3cd6e @@ -11120,6 +11163,7 @@ 3bdf407eae98cb17524a7aa69322473f 3be028f4cdfae1d166bbcab6d83a7e1a 3be057ab6966061fa151ff412fc0a764 +3be801ff3f2ce8b80a439e4b2bd2760d 3be8544841171ad614e24591990f2732 3be985fc58de16b34117385ce9708f7e 3bea0568acb91a9dd3ed2773cc367e9c @@ -11322,6 +11366,7 @@ 3cee76540462999330b659db06da8a17 3cee9a5dd9a3e935a637fb07804ec246 3ceed022926d9d651dda04d93cfcc8bd +3cf181e33b379e1bfdcdd5c5abebc496 3cf387bff728dca0760fd4d35cf1d706 3cf58d0d4708cff944d725d5a335c956 3cf7f85fc7932876af46649d02e6041b @@ -11600,6 +11645,7 @@ 3ea6416134718040d4d3b8ee1f66d0a9 3ea6c0393882f680923f96587c1ebebc 3ea853604e6b088167c1f34fb0ff95e2 +3ea8fdfdb606ca56c0053fd42a960a69 3eaa3645b6e85aa0385afc516afc0987 3eaa3a2675ce184c28d63c2d1f5b6cc3 3eabbff96f962ebe883547aab1be0327 @@ -11665,6 +11711,7 @@ 3ef3e87585ca6b637d0c267bdb8c2d69 3ef3ebef19b659a56d98721441845850 3ef4131d520a2d9bf26dd6fe61345e91 +3ef4d00bffa4b7c6dcde270e542448c4 3ef5888d2a20889501094a1c1784a102 3ef870b65bb2072912bb958213bfff16 3ef90411081cf45fb0af9b89ea1f72c8 @@ -12192,6 +12239,7 @@ 41f371db4d3093e95c0d4c771f882c16 41f4a7fd341656fb670ff84822093262 41f5ed0e40f638046b5e5bd74bc86d15 +41f621dd173791bc2e020fc8b658790f 41f8afd05fe87f440135874acf65e8a7 41fa09550baa6720b89ad14a373171d4 41fa72e1dd47cdbcec0415f48fe5154b @@ -12497,6 +12545,7 @@ 4390b82422c7df4351b850b6662d05c5 4391806ca647f912b0f981d18cc07a01 4394e2c9bb6e195980dd173762d10f23 +4397bef5f8da23f9e049f084e2b0c5a1 4397c71ce2b06a0aaf1c7f2cfa36755d 43986c3729c70fb4a5bd2ff2c5b15b0a 4398ccca44b4473d3ae68824880ebf48 @@ -12518,9 +12567,11 @@ 43a715b755029901ab99639f1b7e7107 43ac5e18663e692f78afcad1c753212f 43ac8bcb1723e102321a5e2869485dfb +43ad92cdcc828dc6a8758209f251976d 43ae2c9f8a3c2d507d4e3f32e29291c1 43b14d3b24429b6c6e44192ee272f896 43b1a07f3b558a8dc2e19b65f8667f48 +43b1d41a4af0b16ffa6c7aece70df9fb 43b2e200d9d58469e477e21d7f2ee8be 43b3f657584b3929ab2e5268e75ecfa4 43b49419cc992476d9bb41a6b7fe68c2 @@ -13158,6 +13209,7 @@ 4728c1dd740425bc772076ad0f78abe6 47296ac974fb9c1c3836bd598eee5894 4729e6616dfe0db8113202337628daa6 +472a4a83e12c9338aa019ab71b1cd538 472cf2000130f8a77e3b4de2265facdc 472e7a1a0797d2fb3d00cf964874db4a 472fc7143444e3123879ec40a3f1db40 @@ -13209,6 +13261,7 @@ 476a3eb77739bde4ee459f94abb764da 476ab8f7e92c2a42443493060aae370b 476b2fa725198faa5121c3547d3e8347 +476d3d7cef20b6425bd69fa10f8b8a4b 476ea5205f1e6380a58a6df08c09fd16 4770eea1612bb30564975a9bbf358dee 47714b35c03c6f49a0a4975a16296895 @@ -13516,6 +13569,7 @@ 48fc6af29385c116d37c8de5696dca44 48fdd78848122b4bdead6edf02e073b5 48fee9aba233ba72649bc95759307de6 +48ff0180ae3a8a78997fb890ee109ffc 4905317ce4d52d076ca8bdd3e49ca44c 490540cdb17bd218f1843041937c2f2f 4905ee878e5bbae74d889030b5d5f7f7 @@ -13545,6 +13599,7 @@ 492333ab6a412229720e5ad738e19b3c 4923d6659affb6396d2b9d4ac13869a7 4925c4f814f259924a6e2f6ebf4ae0e7 +492743728e902d23d6d5d53eb2543a03 49277325dd0f0358390a2203f5a7896b 492a2e08c2e3526c7ae7931154b479d2 492a593678012737d98bd06c4ab5dfae @@ -13608,6 +13663,7 @@ 497dbbadf503c2754e3ca8f4ade772db 497dd4c9b950bfeebe8ca1475564261a 497ddd96968b68f3c933270094709b03 +497fe6b5b77e35e8391441306a44ae7a 498c8b74a55c40504df838841c50f530 498d363012544b9065486670301a0b00 498d9848907ea86c296e6908f2683faa @@ -13693,6 +13749,7 @@ 49f945bbac8b563ad109ee7df71c227c 49f9f09bedc8e8156d724e6226d91a29 49fa83f0b5b58d4ef8c452c4bf9d5282 +49fad9093e12519919a7304127e10f6a 49fb7045df30df154c196b145cc98ea5 49fbf597844788a1a8a1633b0b278062 49fc480ef62f2ad8f98793c570890fd5 @@ -13726,6 +13783,7 @@ 4a22f67aa46100b5ee925abb25b1fdb7 4a24051ed87826f394dd38a62695d3d3 4a248cdd983cd58ea7d798c160fc4f60 +4a26b6ed1c266d9bde5cf5e42b84a0f3 4a27220ff91f482eb411b9edd1b968e2 4a2780fed5c4e2aa36e4e1c0e48dc552 4a27fbcc4bd11abd494763c7a409927b @@ -13847,6 +13905,7 @@ 4ad8f41c8001987de29e6c1deff123d0 4ada6bdd950bf63b4c95603dd795b1a4 4ada8d639f42ce1ca43c6eb17802baa0 +4adc3be48978d137080ecacc4bc6bcb0 4adca296b6f9567a6c2fa53f27865d3e 4add259046057425791175040aa7f5f1 4adf9823a4e3540b59168f3926c5970f @@ -14412,6 +14471,7 @@ 4dfed6fe004fd210ea6b6ca081045eb6 4dff7473ffca9d4e6ac22955e90bd4c3 4e074fe040111467eee72e254e64ed42 +4e07eb61d55593353142e4c01d152346 4e08c12df4962152457e12596d308229 4e08d1287975a426b7124013ff7cf6f5 4e0a189a882c70d1d1fecf920213c41f @@ -14529,6 +14589,7 @@ 4e963337e8eb71b845849884a7b35b6d 4e97d024ccaa8ad5c97ccf32a818bb5c 4e989816aee4c90b559a65b783562253 +4e9966e92658343a7a1276f8290c9aaa 4e9a9bb355f473f19669705030826c20 4e9bde5ec8a199be9ee3b888f45509bf 4e9befc446812a156b2bb29a3fe59386 @@ -14650,6 +14711,7 @@ 4f3edb86c8542999a695415371904561 4f3f33f5efd98562c761b2fb4a9d6a9e 4f426816815b5e558d384c6250df4231 +4f427169a6bd2bdbe0009b9915c77aa0 4f430a804cb613c689552167e1a556b2 4f44618433c1c129f223717ed379fcd7 4f48e60858dc789551af56083b5839e3 @@ -14717,6 +14779,7 @@ 4f9bf2aba5e6dfba7f9da70a44be9a53 4f9c08d4e32f540d9bce336ebe1a2718 4f9ccb93ae9e8e68be640c0b94657723 +4f9d2c2dafb8ec79da73e6800165f136 4fa098e48d8415a952ea73e8bdc06b9b 4fa0e3691b89b29a7cb0ce3bfe2c3a6e 4fa16c78b1f133361f177ed27aae3337 @@ -14899,6 +14962,7 @@ 50968cd52286863dc7ebcb794fe1bfa8 5096ac701c78d0dc5829445d0452464b 509b21c7075b184e0a9442de18fcb9fe +509c53cf5aa1f8440e1917100cadbc04 509efb0fb72d699efcc2202b9e8df738 50a04e0edab9eb0f33638e44014bc899 50a27c0ff47ca278030ceaad66ae5b74 @@ -14920,6 +14984,7 @@ 50afd89108c8b230b3456fc4342b9115 50b40bf654d30d283765d41fa56f3c40 50b449bdf9e43272756a934a16ea14b5 +50b44ce4cdd1d844dc0f63213f790285 50b59e1f8b3623163ac5f173a54360f5 50b746380291b31c39dfd51a49bcfb79 50b7d0acb6575322679f80f47a663e07 @@ -14965,6 +15030,7 @@ 50f2bb053f50d4e1300c035d17a27248 50f3af9df22ca6d57883e440310afbdd 50f3afeb653f2070e231eca2fd927034 +50f546b2519eb0334f3c2f16b9387751 50f8fec774c38dd6e77c92cbddc217f7 50f9fa163abbb8aecdea13b024b6341f 50fba0b0b9d7cb1a2e655fa16ce1a78e @@ -15038,6 +15104,7 @@ 515078554d2552e33bd80ae77f945ace 5152327db053043f45e0844e1ed65878 5153ad54a1ef93f18a7dbb2d90599f6c +5153cea05218e4ef7fefe49a84a1aa2e 5154378095868719fd800987ae8c7067 5156b384f3f1c20f947c0f8be9874461 515803b028b1bd972a94509c7474c4b6 @@ -15359,10 +15426,12 @@ 5315d1d2bab05cf4863000863312a449 531684e91481de1f6ab71c683825e771 5316f3530f3bd3b850581804debd1afa +531744ce6be100b5716fd40d7c9de0fc 53174761da7fd6b454d8b88e8a919a9d 531773a4010d17332a7caf09f591c683 53177a67efcf6bfd373fddae10b215e0 53191fa60d0407df72cb2c5abfc40045 +531bed5576743bc965cf1a75f39672e9 531c16f0d2155e7a25bb05182886f6a1 531c251f3349d3a4fd19fba51f0c0bce 531ddc65722f737dc6e21db4719f601a @@ -15928,6 +15997,7 @@ 55dd33bc7bd3729f22af3fe72ef4074b 55ddca1ff9b5a6c07552c2a2032070a3 55de4872b2e2456b0678fc884b88dcd5 +55debbf864d74de3c9f374f3e289f2b8 55df5e14ad4f54d79349cdcdb3ed9788 55e63216197d3818a3a447ca32db25b9 55e63df04cec0b854e06249f1e059be6 @@ -16534,6 +16604,7 @@ 59302280671e8af89575b3df20fe3c08 59328d41e4e8edeefcbf2534e0988ec8 5932d7254df19252bcb9631eafafe6fb +5933b4f2aeeac44c631c46df7dd69df4 5934024048d6f1db3c7c65519a35ae15 593468c6fe28bf4db0519ed4d479ed77 593778650c3c289e594afbb4fdf3171f @@ -17079,6 +17150,7 @@ 5c3ed8b72b3eda7bc6acfb02f3f37902 5c42536cfcc8d0dad8352ca659da3e6b 5c42c1e7c70b17a7810b5b44c03c81b0 +5c42c231c2325f3f82354dfc759481b5 5c4320bf325cdd8e20114525e14f9a86 5c44e68b5db37eea1277a7f5ffa68d9d 5c4529e86446c3406ab013830ea81a2c @@ -17210,6 +17282,7 @@ 5cdeb4e6df97593260509be936465e2e 5cdebcc7034cd6277d9ea85cdbff9fa5 5ce0a5bb5304260fd4b992f996741499 +5ce2695cb47af61a5e0ce4f958fe8ea5 5ce2e4c461a65e39dcd26351248411e0 5ce43e85a4b420b2344548785387966b 5ce4c9bfe401ffe097895183ac7fdb1b @@ -17250,6 +17323,7 @@ 5d1314cfa63355410c5827083249357b 5d13dc34191e9d465c6818c91c376e13 5d14bc76ffc78dadafb5a3669dbfdff5 +5d161de209bf1bf98f219ec307eb065a 5d177927392666524df5705eb3ebb19f 5d1895183e042229ba8a4ee313b6fece 5d18b362d49eb721e31636c281ca4c51 @@ -17281,6 +17355,7 @@ 5d3abccc255b4de613480efccf789d40 5d3acd1731553ac1b12d99a272460c85 5d3ea10db3bf697703df3bb1e5999b2d +5d4207cb8311cea2ce9990bff32ae156 5d43521304247dc7e362a3a42488b3a9 5d43b7004cd2b85e204eb934c4d21f4e 5d441f2a53c15027fdb230f22cd5b1ce @@ -17291,6 +17366,7 @@ 5d4cf609ed33d0e5c962222a4f62bc2e 5d4ed47446d65b3fd7a43889f0ea2aa0 5d4f846d5105ac2a8b3438d6ec5a1064 +5d51181e2725deb04b7e69a73f80306c 5d5130aeef7c56307e39bc857b03cc54 5d5351b57229dfce62a9c1de79c0c5a3 5d53b511e820e0d5f5fea50b317adcf4 @@ -17694,6 +17770,7 @@ 5f86313b2e10abc3980545b82c68bff8 5f86a0d23b8b013c888e0a14f6822ff0 5f886a9589924f5cf4d77f02358d0dc7 +5f88a4a255bf4ee7e4055b40bc668ec9 5f8a2ec713417456b927e0bd4244ec22 5f8a58767579838814e849fb422884ec 5f8c6382f324328181b9da39c996c6b6 @@ -17951,6 +18028,7 @@ 60c5fb168f7e56a84e62e65830433f6f 60c704251c42b530a21d6df5d3a351b0 60c78326d31afd502a3ae2828ec3e7a3 +60c813048196b96ba6ebe545186036f4 60cde4151ef796abe8ab1d54d2efecff 60ce2a8dad2c0cb0a20b227725a2de9d 60ce30408d1eba6e195ebd038ce951a1 @@ -18030,6 +18108,7 @@ 613f1029835a7252580a6932e407c6b3 613f67592fe56f06b2c94df38a0f1c10 61408db2b29a06794fede644ab20f239 +614236ac149fa8f620e9e37778857498 614262e3acf34f0709b2d14c8236d11d 6143f72b0ef132ef553de94c75497e4f 61456bafe129d78150cdc6db87427dec @@ -18794,6 +18873,7 @@ 65831641173f0b18a97b2cff5077392d 65832f6060492902e3f4de8e678666d9 658461930db45db09a61d256a12acdff +658513dac258a043b0d9f279dc684422 65860d5114e4f498ddde3cfcb2fd26f0 658742ef1905d8750547aa5c10480ae8 658755c993f52f8e802899e68fb35e0d @@ -19358,6 +19438,7 @@ 688a2a79406c252ae1247412367f798e 688a8bf9b23ef593e19c55c484484669 688ab0d391a92dea10b000416519d113 +688c8293cf53e8ba22f98e97f08befe7 688e9990fb2da39a3053743ea2baf72b 688eaf480152d00454220652ce45fb44 688fdd6fa158e346c424fffdc75e1c9c @@ -19794,6 +19875,7 @@ 6ace6b2b9672f137929cfeec9a63fea6 6ad146f0525c2dbc966ad888dbf7efa6 6ad51785cb7c26b35786106f03b112ad +6ad5ee75d0764b8b99a8141c954f4f1f 6ad6c838a03bcf9f363c6dec42822ba8 6ad6e3cb7804031dfe989dc6dc1f31c1 6ad80d9071e7cecf739ff58e9a83c719 @@ -19895,6 +19977,7 @@ 6b3f1d9b44bbeed61a5ed2824b59d8ca 6b406dbcbc7fb6e924aef08ec7a22b16 6b419871cf74d990afad21f2b2922353 +6b429588c3893ebd080393b0ea89a535 6b42d6b28c7cd89ddae18b4b79e85310 6b439bf9b8fc5d63bdcbc2ae3c17a0fa 6b4407116af9c1557a1aa63a3da499be @@ -20239,6 +20322,7 @@ 6d1e30693f133b4b505b85bcbf3d3d56 6d1ef843ae5e1936db51836a8e097e70 6d1f81456fa158678f4c574c0bb26fd8 +6d201793e178571f66f27253870a0d48 6d20f535ec451dfff2373515573c33c7 6d24e2945e40baadc4c5d2bcd17304df 6d28603e872afd051c9bdd0a0b7ed7d2 @@ -20423,6 +20507,7 @@ 6e1fb233ddcae13c97e9f9cc1133ad91 6e20bded530e0d55d92ca2ec47961e7e 6e21e7ee5603b9663cf1e8c2bd097e4c +6e220734d4b351482b142b6df489ece4 6e22211fef150f27739ac8cfe0c83b96 6e2269cb145bd1355549f54ebca12f3d 6e245be4e0bf674abba28553fdeb4ec8 @@ -20462,6 +20547,7 @@ 6e5eb13d4564bf66e3325356f307e7de 6e5fa18df4f14b62479efa69e1eacf3d 6e613bab444df20d1f48af8772dba9ed +6e61b449c8534fbe92e40a38019ddee1 6e62d4b7094b92c37c13c8c3dba00a3b 6e634138dec899ffe6229e2afa7f0fdb 6e640be35d729977821d9210cccf5c11 @@ -21135,6 +21221,7 @@ 71f7840a6d3741a3b36d246f48f4b61f 71f7b2185478ee2e56c4717621ff8a0f 71f88215f6f467a9ab65fc26e13b77a8 +71f93bf783ec79580e9997c9895d4054 71fa38de6bdf0ded885df0899fe56601 71fa5c79c17002e70705d7ba5a6f33f4 71fdab28bbaa97d38271099788bd68e7 @@ -21479,6 +21566,7 @@ 73b460210393d8796110d9b426e8573d 73b4f5c1c6d38ed92a250129119797c0 73b6e099869af1a3199259a6e07794ca +73b8c0db1019b9de94e2719285931aec 73bb769999f1e51c14d7ce58c659ea88 73bf1b224ec0387ad08311f1fa5ea180 73c11fe13f798df0cdf4eee548afa8c8 @@ -21921,6 +22009,7 @@ 75f95f5e85bd1f3f46e419020ad63f15 75fff04ce1ebeed5d16530e670db268c 760085ba20b9149fe81aacf83eddc5cd +7600933763452f69ad5b0e343ee0f5a8 760298979e3be1bf18d6a7cf04f8af4c 76034039934bc9609cc7e823a04ab88c 760502d8033eda17002679269ae42cf1 @@ -22571,6 +22660,7 @@ 797124a61ffd65f6a8a3e479913f7ff9 7972f670ac1f6ee26d313be2db065f0f 7973da40cb1e96802e259c96eee30f9b +797401ae93fb906d6629e53e47c982b1 79740340811de064c00fb0b1041efe44 797570b9133e0c2c3eb6eee601ad79b5 79766ed3fe99f02d711e542f80dae4de @@ -23043,6 +23133,7 @@ 7c29cc8c004f6c134e34b5c49a9a7a72 7c2c187d5fcb80c6467f8bc453dab631 7c2cff8f68c99c4c7baca68c6423e26f +7c2e93aab1f292b0ba2c8383393ca2ec 7c2ea8a82633e97f32b77d3998fd4555 7c2ed7dd1602af288bc67ce15cf27687 7c2eef5b6132c9366df606a50297f6bd @@ -23437,6 +23528,7 @@ 7e11c261bcc4bc31d0ca5f9d79604890 7e128ce1c00273e73ba732a6e633ec26 7e153b7108fa221218ff9c2c0c1a0341 +7e1557a5fd1acabf3599bf50107cfb98 7e15728911bdea17f1321897224b4a3f 7e17d9bb1e6057ee99ebad2938f8b7ed 7e1bc22ce97c5b24ac2b703932798eea @@ -23916,6 +24008,7 @@ 80bc83f179ccb15b5fc105bb8720f910 80befb4e9bf34560b46d753ee6115acb 80c0661e3a1ce54e58ec1b2ee39f6cbc +80c1ca1a8dd1a3c523356859479a812c 80c524454f069d8fbdbe6d809a49e837 80c5d6f80eb81faa4eae1934803ddb72 80c6dce86a902bad249c0f1df3c8de92 @@ -23928,6 +24021,7 @@ 80cdc66d676df68f898012f0f9fcaceb 80cf01eaa832367c26d76a9d5b4f820b 80cf190f48263418271326dc3c0b8688 +80cfffcf2aaa447888ef9f5489c7a5e6 80d05144107b1b5ea6b36293525f7e31 80d4b67be7585200ed1319b1e4c9ceeb 80d51dbe2b2914bab95889a96e345373 @@ -24002,6 +24096,7 @@ 8131642c4043d6ce84713e6c61db2e84 8131eaea51d89e6f2530110458513cd4 8133f1a5c55b77ccef0810d32d1b779c +8134b5c117e131d9dd228b3c572bc35b 81358d13c16a9ebae7589ddc887b2911 813785a9a90fb319a631fca698c12384 8137fb7eba55746a5cd413df0c017c63 @@ -24167,6 +24262,7 @@ 82137a6c4eb4c424dd06478e2ff37a99 8213cb107716013405dc8449f6bd9700 821418987dccdd7aa80ab7a1b63b0166 +8216e226abafe6ab8627a022b4308200 8216ef135438ee0e5e84120646bffbdb 82171e1280c520722ae4832ec013383f 8217751134e8a0fd623de86b2cdd1016 @@ -24570,6 +24666,7 @@ 8424d98a44dbea364f7fbf259e3f8e07 8426452629e10ea857cea509bf10c500 84298c2ee702a08c10c18f5e523bbcfb +842a07d3e17c7906d353acd86e0d510a 842a6e586447d28dd15edad7d8c2c08f 842bd654c1a9de1ae231bf18427728a7 842c2d9955795953faa9de49ae14985c @@ -24830,6 +24927,7 @@ 8587613a0d81d113b9cec94f2b9c7ee9 8589c3aadac86ff890ec53fc3df7b390 858a4eb6106da7fe4f235697a06ee7e4 +858ab85605114c068e3e897e05f8a6df 858e4ddd566270e581cbafaa1bd1e3e1 858fd33959f4976224a6790126139d9f 859148c9266cab9411b229b07305d4e2 @@ -25032,6 +25130,7 @@ 86871b3951507a261150fa17d00ca189 8688507b3f5f11cd4a3dc5b413845e46 868b537ad38764182f754aba09915d1c +868bb4ad43aa3988aac08f8e034f7e43 86991eb1355ffc35d2a5039bb93cd2ff 86993c6c3f1e1833a7a3cc6743e87861 869bb234e2767065444f718d89d83724 @@ -25283,7 +25382,9 @@ 87e92dd0e40fc50ebc43796f04ea0225 87ef22ec3877a9d14ccd30aeccfde1fe 87f00f2a5da03ed6df4d05f7281caa24 +87f0e39cd48ba38a6d99faa835afbe8f 87f6e428c8a335e6e4b101ebffb227dc +87f6f41393168aafcb9c01db3641ab85 87f8b35ec1eeacac3b59cd458967efa5 87f9e0c79bc510e7b44e1533fb49b66e 87fb324067b1bd6e5ad768bc867d0582 @@ -25354,6 +25455,7 @@ 884a511263b737c37f361ddeefcc5e66 884b0a9330fc69d5d49a3a6b3f83ede0 884c35e791f1aabed328d72676026f21 +884d41f1b62c73f20c4491f7d849e526 884d808cb3270506628e151c49b051f9 884ffb1cab822a4c8492db48a13f19d9 8850f605aeda7de843dbe36a7083b8dd @@ -25442,6 +25544,7 @@ 88b3062f26b921408c0aba87764af6f6 88b3adaed51aab42fe628c9a693b5454 88b46cf24a7a3cd1cdbcb1029cb0c6e3 +88b63906443380508b381e8b2c8ad59c 88b65d2e6e5493b6da9be84b15715c9b 88b733125439eb1e2448cce121494123 88b82c4bc2ff55409800a729a9df51f3 @@ -25678,6 +25781,7 @@ 89f604f90a8b5466e679b3913ef98646 89f92de3d34aa227526d212921ef95fd 89f932f16ba02d8953763930ce4262f1 +89f9beba4bffa2912beaac73d548988f 89f9cd70ded4727e73a972e513fb10e6 89f9d666f06504da08b5ecd0322d16fb 89fac72430dbcd05e2c14c3f9eb6bc84 @@ -26461,6 +26565,7 @@ 8dedf964458d1b180fad2680309fac97 8deee6aeb279b0b6ec0e086c645b7b70 8def008d89e17619eb340d5085f25791 +8def721c85cec08de05f0e9aa54cb5a4 8defdd23b7fca88d69f6ece6ea63d885 8df011860bb85b91c240e2573dd34bef 8df1867b9879901284a14231f130feef @@ -26548,6 +26653,7 @@ 8e5096d7e10f3643140e2d8bde84c74f 8e55f6a1ac10042f4d63504d4b702573 8e57024d1545207a41c70ab82eee28c7 +8e589099833b8c658a4f64f97e7e523f 8e5933f2fb97ae024abe492df504ca29 8e59d3086c855e1f0938c57b1ff4ce34 8e5ae1879e9e1c2a2b8ad7158477565d @@ -26886,6 +26992,7 @@ 9053e589ede5cf799b9b9596d42d20b9 90547489c9f1c5d83f08c96403af54fe 9055b8af5f0f8fac915e3d2f95ba8be3 +9056852bb99c1f03efd328d4a9ddc83d 9058281d66bd641893c8fc0066e865aa 90582859b0fd0be760a55c71b3614313 905850c28cd05ffa7e6053b189fca4a4 @@ -27341,6 +27448,7 @@ 92c23754c63f287b9f9686abe39f7ab8 92c36f053220afd1ca3341fa9d8cd582 92c430bc558ed92b92cc30439d28a0a9 +92c48e69659528bc694af84967255fca 92c8086c84e0b37b640c9cb44aa16c2e 92c8dd1f4d020de42a8a15f8edfc8775 92cb23f58ce4b861aac0b77c7eded58c @@ -27371,6 +27479,7 @@ 92f2968ab3321be298fa70890e907e27 92f4821c240ca16402e68be3a53bee35 92f5a7d56441e7ca33cf202ebc55ecb0 +92f7e17375718587ad9d3be86653fd1b 92fc4eb821b9ab5457b2afa12d8b84a5 92ffc68c5f1c390604b5fb58aa260621 930059530f1083df6a4f11fdd6f0bc72 @@ -27689,6 +27798,7 @@ 94ac77b584a5b497f2b017846a7b76a8 94ac9531a877f3f6755c714e75fa32d3 94ada90323253873dd90b66ba40e8388 +94af7c940bfda085337e212035870f22 94b0f7cbea9534db2b8587cd9343a191 94b10a0afc1b944b2f7df2817c610635 94b442daad85ca878832332d6a604e52 @@ -27722,6 +27832,7 @@ 94e22cd21ee6e3d00de342b9fe3d3664 94e34579459b8bb6fdd5249a5c46410f 94e7c0c305dd7d2cfb3941ed77d13ff5 +94ec87f3be87da8076582349abc5e787 94ee53e735bf4e02d5d6d2e10dc0626c 94f149bb4c28e82d44b005639ea581b6 94f177f79b4bac3c1085cc80fba218f7 @@ -27765,6 +27876,7 @@ 9529b3962128a44d9cff968a61f89e9b 952a233ff29336d708b1636f01a154e0 952b22ba823b715e18d7f6a18a98c115 +952daae88592ed29e536b0a687bc7b01 952f907ed00aae1d502d96188458dc4b 952ff364f02381d5923fd4790d33f324 95312d1b24a488c1aaf1dc3fd9f618f2 @@ -28008,6 +28120,7 @@ 967758403d06ab582e3174920a9ca912 9678d73dfaf9bee5b3803dfa065d1265 9678f610950c282722077a70094a7d7d +967a63480f72678f750901913770d489 967b01a89ccaf0e7170c35d24980e158 967dd42b2f10cedf4e203bc19c5b8698 967ec6f2e4186e32ecb994733e912641 @@ -28154,6 +28267,7 @@ 9746df8fd5acb58872fb6359f02e9b90 974797d2123f4935a2a3222c82770711 9747e7ba026e9b2129ef83d217530460 +974844e0b11483f6fb0fb03cbc57eeea 974a1e1e59c1eb7e19d87ea50c90274f 97500a08462c7fdc83c31fb14e2ca2a7 9752b843d90eb06d9842418e97e9f244 @@ -28185,6 +28299,7 @@ 977d5de93f9e584aaf760f79d73f5015 977e1826b8e83dc15133d6957e51ac16 978340a7d73b2d9dfead72b642b86e9c +9783cc73906b9f01e19d5da5443bea81 9788ac48083b78b282a3360d34cba2d3 978903c8d30d0bd363eb242d8e6bf9da 9789acf3684f96c2f0caafc477252c7e @@ -28357,6 +28472,7 @@ 985e77fca1abd1a6b2cfdbf11f473649 985ec633ba21223fbbd31f1da350ec5e 9864b9ea121fac1cf437861b6aca3ea0 +9864cf5ec6dbd8f7566669ad122ee55a 986acf25406a033a30c69d57d5745259 986af39f8bed3841397297561d5adaa3 986babb4eaae342f28fae7d442ff09bc @@ -28548,6 +28664,7 @@ 995df8ada5c83cf740813d72201fdfb7 9960d5b1f2ca7fe0b823eab3c7a0a0b7 9961bc7cf483552063e320f7d7580574 +9964d4a4be9dae1b10febc2f55d28630 9964db07992625cf4fb2e8a438bfb430 99651e7fdadec147114f35076e4ceea0 996549f3ee3b174b3fcc6f9bdf1bd001 @@ -29008,6 +29125,7 @@ 9bc60241f70be80046243f842702c282 9bc60eb2112f11c439e1567c3b50cc61 9bc6cc99d092842b65f969acc5abbdab +9bc7e71d8c464e2de2e828990c67675d 9bc90d459fb5a016dfc01eda397d7602 9bc9907cdac51e993eb3f94c38ee9418 9bc9e31d551257ff596ca28bdeba92a6 @@ -29325,6 +29443,7 @@ 9d91e35788fdf67f2941091fdef8348e 9d935262430cfe429c7490963d09fcd7 9d95c47d8165e3c3da80edcebcb2cc5b +9d9777d5ee478878603f728e46cb6da2 9d98fc65878e4629933abde115892b82 9d99d1b2ccb5a8950ac93b23b7696e35 9d9aebf33219b85300611a8c91e7b1bb @@ -29492,6 +29611,7 @@ 9e83f860e740028292a2b5b7350cb8d6 9e8407949b8f4f4ade4ac9a420cdd494 9e848f6c2022e51cbac582aba9131006 +9e84f01f90df1dc8f405c5f70e74a3bb 9e85820fbdefc963d563d5025afde750 9e8769d40c03024bf4ca169489194daa 9e877f684a4e83c61e08de2747ce6850 @@ -29600,6 +29720,7 @@ 9f171aa55dd3a5b319fd4b996ef1c9d7 9f1741e24207ec85de99653036a9ce2e 9f191088b6c278c4428268dd3df88a2d +9f1d45bb689655e7141f7f89127a0c10 9f1db129ade229c7f17dfba0ff280ed8 9f200e257386f251c6a3bc58760c313b 9f22ff86cd3b140e52e3d9fdcc033e21 @@ -29630,6 +29751,7 @@ 9f49578edfd588dc99271d321333cbf4 9f4a5a9735e7a90627e7ce2da9683bc2 9f4b78dc8b5111de238d8eacea7f84ad +9f4ba9b6221d7c579417dcb1220da28f 9f4ddc6427476125544b6c9e7f153511 9f4f809b3ccfeced05f78e9516760e50 9f51a47adce0b9e3c943cfed80b56f88 @@ -29811,6 +29933,7 @@ a03c44a2db95349a2162a337a1c277ab a03cc6f3645a3f99ee05311591c94bf3 a03d656ac0e18d0b1e3da56403e18b24 a03f2b6a68b7b33715bd7afe74b9e77e +a042741fee86db3a41f1db1a04702bed a04441f99124b3c5a097d296103b94f9 a044cafe06a9dbab02af703ae4351cb7 a044f1d1e5bb03025365504da1da7363 @@ -30117,6 +30240,7 @@ a201a390e40cb5e2db7dec9c22be376a a202bedc98d42630836b7d9b13f9bd87 a2055a3a2b1a6d52982ebccf8d2235e7 a205e24bb3607a39fd9d06b4682a814a +a206f9e0bb9ff1aed51cbe684bbcd972 a207b29a98ccf8c33c592d7ab2157682 a209ad43c1313a5fa91e87ba97ad0d0f a20c8de60acf1cc52767edd6e05676b0 @@ -30672,6 +30796,7 @@ a4e06740ba336b7252a674e83e50d854 a4e2c5f46e52d22f2b480e2fc92e774c a4e4a21f4395db7c876ceccafa3d45f3 a4e8652f42673f66069ad19f813f82f6 +a4e8d8887e3a08a850015aaea902c443 a4ea8a19a629e1f6f7c3f95eb09953b3 a4ec1b54c9a2152558783e2e3d4a6b83 a4ecea027ecc6ec471da793bd6c82588 @@ -30691,6 +30816,7 @@ a50856934899d7b0ba22e0219d7c75ec a50a6475615f04fffdbb9012caae4516 a50de03e8890f1f1e336a9332a68a7c1 a511ae9ace9495c309adc18f9b35603b +a511bb1ff5f0f82fe40209b8cb212070 a512462dee847504de2a6e96ba6d732c a513f06df214aef80ef9f3f0ccbb85cf a5141eea4d0e149d321c44d3d318c468 @@ -30888,6 +31014,7 @@ a62f20995b167153a2c61978ea5908aa a630e033562b2502f1f098ee858d0e73 a6315a0db6c74f16591af958d86c9cf6 a63197b3c93ac9bb909cd308b3667a4a +a631c660039554e8aaa64cd3cd470f2c a6324e3efa542db5abee42fb72466ce0 a6328860f557c0ca5180fa123e3ca168 a63556a754fec63abfb4013052fc4b66 @@ -31181,6 +31308,7 @@ a7cda8410b153993b3f112f9c27876d3 a7cf42b2c72aa45d0143a57316ad84f9 a7d06bc8685e7414c8c75318d777615c a7d10c004ec1b02f1b893dcc71bdac46 +a7d25dc45d826dbc8b73b93346a99ffc a7d5d64e2fec691f42f38ebb662ae9fa a7d64290e1040499b1c3be7b3ea82daf a7d71de6b8c80b67e47a3c04f4986c8f @@ -31220,6 +31348,7 @@ a80daf101a5576bde27a0562fa39a4cc a813615d65351d2e5b2c5faf02aa30b4 a8142286dae679088a6e0c540356f6b6 a81454c0889f48a8b4dedb7510628950 +a814d6b139b6f1de703333dbe82bdcae a815255f8dd8ea8f56766d01b08b32ed a8156cf6b2822be4ed2aae7ec987e9b8 a815887fb16aa023e00403a78a3e8e6f @@ -31275,6 +31404,7 @@ a8500c20736f7ec6451b81e7922d9dbe a850e171f57ca7214dd6e270f0fb2254 a85376a28b83d79171bad65d5c0cd17e a853ecf10e295a5340ea1916400d528a +a854e1d2b03a069b3cf7ed10289a586b a856e94c43cf814c0f5ac187e34b6e97 a8575516ce45f950778e2c6822d3a900 a8589fbffb0de629aab10beb6a9fe66f @@ -31296,6 +31426,7 @@ a868a08020c2f51aca1f70b55f771000 a868ab292b4a03756972724718356185 a8696a6fc88b3ed32ed4899816223b99 a86a12ab1f377bc959e830d2faa6611c +a86a3083d1bfd8f49e34cb1d6cf746a9 a86a4f49bef16f0e7d7004d0be4b3be2 a86aeb171959e769847870e08169309d a86c7122f02d5e33779e0ee002a001e9 @@ -31341,6 +31472,7 @@ a8aa1e299c844e49e769fc4cec46e7ae a8ab47eae0999b40539c51bfa6b263ee a8ad92aa5e0abd074ae841ca7eb05631 a8b196597d26b9df153729f8901b11c5 +a8b475aba9ee8661b3b73eb3b0ef9583 a8b4b7dd11193180087f01efe9bd0880 a8b7e7acdb0d306ef5d09f93eb78b2d3 a8ba540d9bd8109f0364d28533121079 @@ -31355,6 +31487,7 @@ a8c899b7aecb9ac02006f2270e1dff9e a8c8ea60889237392b2f5570897bd886 a8c96be24390dc7884ae9f609efa496d a8c9c547176cb01c560ee5d5d35cc0ee +a8cae0e5c4d027e9449396fe4d0815f1 a8cb22502380e52f5bf22f9cefd079d7 a8cbdce74463d485b2ceffc4a37aa21b a8cc74a4f58eb478afcb1c9bb555b90f @@ -31432,6 +31565,7 @@ a93fc1bd88fbc2df95034ccd7bf4010d a940307cd0af50624f8151352fa658db a9403c152e6dc54393245bcda33c73b9 a94049ca1c543ae05108f1bdad6a7b57 +a9415a2f7c89327d6664be07b5104a83 a942628dcaeaf3c05a832b5fc184eff4 a94271fd6eeda401f2c591a95e2f06d9 a9428e6bbabd9f647e9f1dcdbf6e9e81 @@ -31746,6 +31880,7 @@ aadf6cbe3e7adc90b59c4da78a484ee6 aae08c272c8db732acd0979aa47d5864 aae0fd5dbf21ef01122e17c191f66ca1 aae22eef4260b0d141e70af505d64627 +aae273b9e3bb49c66f4d20a6b262b0e9 aae2f3185d477896ab2c3e1e946e94a7 aae337ad54410abe22085fd79dd42421 aae34367842a723d74b5c7663c84844f @@ -31897,6 +32032,7 @@ aba16813601bd452fee184a3815b9779 aba30058484749643439fb4f6a06b3f4 aba40c1226c50fcae9d5faf0b6a3c9bb aba636a9741ad125e78b07e9dcb057cc +aba79ecf897214d2e08ed1f560564042 aba913bf8fecb68046821b21d32a753f aba947b0945cf24cff8fa86a03dfe139 abaa5a127640864d9be9f87ef6db1752 @@ -31911,6 +32047,7 @@ abafd81efd1aecdb84105435c4fe22b4 abb0ffd13a6155c03bdd0b852640f81a abb217c5b42933679c59060f372a91bd abb2c76617a43c0872d45ec706ab199e +abb3175fa3c6474500c97d75ca546bd9 abb4c87957510f04117710d2c8805589 abb4d8aa46709f197491ef7d65106cf1 abb65d50261d54da7d7de3c53494af67 @@ -32555,6 +32692,7 @@ af067bcc545e067eee3f528d6e3c9851 af070590153217a2d8d31a2f3a68c542 af09a8675dd1b2d7cfdb51d204b36d42 af0bff6eeacd222285e5ef241c4e610b +af0efb3a79e1921962c63a4ab517d198 af1104a6c84787397db205a9984f0da5 af11fce599c55d9e8d677a2b550614fe af13405d51f98995fc0b2c121d73772c @@ -32619,6 +32757,7 @@ af5f8ea812f6fade2069847b33ef2681 af608ce4413626cabcc8d470d54a4144 af6544bdd3d79467f8946d9bcb5e0b5a af6545d1cd3327470756725b69335cdb +af66bd34c313bb7aa3f7cf9a7ff0d1a2 af67340f0d5ffe18181d9a356ead95df af67d598838637d4c2299843ee81236a af683e9bc3d22fcfb02bd187053d9cb8 @@ -32880,6 +33019,7 @@ b0a70dc67ef8645c2ce961e96027e2d9 b0a7c582d87a1d1ea55618ca90c7bb52 b0ab7c0702eb486eb3347d177c3ffd44 b0ad3034c7c8839c63c232605e13d336 +b0aef7571961edba6cacc8ff711c6da0 b0af8a15da5d662d4900dce3379a5191 b0b0c709f8a52d22f780261939df1b0e b0b1096dfe76c31d920e4ed312e5e507 @@ -33019,6 +33159,7 @@ b157b93be085c79207c9422cb7e9e33d b159a6d68606f60a60580a09cf7e78bc b15a58aafe4d517835c8714e9b4db95a b160692237247be24409094ee0ad95ba +b160e760b8348ba77366ce694a92d13e b1610be7216ac211e6e39bb65e566cf0 b1661ba861cda15cc1d95e2f8a7241ab b166d51fd6a36efcf180e30482c20793 @@ -33029,6 +33170,7 @@ b16ab5f054c1465229a0bdb2b42cb0de b16c1dbf1578657ea2525e8578dd009f b16c428253fa1f8767a6a605a84c7f7b b16c512ca209542f3e842a415050ced0 +b16dc1e3e70fbfc8f5eafb7781b9b902 b16fe83a264f55b75222032f5e498177 b171888a2e924ef45be770688dfc7aa6 b171bba5b2144b05de78b49586dd7d97 @@ -33072,6 +33214,7 @@ b1964c1efed01461b7091e279d2f06ab b1980824ab97d32da1e9a2f06d47012b b1991efde207664138a9323499f0583b b19996ab23c7493987fb14d8ac110be2 +b199c0054d2a9fb1f466b1912558abdf b199f67e96e0f2906a2c5cd364ed15d4 b19c6c8746bce23db93897c6312d3f5f b19ef5f16ab1f09a93a5edd42576cf08 @@ -33560,6 +33703,7 @@ b42c057630f7f4f1ad80977ca24c0121 b43016383f818427ecfc3eaa780824c2 b432216db666cf4c5e7d265d189b9c04 b432851882594e7dde9df8457ac1a47c +b432b56ac844c5181b0f6bdd45f70881 b4335405dd8e2172e413fd5bfc4e9812 b433cd7bf1314d3ab7e60b889f59ce4e b4350c822e414a85f403129d630e5274 @@ -33837,6 +33981,7 @@ b5dd414058bece579223452845680255 b5dd9625f2f49471d2b272869d97fb7f b5de16777cc623f8f38fa488c1f65eeb b5de4f8c96fb638eb8a3c0def2872f1f +b5de87bb320d2e80ed253a42134f228d b5df908d4737853dc289b64d79834f15 b5e0219ac7ea8c642579f40322c5a1c2 b5e2e3701e1f3e142fecb2587034cd5d @@ -34314,6 +34459,7 @@ b8608f844b96b2479a59197fb01ce72f b8612f05b7b3469670695a8be4a4ded7 b8632072679ea01fdad246db6191e6c1 b8638979ea8c5f41606350b3d9a0c9b0 +b869510c5e72e2bdef7e8b059b370423 b86ac394f404a5ff16da4ad61b7c2468 b86b81062bc60b5b3bfa578cc9f927ef b86b8ab06d3460afd3f600fd06384254 @@ -34552,6 +34698,7 @@ b9d1249478e3934e0451ea68b061a998 b9d1948db61cefe6b94a72d5b13c3210 b9d1ab89b7928a83c1c5ae0bdb8f0ca8 b9d5551c3540426c8a178ec81122971a +b9d589a5341a93bcbc9aaad3102af709 b9d5973e8d6f3c0fb6a0c1bc091d8ee7 b9d903a427b1c8f1c6580f189665e36d b9d938b0445f13b978d3b0c901f2bf24 @@ -34602,6 +34749,7 @@ ba1987ebfcf643da479cf344c9c2f624 ba1a07bbf50ce78eff970e3c7f506ce6 ba1a1b6172a1205ef6df5b10a80f8126 ba1b4396cd82b7d36808421798339113 +ba1c04316648ef3c986b451444cf4213 ba1c65ff320e2960b39e3a4b0a61f04f ba1c76a51ef7649a07b8dd88eb79ebe5 ba1cd4b62b9dc5ceddec44719c16c2eb @@ -34679,6 +34827,7 @@ ba7586b9b4f4338bd4a8fd7d2366243b ba777b1fbda380609d611db54fe9cbd0 ba77938b60b756ca36683bed9ad469a0 ba78b55a233407bf0c6e359028483cd0 +ba79498df405dc3b6ec95515fcba0492 ba795ec2e36ed4937bc1049b434694e4 ba798215fed31ec3da482a91de1b3445 ba79a6caffc5117e8f3196eb7ff48ef7 @@ -35090,6 +35239,7 @@ bcabd318018eb3b60c7a2f6bd81da7e3 bcadddbc7b1bb0a8beb8bf4af34ed08d bcadfa00a1c65b068f201ebd5155cc91 bcaf513b6d06d25055be70a130d0a575 +bcb0195549a6cf8acb6711a79bc02cb3 bcb076b10c0ec05737dc90f5d2978487 bcb0971bc7c2457e5971c0508af95265 bcb2844ca4b7708c2b2c14f56ab52334 @@ -35099,6 +35249,7 @@ bcb6e0b49fcb6b8b055e58c0d8ad285f bcba07074b5a3083456b52094d340ec4 bcbc6b3cf98638baa84e22efaa04f7a6 bcbe8348a4107ef688298f76ebcceb1b +bcbf6c0b4d7631cd92fc4167c628a600 bcc37ccc0025d23fcaa7403127751e46 bcc55a33f1c4c58670b00c72d9787f07 bcc56dea1d7f70b8506ad29b96f214fa @@ -35125,6 +35276,7 @@ bce3f4ccec0e8bedd5a97c3523a8e2c0 bce47f546f07dd52ec3cbcc6ae1d2a0d bce4a83b51846e724a69e2323bee2565 bce7a004287cece1a43ba5f4ed69ae95 +bce85622ce0dd3568970e9fba5f921f4 bce9aef8219ede97efbef91a3b2d9c47 bcea594f1bc067b29e22099817b40e57 bceb637ca41c7e17846f86f02871240c @@ -35444,6 +35596,7 @@ bebef1f0f1d919615911ee50eb4cc1eb bec06655838c61fc533a32ff1dc4afd8 bec7ca27ea5b58a2e59c69ec483527e0 bec938b30a9fcf92592b9f7d5991d34d +becae7cadc63c5a25160c75d78ca1373 becb39128633cf1a225e7594928d40a7 becba62c2de30cbff2c2e688f625641b beccb10c63ff39edfca6d75653118e8c @@ -35523,6 +35676,7 @@ bf233ce1a481581d687bb62331d0c643 bf2452793f3c6cd940f4b079e9da0cd2 bf2532fe6ce175b3d21a1c242e0e721f bf26b8d8177f1c6e71a1287742307721 +bf27e5ed19843984298a49acc078b212 bf27e77b52301acb2371dc7aad3f1ca9 bf2c48809c80ca195fad5fec2191ab26 bf2c64e03c31bbffa29aed80752ef228 @@ -35821,6 +35975,7 @@ c0e1c249434d9ef114efd4ad3543768a c0e23702e09766b7581ae7f9ba24c0d3 c0e2b7e3528e43ed5a8f130f6ff3939e c0e2be1e6d0fbd722988fed47babfc84 +c0e2db92479585a34541ed6bcc795201 c0e332a206dfce80abab3eecd73d6da7 c0e381d5b3bb56f23945cfb018182e20 c0e3fcc18db9d332c25c11f698565234 @@ -35949,6 +36104,7 @@ c1662b61ba2a432993aaa8adb3739bdc c1673faf93e54d0eb24fa234ff4ca448 c1687b5d908456ee2fc314ab832b9dc8 c16a2103e770626c099cf2700dc5df38 +c16b64300119ebb1367598822e1e3f59 c16c3b521a37ed3e08a70d55ee8d7baf c16c9f4eb346ca2671debfac466ef191 c16d75959c1b2a02d2ff791e07d72206 @@ -36088,6 +36244,7 @@ c20608e4d8d40a33e60061381fed91e7 c207465f7436477f030826802fa8d5fb c208199fef03e5d6d9127296094252dc c2096946a2ec9d344b3d74610cb1867b +c2096bc1a301472a6f2d723500ad13e0 c20b90b283a9917d0a192d00f47c32d9 c20bb6986c00324532f15344ac9b350d c20be8853de7d462dbef5596cccf5d06 @@ -36171,6 +36328,7 @@ c27f902332b821b43942e16ff7b8c861 c28728ffc5d176400f57423370902b3c c2873d4d00e7eb354028490a13c4e81a c2889806d60588b2a6c5390ba5416474 +c288d7cf37350be1fb837ef642330d6c c28a6e34dba002dac2d1f83496bb3034 c28b7f4eac528160c60d2c3753130d1d c28bb64316eae681ed19c65b1b2e5c85 @@ -36353,6 +36511,7 @@ c35897ffe17c91756ad6ed2f4c2df62a c359755e89002d8bb3f14da9a8d8639d c359a1d16ea94073f0b2d66e5964bbfa c35a4811bfff3d052bc72542545fa870 +c35b441f400343863df7764a84410222 c35c4e36dd18812818fff0cd81216267 c35c5529b6277d2637e258650f540de1 c35d4eca0f2bc31bd984dc15fcba06c7 @@ -36729,6 +36888,7 @@ c5732c9cc93b85f973a546d278adc2b3 c57387e1e3d8c5eccc7cdd4e98f4b205 c573d56825619ff2c67e341f64133af6 c574e021faa3b2f4d321b6e2ea0d8901 +c5757cdf6a5ca392312d7f1ae7644bfb c5759e87dd67aa5c513db85a2a6f15ec c5776d8d7c1821197bbef236424b90d5 c577889f4e7b13ad169e8898cc92d207 @@ -37042,7 +37202,9 @@ c70d865d7414d93a8614163282b6b421 c70dbe1f7c68539607ea9f81d3206ce7 c70fe8047dee6d355710a98111452cf8 c713d23be678056360d175b8a90a6599 +c7151dd6667d9a4b83d874c2fff06ccb c71676185918675711878b1bf201a765 +c717185e5e2a2fc5bed8f392d2a82e22 c7191f68f7df95fbdf341ce76fe8f952 c7195894a22c31cf14de2240a7f9b54d c71c18c57fdf1c8b6ed4b687edb3772d @@ -37182,6 +37344,7 @@ c7ed4ab01a672ac8a8470b5c60e5949f c7ee3db4a097aaa45e885581f28beafd c7ef72bf5d359bc97e3450045ecf66a9 c7efc97d246c9e47d8a7fabf127baf7a +c7efe97417d8550023d082e03b93cd57 c7f152fa93013ef1fdc8a125ae1f0fa1 c7f27f959c83fcc2d30c7e1c562ec71b c7f3861dc4325c2786e2fb0be4a81174 @@ -37198,6 +37361,7 @@ c8004d37f0385e670b0101a7391094ad c80190f89b911c4629e15ec667c36f04 c802f8231c39ecb66ff3199ca75179b3 c805f82d956c6e778b6bfcf438781101 +c8069c891db41ea68b6387ddee13a50c c806cd12f696205ef55ae1eb2751e4ba c8086993f26fee70ece394bdb7593e40 c80a7ae9a7efdd50fbc5b8bf3d342dd4 @@ -37228,6 +37392,7 @@ c82dd07b5259a426e7296e7e9c63021a c8315ee619ba9d400e8a2d848d048bbd c83335c1576ab28f94f05e79b16b49ce c835248adb6b18e34a45770d864713f8 +c83524aef20aba50fd13661f00402cf6 c835fd0a00a5705a3ffddfbb183e7c67 c836c29d4d71f5119ec19079f9bb6d94 c837b333d1b21d8b4cb31a26e8c2970b @@ -37604,6 +37769,7 @@ ca1bf0773b56678031b4681919c79b80 ca1c71d92dffaae0da278344196d1496 ca1e4be1c0117fe91d1e7b4cbd165ec5 ca210ae240da1d1adc2111e683b4420c +ca2201581ce15e472fda38cac221e01d ca2211b5e1a98fd6b697db99620ddbcf ca232fd5cd14301ac37e546340748571 ca25d41de97bcfca748a0f0171bb54f6 @@ -37797,6 +37963,7 @@ cb02fb6b1eb82a6749a34a33707be0a6 cb03f44e29bd64c4aaa6fe1107578ba8 cb0593a36375b7823c51483ed93aa8ca cb05ef898dfe11a4222868777df2d351 +cb060da0161852857ccee2e3e8f9e603 cb06fab0d6fdcb6d7933a0749b893e41 cb071fd1c728ff567043906072eba5ef cb0c3bf0d4eb67a382f509b65bdf985d @@ -37879,6 +38046,7 @@ cb7e490b9fcf18f3c58e080cd740cebb cb83e70d5011ba0b7592b6dcf1ba3a58 cb84f8064f77b117ba662cce95264f19 cb8847df0560dc0f03548ebb0cb46657 +cb88bf847190e2baec89ae004b6e8ae3 cb89e25ed6e968bba8a40162b05b512b cb8b174fd84b0bba429d6ea876546a10 cb8bc58698355fb1c19ecd8df1de900a @@ -38104,6 +38272,7 @@ ccc67030a5249bd95ff7976c8a16b845 ccc70d6b2ffa127819eb2c75ba085a63 ccc8bdeae955648928f0a092d70c2802 ccc94bf22246f2b59621b8867376509e +ccc9c282ece804ffb2d8566f5b1ee6df ccce5aff881c3ff9f3c7b8831a836efa cccffd87efad1c006a992fd6b51ea846 ccd1731ccf710229cb2152d68870e091 @@ -38330,6 +38499,7 @@ ce06ea6cfe067c1851b87f40a23549e1 ce0830eb28d609d24e520ed57f48c1fb ce091bf03b5eb8e5a0a554a1c2eb6526 ce09a4aa83f73b8ba6289af206a4f6ee +ce0d7f7d462b352e9c8ebdcccc2d77aa ce0ef093a5acd4fbd70035992b4fb98b ce0f9469d0d101c721ad1d3d8bc4bc64 ce104201c33f93c03357be91c75d5bf9 @@ -38351,6 +38521,7 @@ ce23848a8cf1f8c8508fd4306d1f5599 ce2559e7a31f4eb3e87833e6974f3a22 ce25c734868eb18baf8e4aff1ae3ca71 ce2852ee9df78fb230632e88b800ca40 +ce2a28b11f7e81e617090991bd8197da ce2a9dff1b56c4663e614a9c059fb30b ce2cf03e8f0aa07c395c29f97726e2cd ce3114f6c20302af0629e0e832d29d8e @@ -38424,6 +38595,7 @@ ce89107bcd3ec6f73bc65cd843416bee ce89b58e13f807979e5d16334d3d7ff2 ce8c6eb1286eac383024f9cd45e40aee ce8d77d0c71debdab00ff1415f84696f +ce8d835c8bc202accb2d44a772d85f15 ce8f51ed1a082d3428760f14379d179d ce91381740e566ca42bd4f6e11da5e9e ce953d2b2e4b538874cac52777279440 @@ -38471,6 +38643,7 @@ ceca246651679761c6a631fffca56a7a cecadcdb828d657c5072235c4f25ce5d cecbdd48a7b30a29f1a83ae4cbf6564d cecdbf4b860acf733f8d050f01440b79 +ced91b34e00592b8f2c74c061585f765 ced9613c7e8d848abdd4a8d0f0742244 ceda52ad07d1be2f359bbffc77b6b85b cedaeb0bd29fea2b4f2095b15c66ba57 @@ -38565,6 +38738,7 @@ cf47ac70448ffe55c1ebe9cd134386ec cf47cf93822ec8170f596853fc320fc4 cf47fc5539c47154cd7cf3f5a7426cf6 cf4b1ac9155becf5cc12a70bbb1b6dfe +cf4b65ca9526ba464c46d72b4a2f7f6d cf4db1516d6a8de520001d893caa03dd cf4f87da2071ca5957eeefc55b0a6342 cf5224b3e8c93444df7c1c10f48d6870 @@ -38574,6 +38748,7 @@ cf58148f54175490ef7d7c66dcf33361 cf5ab1096653dc27a685328ab1558631 cf5c4d4bb531be453b3dc746819ec9fd cf607dda9f8ef33c99ac204a08cf47b1 +cf611b586b6ec53c1516f535360246c4 cf6340d9a47d760680575e5d09f89e83 cf63cc21e68ee4f727a5bb02eec113e8 cf66a9d6815c68e2d18a5efa85aef5a6 @@ -38721,6 +38896,7 @@ d01c3378002d9d3e7f80c05c448671b1 d01cc450927cf0412c8e4a67afd84e46 d01edf77b7c5ad374b9fa5d14ec61632 d01ff9f9c09f3c3d7602b6ad699b0875 +d0216ded7c1d540db5e17ff51ead006e d0237d02c89c07dc906e9a50d4dcf261 d0242d282a35ddce370fc227469d4ff1 d024a6c5037aee9fc3581f665e41590f @@ -39020,6 +39196,7 @@ d1c94fe461b176c70485ba632bf8fee4 d1c9ff93baf7f0c0072128d9fe8ba453 d1cab63bf309819e9e1f1321c809f72d d1cce21a22e2449846999309891fee33 +d1ccfe4131a1a8fd573ca3717fd2b960 d1cf7ff96411f991e8b11a4964cd7819 d1d1b1dadcfd8844b4fe38126bf313cc d1d3db80fbb2f8e46d736e619860af99 @@ -39790,6 +39967,8 @@ d5e9050da29522a5c72ecca42ffd4251 d5e9d8e846f9ef388ce51744f19eb8be d5ea56e7df1b965b8805f8973a222517 d5eaaa3465574b330c6c27bd2ac23a32 +d5ecdad92f107eebf26c69c41708308b +d5ed33931fbba1fa5c1d431b175833a6 d5edcf161d7dd6cd71c2dfb31ee1c510 d5ee1bc14139d3af2afbff2392702a3c d5ef47d12ceb755348974ccd7dd4af38 @@ -41372,6 +41551,7 @@ de0547c068ccc028ba4cc1f28ed915a5 de06a737772e7c2fcf5cd9a93c5be6cc de087678f68db38ef8eef1e1f0b7b05c de0a0331c5e2266fcd2ab4ffb27f323e +de0a817a867d521766531c88c28a46bc de0d349c73f32438c8cfe529b839f49f de0f7693123fd000c1f2ccd5c48b895e de0ff48c7ac1f0c553a1039fe1799982 @@ -41465,6 +41645,7 @@ de95af2bc32fa7169b1e2c6a056d0fe4 de960d178f2d7465d2164b149b30aa64 de962d5c4da6269bd7a97f9d22159b26 de968c1d29ae9d3a568aed6627ebd56a +de97ebe125963225d471e7a662b4b98b de9a0e43a4fd52abae6862ac1a630d92 de9a25066f54a65fdb62a4cae47bd867 de9bc3035cafb7999344df70068204f1 @@ -41535,6 +41716,7 @@ defb126b13d295ea4ad9c60ff680e274 defb555d456d7a79c376e364631329b8 defd852c049e9fa5e839cd442f54276a deff411de717292a4449e17bfc04fd07 +deff5018e45579cc7f0f4ca52b9bd53d df0393f839b1b01518dd775ce2fca52b df07082bd9a99d6daa0b70a764e863c9 df074577784954d49b4d8018cf685678 @@ -41813,6 +41995,7 @@ e08fe87934d3481f1c0a0e7ef16932e1 e09094ff6ce7c88e70c91811fc4107cc e0913abdbb32ae0c29d135ebb03e7bb3 e0918b0a25ccdbc6bed7f4a741c6e298 +e091ecf5053793fecc2a56f9e1a7e3e9 e09227268450a76a703d8954590ad8e3 e0924829355e45efea09944426467943 e0943453cadeadf44136499c28af7929 @@ -42077,6 +42260,7 @@ e20ac72483f690835af33a32fb5811a1 e20b4023023c6a6cc1b53c7ad0b02c6e e20b5a2642acc6f580f1f8a07d4fad53 e20bae6839bd42bf0d421cafdab9ca29 +e2101d4e1831a45f3410076fcdd8e497 e215cad849e1045fb8d40dee1dde21ed e2180b4a195add9c677af858bf9c8c57 e219cdce32a330a21e46f5415a18d76a @@ -42123,6 +42307,7 @@ e25096716e8097a6c146cf4aed6c1d94 e25185c8dcc90fb8f9a54acf4194bf34 e253bedce4ae5b643c6cda8732e774c5 e254b87fdf5db942f03cb7f777b1272b +e255d6fa4ca0bd281ceb6563fecfbdd1 e25626d550ae59318e49c8c1e66f2d84 e256a43465cd0e9879a4949770c748b7 e2572bb759c6c887e40591d126ca2744 @@ -42165,6 +42350,7 @@ e28ceaaf23ad82f792226acd2a236a4a e28d05cc44c6d65e0a8fd8a6e23d3a69 e28d8efddf4c487340edbc63d037b1e8 e29045d56da1989bcaa63b85c9e79291 +e291f84f7ae263c3a586f7d6f3083f4b e2937cf5e89532ee32cb107d1cfb6f7c e2946ffa46639dcfb7a3b2490dc8451a e29635524cb702961a4bc1e1c6451a5a @@ -42244,6 +42430,7 @@ e2f9b78ab35ff32fe3cc1768f23f995e e2fa2ce826a7f4b3d8bb60b3dbf001ce e2fb2ff566cbe012570c854cb4616f5f e2fdb193213f6b209e12e99fc81fe96a +e300fb6218a28ac766a44dd9f96aadf5 e301a8cc8f8e06cdbcc7df996b93e94b e3028611571e9b87f48ffe12f619d1ac e3034572daf08b02ba908451489d3134 @@ -42414,6 +42601,7 @@ e3f056b4f5db9d56f6b9d3c724055a8f e3f11a553bf85c1bfdf97ba0e35851d2 e3f6e877df51f1df9e94cddd5cec1a8e e3fac11d6e21127d44281b3590374103 +e3fdce0b57119a256719f3f578564c91 e3ff5427c069674b619f0f35754da592 e3ff8893e2cd4934989081b0fe158249 e3ffc6475212b90741a4b443a1603cae @@ -42470,6 +42658,7 @@ e45340763a211b17b1311578539a3bf6 e45406e192feaad91ab832cb4e43cbff e455fe9ba335217ed0c94662d3359db4 e4560ec419d3fdddd74c91e57765c4ca +e4568f5232ae61b25b14d6cc4b0949c4 e456bb8231a0a408576e502c3448906f e458bcb8db4413c7a3c146e1c7a2b8f6 e458d1e74544951c9f909e28144b75dd @@ -42743,6 +42932,7 @@ e5a526708779178ab009e9efbd7b6586 e5a56607de28026ef38a96c8e77bf010 e5a595fd66578d8bab60de0fcaafe237 e5a5b4633e1ecd223f6a630e8532ad48 +e5a919ce8913b315e99ea813fd5e9697 e5a9ab74bbb74660771264dcab33152a e5aae759aecbc592936875ee3ef65380 e5afcfa23f8e58e7ea5371e9e4b60be6 @@ -42838,6 +43028,7 @@ e63077712c3878a0dd9086bc4d8a324d e630ba01cc5547a799cd58e4b223d476 e63215b7601518fbf2b6f38df18c5e60 e6321847b69fc36a32236a00d03cdbbf +e6327ba6e9d9e886e440c419cfd7331f e6331d488bbdfb4d92a1671110f32661 e633bf01bb94b37006a23d87572bd147 e63403867407a1b72e4b45ff127f3433 @@ -42902,6 +43093,7 @@ e680fa43b4c7aa7c8dc91debb910ec2a e68391e14be83ad5cb428c2cfec6bbfb e686d582b0292d6fbf390cf19d2676f1 e687eea879d77fd26b64c75015ad1a2f +e689059aa58fe68da552d8ced38f958f e68a34a16c13b9376e9b0fb6d25cc124 e68a653799edc964680f3dd5e9c79725 e68af299d861cca9c55b5dcde3825e50 @@ -42987,6 +43179,7 @@ e6f5a5c0d56bcee8b6b87e2dfd8b79a4 e6f78202abbcdc4dac2bb5868e7636e3 e6f9a1fc78888abc07c3e20791aea4a0 e6f9dbba94ad6804171f2bd740a60923 +e6facf93112fb88e70f707c69e14618e e6fbd802b65cefffe9b25ed27bd324a1 e6ff2ffdb517d5de5a85519cf199afeb e701c443b45866dc9f13660e45117f6b @@ -43475,6 +43668,7 @@ e9ab9f3dcdeebc709e264c39a65448a7 e9ac8769715d5c5a92a2fa5b6532d24d e9ad3bd3e05ef6016d774c6941f34b13 e9af1c6550085a8ba16c3ce96cd83158 +e9b33b7e844d616f44f5bd0d657aa550 e9b57af3ad907dafb1e08e300b765513 e9b66df100a9826f2090cbff204f69e7 e9b8c5f85c8711f633f61d555bace8e5 @@ -43951,6 +44145,7 @@ ec27878e2f71353214491d914ea6fd05 ec279ccddf12f0a3d18fc035c4ce537c ec29d87198be3d6dbd95e4e69fe94e5d ec2dc762200eb17a2191fbf72ab84a9c +ec2dc7c418a14e64c5a22c36ec3ecb3b ec3273babfe174a70640325c63e72c1c ec34dc6434f296c868a4d555d9ad9cb2 ec34ff7303ce3738e5324d0962cb02fc @@ -44080,6 +44275,7 @@ ece6bcafa34152f0befdc0b2a9d2ec5c ece9ceaa2fbef197c53066993a5f5ea5 ecec18d4fe0d2df913dadf22afdd14b8 ecec7bb7af409223d2b8fa3bcc5f41f9 +ecec9c787a6a76fd7f81c7f75706ed25 ecedc3df34cf0d9f97ab7fa01cf4b317 ecf30f633e5795d81ef632f5350b9162 ecf3f65c7e8d89c8a55e7c2605674862 @@ -44136,6 +44332,7 @@ ed24431c0c405ff288ac1375110e7a73 ed24784023861085d59efd85b6e400c8 ed2488672bfa641b2313f69e0708fa9a ed258eabf8c9d1809b6238b1a2d293fb +ed26c6de499b07009552116a8b481230 ed282b8104b62b9de984317bb1ee0b3f ed2aa2c23a4db744a6984190c21fe371 ed2afcafc1863c1efd1b62210e4e73d8 @@ -44287,6 +44484,7 @@ eddbcb14280502430c213441f257c3d7 eddd69004278a4ecd2a06482cf906f3a eddda44e26cc919e4ad69bd5c0927c6b ede0c86505f940b6bd639a0cf034a973 +ede139c05fb1da3b51bcf938a8becadf ede3f740335cdc85a1f8a865b275a307 ede4666eb8603ec8112601c040d49b45 ede56a182eeebf09b8fcd670fb5acbc0 @@ -44430,6 +44628,7 @@ eebd8e12c2539a84823217b59fdbee5c eebf56ab8e0733dd671cb84159d26dfc eebf99523aad6a142691ddcff3bf0d4f eec08ba43414334cf594bafcdfefcee8 +eec103174c5d7f98897d7ef1cf0e09db eec13a549c6ebfbd2b9a63969082a36d eec144ed5e73fb743b5fa0440dfc552e eec3aac8fd33f752419878a13e5dcbd2 @@ -44564,6 +44763,7 @@ ef6bd3465a28ee9cf6aa24207b979f6a ef6c83b9b535e5af29b362bb40a44dd7 ef6f1365b31c8321c0788bb9dd19a040 ef70325a61dbbed6721bb04534012167 +ef7111c4250ba0f2625eecb7bf65c242 ef71f4c46ae1d6aa3ff903a2385b220f ef72c2aabd5e34ae4ad402d53e020671 ef738a2039abb790e012fbe54bd9221a @@ -44849,6 +45049,7 @@ f0dbb7400d4771a2bfac48dc72ac5f21 f0dcf4ec180d7a8093e3d590f2224317 f0df3cf5f8e8d558a4e86ff6fc7fb7ae f0e1c5720ea75497b0ec7617d33a9dd6 +f0e31f2396324b201a640eaffa3885e9 f0e7859d1357b295aedeab2471c848c8 f0eca4761d3b9cfce2058abbe1883ce1 f0ed7ae2242b3f940d8f4abe6329c851 @@ -45552,6 +45753,7 @@ f4b9ec833fad6a119cd6f418e030896a f4bb276b31acc783b99bb89be6caf53c f4be69e55b2ede3b072139b0d56192d3 f4bfe11702f8cc47bb5fd8da527dcdfa +f4c02e07b052a26f8c8fa316b24239f5 f4c03c0836ab1df0a42c1e61f86a764c f4c33bc101b9e014ccd3c19292bccc68 f4c54000cb8b1372ca72b28a7eaab58d @@ -45894,6 +46096,7 @@ f6896094fedd9fa8995251bcdfdad4ae f68ae7e7be20b1fa2428dc4bbe49fd09 f68da1139a3ba57c1d66225da0c585ad f68e9bade32011ddace66e5fe8788711 +f690810fdc0352bcab870660941742c7 f6943608057c906311c8652716b0bfef f6945e6c3a8039599c7191de19d0118b f694a9f976383a7ede6f8fb270a9e7f0 @@ -46053,6 +46256,7 @@ f76d67994b24dd782890525ec57f8856 f76ec17c4c00bcf343402b3ba6f80002 f770d74061d61bb4a19e59e48ead279f f77133534e6e670c72354ec899b763ae +f7721c84c0215d75f874345dd3cf786c f7760dfb56e99042adc055f6efcc5437 f778cbab9c7ff1d9b9faa0fcef277150 f77a31feb2531ea362e95f1f445e18be @@ -46179,6 +46383,7 @@ f81f29c21949f6ec4874a52c1a8bcb14 f8203f487719248050a6d2242dd4c8c6 f820546f4d19b888a5c1fd9e9af3da0a f8212c07cf2c06e62f136d0f2220bc9c +f824f9a2fc66f013aa12a4883b962e24 f825f4f6913e4a2dfe3bbf1b7ed68c65 f8267072405d07590851124f661f636c f827756d8de0937fcde5329c7dd89007 @@ -47003,6 +47208,7 @@ fc9ce3ca53307a6843bd148bf5ae0fc0 fc9dd3a43f0ae139e9ae5aadd80ddec0 fca0e7ac7298000f82a820c017425f4c fca1776e9cf97ab5d32aef9dc189b818 +fca56a428b5c13372e3b912c3d05d519 fca8db86d376d4e845a379fd2f3ead06 fca981982b5301f980c50ac2e5a757e2 fcafddd71789f3660b4211c932ae0e3f @@ -47207,6 +47413,7 @@ fdcdb782389e3249531534951281a11f fdd18f0a1db219bea88a0ff9fdca4b63 fdd329cba0052c33269ab23ea9c63e02 fdd3325911a4fce988f6fc3d9c66f64b +fdd3c0e9f3af94072deaeb9fa11b9a15 fdd727deef6209b900007f7cba9898cb fddd7eb9aacbf44798a9d7d493873f80 fddef0c27f2c7ba703a006912a35bf9f @@ -47368,6 +47575,7 @@ fec024dfdde6e347262968adaf10367b fec541d7a8a95181fe9de32cef490420 fec5aa7042d154bf4fc4baf62a450045 fec629773270160ba4110b9871935213 +fec6ae44e7a9512e320cd7c8752f39ae fec6c4dc0fb8c6387ff66142a4390802 fec6f80d492c6e5d906a129e990366ce fec8460590d596f617dbe432f06922f4 From 913dfbde3cc02c6775cb8d2cb547a679ddce540f Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Thu, 29 May 2025 07:26:13 +0200 Subject: [PATCH 69/74] [fix] plugins: currency processor bug Fix C&P typo from https://github.com/searxng/searxng/pull/4836 Closes: https://github.com/searxng/searxng/issues/4861 --- searx/data/currencies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searx/data/currencies.py b/searx/data/currencies.py index a4f2901f0..0721037a1 100644 --- a/searx/data/currencies.py +++ b/searx/data/currencies.py @@ -51,5 +51,5 @@ class CurrenciesDB: def iso4217_to_name(self, iso4217, language): self.init() - iso4217_languages: dict = self.cache.get(key=iso4217, default={}, ctx=self.ctx_names) + iso4217_languages: dict = self.cache.get(key=iso4217, default={}, ctx=self.ctx_iso4217) return iso4217_languages.get(language, iso4217) From 0b4c47a123ba2192990178ff94da7d347d3da9c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 May 2025 07:43:50 +0000 Subject: [PATCH 70/74] [upd] web-client (simple): Bump the minor group Bumps the minor group in /client/simple with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [sharp](https://github.com/lovell/sharp) and [webpack](https://github.com/webpack/webpack). Updates `@eslint/js` from 9.26.0 to 9.27.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.27.0/packages/js) Updates `eslint` from 9.26.0 to 9.27.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.26.0...v9.27.0) Updates `sharp` from 0.34.1 to 0.34.2 - [Release notes](https://github.com/lovell/sharp/releases) - [Commits](https://github.com/lovell/sharp/compare/v0.34.1...v0.34.2) Updates `webpack` from 5.99.8 to 5.99.9 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.99.8...v5.99.9) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.27.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor - dependency-name: eslint dependency-version: 9.27.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor - dependency-name: sharp dependency-version: 0.34.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minor - dependency-name: webpack dependency-version: 5.99.9 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minor ... Signed-off-by: dependabot[bot] --- client/simple/package-lock.json | 1123 +++---------------------------- client/simple/package.json | 8 +- 2 files changed, 114 insertions(+), 1017 deletions(-) diff --git a/client/simple/package-lock.json b/client/simple/package-lock.json index e1f183493..f05ee9e21 100644 --- a/client/simple/package-lock.json +++ b/client/simple/package-lock.json @@ -8,11 +8,11 @@ "name": "simple", "version": "1.0.0", "devDependencies": { - "@eslint/js": "^9.26.0", + "@eslint/js": "^9.27.0", "copy-webpack-plugin": "^13.0.0", "css-loader": "^7.1.2", "edge.js": "^6.2.1", - "eslint": "^9.26.0", + "eslint": "^9.27.0", "filemanager-webpack-plugin": "^8.0.0", "globals": "^16.1.0", "ionicons": "^8.0.8", @@ -20,7 +20,7 @@ "less": "^4.3.0", "less-loader": "^12.3.0", "normalize.css": "^8.0.1", - "sharp": "^0.34.1", + "sharp": "^0.34.2", "style-loader": "^4.0.0", "stylelint": "^16.19.1", "stylelint-config-standard": "^38.0.0", @@ -31,7 +31,7 @@ "vite": "^6.3.5", "vite-plugin-static-copy": "^3.0.0", "vite-plugin-stylelint": "^6.0.0", - "webpack": "^5.99.8", + "webpack": "^5.99.9", "webpack-cli": "^6.0.1" } }, @@ -172,9 +172,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz", - "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "dev": true, "license": "MIT", "optional": true, @@ -675,9 +675,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -725,13 +725,16 @@ } }, "node_modules/@eslint/js": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", - "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", + "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { @@ -745,13 +748,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^0.14.0", "levn": "^0.4.1" }, "engines": { @@ -825,9 +828,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz", - "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", + "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", "cpu": [ "arm64" ], @@ -848,9 +851,9 @@ } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz", - "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", + "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", "cpu": [ "x64" ], @@ -1024,9 +1027,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz", - "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", + "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", "cpu": [ "arm" ], @@ -1047,9 +1050,9 @@ } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz", - "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", + "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", "cpu": [ "arm64" ], @@ -1070,9 +1073,9 @@ } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz", - "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", + "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", "cpu": [ "s390x" ], @@ -1093,9 +1096,9 @@ } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz", - "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", + "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", "cpu": [ "x64" ], @@ -1116,9 +1119,9 @@ } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz", - "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", + "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", "cpu": [ "arm64" ], @@ -1139,9 +1142,9 @@ } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz", - "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", + "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", "cpu": [ "x64" ], @@ -1162,9 +1165,9 @@ } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz", - "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", + "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", "cpu": [ "wasm32" ], @@ -1172,7 +1175,7 @@ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.4.0" + "@emnapi/runtime": "^1.4.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -1181,10 +1184,30 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", + "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz", - "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", + "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", "cpu": [ "ia32" ], @@ -1202,9 +1225,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz", - "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", + "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", "cpu": [ "x64" ], @@ -1330,28 +1353,6 @@ "node": ">=8" } }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.2.tgz", - "integrity": "sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.3", - "eventsource": "^3.0.2", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2232,43 +2233,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", @@ -2576,27 +2540,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -2734,37 +2677,6 @@ "@keyv/serialize": "^1.0.3" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3011,49 +2923,6 @@ "dev": true, "license": "MIT" }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, "node_modules/copy-anything": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", @@ -3098,20 +2967,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -3389,20 +3244,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3491,21 +3336,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/edge-error": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/edge-error/-/edge-error-4.0.2.tgz", @@ -3570,13 +3400,6 @@ "node": ">=18.16.0" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.101", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.101.tgz", @@ -3591,16 +3414,6 @@ "dev": true, "license": "MIT" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -3692,26 +3505,6 @@ "dev": true, "license": "MIT" }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-module-lexer": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", @@ -3719,19 +3512,6 @@ "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", @@ -3796,13 +3576,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3817,9 +3590,9 @@ } }, "node_modules/eslint": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", - "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", + "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3827,14 +3600,13 @@ "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.13.0", + "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.26.0", - "@eslint/plugin-kit": "^0.2.8", + "@eslint/js": "9.27.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", - "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -3858,8 +3630,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "zod": "^3.24.2" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" @@ -3980,16 +3751,6 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -4000,111 +3761,6 @@ "node": ">=0.8.x" } }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", - "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", - "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": "^4.11 || 5 || ^5.0.0-beta.1" - } - }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4249,24 +3905,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4325,26 +3963,6 @@ "node": ">=8" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -4406,45 +4024,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4548,19 +4127,6 @@ "dev": true, "license": "MIT" }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -4578,19 +4144,6 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -4634,29 +4187,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -4825,16 +4362,6 @@ "@stencil/core": "^4.30.0" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -4944,13 +4471,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -5337,16 +4857,6 @@ "semver": "bin/semver" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -5365,16 +4875,6 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/meow": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", @@ -5388,19 +4888,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5533,16 +5020,6 @@ "node": ">= 4.4.x" } }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -5587,42 +5064,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5751,16 +5192,6 @@ "node": ">= 0.10" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5798,16 +5229,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5839,16 +5260,6 @@ "node": ">=6" } }, - "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -6146,20 +5557,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -6178,22 +5575,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6225,32 +5606,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -6457,23 +5812,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6534,7 +5872,8 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/sax": { "version": "1.4.1", @@ -6619,9 +5958,9 @@ "license": "BSD-3-Clause" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -6631,52 +5970,6 @@ "node": ">=10" } }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -6687,29 +5980,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -6724,16 +5994,16 @@ } }, "node_modules/sharp": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", - "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", + "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.7.1" + "detect-libc": "^2.0.4", + "semver": "^7.7.2" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -6742,8 +6012,8 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.1", - "@img/sharp-darwin-x64": "0.34.1", + "@img/sharp-darwin-arm64": "0.34.2", + "@img/sharp-darwin-x64": "0.34.2", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", @@ -6753,15 +6023,16 @@ "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.1", - "@img/sharp-linux-arm64": "0.34.1", - "@img/sharp-linux-s390x": "0.34.1", - "@img/sharp-linux-x64": "0.34.1", - "@img/sharp-linuxmusl-arm64": "0.34.1", - "@img/sharp-linuxmusl-x64": "0.34.1", - "@img/sharp-wasm32": "0.34.1", - "@img/sharp-win32-ia32": "0.34.1", - "@img/sharp-win32-x64": "0.34.1" + "@img/sharp-linux-arm": "0.34.2", + "@img/sharp-linux-arm64": "0.34.2", + "@img/sharp-linux-s390x": "0.34.2", + "@img/sharp-linux-x64": "0.34.2", + "@img/sharp-linuxmusl-arm64": "0.34.2", + "@img/sharp-linuxmusl-x64": "0.34.2", + "@img/sharp-wasm32": "0.34.2", + "@img/sharp-win32-arm64": "0.34.2", + "@img/sharp-win32-ia32": "0.34.2", + "@img/sharp-win32-x64": "0.34.2" } }, "node_modules/shebang-command": { @@ -6787,82 +6058,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -6955,16 +6150,6 @@ "source-map": "^0.6.0" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7666,16 +6851,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "node_modules/truncatise": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/truncatise/-/truncatise-0.0.8.tgz", @@ -7703,44 +6878,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", @@ -7758,16 +6895,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", @@ -7816,16 +6943,6 @@ "dev": true, "license": "MIT" }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vite": { "version": "6.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", @@ -8024,9 +7141,9 @@ } }, "node_modules/webpack": { - "version": "5.99.8", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", - "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", + "version": "5.99.9", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", + "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", "dev": true, "license": "MIT", "dependencies": { @@ -8276,26 +7393,6 @@ "engines": { "node": ">= 10" } - }, - "node_modules/zod": { - "version": "3.24.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", - "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.5", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", - "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } } } } diff --git a/client/simple/package.json b/client/simple/package.json index 94ca1e189..55f7f8e4a 100644 --- a/client/simple/package.json +++ b/client/simple/package.json @@ -9,11 +9,11 @@ "icons.html": "node theme_icons.js" }, "devDependencies": { - "@eslint/js": "^9.26.0", + "@eslint/js": "^9.27.0", "copy-webpack-plugin": "^13.0.0", "css-loader": "^7.1.2", "edge.js": "^6.2.1", - "eslint": "^9.26.0", + "eslint": "^9.27.0", "filemanager-webpack-plugin": "^8.0.0", "globals": "^16.1.0", "ionicons": "^8.0.8", @@ -21,7 +21,7 @@ "less": "^4.3.0", "less-loader": "^12.3.0", "normalize.css": "^8.0.1", - "sharp": "^0.34.1", + "sharp": "^0.34.2", "style-loader": "^4.0.0", "stylelint": "^16.19.1", "stylelint-config-standard": "^38.0.0", @@ -32,7 +32,7 @@ "vite": "^6.3.5", "vite-plugin-static-copy": "^3.0.0", "vite-plugin-stylelint": "^6.0.0", - "webpack": "^5.99.8", + "webpack": "^5.99.9", "webpack-cli": "^6.0.1" } } From 44471bef35074ee03d9ff44c396c8bbf4574948d Mon Sep 17 00:00:00 2001 From: searxng-bot Date: Fri, 30 May 2025 07:10:07 +0000 Subject: [PATCH 71/74] [l10n] update translations from Weblate 0f55f2438 - 2025-05-29 - sandijs 109f7dcb8 - 2025-05-26 - ngf d2ba9b3d0 - 2025-05-26 - artnay 33c6f23bf - 2025-05-26 - realkendrick_fr --- searx/translations/es/LC_MESSAGES/messages.mo | Bin 21639 -> 21792 bytes searx/translations/es/LC_MESSAGES/messages.po | 17 ++-- searx/translations/fi/LC_MESSAGES/messages.mo | Bin 20666 -> 21219 bytes searx/translations/fi/LC_MESSAGES/messages.po | 37 +++++---- searx/translations/he/LC_MESSAGES/messages.mo | Bin 22822 -> 23444 bytes searx/translations/he/LC_MESSAGES/messages.po | 30 +++---- searx/translations/lv/LC_MESSAGES/messages.mo | Bin 10901 -> 13480 bytes searx/translations/lv/LC_MESSAGES/messages.po | 74 ++++++++++-------- 8 files changed, 85 insertions(+), 73 deletions(-) diff --git a/searx/translations/es/LC_MESSAGES/messages.mo b/searx/translations/es/LC_MESSAGES/messages.mo index f27636668dcb0ecae5d23c22234feb5f65f295cb..bf052ca7a44846aca07bdcd5ff865da50c87cf2a 100644 GIT binary patch delta 5680 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 J-mq~o{{!rsc;Wy6 delta 5529 zcmYM%32;!w8Nl%kBqRh9AY7sm0|bdlK?qT92tq`WA{rDqEl_n-go^P1sm~UtqEL%e z2L};!)Tkg*8Zj0FtvZ$>)QJaBrAp0E8PQP-f)qvi|MPaH48w2ty*4QL&jtc`dMZo!uL z5uSwy&;UZ0bev9T|BKN1#$yZS4_8xg!0Bj*Sy+yD;iI@7+u_JF*#@k}=6EaG?{+M} zg=l7ei>CvPu0sQSCD!*~G4&=)$XduI+`-rtC*fptk2awLz8dR0&=ohv`aX1`CUgtG zLbvXFbcHR+H^tBnU084Q`Kah+h2%en2h}_cnh3nCQ6EuLO=)|khiJn9Iy&T<& z`PBc4E@(HpfG^Pu9YNb4M+3+pjYZhW=!!Ss0NjG^^c`Mb z-NUK{5$k;o8>75EcOFtNjn6f&_MT|oo-{7vkQ@1VEj z2duzB_{e zk4M`rMN_>i{ycBNl4WOudeNaCV|wau74|8?^sXG_Z_bWEG2hk^d|TYj|LTXRs9i zfV2(!uo|0{aFy_CVeL}&# z*^1ulchQIspnLi`mg8~E!LqXSLsWse)W>2Ayb5hU4ITJq%*I=hHG~D&3ZFvXZ$QUO z>L@r+Lwv9u9k3DYxEH76DKxO@oE*= zG28oJM4=TAO3(o+(2NX=UV;Wzjm>ZhI>7Y!d^XzuCTxy(#Ptx_7=^BUTyzrJaTey|JamA2&;cGq16+ZAm>xshuR}9ckB+|u4Rj|OP$SxJ z@A>546@APD@9n4Po}ENjaBklaeul%*+p!iKGq`@}0E@XA{74TEp!d2K@4y}C8K~@^ zUgNRop}ZAc=x@-4{;ogy_r)q6IN(O~_khjlR_wwV_z~J}P(?bycyuLiMR#F)>hGh! zCmcjGbP`8l)&=SNOVJ<8)6s=4N+^_4cozBHAT*+1ysyxJ$}UV(-VY~IABL5<0@>d1 zKAQSw1JVgQpn(^nAF5J3y`|WT`XnsC1pR;|D<~NGPBh~E(Szs;zeXcIhQqKUy=t)< zo%jSgaO*+o;jBOdABb-0aCE{c=-Id>x)6JM|L>>Jh8G)f2yR99^uKr!cH%4Jr*|?s z@Mi3Qui@##gbutnzCVCw@(>nd4ucwKZ*+kp(C1^YqxXLf1rNoq(FvBu`on1IR-vhU z7QF@A(Tweh?+?ZLQFNk~?4K(>3vJg2&%le&0H&hz%*Gt=|Bdm*d~~9P=*m}PN8FEI zpQF(e=!#EaXKc;BxaY-ay&Mg6EP4wjqk+uEwsj@oqHG2DJTq$hi#vMguAwksjg->=H}l*cC;1R zu?>3odPe)=ZPbS#eZxldQ+ycR(;v}{wHck>jzTo>erT!(qwPkb<6eoKFqs}7)Sw*_ z?21c}8yKELuiK|+V8_q_T37KqJ$6P{JOq7yIofXuo{Nv5fxd>e+m5!|hs=|N&nR5Q zgRG0wUo57gkuFD5{1m#f7tjG-LB6WtZRFb%PGNr>I40eSIcU2(uoxf2Y}|+*zIyci zLG0xH|DJ+}r{Iz_Ro&2f3A*wD*bT>F4$eioggeod{W(70iJpZI&^BsY3ftLnoLOorg}m2>n@bA3Dxz$>Hpe=2;(GMZy^a1H zKZ@63{>1cs&BVIWj$5vcQt)}*mj$S2T2{mFrGd>bCXUn_IVUXw@121FphXKmY&$ diff --git a/searx/translations/es/LC_MESSAGES/messages.po b/searx/translations/es/LC_MESSAGES/messages.po index f7e8954a4..1883ae4d4 100644 --- a/searx/translations/es/LC_MESSAGES/messages.po +++ b/searx/translations/es/LC_MESSAGES/messages.po @@ -44,20 +44,22 @@ # curtwheeler , 2025. # return42 , 2025. # Atul_Eterno , 2025. +# realkendrick_fr , 2025. msgid "" msgstr "" -"Project-Id-Version: searx\n" +"Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2025-05-13 19:13+0000\n" -"PO-Revision-Date: 2025-04-24 14:06+0000\n" -"Last-Translator: Atul_Eterno \n" +"PO-Revision-Date: 2025-05-27 03:58+0000\n" +"Last-Translator: realkendrick_fr \n" +"Language-Team: Spanish \n" "Language: es\n" -"Language-Team: Spanish " -"\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.11.4\n" "Generated-By: Babel 2.17.0\n" #. CONSTANT_NAMES['NO_SUBGROUPING'] @@ -557,7 +559,7 @@ msgstr "Lista negra de Ahmia" #: searx/plugins/ahmia_filter.py:33 msgid "Filter out onion results that appear in Ahmia's blacklist." -msgstr "" +msgstr "Filtrar resultados de onion que aparezcan en la lista negra de Ahmia." #: searx/plugins/calculator.py:38 msgid "Basic Calculator" @@ -2132,4 +2134,3 @@ msgstr "ocultar video" #~ msgid "proxied" #~ msgstr "por un proxy" - diff --git a/searx/translations/fi/LC_MESSAGES/messages.mo b/searx/translations/fi/LC_MESSAGES/messages.mo index 5ec82f6cf9f1e7d9f843add0c9a80284ec2beeb5..651bb25d13b1b60b69561a5d448be8c3d51672c7 100644 GIT binary patch delta 6123 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 delta 5607 zcmYM%dr;O@9>?(?a#6V|N{A>vf*=>UlcFF};sw#fRl==RdrWqRP;dcV+0@4|9gDJI zL`-v6vuJeG8Eu|&4Vl$M_K(=r*%GsHkwsh;Z$&gNHdg!o@H@NfG``L`zjOJ1&pE%} zW8EKmG#&DAT@UtZu=q3I!?MQUMqkzb|K}egEz6r~2advS48bR+J($XP>Z4Horr}`B zHO@sJ>V@cs#psVO<1EW^S!*c-&~OTu;05%;u&3++5yp7b#FO!9%)wz;jSR82V+8I; zCDMcn>?=&g$EfiMp|&o_GW`@HhtJN2ts%;6R|p zE>wUIOg&(tV-iBHj>0M4Tp{t~s&b=1In#_utZ`j4oL z{5fa^7=_xQcvSynRA8Ctz+B8mCu-aQRR2%Lu>UGF(V#%iqB3Yh1=58h@VjBKNA;^T{tjnT--ueL1%vRC%XH{OWqcE-U@z*dxV-0cz_v zq86@2{#|XwIi;D zMLsOj-jOiWQ8-XLlZ0AmGHQWYro9j~ekm%^Qd6(PK-RYoQBY(jkyqDhLS=dx6~HY_ z#_v!IL`K;Qq@n`IM%|rxsLNW6^RNsj;VD!=-KZUYh&s|fbm_ql6cW*Ug8iDLV+QrL zs0BVm9f2DaU<+!34kRY)CMv_hoC7}#)+p5TL}Lajku20ab5J``9L@f#<7OJNal7ew z9<`+xQO~a+-zKXAwNw4bC%_uSEIN`1^umd#g(jf_%fuRd5xue9JimtV)NjYI|CFuZ ziI%k(r{asa6FF|H2Q$$xmK%Zh=bf+N9>Xfx{UUqihWr!f!vP?s!|8>KUzg}PiX@R#n$4)n(cRABF;0yv7w z)QwvBw5gv(`njwN6qM0lO@}W`{cBV2G~Pl@_yC9EBaB7eTrCiX{+NWCFAEjOGw6r; zsPRSUi^~V({7We)vT7WJuc9W{Y}&V>CU_G)@g4JgKL$`ggbLsUYMzfx{S0cJbEt*? zf&q95)vp7+_5Rrw_ycNUefU-PMrGuO`tprHO_YGjJPkF^3{<}Y)FoVu z3Sbo~^EJi|=+eN~CpQ8G=p?2yjYJqF0K<}dh>P3y~M#dKs5s08LDbN(+;SV4nci*xw72fzQQ2@a&%9UD;}o@Uf*bOpJ$)?HM;5MCW+ z7LGv}gGyjB>bD{X`9ZacF(23Aa6GGje=Vf&cN(-sF7veP#I50UB=m{ohUHvMX3JEaU^cRVAi)9C@8Zdr~p1j zWq1LV`IqRxe;PgbEb7ulqIMt_l|Zs_3Widjfmv8=>h-9=ju}s4klz1KDCn}aqB6UJ zim(ec(IZr5fy_1vLs5aIpcc->88{cU!0X1HSV(;rj>B%$I-dO0D)5o$(gfiY3NQ+_ zKm}?`U&kaoh{1RfwWVDchxc&c^_yZ*3T#8C)?R54(fIyF#^>u0(Ci~QGsV*2|JNyKp~zYG5hNP3P?seiHPK6`Ojo1&zkyn4w|TxF$5KCxwb+W@SUB4b z?0HO~{xU}6ZY*MbtBJxU95%=PnS2{Fs2{~&VJB+g?78+g`(Q4yw&GYrBo!V^bb*O;%qULdZK*5v32~HS|sK^Z$y8NY(cYy;}cwgvTLvIn(Ohf#qX zMJ@apYUlojn&&bqp$=5PE=hC^OchF@^w}2anr{I%&cl@tf(rjs&*z> zOIjM&v@|+amkzW!9o5dtGCgrla#XKdT~bn3;aFQ!Q(oP2%CThOFB~NsN~;~^6{||> icg>6OsVZ?)luvS>n>Wg1=>Mjuzg4i;eQ, 2025. # Ricky-Tigg , 2025. # return42 , 2025. +# artnay , 2025. msgid "" msgstr "" -"Project-Id-Version: searx\n" +"Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2025-05-13 19:13+0000\n" -"PO-Revision-Date: 2025-03-31 18:08+0000\n" -"Last-Translator: return42 \n" +"PO-Revision-Date: 2025-05-27 03:58+0000\n" +"Last-Translator: artnay \n" +"Language-Team: Finnish \n" "Language: fi\n" -"Language-Team: Finnish " -"\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.11.4\n" "Generated-By: Babel 2.17.0\n" #. CONSTANT_NAMES['NO_SUBGROUPING'] @@ -526,15 +528,15 @@ msgstr "Tiedoston laatu" #: searx/plugins/ahmia_filter.py:32 msgid "Ahmia blacklist" -msgstr "" +msgstr "Ahmia-estolista" #: searx/plugins/ahmia_filter.py:33 msgid "Filter out onion results that appear in Ahmia's blacklist." -msgstr "" +msgstr "Suodata pois Ahmian estolistalla olevat onion-tulokset." #: searx/plugins/calculator.py:38 msgid "Basic Calculator" -msgstr "" +msgstr "Peruslaskin" #: searx/plugins/calculator.py:39 msgid "Calculate mathematical expressions via the search bar" @@ -554,7 +556,7 @@ msgstr "hash-digest" #: searx/plugins/hostnames.py:123 msgid "Hostnames plugin" -msgstr "Isäntänimien laajennus" +msgstr "Isäntänimien liitännäinen" #: searx/plugins/hostnames.py:124 msgid "Rewrite hostnames, remove results or prioritize them based on the hostname" @@ -596,16 +598,16 @@ msgstr "Selaimesi tunnistetiedot: " #: searx/plugins/tor_check.py:42 msgid "Tor check plugin" -msgstr "Tor-verkon tarkistus lisäosa" +msgstr "Tor-verkon tarkistusliitännäinen" #: searx/plugins/tor_check.py:44 msgid "" "This plugin checks if the address of the request is a Tor exit-node, and " "informs the user if it is; like check.torproject.org, but from SearXNG." msgstr "" -"Tämä lisäosa tarkistaa, tuleeko pyyntö TOR exit nodesta, ja ilmoittaa " -"käyttäjälle, jos se on, samalla tavalla kuin check.torproject.org, mutta " -"SearXNGista." +"Tämä liitännäinen tarkistaa, tuleeko pyyntö TOR-poistumissolmusta, ja " +"ilmoittaa käyttäjälle, jos niin on; samalla tavalla kuin " +"check.torproject.org, mutta SearXNGista." #: searx/plugins/tor_check.py:65 msgid "Could not download the list of Tor exit-nodes from" @@ -629,7 +631,7 @@ msgstr "Poista seurantapalvelinten argumentit palautetusta osoitteesta" #: searx/plugins/unit_converter.py:49 msgid "Unit converter plugin" -msgstr "" +msgstr "Yksikkömuuntajan liitännäinen" #: searx/plugins/unit_converter.py:50 msgid "Convert between units" @@ -1119,7 +1121,7 @@ msgstr "Tämä on luettelo SearXNG:n pikavastausmoduuleista." #: searx/templates/simple/preferences/answerers.html:29 msgid "This is the list of plugins." -msgstr "Tämä on lista lisäosista." +msgstr "Tämä on lista liitännäisistä." #: searx/templates/simple/preferences/autocomplete.html:2 msgid "Autocomplete" @@ -1179,6 +1181,8 @@ msgid "" "A URL containing your preferences. This URL can be used to restore your " "settings on a different device." msgstr "" +"Asetuksesi sisältävä URL-osoite. Tätä URL-osoitetta voi käyttää asetusten " +"palauttamiseen eri laitteella." #: searx/templates/simple/preferences/cookies.html:46 msgid "Copy preferences hash" @@ -2086,4 +2090,3 @@ msgstr "piilota video" #~ msgid "proxied" #~ msgstr "välityspalvelimella" - diff --git a/searx/translations/he/LC_MESSAGES/messages.mo b/searx/translations/he/LC_MESSAGES/messages.mo index 83e05011fdf47b593aed542cbc48c6c0d4e8ff96..c5e8058d3a8cdc9e92eddfd849196a63f3b92356 100644 GIT binary patch delta 6121 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 delta 5538 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 cJ+BrQ`}jX!R`tAV)|}bpRn?wrr8~X<4, 2025. # shoko , 2025. # RoyBarina , 2025. +# ngf , 2025. msgid "" msgstr "" -"Project-Id-Version: searx\n" +"Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2025-05-13 19:13+0000\n" -"PO-Revision-Date: 2025-01-30 05:21+0000\n" -"Last-Translator: RoyBarina " -"\n" +"PO-Revision-Date: 2025-05-27 03:58+0000\n" +"Last-Translator: ngf \n" +"Language-Team: Hebrew \n" "Language: he\n" -"Language-Team: Hebrew " -"\n" -"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 " -"&& n % 10 == 0) ? 2 : 3));\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " +"n % 10 == 0) ? 2 : 3));\n" +"X-Generator: Weblate 5.11.4\n" "Generated-By: Babel 2.17.0\n" #. CONSTANT_NAMES['NO_SUBGROUPING'] @@ -532,15 +533,15 @@ msgstr "איכות קובץ" #: searx/plugins/ahmia_filter.py:32 msgid "Ahmia blacklist" -msgstr "" +msgstr "הרשימה השחורה של Ahmia" #: searx/plugins/ahmia_filter.py:33 msgid "Filter out onion results that appear in Ahmia's blacklist." -msgstr "" +msgstr "מסנן תוצאות onion שמופיעות ברשימת השחורה של Ahmia." #: searx/plugins/calculator.py:38 msgid "Basic Calculator" -msgstr "" +msgstr "מחשבון בסיסי" #: searx/plugins/calculator.py:39 msgid "Calculate mathematical expressions via the search bar" @@ -556,7 +557,7 @@ msgstr "ממיר מחרוזות לתוך hash digests (לקט גיבוב) שונ #: searx/plugins/hash_plugin.py:62 msgid "hash digest" -msgstr "hash digest" +msgstr "דגימת האש" #: searx/plugins/hostnames.py:123 msgid "Hostnames plugin" @@ -632,7 +633,7 @@ msgstr "הסר ארגומנטי איתור מתוך URL מוחזר" #: searx/plugins/unit_converter.py:49 msgid "Unit converter plugin" -msgstr "" +msgstr "תוסף המרה של יחידות" #: searx/plugins/unit_converter.py:50 msgid "Convert between units" @@ -1177,6 +1178,8 @@ msgid "" "A URL containing your preferences. This URL can be used to restore your " "settings on a different device." msgstr "" +"כתובת URL המכילה את ההעדפות שלך. ניתן להשתמש בכתובת URL זו כדי לשחזר את " +"ההגדרות שלך במכשיר אחר." #: searx/templates/simple/preferences/cookies.html:46 msgid "Copy preferences hash" @@ -2058,4 +2061,3 @@ msgstr "הסתר וידאו" #~ msgid "proxied" #~ msgstr "פרוקסי" - diff --git a/searx/translations/lv/LC_MESSAGES/messages.mo b/searx/translations/lv/LC_MESSAGES/messages.mo index 71f90342ef5f67bb019166a5055b9c308b052c81..4cbb498fb11e5b52eaf92908e361403f9e1a7c59 100644 GIT binary patch delta 5860 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 delta 3267 zcmYM$c~I6x9LMo}6a^174iN?M@cBbQ4`K}?F&$MVlk3!v)nyj=iG?pw10$JP#ou> zBT3;`YwU^1I4X+#>ul!IK=#bbsGTfDt#l1)f{mz!>_+uF;OaG)LcPwl-$nKJaL~$F zOYDN3P#YM9%IH|^iUrZ+UjtUspp|YwWn?$9coTH>&ru7jbM*_@m--dgp1^EcU@B^S z7PiG6_$afe@%h*hr{a8E7NDS1hQ)?DG)3(w4)qrF!=5-9^?JUC+QC880#6_z%voeD z<|gLg15^exxJX)1cU0#3pynHaiW3+`A(cWtDn(V;9haaoa}0U&Or3jv5f$)zSHFSU z`Om1pcii*)s0BPkWgwhaK=Gqc@#2vF0n>?s0;Hi*=1s^98I&pH216g2U6RKOr=qQlN(s0G%bZf_kb@O9Kq zenB0@ebmAu=%n@-RLZ@m_*tkpeNgcSW0cgky^mJs7!3cNALf33THnbPj9ymrp zXH|n**;Q2FTX+P2MJ;3}pGKPC5T@fP?1uHIqe&$_nlJ+ur!OkSPoh4cMxu^-imSgE zdLA%~C_KS~<*1$4qK@D?Dz$ep8zVb~0zQG7Xc($}JSy-q)I@7gN3auh_6JcrtwU|> zENX$5a02(wT%(|s_TxYmXeg>a8g(QSU41Sp6AO_wnH9Je_n{^jmK=IM61l%79|>*d zp*FYymFdfl=?PE?>a@H(oW#XuN^^%Ruy4^e@uokvg$IEmr-C2HU|s1$#PjqoQ_oZG03 z)uSeg^o7Q?#Rk+nqQ)nq=Ii1k{|eB@bsXp(40j#Jx%SDZ38rEMmZ0AIIjDfkPh)-z7P@3@QO`3l0tcW54o77s4|S#! zQ9GQ6inG8ye+#vc^{9nz!X~&Kbw~F5C_GN#4D#7x8mDt{Fc}qS5t@Nh%I4VFkymYD zi&*<{i<7phWmfQJ%N&m_i%PRwqbAti(Hm@ibVaZ-CeLHPik)WXxANQHT5SpLj=STr znQa2Lrp*%DHX+gWPl#_`R8m}6Zi-5#7tO4&vl8C0eB~XgZy2ydwBi1 zy>q)|Wb@VZ>B5T2u4BpzODjqWE6d7zd&`R}=aiRr&++#CuQXszMR9pWW@%Y@@vM^h znf6LjTySqvfhU;aP4d`r9opGohbwkZ$7h26P9r_GNpfF1K6!?XOgU!%N!cF!EcKSh z?oC^1tI`MCt{KOJ;a$2kuxB&(+AUc}ZI0h(i~Xr~wLjMG^KZ42a?, 2024. # Anonymous , 2025. # Obligate , 2025. +# sandijs , 2025. msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2025-05-13 19:13+0000\n" -"PO-Revision-Date: 2025-01-06 15:53+0000\n" -"Last-Translator: return42 " -"\n" +"PO-Revision-Date: 2025-05-30 07:10+0000\n" +"Last-Translator: sandijs \n" +"Language-Team: Latvian \n" "Language: lv\n" -"Language-Team: Latvian " -"\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100" -" <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " +"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"X-Generator: Weblate 5.11.4\n" "Generated-By: Babel 2.17.0\n" #. CONSTANT_NAMES['NO_SUBGROUPING'] @@ -166,7 +167,7 @@ msgstr "tumšs" #. STYLE_NAMES['BLACK'] #: searx/searxng.msg msgid "black" -msgstr "" +msgstr "melns" #. BRAND_CUSTOM_LINKS['UPTIME'] #: searx/searxng.msg @@ -293,7 +294,7 @@ msgstr "abonenti" #. SOCIAL_MEDIA_TERMS['POSTS'] #: searx/engines/lemmy.py:86 searx/searxng.msg msgid "posts" -msgstr "" +msgstr "ziņojumi" #. SOCIAL_MEDIA_TERMS['ACTIVE USERS'] #: searx/engines/lemmy.py:87 searx/searxng.msg @@ -334,17 +335,17 @@ msgstr "autors" #. SOCIAL_MEDIA_TERMS['THREAD OPEN'] #: searx/engines/discourse.py:149 searx/searxng.msg msgid "open" -msgstr "" +msgstr "atvērts" #. SOCIAL_MEDIA_TERMS['THREAD CLOSED'] #: searx/engines/discourse.py:149 searx/searxng.msg msgid "closed" -msgstr "" +msgstr "aizvērts" #. SOCIAL_MEDIA_TERMS['THREAD ANSWERED'] #: searx/engines/discourse.py:160 searx/searxng.msg msgid "answered" -msgstr "" +msgstr "atbildēja" #: searx/webapp.py:291 msgid "No item found" @@ -448,7 +449,7 @@ msgstr "" #: searx/engines/openstreetmap.py:158 msgid "Show route in map .." -msgstr "" +msgstr "Rādīt maršrutu kartē .." #: searx/engines/pdbe.py:96 #, python-brace-format @@ -521,23 +522,23 @@ msgstr "Failu kvalitāte" #: searx/plugins/ahmia_filter.py:32 msgid "Ahmia blacklist" -msgstr "" +msgstr "Ahmia melnais saraksts" #: searx/plugins/ahmia_filter.py:33 msgid "Filter out onion results that appear in Ahmia's blacklist." -msgstr "" +msgstr "Izfiltrēt \"sīpolu\" rezultātus, kas parādās Ahmia melnajā sarakstā." #: searx/plugins/calculator.py:38 msgid "Basic Calculator" -msgstr "" +msgstr "Parasts kalkulators" #: searx/plugins/calculator.py:39 msgid "Calculate mathematical expressions via the search bar" -msgstr "" +msgstr "Izrēķināt matemātiskas izteiksmes, izmantojot meklētāju" #: searx/plugins/hash_plugin.py:34 msgid "Hash plugin" -msgstr "" +msgstr "Jaucējvērtības spraudnis" #: searx/plugins/hash_plugin.py:35 msgid "Converts strings to different hash digests." @@ -549,11 +550,13 @@ msgstr "jaucējkoda sašķelšana" #: searx/plugins/hostnames.py:123 msgid "Hostnames plugin" -msgstr "" +msgstr "Saimniekvārdu spraudnis" #: searx/plugins/hostnames.py:124 msgid "Rewrite hostnames, remove results or prioritize them based on the hostname" msgstr "" +"Pārrakstīt saimniekvārdus, noņemt rezultātus vai prioritizēt tos, " +"pamatojoties uz saimniekvārdu" #: searx/plugins/oa_doi_rewrite.py:55 msgid "Open Access DOI rewrite" @@ -576,14 +579,16 @@ msgid "" "Displays your IP if the query is \"ip\" and your user agent if the query " "is \"user-agent\"." msgstr "" +"Tiek izvadīta Jūsu IP, ja pieprasījumā norādīts “ip”, un Jūsu " +"lietotājaģents, ja pieprasījumā norādīts “user-agent”." #: searx/plugins/self_info.py:52 msgid "Your IP is: " -msgstr "" +msgstr "Jūsu IP ir: " #: searx/plugins/self_info.py:55 msgid "Your user-agent is: " -msgstr "" +msgstr "Jūsu lietotājaģents ir: " #: searx/plugins/tor_check.py:42 msgid "Tor check plugin" @@ -594,18 +599,20 @@ msgid "" "This plugin checks if the address of the request is a Tor exit-node, and " "informs the user if it is; like check.torproject.org, but from SearXNG." msgstr "" +"Šis spraudnis pārbauda vai pieprasītā adrese ir Tor izejas mezgls un informē " +"lietotāju, ja tas tā ir; piemēram, check.torproject.org, bet no SearXNG." #: searx/plugins/tor_check.py:65 msgid "Could not download the list of Tor exit-nodes from" -msgstr "" +msgstr "Nevarēja lejupielādēt Tor izejas mezglu sarakstu no" #: searx/plugins/tor_check.py:72 msgid "You are using Tor and it looks like you have the external IP address" -msgstr "" +msgstr "Jūs lietojat Tor un izskatās, ka Jums ir ārējā IP adrese" #: searx/plugins/tor_check.py:76 msgid "You are not using Tor and you have the external IP address" -msgstr "" +msgstr "Jūs nelietojat Tor un Jums ir ārējā IP adrese" #: searx/plugins/tracker_url_remover.py:37 msgid "Tracker URL remover" @@ -613,15 +620,15 @@ msgstr "Izsekošanas URL noņemšanas līdzeklis" #: searx/plugins/tracker_url_remover.py:38 msgid "Remove trackers arguments from the returned URL" -msgstr "" +msgstr "Noņemt izsekotāju argumentus no atgrieztā URL" #: searx/plugins/unit_converter.py:49 msgid "Unit converter plugin" -msgstr "" +msgstr "Vienību pārveidotāja spraudnis" #: searx/plugins/unit_converter.py:50 msgid "Convert between units" -msgstr "" +msgstr "Konvertēt starp vienībām" #: searx/templates/simple/404.html:4 msgid "Page not found" @@ -634,7 +641,7 @@ msgstr "Doties uz %(search_page)s." #: searx/templates/simple/404.html:6 msgid "search page" -msgstr "" +msgstr "meklēšanas lapa" #: searx/templates/simple/base.html:53 msgid "Donate" @@ -647,11 +654,11 @@ msgstr "Opcijas" #: searx/templates/simple/base.html:67 msgid "Powered by" -msgstr "" +msgstr "Darbojas ar" #: searx/templates/simple/base.html:67 msgid "a privacy-respecting, open metasearch engine" -msgstr "" +msgstr "privātumu respektējoša, atvērta meta-meklētājprogramma" #: searx/templates/simple/base.html:68 #: searx/templates/simple/result_templates/packages.html:59 @@ -660,15 +667,15 @@ msgstr "Pirmkods" #: searx/templates/simple/base.html:69 msgid "Issue tracker" -msgstr "" +msgstr "Problēmu izsekotājs" #: searx/templates/simple/base.html:70 searx/templates/simple/stats.html:18 msgid "Engine stats" -msgstr "" +msgstr "Dzinēja statistika" #: searx/templates/simple/base.html:72 msgid "Public instances" -msgstr "" +msgstr "Publiskās instances" #: searx/templates/simple/base.html:75 msgid "Privacy policy" @@ -1784,4 +1791,3 @@ msgstr "slēpt video" #~ msgid "proxied" #~ msgstr "" - From b991688fcb2a3b04bf3a97518809884eb1db8e92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 07:09:34 +0000 Subject: [PATCH 72/74] [upd] web-client (simple): Bump the minor group Bumps the minor group in /client/simple with 2 updates: [globals](https://github.com/sindresorhus/globals) and [stylelint](https://github.com/stylelint/stylelint). Updates `globals` from 16.1.0 to 16.2.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v16.1.0...v16.2.0) Updates `stylelint` from 16.19.1 to 16.20.0 - [Release notes](https://github.com/stylelint/stylelint/releases) - [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md) - [Commits](https://github.com/stylelint/stylelint/compare/16.19.1...16.20.0) --- updated-dependencies: - dependency-name: globals dependency-version: 16.2.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor - dependency-name: stylelint dependency-version: 16.20.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor ... Signed-off-by: dependabot[bot] --- client/simple/package-lock.json | 68 ++++++++++++++++----------------- client/simple/package.json | 4 +- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/client/simple/package-lock.json b/client/simple/package-lock.json index f05ee9e21..f0e8e8306 100644 --- a/client/simple/package-lock.json +++ b/client/simple/package-lock.json @@ -14,7 +14,7 @@ "edge.js": "^6.2.1", "eslint": "^9.27.0", "filemanager-webpack-plugin": "^8.0.0", - "globals": "^16.1.0", + "globals": "^16.2.0", "ionicons": "^8.0.8", "leaflet": "^1.9.4", "less": "^4.3.0", @@ -22,7 +22,7 @@ "normalize.css": "^8.0.1", "sharp": "^0.34.2", "style-loader": "^4.0.0", - "stylelint": "^16.19.1", + "stylelint": "^16.20.0", "stylelint-config-standard": "^38.0.0", "stylelint-config-standard-less": "^3.0.1", "stylelint-prettier": "^5.0.3", @@ -2657,14 +2657,14 @@ } }, "node_modules/cacheable": { - "version": "1.8.10", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.10.tgz", - "integrity": "sha512-0ZnbicB/N2R6uziva8l6O6BieBklArWyiGx4GkwAhLKhSHyQtRfM9T1nx7HHuHDKkYB/efJQhz3QJ6x/YqoZzA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.9.0.tgz", + "integrity": "sha512-8D5htMCxPDUULux9gFzv30f04Xo3wCnik0oOxKoRTPIBoqA7HtOcJ87uBhQTs3jCfZZTrUBGsYIZOgE0ZRgMAg==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.8.1", - "keyv": "^5.3.2" + "hookified": "^1.8.2", + "keyv": "^5.3.3" } }, "node_modules/cacheable/node_modules/keyv": { @@ -3176,9 +3176,9 @@ "license": "CC0-1.0" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4108,9 +4108,9 @@ } }, "node_modules/globals": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", - "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", "engines": { @@ -4168,9 +4168,9 @@ } }, "node_modules/hookified": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.8.2.tgz", - "integrity": "sha512-5nZbBNP44sFCDjSoB//0N7m508APCgbQ4mGGo1KJGBYyCKNHfry1Pvd0JVHZIxjdnqn8nFRBAN/eFB6Rk/4w5w==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.0.tgz", + "integrity": "sha512-2yEEGqphImtKIe1NXWEhu6yD3hlFR4Mxk4Mtp3XEyScpSt4pQ4ymmXA1zzxZpj99QkFK+nN0nzjeb2+RUi/6CQ==", "dev": true, "license": "MIT" }, @@ -6235,9 +6235,9 @@ } }, "node_modules/stylelint": { - "version": "16.19.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.19.1.tgz", - "integrity": "sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw==", + "version": "16.20.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.20.0.tgz", + "integrity": "sha512-B5Myu9WRxrgKuLs3YyUXLP2H0mrbejwNxPmyADlACWwFsrL8Bmor/nTSh4OMae5sHjOz6gkSeccQH34gM4/nAw==", "dev": true, "funding": [ { @@ -6261,15 +6261,15 @@ "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", - "debug": "^4.3.7", + "debug": "^4.4.1", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.0.8", + "file-entry-cache": "^10.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^7.0.3", + "ignore": "^7.0.4", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", "known-css-properties": "^0.36.0", @@ -6489,25 +6489,25 @@ "license": "MIT" }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.8.tgz", - "integrity": "sha512-FGXHpfmI4XyzbLd3HQ8cbUcsFGohJpZtmQRHr8z8FxxtCe2PcpgIlVLwIgunqjvRmXypBETvwhV4ptJizA+Y1Q==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.0.tgz", + "integrity": "sha512-Et/ex6smi3wOOB+n5mek+Grf7P2AxZR5ueqRUvAAn4qkyatXi3cUC1cuQXVkX0VlzBVsN4BkWJFmY/fYiRTdww==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.8" + "flat-cache": "^6.1.9" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.8.tgz", - "integrity": "sha512-R6MaD3nrJAtO7C3QOuS79ficm2pEAy++TgEUD8ii1LVlbcgZ9DtASLkt9B+RZSFCzm7QHDMlXPsqqB6W2Pfr1Q==", + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.9.tgz", + "integrity": "sha512-DUqiKkTlAfhtl7g78IuwqYM+YqvT+as0mY+EVk6mfimy19U79pJCzDZQsnqk3Ou/T6hFXWLGbwbADzD/c8Tydg==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.8.9", + "cacheable": "^1.9.0", "flatted": "^3.3.3", - "hookified": "^1.8.1" + "hookified": "^1.8.2" } }, "node_modules/stylelint/node_modules/globby": { @@ -6542,9 +6542,9 @@ } }, "node_modules/stylelint/node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", "dev": true, "license": "MIT", "engines": { diff --git a/client/simple/package.json b/client/simple/package.json index 55f7f8e4a..7fc4d3c79 100644 --- a/client/simple/package.json +++ b/client/simple/package.json @@ -15,7 +15,7 @@ "edge.js": "^6.2.1", "eslint": "^9.27.0", "filemanager-webpack-plugin": "^8.0.0", - "globals": "^16.1.0", + "globals": "^16.2.0", "ionicons": "^8.0.8", "leaflet": "^1.9.4", "less": "^4.3.0", @@ -23,7 +23,7 @@ "normalize.css": "^8.0.1", "sharp": "^0.34.2", "style-loader": "^4.0.0", - "stylelint": "^16.19.1", + "stylelint": "^16.20.0", "stylelint-config-standard": "^38.0.0", "stylelint-config-standard-less": "^3.0.1", "stylelint-prettier": "^5.0.3", From 1b424b8d541d3cde1d40aa52b59cbcc38259ce3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 07:16:18 +0000 Subject: [PATCH 73/74] [upd] pypi: Bump the minor group with 2 updates Bumps the minor group with 2 updates: [selenium](https://github.com/SeleniumHQ/Selenium) and [typer-slim](https://github.com/fastapi/typer). Updates `selenium` from 4.32.0 to 4.33.0 - [Release notes](https://github.com/SeleniumHQ/Selenium/releases) - [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.32.0...selenium-4.33.0) Updates `typer-slim` from 0.15.4 to 0.16.0 - [Release notes](https://github.com/fastapi/typer/releases) - [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md) - [Commits](https://github.com/fastapi/typer/compare/0.15.4...0.16.0) --- updated-dependencies: - dependency-name: selenium dependency-version: 4.33.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor - dependency-name: typer-slim dependency-version: 0.16.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 63c5fe842..418824b03 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,7 +4,7 @@ cov-core==1.15.0 black==24.3.0 pylint==3.3.7 splinter==0.21.0 -selenium==4.32.0 +selenium==4.33.0 Pallets-Sphinx-Themes==2.3.0 Sphinx==7.4.7 sphinx-issues==5.0.1 diff --git a/requirements.txt b/requirements.txt index b4006c48e..b27f44e52 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,5 +17,5 @@ markdown-it-py==3.0.0 fasttext-predict==0.9.2.4 tomli==2.2.1; python_version < '3.11' msgspec==0.19.0 -typer-slim==0.15.4 +typer-slim==0.16.0 isodate==0.7.2 From 37d851fb23935166ac7714a83c7273ce712bece0 Mon Sep 17 00:00:00 2001 From: benpiano800 <51756721+benpiano800@users.noreply.github.com> Date: Thu, 29 May 2025 14:59:06 -0500 Subject: [PATCH 74/74] [mod] UI footer: correct capitalization of "SearXNG" in base.html --- searx/templates/simple/base.html | 2 +- tests/robot/test_webapp.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/searx/templates/simple/base.html b/searx/templates/simple/base.html index 2eebde676..deac295b7 100644 --- a/searx/templates/simple/base.html +++ b/searx/templates/simple/base.html @@ -64,7 +64,7 @@