pax_global_header00006660000000000000000000000064146635761030014525gustar00rootroot0000000000000052 comment=b7743f5039822c27a3e192d365c2bca7e8eeab40 sphinx-data-viewer-0.1.5/000077500000000000000000000000001466357610300152475ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/.github/000077500000000000000000000000001466357610300166075ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/.github/dependabot.yml000066400000000000000000000011261466357610300214370ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: github-actions directory: / commit-message: prefix: 🔧 schedule: interval: monthly - package-ecosystem: pip directory: / commit-message: prefix: ⬆️ schedule: interval: monthly sphinx-data-viewer-0.1.5/.github/workflows/000077500000000000000000000000001466357610300206445ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/.github/workflows/ci.yaml000066400000000000000000000050251466357610300221250ustar00rootroot00000000000000name: CI on: push: branches: [main] tags: - "v[0-9]+.[0-9]+.[0-9]+*" pull_request: jobs: lint: name: Lint runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v4 - name: Set up Python 3.8 uses: actions/setup-python@v5 with: python-version: '3.8' - uses: pre-commit/action@v3.0.1 tests: name: "Core py${{ matrix.python-version }} sphinx~=${{ matrix.sphinx-version }} ${{ matrix.os }}" runs-on: ${{ matrix.os }} strategy: fail-fast: false # Set on "false" to get the results of ALL builds matrix: os: ["ubuntu-latest"] # 3.9.8 seems to be broken with type_ast # https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1829077.html python-version: ["3.8", "3.11"] sphinx-version: ["6.0", "7.0"] include: - os: "ubuntu-latest" python-version: "3.12" sphinx-version: "8.0" - os: "windows-latest" python-version: "3.8" sphinx-version: "6.0" steps: - uses: actions/checkout@v4 - name: Set Up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Update pip run: python -m pip install --upgrade pip - name: Install dependencies run: | python -m pip install sphinx~=${{ matrix.sphinx-version }} -e .[test] python -m pip freeze - name: Run pytest run: python -m pytest -v --cov=src --cov-report=xml --cov-report=term-missing tests check: # This job does nothing and is only used for the branch protection # see https://github.com/marketplace/actions/alls-green#why if: always() needs: - lint - tests runs-on: ubuntu-latest steps: - name: Decide whether the needed jobs succeeded or failed uses: re-actors/alls-green@release/v1 with: jobs: ${{ toJSON(needs) }} publish: name: Publish to PyPi needs: - check if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') runs-on: ubuntu-latest steps: - name: Checkout source uses: actions/checkout@v4 - name: Set up Python 3.10 uses: actions/setup-python@v5 with: python-version: "3.10" - name: install flit run: | pip install flit~=3.4 - name: Build and publish run: | flit publish env: FLIT_USERNAME: __token__ FLIT_PASSWORD: ${{ secrets.PYPI }} sphinx-data-viewer-0.1.5/.gitignore000066400000000000000000000003541466357610300172410ustar00rootroot00000000000000.idea .venv .envrc *.pyc *.egg-info *egg-info/ dist build _build .cache/ *pycache* .tox/ .cache/ .pytest_cache .coverage .doctrees docs/github_images/ .eggs/ .ruff_cache .devcontainer/ .vscode/ .dockerignore docs/spelling_wordlist.txt sphinx-data-viewer-0.1.5/.pre-commit-config.yaml000066400000000000000000000002221466357610300215240ustar00rootroot00000000000000repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.6.1 hooks: - id: ruff args: [--fix] - id: ruff-format sphinx-data-viewer-0.1.5/.readthedocs.yml000066400000000000000000000003561466357610300203410ustar00rootroot00000000000000version: 2 build: os: ubuntu-22.04 tools: python: "3.12" sphinx: configuration: docs/conf.py builder: html fail_on_warning: true python: install: - method: pip path: . extra_requirements: - docs sphinx-data-viewer-0.1.5/LICENSE000066400000000000000000000020521466357610300162530ustar00rootroot00000000000000MIT License Copyright (c) 2021 useblocks Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sphinx-data-viewer-0.1.5/README.rst000066400000000000000000000010401466357610300167310ustar00rootroot00000000000000Sphinx-Data-Viewer ================== Adds an interactive data viewer for data objects to Sphinx. Use it to document: * JSON data * JSON files * Python objects **Complete documentation and examples:** https://sphinx-data-viewer.readthedocs.io/en/latest/ .. image:: https://github.com/useblocks/sphinx-data-viewer/raw/main/docs/_static/sphinx-data-viewer-intro.png :width: 70% :target: https://sphinx-data-viewer.readthedocs.io/en/latest/ The Javascript part is based on the wonderful work of https://github.com/pgrabovets/json-view. sphinx-data-viewer-0.1.5/docs/000077500000000000000000000000001466357610300161775ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/docs/Makefile000066400000000000000000000011721466357610300176400ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) sphinx-data-viewer-0.1.5/docs/_static/000077500000000000000000000000001466357610300176255ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/docs/_static/custom.css000066400000000000000000000003311466357610300216460ustar00rootroot00000000000000/* Data viewer */ .json-container .json-key { color: var(--color-foreground-primary); } .json-container .json-size { color: var(--color-foreground-muted); } table.need { background-color: transparent; } sphinx-data-viewer-0.1.5/docs/_static/sphinx-data-viewer-intro.png000066400000000000000000002012621466357610300252060ustar00rootroot00000000000000PNG  IHDR[=sBITO IDATxu\玣Q)Inn1;_}Ui#^poccvfy @ g@I@ D@@ &@ M @ @4) hR@ Ф@ "HZqrr=v>y쥨s\]z& WGMM)i554:MVF*0bH/2Yng}}Թ +"x"%5G IlHIIvv6yKZۼ<`vv'^^r%`,Iӛ̬;M&,,,++#/';P{0S Va;q󎄤O.ӽY7Ҥ@7=y nڰظg/^~=HWL`xNpƦKMۯV3RS?gfZzfRr  o:n訫+$$dia>i8,_ϢsS?%JL{ח`0f&ߧWBJ.k¤oO)o@wI$RAƊ52222o_<^&6mv^"R+VDAwM9yALw޾L&=heijڷoDKt{`CC~PA]$7/5ؑk/tG\Wu޼`CCwbgb@ ":&'45Էz's6btđ<[ZZ؋G@  11KOedJJHh@ G 7f  O0YO){wn373R޺sݞ;:a3fvuŤPRTjl_ &&v`N=j@ lw G{;N{_>+-Baw@"RWܩcÿ-wF 675:c0uxn(^A gcRTUUg|g!##'Q"e0+)-R4Ƹ`۩i]ZRr D2i @~/cRWT`55|R IơФS&vm,,,=qZ^83#GHKc>~^1m ?G0&EG ێ" gdfBy~Ž]_N>0@O{]ZVӧJ7H7#3%Y r::N%'7/+;Bh044 ēyYMM11 6b0eҸoc^re+q]}}jjzeu5SVR"XLfVvN^~B%HRz1/^}T_g9b85  t:ZYUDRQQ66,...̻ JMNN!eed4 ˮ<9%l4OTT뫸rF[kXW9[=WTVIHJgKm으KW&Og͇u]7no} P^^1k WO$%%#+=6ddf~%,,xʵ¢b޽vnyW ԃ[3/Ը{?-Ḿ:9nFfvUU5O)=L NǬaC7]řkݽ/lim}ٻ> D"tԂN:r|?d҄lǻWxZ[nݽG6 HvK*?eݚ'~_RT\2 "-ee8ɴwҳrbS݊ʪ+W"?co$L?sTyn ̚t|2KcP&]j!o>"$T^QNGINI "jijrrrB.,Π:hM F{@=()*0C"jk&֖Va&n ?֒3N:u^ʢbmmhƦа'qq1B&9`r."5~@ nߺSKz_PjƸDII5+n\l'G{[PX`dh.*.tЯo.#;OLMKG5l':ڲy̼ve"7oZcYfeee)icFbU4Q()il&džE*-hՕ)@ "-^3f1;2B=G~Dw$ܪwXUU5;}% 8º$%%MIKϘ9}W))I@jZC_Z'xZΙ_@Б_߿z^'"*zރXnC¦N8iXy99@~ACNJKJv6{wmc˄`ܽ?Kfᏼn޽s}k|=߼upEHhރG]{˟C{~[zZQv6V' `EO ;yu= H FS2CyM u͝s'oM; /G`&@w+XYZp=wԹ9 AIQ4PGQA3mAz#;8Ce ž_uuh͉<pVԾ]9=c6t:##-s'+zybOA=[w޾w/5žq `s>um1f 4HK>%%$ϝvVHHsM4kz1❷/E>n I)C{{{Nn>v\DDzgS1==N :BBٺ+ l7亐/pxDE?wbeM4?޽6_s @ssЦc9U5~JBаȚZU>}=1"chxdbR2@0lH`)(Ԍ <}0[o9u`zP]S7H@6G 756JLJ%7KJ fOgS9T$h$[w#Jmuh[M Gݸ%=B&וwNIO.8$ a2^l޸W "%e/_ o6AwWo0D F@P߀TBRRrܤIA"}w0Nq팙)i+*LMzֆm8wo1{;ԤG&Ephpw팚,/  pv:f,[`@~ݐ /_ߤHIIzZk`2{&EGG?O)ا;oa&xԭ5(N&݁l[Z[/\B">}Sdeѳa?Ğ= ٯoKY 7bջekmuXE߼Fd|3I=z 2XAAb"_@9j|6)BC '(@0:CQjPc# A vK߮ueBGmê**]:/)9`3q%444&%`0lYl1fOoR8^]'c̎]Q{bѕK9^ QQ&>~}uOϣ.6߸+ Q6vEEe^~AUUuZz6#E9yE%50JU\=^`R`s|ӕ55 >Ps8N9_U]}h߮~}Xlii9xD `hd?wZP S'M|gy wӤ[ٻslN3= &뎟:GPƸtc,NA nujED#zz#>~A!aRpzx28@ L//s('X˫3e`Yɳ۷lBg:;Z~me{+c0dee6]͖kqTԴztds g⠐0"Bvjk \#ۯgۀPAXmkOVԃ@ '%:r4F㟾sfWge(.)Ǻp tהIG=7x`1oݹ'WO`vAӏ?[&'+{Qeex{):}\d|S Q3efa@6uO fbee%-{IHL^8{ÿI% I.ץ^Iɜb_9FS`ܘ|SN-)\/liis^3}Ebl88;c7B$xy-^ܹN Ϝa /T!I!"u:4TԾ~3F py"8c/Zxץn\/.)ذ 6>p */Ka& {efe`3O<{=- 'TIIqw:f+II[7apCGO/$$}Z3pݚF]8`0{#t:oݦ"a-أD)-wB0OqK&蕕U---(+HB亄O4M{@?DhNnGh/_pH,)-{9pgf億EMI 'G{C='Q윬윤b""".N BIiYVVNl|?.ࣘtl^~AjZFtl\tLFXXnD**.IMKO YHHaQl3^B5~0SlM}JJvrem5EA()-%G3D513**d'_ʪ=WDqqi1r(;UU! 5Μ7nD ɤ67O4]H¥|16ܿd&y>oo?GePW=rphƵd#"*zsg-OW #>!i#_M}TU FYYEMmmv6V|J}[w7)v#kW/4 GO߸$R)TjqI)ڬrׄ`Wz5 Q0WQV677;.!I1s||s8sԘ:y3oR 56꣥GшDW/%%9aٳs~us͆'qY}%o>xkaa߳_:߼s]I+(12E_P!!)GS@s6>!ABBBEEx~ 3&1&LB\O-pHM˨jhl" l˿[ZZSju ELL`C}.@ 1?ʤ&ů@ HS? V@@ &@ { 4OJ@ Im#A -f|֒S+*߽.Z")!1\_OW_o~F@ Izq> Fھ@ {-L @ :/@ ?hR@ Ф@ "I@ D@@ &@ M @ @4) hR@ Ф@ "I@ D@@ &@ M @ @4) hR@ Ф@ "I@ D.&ť+צϭ`A!aS:mپ{9]6~/#'&:;yV rBk6IeǞȏݸ0+;Lkhh0v6wo\@n0}ʤg飯(#΢ >y N0f߯[*/'s&&ΥR?Qַgxef|T.##g ƕN몲1?O&N3k}^\Yd{j7vrf F/(/mO$ĬGkwm\ZZ=HH($v2/ <${R"Ƭgei!z\]deen{]`]斧/^Y!@ }Sz?d;+55nhr7XhȟP'Z?N۟wI>Z]Iɦ]DLT™"""[I"($dFEvPUEyP #@]Ӄܼ[w cWLTƊD ZZZJJdee~D][w <&)㾞xѭn --egkM$.%"~]EKSd]#?r?_O3]u[߯qԤuuqhaak% //U BLLlq|]G;qMBoD=;8B*))oY,;^7܏#--cޅKW"?Hoٴ~`i-2yz[=׫(slhlAbR+׊KJX=zF o_<Il|t{GUopj)`:|BqqKN0tyݭ,sr9QZV>exUyU\|jkc\6o\&+.)U0Jmp>+A$EF;s w-Q u6bgy=/K4Mwe>\yKxVIQ} OFx'ϩè kWa Yn%;:͘67+  NNX;/_ppZϭ;99'7D!bAAѠA:׊ oؼ}w^~zkr*uώ-U^&]`.g?D@ܼ}̞э\W5٫76lށnxs.t¥+655Wl\;S\R2}&=y&3+})i4ҕ.޾aXd&Ϙڊ&xVJKK "鋖ޱ{?O>LFuܔi棧m\ qpMHz򍍃kYY9unDN/Xr͜e=|5&6;xA"l\}Wށm薓 ȡ'ݚdsNqbiko_| BdC.]AӜ>s qp]nSCcKWe07//FccOCw>:!+;=qKJl\@궠{[yKWʐ0zoѳOīc'8xu^ HIiLuQ߼?8w:n \S4>=nraQ1 ME{AO5559͚ɳd?}YPrJ8QX]{͜)&9gRgoxcm)i|JNu3 ^ }&Ϙj΂S޺s?0ҕk)ڵh1]jYYTG vM¥+nOjnn.)-5o058|씍kccwm ݁NUUW$i @PRT\v%\ҟ|M$Q7aiٰ6|o'()*T eii)ԗg1 #?e%%D228333nb>nAa0ӡ^j_뤥&EM`+K A.N,KHZrfV %5ޖH GOb5r.1)?MNVv˦uV,s;u~6'O'&&v&=s& 6&6>&6~άALznLegJCKWxL`oj9"$%bݖii)Ϋ1"Hѱ_fO}%6.nVtEUU #e4fBy `2x$AԴLəFBB*$,ERR?hܘќɲsO_Eh4ql#?n\fCz&OK:zF=IHBa#&.^UUEQAsu|JNeX!IvOۘ ݈!F)cee1.LuEK.]5~ӊeRRi47HHL24C`o %%iP(W# HI?}GJIIN8:161z]Ҋ~}JKK}vTDm| $$?%r:gOim"Fq\|hgDŽĤ5+=p$>!qpc)y.讣"j}DLYo*ʪ*;6i5,WkV'%5JH1}Z|bp3N ׁ}t#)9EBSkne684\\\\wChyKWGD . Zo_>99.tI2\ 2Ƥ )XyPLT4;' 3ͥ]|kvߣF]H$P(Sdr/5gnPT !1ūrrVhqRRO_JMK߯_^>ْ.NA!ankdu\$%Ο9D"#`,SаȕWVV#͵d2=#KcS7NRRR os'mSS@':rO** F-M^Sx늾GK]/^yfLb&$ Mmm$%%A^^D著΄va|s' LJ>lȼw^] ޠr1q#KKK пBADTD"|:"pϿy杷0{vZ٩FYP\Rqq$ʵ517 O}]=Ų\rdu [!n?h@m`> QiY'\Dn ϕ7 d~y΢eKP6 ƜY3^>}{yOÊܬy\YIoDNV_[vv޼qݠAh'4mM I0M\\WJ!{yEEǎ0^]]y}}Chx:@ek]YU+)))kxPi$%$$;o~r8ia%%NE A_@߀N|Rb}c`XZ?{ܩc&&?KHLB?}(\n;e QЬ?Z뇯.}T SVV_nC ,%$EDX&,GDFFGDYY~w4%EE"~9t&qܩ^W&MStQ#,c⪪5{!aMhGT7 参@贡mo :wE ¢%+<$%cc5@ z OsE"Б~6 mlGIIql#?O/)%. 5L \G;edf?}W#݁%$ð#t I;bHx5z0t#>wicp.%eaݙke9\OKg0 L]\w֭H @JZ:v$3+GIQQGHD;4{֪FF_Wg)+ CN=PYUmZƪ%jO_ PSS3tخry!L">~v`bY}CCU/4:h>̴w/5q<^?{1L@{:mCzztνG!++3thEEeDT4[zr]WQÿIC7m>'O`0;Ұlшx,{uǍqEOuhg)䏝ރh5\RZڊ>Q)))*ZUU`0^y~Juuh_+(9%F_Kvv$ŇI@}RRݧgd^|rl>@t( aN6jl6~A ܅u xY̞5w/5[w79,uQUU]UUź5jlog64}\BKCTxj&֢>+U^}cCHHhֆx򥋂C -߾0n F L&WΠqk{$|ic zGgYdrًד'׷vk65QB"Ng::.6 Eb>ԯo!z|#,>z<84{ yy96-\5oqLa&""":DDDf&R+A z7E 洵?|;MM,E^*iNeQ#֒1'Qv #wZ(?#*< O+vGKc2Y;@?}Baw6ENNʵ::P"ŊKJ;:h*0zؔmr dr^I:ގ]iȫ~!B/(LMHbei!""BRw?`0#(x- RUUy'.>!+;g 22޼qGGGtL^ǘ'$'ܽ=9%ui\ IDATػ'&%hk(-(,b!,_)&&A۱gVVNMMmAAmNnޭ>b6o\`Z[zݺ[T\RRZFPK>h773Mrᓔt_*+K^jiiaQQ1J Z[[?{ęӧD~yg?8#%)>qڗYRRO9DIIKm4PA^c&M3T*UUYk͙L&f5ً{^;9%K iU5#8>XS2ΜИU^^1rpdk=2:&ae{vlAg"~>D"8[խB6ڹuhw? \b)Ǩ_>>)8¢f|HS^袾Ւ?:ҌOHTW}ȨK  /ww޾v6K,  {.-+/*.il;t,'7\WP!O SRTع}3:p(*99%UUE?i!/^u[>QUUOL +5%eV#G8|<1SCcc~A Khe9m :œmN?06%5=84w{wnÂ触'$~3kG FZZ֒?{ *qiii6-573-/OHq*H$RffsF$KJˆ=pW] 56ڶkyyEqqI}C sM u- ѱz햖֤䔾ZZWhP344!=JA!!fǺΆFHHHfe`*JJ+.S(gE*'\ rr$>QU]SXXL"28*:ͻ|h/7 q՛RVPPagc;$?l~}6RRh!'+CN>_WWY? N?.t/>yzRߧu{ᴁ^e]LwcJ~~7Pܼs_v1T|de<|| G!_bX^Ls] & URBG˞@?(#CA ݹ!@G:x{@ =,O`1YVqM: Pњ[_?'\X|M{GGZz&XPَ*!ߖR;u68$NgED/DFGQ ֐HyD(TjhX8 VTVU9v*+;ӧ}q2ϟBYYyhxD|BҴ)Ƴ{p3*7R@  @~9Ф@ "I@ D@@ &@  ","m´g8m;{պMF9utF\rm\t O(@ n@{#RYYe+ԴY'ϘnzAN>{lEZm˜Zw#[w[@ 0!&*jgcŏܼ[w77s #hnnu>݌aia.//#SUQf:" _ 9F^22n-)s^;~mdy9P|ʪ*)))999 ֩(+8@ G3!?))5q?M VX*-# &6֖%ex ,08g @ 懏ݾmNBsBٱwt:}҄۸av4u >~>~"MEX 7{¥t \W.[D|իRBB|zM uTA?| #-ѱc>!a^exUh復O8aU_1̻7޽(cĺ5+GZZtOg$ݘ 3X~-}k7nw으kֳX,;+aO%;:yZ.,, `Xw=/hmk_t_MIIO) w^$!^WDbCc vttZXRRpSn @  =; qpZ1,"L蘍kvN.z7`9vdŚ :!dzݦ)s\ unDN/XrX>GOY\_ru)(,qp}K4ySm;:ٷs.t{C.]AOg9mlKqךZqg":~*S$N>~fY|MsK [9o¥U56@wc_V"ڼ}¥P32F->UVV>wqg;k~& I !a  "jZܪEkm]ZVkRZE\*(U+(YEde' !|L{̝3 ywfmcKJKL=HR4WxO[jIӧh4$I>,.Y'ꬩ3g5p{ogε+ʪ*u$ɻY~\ut_Q> $-v7n׿7qѨhO(I$I*ʏ/jk BV:fi|\`cffj:)_湍RiÁc0bP$.]jH`F|_|p.u D1u@nnUw>aP$mE>fS'*W?RLY]9}d|[jjkgtQXZQW( ƿƿf'\v10hD{d2ozP$,)R{~>ohHpser9ϙQ>Nݻ[XP.gKw_'VeUuvN\|;2s\`o??pu?mr[sBV`ARiSqI)IŮ.KNUs4Fzk1Co$ݒJ BugېͰXr, TBtЎl $IfUT95ߺi[4"q@FFVqGTB0U}JeOǿP(Bvf Gzx'\vɷ =rXJꝱ~>iw2S (|`ޜY-87[]]S%-M~w~&t߁Q#G=ҕIK;;hfiA~Gj~} Go$J*U)Q /ڕ46ZXw BM̋Œ蓿eeogW!U juA;ᣥe*W/{A@uM q55)=lm~\_Op^?*w6=w|/$\|51`_UMMV}nNahh\.,--Z/ ```-r9 W#>ʵcF;Eu[1E"h4/_޿C¥+4 eopʠ.HVQWtZܙ/BkB`f V(~oY\Ru sHd܅J5mr UH-~|RYY+(UC=yu$X䱘! vkyg>N75116fi{>譡m6A' 97c0F v޽G ֺ*>bАKPc'fff]vfFy~\ܶX3U_p:`jj?-{BYuLqކ_b70;]+03-)-א$'j п˾Bv /]I(Uc'<73+?j4BVk'NS#Քr@ B*5A]JʩߘNڲug  tټGSOΜ]2= ˞*'oNn~S^oDǝ|kP1iw75rH,9u:o {ڒܼ3Sdݒ䍍#GH$׷3UkTZ8&'7FyT*.yf jh?c~XEkV}?˵&*ҵ%W]/T!Z$vJ4u jkjkkjk\ӧe( /G!{]5O=aqFfB1=lGgW]Q]MI'@JlϷڒqw>pYRo۱ѱյ+Iv%4ɚNoشE"i&ȁ.Oy3χ ='1L& fhuo^[=; ꓹ_ %Χ R* dM]DoD*_#ͩTFʌ{99szmɝ7-d@Psz3l}vIi\2ajnkjصw!{Z9u㍛Դ V,ߴe\Ml+z׬Yw>__gsCkŜ>)-YlhhfD\|w^_ãG%%u Pnmu.’5#Db񘓇{X\٢AC{Jܵ#%r۩).)БțI]OZ07#ǐvp2'랚޼ 33:`0rsC hҲA89nyVW5)o.^8oH/8}6hTL&KM蘒vF4^vo^Գ2)Uk|o5`Qb E^~Avn63]{kT*K BwA7?w^&@Wb{F|~䱘m;wWUU+׮ L{wTeIϸx̹أQ&`%SɽzΎ=jnpAAtzF*?Y0wvfVv\|utpt9NzNn~Nn^RÇX1F/8}7FղY,Vjڝ6%e%Ӧ҂Bσ qa> j5?%BB+w|*.`NcR٭[q"Bσ IUA~۷R?ٰas ITɩS?~<|42%%BѨj;;#Gr8'*]vgر]3B!Yl6ܜ>O%tVMMe|N8!gϞpٳg߿_T6a2555gBE{R [[۽{Z[[j5Ƨ=fj@xyyh*e!r-EjjE"J0`MLLڵ|>\t),,vٲe@dtttll,Fh4ӦM#<,,2#FL07n(رc@ L5k-XNkwMMMO=!yR[n^oyJڵk.]/hc8l2ss3gl߾y{{3fǏ׆mݺήtɒ%2l֬YP]]_x{{9r ۷oZjG;vٳ'Ln;P[[ ={lB uvv~@OOogϞm3n8kkk&9eÇɓvvv`kk-Jѣ2lΜ9Ao߾\~++ 9gDG=ziرNNND&%%)JjF sYf9BWcǎ yyy-ʝ;[R$@[6 Baax<mRPݻ*Qb OTݻWyyyݻwooe{ܹ3k,haakׂBU ԖXXXvp bʪyIccv=<BU`2m666͟ ѣF77anٳ"mJZ~}]]Q5knܸ1==h4AҲ\A[9Y>AeK-bR~gZA!^W@9쩰N^FiQs)WW̼7w˞pB_D]<[:tݺu:xRtqqٺu+5A֮][VV{A۬jΜ9&&&U IDAT?鹸^:dnnm۶>|ƍl6::?׷3nn8Z}ҥ慃 !?ǿkjj?~QW/Ӂ L҅s>7}t !ҕ]Kd̗ѣGm.D"yqn^DB!]y/AbbiRRR ?njjڷo͞7o^' >} 6E!z^oGRRҾ}t:;w_uB7"@!ЋF@!Ћ)B!tS B!L)B!os)KRΝ;:u欓'O;/!t델nѢEbXPPo9dN`` #Ga$éuX>oooiӦkZz֭[{AIT,==ٳ}0&&&;;uw}Gӵ=[p !B!{#F)LLL"##7oޜ $I&$$l޼t~yݦ߼ysrrÇIHH+Wxo{lEFsa>S.<1B hw%6 ^hBoZ  pHN4ݙLBw{챲iNVh-Z|>ɥ:wwa4MV"ҙ7b=YYY<֭[jllTp8J2((NϘ1>UmɓE"ٺunZXXRmllZwڵkg&B0%%e֬Yon,Hߟ`0  ᵵ7VTTٳ 6=r7@DDDTTرC Ps 4MO6 b]$cƌ􌈈x;ٶ~{D[׸#k TTTh4@z>x`$IEFF:99yxxDFFFFFRD{gϞB9sφa̙$IR'N7 Z7ٳ'""bڴiWs8py?`oow={L<:z={6u-DhhѣGk;vСC`mm};;/+˟: :hР===NB M)Jӧ'LrFSA@ 000DbŊ֫ z9lذjhllLLL hr`ԨQNNNo Ғ:uj{WWW}zر,E 4&ppp-LSHHHIIɘ1c>h4-999Ut|-۶m o1ݻw{fejj\vյBCf)رcBa^^^rggb噗.]u떶6+L|Ǔ-899 <8..nʔ)wn# O?Ֆ( }}z퀄ƍ;cccfT!!!{Jj5ihhڵ,Yn߾}Ço/,55ϯCɓÇu!yR  ԖXXXvBܹs_D|g̜9s_}՘1c Z|ؿָ\9sSSS#""~6YAU|r罆888dggRT*GG6>|P&yxx`>Bo- Ԯk #""޽Km3 jeCCCvvSť_~FԔJQQÇ۷oo)HqrJ$feeet:y*juuu]000hjjjhJJR)?OB|_JX"009+\pazzשxb xӧ5Vڵk5Қw'H@"T(gϞ>2++b077%,,,##lԩN*))Z~Hdbb<rX\XXS7ބǹ"пk@njS#>sP(͝VZ"&--\.bΜ9'IoذAVX*o/*((d`رj֖/_^\\R CCC[LvZ*77W(0T*=p@rr2á>>>&M*bŊ$$5 ˝={ Usbb"՜w}GM:uٳl``  -ZT[[`0|ҥKۼAM.\]dICW^6mZ{޺u… }'B!ʕ+iiiEsׯ_y_^!z^ˉgeeXQQ'TvE ! 腸zjnnJ1cF'_n~ԩ2@SBs`JB!B!L)B!R BH0@!`JB!xDd_599FT*>?w~~!B,R<޽{ܹTlڴѣG]N)Ο??rHv+xuH" >KJ0q-}%$zYZ=׋B`JW^:u)hO>rwMLL)K<@Q^w$&eA [$hn2`bJB&#r\"kK|~{1hz>?{}A! (E 44СCTT*h4ԫ׮]{u 9vXJJL&/|}}CCC333t:A>}: jhh3fO>>$$,YRQQq9}}SPUUuȑ| H>}:h#Gmmm.]jnny挌ݻ/_w+u֡Cjy8?1M⋛ 6*sWQC3w~³0k!ۤjq@,%G7VsXBtsB:@IRXmɑ#G{=j!../tRQQ~]v}J$|/~X\\駟}.))  v-,,jjjŋژ :4##ZcծYpazz:u)$&&æo33d{ H}_#~R}5xA:RQQgϞJ lȑ#SSSlRSSx &H$y-[ &O,֭[uBJ?Z ƌ3dȐpT:t/fJ:tPjj*jsӧCBB`ҥ=߹\WJ*pHR}4y.hCeJimh1m1̰{Σdw;?}&&5q tlPl={n6{g1Rvd_y;O􏽻O0kfؽ[w/Jd} Tj !:R(EEEԮԩS;s@ 000Db 333 !>3{{1cƸdddPgq8ݻw[XXFr000077++q͞=[TWWO8UTTUGds% 9sH~uWoݺcmv$O.< @@im.[M/*0i[X fdd Ueo v ^bY] 6#<0ZuA\dy`oV C]m;y]!N|d:993ᣏ>,W?oU:tw4ڟYaa!MDIIɖ-[***@VǏmll:::RwPnmm]ciiܢ\.drN^JNT4nIx9MnV\ ƽ%wK* =:E݌T>܂cc`{䒤j-=TjţB{D{UB%#7nwW>x;w|zd<;uN1L.{cmb3mļSi;\/0n4we|BHp-E$ݻFyxx\$I |P("kkk9ZM@t*77rB-rJk)Ywc2Y6JT-<:R^>Ae:a"$k@ HTJ*zժ5wv5ʅz !tSv)gj}P HJJJ$I=zy :TPDEE@SSÇ\̙3tzxx8iv4sև:!yX8^=&SJ@lwo:RQ_,+vjL+c 6JNTim!سW@#А꫹ǛBE ޣJeTTTRRIΞ=g:UVVnٲraaaꫯ d2@ ;v,A(.Z`رcW*;v0119qoT*---GsN>зoߝ;wVUUx<oo 6TVV5wݺu\.믿G|6=s!CXp޽gN6̈́(Fљ݌y~>%"J7lKݲPɮErO#ߢ}!+"qT.>Ʌg  а8NmM*dMAg@JхKư5uvb߯L:(jgrtQ멛NB4R BHp!B:)B!tS B!L)B!R BH0@!`JB!!B:o"}rݻ~022z-*;;2R,J"pf9;&2>hB齸 zp#YYYGiii J]92lذڊ212pfrTVi'S& 'Ql &Y,l޼|ંBc@I^uwBz_w{y$ /'ҿg18օBSLJ.[***SYYI9rd```{XtƌL&PZZJMcvׯ@HHȑ#Gmmm.]jnny挌ݻ/_wTYYY111wu IDAT@ӧM6r:#Hߟ`0 OỵR_0\HϜSA$}c!uU42Z]SK0,l1x,=vBV O[ur?BT$jT*񉍍vϟj;11qܸqOO>ٰavrĉ[lh4f'O#I!..gʕo˛?~PPЦM,X0w\mUvڻwF!Itiiiڣ/^LmTŋ'b$+W6nN(^Wcdtݒ]yZzúM$ITڰnScoڣM̚Q(6<%vgԶ%Ih$]L->3! pȺ EQQ%5ugѣ2lܹA1gToϧn>|ӤI***8iҤↆӧϚ5 qsskļ . Frrr:tPǏo۶ٳz]z}y}B0@볆yʯh3T*ettwGm7%erδ@@SI&KA!JGg1L''1c888|GZIzz5ǣv9ezzzpp6ϻ1MMM 2==566h4PأG}jKbccr9nTbg.ɔ]O'@H4 je+ǰx8J1s'Cʜͭ\PhK\Bx&jEImmm@QQÇ۷oo3uOE)zaRi4ӥ?@GׯITjSdq-B0,Bqlj7++b*9s&N'IJJJz177;wݿ}I$H$!!!#+**o~ܹgs2/_WٕkEJUԮ*>d2@\AKc~n(Z?kgBۆZKHHxnnn+VJJJ"IRpٳgwzyy_][[`0|ԩS'L= +((l6{̙C 𸸸33 ?~tΜ9b8**d̙&L 577۷o]]ajjm۶%KP [lJHNNp8t:gҤI\WW!C5OFUդ\A36st.ɥbi鄁œnmtĘ4SxzԄ3m+ FC׾D]Y%=vBU\B3e0.)!^9L)B!8B!!B:7>#G.{B!k)B!8B!!B:)B!tS B!=y19^uwB28JEYYY7>~СC /*QYH?pH g? I<1/[,z~a#!zaJEl6‚dR?>|K)y6}w8[yjE@ZI|y`4WBM)E{Ϟ=VVV/^bY}V7o]`sx:B!xԃD"&ill^[[l2'N+t@ 􌊊dfff_={.\VL(B뷪Ʌڎ$?3Us.ۨ**)Ί&l+S6M\4fD\v&Đm`pBoo/u>Rbq'Dч: ~-Lfx>٪eq0ZjK>@۷UerYy.Ik.dEPG]lyoov[8zQglp􊡾Gÿg=jG"BRt$44i@|p:y͎v EZZڰaZGl۶5ڎɅgH(eqy<7e7)$N;ؚcTim.Ugks">' X x6#2̒gB.++srrҖXNueF7o2d^Hp+=A_#~8 <&ms9!DQɔabY]q7#@g~滣yL7#;jF9,^\ص.!zMaJ.H]׷.55}}} XlY?}=n3 4Czbk$i&U@_AUf4f=!0hD(.^X[[[YYٷo_]`=><ڌ!d J޵ S6vtBoL)%lll %R>ks)%$޽{Byӧnj^C*y&v~L0k;S!Biؤ3%+bygk`61v{P-QdoiRv=B!/)EGϟwUh4mN@uuR\f6EU(Ǐi۷w~y&ǙCؚ:b5`S4ʅ*ztf7#i_6?T+®I)Qd|}v@T{w_o`B!R BH0@!`JB!!B:)B!tK 5ˤ4jz{ZF.8yawz +2B7  DR Z!cgUf0yt=R.T]]E6>!ˁ!yFv4$R@Ԕ\%Ee `3<ƽ^eBIp#YYY111@ӧM6rH;vܽ{=N8ajj_$K4ibWLNR`2a1<adŶBg)EG_޽{5kQVVtRCCC777h4~-AaaafffgΜ9|Qdd$unhhh\\֭[JKK,Y"f͚պ&bcDŽ (Ɇb:7Z(eϚ< B/ N|tdf͢lllC׮]+));wɜ2e߫O˗/mԙ gx,<(10{ ZBR-JjkkԤ5A`+N/**ҖTSc-HRL֩.e$5 %RM8M] hH#)X}Equ ?-Җޥ (ذ5F%Kbb/M1(QDE VbR(}wc|7*JLﯙ;}=ܹ3`Г)BS&zxxP+$222]f<iӦJNw邍ͨQ8PRRz~ӦMRhZx ei ҋҋdU.hdQ0h<|{?Ut/w B"HoZEEE|||AAm@@@]]ݟimm믿 ª*`Ȑ!Jɓ8|00.$I&$$p8g>_W5Cϟ.gtqqo 1^Be00֭[-o@!yG-YqBVTTv Bm S=z(};w;mCB! hgt:Riii9q.]uP!P!B&7>B!dR B0@! `JB!!B&)EN<{EFFҁ&L0hРKҁLKDÃsmBy"##{պv:~ƍ\dgg礤>:'""u֑j -oxp^? : ώ06:9dxr܉88B8KB[[[4W855ܹ|ͱ3#tj*?ZGb_#0ڋߓ*äAwe9c췔{?z#z5pU?00pѢEO>yfB6sL333V;qDXLөOP.\xOJJvuu5ksrrfϞRWx]R}®#O}ڴiXGiӦܹf#GfffzyyYfȑnnnMܱcG+WDEEEEE]|̙3Æ rŋZ "JL&A-:jͱ3!to!X<tj}6Ы&>gͮ#YsS#p(YO3BR>>,yOבJ|򉧧g;t`Bѣk׮Ç >|xqqX,~ÇWZuyCS4G^=0y@@N͌X , BL)חڠnvv@ vy<}vv=444Ky۸8P+iKͯo,i@:/3jΜ9 z]CgcW:Zzٳg߽{WZ[[^ʪxɒ%z̝;1o޼9%%wԩ555{쩯mhhؽ{w}}}m6mԥK>}4eHq 0HX|aFCsE]TK}x N_x<$z` >:4H7R^@|{zҳh! mfܸqիW[ǂBxMϜ9c-,,f^ZBY0xMw)JaǎMݿ@!8x5)..ޱcL& X.ۊJJJ.wssk Bu”!B&7>B!dR B0@! `JB!!B&_"}ZmLLX,hgKVR(\.iԨQϭʕWj4R9sL $BSS(111'O4hP3՘LfRRŋ=zb{= fܭ(..V+"""o޽{ݯ_>{BmaJzt:ܼs͛7'OliiIdjjjRRҔ)SD"Q[Bõf׬Y2ᖖ@Du:ݽ{:.BR4gUTT=zDEE7JKKΝ+#""͛G5Q(7oNOOr$IDGG;88<Ӌ<==Ût:333@{yyQ?g͚U^^~>/111%%O4)228tzzr^ܹ~CGJJ Agȑ/tjhKBqpI7ncǎج\7oy&ڵX_嗷nZ~}bbEΝ;wŧ{;vl@@Ν;WX(R=:k׮[|…k_jUPPвe֮]kggrʠ~mttm߿R]]tiK.]~U222^קL?!R4cttGLL yfO4СCtΝ;wEq8h4ڐ!CnܸQVVDۡCzxxL<`0TWW6tTW6l&-\ĉsssROapXoo]ygȑO_BH1 IDATW^}nݺ 8澾Nf5X.,YaÆo45 A%%%+V^>latjں..ꪺw5 NNNO 5iT*O:nݺ &۷7BoEJ1p@Dr֭'OqtGiy<-Q__O8~`0&LjlKў5 J644@׮].]gϞ`g/0 yw SRRbbbZB7ſ"͛7WVVK좣M8P(L/1[xիWSN 0%ݞ9s`{ALx  :uԩSuu#Gj7|BCt:QAL!,+::b=s$BBBΝ;ƒ=99ٸkiir۳g_%z E`\kD"nݺp!jG$Ą"غu+H"PKFB[R ihj o~۶mrJKK۹skΜ9FZ%݆i4ݻwRܱcG#6mZvv ϟ8q]vPTTh@.Rҋ:}B+++Z0B7_KP4uܚk֬ 3f̧~ZSSff͚5o޼Z! @Plڴ)==s8'@\\ܣGz駬,J%(+V?j[fP(ѱսܝWvQ\m `ܹbEU^Nl09}-|'djCB!G_-7lذi&/B*þc'Z=ߝӷ?_4l0VV|[rnα'6Bw…)S0 &O,g!f~z͵ӭh>C\_1&!w+++f/^p!W :Pig r4eWZ,4zb})QTMB9L)Lq}vvFaXOTV*4f(JH}efLnAEc]ԾP ]Kug\uÙn_i!Bπ7>LO"p%\.$ILDM^~^^V䆺UgE^͘\w spg˜B!p-h4sss*:i L:Ѳ3-wZIrR!zE00=PP(( |5 6mZ{խ' l9DgвfrĂ+zB”<==sssX^ѫfVvTgB S B@! `JB!!B&)B!LS B!2L)B!dR B0@! `J}z˖-A.6ˢ ,<;7V+}-0I0!3,Tԕ+Wzzzþc'Z=ߝӷ?_4l0VV|[r$ BMleD"ѫof7J\+>FA!Zo|w4O@TZقª\:bpzF{م+KiMkk !пmLTh46 `5 ͘܂}+v}wҗ>﹫.B7>ڒ^_~6Wf3nUYQp3&,+oDsktUf=T] e`w~5g0&ʽ#UZz`pL[?Ӟ;B!0쥎JRVr}l'}U"Un-ʏvi#I1Rଐ+z7~N' 6XU}!.#й̷4# ~,\-1;@ZACI;Yz!zCaJj$yرHWWק׷w=5kOWlXBw!N 5oܭb 8`ɳ u/A["KHA_VwX Q{;~&S5zU_oF,: \9-oN=D&X!zWk޽j?~QfnnNhQLA{?;wܰ۳\&AU9$Ios3Kpx+0jødgaCIeIM5ρSL׶&`#"ÔJKKKII駟\3+1mڴV̠1]Uf{[lVp}ҥKOפg&&&bn=p b-H&I?PK#F,n?- If΃!}Y>=@5 gnz B ÀLh̘1uuuO4?$Ʉ3iҤf:L+H/Ԡ7c h*[m+xRZôݕhVf&UrX@^~]]['Qp|nνf*Q֘1yl; \o| ᝇn@w?`uGi7w?qL:@{YZjnfi+p S\NBoL)B!dx!B&)B!LS B!2L)B!dR B0@! `JB!!B&_"5u֝9sF,o޼ťV#=<<֬Yӆ9rO:_\\lnnoB vYTTd0tkHHȠAx|8eDv߾}OWt:M޽{MbE!-nݚ5k[&R}||:|g:tf͚ս{wb8++XmΜ96mH$&&7'(z>O}L&3@;w^S!ZߒR8qlĉԮY\\ŋ6 %"33ӘRdee999Scƌi4ړkwBʕ+=zxF}Ǐj^oaazyy=3xPxN"33366v…TJ!Ht:)S~xppw}G,`2[lʒ4M"5npOpt:\o߾{{{?=z KKKWS,^ݻZ XærYYYεkר:uꔚשSh׮/mmm եÆ 3tvvx׮]3.h"43\yyΝ;J}}}yu777KK˧Y[[3f߾}Ν4hPZr!^7,8pD"u~~~ss󨨨(Ts~ޑ`ŋS?˗/w^㶍aP3Ԃ:h̟Xssƻbxk֬M0A69~`~6\]]_LVVVvںukBBB>cTtNNNs̹u޽{|Bff[oC2l=zu!k\bgg|7o޿߸+Mtm8p`+$A^lhh0dʒH$cǎ}"hF.]d2٥KX,J dffeܹ{5kVIIɼyz=ivBa{n+((hBaaNkޢ"JյkW'BoK)X,VttqMzcǞ(4>vmmm 7o44]Ĉz*iشiSSNEEE'OlyJG-p8={KAdPPP^~'kkh775kTUU r6nXYYзor˗7u˙3go\6Fѯ_3gM> ?Ϗ?(z+HNNͥ:mʔ)ƴ,##cRTK1gΜ/s /4:{lUUѣj~?wBm N)Лe˖-#GlE .\ti޼y& !7>ЛѱMtEEEԋ4Bm,zMJKKK>:p@iiH$y"zR BB!LS B!2L)B!dR B0@! a7T*ovBa\\\:i(gYֱ jϑpڵ`0,[)Ejj*É0mm%rVIt((ȥiGk~ZAr^vBȴ0xgώ5h4ӛwKZYY3R? S}(4]x 07×ɷBpI'Nؼy3$&&n߾*T(p .@|||rrrFFJ9sfdddbb"p :u4vX6=qDXLǍӧO>ѣ'**UUUIIIo&$޽{;`<1zRRRvvYlmm/_4{loooo߾].Ν;<%PKYNи[z>9^k \y?qvB7n(xSvv^v!ct6V9䅸o<շf]w*WW qª\0z;{_1<%N! /Xcj׮ݐ!Cv5cƌy9rȑƍǏ;\rǏ~vΞ=[RRrʨիWwvȑ^^^k֬9r˰- IDAT:TWW8ydHJJܹH$ׯXbذa*++CBB^SSu3gΔFFF6ʕ+/^NϏ={szyN'lvקVLƚeS 8r=ϰLJggd9L^׈ڛrHr@b.־@it =n$9in0XV^WTw;RZb't;0yַ\p!^zBwޯ_?3fPs NNNSLi|1.kkk 111,+''`ם?%%{ѵkW__ÇWTTxyy >X,S7lI;q짣ڷoߪU?>~rK/&'1?ike+2.uL1n?. R#{;h5й_IMrA՚>c,y  .L2mީHV$+_6HȵutWVwV@!d*xPwݫj ԡC>___jN[ZZ̎?~麺:T*RZnflX#F_(;{G;{>UAkXg@(4 byU8Y=SʫQM깒Ɯ|P5 ǮoWXQmwlDB&`nnx7..СC Æ ?~<܄P5 t:]SIIIvZpaΝ 8q˵Zmؖ]RN>޸aCC uGsfpzۅ(./v{>fI]lǸM4ie*11&l&͘枫+zFƐ(j֞7nBU:tСC޽m6@`\BN>ܥK zJeȐ!qqq/ٕѭ?l9]|zxuMM=w ϟ?qDv힮w_~3GْLU"oe mtV#:pNial̝(j]V'~>]Πr0htwp8B&AP4B!dR B0@! `JB!!B&)B!LS B!2L)B!d%Rj=u$;AnH_1mBW_ȍc/d ϶x;h}(4o8;Aνj g4tvyۇ&7kutA.1@0#. D\%T>yPTg6r;ۇ}:t!ƌWB`JSD|cIQuϾ:,Jt\t֤^ |:M!hNEE+++ 033\bEMM͌3}]L׿[91B*,^xʕt-o]tټyB 9st۷gff^򊋋Yˏ9?~%&&I&EFF#Abbbqq1M:յͦ=AЊn9tAW'{ԵݠyIJP\sͦ=D;t 3N<8KGvm̝(<]r}S>4lN=u8[GSzم a٭>/B&<==֯_?bĈ-[@Νu|]\\\%ׯ~yU”}E`nf띂i4kC'JI@瞮~%7[2"BS&X,__{l6]vvXXϧiǗ8I@DIIܹs'L0a„sÇ7ںH$F xOY,1fxs@յB ֢h~EK(*\l$ ƚP\sXb/t'WO`f%WKZ2"BR4gҥ'NطoKLLL޽[<_At@m_~믿8q?`0*++'LjٖJJ5v%HZ  J1i,00000%hiUpNc 6(LIMXQE-ζذ@#a0JM1ƚ& f -!Ы)Es|~lllLLLff֭[-ZN<7~R|ɱΜ9`0{= ^+P(֬Y4F4wչ+SSfӞFЋĊ~c[ޛ(CԠV|&ATZR+.(!hL&[v-h]~$IRP! %dzr%כnjk-[!44LKҞZح(PS]{8!fp-ݯ^/;kŧ**ocjiB\hmZ4BmaJ$FsaǼ<6O]|YP$sN.tO-hv Jrǎjt:}TRRRaŽƮ\f͚ܖti :+_c(^^l𪤥 ZPkU6`nfsPN2whB,X1M1 ~#G:tlfk׮mܸ,((?qİa̙pqB $..<==}РAgϾvX,NMMӧ;rȞ={^fggd2Z_:.;{l\^PPPYY)f͚%oݺU\\ܫW/׳goذԩSSL y%CBB{ALnAU[k_ J4V΃ݽޡ:-+䏮 XWKKV^nj+%g:MCԞFcܕUt2iMiؐ6^ev>]^\\/Hs pb8B@! B!2L)B!dR B0@! `JB!!B&)B!LS B~Rk׮ss╎jcbbbi?FB5g)M}}uٓnݺM6P(Lݳ1̤ݻQ.i|C z,EsX,V{a|rrU/фBVmB/+~A&?d2MB!w)EN8y?|РAPQQ~J """j^ZZ:w\XqƱXm۶)nnnSNuuu ^p㓒]]]g͚ekk|''ٳg{{{S۷tѣ#"" F&mڴ)##`p܉':xWA#gxGfj2p)j5whU C1|T.[_D ,}HeI @@^AoA.6BmDMS( 8v;eʔ-[Pϟ:ts{>}%KÆ [b`0 ˈ#H))) /^z֭)SL8qٲeW\}ԩS] $1"++x￟1cf̘1}$"##WnL"瞗kwRŚIS$KW\Օ-U9tMskwמi3ue$I+j?%sGG!73[JS{5jԋvsNJGA ?PH= ңG]>+,,gbjر&M"\\\BCCSRR9oݺ5qD>}ݾ}5>|jժÇy ss`t`u;;j^u ;' f}zROJՋBፏbX%%%z_lggg@@x<{{옘cjںH$z*`2[lʒ4M"55(K;VuFl6=/#wnϭu W}fPVǀBM`J.]|ĉ}zH$Zv„ RI\ǣ6'v `ŋݻԠGK4 é7NP̙BgmyeR&]]chhxB L)^ϏܺuE[ރP(/ܘ*xiӦ'$^F4j_|NbBh)LvZh]v/I|ѷ`i4cIZZ'Jjkk %EEE3+;ASAڠ{sj6qL_ted6$BSh4ϧvl u2~x:yf$dÆ ڵ{n'zxxTWW@FFwqQ];2t)"(+hTh6F%j&1n~7_|MLL$ bmc&QcAҥ8a"X>9s|s=w\Ccbbub @D!>>֖_}Ν; @VU)Cwh)9JJVw:Klݏغ:ƭ~p&}^nnn{~w6nx XUTSN޽{C͛7B$i4I&=SDtڵ˗gggk4L /׏VZT]]=k֬͛7WUUyyyM>vƍUUU/SO=U\\%___kɒ%s'/^g4'O*JP8jԨ &seeʕ+7|;9kŵ +`dRi)#lM]kΖVn55MTJUGBȼbOgf-!R pDRׯϿ^jSR pH)R &RW^{M$>:cf)… qqq7] #4Ma#[x(!h&L'HbIIɺuZ/PJ5sPد{k ԩS~gΜYfMMMD"5jѣݻjժzk̘16lغu+;Bg7n4ѣGBBž={ɓ'NZ#Y[ "P<h%wqfB)T'}u~%XyUtΞD`E B"ZgjP<&+)me3=྅NRRR>y1~ҥG=ztttqf?|DD,ZC|g}'hZ"={dӧOLLMvɤV[*96eHŊKSYFz)__\-dupgroUA$"c7!fưjǹiw~⦴#/~GXk\|AU]>#cu<{oO^ytk%5qυ |%8Kq'#F "a^|ERke2޽{j={Anm?.Y%f.iXAD^]"lwXF-dD&OQS|݂ _qRkû< C(7S9I=QZ9(ϗOW]%"7T,7Y 1O 3dxA%";тA:0""Y#J7nryttY%ǏO,MT:wz6O^yk5fTi07n2:?Vu{k{?8wu{:GID2/Uy:XflRQK#bcc+++Ϝ9CD{mcǾ[M-@D2$*"2Yk5Ry0cck߃^\rx۞o@J 777"2 lHϞ=}||_QQQVV~qls֛"KOT2ԛc{d3?")E|||5F^H$뉈aQF?~|ǎ#G6(ψ4STduFD%9\XٮRHC{ѵΚ2}8Ļ \CD<w+dee>|X]zmB|}}Hl;SXպyQF54ʖ-[n/г߶ YyHp70[zcWa(vU<I?-""*.<:$`x0!O^vmMMT*9sL&۷oի_ֻww}VXqaL6t"e IDATЩS:{xפRvʚ5kSYk7ZkmFuөg#ثn:riT@\Fk,F4y>TggmjǔJT<]L0@Iry׬`Dܯ9{R9"'臓 Ks!;Vpdu{vKx>-)E/u6zaugFGGu )Ek9sn߷o_߾}ry<@bٞ}?chuK.pH)R @J.R<0X]&[p102 ""ز46 g "Ap$[$ɉ v$WW8-Q ;O !"]+m/3Æ s-++ϟ?RFAD[n7o^=8۲eˮ]˲cƌygiv0g9!HH2ftH)رc۷?>0oZݻ7,2 |roo~iݺu6lMLLLJJ/ZmAAܹsf)Snd2 T8"0bCn?2@`Nbٺ:@CBBS/^$HgpN,[lXXbxb߾}!ju~.pbelyq7vW8q2A@?Ap=w2|N` "Ϯ\Ÿ$"JlT*z-[8RY]}~IafϞ}1QWm{:."2){*bQWO@JѠiӦM<==͍sh4Doe9,$}#Cd%ǰA㦚 1/DԣGPnOFX46Y VGv;>&k8c\~j[vn\)E|}}ZmRRCΝs6lXHHʕ+v; ޓ&Mڶm[~~>9+Ws3aqd@n_EP{dZ/{--Lf d5Kh"<=N/]YYY믿zyy}7s)ܞx ɴo߾M69/߶m?LDb{ӦMS(7 qܲerm/ߐ-HfNpF u0b<%"Pb֭׈U4_@R_|դ>o…:]8m )E󥧧ܹ?>p@vvs=׶!,|4ߦM>lM&ɓA X@J.\)R p ڷoߋ/ԪKcƌO[u r\ci2[p^nޠءC7yoذaϞ=+Vׯ_ꫯޡݻraÚkq8&]?%gcVǨ ĸml΢9I<# )Ekh4kvyl^A@_#vp^9~3Rc ŜEo?>WWʧD$3߿%GOߨVZR2vرcǶuBy1NߔlaP<jD$APgJYj#Z'phEH)Dzw)Ǎ;O$&&QHHȬYhɒ%ǎYfM@@~ڴi^j3fRu;;,--}ovNZ0w1;Wk7f |W ?~[p6l֭ԩSh}!ׯܹE&L+rС8ZMDZx)S^z}7:nΜ9gڹsgEE͞=;<<~JQQQBpĉgΜ [tĉCBB gϞAAA'O,//7nܸqN8qǟ\D2woh–1. B{UU_LMM tssJ]vP[[[TT鬹CN95CxxE~~=KR\h=m𷄈®ϓ@LB(/$;~vk[6w@;8GhRt BzK/9ϚLhT*gMbY1TmϞ?=dDĨۓ@xF(aT\՛rrV!=4ҥKmO:k C+Fv`$Vps w@ߗn.8p),|4_޽VСCKV/^謹r]%8#܈jLٌdo^#ݲPxt%;$ mvR4 /  WZ/_cǎmzk۵kdɒE}~~~_~eTT_|Q^^wuĉ> ..n͚5W^?vO?4!!aɒ%EEEOo~>ADDty }zNZ={G-ݻO:uS x|yDD  =<Deee/f"˲DTSSCDHIIamm-O?ݼyDÇϙ37ddd;wnʔ)Ry=H)(..nժUeee??8h`04KT*,XpԩO>dFjJD/"0- ͍x3fܶA>}~M6Y,eff>|xɸ쥐H$qqq]W^DTɭ[nڴYP(=ؐ!Cʦtp87Qs zjիW?~'~gڴi111řOLAAѣG0|xll T*Հg={v͚5UUU*o6̭[D"ֿSy'Ē%K:tP܋/6 75ի׸qExK)UnM))Qٞ .'srr&LhSN>}prVx`\Y@J.\)R pH)+T v}k[H)`8{j˅Babb}ͳlڤoyQIu3_ט[#hpcǎeff+"aS -5Rhc|ݵúLrQ.Y ;v옧'p"J]tINN~嗛!G-5+#yF,8Dr?MǺbuzUAť0k>uyY򎓗9,jǸswzQc#&Ӽ%_]vVU"d2 TzR:ל$H31DMD"M7:,EQxs{/C#bC#wP^Ƶㇳ6{wiFDFݦ09g1Uh>D4Sn2_'>;>nAD4VEӭs@}a0‡zBQFPpg0njp83>#Y[u?>uuWI H>-c›F3dDQev$"y+jG yRX PѷDžcC#&4=`xt`BCCKJJה޺ɸL1'Y2 C:oJnaEbC>&(J6 ~MRСC+++ b:tmF|YݝZJADrXCte檦G#dUmuF] t ]rL޾3eʔ;wUkvR}Xޮ𧤢[;}6w+|D3Ԙ*UZsH(nw"k CZ1(u5 ۬9Ӌ5拄ӥ<q,etց )Ɋ`C}KD_x.܉/u,p_^ p,| @J.\)n"m- .X~}FŠL6?X%6xX!hiyW^` _`DR}_~Vnr̿N^9 §M?;,|l޽{_~޺E8 3ʺRWȈ?#x1""D&rINp=Th"d>݅)QHf[].Sَ̽~!'?Xϐ\@R^k v?uu\yQB?%goϽާ(M~ D귒&a=~7uu6wތD4Uueb.D :xqCZH|SEr 8" {s>ژdX,6DQ./.h}k}W\bYUט/+ u=sDtF!{u9u_+mEo_ϫ0O:azi𻹺-AJіG|||BBB-"DBI.vjPj}vsQe"eh}5ePH&""_#}܂#8TW;-(DuUf;xwoX(!"X-pHZ~bxha- Z-m)=#ruD\~.DF.{uե }FoeD~&$:/£E,zll+dR%afϞZߨ݅R}^j|suuX &2IE΢8O\iRB}c;':X;R  PD{=#RwEW IDATTu n[F3۝@R1h6[^-H/<*k%Z(_ܤ.ot2w&@}H)=311>Qua6j7*(*DD@@Ο?cx-Zͭݳgρx[1 Rzٔn-.Ϫ|Uf N\X}/6巒 ä\%ਝf%eFݖ_[즢^"'T.b7Wj #yFɗ.ӵ2ⵓJ?/K.x0ǵu R pH)R @J.׆Y,^o4[BhRi+G]Y,FӔ7t@[1Lz߿ׯ_'&fF-Ka4O<rymTLpcc6gDk*IENDB`sphinx-data-viewer-0.1.5/docs/_static/sphinx-data-viewer-logo-dark.svg000066400000000000000000000122211466357610300257400ustar00rootroot00000000000000 sphinx-data-viewer-0.1.5/docs/_static/sphinx-data-viewer-logo-light.svg000066400000000000000000000122211466357610300261260ustar00rootroot00000000000000 sphinx-data-viewer-0.1.5/docs/_static/sphinx-data-viewer-logo.png000066400000000000000000000475341466357610300250250ustar00rootroot00000000000000PNG  IHDR~ pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxy\UwuwV a'!,aPWp,*̌⨨H& (D @HJHҝqCϭ:nUytVUw}r g4ߺm06+%3,,Ij p2p`X@ gT"C8je@5A-`?`rmXI|V*gUz:^uq.kW- q[=kʔ' a` Z_R211 9VcecZ}aEB$IiBآB\|2$I)zf ?3]$)"Co7BV8y̢$5C>gQXt!z? S_}&$ |>E!Iʮv`bNmfwTyy_mKr}5 1^'']xG ])ol'S" eSI;)Vj)kpzkpiI- u԰X :Ccrx3%%4'˶p/7g)j]lSITc8= VҼ1Ceԡ76SoKySܥ aB~u4=CǛ5EyLoDˡN7$e轆na">ElR{V%K{ܝ5֒o@~{U{RԵ.am-cgҼA=4K4oBLMkm  "Zm[K@v|Xcsc&TWr,E}6%m(^|y,aծw)ahџ@[FNOX߿$g Zz4ɵh轓t|z Ыn4z%MmFVxo/'~7I =([B{gwZrU &LnzynSږt\@SHw 6"/ح|4zCaiW%+Muws~8a}YU6ϒ]潔=$!/C/]u?tNQlq&w04!_?~ٚ1^NYBo>if72ߞ$e/ˌ/#H7ťu6tkmi%c -!^pQ^sW{4&m93|2>[4Q¼|;6Ej[NqAS A)2VܱOde hn'T5x0Q}1Z$tI4v/f¯%,'t*tϢ{0S+yL kHH6]|QBoSOmKçp|4yqlWBWc9UaJ|nyr:\h?yti+N~۞Fmjf@óFu+лaVS:jk(A|jZb8Q}3pאw>.0ضHQ4g]^Zmw%F5{)'Q3[-jg P<kװv !3 a&C?_d#Gc{m,z)W3—z3=F&+qmCn D+⌣QsGy#)K5pf"Ae gh} hvUwq-f伏J&L{$Wgy9^|VdNm4 CcOFmf@=W\g O9z}=Do;‡)4ZVsL Ȣ١P}kAi ?Bs&3Cb͝~[eS5WdޯBS?E[*CzQSi⌺١3۴v=+3?zLL4ioTޟGmq܊c,A0Y~iN!̑ܖz> a{y-<ڟfeV?U1"sj4g2z٥;5Q;15q_H1Ϡs5slc‰CQ+V[|9Q[͜A&A!Uckp$\C/Fc K·NN-;DeOR #A;O'hG*1ryQS^oRS8UO1"J LH!7ir\gࠢ%K׈wJF+*!V)Q;RG8lT:A;ElSEDm"Bo8p1#M.J)dp^~D'H%Ruk˛] 6+A8bo^0_ 7 % u6K"B?INDm%Wt=x> LV_LCCvЂp6[GԊJO:3+{i+V'jkk}^r\v5M;k"pi.kBDmICd­LI3D{ I*.JCw S W%jߒ=e2;`mM2>A[=q'(=4C3R"C8iֆ: tcF%h||;p?-a=;r%j[&7IJy= FT=aw nZrJaaߒ, >I1p6f ~ OBVkC0znS;N9{T;I^*<6pšY"SmJCM'aXtIL=͛b,,h!0.6 _OGo6rkm-0Z7Yg#kc jh{\1&~uw- ۻO%w>~'4J_,7{-| t.}˄KBuw€3 es½=wf_m~vZ?!`};G_MߝywFnb툂 Կ{)&ƇpOpN|p ½Tf֌:+ ̇*Twх]vOփ7!ZaO:>IKe\x e(।Oez>H8 _MTGa1ˤ7GB8JQLFi(ڀpY3Q{* OP Nu)̬0JSv5b>aE"LBBuҭ4o.! uH} ۋ:/,#E'jdхH-0T> <&Hl(E3)ńͰpvrGхngw ZƄ H5H?Ia:)jZ #?]c=MX)/oH\`DmU +Ԥw?k*&l"B0@mpRy޵ Y p:sV/~_@~_ sIat'K|. [ie mNYOz->=O舒ƄsЃ0+Tp-n"lS%L7q Mf4 aMI^\ =/Las v` 7_i ݁f=0f#̺=azj5H S3afHz;&leZ)z$Lx|a@e=z"mG&΄{y5%]vM]fZ]wO*݄i_ =/ԃ_Nc-:o" bEX:IRXC]c$VYUEƖ]$;H COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4.5H$I$I$-Tyұ;RRV'W*̀%IR'+G׮]{۵^*k#AuUVONvκ#IZ\WV,6 >zjgg灓c/IR=^T>?bĈ\z=8`Mo\j՗?IRT*|51[V/˭:I[ e̙W裏TTnȻ2I2u'̙3k|ə9uԏ~;{ P\#F`Μ9̛7/S7:u;-<裏fT$ItttR[vgyk^;$)6ی)Sd}ږ,Ϙ4)%Ig:gcR0<˓\eHTyTVGd *IR2$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IUt1V^ͽ=… Yx1W.,IF8q"{SLch#t^ok+W]$?o~ƏϱײSOq]$ŋ [yرc.n-s+_'I-dܹ|K_b…ER ~^xR$IYp!YjUѥԥBgٲeE!IOիWxbV\Ype443qY۽Ç3qĢː$"IR =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* C IDATOT]E0ŋsϲl2zzz.I#FF[0uTZ>"2kWtwsSV.GJeȑ{챌?ri[l.EJ^o[oOC-$Z*͛9… .E^<䓼moR]RCZ#ˊ+8s |x%ԥ7n\%H2T*m]xmE I`7KUN 62$IO^t u+!?pKR 8q"9C.%KN7rAq3k,,YRtYTJێۏ8΢KJBׄ 89x'YhK.Z]$ IÆ c6b7g 7,\lT*L<ɓ']$͵==IdIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJ=K]ƠflqS˗盲?I/al5n Vt)33̝[t 'z>$o\5g>\noQ8|8i9iT.)9COME|rKE+Wr=p=˦w, < ܻ`\tVEgzj儋/gHC]-oyd$ᙞrw߳rxR[owQtIzV]|W+.arۇ憇* I Zz5_喢h\.AR"?b)7kն()3+VpۓO]FC =+eEb`A%4SnZ$%׆rcMiY ECOT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =妣R)IߵlE )mwm)7[[t kkCO7bnieHJh*z;Tt cnh\{}Yt^Ut 3mƍ}[t릛rƞ{]F = ʾ[lQt4fp~7S7He4N:7۬R0[m!uomѥHرw ifoozoQHaWme$Utes6۰E1BRMI;͏>9s~E:+v[/wJj*/oJJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$FWͬXrae j5m=ZڴIza92kc E1 OLKn?Q.2fΞɜsxzӬmjd&l=nkHN$bKʅzf39f횢ˑ• Yr!wο/KQ|݊.-)if͟ž˷o'k}̺R2<~ `[XѥHgp??R1GzG.# CO]:T{8sƙECOT*qE!)F]FC =_tT5>淑rפ8uS.CRE0COlK"R 'E0CO0zr9G/IuT:qm*$ =5Şng ;]HcS.{R14;n#u>ӌ>r$ vNvb$Ute릻bT^.>>̜=\S˞ej=l4[ݒmoÑ;ɉNdv(\zM#Qt -aQ=1.Hj}^ޔ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz*2p}W]ƠM;=8#,YO?}˖}^Rd̘;vK&O~5Æ.\zM3pzm]nm/f]wIuubc?[Xt904?f8ŋ.I^3={;t}FPtYIyOOMq 461{w+YE{\sYR$exLJlٓE\=\qہjѥHSV]Jr_.CRs%E<<ொ.CRE{eE ) 3+zx' %s^[t 3'HCŏ]B =b^2$%lSE0COǦ4 kCOT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =墳sx%HJl(]zň2lE!)c(z͸q[]ƍۺf)7;px%HJh(zʹio(I5&2f)7n{0[mu@eHJJRt 3]E!'NgYtIzq_/ Iu5jc_ WCO{ի>A}hK#R)~ocѥ$c)>lN>FڤR$Ejy׻ng.%q뮧Gp-_c֬ XɢKpǘ6!qe}^ilE1 vέ#}Cbٲ'YfenTp-fĬ+zM4iҞLgeJ[[[t)J{z0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$'I* COT$4 =IRiz0$IaIJГ$FWdf>ϟŋYzu%IҐɆnȄ e];vl%5mBo̜9;Ӡ&T*L2c9iӦ]NZ>*W]u^{-===E#ITV3gsa=xF*Z^ww7wꪫ 9r:#dM.#Z˦ʴixPts1EIWr͌3VE#IZg=3l+r-zG}4'O/fѢEE#I6bϲ`L;$QjK.:S 6GgggY=rH=Pvm7ƌ$E緿-즔%IR:Jr̙3??V!M֬YsIRy}~IsJm3fpCױ{\RO`J$IJc p~WW׿_q5 zz׻͛7jJr0,E$5!J3g>OsTR٥ZN&U*M#IRj$XGG W^y .K$I$I$I$I$I$I$I$I$I$I$I$I$I$I$IR)Ut`] %|;Q"w#07Za[ _zG%ԕ9! \gc׵5%izc8'A[R~@:MÀks#儞YEs?J-'vp}5Џ-lm5o#/nppzqEYaV{G S R#x0r?oڗbf赎$XFF.I/}WM땄zIp 0pϺ  ?͹V6 Jx6Vޣ{ETM8e CV{j 1'_;IP}*1/N-'L]8MKg37Ѻgi$D`tBJQ_ / Gf09"< ~vP `~~s6pa0A_%̴3wAY|.S[F N'mLܤ"|>qOG<.ߩÈ0^RŠzp6qnԳQ{ ՛ }@8? 80gDsn"|>7?Cg+'%p_lSGj^jAU*gF +?DO7},&^1]}jNd)U!HF>ǀ3XD  =G1л%>'lCuGvz{a#v[gz͋yM/}f3Co?ՆԿOɷi?v鑾Sߙ?gh?v{۝Zq@qJ7f_ ^LӎA@$˶}{ܜho|Nz#!Af  cZvﯣݏD{IJAXK/Vu_ZE{߯u׊#n.Ɂ,!\OD\ k_ŠexR}lXz0j2o77{H^ͮݺڔSz0]^8ȿñ [EjkJa !Dq~D{?lﶖ0I(qC _xǘ.o |y_^~Ffy! 9YY?ؙ}0P}vlk _G}zֺ90dƈ_&GCB墘:8H;{._dysH$aT?ܛ_}v٪BCxرm,\26lJ8=Wb6C=Ԟn"nDmGwuD_lk1л5w@mK # ,b9&Bo4_JOKā{"o;FS"C6Yur1ŵJ7e5rV} EnE^! /܈o[}B¬1)/%^=S[#۩Rߴ^\Zƿh6jM(ϑmF'frvbCoyLazoFgl ۑm"Bo|˾WDeGD[UBz "۹ZqWv>S MRF檽Fx*jw=0U65q+ 6[lE}lu,cC9؀RL/.[1oЃd`)v^oEU%۸OUOg16#n?ޘ;&Yb>CkӈEAڈ V-篤V}WʫT|ܳOE7aT`c38|p F}LjEaګrخ03f8JR!U#Ruj5E>O讼8m#j5[9=V ԁB/vjg/6K{mN2Bvv:y=0py0vz7?:e8 `gB荡xէYX#$D8-JЍ 3kh3鑏g 9ݨ(/p<$Z)ސ-3 oṜoDļ_CwHK 6A{bZ`! }W]zkyZo+~O6P|hЛ@X/*$y>.H )/+#/`+Gy۔Сa0RyXQt+nKq#=ꭼ\j_?[s^zs 1cӰV 3s~Ge՟11)7+ByGQ&ńY?N!z\ڄ[QÝAs j_: ۉ>>mex|:GeͫzsxPB&^ZCR?6cƖ޶c.mFL硝z>|Ew ajFXرCiHѡAX&$Kڡ`d;1l q|A"0i:{N'v~.Z,Yz^A.a a'$ȯzrt >̠U߳|>3fIiȾA{e:{},v%{}_{x~_<x ޏN1 ^mT_*NvnYw@bWi7T(Ӑ W{z!|gAN;|*cպt jM?k'?"\~eaN̥Ki{4wzxK$IZ4Ѕd&o.}ZG-mgz#oKWEUį\31=I^1g?[A7KckK"YC%~ZO5Fۛ{ﶔA+ndgz;Z¢?]K B/iEO1łyZE/zFc ;4s<|6A; ~hv0@]` ؞ [GE1vu#\ˉG]fڿ}gkA{>Iy7xGmYfCLnjuqZD_ ߔ<~™^'l'r-ՙįcY%\:lt}E:9C}3#:ۮw2 Ծt}6M3^)BB83؟pk$ 'nqss}W[QBH?C!>Gckgg;:^CzWTIsu%n 3[%ܛ3?oćT+Bo%˲wdhݿ5={LH_ՄSm#100[wT.$2Ϸ]Vo*=a"zO~S])Cn g_'S=!, ]%AقJ8o%7'GmMmz:C8Cai&z>+2 n f7{u ݭ4E_ed3p=R6.cp*} 36]F}dzG^u½,m{5WyYՄ#x5ٟ>B혙$I_먵z goEmC)N)p:NOET #A,SޜY ^Gh)8 =A;oeh}qv\Ax~Dd 3EA8{|+k\KI▕+?,cGՈ5z&h34v?F_Gngz>ugbz SגGn+븲!zߍ M,"t =E.BΘ.C- xVihTޡ+xF'_fz3@2:ky=l3>o$ 3a<_TؐЛ+ټtv =i"u;5"ZL}_Y4#6#\Yń! yٚ@f65]A :oBX#.Wmz>TN@&̨bz:8Y?)zc;&Ҭ?awGb3TF&QVv:}aIZ*V.'\n!`_ to define process elements like requirements and specifications. And ``Sphinx-Data-Viewer`` to explain data structures more easily. .. tab-set:: .. tab-item:: Result .. spec:: /api/user return value :id: SPEC_001 :tags: endpoint, user :status: open For our API endpoint ``/api/user`` the default data structure of the return value of a successful GET request shall look like: .. data-viewer:: :expand: { "username": "peterbomber", "email": "peterbomber@my_company.net", "active": true } .. tab-item:: Code .. code-block:: rst .. spec:: /api/user return value :id: SPEC_001 :tags: endpoint, user :status: open For our API endpoint ``/api/user`` the default data structure of the return value of a successful GET request shall look like: .. data-viewer:: :expand: { "username": "peterbomber", "email": "peterbomber@my_company.net", "active": true } Sphinx-Design ~~~~~~~~~~~~~ `Sphinx-Design `_ can be used to bring cards, tabs and dropdowns into your documentation. It can help you to show source code or the data-viewer on user requests only. All the dropdowns and tabs on this side got realised by ``Sphinx-Design``. Take a look into `the current page source <_sources/index.rst.txt>`_ for a bunch of examples. .. tab-set:: .. tab-item:: Result .. grid:: 2 .. grid-item-card:: Data-Viewer 1 ^^^^^^^^^^^^^ .. data-viewer:: :expand: { "name": "Peter", "pets": ["dog", "cat"] } .. grid-item-card:: Data-Viewer 2 ^^^^^^^^^^^^^ .. data-viewer:: :expand: { "name": "Sandra", "pets": ["squirrel"] } .. tab-item:: Code .. code-block:: rst .. grid:: 2 .. grid-item-card:: Data-Viewer 1 ^^^^^^^^^^^^^ .. data-viewer:: :expand: { "name": "Peter", "pets": ["dog", "cat"] } .. grid-item-card:: Data-Viewer 2 ^^^^^^^^^^^^^ .. data-viewer:: :expand: { "name": "Sandra", "pets": ["squirrel"] } License ------- This software project is released under the MIT license. See `LICENSE file `_ for more details. API --- .. automodule:: sphinx_data_viewer.api :members: Kudos ----- The javascript code is based on the wonderful work of https://github.com/pgrabovets/json-view. Changelog --------- 0.1.4 ~~~~~ :released: 25.1.2024 * Bugfix: Fix for builders, which do not support registration of CSS/JS files (e.g. sphinxcontrib-spelling) 0.1.3 ~~~~~ :released: 25.1.2024 * Improvement: Updated project documentation to use the useblocks theme. * Bugfix: Avoids multiple registrations of the same CSS/JS file. 0.1.2 ~~~~~ :released: 07.12.2021 * Bugfix: Fixed wrong handling of windows path. (`#2 `_) 0.1.1 ~~~~~ :released: 30.11.2021 * Improvement: Provides API * Improvement: Restructured code 0.1.0 ~~~~~ :released: 26.11.2021 * Improvement: Provides ``data-viewer`` directive * Improvement: Options added: file, title, data, expand .. toctree:: :hidden: sphinx-data-viewer-0.1.5/docs/make.bat000066400000000000000000000013751466357610300176120ustar00rootroot00000000000000@ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=. set BUILDDIR=_build if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.https://www.sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% :end popd sphinx-data-viewer-0.1.5/docs/test.json000066400000000000000000000460071466357610300200600ustar00rootroot00000000000000[ { "_id": "61a0891a674f1c06f0477709", "index": 0, "guid": "7f878bf5-1b9c-4272-b6ed-00cbd37f8b1d", "isActive": true, "balance": "$1,499.41", "picture": "http://placehold.it/32x32", "age": 26, "eyeColor": "blue", "name": "Kristi Jefferson", "gender": "female", "company": "ZILLATIDE", "email": "kristijefferson@zillatide.com", "phone": "+1 (983) 481-2169", "address": "451 Marconi Place, Temperanceville, Missouri, 3245", "about": "Sint ipsum voluptate pariatur sunt est ad deserunt commodo mollit reprehenderit minim tempor mollit ipsum. Minim mollit nulla aliqua dolor nulla. Laboris duis fugiat et officia amet quis voluptate officia ullamco id. Enim consectetur anim culpa sint sunt ipsum elit do incididunt nostrud elit amet culpa ad.\r\n", "registered": "2014-01-16T10:48:53 -01:00", "latitude": -49.997781, "longitude": 10.96195, "tags": [ "nulla", "duis", "irure", "anim", "nulla", "dolor", "est" ], "friends": [ { "id": 0, "name": "Leticia Garcia" }, { "id": 1, "name": "Hobbs Sanchez" }, { "id": 2, "name": "Keri Elliott" } ], "favoriteFruit": "apple" }, { "_id": "61a0891af9959181625ac7dc", "index": 1, "guid": "3fa0ed52-7d1f-43e1-8ce6-78b605f6b62f", "isActive": true, "balance": "$2,960.79", "picture": "http://placehold.it/32x32", "age": 32, "eyeColor": "blue", "name": "Coffey Beach", "gender": "male", "company": "BUZZNESS", "email": "coffeybeach@buzzness.com", "phone": "+1 (861) 583-2393", "address": "187 Tabor Court, Hemlock, Federated States Of Micronesia, 5566", "about": "Do excepteur excepteur aliquip sint sit pariatur dolore ullamco laboris. Eiusmod qui adipisicing excepteur anim cillum anim in velit id. Veniam cillum minim amet amet reprehenderit irure esse. Aliquip eu ullamco et ex anim. Irure ea dolore ad consectetur laboris consequat mollit eu irure in sit magna consequat. Eu nisi do labore est Lorem aute ea est enim Lorem et veniam sit nisi.\r\n", "registered": "2020-02-12T12:19:06 -01:00", "latitude": 69.935896, "longitude": -107.458737, "tags": [ "enim", "cillum", "dolor", "labore", "elit", "cupidatat", "sit" ], "friends": [ { "id": 0, "name": "Holcomb Adkins" }, { "id": 1, "name": "Taylor Black" }, { "id": 2, "name": "Jennie Ashley" } ], "favoriteFruit": "strawberry" }, { "_id": "61a0891ae91cc10ea4a169ac", "index": 2, "guid": "b63c69bc-f8df-4bee-ba52-c621ec841ea9", "isActive": true, "balance": "$3,209.24", "picture": "http://placehold.it/32x32", "age": 28, "eyeColor": "brown", "name": "Lara Donaldson", "gender": "male", "company": "RODEOLOGY", "email": "laradonaldson@rodeology.com", "phone": "+1 (970) 547-2377", "address": "195 Main Street, Snelling, Kansas, 1379", "about": "Quis minim dolor anim non qui. Culpa eiusmod incididunt veniam excepteur magna voluptate aute. Sunt magna tempor non quis aliqua eiusmod eiusmod duis et. Sunt sit occaecat excepteur deserunt pariatur adipisicing mollit. Et ipsum adipisicing magna dolor commodo veniam culpa incididunt culpa. Mollit veniam fugiat cupidatat est excepteur. Do pariatur eiusmod in qui quis laboris sint ullamco tempor nostrud ut.\r\n", "registered": "2017-08-24T03:13:21 -02:00", "latitude": -27.717817, "longitude": -22.673387, "tags": [ "veniam", "laborum", "nulla", "sit", "aliquip", "consectetur", "velit" ], "friends": [ { "id": 0, "name": "Stefanie Ayers" }, { "id": 1, "name": "Bryan Cervantes" }, { "id": 2, "name": "James Todd" } ], "favoriteFruit": "strawberry" }, { "_id": "61a0891a1a6ee5b221c88f1a", "index": 3, "guid": "8ce04bb5-52df-426d-8cce-57c97fe0f5e2", "isActive": false, "balance": "$2,357.08", "picture": "http://placehold.it/32x32", "age": 36, "eyeColor": "green", "name": "Felicia Meyer", "gender": "female", "company": "SECURIA", "email": "feliciameyer@securia.com", "phone": "+1 (887) 542-2830", "address": "844 Kosciusko Street, Goodville, Wyoming, 1447", "about": "Commodo minim amet pariatur ex ut occaecat enim velit. Sit est et voluptate exercitation. Id enim ipsum non laboris aute pariatur fugiat quis. Dolor esse esse labore laboris ex labore nulla incididunt laborum pariatur ipsum ipsum incididunt non.\r\n", "registered": "2015-01-20T12:02:20 -01:00", "latitude": 18.318437, "longitude": 12.216479, "tags": [ "non", "ad", "aliqua", "adipisicing", "reprehenderit", "incididunt", "excepteur" ], "friends": [ { "id": 0, "name": "Trudy Valentine" }, { "id": 1, "name": "Dennis Hebert" }, { "id": 2, "name": "Rush Weaver" } ], "favoriteFruit": "banana" }, { "_id": "61a0891a52b8a601e208625a", "index": 4, "guid": "5652f03a-8fc9-4bdf-8546-d6cb60b960e5", "isActive": true, "balance": "$2,587.43", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "green", "name": "Walter Lindsay", "gender": "male", "company": "PRIMORDIA", "email": "walterlindsay@primordia.com", "phone": "+1 (906) 573-2128", "address": "497 Jackson Place, Stollings, Connecticut, 3285", "about": "Reprehenderit enim consequat consequat duis. Id reprehenderit laborum minim commodo incididunt sint laboris est ut magna qui aliquip est. Et ad aliquip tempor excepteur in eiusmod aliqua culpa sint quis. Laboris amet ea id voluptate minim nostrud dolore in voluptate enim irure amet et.\r\n", "registered": "2020-10-11T04:13:15 -02:00", "latitude": 55.769158, "longitude": 93.670297, "tags": [ "eiusmod", "mollit", "reprehenderit", "voluptate", "nulla", "eiusmod", "consequat" ], "friends": [ { "id": 0, "name": "Polly Suarez" }, { "id": 1, "name": "Mcbride Holden" }, { "id": 2, "name": "Odonnell Mcknight" } ], "favoriteFruit": "banana" }, { "_id": "61a0891a508c2aefb2397c68", "index": 5, "guid": "fe44f736-7650-4927-b2b7-e59d04446439", "isActive": true, "balance": "$2,373.99", "picture": "http://placehold.it/32x32", "age": 39, "eyeColor": "brown", "name": "Lester Lewis", "gender": "male", "company": "PHORMULA", "email": "lesterlewis@phormula.com", "phone": "+1 (844) 462-2212", "address": "330 Willow Street, Seymour, Virgin Islands, 6905", "about": "Duis consequat tempor est Lorem qui non dolore aliquip est adipisicing. Do aliqua quis ut nulla aute cillum et. Et amet culpa ex nisi. Laborum ad laborum officia Lorem. Deserunt incididunt officia tempor amet culpa consectetur incididunt reprehenderit ad non ipsum occaecat. Anim ipsum exercitation incididunt Lorem.\r\n", "registered": "2015-01-10T08:36:40 -01:00", "latitude": -49.099774, "longitude": -103.954882, "tags": [ "nostrud", "eiusmod", "adipisicing", "occaecat", "officia", "aliqua", "in" ], "friends": [ { "id": 0, "name": "Sheena Kinney" }, { "id": 1, "name": "Marva Dennis" }, { "id": 2, "name": "Leigh Bender" } ], "favoriteFruit": "apple" }, { "_id": "61a0891a05517b2d5083116a", "index": 6, "guid": "9c96d7bc-559b-46d0-a1ad-1b3b7f51e466", "isActive": false, "balance": "$2,718.32", "picture": "http://placehold.it/32x32", "age": 40, "eyeColor": "brown", "name": "Benson Mcconnell", "gender": "male", "company": "OPTICOM", "email": "bensonmcconnell@opticom.com", "phone": "+1 (919) 465-2279", "address": "618 Bills Place, Jugtown, Palau, 7788", "about": "Cillum magna Lorem cillum irure et nulla elit exercitation. Excepteur exercitation exercitation duis culpa ut aliqua ullamco aliqua nisi incididunt exercitation exercitation dolor. Deserunt non enim aute sint sunt id dolore nulla eu cupidatat. Est adipisicing quis enim sint enim veniam ut irure eiusmod ex anim. Ullamco id minim ea mollit qui id.\r\n", "registered": "2020-06-14T09:45:04 -02:00", "latitude": -22.541407, "longitude": 172.579385, "tags": [ "velit", "consectetur", "esse", "anim", "adipisicing", "aute", "reprehenderit" ], "friends": [ { "id": 0, "name": "Bettie Harrington" }, { "id": 1, "name": "Terry Roach" }, { "id": 2, "name": "Bird Davidson" } ], "favoriteFruit": "strawberry" }, { "_id": "61a0891a8c08c1713d406db6", "index": 7, "guid": "c8f79b2a-7cd0-492d-957c-f5cdd089d6a4", "isActive": false, "balance": "$1,926.46", "picture": "http://placehold.it/32x32", "age": 29, "eyeColor": "brown", "name": "Alvarado Melendez", "gender": "male", "company": "CHILLIUM", "email": "alvaradomelendez@chillium.com", "phone": "+1 (800) 442-3551", "address": "103 Ludlam Place, Bainbridge, Georgia, 6493", "about": "Quis labore aliqua dolor reprehenderit cupidatat. Adipisicing anim irure velit commodo fugiat velit laboris cillum fugiat deserunt. Non do sunt consectetur aliquip commodo deserunt commodo pariatur dolor deserunt. Aute ea culpa laborum enim aute ipsum. Consectetur ipsum ex aliqua ex irure qui occaecat. Aute id duis laboris quis ullamco amet veniam voluptate eiusmod reprehenderit aute non. Incididunt labore occaecat culpa ullamco ut exercitation pariatur duis enim velit laboris aliqua eu sint.\r\n", "registered": "2021-06-10T01:25:33 -02:00", "latitude": 11.792983, "longitude": 5.604258, "tags": [ "ea", "do", "minim", "esse", "ipsum", "sint", "ut" ], "friends": [ { "id": 0, "name": "Mcmahon Wilkerson" }, { "id": 1, "name": "Susanne Cotton" }, { "id": 2, "name": "Walsh Chavez" } ], "favoriteFruit": "banana" }, { "_id": "61a0891ab564605bf251d75c", "index": 8, "guid": "622dceb8-895a-440d-b33a-e1ef21d1e6d2", "isActive": true, "balance": "$2,202.26", "picture": "http://placehold.it/32x32", "age": 34, "eyeColor": "brown", "name": "Elisabeth Strickland", "gender": "female", "company": "AQUOAVO", "email": "elisabethstrickland@aquoavo.com", "phone": "+1 (917) 501-3354", "address": "117 Jerome Street, Springville, Delaware, 7395", "about": "Id sit consectetur est pariatur ipsum minim quis nulla eiusmod nulla magna commodo sint. Minim commodo elit minim mollit cupidatat quis minim. Duis commodo ullamco id pariatur enim. Adipisicing ad labore amet eu aute.\r\n", "registered": "2016-03-19T03:48:29 -01:00", "latitude": -32.551099, "longitude": -163.296924, "tags": [ "tempor", "enim", "sit", "ea", "cupidatat", "velit", "aliqua" ], "friends": [ { "id": 0, "name": "Joyce Shaffer" }, { "id": 1, "name": "Simon Riggs" }, { "id": 2, "name": "Jackie Kennedy" } ], "favoriteFruit": "strawberry" }, { "_id": "61a0891a74a88c306c3177fa", "index": 9, "guid": "92b96807-c152-4cdf-ac31-2daa44e859a6", "isActive": false, "balance": "$3,288.68", "picture": "http://placehold.it/32x32", "age": 29, "eyeColor": "green", "name": "Luz Bridges", "gender": "female", "company": "COMTRAIL", "email": "luzbridges@comtrail.com", "phone": "+1 (883) 406-2760", "address": "273 Locust Avenue, Juarez, Virginia, 6678", "about": "Duis proident ullamco fugiat aute mollit enim commodo. In tempor in tempor ex ex id incididunt esse do ea in reprehenderit. Ad anim dolor eu non excepteur sint eu anim ea dolor. Aute laborum occaecat reprehenderit culpa enim.\r\n", "registered": "2014-02-11T01:25:36 -01:00", "latitude": -56.063378, "longitude": 4.041166, "tags": [ "laborum", "anim", "duis", "mollit", "ullamco", "consectetur", "consequat" ], "friends": [ { "id": 0, "name": "Debbie Price" }, { "id": 1, "name": "Bradley Knowles" }, { "id": 2, "name": "Alana Finley" } ], "favoriteFruit": "strawberry" }, { "_id": "61a0891aefee64076b42a964", "index": 10, "guid": "2dce2979-0e6b-4df1-95e9-3afef537e635", "isActive": true, "balance": "$2,029.23", "picture": "http://placehold.it/32x32", "age": 40, "eyeColor": "brown", "name": "Greene Carpenter", "gender": "male", "company": "KOFFEE", "email": "greenecarpenter@koffee.com", "phone": "+1 (848) 405-3406", "address": "658 Cortelyou Road, Clay, Rhode Island, 9355", "about": "Minim nostrud non deserunt adipisicing excepteur ullamco. Ex mollit pariatur reprehenderit elit ullamco est irure officia culpa id. Lorem eu Lorem ut dolore minim cupidatat. Exercitation culpa pariatur in exercitation nulla laboris minim do qui consectetur deserunt culpa nulla incididunt. Esse veniam reprehenderit Lorem eu proident officia duis officia in aliqua eiusmod. Minim cillum exercitation laboris ea est sint dolor ipsum.\r\n", "registered": "2014-08-31T06:52:58 -02:00", "latitude": -29.658821, "longitude": 71.814451, "tags": [ "cupidatat", "ipsum", "ipsum", "ipsum", "cillum", "Lorem", "sunt" ], "friends": [ { "id": 0, "name": "Haley Richmond" }, { "id": 1, "name": "Rogers Case" }, { "id": 2, "name": "Hewitt Fisher" } ], "favoriteFruit": "strawberry" }, { "_id": "61a0891a6e0a0070b0863f7c", "index": 11, "guid": "8c55ee96-81b4-46a2-8555-1d65566475da", "isActive": true, "balance": "$3,006.50", "picture": "http://placehold.it/32x32", "age": 36, "eyeColor": "brown", "name": "Selma Terrell", "gender": "female", "company": "EARTHPLEX", "email": "selmaterrell@earthplex.com", "phone": "+1 (920) 520-3529", "address": "194 Adelphi Street, Mayfair, North Dakota, 546", "about": "Ex nostrud aute officia magna laboris mollit sit aliqua qui incididunt voluptate. Dolore anim sunt duis ut eiusmod ex qui. Id quis cillum Lorem esse do exercitation esse sunt nisi voluptate sit non. Reprehenderit voluptate deserunt nisi consectetur deserunt aute ea aliquip eu.\r\n", "registered": "2020-03-10T01:47:01 -01:00", "latitude": -47.548179, "longitude": 117.412115, "tags": [ "minim", "in", "exercitation", "minim", "veniam", "occaecat", "nulla" ], "friends": [ { "id": 0, "name": "Hahn Brennan" }, { "id": 1, "name": "Raquel Tran" }, { "id": 2, "name": "Bradshaw Winters" } ], "favoriteFruit": "banana" }, { "_id": "61a0891a2b62527ed7cdf215", "index": 12, "guid": "ca32e606-24e0-4a8d-8436-3ae18457eb19", "isActive": false, "balance": "$1,804.99", "picture": "http://placehold.it/32x32", "age": 28, "eyeColor": "blue", "name": "Mckinney Mcmillan", "gender": "male", "company": "PULZE", "email": "mckinneymcmillan@pulze.com", "phone": "+1 (850) 401-3836", "address": "164 Knickerbocker Avenue, Virgie, Colorado, 5807", "about": "Dolore aute deserunt in eu enim sint est ipsum fugiat pariatur sunt nisi eu ea. Occaecat aute veniam adipisicing ad sunt est quis veniam eiusmod consequat fugiat commodo. Commodo elit aliqua nisi cillum quis quis laboris minim dolor magna id in.\r\n", "registered": "2019-12-09T04:12:53 -01:00", "latitude": 38.619051, "longitude": 31.515656, "tags": [ "quis", "dolore", "ullamco", "excepteur", "reprehenderit", "in", "ad" ], "friends": [ { "id": 0, "name": "Cleveland Lamb" }, { "id": 1, "name": "Kerr Vasquez" }, { "id": 2, "name": "Dorsey Campos" } ], "favoriteFruit": "banana" }, { "_id": "61a0891a8bc3ddae13479c18", "index": 13, "guid": "8ea88318-e049-4de6-ac0e-99ed0a87afa1", "isActive": false, "balance": "$2,233.27", "picture": "http://placehold.it/32x32", "age": 28, "eyeColor": "blue", "name": "Hazel Campbell", "gender": "female", "company": "HOMELUX", "email": "hazelcampbell@homelux.com", "phone": "+1 (821) 451-2983", "address": "374 Maujer Street, Cetronia, Oregon, 9926", "about": "Dolore ut elit minim proident excepteur excepteur magna cillum officia adipisicing proident deserunt. Consectetur ipsum minim ex elit. Ut consequat ut nostrud aliqua fugiat in esse tempor qui.\r\n", "registered": "2015-02-18T11:25:44 -01:00", "latitude": -24.219396, "longitude": 47.247109, "tags": [ "magna", "eiusmod", "dolore", "labore", "est", "in", "nulla" ], "friends": [ { "id": 0, "name": "Eddie Ortiz" }, { "id": 1, "name": "Lena Gillespie" }, { "id": 2, "name": "Cummings Heath" } ], "favoriteFruit": "apple" }, { "_id": "61a0891a55c66f848a09012b", "index": 14, "guid": "0c6f1ca4-9409-403c-a2f8-05cf6557fd1f", "isActive": true, "balance": "$3,372.21", "picture": "http://placehold.it/32x32", "age": 24, "eyeColor": "blue", "name": "Irma Stevens", "gender": "female", "company": "GENEKOM", "email": "irmastevens@genekom.com", "phone": "+1 (936) 539-2186", "address": "499 Sutton Street, Savannah, New Mexico, 5482", "about": "Aute aliqua esse aute magna eu nostrud incididunt id nulla ea irure incididunt sunt. Reprehenderit ipsum sunt sint est sunt ullamco ad mollit incididunt est velit ad dolore sunt. Mollit anim ipsum sint elit ea. Tempor culpa deserunt minim fugiat anim commodo aliquip est occaecat. Ex mollit laboris pariatur ullamco ex ex laboris est adipisicing est sunt.\r\n", "registered": "2020-04-22T12:38:00 -02:00", "latitude": -39.660368, "longitude": 162.640521, "tags": [ "laborum", "laboris", "irure", "do", "enim", "dolor", "nulla" ], "friends": [ { "id": 0, "name": "Sharlene Flores" }, { "id": 1, "name": "Graham Britt" }, { "id": 2, "name": "Jeannie Oneal" } ], "favoriteFruit": "strawberry" } ] sphinx-data-viewer-0.1.5/pyproject.toml000066400000000000000000000041641466357610300201700ustar00rootroot00000000000000[build-system] requires = ["flit_core >=3.4,<4"] build-backend = "flit_core.buildapi" [project] name = "sphinx-data-viewer" dynamic = ["version", "description"] authors = [{ "name" = "team useblocks", "email" = "info@useblocks.com" }] license = { file = "LICENSE" } readme = "README.rst" classifiers = [ "Development Status :: 4 - Beta", "Framework :: Sphinx :: Extension", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup", ] requires-python = ">=3.8" dependencies = ["sphinx>=5"] [project.urls] Homepage = "https://github.com/useblocks/sphinx-data-viewer" Documentation = "https://sphinx-data-viewer.readthedocs.io/en/latest/" [project.optional-dependencies] docs = [ "furo", "sphinx-design", "sphinx-needs", "sphinxcontrib.plantuml", "sphinx-copybutton", ] test = ["pytest", "pytest-cov"] [tool.ruff.lint] extend-select = [ "B", # flake8-bugbear "C4", # flake8-comprehensions "I", # isort "ICN", # flake8-import-conventions "ISC", # flake8-implicit-str-concat "N", # pep8-naming "RUF", # Ruff-specific rules "SIM", # flake8-simplify "UP", # pyupgrade ] extend-ignore = ["ISC001", "RUF012"] [tool.pytest.ini_options] filterwarnings = ["error::DeprecationWarning"] [tool.tox] # To use tox, see https://tox.readthedocs.io # $ pipx install tox # it is suggested to use with https://github.com/tox-dev/tox-uv # $ pipx inject tox tox-uv legacy_tox_ini = """ [tox] envlist = py38 [testenv] usedevelop = true [testenv:py{38,39,310,311,312}] extras = test commands = pytest {posargs:--cov=src} [testenv:docs] extras = docs passenv = BUILDER CLEAN TERM commands_pre = python -c "import shutil; shutil.rmtree('docs/_build/{env:BUILDER:html}', ignore_errors=True) if '{env:CLEAN:}' else None" commands = sphinx-build -nW --keep-going -b {env:BUILDER:html} docs/ docs/_build/{env:BUILDER:html} {posargs:-T} """ sphinx-data-viewer-0.1.5/src/000077500000000000000000000000001466357610300160365ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/000077500000000000000000000000001466357610300217215ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/__init__.py000066400000000000000000000002331466357610300240300ustar00rootroot00000000000000""" "Sphinx extension to show data in an interactive list view.""" from sphinx_data_viewer.sphinx_data_viewer import setup # NOQA __version__ = "0.1.5" sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/api.py000066400000000000000000000014021466357610300230410ustar00rootroot00000000000000""" Small API to create Data-Viewer nodes from other Sphinx extensions """ import json from sphinx_data_viewer.directive import DataViewerNode def get_data_viewer_node(title, data, expand=True): """ Returns a docutils node, which represents a configured data-viewer. :param title: Title for the viewer as string :param data: Data as python objects, which must be serializable by json.dumps() :param expand: True or False as boolean. If True all data will be shown. :return: Configured DataViewerNode instance """ viewer_node = DataViewerNode() viewer_node["title"] = str(title) viewer_node["data"] = json.dumps(data) viewer_node["expand"] = str(expand) viewer_node["classes"] = ["sdv-data"] return viewer_node sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/assets/000077500000000000000000000000001466357610300232235ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/assets/jsonview.bundle.css000066400000000000000000000026431466357610300270560ustar00rootroot00000000000000/* ReadTheDocs fixes*/ .fa-caret-down::before, .fa-caret-right::before { content: None !important; } .json-container { font-family: 'Open Sans'; font-size: 16px; background-color: transparent; color: #808080; box-sizing: border-box; } .json-container .line { margin: 4px 0; display: flex; justify-content: flex-start; } .json-container .caret-icon { width: 18px; text-align: center; cursor: pointer; } .json-container .empty-icon { width: 18px; } .json-container .json-type { margin-right: 4px; margin-left: 4px; } .json-container .json-key { color: #444; margin-right: 4px; margin-left: 4px; } .json-container .json-index { margin-right: 4px; margin-left: 4px; } .json-container .json-value { margin-left: 8px; } .json-container .json-number { color: #f9ae58; } .json-container .json-boolean { color: #ec5f66; } .json-container .json-string { color: #86b25c; } .json-container .json-size { margin-right: 4px; margin-left: 4px; } .json-container .hide { display: none; } .json-container .fas { display: inline-block; width: 0; height: 0; border-style: solid; } .json-container .fa-caret-down { border-width: 6px 5px 0 5px; border-color: #808080 transparent; } .json-container .fa-caret-right { border-width: 5px 0 5px 6px; border-color: transparent transparent transparent #808080; } sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/assets/jsonview.bundle.js000066400000000000000000000141751466357610300267050ustar00rootroot00000000000000var JsonView = (function (exports) { 'use strict'; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function expandedTemplate() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var key = params.key, size = params.size; return "\n
\n
\n
".concat(key, "
\n
").concat(size, "
\n
\n "); } function notExpandedTemplate() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var key = params.key, value = params.value, type = params.type; return "\n
\n
\n
".concat(key, "
\n
:
\n
").concat(value, "
\n
\n "); } function hideNodeChildren(node) { node.children.forEach(function (child) { child.el.classList.add('hide'); if (child.isExpanded) { hideNodeChildren(child); } }); } function showNodeChildren(node) { node.children.forEach(function (child) { child.el.classList.remove('hide'); if (child.isExpanded) { showNodeChildren(child); } }); } function setCaretIconDown(node) { if (node.children.length > 0) { var icon = node.el.querySelector('.fas'); if (icon) { icon.classList.replace('fa-caret-right', 'fa-caret-down'); } } } function setCaretIconRight(node) { if (node.children.length > 0) { var icon = node.el.querySelector('.fas'); if (icon) { icon.classList.replace('fa-caret-down', 'fa-caret-right'); } } } function toggleNode(node) { if (node.isExpanded) { node.isExpanded = false; setCaretIconRight(node); hideNodeChildren(node); } else { node.isExpanded = true; setCaretIconDown(node); showNodeChildren(node); } } function createContainerElement() { var el = document.createElement('div'); el.className = 'json-container'; return el; } function createNodeElement(node) { var el = document.createElement('div'); var getSizeString = function getSizeString(node) { var len = node.children.length; if (node.type === 'array') return "[".concat(len, "]"); if (node.type === 'object') return "{".concat(len, "}"); return null; }; if (node.children.length > 0) { el.innerHTML = expandedTemplate({ key: node.key, size: getSizeString(node) }); var caretEl = el.querySelector('.caret-icon'); caretEl.addEventListener('click', function () { toggleNode(node); }); } else { el.innerHTML = notExpandedTemplate({ key: node.key, value: node.value, type: _typeof(node.value) }); } var lineEl = el.children[0]; if (node.parent !== null) { lineEl.classList.add('hide'); } lineEl.style = 'margin-left: ' + node.depth * 18 + 'px;'; return lineEl; } function getDataType(val) { var type = _typeof(val); if (Array.isArray(val)) type = 'array'; if (val === null) type = 'null'; return type; } function traverseTree(node, callback) { callback(node); if (node.children.length > 0) { node.children.forEach(function (child) { traverseTree(child, callback); }); } } function createNode() { var opt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return { key: opt.key || null, parent: opt.parent || null, value: opt.hasOwnProperty('value') ? opt.value : null, isExpanded: opt.isExpanded || false, type: opt.type || null, children: opt.children || [], el: opt.el || null, depth: opt.depth || 0 }; } function createSubnode(data, node) { if (_typeof(data) === 'object') { for (var key in data) { var child = createNode({ value: data[key], key: key, depth: node.depth + 1, type: getDataType(data[key]), parent: node }); node.children.push(child); createSubnode(data[key], child); } } } function createTree(jsonData) { var data = typeof jsonData === 'string' ? JSON.parse(jsonData) : jsonData; var rootNode = createNode({ value: data, key: getDataType(data), type: getDataType(data) }); createSubnode(data, rootNode); return rootNode; } function renderJSON(jsonData, targetElement) { var parsedData = typeof jsonData === 'string' ? JSON.parse(jsonData) : jsonData; var tree = createTree(parsedData); render(tree, targetElement); return tree; } function render(tree, targetElement) { var containerEl = createContainerElement(); traverseTree(tree, function (node) { node.el = createNodeElement(node); containerEl.appendChild(node.el); }); targetElement.appendChild(containerEl); } function expandChildren(node) { traverseTree(node, function (child) { child.el.classList.remove('hide'); child.isExpanded = true; setCaretIconDown(child); }); } function collapseChildren(node) { traverseTree(node, function (child) { child.isExpanded = false; if (child.depth > node.depth) child.el.classList.add('hide'); setCaretIconRight(child); }); } exports.collapseChildren = collapseChildren; exports.createTree = createTree; exports.expandChildren = expandChildren; exports.render = render; exports.renderJSON = renderJSON; exports.traverseTree = traverseTree; return exports; }({})); sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/assets/jsonview_loader.js000066400000000000000000000006541466357610300267600ustar00rootroot00000000000000$(document).ready(function() { $("div.sdv-data").each(function(index){ let data = $(this).attr('data-sdv') let expand = $(this).attr('data-expand') try { let tree = JsonView.createTree(data); JsonView.render(tree, $(this)[0]); if(expand==="True") { JsonView.expandChildren(tree); } } catch(e) { $(this).html('

Error: Could not parse json data

') } }) } ); sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/directive.py000066400000000000000000000045531466357610300242600ustar00rootroot00000000000000import json import os from docutils import nodes from docutils.parsers.rst import directives from sphinx.util.docutils import SphinxDirective class DataViewerNode(nodes.General, nodes.Element): pass class DataViewerDirective(SphinxDirective): has_content = True optional_arguments = 1 final_argument_whitespace = True option_spec = { "file": directives.unchanged, "data": directives.unchanged, "title": directives.unchanged, "expand": directives.flag, } def __init__(self, *args, **kw): super().__init__(*args, **kw) def run(self): env = self.state.document.settings.env data_string = "\n".join(self.content) data_expand = self.options.get("expand", False) is None data_option = self.options.get("data", None) if data_option and data_option in env.config["data_viewer_data"]: data_string = json.dumps(env.config["data_viewer_data"][data_option]) file_option = self.options.get("file", None) if file_option: if not os.path.isabs(file_option): file_dir = os.path.dirname(self.state.document.current_source) file_option = os.path.join(file_dir, file_option) with open(file_option) as file_obj: # we load the data as json to be sure that it is really json data. data_string = json.dumps(json.load(file_obj)) container = nodes.container(classes=["sphinx-data-viewer"]) self.set_source_info(container) data_container = DataViewerNode(classes=["sdv-data"]) data_container["data"] = data_string data_container["expand"] = data_expand data_container["title"] = self.options.get("title", "") container.append(data_container) return [container] def html_visit(self, node): self.body.append(f"

{node.attributes['title']}

") self.body.append( f"
" ) def html_depart(self, node): pass def skip_visit(self, node): from .sphinx_data_viewer import LOGGER LOGGER.warning( "sphinx-data-viewer does not support this builder", type="sphinx-data-viewer", location=node, ) raise nodes.SkipNode sphinx-data-viewer-0.1.5/src/sphinx_data_viewer/sphinx_data_viewer.py000066400000000000000000000047171466357610300261670ustar00rootroot00000000000000from pathlib import Path from sphinx import version_info as sphinx_version from sphinx.application import Sphinx from sphinx.util.fileutil import copy_asset from sphinx.util.logging import getLogger from sphinx_data_viewer.directive import ( DataViewerDirective, DataViewerNode, html_depart, html_visit, skip_visit, ) LOGGER = getLogger(__name__) def setup(app: Sphinx): from . import __version__ app.add_config_value("data_viewer_data", {}, "html") app.add_node( DataViewerNode, html=(html_visit, html_depart), latex=(skip_visit, None), text=(skip_visit, None), man=(skip_visit, None), texinfo=(skip_visit, None), epub=(skip_visit, None), ) app.add_directive("data-viewer", DataViewerDirective) app.connect("env-updated", install_lib_static_files) return { "version": __version__, "parallel_read_safe": True, "parallel_write_safe": True, } def install_lib_static_files(app: Sphinx, env) -> None: """Copies css and js files to the output directory and adds them to the builder.""" if app.builder.format != "html": return LOGGER.info("Copying static files for sphinx-data-viewer support") statics_dir = Path(app.builder.outdir) / "_static" source_dir = Path(__file__).parent / "assets" destination_dir = statics_dir / "sphinx-data-viewer" copy_asset(str(source_dir), str(destination_dir)) lib_path = Path("sphinx-data-viewer") _add_js_file(app, lib_path.joinpath("jsonview.bundle.js")) _add_js_file(app, lib_path.joinpath("jsonview_loader.js")) _add_css_file(app, lib_path.joinpath("jsonview.bundle.css")) def _add_css_file(app: Sphinx, rel_path: Path) -> None: # note this deduplication is already done in Sphinx v7.2.1+ # https://github.com/sphinx-doc/sphinx/commit/0c22d9c9ff4a0a6b3ce2f0aa6bc591b4525b4163 rel_str = rel_path.as_posix() if sphinx_version < (7, 2) and f"_static/{rel_str}" in getattr( app.builder, "css_files", [] ): return app.add_css_file(rel_str) def _add_js_file(app: Sphinx, rel_path: Path) -> None: # note this deduplication is already done in Sphinx v7.2.1+ # https://github.com/sphinx-doc/sphinx/commit/0c22d9c9ff4a0a6b3ce2f0aa6bc591b4525b4163 rel_str = rel_path.as_posix() if sphinx_version < (7, 2) and f"_static/{rel_str}" in getattr( app.builder, "script_files", [] ): return app.add_js_file(rel_str) sphinx-data-viewer-0.1.5/tests/000077500000000000000000000000001466357610300164115ustar00rootroot00000000000000sphinx-data-viewer-0.1.5/tests/conftest.py000066400000000000000000000000531466357610300206060ustar00rootroot00000000000000pytest_plugins = "sphinx.testing.fixtures" sphinx-data-viewer-0.1.5/tests/test_basic.py000066400000000000000000000034371466357610300211120ustar00rootroot00000000000000from __future__ import annotations from pathlib import Path from textwrap import dedent import pytest from sphinx import version_info from sphinx.testing.util import SphinxTestApp @pytest.mark.parametrize( "builder", ["html", "singlehtml", "dirhtml", "latex", "text", "man", "epub"] ) def test_build(builder: str, tmp_path: Path, make_app: type[SphinxTestApp]): """ Tests a build via the Sphinx Build API. It looks like that there are scenarios where this specific build makes trouble but no others. """ tmp_path.joinpath("conf.py").write_text( dedent("""\ extensions = ["sphinx_data_viewer"] """), encoding="utf-8", ) tmp_path.joinpath("test.json").write_text('{"a": [1, 2, 3]}', encoding="utf-8") tmp_path.joinpath("index.rst").write_text( dedent("""\ Title ===== .. data-viewer:: :expand: {"a": 1, "b": 2} .. data-viewer:: :file: test.json """), encoding="utf-8", ) if version_info >= (7, 2): src_dir = tmp_path builddir = tmp_path / "_build" else: from sphinx.testing.path import path src_dir = path(str(tmp_path)) builddir = path(str(tmp_path / "_build")) sphinx_app = make_app( srcdir=src_dir, builddir=builddir, buildername=builder, ) sphinx_app.build() assert sphinx_app.statuscode == 0 if builder in ("html", "singlehtml", "dirhtml"): assert sphinx_app._warning.getvalue() == "" else: # print(sphinx_app._warning.getvalue()) assert ( "index.rst:4: WARNING: sphinx-data-viewer does not support this builder" in sphinx_app._warning.getvalue() )