From f784295948cbb65e5c3e850da9b6148f94785172 Mon Sep 17 00:00:00 2001 From: Gioxx Date: Wed, 20 Jan 2021 18:34:07 +0100 Subject: [PATCH 001/325] Hello World --- .eslintrc.json | 40 - .gitignore | 7 - .prettierrc | 10 - 7.1.6.1.zip | Bin 0 -> 384809 bytes Gruntfile.js | 117 - README.md | 78 +- crowdin.yml | 3 + package-lock.json | 3664 --------- package.json | 49 - src/_locales/de/messages.json | 975 ++- src/_locales/en/messages.json | 22 +- src/_locales/it/messages.json | 734 ++ src/_locales/pt_BR/messages.json | 972 ++- src/_locales/pt_PT/messages.json | 972 ++- src/_locales/ru/messages.json | 972 ++- src/_locales/tr/messages.json | 972 ++- src/_locales/zh_CN/messages.json | 972 ++- src/_locales/zh_TW/messages.json | 972 ++- src/about.html | 13 +- src/broken.html | 6 +- src/debug.html | 2 +- src/img/ic_suspendy_128x128.png | Bin 1924 -> 14685 bytes src/img/ic_suspendy_128x128.xcf | Bin 0 -> 12429 bytes src/img/ic_suspendy_16x16.png | Bin 406 -> 6606 bytes src/img/ic_suspendy_16x16_grey.png | Bin 388 -> 6168 bytes src/img/ic_suspendy_32x32.png | Bin 777 -> 8052 bytes src/img/ic_suspendy_32x32.xcf | Bin 0 -> 3578 bytes src/img/ic_suspendy_32x32_grey.png | Bin 657 -> 6933 bytes src/img/ic_suspendy_32x32_grey.xcf | Bin 0 -> 3623 bytes src/img/ic_suspendy_48x48.png | Bin 898 -> 12347 bytes src/img/ic_suspendy_48x48.xcf | Bin 0 -> 4918 bytes src/img/marvellous.png | Bin 0 -> 20624 bytes src/img/snoozy_tab.svg | 145 +- src/img/snoozy_tab_awake.svg | 127 +- src/img/snoozy_tab_awake_original.svg | 12 + src/img/snoozy_tab_original.svg | 15 + src/img/suspendy-guy-alt.png | Bin 14023 -> 27122 bytes src/img/suspendy-guy-oops.png | Bin 12545 -> 28958 bytes src/img/suspendy-guy-uh-oh.png | Bin 10735 -> 27719 bytes src/img/suspendy-guy.png | Bin 27570 -> 31867 bytes src/js/about.js | 3 +- src/js/background.js | 81 +- src/js/bck/about.js | 28 + src/js/bck/background.js | 1915 +++++ src/js/bck/broken.js | 32 + src/js/bck/debug.js | 148 + src/js/{ => bck}/gsAnalytics.js | 92 +- src/js/bck/gsStorage.js | 412 + src/js/bck/gsUtils.js | 905 ++ src/js/bck/history.js | 262 + src/js/bck/notice.js | 29 + src/js/bck/options.js | 251 + src/js/bck/permissions.js | 28 + src/js/bck/recovery.js | 175 + src/js/bck/restoring-window.js | 16 + src/js/bck/shortcuts.js | 49 + src/js/broken.js | 3 +- src/js/debug.js | 3 +- src/js/gsCleanScreencaps.js | 91 - src/js/gsSession.js | 30 +- src/js/gsStorage.js | 58 +- src/js/gsTabSuspendManager.js | 35 +- src/js/gsUtils.js | 1 - src/js/history.js | 3 +- src/js/html2canvas.js | 7274 ----------------- src/js/notice.js | 3 +- src/js/options.js | 57 +- src/js/permissions.js | 3 +- src/js/recovery.js | 3 +- src/js/restoring-window.js | 3 +- src/js/shortcuts.js | 3 +- src/js/tests/fixture_currentSessions.json | 134 - src/js/tests/fixture_previewUrls.json | 3 - src/js/tests/fixture_savedSessions.json | 134 - ...test_createAndUpdateSessionRestorePoint.js | 141 - src/js/tests/test_currentSessions.js | 97 - src/js/tests/test_gsChrome.js | 457 -- src/js/tests/test_gsTabQueue.js | 277 - src/js/tests/test_gsUtils.js | 146 - src/js/tests/test_savedSessions.js | 100 - src/js/tests/test_suspendTab.js | 40 - src/js/tests/test_trimDbItems.js | 71 - src/js/tests/test_updateCurrentSession.js | 57 - src/js/tests/tests.js | 106 - src/js/update.js | 82 + src/managed-storage-schema.json | 65 - src/manifest.json | 13 +- src/options.html | 19 - src/suspended.html | 2 +- src/tests.html | 34 - src/update.html | 42 + src/updated.html | 2 +- 92 files changed, 10655 insertions(+), 15214 deletions(-) delete mode 100644 .eslintrc.json delete mode 100644 .prettierrc create mode 100644 7.1.6.1.zip delete mode 100644 Gruntfile.js create mode 100644 crowdin.yml delete mode 100644 package-lock.json delete mode 100644 package.json create mode 100644 src/_locales/it/messages.json create mode 100644 src/img/ic_suspendy_128x128.xcf create mode 100644 src/img/ic_suspendy_32x32.xcf create mode 100644 src/img/ic_suspendy_32x32_grey.xcf create mode 100644 src/img/ic_suspendy_48x48.xcf create mode 100644 src/img/marvellous.png create mode 100644 src/img/snoozy_tab_awake_original.svg create mode 100644 src/img/snoozy_tab_original.svg create mode 100644 src/js/bck/about.js create mode 100644 src/js/bck/background.js create mode 100644 src/js/bck/broken.js create mode 100644 src/js/bck/debug.js rename src/js/{ => bck}/gsAnalytics.js (69%) create mode 100644 src/js/bck/gsStorage.js create mode 100644 src/js/bck/gsUtils.js create mode 100644 src/js/bck/history.js create mode 100644 src/js/bck/notice.js create mode 100644 src/js/bck/options.js create mode 100644 src/js/bck/permissions.js create mode 100644 src/js/bck/recovery.js create mode 100644 src/js/bck/restoring-window.js create mode 100644 src/js/bck/shortcuts.js delete mode 100644 src/js/gsCleanScreencaps.js delete mode 100644 src/js/html2canvas.js delete mode 100644 src/js/tests/fixture_currentSessions.json delete mode 100644 src/js/tests/fixture_previewUrls.json delete mode 100644 src/js/tests/fixture_savedSessions.json delete mode 100644 src/js/tests/test_createAndUpdateSessionRestorePoint.js delete mode 100644 src/js/tests/test_currentSessions.js delete mode 100644 src/js/tests/test_gsChrome.js delete mode 100644 src/js/tests/test_gsTabQueue.js delete mode 100644 src/js/tests/test_gsUtils.js delete mode 100644 src/js/tests/test_savedSessions.js delete mode 100644 src/js/tests/test_suspendTab.js delete mode 100644 src/js/tests/test_trimDbItems.js delete mode 100644 src/js/tests/test_updateCurrentSession.js delete mode 100644 src/js/tests/tests.js create mode 100644 src/js/update.js delete mode 100644 src/managed-storage-schema.json delete mode 100644 src/tests.html create mode 100644 src/update.html diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 70ef4de1..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "root": true, - "parserOptions": { - "ecmaVersion": 2017 - }, - "env": { - "browser": true, - "es6": true, - "webextensions": true - }, - "extends": [ - "eslint:recommended", - "prettier" - ], - "rules": { - "no-console": 0, - "no-unused-vars": [ - "error", - { "vars": "all", "args": "none", "ignoreRestSiblings": false } - ], - "no-undef": ["error"], - "no-proto": ["error"], - // "prefer-arrow-callback": ["warn"], TODO: refactor to use arrow functions - // "no-var": ["error"], TODO: refactor to use let and const - "prefer-spread": ["warn"], -// "semi": ["error", "always"], - "padded-blocks": ["off", { "blocks": "never" }], -// "indent": ["error", 2], - "one-var": ["off", "never"], - "spaced-comment": ["off", "always"] -// "space-before-function-paren": [ -// "error", -// { -// "anonymous": "always", -// "named": "never", -// "asyncArrow": "always" -// } -// ] - } -} diff --git a/.gitignore b/.gitignore index 2284fa15..ab6af58d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,2 @@ **/Thumbs.db -**/*.pem -/node_modules -/assets/* -/build/* -/.idea/* -/.debris/* -build/zip/thegreatsuspender-6.30-dev/welcome.html .DS_Store diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index ad173d4c..00000000 --- a/.prettierrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "_COMMENT1": "THE BELOW SHOULD BE THE DEFAULTS BUT IT'S NICE TO SEE WHAT THEY ARE", - "printWidth": 80, - "tabWidth": 2, - - - "_COMMENT2": "THE BELOW OVERRIDE PRETTIER'S DEFAULTS", - "singleQuote": true, - "trailingComma": "es5", -} diff --git a/7.1.6.1.zip b/7.1.6.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..fa0668f4641dc9a0f71efd1773ede0648a894279 GIT binary patch literal 384809 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 t>o)9}Lr9nuT_Y~aK~Xh;Qi`ixIA>B(=C zOBF|t{N6jIRZBmj!3!e%QWC2~y(&dJqOXKA5AJfoL3sHp0t~27K^w>`T@UN6orkt`l4z8UIsESVjA?*(=2NIO~}R0mSM_)bRJD zY;a4*5*Fm>r6ND=7z7_gZU=#^6ODAn8HQ#>UIL!|n$ENn{h5&DIyHEN&TugyRw@Gh zy1oF0KzYA4>H8uD)XXJcYiDAhzmbf7zQ=}~$iEyBSoz?geL4knjqp>>sX!4lo{)<|eLh!}FC2Jf2C3wP#+Q-B3@(}$%0J|_!rOy&!ITCfmwGY5ghX1vsoyf_zTyhMzL8k@ zcitxQ(4=Kp6R+5MP<)=52=-|Nv0j5Op8Ml-o4^_mYKZpa?*TO1%hrW>m7ofjS197j zCx>v*FnX=_`gsqxyNb7jmEmN0&$_5~1bHdcTLA-R!Uk8k9vW0q!n}Nz6#(_~Eb=w< z9GbEr8Chf5x0yC_u48B-=9n;HDC_2H6kJL{eq_X&IW@fO!RkftV=Fp*rD#_h3f~9N zJR?hOI{bV;n6TRF>#HOqKGB*V4SViLwOu^IUJ5c=P@(aY4`SXJmE#sRx+r`RfJ`L! zUbo$a!vS7J;w0A3o9&V_K`@5Go~F1TsF8g<13eQ~(fgjA z`bcy9=r>IBINA^?pv$wbVsI`|`5ODB_<<;R{=u|qKw{!lX8S~!YxI`0M|usJ0GDTH zZt2r^*TC;1eb2?Kna?)d5{U)s?=r+w)@v24jDgVV3wfU>W`}dVm0fd=jGYF}$A+Ka zsUDF#;*Y8hlJ^>5`t9}PozVC{x6= zOdA8F9b|CKm?vn-^rn77x`u=nFeCRY#fU)Y#IeEU{mk*Ael;OC ze0>P=+o<}wN!(F=ny}v^mt*u#0 z95!XX&+p^zUv)O{n3vjA*_(~_VXu^^vxE zdFC`IYHH|%4&s>hQ!llNTdJ48eYSwsjnl-iQef&c-I*8pK_A0iH{aasd{!@h@3D|^ z&6VSQv%o;GQYMFZUEbl)as-;lF`uy?nCEiEl1cfrd{`@?_U!sjyHt2rXcB+lD7V?4 zIzgr=5jxCQ>(v(u8m z6QVJ;E-0rIcq}%!jI6cqBi}|~HL{ip3-4?SM@NHnp31sKjVH-8u0L+sIoVhAsb^gC zPF6-d=}yg6llXOln?Ch~J1*ZD`iy}5G2 z#$12COx=^P-U9C;iw+D*KqTI|q^zn)wmMSSP&zzVKymvuC=GSs;^1sNQ&Zpu`N`~~ zUyNk1t4G5XTp8pi8jHxZTc$GUFVi4Kq+K5_z2TMr9JsH!8<+~TD;ap&0oKcN#oiyw z0*hBQ&XzMGG;*8*W@W+zk$r(W^ol~N_N+<&HN%DejjYQ{Q!@MImbyBAnZtg~C`q=VR+VW2ej9KB z`Yuy2OLe-=xcocp*Zq$fiL37kDX zxsGi+K^C*3_2cXs%Be=$Z5&Mm$< zujtKKQJ0y8Jx1?tNu`Ad%uZeqmkk zOd1TL?XTs1ffT1C&1e^m%YIblh2R4^q!Xcykc*?wayKjLZ4DH_YE%F-bcD>I&!4!- zqE?x{i{1%y8&iLpJ$UL5e|Os2kX`&fiESxdux&?Q$wj)6gQxf5S2PNlN&v@{Y7J7# z_D&w9skmZF&e>WmfnJNwt1+L8o>}^rOt3>H>c<*X+m&_}k1FPCA$oJEi)7JG4bx%_ zcxDtHOekxbdJd7zu^HB*g?k5LJ|1=zCmda1d&l(VH4jDJ4`NKvlv!xQ>u{pEV4tvnEw`2u z1Cd`61Qu7do_-6#3Gf{UD$G>SNKEQYNDx)C={ilC;0;QAQa(W<#KTq20sD|3G;SeP zUJFvkQL@}jafJEAVT=@U>y9d*QKrxoc5)uWCzZ}+G9H?joc^BEQCD2niZlm~U}K;v zFB)1KNdo)S92vF)#THZav00_=d*<={^V)D^

$BV88Qx$-Ivk&U%lE561CIMxMTA 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

-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

;b39=lSIV^=xk>1WD6@VOFNLg z8{|(z8kV+Tb!XsX*w}g4*|@lP*f@FF_}RJmdH)2`0y{xqY5vH{&c?#Q@oNNRD)0uz z352Dar7h4L%<5og{%hcIVIJLqIRSM3rN;gTKLsS5z(8kvCk=ah8)2G9ZmLJhUqwYF z^!suVP_Q@srT7aB20ae`zUIV%=B&TNvi=kB-!iFN*t^;Ndpv)H{)t7*$=S``$y(V- z*~AKL>ikc5{uca~Olq**4&vbb! zwgCa4>F>f10lI=gG=DKsE@mK* z%aoaumyd^s%ak7o;$#0y7Kpu>vm4L}EM^YN0oXdjD(crdQ_=lC|LFe`?`8phOfEJK zc4jtqW_At@c6I?aUIBJq8rI)C%lb!efA#)09zu_Mlz{AGBC5MMIM`T%o&GXTe+cp4 z;{ICycRBhm)&BtdleUDtgFCE>Eu59z?EbO&zXkq@LBY}#YzO(Lw*Lfq6#dmf1QWt! zzdPVy=OybO4@}s=f1&-~$bZ!SZ{$B}|2Og57Q}4ifwuy*5BD;AYmW{R5|7ZKK+t| zSSf*w+iM3uThk6oFc|asVZ(D}d!Dug!lP31^D9|KXClY=`Wub$2+vM~wnYwzkFQMq zi<^Eat)}%mFCozP>i#)S^M&j56i#zdNy+Q3V$|y_&+VT)Kfbj|+iQA8(21@azf%`u z$OXLjK~WAWmf3KacoMR4GbMmbn(2+IkE@E9stTX#mA zK?q4^sic&KzgdPqim+xb4Vp?&k+_B=9D@YsoK|RfK6VCzV$R`{S(;m06#yMx)oy^KabLYXHkCIb<`3? z6|wYCA?zxpL~C%{#}`*K+Y&c(h7cFAxPud+UUr#27oa#B`>fwq9U4w2>dAc}wp%D6 zgVD`%zHYvATLg+IKiJA)JZKz?cyl0MWJ^)*r}hZsbg~c_5i2;vSM@UkL9v{T>4l{5 zvx&(w5eW3rl;aSRT!`X0eug{wwq<^PohrFZUn)wFscR5+em43XP5E(711RQ9m2scF z<|C19qdU|k2`r{yz7*XLGJj2KH-3sR&jRCNLLISbiFkR`%N)(#gQd|zCnQx3LdlA1 zph99vJHVD~;j>%1c*K>6*4*9yT=ATkn>}J@mZ5K+PNM zg^Oq*QZv&qLpQRV$Btj_(%=((zM*_6JWd@V85}s6U2B z7=?fO?r26w{$zgUJ(@Bu;+EJ*H%$;sS!226F#rrg1ew2959S32J3Fu9JHqv^LW{Z@HS=ilR!`;Kg%lBQr zv{lngzs~Mf1;#%9Rhv~Xfil`Xz)uxY_-1JZ_9I4P{@`__nz^q=`ynTb^ce!5RGIT( z#tK8*ANp-R3p){$)D(4owGgt_L23oDvAz%fPMB6gR9^zd&qh{YWH`$@Fmy-r6vCg8UtG;$o#>5|5J~HS7tai90DrB1tQrA9_9fj7cA;`rW1jtjSmr+ zWW<&#ro9xjo?dJ*e1``wYDyQ?BS12+NZx#_<%gt*?6XFq@|LlKe5J1w#0Ib<%rx5z zdSq5%@jH(h|9lGGh)+K$}y{nV6i`Sj5P$D?k@Wq0FrFT}aspUf(@dII%HyCKKj%*7-LJ=rhB zS%J}-NDtGCHK-NFb`gM$B6!v@py7RnlVXD2^KMvb{Sf)gbAj&VJCW8%;@J1)`B$^) z=IO+N&pvS^t6%uhh9@qRjZ(T}-n8c&CiW3%PV6jnGHbHWS^B5lX`^J(v@12*?p-J`F{Q*%uXn>A!a-{XkP=d~TXyOMYm zwIxOF%MBBlZI@MfSdDM`wQP(*F8h+F>vH2kYT;bSWJA3@=<>+FGWTd2GQ3o;YHz8E z)7Pcu>^btp3_OcpbcX~BhOgHNW6kAe+(9Yz^Mp>2A|J>MJPx`s{M6yQs3-ln+`eah zXv%$1!XD{WA%mOiwjf;te=`mxX*8ByKMN`X0qL!VOFb*jJax7Gt$G)HDK2+#(^YF_F{yR+0$1LC6K?S8 zIb#J$JqBtR&xrJU?d?x1l)htp@Z0AWO1*0lavtZhBA(lyq+y#nfT>e(<(57nt7@(I zdXG|CQ844hVlha~E`vk@q#ZiLx%=UEnMX5wtc)18AfFRNmJdS-_XuU>kZYhFIW_XKG3$s`hMe&Q2zY7aB-@HiMmqgLliggqTTw(QyXu zomI8hPo*ljD2`8~Wg0n8?G8eOeBY4kl5ph?hd-`?!Qani2_$@q;0(~$4{-Sc+cOD0=# z@0RTMq^L({j6>^`pIZDJ=!(fRS9t6{t(Isnu3r^UR@#l9Q_x0M(K7Ox_kcFi1%gV$ z$2721Nd2~@U^`wvj6C#ZL-w`BMq;`0kJ6LogWGVo*M{S)iwF6#t4%kH4{s(d!e`Xf zhm{Y!B5yMFA`cF3R9wh9H6dmv6=^I$Nq5=O!r_GV8oO3DQ+N&PnQ;kT#iiPgLHZ_J z%1<-B1P`~1Ha}DsKP|d-RX(M-yb^I3Sk9Y(Q|ld%SX|!~X$<&q9*_n}&%#^gU2I7? zF;|xDn_eg3EC6Ypd2Tlwou?x22z!*Nx&=Mlm36A|2sKRdV97w?VVuL-pRdsCCwWTo z@*AS)>ESW&tCF~xbsaR` zAX?N1Z#foaeA|6YZl#@}kC&fXvi2GvnK#En->e@y8t*W3n7Plq?vUNc)S#}|qn{p@ zu<9o!iYBaU312PG`t~&f2J3M$xHmcWQ*NSAtSJ0 zmn(Okdt+|;dTg4OXa{s?p2-tM4#IRl;J{v%$~T&J(7Xv$^OP#cVuiL2tG~a_t)T50 zCKCGioD@E-VcHRPnBCmnEL=>O@YpL?;C=}5Gr!V$gJe+{vX#Wr?6*jM&jI$IFjS={ zR6ZPm$RpovzCN8(GjW_h5&2D~$JzXylI9NjVuR3`6~{-(L$Z2}WM4%fCgANb)X}Bn1t#-cd2PUr?ibGa=Uo+4zx| z?iFay#k2D&X&bo`wm)k~PUq59-AENTRl`Vfu%~n~?~W zkFrIGNjF|fNmRea+?hMEKvapl?6DT0qnV4ry{=F?palr$uR1v>zKS+Fc z#DFMe#E*H;cdWavt1p+MjA&qun&0oRDKXE*<92R^nU+-_n-^X4D3bBA&8lju_QOi^ z;^v~wYG^Of(4vV^44uSvB0ZiPF4c-U)kvp{(TK7y5#K$@9!Kd&;>rV&+}6NFuLHA4{?pF>XPx$+-5@(3mD;rltUkxOzzIxH z3*5*jRU5AuJtN(}36~q@j#TO+CqP3=zUd|oxQA@|IKGj4-2^F~$@}JTDPMzpYo0FR zi6(MC%ZNoU8O45kY5z&)hvv2?`~2rSNxLb;EtR0HA4K{CoS#OU>u z8P$TjX_G{8q^OuP!{4I5a?;Em{_9+hP_yLBYue$QMEs;sKnt!xh$}*-oQEE(ePf_^cAj&eCWaEjRqawILEi zt*&Y0?QF!$Yl6+fQ-lqq7U6S@gReqC4)=TXOl=R}^dVnMkeyu?95JT#9T?;f9vquB zGg~C^(~dXAkcHNeJgV=sKYOt}xc}xU%}|c;)Ivirf0m()EscUpcac}#abDsaa8xHf z;(ntD;WNXXY(me;<)_c@k7M{L%FnmhXZY9o_HTyUI~{|~{Hqn9>__w2JQ=>*H=^(TE`}tK9%)YF4lYpNEZ8%}MY`4A5@im! za63_2U;M`OGwJXN^rPcNcb;OE&}%#S`Naj;VWx9g({A2XdEcJfd{Wi3eQI;*Zxgfs zGV&v6dHCLNnI9?voerx{Pwb!Nqce>S*&w!`Q*1b$Ma}bVJI4Raxs&0;nDtxAttu+6 zCJEyZ++7kNK+xbeSRl9t*Wm6jxNdM8EI^RKf&_ONG(aG@yAG}cgWI3%{JUr6>^|(- zx2f*Ax4NsVtE#`R@6H0WWH3cS@>aD!D;;K%#*(lfDeks|$Wc$grC)t{ttET>P|P9; z$WvdF65y#Lbg!<$Lb*j|cSm*X5eeNua7a$}0X@3Y{5aIii!qeHC{%yWY{f(=e(}l? z7LQk~bo2Q`R3;f5Vb~v1>+aB3ril{>k1321YFX##m8~2!YDxRVA7rPN#{rp-ai2=f{yGjz#GJC5Y zH<^pCm=R2uyxOFx70+SUFS%yDgCk z`}I%?ALCpTd%1e~uAl9fjqIhkkur)FSoATr$+*jm*$QQDD^u?afWJoUHA9a0VUHz& z5Fr1LN?ufQFw&&(ZODmjFyojp7uoR-M%e+Q+{bZPgwA@m49-+Lfzh3L|JA&kj>kK* z@h}(d4u-AfQlh6CO&W!76!Ew=G23OQkzZwAOig|EHF-Gfd%(PT-eT?XxeukIqFS

bKfU2!K<`*$f+9G=WN}=AekGkUG~@ApZ}(&k2hz<1?tiooht$WQ zc$=dl{^3A-Fi~=)`a~c36ehGXXz)uW_}2mE!vo`t+o$_PhgBxgVJ7hD9 zd360t5XOb;HCO$o4hc6e)z+(6T)eb~d6gdBg5Vb#=hMb&mlw464Z&WgTjWto#Ix^+ z8L9gSq{D6n0nrW9+fQG9x0fx+gmlNSNk_8-FgvHQ*Y3XucavxflWT?DehkAm_rq`V zzCy=cT?8k87O_9_ABj)a7gv;oR_yu#?(L#c_kD%;5f2%xASq}`4$;_QpTytDT?bL z+hWw=3f23b8w_+$)BxwabOr!T5opYB0_evYAv#n_a2Va3{3wt(9is>rr$w7O1_7IV zh#DVz)p>VVJ!s^Fk~x0SO%$5miQ6sw4lk19B5fUyPj#>ghiXS96FMI{`;VBc+1 z2}z3i>Pi0f&$=X|@+3x)-A?8hgDnX~NA80d&IcjsKarKet;(kuYp7^?D{4T`5Rq+&}U!Lf?ypnpjojXr?x)vu;fBrmG^O{ zJo;gwzmlmEGe^mDef}k~<6CUalvCP14ru~^N(OFY=Y(ng$oCCz0Ew}GA~uNT=2vBA zOBkJn+^k;Mx7@4xBKZ)Kq$yD?G?@Zw;XndufI(V^8q%P@$Kfs9md zJ){5X4E^vWw#Yu~pX(a?)x(eaIm{{~wPrQH z1$jku{X3wDn=N&L=ur`(W{Nl#ovqx5>SK~l^Hw39eM&W)KezDvu&&8W7q0>4{G$5@ z7{wb4omWb=EYR-#S1*_NFudoNsO*Q=dIFV?TwCfurIaR5JNW6zhF(}{SlIAW3va1j z@CRnDipdp(T6FdMWAHljCjQSNYCtY)ry3{)CU5)}6fbI~C)s%f9g3;bh}kXnVN~Yi?Kr_^q={9U4jUx2q>vzU57*Y9Oh9o z@n=)o$Fj5|@dm$rJRZw&(0s{zj1)mBZm@rU{Fh&RdCp6jC5@LMVZ1yQ`ti8R4-b}q zVoBEhD!>M-(21)An$9`OD{w&TPicCm{jLcs7c;#zBKro1gO<+r0zT@-T0_d(8t$2M ziv|{2zDB-3I_(y83&i&{DmSRz|8ihC<^%Li3E`4x#mwDmUnT_`QWPM)=dU#-b3c8c z%$`4a|5$SEj4yKgT=ZqJW~3z(X1()^8v!acAemSu#D2Srr&WeJSR%K5^&3naZGhj1 zFGF_X?bh#!G1mEcW)3a}hTPTQRWu(*7KGdz+ELTTt3t4>Y7m&d=f!8%zavP6Rj!yo zbbG(EJ3E#wUQTpJyp%sm<-L%&hxbRcks)?5+<*KL`(hK2*i44#GES04b# z3ZACgcEK-RNd2nXkBwu-ix)&@^>Y<6bI}i@FUSz4(2?H(xKvBXRKIFyybw5#{FIyT zas{{>(jvJ|m#PlnaJ}$e7w2i8 z{ka0kTz4%T(ocrtGg9Eh^YwU}HY3>vHmVkA+hY1;+b?v%D3t5uCWO%&m?rYC{RoFs zXRiJP4h60C!)|wyH^hJ{zuak-LT8iB_0&_=Y`1&U_Z-j0i zbvE}WK7YKyh|04t6XYvI&Ot>{Kmu;C(9L6%)o)Yv8;K$-aDZGb{E6$Y8(1G!b$Nv- zw2<;rkrY&jz4umSmu@bWBQ3(#JbOtrd}=i}okT=LS7}IIuN4p#_nx$C!^Q)D}8H!G;UEJ4JRk0{UP!#m0nAS8yW@juyns?(Q z8s4xnA}fzkWWhYVtJa;0w=VFOYMHg%xxr;h8B2!^wXlm5At-|w1RsHE8cZ?ld=!*W zi9$xC6&8m``tRjP3m6du1JQrVDOJRpB#J$CpUtFGTfg^6{xhD1>QgT)a}VqX1Y$Q*gHjk)Uk(05^O-ks#PGM4Hw zK7VNve`U1xwpu-=R61f%I$~cMKQSB&FZ^wyYfON!Tro+(g2y+0ZoO9=*qTTDn^qr+ zKGnB;N@+=insMxf;MlmPTapy_f>L*eUWmW=OFgBlfbvVIMJHO)xm8d+JUGFwqi@l& z3VoGKN&I)|6}i1tuXpf(_aD>7-lC=-w@#0H=`DIKdk4Q8ahiA46t$g{8T1No87mrK zPNKySz1)wm_v&vFB|2U+IsPO%7lB>=f~-y=Yc#_g-x$S0s9mOL@C;iIvCPaK2A!X1 z81uarcwda5yg*rX^jL7~mlGHJ#G4V8gvJa=IPhgjb-Pm(@j+kamUvg+7(g4t*3e#y$t&MHm(){sc8yHSvBtuKDAXfFu(TWa;}{MWv> z?f^2eobz9{80(<>6<@@r7b}WX9ie4e~i5)e4F>1`>p0N zWn5z6RQS6cLLtKMgnUs2yl4qWM7zOw`lt!2b6$HHi{-v1V0OAPXeWwJLq@a7fy)6z zo2!51(%#^jetJ>wmW`$(+Pcq(c!BuGj0G20cge<;!v)uk0rjUT>Zlgli_6|gWLAPG zH#pTtikF)r%*q81-sP0GSW&p&>wbuAVL%#w9*H$)Bb~@{I>rpWB>yBwyX}Gav4UK! zwM72OMVu3vGYOMrAKD@-;`k;;#)3AEL^G~%fKoX@Hr(o`2d+gKzd4;M=p%N^s*^f- zQMA9>*y^)be)Q#ifw>68vKHwxr?*d4c&)mFe-?fZOl2sbv>OII$u?n$3b ztHy)I@z&F~Q^}~Y?_|G{#;FuGp^d2ES;cehy-v<_8y;t1yX9aB9pL^jvXj8+xTTsw=!)TWu#wP1; zXt&hjOIbu0)gmNo#V^qMPCLyeFutUEm~{m=gd`%TumD|I9JfCxn$OO+Eh^#r+1_(x zJhbf|pL_XQ=wvWYUb{^*PYIcQdAHnvLpW)@&x2KGy4#V2YqE!c4sI$tW4n1U@0U(d zT_UupnF-4j{l{GZLkG%_HXZQ^m=fyAT1#8JZ?#=RomPz zycO3dBNuFA2IFfBOOC|EVz8Qb{3UIIBs(yn7S9|nPv&G+^z{g)Rbkio%zX-UN#8RD z|GeOmEkAjcs=-zt$@kZ)Mp))s=Itm0+?CbBW<2U_T;mhYRVRRC^^N^9aw&!~jrqH^ zy`R#_Ccftu0ZASrjX*q(*3VwQf2Q@~RcODFeoZ6SDY8i6wvE%sUYA%cAo0ZAQcAYt zt!K>DJ=s{#_S+cCF89#=xIV*!DJTw`GbQE+o{wI_An#JmMPr^<1cZBj)s*5dj*B$d z3y_YQH5v+KDeSr%i+o7VPC7_no%_5okURAZchpoH>^#|;T@bHEW1 z71cpZJ^8GQWZLXa7i###nE)~l(aZciRyVlB#WrC)mC-65P%Ub*wSOg1as$FPR1-_6 z{vkF){GtQ`x^JtCBZ!lC0+*xc@PTjICzdBl8n1>u=p4Zxg zQ8bf+xq+z~S|R!ur?@Jpl(RQ?u&II5=bnkXVh{T#f!>Qg%L}7d8xNH3!se8>%E^gL zfIj_4()4W8kF!+C;yo#6yzR5ze~6Pu3c4A@!A1-HDshm@A31x=7y=S#j)=U)dN!`H zOdC&Dfl*hm-(Gbh$g)4fpObC;Ua8Vr#4xy&SKlq)J11C-z7q)~Ey8zC-yC@`-q@MV zCEkXj+|+UwjYb38a}#w7aR+EtW@^sGkO zTKQs{wzgW!#D!M5%N zF|lDF&CYL)4b9S2+|>*+R$i^_?u&OT9e+79JoD*}nV=~XD?_JzNgGCFga5gV#h(7$ z{9Slg4d)(pG*46Y0Zwye@7>&Y(t^})@VwLZ8kek8M%S|=~V>Mt?j4KutHD&ut{Mc_(@>+FMJNkE2cd(KA~gRSeF&b zpYmWtG};ldrxNa!0vU}?lBJzpW_hZ}>{P>dZG4@Pjkf6)D@6ib*YqtlE{iT1#$9Lx zLnOH3BNiK+Dh^Os>{*AbrybD2C+S-nn#1CS1jbo@)Ei1+?4EWyfJAwa6bU5UnCm!zKBAFhQTGqmQ>$;n-}v#~2%?u;XN$ry_Q8i*CWNISa0O<` z^#x#L$yMAFKU~CVgtjKvMzpHW5`y=`WfA55aD~Qdu;M0{P7V#%dt;861bX?Pbv=6( zdQKK38#grjke7;ow1DTgCJL^IGbW{4&|ojLTP)8n*1rApPz-V|cN6H+2TN2;)x1}S zylV<9xV;B3V0&3Cr2xHY^y^hZ14ZpCyRAP;;I=(lq4WIi%UOI$39$ zZwKkxlrZ-VF}3l>RQmzUdht1{6Fi$?f;;3to(tLGSCpGSLipbcz~s*8gwI5l8TPb@ zTId7iYSRYSy$Q(POP6Kr+eI~C8 zJANmj(N)O1m30ABw|z1R((Pb_tR#MGEOzAX`*}oK64B>N&LK0JF0MwgCGTV*S z9Z|3sPW~K3cCz8nhNBFvy+GXgymgBestj8O3Xn4h8fY=@-p4c=Q@#Ed7ueG8DC(cJ zUTh(3V;P`V;5uhh7x?)Lt$I#B>39aif+;~XN#41+ob`SXk zTNa4Mn$))&d0YMtO4*Z`=A>7StsADyVsLkRqM8jzI9w20F?*`=+Dmd>o_2(G4!=Fa z!fNZ%&Bv4k4rBUMMQx{QZHY1Kxkzq(7Eiz_;Xu8RPX4UISs(ZpolYV^`FjvblEvBq zvR*YTTX$}C{?1i96EaC8I6M*VQ=9$?A01sVYkCh2L|^Yq=15yATvJ%prJjc{%2AE& z11nls>D|JXo6C_0H=jLj**=Eo2^Odi&=L6Sk-pG={8z=~x*MIAVij9~c^_rxBY7vD zUTx=9xgWpcGLL7u3H88P{~0}*M?uIIj#arHkEO!^54eby6sOmCWCVvlVjsVbR_MuH#H10ett>^7hUy#6tpb*L~1I<$DhzXSErEw#1SFo6n0*h znHjzp@1OCZX<3Eo@1&_gFaetlA==zzHbW%%7>cL%YbTDKn9j}gXX7+;4+w{a$*YR| zg;f%3hNv;?Vq-7YsbIICurl+Vc1I5fz-6XTOrn(grY%O!F5}d|g^is7FG=?KWz_i} zEA@B@>*VGS*s_fELwSm)R>w1v6&g6s-(G|Xe;$DsI|TTWO$#rc>V~_*i2(;_%VN$A zV)-aKGo~W6wifQRZY}uzJR?d0f&gc{*DC#-A2H5&1ADbI4~2j)hNg&`?>XYxvfgIP z1@r%c&|wM&oom=El>8#GceG*fWjq5ztetth6guXF?&s!JZO6V^9U8PIW*ltv`{b-T zhOulOQ1J}TH0;=ONSOR-<}c>{Y@kU0Gy@viB)qd=(N*f7iDJ85w6-^88Cjd{KkFr8 zzNt{!SG1D0>JU-uDLRkaI?FyKckL_ozIFcGe_*^Ec$_NO(dh9p?W{wfC7^249c_mt zFRa?F5PH-KZ*9K5x0$oxstwQrbBpEfkB}T_9h#&zj^qSh*9qaa=@y)hQ3x4ifQ~eg){f@J=-Y1o||A z(y%1b6pC>(EKP3w|8ujK+T`_+(}Dq=9hWjfG1&=39@O<+=5Ee zk1FK8Q;{Lln^Z!aO!n)OMuSUs{A*7AjMOg4=I9nRFO`zd5X#N^Ll&Rc1cPcDNr4H> zI;k4oH!RMd8?m&NLWJ8IWJ7gr_Qca>uA084vdgQlgd`~nYBpeA z+kioD{7ro{HY#3>uz`_rS+SsVSL@2rl}TJWEuYO3u=6o-N99z6onh;%=;w??b0j;%TDUHPtkO?(?|gG(eeqFKpGz#4Zi zzP~DDxUl}mt(XTr>KPq*V@>WeT$lMcD&&5{wD80{Q`V(;*{Y;uS3482Aw9GSg?aNT zVxwmtr^Sr&g9%pY&$WVu?j<$+c){%A8T&-q-qVVI*7tdeukLj6#x6TO#20m7qHASd z;h+WzrmFk+!ji6&6#7$%u5aHKKF~6}uVVupR;VpKwxs*#ArHOv(GJr+fkeTdvLL(0 zOAX_%Hvpffhv?rARg523prv|7x#4o&t%m`9*Oe1kZlMqWcKP6Gf41cH zK|&&FAJuaMImUlN*?q{-M>b5 zf<5}|M%)d0YBX50dVII)$OSY`vU`SWUpP`b1a0GWCf-PxsmvK=3={*BjfbOB_#K96 zqUO^?$O=-&sgB)0T96UwsoO;xFF9$vsq%<@7VTRhcnLm~42s@PQeG=i@qQRYh1{)M z##&KT9eU99TZp3swNMjpY<#v;>zcex9O4VP)UkIghQk-(dW+@|2?9x1uF-8?@~BZm zK~EvB$n2W0NMy+FCciX2DM9%8>ZUwiavlZtR!9ehCJUjCiub1dcY9G=L#qz=SC(RC z4~Jnj-NJs7Dq=-)Pwpk%%XdoG(36qi=oPYz{T3KVyaf^IoQ-^Oqcy-$t3)Nx*hM&` z`V01!;iy6^Rg**CwpQ_H0(mvU=;HO$i>P;Xfkou1V(oe zr&dW!A3A8^-zR?PP&(L~C7-!hDW)MaCmdMyQ8fHTnl14q7vAqDmRR4rw$YzPdaT=P zPJNtIym=Xy#foh*KvHDs9(fxcV^oU}sUTt^sR@7Jd8!lfu=ioveQVps z=AiVjZ)wm0p6|EP32RSGXm?j?)WP{>B=q9Sw2p&;-c?Ot@CyMey5|${=;W%7UJMVQ5CL%!$YQu5(a2uS z$Qw@X)6Ts{shTWS&Y&zsLRtqAn7vAGbGk0|%4GcXhts=9pkViq_KW<>eq1kGe_Elz z84=0)r(d_Ibc0VBRxI>`M`d7T*SB&zvu;G8!8d04tv^)irtbV(wwaCCfte|6(j^3v zxCdVP^GcjtS#nhj`-80p`2-~Hr_*nX`Y=}?a38f;4O;T)UxRlu%G;Vd$>STBJnm;y zM^mhVJee@=ut4?~FNH>0+Z6E2PPeIccOx7EZn?Hq^v{5g7L}Rig$GyG53vGCA}P0; zV6nd-^to-kpm4XFSL)Pt7l6y+PFI76%4GWCLk8HFKAWLt$!=`oL&d)i*9TAdo+$?Vh!QZ(p*jj4o>#dHI4y zSF87a82kmq6oq4JEU$lR=2=rtnN6VKEeY`pmA&gEY`4?+&NWi}(B2x$W7vM@fHJuQ z_4|v$DC?}IV4~3aCN~0hLegpHm=^2t@XN>Y?#?R8O|(3O2|HL z4Ax7?n+50(ksxNKo{v(NcSwZY;Dm3-Z0*kCCnxLEvscF7fX2%6?h0o#rYnOP5DZe- z=B4M#nQIqO{HiE!LRv7>V>ZmS-^x^W6#^r|G>vt=36k`HM4dkbN{SUDY zB&bZKU-+}Yv_4w4ZRzA&yq4%0Ocy53W)rZ;1VvaMM67XdMKb$g?+`jHo&Z z^>ew)--%fVy}F^D+FM_XgHiAUtBZ6DaMdu~1vfU=q_>OJ0?}Pu^!+3aJUPYX&u}%k z@DT_;RWD&MZ)?P6Qto$5Ov)k`Q~gblB(}WnLm*y#Anx9$DBjuNmfUk~KxyM6CwE;3 zy=*5xpgx&|uPr)o;MP}Aa`-Z!*|h%_lN3Co03lI&q%Gpv&FKB9eSf0n9&}O>tX{5R zaDhh~+En5WLR3M=UcLqI9O|LlUWE-ad>&OjPILz_Xe|0-Z(aSA5tL||SY+$D@T}Ry9F$Gr3z{d`JF6fj9sZZOKcXK{s@(g~*~@x_)seIv@HgMSnay?s}VzN|i1S zy+&Ybi|B06R`?tgGAb&QcJ(>TWVSPQl*nMr9Ld&GKhA-}MW!bJX2H50Z|aaS^}4bog>hSVHrCBUwEDq{k@*ddDci;|@x3;8CC!THDJN)~vGIw$zvSxw=8hal4KY*iv$*Cba`b6y z`bb!E>>lI&@uF*WYTd}*{=(qSC>ffcQ1F%~hT+?f!2rGXsEHwWXGP|=Rek{PsT{R} zY6(|Wq|DdQBieG@ti3{$5JP_ygiiIYVWme=axAf^kycqW*oeggqpWP#k4JGHQechj zabTTG{AB5mXkN*4XZDG_SSr03H9p_rvMc(>j-covcJXO0Mff5(P~bX0(mLs_iVDvSae#WrMeh;^phz=U^zmSCk}?K zu0{-EiF3zGPEL&h!>wq)Zcl2iepV-5YlJ&Jt`K3tH}@1~h_SqGZWpP(l&eTyd%Wb? zC-i^)ZgvDMUoBqCJ3-+p>K%KLcDaZJV~8n<3r~0a-BGFOWXY!J0LXY06D|_^RYj1^}13&d!o&@}R^Rjpo!-hGLPzA7iMRGU${5gnIq)2cRJ&c<_kR|pJ_zrNb*4rbz@O}1 zoN zpHBJS2kqT+l`~2XW28yr8669->Q!0hQygv{MZ9F(PjAhXDMP=#EWv@ zk?Ax@`myV~@j%D+L2n9!YhMMYonI+)PV||Jy6J&c1DA;g1k{ue^l8*0-OMWR4PR{IzTVa6V$@tQF=<_y1J|`R zXMdp8Ul2pEzc2eEL+{V4eMfEU*qVsxIb!kr--bdw_&??UHq_tN<$ub^?EfVr)c?1P zq$=k874Z?NUWYO>zdvZhaR#`m8y**9?TKE&t|K>JhH_2l@;m@sK%>8!A9Cw{w&W&h zBo2P9AyKr!nrdr1(Vn0(y5R1=49N#co*jqkp^GUxe(dp0zuD%f6T&q2;sjO0O^mvv zm0jJ|ASV8c*mS(9)AZd(7pRY&0AU%My2J`iC;iJTpB)Skr}$p>cL_@IYr8!I!WDwA%ZaU z*C!(IToqt?EVFO$Vtq9d-P9Fs$hM`^tlMB1aU!;F7>o8axTm3G;B!bWri%(9&<4}AL0h<+#?+dN*MVGa>; z?=^7kepaPpV;ts~dRgBhiaiy+&CkCsKD@g|P4|Y8$}gcTD9q?|!26sbIx+{C9Amx3 z3&x;GIfWi=$jC<;d#C@cBxJuqh5eFITLM77<{R#!N8GgV9-Qb80BWD!M6% zd_CiZeGS>k-a}|xP{2WGyQVL22uu)nsEbsY>G~8jWmHov_jM6XP=%}j^>zAFI`7vr zKtY7y8vH^(H>>b~eN+{%>Z*3gLf&X4>RE>^NoY_tj6VCkoGh#7S z57~&X1oFLJy_t8g^wQ^-`OYw63aL?L^+~`Al~NsH>%J4Ej=fW5+s%tM!P|~+kl?FU z`q3_sWG&Ns<`+(?t9xj$+c6uFl3D1+qW`IF zQj@7>yEF4g!NIR%!Iun8pS}M0%U?US)@Y`~FupEpS~{iD($y)}q1OGbBvG6WV&t;v z;t~>0$=t$7$mJ{*N1Mx%;e|80HiLveb){myyM z^S;k>p6B=b@cepiPP@;SHhFj}PvRz2sHZ#7#cjn*o@)rxLtv zC%I)u`tkdUu*GE7O6YlH;cKi#Se(bGPqZ^SGlc6&wdv!uP(O!@_^sapBD(Fgxz#bg zKGEqT@!1wNb~f_0S{mhDO3+(RTJ2I^$?rkBD9vnD_N&|qBF0z@-9XtEnoX{Q%7{mA zPX@C#FfprTd)|)2fXx+LH~jUa#J$|oD;R|G79;&2tJkCL68Y?eN5tJUY|simv{xQ4 zDuTjGTA{8=;rnbDKsU@*R#R77NM*aL_IP2UE1P0IFou`1yHvtZ9@xaWnF)zujL&$;{99MCQ5ZQ;zCg{88f7B=~s78}G3_ zD?cONcJRw8WmW(^N$DqQx!jZ{3WNQ;$u(0>a$I z<(v3?RPbb~kKY<*XpM@Z!i^95*1}cTuQKD04h%+Iqjhur_mPDr=0m2%yVCU9Nokx_ zCXxilJTxvE%tOkv9ZpZ}5JF|J7{Az9uC^&x3}I$u{(;KDCLjTLjN29yET9{Ia!@CK z(l4aq4iP$pEwOokk0ugt2*3|DI%#JOsY|y>)(4V8#^K1r#l3jLXCx55#ollQm#NUj zq;8k&-g?jJ%(_Q8P6%AxRqX+^iF3TpHqWZy*=d&wRQ{s6RoH;7Nle83$RBH*%Xsfz z;EtNE?_3n0vh3beGqnQ*SHPPqE>nS7xekMFtcN5Kr}A@`8$0LmTvcEy2tCo3)b8FW z)gUwtp5jE6xh@ z6aWAK2mq>BEK=!FN)e)K004V@000yK003!iXD@Sgb8uyDWO*%Tb$KpuZfERTWmr_* z79P4`=n@jj#{MW=ngqvN;X)}r`y$q~=2 zshw*Hu&!E{t*O5Z)w?1Z0&}{ihgP?~>(ZPFeBy^ z&uuNOmHYV8#DALm2TianOM}<-;J=Zmd^#T}s|y_*0S*5`!g!gIN7(w+L9(;17976EJWUfbSJAY!p28b^3sOl1P7!( zR5>($%(Q`okaN~P-*m2Yf5~3L;4|ZwY2`EfL(lnkw(sb>vTXmEjhkj(>y0_z*FNVt z4z#^kcP~BaJV+LPZT|i{nT|(FnxMdX5%a1tEijnfv9X1wO@A{@a8}AHS*l1&W6<+G z4Q<@)IdV?*tBl|&w>xX^6`T8Ij(E}dj|cXHY~Bz0=4$=EYfok@CCCVgDmp7-O<>O? z`Xrw9<{2Etwd5fkz0}}ISut&T42FF?jYak~-d0G4^?N!**>NNKyxq{0 zU%aw8dcBz(oX&q#wYZxD-zMb1v+@l|L*zMpur9ut_M}cMV7vMeWQ?MpVM;+d;P!xf z%G$_oRKAB*jOTENg{+&s_4G(&KlhmPa#C#DcT+@YT-&YPDN9QcLeWvyiGkaScf-?# zcMZlk`g;(|>D4~Pnu2t4yJ8l$yfuJ~p%cIUM(@Zmi|22*k?V7pM+3(9WM1Sd(KxTX z-?-uYdLhYhRhLWgB74L|qC1YN`Q})5;D*wH^`*7+Hh+^5{o5<=es!kcDFgPW^M*?* z&u^Y&QGDBM_-Z|8R+$HY3fd|U=1PWEd{^Byu<-l#X;T2H;i-h&om;V$V8}m;pF5S- zeDM0@DOU7j-if{Ou1d0gKg!Ur2mPm31n_{D)W=Jg>LFQql;0k3>m9yOK>ZI|70#Zr zO)I&bna5y9GyK-0D`(~WjqN2>!Pr0^SjprT_1O11rS4UO?lZ#X7#Va{kP7&=+qxT& zT4d7v8!p1@6>w8!6HU%LZLVuCKvibuk#Ql!*}o9Ow){Pk)|rRW(AP&9zdXc5Caz&B zD*QdxsY*d0y75wwNrVBNJl5kc?Lq6Db3wzyAB^bWADa~1*MxcvZ!EnV@Ithez7`3W zgb&aEFpU8|lEE`WisuRrx}7X&pZTiZsyz*kJ9N%o2$N?)Ac*s zc84@l!R}Mj0Gx&lOMG0_n=j`f0tkisYKpV)352ud-TEY5wGRDd42pp!wiw?L?wOB8 zPD&dNa4zIF@z!+OGRKpaGW6&Bd>^yx<}W4Ah|r+KX^y)>kP(8ZffS0?T z2yboEXVZ83N!n|i0@W{*Qd|3L6ZQCBCYE`az4Ddt(urpWxp)x;sWF;77EnufkenFH zjf;A$%P~=dUnc3)Fi3{wwQ*~h3>&wyWo(0?Nq7kD)bLdyhJ=J95(J*<+$~FL>_2*B zSkD{=czj|iT`T_*Ukoh*J~Zt(@MfH>VA_u*Mt7Km{npAZ5bzRCj$eG=ZP7h3S1lnS zo7Dv%f>Gx!P?^DLM9gfE(DzJuP>xwhtZc=IsYPU}wY;6JIpnK?jZ^L`+7Z>Sj%SVK zR(RR=j&ChNF;7Y;Sd)~>Z047zP8$5uQg$j?SR z=#JzkIQE0&yYyx(Y2H!%DO^3v7r>Go{ds%KS02m!BXCOcNIj-ALf#P^`$D=KbcGXd z@x5Jxp9}8udj_P5I483z^K>V$(L5@`7CX}45B9uAUd$3aJQbJ>lA~ zD%9|rda_Y4HwOkt5jqMEdsGw(;MZ{Fr1->%sVuwBN1dwkx_==e@$qgMeWrE^*>S=R zPCo{{g>C_~?iUE(Nlt9zkN)9+w~3p?x_2FtloN@?+cJHdzsG+;e9X`0Jb~`^ij7$Y z8f8-nHmzE`7h50C0(dfevhix8%Y_=>KG&Z zWKQUhCuX^*)CQPFf7A(whC0YI8hqSR@$*rYE`7)reBUQwORR%HO~#6oAia{DsTbwetUoVJ+t}h zhe??4X7Wv#p_zIJ&C_9kcGCm_QW+#lNjTcYYiuvLbU8T%Ab+6&XD);TwuQ*LRfXek zrrp7jds1e^iH?z@Ubfmhi-GNwL>VehLDkZb+lpui|4@_>T%gTtX72KG#SyE?v6{xq z87n!5nevXrNa#Bb=UbUd_!SnzMl7#&TeytMIq$paKbatVgE`Up>_%VAnnOa&L&5z> zb62Nc?gEmNuwj8kLX0K$cc1AV&a{NMBCJ?&%*{-SHHUEta6nBX_IwYus`caT-5c&i zF>>5Zr=>$f0(HrE`_;19pZMcr-?CaNA|s~bRdAj+o*^`jWevZej|&f&dm%ZTkEyE2 zW3#o5A-eKrFjd3Co<<`vqxJ?CVPbPIrT~;UA8WBGSV}c6ZX^>?nPpCF7~hKauybG? zyZNCoX{(SQ<2NxlI}=OPM=g{5(lI%V(zpWxDyhw-#M#t?Z)q4UuBBZ9yWg2EveL69md(>23PRppGSt*NdQ8DM9`V$p}g1d+n9QD)EPu6Ag%_OWC zuNjvdN<&y9&fqVtNG22#vdGmz^3g=rWrf}l$J*x|A1KKMR~3QUHFBq*EIrTW5ZSav zGc~#bAU*|wGGxDmxo|@>XP)&@^!f`w8uLf%rh^#n!_Y?YdTb+mWDgr~CYr1s?+R-h zGpgA3tseRK=j}b7JYqJ>Fk=h)Ck-bJSY>vVQYsOeAcIXxg z)7?szQo@zj!9Pu&+21vgl#p7X=s}vLloQcTJPLM1Yaqr+Q3FS9iufaWKPuI$S>v*|Lt)(2SWdhjKZS9_0*Lf6Fwx!T=&zC`Hre#kL^b1Z^>>5qfilcl%aAy~iU~ zos1eKIwYQN#8l_qMCf#-Mv7v26V)f87@4vh4*8O8Ld%DfVNmdD1pA1Ee`s|ICQEIa z)cfdnOX2_(4mKCJiuL(IB5U-*{30z7CLik?o`59XrLw7higNO}Zfe{CmBy$cOVE{byJDrNhop1UXC)U~I!`97`NOhnE z>w!`CGOW5~W?sr?68lixUD2VHqsC*(Oya63EIm;$j1SKX|K2IB(QKQF9*5C36>}yz zG)lljW*}E2QK-C7u!wh0H~dCksc|T-{Wd5FNyd$5Qj(0xCr^ygpaWbs!%yQo)`a{8Fv`GW}AxL#j|cmLZnKubPLM;N6t zTk~wOd310zZI_k4*moIpxz?1u@n_uH#*Ip6R=sk#0Z~*GXmVv4#W!Y3gjSsFJJ586 z?!#UO^c4&c4c#@lD;cxDD$vDVZB5Cou-L=-ZBtmmD>CZXV#HC8aF7Slkz+2Q(J~*H zv05ITx@(T9oSPdifJ{%dRaav+RKVM^^u?@5iikWyJI2a;Sam z5+KDN^x7&_o<#1j)uwiPdOS0d5Di>AFOgiY#rzb#Y8ET<>pMpKX3(JZr<=)6GLOI^ z_ERosC8v(YqX|MdO>Ljd$LWAVsVC;zn+zjFKv)0Z(KmUDmf0^p0c_`Y7%|f+z@Ik=aLt$fHp}_$))TQ zv15Eh!w&KRXSlO;rK?rETlCh-`I4d`h&EY?8TNPDx9)Xb zxE{^nlS_btIDvR^0Eq) zBv!plq&&6&Q`CyRBN+QBjEi)hgo;qyUF_`>%VzQ>1|9MwkUn3$Z=6*pT+Ws&eN5p7 zv3}@eq<{=NrafKhJ?3F|3|jQ)%)%`_7AucsdH<`x8|P->FZxN=@{P?X8a3}}b1#nY zB@h#bjI>m|p_HTV(ch*y$Stajzl%SPA9~YHt<7L`OcHLeDQfBQp4J_o#@kJvss6dd zO5;p1d3|xzyLthyCo7*d2!@G+DfklaSope+aFxf?zME!{xE20T9HGP)u;k{F3f*4d zr#Dwjqjd>o{N!1M5wDTzeLy7O1D_y#$#fyu#cP!IKqYpXi!=z|oce?Du++=XATka- zvhLeD)oICAH3Td-rWyd+y@vUvcR$v%f3j+c6T2Z<=SYySe1LIF`5{6nL-QGJ0`UL< zlTv=EGdTqS%vxuhrH#|0&=3|_D4=vB1vHSm_kE&Y(EkA9CuAaAD59Q-p8U}8sxar4 z956$~-mLQS9GD>R@Z5Tqt2;NO8ac&GnsgTPUM(=DP||gAFPXTvjaZ1PN0BG|RG_qp3+F z_{>I2U3AsN1)LE;Eqq3uJ6HjpI&-_5Oe)R6VewRb5`%hD$F#}?>^rlMzDQ%V#7mI` zRm~e-2{r$iTz|0rV?H+rw|LyUEXZmJZay*%sZ0pd{nnm zjt7cSGcKnrI9L~zB@$LB_?|ZYh>kjVL=fNy#P`59RlX6sq_72!g&J-C2 zS4)i|MVM>F(;r&3P7)?rBdUrWa?GE!-_J9dD0x)3#zZ%qA2vS27q2o47s_>ocFWGZr^0|Q6(%L;G7i7j9qDR5alsHt z@GP0QT>^eNPNK&Ca_%7o9g_efn#juFG}rvTR)liFs~A$G!Au*gxYakT*YdG$Zc9$P z*eA`yVUGUCEO_QUbN-iaaQaXm?NpyIwXg~1Qynj}A?kUoqrg)&9360TmAVPXH_x8} z`L-}EB^{k#AsSdKzxmT0%qQpy-mhO7L1bX+;Yg#63U($Zbjc}%i5+y0GkB6gQr%sacCAkE<|G_2uD9ohWN9GzPQuQTp!X*5kWI5p5lGBAZDQw;S( zG%vulQHt}uiEQmPfoRR?$fePOy^5eW3 zJ(8I-uDEO$kRsm-Cb73Aa+5KD#$bW7U_`HCy4o}5zV)bjf&QYMsU)&5 zF+jghs_{no0UE0xNhd7Hf>LE{)|C(Mdk1ZXSj8sX8ENU89zlCO70UBGEQ^OAyj)Og zpgCU)ouY3Q&nWEPgN!4f$R}5JwAS?-b~t2P30jj=y&{Vel4#Xs)*mm6j&0njhc%zM zHt-%O*j4+L*j=WlWcXiA`M)w1D%KE)))yemGfJEJVAw8WG5Vn9bL}|PcNLPMtDP-l z3QHg{V0xmpE<*NAG+P;~0KrA6a0pV_5YV_FP-N82YHia3E(Cbndg_LI+TX@2=~=+zhIKmRjF$_F-#ti zQq1@FI*a>CV78PjX)3pZOk?jnEy~O`#Ew1-)S1hV1s=^foXK0P*S1c``fZKgITv)J zJ*xEOT-CF+?RHx`ud)>;5)W)7&&ri4p8_tU(=5kgm<1?x>_}7$kZEHZGZ7p3nBYa5 z5~)8C{=z(W^JTB`t5mXYZSRA6IrHj#$y*z7-*~^o(B7fV#je(SH2yy2wa%9#9R}b| zIDMS)lT@=Z4nsGes}-lueqZLodhBdDGt7(~bZaimW61IuMajiV{Rwcm@{&@l*9V^Dxez<&gAPKCBByk_bg_9LKfeQRThoY zFQQ6beX-RnUvahonCLxw*YjGkdU4XsnDe$HoJQFZd~5n-Zs=X?E0^4_USEsjW4@ku zQho_Fe}ej`s3O)%98APre+X`{iys>3{Nm-dB6|mem1eLXLByarnf0WyVn3AX=_+=E zdW|xx5VDRq7?}f%ayGYMxy=&VCG8q4-WHj@-ONEsg)n)Kk-+R^JkBmM{WkjB?hMnm$7@oLz2C%?EcnAL?Tt5I>Y|44`3l_P(pjZB-b%2TpW1k0Hud19l(4UxOYFe zQ&F}^K{!St3)9S8{)r{GZN@X@cNDzU9QLI{kb7)6+=`U;O?_Wo=|Q5d!P)f^QN8N* zveNm&KPrr^a(CL|S5&R!F3i_B*(zrm^1A1}Rd>t8$W*gHGF0E09@RLGj5KQ1RILcvY(M)?@Dbgk(%0du~R3p?AZL`EPmka%$c$ zF{34+&5VVncoQqcX+;<-q%)zBUEmch$5*&cdDIYV#1C~@j>Q=Jsy|_aB?X$a#N6s~ z?i6-c4o+mkdKr0QL)2fEuFjy|k*g}Jzqs0GuPM^in!~Cqa7R=8o zC_v}gFVB0nQ-AS=ibIpUOI(eJdGT&L9i;%(hA{Gd;Xpt}=F=XxCZ$mSy$?}rbzgaS z%VY1h&~4l{(Dr_NpTT8B9bzuz)alAR>#Y{FSwqrMkQ*p`MQnHx&(>e7wJ#G924@m^ zq2foyS~lQ#zPZ?rzz?JX*En)!^WJUC&kpXc%H!ZBfWmJ^pItmj;d_X+lv%3MT-hMt z(P-eynmOREbIW@XJlc`bKgXCLo9JuJ)j4=oyv{TRA__Swe2InUyxgT+A zG5LBSu)U;+&`OJ&i9fe9&SYm5E#pTtTl>+4W7EKc$-_G|msQ_{V~vtS2bCDE5)Kg{ zx!#lU>U2t*{hh|RYKEZ%cSRv#ynKnm!AI{>T6Tzx(5sjik`pXv=3m5K)`YE=D2z0& z^xH|>R)y!>04Vgk%1G+Z)e>g8TLqOJyiRDasii;yVj75S(ZSq*74Q8k8vs&SSv@vG120n z+2LCE+-<^E`6Vng+s;~0zNk@heY@YF!+k8k>shvES6CzXr}E?6kQ@L2^@vnaQBPe_ z@pmuXP_NpugOa7y-sn+;>l&7DP~u2NiP@LyP$?-ZQCC1oxzZXHDv4Qne}u6TsmH_? zEtz}lIo541tyEQpRf2FYgPWSg*;~}2Pg%mL_^o|g6A!zlgKv z;&6Cg30sRX^U#;j7lG@tJZK?PQmiq8&cWBetlNBQnynkbiDAqU3*LiGI ze3v}ZRNo+KC|Z@M1+>pR1(Hlm`*XBnH?$yrO~gT2ktO#QG3Qg2bA?`5 z_#u^JgC%Sr;D8$2Yepkxt3CqwhHOPm?qM8<2HP8jhxg(s$kinh{m*b19)wy7G;7#? zGL^&Pxb>Fg5~tnKW&L*Ve6cOXm%zH6L6b6EZI!1Y{k4NBbP?IXU5*_Y?pi=Y*qPgPLkZiCk!OSBgDhUt?UcG zCjgeg2T6I_J4hHPsr;4#)sqH0A(0*uyu3a>K0H2xJno*3y!_(g;=FtUyaEE;CZ`$ zseBLlw=KMkP;aAo4PajG-kx?a<$Ev$lKBrQJY2oK{*b}j3wAB~Ic`^b2VP&dUwHn| zMpa!~?~l^x2zT?iwzx+B5z^l7_c#x4PuHIqdplm3E6fcw5HA!n{~zJ6-s{pPeJwUdz>%o&|EeJP=u z$B(KJsQDE(5)hCO;*$^(LUkqn6z%S5 zh@W3VSQz#DCv>PRz#aVl9$MxaF7?|=C!ytT_cKes4BY-&`P*`-0CD8~1&4 zL&@Ad{rU`+e6H{!0h+vw}-N?0#7lcE6+s{6|XopH_o^W()tG#mn6R=>zeE z$veUjsHH1^UBWB1m3ZHOHlaV=#3V|yPb7~*fOO5T4UJTJ(-KMl^# z34(Bhp-uw4e?Mq(2YwM@K07G4n4LW;XhCsNZYZj@aNCIsh(jSF4x%uq(0?rGKi&=h zy`WL$)6Pyr0K(1h02M>cw6Hk0I80Q4TNDBj6%w-(x-PDNGiX)Rz4>Ql0I~hHT>q6I z1^Bu7_=tF@xLhac*u=Y-VtLHu?1e-8YWK?`n&x>Nj3-@ihxMSpTGLk}{-0(I{5 zK|SBXaQ$A6dNzg))l^jiTwVX& z19o?J6UjlS2mWe0gW~6??`xFXrg#m`1XK@MyVN#_$SM8hHZB{Z3^e<;(@veCaPiFg z8}Sy9ALwM8?IU~lB_*!Zhm@!{Nj}Z583VtDd^RQPmIFng@l&wzIB|s*yyaWsXN8i4 z_zu|?V`1#F0|RiClu!sT7#p3Glph!s6%~SVONa>uLqR}NQjCzOD4M?kd4~JXTKrof zh4D~Qz|TaW_YiEA>^`$5#|VMQb?fCHzGY(m3tWYQD_WQyrKCO7gM46Yg@^S<8M?x5 z=g9yY>JHmzJxq>@ieN_~?H{VncQ=SLaQT4|W_HTwFp)jp;5nwQ0uj21_fKsxHkFCa zn#+oh?5+{us^-GLJGckrxCjTh9>v6*$ql{4;`B5G6avJ6l!xVedPlJDv;&@*Dw*m~ zgiB+y0CI(lMz1tDt*1N4n6SG*TIs~>HV%z5O$Z}LE9;kqiUEL7^n)8KpDSO;3U9rkNkQT zefmDY+!Wj`N26A2yBbr;4U;C4m(j(EDar~mqW-}+H1~ZG3ekHIKfRF(EnXSP5!7KOr(D$ zS#)b-G2Ps$PRU6LJ9M|L%&-T)4Ko=_>QlFQtq9xvT}el#ktl+PjU?~AFqo>ylRx-2 zMeEpyew$wFAZo3ZV`c?rapq+?%@iD?Yb_P9ZW^DT(q^r;)UO1bJ`-ZA!6>M3{zzF` zJt=?dN#x@%aaQ5ximCLYvF{t7@v-r^*N7N%z3Q#s7kLx><%ZI8ZF+Z6W3E*S*O+#> zJ>!f;xO{aOC_FN=T(%&Xg1|Ya_W6YlRWI%?U#|s?oIPb(I$4gYUB0bi#jDny5*JfC z!iSG0jq0}PP|zqbKhx+zQ3@ly$hjnIgA-QGun^!Ah+e~X%$_s`F*zxbLglct)1x8! z0hHC4<@tDb(j&^&5G|o{)EFZLG{jiE?V~s9POc-@maNZ($O-i+Jx5)=-U&Ofq{7Bv z+B{zfkPrrTN$^N8(-mp~STPk$KL_k?7-gW8F}&7ywxHqGEB7dr6s@K{J@>G(7`Tlm z04y|ARQ|5ptk0m|Z2*zKzBU8y^R6Q}rcA1v?tGl|uMq~t*eVv-#+KS-njx>~xrne8 zjBsT)v}D%bxJ5;jG?d?!9EZ&@3E%JOH*Sn_T7GLSKo}KKMh1R+vr8~gMGylrEo{Vd zg_nm4X4}MJO6a;n0JfG4;Rm&HV_o)s$5zrGc4C{B*keJscgjUI?XB{L%`)|UUIxcx zp}y@lnnQiapS{oWt+uIpsfZAxkd3)7k}@z2tCLZoTj)-jjRS!Q!NXW+RAJ4&UPh_j z7k2g^k4icjyN0cUquA&V#NGt6nM>jo&Z2gUQk@VDuHw@IXXVGZF}|ouAx43zOk~XY z-jr;AbSqY2AiYvh3%! z2c0RlB#^xT9Llv9T1!C*nq)mjyz+#$I_BydtUvLrnCEyX@9X|}9GJ`a4ktit-RruM z(WffKrBtVGvgxU#2qS^$O?R~KB>{VQCLt(@vL@_&JgHCQtBDfD8={!d9X)6B>$-Ez z_<5jyO%;`bX;$>>D=xef;Gl(_@wwP+$~-!a)Ga0c#qvj4HLQLy8YItzrWI-UH1`xE z(Dbv9$N+E1E|OSKX$fv{y)Pp8<@6@n(#kR@h90eKR+^(>Z|j%~{{;Aro91Y-hYu7Z zSyR)ZP53b6h<74Licslpl(*zM;Z~CV_2BZkXZ>iRR#FWOslD(y0&sso@xQJyfnsc` zRtX ztIp1}#q;@hU;(J;y8zUx~|<{PFB)8 z5Dk&#gGIGi2QbSu%B`RnLk>LJWq-ZPkfDU6&)5OGKAP(GDrodR+dq4HZ2E1^#c5Zn zJ+_eHdu5&71L4cPi!D>n(_`PgnysYlFYC1QtD#Kf^e?wNTZ?o&rW+rZZ zwoYg^(Fz|Uy(!s(obba&55R3Z7vTvo32xpu&980!!E||kB@^D#n<4+B4KabL$=-ZA8^QZluc=(DYZWXa+ihf1v%mD_*zk18rZ2?Ya5r}q71C(i;%5H=9>T;{ zAbEbi)*T@iR1_t)S^-kVZ0E3vy?U{IMYORcWpt1Jviax^ThHUbIuMX>`O4xP|I%f` zA9)t``B;){UMKK-&DLJx={#ZP7-?k)u-^mbZ?w$KAjL_8Tjq~L`JtT)TANs=uuX_r z_sLNgx?}N#`N03BwN+HfRU-`^&+VZlwq44(Q{MJBk+Ua6?{}YwyP@B?ym-YwYoVv{ zYS7~O7w=r!5zdt{9V{}FQxc_Hg%AM1WpO5sMK*v8+$AWc;Wq0F zL0x0!?Mjn9@n#v^l)->_bWf=7R~|Hw5`}#&*h5`Ng%#C1dQ8d6M%a1Bhh4r(oDg2w zz1$Ej-xq!h9pM8Owoy~Rqjs5YmC(M}kqP;-ujhN6ZK@x$qmUqy4-Xn2ie?q5foQs_ z7k{kfpAdc%@S4G_`Y}&px0xFn`aDhY-4p$$XMV+bx1XQGCV+eF`i=HfnbGcc&E)tQ zFN?=FFN0pkcru{ROTH8`wQ1I3A2Evf!1;8KiZ;uRLSCElLk&L`{mODMY6bCc?Osmh z53$mfbLn!3NM8}?sK=9C?SIPKe~{UJBYEmuXQ9PjQIAc0#Q{GBRdHron>g7}{A5hJ zxtpzU}D@3Y_=`A;AE( zp6%=#Z|&=SbaRc5G>fmLy=vg_JY>0^?X;ldtVb>HZXhuD3egMdpv{m@9ikZ8ql~l$ zG^duN#VKjEK>AFU2@@`_&0%vXme~GB_?RJD(UBOIQ`4a(Lv2*TyN(-PwFO6&CSJ;i zeBZs#XAX1C{beLBT)#og4ix)pJG9qVDN35IRKqZXHv9qt%>r5_f)HOxNTot zPH0T3$Wqnu-9y8yTBzA`EX`K056;ZTEep-Ch76XKO4E$F*XI?7&a=$YAJ}+wB22D6 z7nKL-J_vFouvmlC-~EtqzgCV>%Z=f_>l~RO$*tHeIj3^-a|d*nmT^?U3qdwOnPv_5BZm(?mPFXp(rLD&3WhewR!;H zc|+L`dZ&2%fQ=N5y_3fWi$*QzGym5+DbpJ+2OKnD3YJ=;oTlTx=RKV;S~LQ}<%-x1 z`U_8Pp%weF%?`np|F~J(r=MFWghlGfO+(+f+Vt7?z~1Yz)%&(%yT8zj3{Fl-e*1Gh zFv*ULG00(ZWDQYrc>xYBSr`srt8n z)F>4>87P5r&*NZycHz{AJVdA)A0$bSa~j(oeH?2ry9&Mil9YJ8EhG(HPnoxeAAD>b zWS~JnhE46Nee-GE5yBK!aL)RFEasJq0RvwO&5S9(IXTp;VfHvRa*>@q>kp|uc|5jN zFHa5i@(b*%p^Bv%iV8*j!YPQu zmR9-A_E1~I%|hw?7#lhqZ`eT zTe&eAxjd!#PI`@t?zJHXCI1a(&DvXvg%qX~Ci_p6OR4a_DO$erSr;Pu((feX-Z(JT z>1ez=*d__NJiuDI{?Cm1VTckWAQ$b_hx|iGt!!`iSCfb?0>YxI@mZg)|6HR@nhAgZ z=8a*m)%l1JP1lyNZF!?@jX;&a;6R4?>r390U{jYJA97umv-TA0=Gh-R*ic_#+8lj7 zB2eq1BT5UVSq(20+<@mQ-WqR}Yk6z#%gjW%aorW4{4nD$Np&W|;xIj(Op_iqw1?Do zS2QLoh}g%ljVs9%A#8AyZh}rm1WH}YEF6U)Ba;_M7hNVRh|huZ_65!dp@G+>@*m!` zI$oSv&ZzI6wg=Amh@A3=nz<1rp<|tk6xuad^T)54@r>pT;P3RXF~5ws$$0pB+XJMs z*yy-S_3p`3VQ}lg>%V14+6-9Puh%`e=)ZP*jnE8f+PiNmH#k&Mhny~nkT25jx-b|# zQGS3dr{epnMWEu`n!y@#U>1@GGM#G8&I8e4sX~Z^6k%fqY1z%C-^b6t>1t*MhK{X& zk9IH^j~d7Qu17UhV?4a)*Q^

h%kRxZIn12t&7S%`u0hQZVHq8W%AK#ELSj6N06Rsr;n1-RoP#*@YZaX zy7qP!P>>h?^3PB-!Xqn@a_M54Ed2gieaBT-TaV~{=GBa`*>wxcPl6b?Ce)lJcIASq zHmUy!gl+Z^F<0g5^};v3^~^E9?HeOulnVi6N-;C75A*j(fGoHel|}jBN6fq}uCp)h z(KQPme{R0Gyv>HXN?O$bbD&afRVHcAe zE8#|qV}dCl)kl(UbBGzqpipco{plY#IcVwRB{umn{YxCruVc^K#UYXN=;G?e&E1To zZX#@wlgmB5m3W#w`j!7JLr*QvTW+)FigkFjwp7**1BZWoaeb{z4^t0UL-$0mIWd5o zD9pT4uov6@n{cGEegwjKUAJGts~~>OHgcO8={l&?Ye)+SSw8(TLJ!8q_DCcNU9mKy zs4QF8@7`?YOJB9{c!=bDS+empG@1<%9h9a}@vJZ*Y9*WKNSnRqxHUzreXyprrd_ z$2A;fp08e<8M{)W*-_Y;#UV>xlH`t=Nu;pwFWQxK3Am%dmW@Ymj-bh|%Fcb?b*XSm zKaRF6;x*J`Q?2~Mx!Nu>5?OC-9Un=lh+QD;$f{eWmES0ZS`kx-rNgDRaGf|T#3c^eE)`m%8xWxY$I?~&4d*X^9eWl;k!C>R zAAJBe=dTHSx1MjgVXuAW-~(@3+RUB4*&F^3!$aMvH@a)D0uquxM(=(wc^P1Y(bEYp zI9>8|aop*wZq{I|bnmWie#9vMGy*FQRiA5-oUs(E8#}`*vzr{eNy)TMqQ7Hu!b2)K zmwNyJwcbfAi~{^~&+pYjag}YjKr^-az1fR@^WIgknA|yd&qfI+n>o3>*C!)w81j50 z>k8Kd?A-y>)>@Z|)Lm)VcyX1JENLT#@o119Jv1rw)3jM+u=jBk`_j(}+1?bC=1i zp6{}UJJ1V{V-t3ARffgqJmSx$?9bne5z?L@P9?73a=R!qeCO1RZz|^4?ZeN8Sy?2hX8b5G;Ru#M>|(aqpvx1$)xf78FU0M?ao*f!&S>2D z+~18ji(tFVA)BW`rc3cp^*A=oPAryE1733#Xl3M$&$UB&CM=Vomx{9;^ytYJY zc6iYcDVDT=4PR{FO>?Z9d0&^c#}3sfV5zhX35W#0pW;_)g|pe&!248jN%sLO=ZRT) ze)w8fQR=a_h~>t4JgTRf1+Xn8I4NN%aU!qZ!>YjdN1=#Z;mhM|Wz&e}H- z-P>08zY-RWFRtY(`><_}9@a<40HGpBqTB%XC<@m`@#N$6D@%cK0oIQG{Jtny4m zHe<;z7+4!0wv&OEPpE|mvo3?la#Ow^7b~0B*Um%wxC#pd^#ufDqZsP33_$F??S6{% z(u@{xSa4W`r|Dw3SuAk0inP0c`tyE>QM#FHrsHTn$6x^ zxAiP8+q;PY?H`Oe{=}iPr3rp$n20AGLD8@$~__Y=1YS8@z*PI(G=kYcd9(IW%_C&OMp3ShvSEmrV*x1 zLVL1Q!PGy;vyQozXEVriC=nx3RJqG z!#|`nJUv5X*Q${Bc~C;_eP*#LfFEJC)Rww(GF*rHc3(cu>f|sfDTp}C)T}(xw%RMi zRQ_Q;OaDUu_kqF7lxQ@bv$l<^hW<#yh}c+e4DR;F)Vb@>$Yy%BhvBsM%tQx1K~0UP z3&BEM?IV|SkCte?A8~%}Q{m{Jw9RNg^Q;4AFA*_8l{M`_D0@h;t+%X?&*ksT1uwYOQ5X zYKAQMimDIw^s%x$WJq~z!+x@kYnX=l9clw_=lB5U%#M9rq?;n^L4M%F)P<+AD3rJ&(TQV*V-4yG5{O|CPY))J&k6yx%$t|E(ZE9GX>gtdZ+- z=K#&03Ki5T(L@r;jEH$K09``6@e4Oc^O6=#l};ig@WtIMJinHgN#*>mP#hoFr|bNo z*6~B^{H}o(f8*?H<#LD)1%vS1^rGb8(qhW5ZG#7CTL!QcnJ+!-I(>Hf43!t^QnMIW>1idU4EyU+MmA!?-|r8Y?3+Y>&5*i z&09Bhw2O*D zHPG)MJetMIvzW)R>!6oBL}O;#F>?Jt?c*+O=a1yG-~TW>a&FtO_JEows|i1KxVzmY z2hOEPDUV^EEWx%R7QeH5yWva^5M#goG+S7aDV}$FaY#bcp6;}NKRbmy>nzb0Ut4-l zvivh|C+RsYC0Q1WBSJV;fj~fVbTlkwf~kQoU-7l;L;CN{1&X9IUuVJZFWsX=660sW z!qL&c$yUyk-@37KQ{m`ZPd}tz69$|$Wt4DIyRp~$2}>)4rM8Qt%eR~~qGc-H8-10> zi^TuxY~bt=w`0pgyxIL;WZix{k7}i*e{2n(yY5(=l|HFLxfDG};@Ee-Z)5X;-&4d# ztgXl;2KY{$hiZ-OVRJ$pf{?z`^dE-Ghon;5Gm4-55CCgi-mV_^B4tnjgq%d4*jg2n zb&^;k^^AU(tykXNbBmtahXzilhI>E<`>%7-NQlSOS_qrE7l)OSHX&?ao=vx^0gva> z!^1B#0@b`nDwNC7HbG@%lt*_!T+A-oz@)wp{ec2+_m|D1?NYmtK+;!9y+27_$~G(< zJQrP65AbYLws?Nj2Di}vtD97c(_+@%1&D{&4%aaYaP@t?!oSX53o? zC)_9G>;P@okp0wtb$jujI6y$F>GI@H0sUruWrgpK#o}+g0QJa#Df0|(OK~NlwVE7OswsB zL=u}+(Up$v@H6*>;Lk+9+crDio%m%r8g}bP%4T@84sgkz>VU`41oFH%ppiZZ`sv2( zh~Ld>Lj4M^qs{UIA*77qeu5WWNy(_`v#PV4I1w=|EMKNzR0dmp#_WRMje0D^12^6p ziAnBur%LKGM%u~|B;`YcO1(Gw7C$+>Y)&XFpyO{pPFdOiVVuyZ1@W-INCB${L%3Ozu52{MZ-bQ?VW)Ycbs*Xx!1dgUwUM}<(fDGNhIKCDRs zlByNwj=nmpltwW>=HposH;M^S2<_Tq0<=bW=vz|lr+kY(9&%Z=0yL?HD)7MIcF+4?c;O&Z|q4$rP3chdwqaqnH2V*}@4_r&X<4GYY?z9DAm$MpWfP zLt-APsIp==?hawc2{f76+EW-ZvfeKwIL^}EDZxb?O0*~P532<0h~OEXE5D@H2^DPB zK}jkPY8OtnZF&UF{O2sdzw8qTz6xgm0dZ&-X#|#H6s*1=U*t#-;V0h?RyT=A>Yfbm zHfE%jl_NL&#-!8qn;4hPSAVu3I{A<5t0lh98CETuVgr`1m45++9CDPBU%Xja$dLTL z48&zy?y)&9tte=|;&V-%>HH>P;8Y(e{Y;dj>eiGO{E-ZW(IfemzV+H$f+z+ur>OTZf9C&o3?l|-fo>teO&|{#9X!9*o zL=Ju_!c-YhUf7;TV!(A@7V^~G!-D6lvGT&!V8dC_QU0C7HRDpmQ+zvZ+q%F7YV!v9W&^En2gE!oj zDN*>R-{t6Wk!`s6I8TUkY%1)2(Fl1SG#PpZxIpPU{G;HbIxBQv5D6YD(eU@K<$Q1H zA?hP{T%WJ793%L6bUj8#Trekw^gYv*2qpMxuj8||Io~KC$L957_0&Eyr1c)6*)KW2 zvf69f_w{}-KZuz(XS2<0=WYWH29r{XK~O7q@VR?VcUsCmCm6RLeBvFZi@=Qcy^y^3 zd8YDhrUrk8i5fJ$x1MIF;Xdfd;EY+L1l<@-3Pw&Tu54Dv8t>>f%t99EX~)<|RO;QD%Ce zjJ&>zFO_;&cZDR1KCitGBgu$xQX4_j0zJj zM3cHo-=bLXCJ>CJOkaE%S_1%Eypd435Re?`^XqPMVihuwbt-kzE0tPTZgZ3i!}r7r zVRCMASaaGe<-LYKrvVSl=Qeixs{c!xZTSvC-6yVmJQ@H3hZ7VD14K?wJ8lI~0j>Eu zsXL)0DWZ^21ZrI^VqYaxDT0i?aIe%ks=!~$<)CG#E3_*C&LlQU!x_M;%+#rR?&Bj%xyzkp!_+=h* z?7NHYAnp+}89FhA7tK3-jGVHd1PBE=ayBz$DcKz00!RU{z3QxFbeN$WdzrUdHS|6( zYHl_oF(!6@szQ($8(q*sjfk5If&;d9d)wZebJS@oS0MBgGL?B8j7F{bulc}e#P%u6 zZQ<3W-_m`y_w~8;WOD#NzHVcmTJx4>P!YMY92whe9_G2JVAiNWud!n;KyTx*DsiY5 zW;bWxaV_$~_t@s$9zB_nH_B%3HE3mpEI&KgZp9Q=2;f3K3jkTRMOFmQa?!)5ee#9u z?<}9sP$@xCL?|By4f^P@F+ih@oeGNn{4c*w$&FRI0}$+&4}}PXJ8PDjy3~n3<8vhR zbKEymDYlC)AWY8dQ;Ghy-+A~lRJmwp$ejoW=fcJ=u?N-yzUyaE%jLen1EZZ?SYQS~ zF3DOcU}|Ao-J_7)9SKVSG1Z+{G>)ivn0J0c39wlEy$;ZgTRIu3%0sJt3NH9VLWGCv zbm?8{=N&8B@|UoakBH|kQQLm(MI7qSiM%d*zUY_CI+Pw-(4eS+vh|A}y4sIz=fN=s z0l_!y4z+l(DY1{t$H2<9xDI|mrUxO(pxFl@DWEmRS`l;?tY*SGAmqnem~RTQr+C%l zK@$F^hUr3y&r+H&uo__vV}pW_%ALeOGz3D315_Gg1~?&MdYPReuv!3B9m)@zg&ksK# z3;5DM1l`OO!Qqp5uBK52DLMW#% z`TM6RS}?Sw0Dr+ya-X){Jxdp6*1Y>+MC>B6@bG(a-4^K)53dZ{p*l}$jq zwM7*H%*jMhIeD?rj2 zf$ldbUCTPDNKV>SR~J`1_R4khMRFKJ2n;sviQ!t{Mm&3 z60*PgSe+OYt>DHNdOca{>GN1JuZc-uM+rIApz4Sz#YirEyRrrZ>*1|ip)n;}$fLKC z6GkAn2AE%H@D!rcePbU2Mb z&R@O5WV6)PVIkHA=r&_CS{k*{#b=@x9xhj3=N?qka0bV8QH z4HY22`7V$bgwnt1I1DCGf%W_1$`o&fOp}Io?-2W_vh6StkZwHlSaRifsG526#p8YO zPnyT^eRw51qg{ZigFxl^+6P)n6}b2b9X*|Aqx>I)s#eFkl_~>5BV{jlx^29+?;Rly z;YefL#7ty{iM4i?%BC%zRc>t0&ijG+pP|0bHI;FNr``HV`W3&Ofyh)UpjlSp>>j-8 z8I6yoKEQ?cU~c-NX{Cyq9+N;6AF&Gi1uL}IYOyo(50x7~G>^+KT`PCZq-SZbw9+~R zXFd(Dc>0T0vm&YjQ7J!Ee+xaUR(sq&y+=6sUKOcy*uX(TQ^Z@&tw)9@EN%FR$}eNs~jIB{%`SsB}aV| z`igz&$kISKAf0F@3IP+b^&W_aYff9w)6|SNZP3at&oRG9TbLHyuh%W3?xNXnXnd8z z`p{7S#Zk-;(_bs52dJHEzy&Ez@dG^Jnn|{lrJXw$qjdZOA~%y@95dgBZc?w&!>vN>AN@EkSZ}rHMn$?9Ce&e29snTMd|ib*+~odFWqj^%VUA zltQ7pFZHIYs?-ub1~{Q-i#6_hr#oat!Y4I_y-8^B5F>knc^_EtTE0^Lbl&+>rmckP zIm)1vxNbQG=lLCUisMBn;b!nH4b0kSJQt5Jc7LV&DNezh3a87hN0&>rAf6ewndG5Q zU^Zcgyh%g0=O*DVF8nd^5gd(ICtyk7ssUjw@-)@7fvE~9Kg0bK%kRkdvP2=ai?QfO zi*LiiPM|dOQf^^QZ3R1V&i)$X&S=QlTZu(WcG`3SgQf7GJZIdo_5gy3Kyb0SR-Gi# zM4Ww(f-Dglw;vJL&Y=AYuzXHZr+5If(;F>4r6g&1MHuHoN&BQ}b!l3TSYK;WJaqv| zpFaHsj;|2#z%qT`Crsr$Wb-IcG9eB8QqL_U*oF55d6ET}1|DwHSGX;Pjqmx$&qbgczIB){b`G zy|*-e@`T}TOGJEXPa<#U+N9xrpP7~`NKk4rKIH_zD5}Zeu|naOZG#Ksbad&qFW_|u z7ZVoI38P{woxY|jap8hP$Bva2SOp5{%bpK)%bE+jCWfaI;SEL=(g#nM`;FOyQ3oAl zAjE2%THXtB`lrSWyFKk*`h(uj2;T<#V#ZpKFc=C#`aZV>WQI}sQAk?k^&ycL@RmuI z)D2JeR$5a?xj8&ie@Aa%>zq>mc42QUL8+NK^NS$uColL31qjw$VCVMd#RtdAFmS`q zoPo$SZ)1Fw59w4cJ*I;DAzT~}hSPn!7Cmp)3_kK8^L-S)GV-+6Ty;&DnjXj%R0u6BhDKp9u~slzyV ztZ`rwyxC%>>{}h(Gccn&OtUZUQ2))+e77&KA{+R(ED-J0mjHs>Y$qq&q6MNnxCXEp z-)nR{=zz1(o7JuXD1XqoudRH@Lr}BgN9lk8FqzzUhMHKN zLz>TDGSV9vZKE~pyFEQ$9K1kI2p7I(A!U;7{S=QyT+5oT__ToMipvDo{^s%3?;?yE zdB+iWpZN104HlnT7fKxGj7-Z(pZ+ETtXDwubQy6=t4V&KuRbXx24yZ?dLx+v9Onpue1SdvV@8!x~6R2ZXUYz@4og>Z{ zo^w&3UN|^h zAldk#p&VexY$20%=wax!5wcwAEm4vs$lIz_$tKLF&vaa!P_B9 z+y)iPpBI{OYjunPGrPGnT_?}izXV4u4N0Q2`Mu4W8$Is!WQC1T%|bQ zrfFxJbh^Z!m=}Mj)s;}tIe-BeOQis%kS0ov+~2th;CEG(rev7ZS3iA*5taO{pSW16 zBVglwQzT_?KJ*jpJ*%3exXRf3MS=GunMkeykg2?NZer}6?nJ29#R8danM@G%6#v_| zr?Ujx_~I7gsjWG=M_#CWCi`c_@0?1C6UE9bH-9?Uj2kH7+7(#h+#~4g+U`X17Ul`@ zP<{1BX;f;-=R}R$C8hqy*wQs;RNtQB=|jDqAWhQVIe2p%H>(JWZOfJB%#8-Lcc|+8 z5@4){4oSgIx4B}*vtsbR9HHYjWBur^B(&ztLHZ42TVYzX?DUUp*Q4j3*L{fy$n?4| z96u}5FO1c>iS4G}wBb|wT>ocCWH`pe57IcN>HJ3nT}MT`vLHxQIkyhdq^ z917Fm<%w^0t}IH|Sy>NapyT^jN3G8#gR z9*x~Iscid{H*@~=T3~lcj-Il>;z5Lf!#h{8vZcZRMMBJ03ro84%|kY#{y+A)3J4pR zYNZo;n{nhyy;_$?{&QkP$ID^0Pe0DX!X`rMRAuL_yfB-FGOj|o74^odmCv*c2!lER za0RU<2WZ*1r)C5Z?v0zhctOn*V@=7xQVI8Gje=Qy5Ve`3BU1@vvVg43j z)+kd^;BeS{K*pah1Y8j@^dQGO9BG9?@NRjyxG(AThR+sZF6pMU2dL^vS;r1_y_vT0yn13644Vts|Vsw+^KQbhGHWptI3IxsJu_L0>Q`Do9%)(G(-5?zA_j(3H&OTP+!yY=WTL}Z&YOCc0u#Eg+fNE z@d8!xGeCjU&vv`{Vvv#w%^|+@?n#}NVeV~c*8-aLg)URXJd(YR>*b*uJ3dYyZrIns zXa0}wwHbY0p3xEJgsf4M3_4R*+1IMDaw^nUY;Hm~BWga%OOml!5tZSNi&=Q9Bv!E5 z#D~v+qcnf&?FwJo+j5amRPL$P5y4Ch*-T62Uj9C}VRG9&dWOSZM2vU%&Q_3=3Ysgx zLzDx3!Vz7BnXf=1gxN)vduod>%`)W(d;+%V;)9&pNYAsEX770*qT{ZOV6F2F6~9gJ zuKZ$UTMP&Z0ezG$_0h9&$wV;0fs@-yVnyzChH!t`M}Ol6J(nG8JyS4)@1ReN3j?)4 z<|@i%Z(i9x>9VNHe-pri&5@pOy?yx4KlJIyc#V04OAwBQ)b-%kNkmCET6Wd7gva>u zO4m>4Y>hHtg6*9SKi~tV>%;y^u@?Fpa9Dq@&b4gk zB=;Nr>YrZqgd%6HmBL>RZ5bIhQ)9Nj4%>NBrEj&RRjAWm1hK5!PZtWv7k%`m94G=Y107X9^Fzry^Zs}%q{%Q+!8%# z3GFH@2ul-@ja#NuaW0rXU@|;UrM@F3k<)YT9AZqu`6j+I+r%ZmHa+WvS>2CHl`f~% zHy=BhA+rwhp67i@zAK^X|GdfIixh$D7h{`k(kyOqmmJI;5OA325Gw7~SjBHozvv5| zk$M-Z_Uep@kVOVFi{{8T?t!`C*F{^GK7ft@DjFXYNg%b}jga)q1U;^GwaauwkL03* zka+iQhy{AHr9*C}@)p%usc{v}VUTWPBgicuy;XU@R_7QTFAM+we~Tj*e+=QW`vQPgOwo-{Gax6n$t}PX*mkXnNKz~jUU3ou`vJ>I0%Keoo$$Xm zbDi;UWl?;F!9*P;h&l-gR%f-*Es+obT%=p>RX z#)OQh!ytqp${^~F-Tkzmc0cXDPv_lp?s@lr?z`{ZQ-0ThlZ)%7=k@ken3vkE@%VIy z3%1u)9pAUm^@rJ^hjMzjqYAs83))0R>2)vtV#oZvk5>35#V7V43gbUfgPX+oe?1@l zwAgx|sYF~lwA~G}ep~s#lH!|wgO_xj*{P9#H{fxcAs<>Qu5Vor?t6SkFbOagdqteA z#PraL?uO%ds-^pyLRqy;#i{G|%dI^9KjIc2lzs<6Z$m9Z*6>5$dk<)VOs)CUyctx= z`DmX~hB*|!oIyqc(d`S%SQQ&udwp2l5(`!ZnRy3FPiWaG!1jlEX%SkzWuptVPMf-DWs>su0I^{Lfzck^cHO*tw$CqtrBiN@0ZOQyK zU6;47Qz9voal%^NcXapWvVfe4&f(Q(GrHK)pNbs?4TeIwWlPgW40r{!nbn-!#eN&w z^!S;3wNy zI)lMzx2^y)NL0ZuQeJeF9Sq%A8xrwedmx#b<2w79P4#1MES%}9ltdeLVUvX`pLx%S zH+mu0XSg?bqOHoMaN!K2A^qEDABM$vrY>y(80;txpE^ob-~-Ki{X8AE9VL7$Ru+PC zFrudVX^7s%<}RNRU{h1H)adh{+`V%z7!~=~gJx8mewLvgrNjGONeNG+o+;9?{*{eAop2>FQva$s}M+Tv~1)iIJF z0#RlCs4CN=!X0{S!?%qDgXk6yhm{`OTVxmniZ>RIcoz@R_pE>v-WtAB4>>nH&P$4o z4wZ9-EiwP8Y|AoKvoof5b74BB_=U&KmQt_CkObh4lG?T{Frr;ge-F&?Y1vUfV+!aW zz#&!*EU<7E9>f&5Y8#;3UCa~`ZKmYW!PgYWxRn3Y$Gmo-cs7I~(DHHkDLM~N&u8pz zLJE(X&jImdy0NihWBxLohX8~Q{h3I2;3s2H5c2-*E%<8fRQJiUWX=thoBil(ZF+{0 zkMhzXOB}}&@A&hSE+Eu8XAkoM6>oVY6r28a_x7@CBeB;V&t5D#;-ZzA*lLF2$9EV! z%!R3>Tx!-OvP$q3qQLYFPzaCE7{fc5L_mlJ8a01rpjU>a+<=!9DsSZ4>0O6!8gN!< zx%Kj3(%Po|aHq@aj0Qh=SUzu3YS-sTW;a97e(*r*iOcpV`HB~DI`k|sL68nS!Ea!j z4tq@uc502OdbQ2o*(MuZO!W;-KVvzTGg4xccj0+82szLql=h>RIP)c#=W+8BcRdA2 zA^=d({A3;9k^}Z+ze(QZwBr1>xzBZlt;i{`sLkAXp&vNs1Zu?VKB^eEd<-5OcAL?Q zqt_@{IIHp=IKC1Cf^Qq}bY-+^x#ik>Nwwq$G30JC6K5zFgSt;cLaKNVOKeQdvOaXs zQjbrf^zOT0l{wq{TUk-f+zqPU7vmpn?}-4X2YCY2G>O-WTo$tF_%%%*Wfh`>Ca>6n z$?|2|zC{t6_E#>ofi91foW*%b%vmB{k-fxPm_C{~bUW3u5OYH`V5s+6&~DFu19!~$ z_b0Ohx(Dy;`;@Z!Mswt~b^-KJl(+f`g2y@9!otlgPUT3^(cpUp4FM{`@6>O19OlO_ zA@u9|)E+CFbglpnfcjJshHq^=nOH(Bee^(xP8@Ycr{i1G(kPcR_KZQ(N)I`}qe#|+ zQPh_^&fs1f)eJz^TK8a=eKes7T%A}9B&!_Mf>OLGB3kK`54Lx-;3|)jYOsX5PlR10I<}Y)B?;hT9K9( zKhItK5-t5$OI8#^;DGLK+g|c9%~%kn*V6-uf@17_i)UI}&eg#s#M~O~zblGB#5DK| zgPNu2qZkuPUBhkwb5rFhdA&LvtjCV(gsoO)f4#GXIYF=nz#yNatU4oX9uDwPJx9q=&4B`5C zwLn)eDClxy^;d4UOUC5o_)qVVTQ|HdU9ay3LSq-KvFL}x&pa(Y#8)<=Bg7YT5t{%w z2Q8DpJ)VDgS63q&L&}NQTvl^^YLgLoYg`(@8yQoYWOKH&pf$TY+bNN~fvK?ZGy|Mt zofATgIHvvTe<>XBr`Sy;l?7ud&vQ8x``bBAdDw?kK-$7uRCv0E{Aa28(t}x=^eA&V z^&(}pvU7#0nptBqr)fS09nD*nYEoZpWG0tUr*la@-_f-r5UUiQS(G!lTqtK38o~=} z&4kR=S;6dHDILgAGOUf9cZdgsdY2iIiJ zm;+qmHZ7Yho5f5Y6@R^Qwa01bBE479b^f1aL~K7?1gXs{(|lDasxTuR=hZsFC9@yR zzLCn1#KhbE&Qr+5XK*G~(78gO>e42eYj%<>%Z948Lwi|V+zjM6IrV^Vai#oOlJAbF zIr8q!3M%-dEoN>D`}PfNRp8>kKXT!JAum&Wos>V>Eag zwu94<(KXfbHKdiMY#s!2*RviZ6L~u~$47DBPsAy2<5lKEAKvrq(B0W0K~yWGJb)X2 zFfNaFTc9^C9lsKg&iGXlzI%#SC_|8w{;UXM9gghzK#2Abj>j3{Hfo`5yREu49ibD6 z@u|sMEK3c?&#h(maMJ_F?X7T@$NMko)sHll@wNS`%THFGWQmh5y-2f)eF#kAEPs*> zP3kE$l>KVUqBExt3AcpwnV#M&tShnnMT+eO?{)D+9_C8EM^GR7u$nJjeF;M z*SvSUlg=^vMy2oDd1bujaSnkg9%Tx}FXSI07y5jRDa)cONdyE=qMr3;K~^BQ#?b-E z`(SUaR>W7q?_MG7p=6GYJ_Mu(Y0ghb1wcRm5D=gb(1ZL3q>IfpV~+FP>`*WO9DR!} z68dvuSI(Nx!*A70Ybhvr+uaKQ(rELfwJwsfSbr0xA*|t-n5eFXxR=_$)%)zOg#-KW z6}jFhF>ED2EO!zf;?Q2?7qsU;_gMjX-*n!@`^8PK<<7nNcfAx%!a@H_AnaqamfM4) z9-7T_!j0c?P>F=rnY`>@{jDkVmA?t+dK~81{*Sh*d4!QLj)0ubx1k3c zNT;^%bvYM@Bd;=j%M>J6-v#Jd7Y+0&SH&{H9&5rg&ATlE37{x?iwXuP!f>(We+SYCd~Jv24@PKD5k zfnsf?4wP#$Upt<#O6S9?7h_bfo~BLQ4d`L{V$AmTR;4Y?bY=_CkGizS`I)o*p??~A zU`k|K8Gh#SM?afAWPugWc2Hie#+#w`u+cw8^h?3s*qe7>IcVTUlON!!K#-NGB2;jWfZ=I`O!pBdAl8!Az0Rim?kA-H2SP)P{ZNt(UeGCPJ(4 zYns>%)k(FD2&wFgRwhj-rmqryh%pl&$mLTJZW%MHF)#Xh8KA8g>?b6Qcz@C^%eof6 zOH6!FG0C{_h9%_fj4SfB2|(Z8w81CM5BqfNOJKUW8GCQ1$B|1MO*`phf^ij_Pm=uW zZu6NF`Bm(ZPY{jq{3`#H%0|EB8;+6Xq%RV0S6?dwK$u&9Xty$Vy8c^su_JAi`yM*W z8uWUQvHsFq9K!NcEdE?cLFE_CTx@{Gb3};o#Np;nYc6>4?h7z^?gzJVgAwiZGZgA; zQsMmV{$Xv>b1i(g<|7yLpe;)!=4easf`!mz*4^6u0NJ&ar)vZa+pUpRkHBQw9Hi@- zd8cI){CMdgpk#sAxVKIS7ll%Z9YfjRFYk8pQLE(EYAwOTl4WG7PYp>hyIlKz@Lksy z4HXFXLc$>}2nT{Gg4KRnLu%!jLqNWc?;(JbRYeDg21G*tB2AaeMugz+8R@iD>%hKASJwGe2SN>JZ$*M_UY;ei-I@DwaKWpPH#J~tt0F&PRr2@z4~ z%cIv;Bb5Kg-;KYK|3v2BkZ3k4KV6o;F>3jv(klnk(Q8pqnG2sZo(bF(4U)6Yzg4WU zkIY**m&4biBp-110o>;?G6P!i9@uhiVY>BmP?}r}dF9jiW0mBKl>( zTZhF;gPd9~CZeG-53%CS)9zTk@y(hcRd828n5zJ80=_==D``f*adfTM*iKK8ouboh z0Ab$QlwF8f5kPcIS~bK0i1AE|g7Wgznc$R3(jxsT1Y`@rJY2|z!6wLmfyU03X?NQ^B^mOP10 zW(@iFQI4Gs!+0?*l8=v%T--tB!a+IEbqo#8;ro8~NYuXI&khsKp-NvVL{(vS*Iv1v ztWNpo8(Ej&ZZQ+b&TF#4iz`+Mzh?kNmk<&~tEpJc_<>?S1YqnX@fV>_Tqi4}jnY4= z7&>pBxtS;>RY@kKH;d=b18kb$R}69itw`4(upB|p)|+t7C9k%@(2)=&+<%(hUEqS; zE20a^h;j}em&;`aV~a>#^aC(coraSp=&nIeFQ`nv_GZT*&L%YL^vok9i$+X2%(zDX zuEoUbq#~R!<~g?x?qSN$LvI~schf%^QK$oxe!FHCS6=Uh(t3~a@pZprh~iYhhe^fQ zdE$XH++KNm2tuQ659wDqTxf&WSMx{-;9P^bby@^hGr&3LkDQ zigJFdyUB~!GrJi&nW%RtjZLjnJ@6aWAK2mr%tw@}-N!Hxnl008vw000mG003%pFJfV1YiDwA zb#7!XYIE!z+j1LA@!emsDX2&WSPl|!=5R z9?Y`zhW;8R)96z)J-oyp=S4iv@sHQxZ9GX6{BsoLdCY&lgFgWP)fk7Dqh-E`lIgoJ zfsdK^co^rCFf%{yC*l0Qh$phy!7Q45G|B~-XbNS$U?MR4)w`p&MX@-Gez%PBBKXes z#`bqMg6{<5SrojKA3zMd69_h2)4@$C5zgTp9Hf|KZG@-f01`?p~{ z4=?9Yu*62eo8$A~&ER-&wtp0yp1(R89t7~u;CM6$ZeL)78Fat1y?q@Qv*l%flHP1z zW52oVcDtBG_7`mR_rLx%_~#%068z)Of4YEw;P>C)=LX<^8)iXqod{j-Ax_>?z9JcE90@!xnvTIRS_s{$~PbAl;K@naCi!5E_3b)aC ze>}Jt58n;WE)ECd{o&CF5bG52O_Uu*MF_LJBO#5N;SAoLUVQU*I364gN8<~i^=xo- zvVVvm?`Clk&Evc{NzS5q8cqSO-TH7i+JAL4xHvy%W*yo9#E2_;D&Y)|hvVTsU@*84 zfCh&bMxbXHl4^NoN;F?D<{@V75d_FL<$c6DG@WuD`t8<4%A!w}XSTlcS@H(~}Va zpJeHLewyaya=J<<%lt5!hxbtB`_GAMKmab5@P`S(pY-w$r$WLZQSQYZy$BStS?_6=C{Q(&cl zUBK)g6=4y*x`(MVoZ><@R{Oyan{+l?NrgxQ<5gw2lX7}awp}{=z zV9QFoqS%M#)et-#g}2cd*SIQ3qC4oC0DA=trKF69d7Q#lwt!inzQ@4mFuRVEYry|1 zoad1$g0Z}Y?d)w@e2nhT7gOM)SBGaO;yF&Qujdh0CN9YRAh?c-!KZ?2y`gjx32J*ZROh*qOSW%PjpECH+}(Gw*B$4?vzZo`Qyc z79mr*o!7AS<4&IjddoBz5ai4O%~1^t*)QQK1rCVK)A?=0Wa_bwnTb_n9X#3Fv*wxr z(-rMx_nUptF%#9BEViby_tB?bLf9UZOdbs6C=swyShMqm& zg>7orMtFs(sJfDz^5->;ux?67RL~se_sJxvpj?a9{ye?zb~KKiUeGxmoV`9ddpA6O z6TI3#`1zZ&lk?-l0Clx~zu!@KhSTXmdIM_8^eE0@Hbhz8H4BA+EiYstUeOT5rB$L< zn=!$crOLA8yim)8fTgYQb(-zZ=OAfqkkB8_?*f)#a1$lV0CeA*Tor@Dcd`?lMT;~m z#EK0rm)F7FEXpE87IsdjJ&w{Oy#`d%AR}cm2cW?fv<+@TDCQ}bo08j;1#vQzKn@tX zG2sA%cs>>1-$AEc+Lbr;+{1I(M3;kL)4L+dnUe+03jJ;W@bCf-KjXo##u|*@j|o#x z*wO*=G@JltN?@x+h-YpInGmMyZ3Lr)D2I1pT;PtcW#})KpzL)&i+Vdjku4)$DH@3E zgq0y5j^O{Bs5lC9i3-m^wfW8?jSFqS8Zl!anzh3BsvUI8pFRLa`fEH@>~@vL$AH3F zWwYVwQ=2bPJ=g=0?L%b(t4Y)vuisds;M3Ex-GiJ~&5{bITaYg&6A(35OV};ly{AT$ z=0%tlBpH-C%HNLli73i`mR4~8iU&5A8IJdU)|$> zj>DU%dn^7}jWB_hrf*Yzxr*n|w3`NdKM7Kp6BC-1{Y6;Jk`O?|sOg_v8U6lbFTj1g zip-}Y>5oRap3=Z! zX*Gjt?G>JC-hF6b*jR6X&3Kg#HZJe3(LAW6Tm6st*@Tul+cI`-h7MW@(EecQ;qn)g z0~b40N{mt_Xn2oL#)F-}(68x8asxL+c`ys{pDEjYNu#|Y_y%bCSD)322}^$!w+Cc)w-^opdg5V8q=P1Wh`2Q z-+muds2G9&_~W2;?^OmtG+Au~?6%$rv^wBau-|Ufp8a;a{|x(u?AF|OkGd|W*5nZb zYtI|5|8M1qx>kG(ciMCKr{HM`){^;h8l8d$FEKVg1$)-7Km5U%eifR!>`^ntGA_EG zb%8u-#+GH?sBbpl8<1s&ms7GK;B%Iy1>7TAyO3Fa0=FtLoIS9PJ_Q4qO|4ouEU*fg ze0u})JIe9aDE&rqybJKnddhlc(SNxIL&Ut`PwY8$n9AaGF5Al0$b%|Ifv8s zm@oU5x$dY(n|4nhuyU&4?BckW4Pi}kYf-0X8CI+wA2v(0;7U8gGAWz*&WZ9%&t}Oy zwm-fG{YW!V)5Wa(VvJmojflKvf&5EC-t`r2Et(oYNb2!={Cos10zW@K`Q~_Yw{fg8 z_RQhC%yD$HP+X&Hes56=-v{5t6=3fA~YI+Q)G9vVWwidP~fomau`_oKvjv1bTa<(LqT02erkW zuZ>R6#}()=lSdQqc^wJT;%2Q5vBE@2Qlvcy`Z+8cY@BAG<|_zezPU*XzW3|0_NAwk z9ES+6zkAwny+{+W!P{bj>XixkyD&@O8p<43(U2tfM#q*G5YzTZE`J(%v_RQu1HbH%;+PjO$ELod+F+LKX4m2@t>$ z=>(S%nCoKjfyA#fuqNQ`Xfy{ep`2`ZlQhfVM?iOE8!j7v$A)rk26r!Dz8M}Lo_upL z1W$qUv$MhRIC!9`kmFt4XJc}+ha&mh!AVe&){p7SciBlsSN?>BP!U1BH`*$DF&v=4 z#l0(QK7A@1^^p%zCd|}(R$rDS*?{`p@2atF)Axf%*J%d5W(B#6=`P5pOOKtNO+@sL ziGeON(BH9e@7cF_u9$z=t@bW+k)$D#BUI_Hh@-zmkpZ%Nq?|fgay)M}u?sphsYzXa zV5&JNX$6qbZ9e0!e8g#S$T5`6)tP1Jug_O95eTHdBCj4vM4ffx>mZMde5JuHAKDfa zh-T6^47RO_{|Q-HsR;6?Y`JuhemzeZ>gbJPA}&7gLFBc(v{6L0*{6p z46vCl}-@A7`e;wRsgGIVPO+&e1^`LiQOV&g?{>%lrQ|XE%yA&fd zle9gV3)fkYB)#;IF!c2+Nw%F!fxTI_^{5|ib-pn}!X@Q>9|HkYo?dhc7&{1K~gnbfR9fkwU85H2)1 zTkJ7wzb@%c>{T=g0U)i)8O*ov9{w8^3Pth@1{Y?~+Qek!d-onXf=#2VD5G||vRvPw zFJg(&m&8}Vfi7TF=x*6`_a&fEZz?=t-jfE~R+9W%=bwG~%$mFBo9Z?SECTzBWj-_U z@b$OWGag#4HvhlugfAH$i&X5b6(wy}kZ3%jLm|P}3&)@R0^sLhrj6z6oIf+B2@raj^jECP*|0Osv|yv1D0h_dgxJHs!w&JOfXqcQjI;r zm6^@ZEpuJ5F{ndC9#hb`pis;+Xg!vF0vHqMcY>~pwKcrR9p=UugjCQhwOw5FRS}5I z@VIM$)@4?QKL-D7WyAGVvY-JS$hnS$|{@h zsa7uOV#GzMH+?JT&;d5{Db05}y(%m=ciSlvO0Z8sxdgZs;HtIcG8f_}b^4@QH^!i- zFi@6!k_kDst#vqQBJwV4aYluY(cYCn^Pa|O-z+wrZAAA$h_(KVNf(;)W zb+Lj{6lQ7q5rDPXnUHlg$#S5A!3N2Q%G=si`}C9SxIOAkM2A4|jb7wdmC7b@&U;<%AD-@DTlsJWPW72Ybi^OtM-m56GW49Md$fs{c8+p$u|-vv2(eN>vErY>`W zh#i*Nk`xjP5X{h%gn+4*Iu2JRoDP9R2dHIT`CEfBwkN{ofNKCS)fSaz8QzK!t?W|t zTqc6r!kd1_Ez^ee^r;QJpU*(~2A;9EMaNR!e6ke(uTbSH`17d1ZK+!hS72jDUORB> z?pSprRA*MSXiYFq8$}9dD}q@k{9TqTm8ArY_+AEqNhArt3% z8xd0eGP=UhJf$*(37(tddq*6cwkF;tL?@f>%vfn+ z7?pFw%TZw5kz>|U!|=H$jxlnWC6$zc0g;B5wDJ9RnHRvWDA8NAqO0BX0-8)}REZmR zAAO2*JaLT7M13`<%Z&15!4eQ!+0D zq!4RU(t{*^P~MPlr_oZRq(b#rbPQQ4=ae&@`T^`8Wb2Vyry8v4d~SUv=}-cZ-RQHB zwi@?AZIK*Uh)h;S{QNgFz$O%uLZhV?b}R=nC#64$plrF=g2a)up`0J9ESef7o$KVa zqHFjLQdElXC|^$&g3JN`z!dW-D)p9zUqJIs`Hmh}wS)yl3}8z8ur>th;~|w3*OWo0 z)CdSO_!mx1X0s9pE+FT8M#XHXN#XAHW26!^EmEKk4-ol0iWb;LADLaCeO5)|l!Ofi zTU|xPWCj&>SGHi9vsO*n#vZjthiFna9zX+5dF2)?^az#H(HS*>EhZbx9X|31EkFc- zw2{3^Z!iad?1kD)=8AZ+{Q+i}sS;!#^_!YjX`@Gp)6=I7mm$M95Lq*TBhumUgwR>l zd?|!Y84qn$t_@>YLu$>JOIVgSc;?}D6};fW)~q-k9v=@5zcMe{Fhi;ww#!h3+9B1Q zj-Mff9Le3}#cj6jk|=nmRAv z@guwUtrlgSd-hcSepJsJpF_@d1$_euZ@D6XJ5S6V+Xqk?4&brF?#sSuJ9q3Q<#7m3 z@B#g)lk4F*LFg|lFWSIJ5DH~p$W5<&0U4IlO@p-lB!tb5Lv6HyqlIUmI~^(mZwOuZ zAwyS0CewZZ$jf9U9P<#Nc`y33p!?{4#{%nwZW}*1qo;i-tF3oO6HA-$&ST>p$pwgdV2|CxB(&o)78I;Rxx@H^dTgt4K=6$Qr-I6Xj7ad$4CacJfWt5n00N zP$j^_!3#BS?gY$;h_X8IFs?99E-@=7odIz8C`k|=0jMX=76fIg6Z`lCCcel}<2TI{ zG*iR;3ibqR`Y?IBPO46Tfe}l2RZTg`t$K1!RL+YtTm^>Av6r__{kUWI-^bpmAlM3? z^`G1F2`H~`^If;igZV?q8NGkBaKdhq*KuwIV;YjW#=fl+9CHTg5~mc%vYlqQ&)zg= zj%8(%Lchgbx*zp91Ui5MCuXwpsBZSJKDxxJ0!_63#M@F&g-Tj9`cb0#e}X5X%y*2Y z+P>jh_S4`br|sAk=HAhNgR!@*J+`Gm)|MKK%6j(L(o+G@)MTM#0`%?iibgzaRR3Oy zs!LmYi?g^Mx78?8hac@rS8C8y?R?Z94rZu&p$=Smz-4MZ zL(6QWR+r|oEq^J-Kd<_#NKI4Q%gA_DCfI9vm@`e>mOkP>kJJ97YB90-Egrde+Mb}0 z%gt(|rTsa{SM(?N(rr5s7<8tZB_yDPiFr6 zE83PSKO#^>Oq*eKh}KK#rCqW8miy6SEVb}yP3O~bmG_n`lMd#QNWz^dK%n2#rGkXF z={@tJVqx@KFK|(uck8nO+7`2h%I}S=@q2qFMQsz%8vqn3j)Yy6E}b5;9cjA$`qZ_8 zQAwc0$aA2RU4GDgdUY5mcTf#r*SdFTtoX3HJ1pYS#v|5uh^=(DmmnKY{pJd5c8Sb{ zTW#fbXlG?jP(^ha zEK%=8=0A{71+VJFXS~=Z&w9+h@@1hTkvsfnfc_nk$n@MXmadvFKMtPZWrF&>*FM#+ zB(L@{4+UA@AVN$D8J<|Xz$ql|pHWJHW$B7xh?aiXLg^zfhDj1@Iq~KA3CV;%RH}9V z`KYq2E>~)KS}(vrksBIO8^BurdWr_l?&77f5Sj|A-WYDvB24}_Rt%0F2l7!>xS|Wa z{QIFF@R*Wm9gXU2DxAzyz^MP5Hlg&&QpkD`*{Q3I&4So=*%r%f&Ju)Yde*2c(BWFR z{$0j}^tU3*EHD#2Rp2M4Hpa;*SOdlEOapB*{TdXRR$(#I<8{mH8NVcQ6HQ|vOf;p9 z=~{UA&Jc2h{{^#em=t}}lj7Kaud!Nin=K!NoaE1U~Vx?YzQM2YwcJ@WrxElVXBjENPM^6ro6-@X;*= z(gV0qextKw0x{IQuyQO-Nsik~=Fn>MMDn=^@Pm?-JQd&bIZXC#~vy3d!PTMJc4aQho z7ALH0HMV%Q({@U8ac0KG?$E3nt8f@C_f7i5-+DHSfFrI4(D(|Npz+K$$z1EyYhi{n zXjOF$IKGym1|&IJS{oe=TD4HnSUq#z*|s$({HsiUeAz$~gJEAI=0u7ssU_@V#F>!c z6&Jq(c!PnNYMJVv-$B)3Q!0V;iF@f{znZew6u(Ex4 zqPh+DJLF>y%`0Xdb|Fv~v6%L**pZ8%&E18M3SDMYCYW(fkS(QDY2uy42O^MmirS^$ zxefKem%JHU_tw|$MvEtBm9?q1KXGJP!Dv~9v$n_c!5W#a>&P8Ku)Q3U^7DJoc!|v) z;5GK3s?miqZ)nB$M~|!Ea|{0J(_!o9*tDkM=o$Z!0jcYZjrFb&sqEaT4nNDxF&4a_ zgGx`X0O`}Q45=b3O+%uus}gbUx*kcQ-jD@IHE9fEYLPw9>;8*`{*)XD%60E5u$QI41_d<_pm5cCdb0Kh2;@TZvwU{sE%=5pi%)>UL7n z@bmtxxS4mn1u9B~(@MF+N{zw6XpZbKegY;K?P)HdvSM;X5t)GUuC@@^TId<90dWg1 zvY_ySo2Sxn-QO@grd47!G}}&5e+6ArhrL;;TLUW`Th2FZtd7-eVHafTz!`myF~#L{51q+onmNzPR6En-gYQ?r^J3arFvIdh@SP%bXq3EyP9lb4z#ThFhV#m_2Rl|5C-19G^ z49T;mHmw}1xGU6q?1A3B>2}@>#)#Amdda~ac#Vt|qm8OE+&V6SCFwRJ+W&11SvSSC z!ma{U@R1LC{~lNx^mh<;0`<312=Ka{gAh2jh1PY5x4@2*bZdg&fPRfxLTWW-T@m}} zp5BM-HHY=7wn)^s2RPu4h~H&I#TaIUY$f@JWxIyU{kPqw`(nUJqO4^75A!UmkTR?kvbMLL`9+4)jcwe!nUvclMxSLpz90$A@mRZyD%8o zm>~H$#i=XtzM{`{oGlkc*-(?g|NyspnQ0BHT$8=4;n=Id=bc5G((AVc`amUeo3K~Yr2c)>b zV>KRw#I+GhF@iBi?6p#SA!a8=u496ZU{AvmFD$5j36Bn279rAQ$M)*bj?CxAGUf#$8xwWAJ|uo*u2AuCLbZK_)p>|j4L`!rOR`| zpX~ttWrSJQ`k)#^p&UW@4~b9B4AA&ChZR>he`xb8{@RHhnu)8z?4d<8d%2U6Tvs0x z*!cYNx=3~jSw^(mE4&V%6Te+q*WvNH>uC7zUq(Z36_t?pnDr!CXRn{;xozfpZJyfh zWZK@=8QQd=AN$6n+F7(ib%gC}haLDaSVmj|P)&5o(e^QFz#e})BKMy5P`EUVV^r~S zo=zZA6-^>o`wIWNy{%hKIAul(vo*%Ga&LhE-%mOYU6NY?!NQN|tHe%B9dKw8CT{8u z+D&4KnC=2}4Ief2%czaLIn~%>!L8=|3o~CL(6x39R`bRzvsZVhTz0^$#I(V~WU(wf z_#vK(iO5?AUw5*fs&P^kL@yJeH0}^04UY#lz-2-b z7D!20;!w8GiS??(GB-Ahiao4)o3IpN&$KKS`-UOY>N7EjI>dJWx>iqYA;@rW~kLvnQ zpH^1TSAQ;Xu%GT9c`BvDkx7~I+v+k`P6ap-Cp2JSMG6ZT_IsbQHW@3*wkP{m*EEuN zbk&Zu0=Ob=dIQw^;uj!K?3M1FwR;!2B8|r<2PdFWpc*qA|9VAAwT@zuS8|Ph3N^J{ zYlj-EIxC_iw7)hu?Q_-DkV0hK zW*m$|-Wf6c%H$CR{qPe0+hAaIF3#b!{#CV(@TKDJ{2(HIU(Gf4f+z1wca~mII)6XF zW&C8moJP5%Uxix?K|TpJXEcOAPxsG9DrNnSTP)yNIXN%0^bU^8`^1C3;6e8@9J`9y z4&f_!u*3hcvIneh2rdc0XKorFs^D4C`DUWqg7C#-3Ie0-wyi_(ZTm>&ya0Q@S~+bW z@^4&MUwE~wmQ>bUI&b%n503_CqW~-i!P)T5+ws=H(eU8s0nDTE;8)||-Qf7#dl-uJ zwNJ%6@TKjd=4t%4uTo$Yi!ypwT}Fps3~{F?e_dtajqwwr&FJwX{UyG!>fgrGDAhl4 zi<3V;pg`{68_zH?3y7hrgib>rthBF`M@ zTh#e&ej(alpijyL*aSXa#L0y^6Jhcq(`85022u0AgOxiUbXf`l1ComE1Y}*N!S@n( zVlPL~ZkV`7s~#J#5vb1LOJtkQKwpP;ei%zqeL+^nQmW0_R7N<_%g_{kbZvKX^;W++ zPRrP!>Z=k(rYs{|dwsgZtt-cSTghDiQzX*yRSg>~=|_y3I<-1fpcU-jP02L93FAkM zR241c#<{undb(c#F(BH&4vfc}PD}K@8q*}ZSlF_#%Gc+b05>w8@BcT<;broL$yg?h zgseo#f5WI7JBT#_(knd+C=WXE4tFrVf!D{Nwb?1ai+8$d34JAbP(dU`s{EU&{CYyq zA<|z3fbEwj55Ow|{|A;seTn<`@e^xuQ$!@x&7sc0a(@K zc%(d3oU(pC`1Pw3xHbt!Z%@v~2j}CFb@&XYQ<3)P2yZBpD3jjx{#&_eBC7VGm8`Ch zp`xC36qO%KpT^avg_e4>?c(9Xf3d}Iw($OUOKC=KZ>wv!jU9)IGP$#3r@7T@$yVJ0 z@+HLCG{asdYe9dh&}MVh7E56hbm^wp4ES=3*7oY~VVyRE{~j=<8M3*6+VSIims==f zHP-XF0Bo_lS#maY^!>+l(TYVs02Vd$Q7>V14-IylcZ1Pr|IHvc8~oyYFmmL}4GT%( zbfts_tw4GPg(6`1zh~+Rkk1u)Kt%Pv%&zZwewX*BcW%*dKP2qDCoAk?W+XXAE1%qs zm1d#*rqGo$aAzd{l&%avbv~#RHU2eKSs#p<^55w|3`ui!%PB@GT1-ymi}5zUgU`*+ z#2fSRiP73=_vmh&_tzebl#uJa&&5pF9alZfrE6?%);e;kntmFwHvX&SMplb4HBOy@ zwV>R`U#(1h^|K!{W1V8iY;*@s-C?Kxr4kB?mGy^cM^z{&R1LPc3#Gr{mS7b0%GkC0 zT`sSY`7*33$HjU~z_*#jO%UDcKv3nq3JKFuxazuy-@}+5HPrl(l`otlo@4k?X zbRxtgcqtPlCwBrUb%2{f@QFPSC_e2yr=MiNYTM`-H%E3OUK{=xbm)R*ClFp{jy$GI zE$3UqyTx}|xDYuyK$*q=r^)>d#CN;#+IdP(!$TEV$(%-vV07(zLirWh)?^-NcZC?2 zcDfLci{P$m)!_i|WO;K5n~-c!!xwIJ!_TJ!G3d_FX?ed~)MWW}Fqh5sbx{l4k`%k( zP(x0X8&B1UY2dA})%P13`Q}`W)puc8g)H=mtR?YEUiOJ(+%onL4-hS)L&{~SS~{}( zX5TXr4boyz+^lK>Q2SWW_77hZUe6h>kI?$;SteBsdeX`}uZ}k&vTqH(xbFn5K{roE zdoNH)9Ut6dxYz}pW4M1!ohG8DbqX)ndqvmV+u-FDLeS}4e8(9s;L&ZiyH(^ptO2`R zdM5y&TNOP!7hcA5@Tg(|Ko&|J!>Zn{hhqr#l3t+*+dm!F(lHR7Tl6p!8@5Q+-%Ghk z;;)*S;xq(E7@5~A>>A#40WIExu=2x}=OVA_j?c4J97jc-cwMtEJVlHz5|tKuQaPGu z5jgEns<4EQD&HC1Uc0Gp%HL_KXxG58gDi6SbQ~5!WalR-zIWTgWFGI?U={}N%E9WxOU7cgaIR%c~W88~i%v3|9oMEAn z%ev3Wj+Ub346}#9;<}^LOAc-=cq&a7%HM?cr~XEpoyC1m%+7`u{6eM%)mb?)5{6!V z14m#=<2#R{g-opReeoK)s(DQ>U z_aoN57Wuw?AnQS$q`8BB(#1bRqYn)(E^EIUHZ75QjBFb(VB)}n= zV)o`6UOp}yv{zhJ6H!*$bX0%o}NiaaGPr8372742wI0*jn=3n7gF zH_{<=+~FN>2Rb~%GC%A8Ju%4R2#9rJC{#p;(Vj=9Idz}B!l{Zw-u13SOC~eEr+}Qr zaL8>L7U@rFAv2*RNffnIJKVD4IVd+6;)XILCC)|Xv}jix_eYMojEkW$7qkQ9cEMU@ zkuXU5%A@wM(Q;A1IM$B^kns4y02pF4R>R8{r8s!F9&9Y@!;L54iME3jrTTMy+>|V8x6(~ zcr`u|@weE-EEa8{;XdT?vq}!mPL7T)PEVNZs?ITU{WSKmQMSFbFpB&ET>gPT`nj)hXvsn~kGAy!mhCWP7C zkPpA(i}+1za}(_kbg_e$-#Mu_*ZEO=nX~r7kNr!KTI;aVh}+;)I%H9*)gXcA$wUP9HEtM0K6@gA*C>>xTpm&p2_I`a@ zF$U~fa*O^V3&sl?P@bTR3Fw*e9CZ|^`V3dovX6OubDo>=a3og4!l|4>T<1QY-O00;ouO|npu271?eOzb{W|?AxW2p1LpnXTqWH>k+$@?}KaxutVo`UBQfM_#9 zrsNEX>4*cAy6p$_I2Aq-hRk(UjdY~Vs!p*D_EOgs6W;DRGL zbg+V4gvbjRr?wXhh{F==`lqtDTi=Oq) zynb8IXZ&E}7XvuHIR765l^A28{XC2JxQyIW+bBsamtQYXO9KQH000080K;pyP~!tB z7F7fQ04NRs022TJ0BUnDV{dMBWo~qHV{&P5bS`Rhombtm(l8LdKTolGVT(F|f8!6L zqlgYOdOU-i(c9225G_efQqC~Km3KaZ-uMhYkzV;4Zu(zJ5oHG2B>U}dHs9`s&eeG! zrz`+(q2v-{*Q&?8E(TF>RQdqkYUz*)nyZ(3lTkuXx+Y^Dsm;U>Yg%{eB;u(dpUw#DUG`Kd_VG zyUCOB@X3F|pT8czIt1lRag)-T#nqO$lXG?5ZH%ks~*cuzCAts-GKJvF7wE7Y3J z(Va#-@W&WRWhQL;#xR3tY#m7ElPS`dYs;S5@3ul(PC4_uM%*%Q8*?lXDz-vKb3+$g z`0}F7e1AxhFBCh(Sy~Xz^?JIbUN_pyBEEMIxyzkS5JRngnC3^3FhHN|iK-N7Os%__ z-J<;Dd;A!oHrLakj;mLBG)5gtp)sDSW^sybFPMIPAgFBfB5=uW!m(AVVXeEfEnj-k(q`>c`s-A9 zB17oc74-JOvX^0i_HnF+JOW1qfam?98iJixQrIg2dX;!p0F^j2WoX&sztpLw##1rc z`-gp38dm-A8yj7wuYy0S)Hcu*YJGXHiDGa6n=$ol*|zG1=z_&ZHBJi47@5DO7}A{u z^D|9{(9hpC8|ad%!ic~Npja5 zErS*Hr+oy-e0&7A4yt%hUCwo$(`^y`I0|%paRIJ6?$nHA2CntthFv=lhODP(G!xP# zBjc*;aHreN!eQ?Wk1`(*o<%CuYCg%PE}lifsC6EX6;oi@1O463;w4BM+ajh`v>Z%3 zZu?vp!aH%U+%vY#gao?CcngScoy}6UtsdaNRaB_SwI*%p0rjK`%E`MSjUxS^p&DMf zvNy>~HQ+Hg`Q^YV%|EDSd%RL$cB)ckm3$SXkp;PrS>-1;|JHCen`4@aP2)uQHl@>k z4kqMF7;8&=I*!lItzIOPsFbAt5;-qQ3E;LeK+!8onS7o8)pbiO-?r@HA5cpJ z1QY-O00;ouO|noni#~4x8UO%Zi2wiy0001Lb1!6KE^2e_9ocf@HtaoLq2ysLPqfO> z+isd^yX{QRZM!`lJf1|h=tNyvawR#5oBH1i5WGZ6ww$D$9-Ey_Bpx6D0w73&ls{W$ z(<;d`f7ZWGW`4C=uzcpRyG349<=NTUK|cAFO{;@v&qUTdkC!Rihn!^=vssd{_@IAJ zsiCYl^ZRR-mdw*2sVqX2O#)0x45NA6zo%z^G!AA|`Tiy#H!HcxN8cx9)4^^*OFoGaz0Bf)~SrRm&pt zRAG<#RgeWm|6Zk(ejY42|M#;|KBlJ%o(OJqCXg)HZ_A`$bsmbuA=X(wdlvOYgAoAT zKkj3CBGVF)hEQi`8N2m9D~i1E4?c~uEU!GkKNdag^$rg6!-L*Ie^^}?`K>n#r+LiI z4!(K$;-{}ayZH9yj~Ac6{OQ{l2f=KO@X|BH{p?=QJ-A=5he*TdcpOfnH1$&{9)aQ; zBLcHCUhrf*Vq?j#($CJb0qd`WG|)9!K)hRvQrM)-v2=cRJj_2V!jxrK z)%7qxJnWZ#fs9vZKsVo?3`PoN0%7-Z|9;PdpWYILs;r7+TJ?r|JPDh*DAQ!h;ve&m ziy~Tq{HUJy``*2Nec}}j#;=^me)`^you5!mPlrvpLoxnVXow_2ilJWO$rvh9(rr|H;t<4wdb><;E-ZT z6cGT)SPWk(C4pv=+Ru#ab`PyqDaT)+@I3x&n1CFh*tl5ky-k>=zkuI*Glg zs@Qx{c~uVPrv%&~E~_Y;vI7ov4Zr-pDV;)N&OGrznDgG!$^+b% z`4(kVu;hsc-nqd&7&|nbvNj|l8iUqy@CJ=-MFxt2ManqM0t;FAT%$9nH%nxzrh)eS zQ-HCYBcoKeZtQQZMW{r_0e1W;JW(Mn?WhFahn`M=_rpT~z$=WBF{vOtXvyPQy6a^s z;V~=nIl`x2Btm@6#54yh3*aHW(GQFetY#%qOU+8=+2#9KCbom58F z(121EQC3F0>2F|I05gFtiyzQ$Fcj%(;PvEVFR10-79c&4t)6=#du=vy9hEO{!PE%F z2^U3P<=CGg<$PD<3szJsSw{@Q(K4;Ri58G$nA&=Vf7jReN;cmOH4+BI1kC6ii(h=A z*rie&X1N*j{P%{`ys2c_kXT+P^IEd*aDxJ2BlLjYQ+4D(829>uJgNSgWs^^%={3VH ztg*jj#SJSyyJ1;{{X6PK6Bz4yf!AZ$2tGi53CK*ZQ9gQO307m7l)~siAI}?jj>)La z!Vlx`T$Ouj^y+!%wYPz^SOl|A#mP_YDHf5FG~KV+ zs?a(SEZp%s7qOoLd|4-iT>#QXS+yHIfZk=#J4B&^-@QxF zGY=j3$m4DSrb~U7`T)P`sy9NU0&fI00?n?mA%g3gTHHxFB}t}&I(t>iKC!bG=&3-f zqzK`!d6N0P=ZNHEss%V1Kqs|?*JhEF7Q@?)J#-gF5DvJ zM5F*vPK?`2-TFw7L;Vzia|T|^EQN8I#k`?j-{tta(RwAb6&Np}(zX>ctth;9Hlk40 zvY`lRAJe7h2*pgdq3@cwize&poi!U>1PwHI0RfJcHGA?K%LU%43lRx~`ptkFOmPIb zwUY#CvD;}HCdbmbfAL6et>ZS|dw*MPALjj>E4$p`lDm#nDGBXz1@VIu(y z>H&E!-*PQq6pY;^WtC)CTsG}7?*f-M03!b3bm}aa>4Mpg;1I7(5bQH1N`7o>YQSvm^yofwFV%rD-HJW4MZa2d;2ZGQ;~VSed6c zEPzrd!&K85hOwFE;nJhIrDb?^6%wZNNA|Zj;2f+stY^V}8v#KLh#Wn)y&pzd%uesKZ5IG}yk9mLiU z35^6P-&!iqoykb3rWM}6&6HD;I#11VVV-dh*AQvdJ8mbmb<%nheC|sBh482Oe37z> z)tYE+L1>RJI@f8)?V=K<+yK1RDh(g6Fo${xW~xU=I6h6HII#K=R&&!-kOmT3lvT65 zsAUOl&1kT~xovg@;~L>YlQLfw0$rmFg}fduwI%ZQ5fqo&p2Hn2u(Z6Tj25a#50}Jx zHm7QBA@QGrv_UUKx)-YJs3PJ^RzVYxzzk_#(4015CFE7P1&{2G)Q$EJmBZf>Wf$t&Nui<~394*YTDRC`QPWi;N4iE*7WGiV(*rGh{Se2J z>6De_HiL0=q^ogPGfL6gt!P#Nf*9|)JSPlrxizd{m||5(W@5}=2sdbOcjRA3uM@eMk^eyu#& zv|m7fh0C93xCl5|R_NEq3GW-Q?l%m5E?PS&69A(Sh|=2#bo2O-x9sv`1H}r)M`srC zhvxgqxRC{j_)EYupHX42z|vtDdgbe6(T0r%WclkL>aC-TV@%M)`JDS9&V0Pt!@$`x z-%RL%NK1h`mtDhiyn%e>&awiy$*Xfcq$UeRIdy_sm4OOFCv-AI;-}7$+S{{d8l)JJ z4KuStFLi2)8W^b-i3;(0VyMS;XEq_mGYvmI`N)}pJfz)=vgAp56M3&5Vkk1q`_e$5cPuXmF*VZbHvqa;r&-}JzOBUBwhje|tnlN(K&GfwJOiYXH657edA~3

d&y)(n*mdbmprVDzUFR_vK?yb+Ov!K; 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%0Do-@fTVw2dAi%3IG-FpkaRFV~%^SHJvfhe;npJ5B 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 z zQfuf74yaLNS~2BdTSok}e>Q&w2*vL}09K(s+Mml>ngxmuN8J6cY@%AlH;725_OFG! za#;SSj4YZ@R9q$YG&=G+B{H12jX7n?XFsNtg?qkw!!H#u4*Q+EU(lazH$hpc^Jk+|R0h&C@qR*HJ%rlMg|Ygaf9zCu+_X%GcI2&xThWKvCys?VeQ zgXAL>V6V02&>@jhG3JsoJ7VlP(-V;p{mt;Li`A-iDXPnUMH?2o=sDi9r zx-An{Ax|vtFkpz8xv!An%6T7ZnkY6fz=q``)!ajjb}{2F;0eqb4A*1q`Ew*AkgMF$PsWi1=c5xPIHze{U$cJP#ps6 ze9)CN5W*l5xKy~DO)+n&{(Ej zBNy*nj9IF57Jj(%AtOuXti-f(^O@n1}jjemf08I!KSoB&!UEN=ZjVLml-hkO_^BX3m7=tE*rYni> z&t#z`VV>uHByU06#zL^%S}QZg9n*W6=bUAuhOgfQBTBX)TThN@85@J%?+05#x#_@V zU1BmJ5V|xI;tl6++E}eIAnthHK_^?q3kw z+MX{1?m(85hzPUy#@^*GbCn%&b#E%4SmUtiFtON@a*izl;SV8+_eMx*Fs0OR4Ygvl zK;&c0#ib2H1T+#$J5|8t>D3UY9nHNB;t=n|)X-Y-lu#Uo21xx5X9@z#baq)c7td^e zfj(mW!hSxK_f5)xH(TzeZ%8R?D zF$@BR3TYKf5TOQ$YGHk;B7?80zEP`^LbAuk99S`rFgbN86r~&WUzN9S)&b@Ta&Q5z zdUHa#*5-NpPor^kznglw0q-vDnar0GFxA!(D3DY1aFD}@wAd*+@Npemej-8OQc7LZ z>)1N9BpX;vadht-pxC6w?NZ>3EZp7tXs$rVB8QWu$n?yLlo04cJ&w(BCWldJP{+tk zE|~SG`nAD_qjxg$?p*cN`xt~N;STAmyGX;qoLl#2&m{*kGY=8wIg6d+h$Nu^!i%f2 zF`s_w>yTkpv0EsSaO#%$$1rT9@w!5`5C^q3{Ua(!?^Db^gSq?$oQ@qwr`Wup~b1V^J4vtBUWDk138j=#NNSjM6q)~PLQsU_bPOpo{bAvJv+ zUwG^!Dea$qxa_T})tt32#;s2XT0r}#;-|LI#9`JJsqzZ75~rp#%AF2>k`rlz?w|12 zF<)_{X2N-dS-TaGsra05Mye|WGyc$Lr&gl|n}tN>7O%f|`c;r#7G+(=8ME7dT*7Fo z%Dyyc%gO>T)MadjxZ5>+EiRi2syNib*dP2h#QMs|09_6BKzJ##=)lMuCevcnwK-G+ zqv^52&DFE_&6lnd9%rgzgQWh;wPow9P5St}FGRS_0>&1+yjirl%Y#-%|0mt=3~jC80oRwhu4dj4V|plHPm>2VQ5cL4zUkGXBG5=b zIl+Zm7dHmc#97ZH2_NSzps5`G_JT}O_3YgP+90D1q%!+g14#EA)!#kRkWuCsW$N#1 z{2$JQbX^K#I9#?SLsrO9%-RtV>?Fql&7|!q`^gIMnviPTIOnvvQ){bai#u&`k!7!@ zt*4L18!f#O6&|Cj!tDf@tc8B(k-ZL6zK3S{eTPQhIh?XTB48S7nrfm5k<5sl);k$9ku1*EbC z3)lFccWlk_=PzrgzbLADlQ?XhQhJE$t07Q;dB6z=BM`DrrM#q|%{fKZH}tVuKS4`T zO;`z@6f)PWjXMjvn#6-Vz*W8_0qiH&Y(B<0IE2sNOh$NUDMHaPa1}caN)Q?s>;3RA z6EjKcaMP4d2@5KF0puPC?eE4=hJa7(TEcvZ2_$7-OTTCUvP!RxJawWO1?2oX1qIf3 z*6`Wh>W3Hq1=yrLSI%kHhR%Ss1RV>YPjhAx@XeskpOhoI*$ef8?6mGpUzO5uWQ=q> z9D{lgSiwQiDs=?)rJz!|KV>cUtR6c1AR9r)J}M>3Kw)S~4ozQ!;URKUz!oJ@qPoej z^y-~vQ!Zh7uh)4gm(SHPBZV1h$vrU8M?)wShCwOsntJKvM{FFA4d5A|BMPomt50A! z;`(v#9r7I!sk~#}f8?(xGP;6CpugrH%d0?OVo)THYXJl?S=J=O!YWu0Cvd3{x&3^^ z({PQcpPrU<<$<_8g!|vU6w*=CR|)G0lOY3bE^!dJ#iLl$uY9XmZ?X%~INtSW`&dKA zMW5cTN&njd846r<3ExygS1PC#9*$>}KTsAuR`!uqy<&pCyJ15$A(djFVr_y)OC$DD z1#2=#1j!P@w$b~|)oG!6)*yb3%E%W9C1_QoSOGL1#XA%(1~o6#;J{^|v>>hqm|kbx zSMmD_JVNcp5ipEm38x>ZG1(~FZ`u8Ct138BP>dyrXmc>+&2dr&WSx zfEU7*`6)#lhIKh_a0n6>1Fbr_ul=-QnV2IvzxaB0>I6sHj8MA<|5@JuWfgW6M$!^U zYPWduL&wC8aD3Wttqlk%63;p+;nPbpS5 zmyc2+5AiQ1p|(6-IjDl{b{e=R(Axu-E@UXQ_~@6+!aV!zC&SHw`hk%TDEz~c-^RZ^ z169vhsR>EG+y@3)^}7G;lW*#dEPzk2f!L?Q1%H6D_$J0vuJ-1lyna9|g9Dp}-On^y z`S|Rj1RfzxGhO1CKx_t^bnTpZ_!|#e+kQM5M8TDiH3AC<8jsBraI0+U9o5)P>1K^h z6CI`q>nFUn8*bLYEGI|a3(cO&4sB%SP?WFOZ9kiZayf(PLjt*S*6S239DO2RU$|&- z30ETRv20x}CkeX!n5w--XlyITH-6bGy@A5ztZoYUIa9d3o-t5jzx+uWKEQ5F$3|bbdrB%)jkh|Vf0M(W%6xH;vVv0Q_x=6dZ!C~PTtGrB%$R7JiN?#l?3wClt z0}IWeD!gUVD7D&M8v}dv-VBrZYxs8s6q&bTDnhx@A&^`iuN2lvLqS|Y^!jYP_4 z?n?a8P}(<>Ulg-oEo0V(k*8uWv&7ipKpttm%;Ii5BPN^WuGXhT$|A(($@82}!y>qU zJJ1BhL!`$n$LEd{g@V7azO+|bg|npTNUjs5ie`F+d((F)WTF^_devIR4&BWw(Lxl- zNNnUdGb%~m(kFRhNCa2a(umTq0s|FbJ9*+j8Q+MN(toFA>;4r@35VnV#*!r~+$5Zm zrWDYy3t7|DF2RR; zR+pytsYg7!Vr%6mRrHugnwpfCBWb9&)`H_Zr@qrriKC={=G4LfDj(En<^^$oR`wg$_GzdcQ4^Rk50@B%?NvP(ZQn5^t<@A}MXmXK)wFNuCrI=4< zcgnhI^q%iRP?7mM%%~NI^>5lHDHU-<@NNu?op&s-3o+=m;)NVBHdPgA2Ky0ec;F~s zwj?cHN9V8j*^htGbdhymrbgU(I5nK6Z+0d$IOhPEbsUF~k;-yT^jWflI=3FzRXc`} z!%P3^O>A#%%(M6Foy}LUe7DX!{1S&y#!Fz6owKzF9T?_aMrPStX}kc;m26N>r*V+% ziu9_#DonXG=gvfdS&OhU2aFjcr0wROIGuWRY;s*rQ%gKUahI#Y_F5kdNj@U51XA`Q zHxM{d&0jhoU!r5K*0=>v?O@8X6*99UgaI*d--I$#zic5e>Ldqx$zM9mCLJlcWG*r@ zL=rAYrjD(3h{KjNO**?{E5m*|=mHtt1k}23?Hk@7H~Ct4r_IgriS4h~&TU#e#lmK% zVtDEDMyOSleD@^7BgB-`xT0oZa#}!6u2b`zy?#sZh_q!|QERLri2Kunj>1y@%M=3h3VUUYOoqXkfOJO3EjBB81Fl0qR5&+y zEiy7epfTF67~3slR*RkbtI5S7dxoUjmy6Aya0so;?5ir5A$j;=*FZcq<$5kvAc?GG zWs%lIOcHdrKHJPEkaOYxbV)tp=*)k@9jp)r1Jy_lpvHf8hgy4X?2T|q2vv_stw2bh$Qi>}@op;4E6F(t8DqXP!ww?@_c=D$@C32tGMZ4QIfU@(%>=*fce5w+U+LWvHc~ zVEvFTHUaZ!9r!^aHdjunX^D~LwSaD0B5`0XaYHKqPU}>N;;MBuLEjj1-|&xg%EV}4 z_v10Px=&y1l}yu(vk3N;0^J(&F$UmM!g?X@_IHI}#K`>aONabHh6~i_3sa)x(BH-A z}-q>Doc?nW>6JGWd5m#k5Nd7a8omx_m9h3WmfFqeq4p3f2eqRN)NWA^qj98mN)!RTW5CFsh%)j#J`d4 zuDw8{*RX5l6^(N<{li1wBOp(!A~ub=%Nd85HWal|nVR zhfd`yw?C!`=ym{lNuHp%?Yb(T41M0kEItFr zQ5Mbs5k~cm(9c$0c7UK&7MBv1M41fNL!ajG`Y5+Beh7=^LZ(Ptz}U~BOGwjYw&W7EOmlSp;k z!q92!dF8b_C0lK|D;&73dlO$Ryc183d*Y%<&cJWCv*%7}*pg)4E46WDL;uThUSd}U z*k=BVKJ#fLns;qV#4&F@smZD08J2G()6PnCchA7Rhip(-n;OuQWA z)yT4Cg12KT6G61b8m@qi)ftSHu8>-Eg!XUVM>592cIf!mG01=x8&Ocw%j#C5FPH+I zO69{IcN%N29)FvP-7xmeo1+?eS{8rKE@Vd9_MG1ZIW=ErY1GRZds=IsnOy6PgPlrR z0ADyDN1tduEe<%K2Kr|Mov-6{X^s8eO?8n3Vjg1o$0+pv_W$D?6eX`X#lipqt+M=Y zKf=|)`M+_&quSfa8|m9<#1n{=y} zZ68vtbTgw%+qNrn^1!D&g1i7|@p=y@?*tRn%jQQx2uq1PuyG1>@YH}?=u)L@SjAij z&S$Oc{XD^1EmW09Z`b81Dxp*}r2%ga4Gjd&kY$j_oud9a#QSlX)hBini$-mRZH@|w zkk~}i*aX@+Ne4qA_V$P4HISV$EyaS>@1ZC1oXU2s>D4Sd>GqUJ2u>LA;|-M-7le}7Rer<)`{ZED{H-z}c{r--zj-u@)n|h0l?+KB%zmdc zLfZ*9dI+u^d2)R5vMHR>zdaR#1!$LEdz*bZo_2sQ@ma*1Qo?j(`R4MVqEc9m!g|C~ zNkwJS#Je6Y7#SCW)Rktvne$ea-~O~W0LS3}2JGV4j?cdKwoJNa zlwe^U8ZzV^%97{YZRvFO*Nk+bgq!S%f17%cPL!GjJdNS(>eUV)D(44CgZyGdC*z?S z%W>d6&C`5PMz|RnUiQ)GG**CD-Wq>dOykLUS6&WiurT8ObXt{crnp4V?51R20@$;3E6w0ENOz0OV zn3DX-)6m1P=W%V#h35j98s#tHNse(BKq0(qz~upxuZ}#J63Fb!iH>PT;4xGT$=m;| z&J8UE6~rR{5Sm7NN@HOzs5R-R8w5-*wRnirGLsS*^!uCb{X&X&7pbhsRJe^Z0gKH@ z1L`}NwGcK8JP@O>9H&o_|6NtRqVRA1F3{FT+bR;>WNN|sL1wae70hu}UI!N`4h8?;MNGEzVXgG`BC*md06KU(OGiz2-rK|E=3q%0^VVdi zcEaXU#iLjj$2*CyJ-U=tRBKOkV_@$NqS&QPY}1-ay8z!Vv1CXerIkUiqf zZ);gZ0c-}`H@dFf&ja@^a~LrsLAZE}Cio&z>BI1J=9t>3xR02Pd`0sW)Ctd|B$Nt* z_F&ss9imdI>68)lh85A2&=+FTHo1usss-<4npH=f*$p zW8~jixt#l--yX;f`vkX@1}4=N(Ls)qFwnlcy0ZO4Rs|lT8B!IQmZM47Xc10b7cbIr zKA=l1R*KnBhrL1#a$4 zPq_E(P_^9lwE`U;Az zjxOQUq@s{0lbt@l7;I4+5IJR4;-ZsvBd{p^5*|h|?OfV((~7bO3Pha?A#-2%l6oD- zj&axTOhI6QKuMV)YqE#WO`!J@5D@Leu*An{w}oday%y$0J6m^N|7aLsaq`gHM5?2# zlIenm)NxT!Ri&Q>nRNFiwdBU}ufqLlV=T+YLwrM#uiVQhag^vpEE7%TjuNyocSN@3 zq%GRx9L`(F`K)-!9Hi2mqXF_7aPprB0>2j4UA>zA5RS0j3!8I)ck{sbJ-zt;w|wSg zCz$Kn=@v3!zbl!Ir03v(-k~QaSbCO4wWjoojH7WesbtfII`Z)%t=JL)cDIf#k<<%U zXU7s#sZ598NR0D@g-)YpaRfxh1F4kPQi$4>;gKx>^yfvtFhL17rjC3_Ez5X~g;RI8 z#i6v-lRxio4|hM+G;wr`1E8bt?|h{k@}D9)dJS`-0ceK|UYj?ng5N()st)arEs~h9 z^nsFvB4SPW7-BeeR_;8>M6i(1-yItb%LmFe6>Tq<>2_%E8Z%#;RWI%v0O!pxj4Ee4 z0e5JB>r7p^uHecmFTIS{!oS9;dksrj8O>OzmdS}VyHuj0sf)Z&dtl8ohx%a^oVQl| z3b%Eh%M$BI$sl2%A$;=gp~AkYd19*x5PTQoiXWL7=Yz%OQV>%*^s(4O;@I z21wvXI>k48eW(5C5WM+zp!BmIqa_IHrG7^NdA3(OM?0{st-< zm+SOK7Ho^}YsY&o*k!+k+1d-~jw%?f@P2drJG5Z6)Zbd-;Wl%T?}CGOeLe3wbeoiW@up)W1o77O)Y18M7-CpIauFhWc^3nBHw z1PUXzW!LyesCpT)wyoE<^})5QHIm_Qd0GZKxRQ?IAl6u(@&!!aGlgg$NbDZ} zls~~3LPXlBP(&D0%n3Oc%)&`d`i(RMi<*YR`)HUTp5QL3s%4b-sF?URLQuDeW(LOj z?e~{TTV(uk4v(JvJlO=r?8VltE%9TG?wAxX`8}TGwRMIwel~u*)mQ^=3Q7eS z@lcD9;;(V~OaX4ejX|W&$p`G?+q^O-DQbpCrnIf<6rys}MRh;pmYHWx9|Z+g4-BLwsnwP5}a}-DpL9rrg>(-b1)&vE^74ElmoS(l#2?c zy5UxY%sf=42I!d7h^#A@eTxKGUU-_n4NgTZg98o7oEXLY68+KN480*8jN9kqkM+9G z&W!6T0NOlr@01UeHbJzGi<(9{Mg`S|T=3F!O5v~P_+C42^G(pdY?GcP5}PR}Wp1ki zya%)^sirAsgbuz|Kc$}?YW_!?HC;&fl|Gy?(VFs$XqLbs$;`%Hm?31}3rrhI|K|HP z>n_nu3R4LNAL&&0Rzuf%3~>jn1ju6p)QBJB;Qz(WLC{2X1EuHzi`4C|zpkN9{pRlx zFMl7)sL_R3n|7-5cD(wL8Olt-A!7bqy==)od%$SrM{Z!6OzPrGFx>LxVOigL%Zpvm zbd!f^mvPaswu9Z9LM)9kL}44>3e{GiU75R8>SSJd8zfb$PCJCgv}%S5;)+#jNi{?x8OVRQpF0 zrU_VdWKF5A%#mY)Hj9ABPhjxRHLRS$6Jk8yDX71q4(fZ&evqEEM=PH)1NI$D8Bn~hJ} z)gDuxz-VJ1x9R?(lSIbg8YUP(1x65BITt=5*2TnL^HldAkP8Ye58);wyXm83oR6wxgMFH8F^=?I4)rmxBus9Vq)~{?DqWR`Tc0oKhj&q|H}Y3@vu`d2mqC^)%9-ivlZM8#b>#s)#<>ySD2uLDfj>vJ-^2dV)+)P& zg{haQw7iLV52hks!qxF5XPL*c(l*q&oCV2BcO00XSI~nkgaz)AWKxTL37i0;e}qQb zmzTO(IbxMb@0lbLe3*@qVhYScQz4iHj)NsylPRgHKcTYEGC*Cf8E?j+mOM>~Ro-r8Aw3woXb?#JCMnM5} zDvAO5veaq9-hiKGS)Wry*#S51Kfi2My}m05r~bgsLFtJ-sn$S+tvq0LKIbHt(gLZ$ zHdi_m3BoiB&fL=$mQdC~O_{~aXVGOoGFI@RP;Mlnlk%}bk{RkDZP&?H$rqI3!}Aqr z0~oVE1Pj5fYr5=9K+#-|YDOhmTsr<`68yZ}*}J-MSFCKDzxvdjxn{W1xwzd}Q@2MQ zj4xo@xchvnK~&ic77{VQ;!8&w91*zWy2F*0Y=1#yhi5tpJ-3>-+$6o>Om}?;LiMFg46{KYGwp~*enY5n0YJOIA z10Jww-|{T}mqowaao~-Z6b3O{c~{eS1Q&i1v2wJ!*A39_C|Cp{Z+FijB$f2Q&YN`A z_77!_z|kceq?|IY-hT8}`+1q9?hIHdyyW*RPLc|ZZFT7$_nw6{M05i$P&T5*NcDm) zD8!~SCE54@t%vy0ldKAN@f|D2PD((MznPYdTJmqNJ9P#`%A%dh&9@!;f&fBT;oBSN zrlkSjLfs$0Y^y|pMZ-GjYiAL^(f1KSIaf-#1$Tc+M%%XEOp!H#GM5?qL8ouPIet(> z*L?tw;nTpiQQDDZ{h7LL{oE3y}~Oy^c7gK#DJLTTB^ZajT#`+;)I}v z8in!0;c8OX6=jsQ|3ECixi+|&!bi}9dXG;Xmz@kDwq`frM$#c?HSt56QqV(|l; z$p|UWYrTM>VI>|XhER>e&^Mutrc}hRQ#>3%IG@55j|qtwGR{<}Ei7uG+u0Ok@5GWP zN%UwSbEhmus!j`=4tLOV&~+W7ZFG#mY6mA*&NFU-6tBUXwCLOHvsQ!1o?fEbcm11r ztSK0^+W50(&;1D^UB$W*Y1ayXaXW$rzpz+vrry}-|KmwND;B`}H5XRGFK zl}NCuKBQ82NjA$(skNf}*tX?ubj!=5Kq(q&`Z#=Bqsd*POwGf162;Y!?4#7XVk`ZU zWvgXWN0nB62dj@?*~5hqKb#A&*HF*Fh6LV^TZd zkM~+DJ+IaUlC3x5R3+oR_DfKIXdJWdD$kfb_DO)L$DhF58>b7`_gg@*&G+v>DG~Bfu9`GS@z{)QC|{I;7Mg2*>OZOhETNHmT%U(m*sNxMp$eY?#8zj zKKhKbjaf{z=SU78vYSU?g@-1IO(S1pI}~#)0b{EGTSe?fBDnn4D)vk(LR~@yfJVS^Pkl{m$1MA`tR=Vs(D? zq(u=u?x>QiKvc-%%X-khRLKS*&Ys&=MWw_@0w5RFPfKZ>)FU^~?2t#~tQ<#8ZxHVV zXs%5fgR9uE{l&phOWKJ0+$f&BG%qc#Joepi8|D4%HEKCE(Rg&%(AmGGH^5<=}Sr2RaXl&(T2gzlWL&v9}caP+(7kstVxA z9`Ai;5my9`h*{Iu7?JdeBU?H96Bu{LaX1n%B&pimY6n?!84$PV_Z;Euex-7;JAG^& zQ&hIUiS|_4^<@t#A>-OHEHWa-DaJ`C!-d5mx&Tpcsz7h`!qDria*9QI5y;sfe%In; zW+7Uz9<*T3EFI44ZE5MAAyoNAwECyYOLS2XDN$r`b$|8(DT$?;6hXE8%HXczeQK0e z2_C`e9M$>$#4XWjb0y?$T@xWmU6bIU)E*!?&c>swPLJ$}G=yxuk9Jha+kJDc^BvcX zx1+Zgk~d)XNo$B*Sg9jpt($1fWm*kSxk#llj{@XU`Fksfjm#`J7~t*gS&pdJZ+(_qRF>fK zW$*dnV0985bFCjq8ygod)$zZcvi`xKA2nV4X9)DmB+HUtUcwW+Y)YADjI!oRZd>7( z#!4I8p|`qHAjbmogIE^r?F1hkbnR>W}35AUSkcEqlAv*fHLp(RQGw`J#hxIyU^w@259xS66!dgZFLdT8EqKZ=nlX z%XN{v%!JYULX?NAXoxaA($!)tjaKobsgRdRCvk*Y<%9l(o*cfI@_0y_SkJ>>@PUPC zPF;=9+kg?4MqSWQ__3$^4!3S%GIF;)a?!vtg+ih;+RPHxVn6WS2R+5&nsW^a!>Uim zyJQ+ij_2fmUcNUI9QxlM^>(ecj#s#iuiVkp$TVXZZw<*9L`%*0P@Cke(T*=N(uL7r z;))XHYp5qr1b}{@6n%xUc3$;Umu6hj$X*Yn@wg^sy*TMCOC9ocVyuzy zfndQ1tCJySxRjZdNp%ugv5fBGN&mw?5S{TjJzoBqh>4ZQ+*g~0#s`7iq3gjoZKm1Z z+!w7}2!CI-k}QEy6{eXF+w5wKyOdL}RPx6Mi_Z}qro*mC<2#c}1^Hs$+vZyffk8`g z1_jjH8>?5b2^r|BX$)RyugHwc;;-H>zp)2S>1Ye1)Q^-*0h!l}1FRj#^pd&Bl4-Bk z%bmGhpBi=A{S#lSxMgx+z9^$KWCy0T>exma=rdC07Gl$++`z(_ z53wwO5=(5g-?M(9<{s7>%p+EexhOaA{w@+5Ojp8{u|%0=&Sw}r*8 z;;@8kM-`A%#AK7y9E8anB9vujX!e>7N%qMjuyu*<*Zi!;jU_^3rG;DPfxzRJR0<3p zXX-s^65!SmmasOetK^Z6+k|z5=5qCTog2s?sXrqn!dGG;fIC3|hhPMX2GVHPsYN>Y8 zxRX2Tc~cR7oKa=fJc!_KiGY?hAYBdCbCES|?PwD5T;0@iRZ&@1oOfCj< z{?0vdW}_wlsS%je2o2UEMJl)J$bMmT=fa0Br^Nu!aD5e>6waYP^EO}=)Wh=knf z>QMI3sZzWo;W=e!ztdrFG%vS2fI%9CZQ?>-BD}v#_ft8cJrarobRZiXLR4Yp zmp}W!4k6u=k@+*y`j!CVOA7Git>fR@v)b3PT{Rr%JJ93euE=9rXiD`^6QE`Wd!llV z$8Fa!s46I=LC>p}tCu~ibsnFpb1e*OJTLoQBql>dp`~g&@J=OjVKB`*?iwkA1NSYg zijF4l%m&0*0%450p?ut_Q>jS8gEB4R@qvv`Fw#xPF&hYP!+T)+RxpIKaB~c%w>hh4!}V%0h8?#FlqJ6iDq=3t*kgMH0+f# z_dX=88fG7dF{-A~BVq$j@$!q56-pKA=G8_rs#O~Bdl}*9^Kccm=z4-l)`}>Oq^l*+ z<1Q76#b!{4D8nV+^Hj%)BgyVw=GN-9>t9m`HxdD73r*rT4V4QPrhpeqm|8i`y%h8a zMD#w*0!ZnGue;l#O?gXf+}4qh34U|lr3+J-@M4l&yR^7N7f4||=}BW-bFLM9?Okd= z9qo=q&biXe!fEQ+@QGH~5NjI$nwZauOJ{xfom5vSZ#I_ze^#=Vs*82!(x*)0rG3`u zOm!?186?92=Y>~&$$e-|QfFistN=)zAtuWm!8Zl;)OVVr){Dcty>sc&aq4AOXL))I z2Md2Mms$W&)BVx}6>G%V|U9U0+)W*T7xU!jbKfi6i>cD6QoPPiD{=&i$tC@-zr za%O=+u!fRou1QKoLv=_hR?pXg_9C^x%1-1eO*CZ`_B%tGtN?_iiPV&Vv6Fi(Xm8I{ ziu>z+RL;Ii@p#rU$nP%=WS@GL`*6W1D z3v)zIv?rmcR`=YjT}z-Grna35<7Y+QPPIla$a4hg@4pcqbICP6jZcFZ%#- z$3TF%G#Bq<#8bZ@+?+kz_E7-czQ%FXyC!3>;Fx4q8Bv&t&iMn~kT}c8R46fAzkyV8 zbpA&(xduO1oEbU}xYpLU1H`vVPp_(g=*jTa=sEK50{gVpSeT8geSv;{Kj#O_k$Jj? z6@t0I4E$lQPtYsEnhXIZE-X-UoCHD<+B^W zNY%f`mGx%*9=x0Rs7zas61sl#O>jdOr)izx%u=N47_xMezgzk6_VjeL_q?1MJ#2_w zTZC7;%CMC~&E<`gvaz$lp>Q)QX6vQm$JlKZ8m=PwDSya;w^1ulC_85D!onkb-oMY5{ zfA?^D>2Zl+FnR(1pl5}XC85sN#?c&2Im?lFBYBik>Ds!QR9TQF7zbbpQaJ~Jbrdp2 zAk?F$$O{*q98rplrr}$x7Wtm}S4@bJm>4}j1SabH;hz&?-WCvuW`Wy^{6fQC*p_4h zZIgJp(F%WKX4snL5U2H97d%kakk{90d?h|DrI@b~XR6JcQ6RzBlLCN+OFU%H|GZk7 zYKF8}&^4;nG^V!Ec}M2HfwUYk(xTK1Ws9+o5Z<{r4~9RK3fYZO3SPnQt$Gy7pCA_S zSs63CL1?oiOAGnOxgSCf2l<_}Xai$wHioL^)B{Yn^-l#t;H&|1J5!+@G_eI{BJ*72 zXxQI(U^8lyVtb^SJ>lJd@8j!)S>wkR<*(S3aO_P1?U2#RHHE0=;uqE^7!yk?Pc zbs+In?bwF}H;rT`O;F=O(E_>6-wGeU$q{Jj@v63h=it z;(qNW7X;2x^gz2@th)IMiW3n)qzup7Mc?f%4ByVR0CMj_L4!8nh)&5_GAJ$!`!DWi z#!Li`1MPvmCf&;)Fb-bR@MfaaOU9-ep`MAAzIsYpdsEPvcGLH^*si$*$EOX@In$a0TW_j^9y9*lDQ1 zC_pG{`}EWCraU>CEaqp8^K8|FG31xG(2N*Q4?Wwgsv{R8{3YvY3n#iES=_z#7j{^r zjcfF#neO-!N87RZ>=CiJU7)n%9eN3%O#mH)in5TDLX3Y2HzXeioJzU{p`n!7ayTlc`Ssgn)p1}4gblIEdg5OlY zPDI%$Ixciv^V^-o{SRLbN&x)(+8Lg@a%b=8FRh6_bm2V~s7TS&nFDcQG=BP*Kbyy{ z?5PtkBPPMJ7n!d!SjISveDYxY@PxIG?J z!T8m9r(va%o4(i4>5%3)o;nXUPwRU8u?jQwbxfHOW|~NzXqlB(oFy8A(eJw`g3A> zQ=;^^#?+Sr*rhwvNZBOT{&djHUJb$OyB7Y-@J0Arxo5_M9X83b63nOD8ETL|tNgCR z6x%~pBoAn~2L+G}v|(b2{Jb7BZ3BVyvW1M|zWnR=cMwgLnQqqXtHHL3*DpxLaK zvy)6NjLBzxUV&E|FXZnpD<_>$cq`{x5F10F3mK~?kzIjp@!g&1e?4DsjSNfSfm9}u z@;DtP>&{y!&A>fF+VvW`0xQSPmbhwM=;<()$wjzgK%^wJRN}Z5?-UP9eF;~z+21w7%X>7=#f+p@!$~OuBRgIe`H5BB{gYZngell;dphCaJ$bD zm|ChHI(gB#G{+;)mQ+YZcB}L}p42nnTwoo~ma+&KHbi<{*U8SJG&)YFing~>`{^1m z)lY0StGz^d*!StmbGlkMSuQp5X>e->;^?_YItsXjAMqm}chVc=e^ZP9&?YJCS?kDt zJWuIAas;gZm0E~eIvX20nfy1mNLAOi|0RU#cU_B#LK0orH1eVp1WlzaQltROyI{!G zcfuIW(pX(`x6S7aI8>Xs)1Gwlh2*!2{DRX9$fzmZ{338r1t zV6oG;<6FUCD_Xb)M>Y79=xaDOC|oTx)uR~5Dz&ArtD}pokOS?@WgPXJO9$qq`lpyE zdXOGUi8@7}|3?MmWz_PNIaLv>xk-wdL9|ShK8f42ovP-EH#f#>d%oYpBxB6`Zujl2qv-LS6R$j3 z4@2HMIn#N1z`cyiqCuo(afi_`=rpclbe0M1?BfUM=t2aJd?WjzNi1~u0WJC7cnpp3 z!K{^NT`jqRKRj5K@GIoEzlfRv{^GPXk%j0u!K=%VS^~z~kqV`>+0DfD5WHq^&auf$a`<85tT2LLLP?MWE+~6GJDHh=Hjl8PQ%W%tJ>yEZW+^YteuPiz9i(7_)+v z-i_A5v!NWXp>_U-Ra_2QlV7^bwOi3?({2F{!nsgzm8sn#OZ^E*d3M62$Zf{W{R1mY zMWg8+UL2Z3z>0-+gJy6_8`0k8`myH8*8-o*(RLi~`eGqmKTD9Ru#aEjqK}K-l_v3} z??Ar5f$2sC>zG|CD`?8E07!d>o%2F?dBCU(wOS~r9xORTJ<(jN>K7Qx{FZZV3Oh4C zOLp=QEGFGCY4g+0i!LRyWkl(uDP4+_1A+O4#W-sJH)kIg40bT~OPDN&D1+gOJO$I# zI7@k94VX=gXnNMUv!O?akS6QA zbm$nr1jH178B@c|;0e-k5E<pcY>9f=o^#DdxwzDj*S73vqmY1bko3AiZvw;6i2u~)&%Yi$UkMqXMU4-4=sn&MJqiro;)qMoeVF@pzJm;7( zW_YWV=;|qD!Ontq#!g(Mh8u!Dy(Pcb=5Dw!w`IeP4!$>SS3~fpjY0=MHk!LbAvd>W zm9R{gj!=SA%3;(fw{OL3W3^u!dY?+~59I@qZP{Wlq zG#qB<(NIgD8CpUdM`H5?jWv7XSo-d{z43SZ{ zM@(J~RnXKL6;ER)pvrY33iuDcGxQ?*s33%IUPWvWIMl|r;@mx%j%HpOuXaEh(ts+| zqzy9m+0ZWbS9wJa_o&ZUWn%aobv9^yQ8S^?I}m)?SenU<`4Mv++Vq#juyps|xyZr* zoM^6$0Tq<66L2)(>nDT#mbKNCVfoz}f6~l3&tm2owa5`I%{fnST&r_E(G%myC@v$c zfI&#D2-M=LpM>wiFJjI(MnCU<)l(FF0Weq>ue#Dtm9)#oK(e{QMG0- zu`k$z1rpAh<&PfMY9qPY}))rvYIbS5d5%<`Q2=Y*0J8TN=;X`0# zD~Lq`bx`XJJ=g+?sHGC8q#9QYMDBTMpuO1J*)sXP?_IEe5Aytp&x$dH6GfOdcsUyP zaIweb_ZEjvhGW-5Z=>}c`iCF7o7{hcUrMVSvm({P>W-kF6E064Ja;o~a>I!$N0E|3 zN|U3W7UMq9*;*D)Za*V2cz^2gGgz`8z}S6tVa8ULs(I#ZLKJUh>sjdp)PzT!IU}3} zFQ&6#yClZSn@pBN87Wi0TRy3HCnh?GTF)RLy($g>mNafD2Uid(#d z$Bh+|m9t2?F)&MB?5owgUqc8KyAIT8PIkz6NlNFgGJ`F+EDx_`@fyIIla%(*mNN zO#*{prCxcZlRXlUyN1LJSS~#V8e?m4f)d=tzOYPRSYV=w89*`;YRk;Iv{VZ&;EE|l zptsS18$`jj#(6L=*sT$&^OH1lV?>JB(N2+#K66-?fo+Pf{1R!s;&oUBi9!0Y`={vZ zK^ioT30)2pk8vK~0|uClvfqc5CR0RRoAT*{`@#jNhL*V#Wu8SRrVmWdB-ihq8g#y> zq-lU!RFlXmtqyNY7EXloLE$@GpoOO3iVYd7)L7cP!1sgh%zDk1HcH1xDHJD~JkxxJ zu?k6fF(m z28SB7t*|Vy;J!gl3H`?IedGp&gvDX2Z+uVqh1&=ORu`ed{j&G47{>c7vAQxv20!lO z*7wm7d`;}^@g<*Es37SyVem7yX{o%cCg+({6A~6t7PrWpgKO;%x&!C3o>o)51sYn7Fxnyrcq^6XY@*oa(IkWuHzc1{7|kY6vf=m$ZYYO-i@Oi0&g|` zmxny+z{qs>%gTit7}0o4j$^+4Qb4XpG!3--G zjLlAziG)Ac0de7hzsYX-${J=Hpr(s$;ucWFZ!pHT8z|*Cnq#QPEXIxUowCDJNxi!p za3XZS3wpo@g6{F%v1Gv7HP2m^RbPL5jOR0DsC}VvaS7uh>#l2hrZ!Qv0-q!?(9RVy zQfd&BhbSaU9c$W+VO4sne>>%pJLC4TufTI=1GDC)y*AT zG2bH(EZ>(|pP+5=2RQ~YOfE~fj@lE&Kgye?x3o!AZ)ELHH3*YXE8G%27ScfndWVr%HuR3 zQrZXE#_&{<&wu>P0zLWhfOq9pu7#TZZuK73EvNJ7r>HJ=5KDnn8jPf9Krgfk%$zv8 zbFBvCYJbm}{|7as^OU7M; zP)c2!EvxRTROLO;^qHu!J1V+q9W+V{P&=EC9^*DuNIRntNA-i@KLDHgyGH5JwBQE5 zggs2NjnR0p7K_5h!QHs5H};rpjF2o(dIj!^(2)p2II=j-87(v@Nqw<6t(J7O4j55} z1#cJEXD$JwC(h)1&M2&p75x|R9i_vHl$DUFBLgd~NW)-<_#``KDa+p8S=2g!gu^+{ zI%(Fi%~A8CCYK;&=ftrM-3kZrG9HpMN`Y!wTQH;kPP1*0yazL zKZQneR4dAukI16$wj_UbNJ-Nn;B>K?8`Esa{E-)yAy5t3e6bILxDu@ZlGl9{K)g<* z|D`y!ULWZz%WvM#vSfVbKMLC)Z=apt=^$R_)4T7LzE9QG3a=pnWU0Lj)?Pd#;_ir% z*JPI=9xdBF&HE?o&7ivQ(tqEs-+3P>K#biNzW@BleD}LYpg%uQxNqkd^r(^cos))N zkK-t&xvJy+g)zPbuk|$KGqs6uC0z+a9sMbZ%+or}HYo~>20Yy~<^L?VW8S)EHWB36 zXg5`CvHSh6cIxOYH?e|3=y#0r1g-Jsf=_ZL1 zl@u%&$dnkeQbeF!DQ-!b&R6>-8kds3XT0ryd*>8)($ojBWBu#$TYh^IJ|8u9so$q8@2N7sSeRNBQXV-AG z_YAO!Xt>oXapC-QI5(FF`jP&=<$GP|j}WijE}9UL0yR`*fat^t$$JXTH=EH&85yAAXXp824Z+NB`|xM??$3RgHmR)G;l99j1pKO`?`2@WwzhVj^S_p6>4Ss2 z)30*r@aBp$cbZxwMA{~&P%3+osnH1-L3HNChQqRy>mxAnT)#N-ZoycWhq3(QCTUTm zm>6^ZtwoO1MT$`nb{C_+C;AR{Xg`!r5YTKGvSL_j)+IyaomN{0|EtE&yuE@LuC#kW ztU&rR1VYJNWR5W1-D;#01a@b~Lc(n}y?rW41b95HTL=O1NOV~fHW37D2053xv6uK{iiL9kF1koj;0Ty*u}V{W4~>PG+{t zd_6m9TI!4PtKBrFatCImpPy2i`$^qMhP|oq#j0lX?oFKkbgTAfVC-w+NPYqXd64dW z5W?_GB@yREpT12m#m$8@N0*06Qoxywfhq(k<_7>HXuq$2QBnpDGBth-V_x!HY(^Jb zvPSLw@mQa#`NSKy1y;BL0Y?GjLWdesoa>8l!pnQe;cOnXE74SB7W>V5Y4UvA#5TKG z%k+^e;#RykVNxANls@Gd9(#OR47C>7+Zrk~85e7^n3cQcOK~jo76>;DRIC>UPa`L} zgtc@LbPG8a&1WrQkb_WztK2ZJ|AoFU>|Z9g+gMqxibQxC8K4}Jb$8tx)<>x>6a>Yl zjooelNHq%ovRgG0FJZ5^gleTkG3?WeECMQ3{7p?NC?r!|;W-D%Z5+eksgl7-9ng6&mm--tu$DZogRAov7%;f`pm?^qUDhpcTN(stS2uw4n z;>menUniT~Tk_#K^^ML_B50~`(d3GheQy-|)L)joFoOtc*OA=gWymQs(F|FWXQZ50 z8uQ~BZ4w-cW6Bpn6V1*a{5O7e;Bf0?6kONlgsdJDu+GOHm4iC|7BEJBDp510nlap6 zzl=?FG-aJcCec^lQ-dPhO!RWz5Ef9Vfy7fFiad=(E78my&5w{hy%NtjGyTD~->`F` zo1tlCHj%6GdFZ^5mi3Vu(rX7cqf&4Ybfw4mpEOEEXxV#S>Es^+QVWAAmSqMQ4 zDJM#KS#Mtm6(t2zN(6zYxxZBVZrVWfB9`L4PI!kE#k^Cq>q=p4GGP)7&24K)r!;(; z9)Q?M8bh_y+u;aMx#<{4cH>>D-p5Is#b?VBfbrnj0t?bKb?U>;L7)EdR|cqSZ%khj zwf!?%)ybtJWJShuu-)NxL(Co+;L=R>4I-vC+U4hSnwgZ~9{&XUZL3BPgO;TME-h3O z#pt8JQ<>(2@@dsVBM?I*LML0vSg|`sBbc}3#Spz>!$`YaSVjJjypa(3n2K zkoyd2UhaO3_<0__F}cvVH8>qAT{&Y}Q#@$x*5GweiBFX$zMfNARJI+krJ04A;T79x zp~!g#zoEVV2V>7rPPz^hoP6L$KQo;d!WlCS1ng>}7gP<{kBYv~H$0)ad1nnLVsp+b zma0o|4vm*4r#lS<28NMfXZjU~Q9w0X=t**owuuGGFp+%3qTgLKPz<6hxikFlSh8CG zOIt$3vG9~*xoK86(>>ANocOb1UGF5WTuvBV31$NYZCad{P>d7rpwt`^0_KZkE+KMKSrWrCDl9HawzNfp zt)I2SdL<5mDOZzV6+pw9;i8@;|Lb#QOp&{sp1j3A$tANXr7Grm#9YG4#q~m~fb#lu z@m^FMBXyyReP0X-o$e6-v4w585z7cb-CeigU#Hfi7I98Oq9`ooQ$h5OnGIPPYspzW zgq*Tz7Watz*t~Q#g6U*@!KuQejVkb0IDgr5(YS}O{03~e!U;^ihzq;xbs%akj_SL1 zChh5q@d>9y$iL(ei4gA5#Ii*0#*^hj6DNFB8;2`6HS&?sgs@Vaq~b|jejfR#6>1^D zK}jUujTFvws>ElGi=oX8hX8fuBxA%+)lgQ>a{83f>h#>s*87>Jpqei{x&-RK47py7J8yYC?g8u5Q|VaukYJn59lxEOBNfGNOiX)kpE-m)8fc|>aPh~ za(t5d3*&b&Y1G+5;fXx=zR&$jf~z!;KM$F+E#UA9?t*ORm zf+nC~sqoE$B#$bKW9ZqFX2_F^*x*YY;CLYOUJbXXIyuonpqVHB7V*uSHpQ>o_Vk># zeY$7k!u;){pwNmgS-OV{(uQ(|tW8k42D48xwoPi9-irE<{XdQw2uj=|1MzG*N}lO^ zr?~h_6qTuZLEu6;^1KB-_Ka0@V{HwL7A4O;M>37`rnr1vcV?yIxMIO1Gz&cde!a&0l2y7D}=rL3e{w6zzBu*};Aq zEC3C(N@hR3O@)gcLycR|D1{ZHwWDDczLH1mTtw8<7T0A-nxPN$Q7!9$p@M0>M)){P>g; z-4f9f$2Q&rFTdA4{PQ-Vs%m_ar`_rP!k^_647ZzTMX^_qeQqFKtT{h3P4%6_DsX9% zI$GK28aRk8SLQNjtA46nV6WHoLJ+t9WsOHfEVVCQXT1RW0*Y`mqSqy~H!ctqx{PU{ zP}wd0v$UJ56+{a$eM}tF7dR|mkqp!@%nqf7He%Ytfbrt)=Mt=hxItT{l%(Zk`6YEP zKJeGNA07O`h)^@NEmLVxr$1uY8yz-ZnO=o>tKDSm#!Qtlt}xdT=9zranb#5vj9&u^ z?wn3w*(I9VfqUoZ9=kgA?fcWv}hp2+YIGn5S~-T=iFJe7#|` zx75kwL@y*FfX7$^f$5SqXsB+A$iozN3WW#)%({m87MxSp^E?`3wUxx$3_c}}l0tB`W#ELt@X=0MTlSP4q(Zqm|r-kGMVUG@?&slNc_y?mf?>BHMp%(@Nz4qKHQu zPz*W9>l3m$mS>?26OEUbL)y1HHB9f&J!6NZbt!LB7++zzqq7ALh0D_dnmAIL?Aa7H{Pm#u)!>COAlR@GC`UDfIde!wmA{UT zbuC9O_X3ah^$S%Ghc~AK`ic$@9P&z>^gwa0acL28zh8ZtcXht=s<)#jF#Ctjw%G|$ z>*u)Edvz&-I9BDC*mrnL6}~2vr8BV9YQFon^(W`k$LqPm|5JL`h|Uj8E!$iVA`2`LGNciO+LPw%kA(+s&>_^B4en+gOe6|36UUKrlfc( ze+}t@_*&ub>n-522XQ5~gd2KAS;Y03m}?B##^}4voc-uh0Va2&|4=fR@THyl`TbvCxGyG=p z>iWLmzG{6FQA7D^m5mU_1!T?YCXwqpw^7rIHl6zUODv??hkE+a)jjs9 z#)`FT7S)QoMW&p-Fe?SyYU*N$@oqKykyNS(E@tuS>#D&~od>xJ^WR9LcHS))nZl*o z+!^P)FEE<+RD+KbE+Gq4#5C??Cj6*HCw_BfY{@7kswE;cY#}alxMfDWxjZOxG}DV- zH6C3S=Ip=Vt^iao{GCb7ZQLoMINk!sg(7Q{y0tTjPbvjXNa6{wH?%iKbhci+5**By77f!VVr`Kj-(gO#| zubKix$)p6c5_~-&_NNWC%P00nX`|~6UDJA1uq`3#8`mhW^P6ak<*w}uJ<=F46O;%H z7b&oH^~`wc!RELFrB?b|onU)5hH=%cC@}xlpujn0$y}x_F;-kv$E$O#1O?k0wjVp+nm!RSzOZdcb0cj6X~M=rg}n7p;}|EsSsQDxtJ z#QNzC^bHhpBw&zDn+1fmiaMA^txyJpsZZYMEQ2V$h%OBhdRY4l{DI32zw$iU_a<)K z0|;9bwheevEw!9TGL&{3(M|iUwK=+4&5boq6PgM7BhFLrVT=i{6G;6jx?3Bmuan$~ zz@zbZH+k`qCQdDc0uBFLWytk2@h(Cwa>q@5nhUlucqqn_Eq(D^4G%yh_7c^uX34GV z;``t_-P_wn)KI?nd*zKsAf(j+G3p^;YY_g6-5$y1wD7*i4k#4L$M3`MSw!y{#X?{4 z_F}=^)kj^!LE75!&RWjgnUoxmA2YnTj8CxW3R`{QhuK_wW^7u&KO)YLP>q+;MKu30 zE9ks#K>ANouUEVa-@)(hl;;|=n*TIF@B_4dU{_AM$!So1{5V%+8UEv`ctxvAYG4(q zW%+f*6hFQUZKR2|3ShGomf#Y;TH_?t&&l`N0o6^WNbce&f(}<{4&pBaM_35QgaOtM z{or`dtj=IDgrWtim_tjQbX+V=>mc!XAX!qs#!C^f%A8v`S(VcFC}oZmN&NcHLwzgy z%1vGEFGOC0biMZk^=NBmmldI>>l@GN;<>&&B%;9cTdf~Hdk@XDUx|7#Q_?4dUpsrN zzw2AYGvmj8OL*(exDP)4u*KXR#itV@UGgr$xf>@;kN0@T&3U%5cep=!(J7q%PMF-| zDl<%UCaw~{QV(Q{sGI}+;`?o^(P7JE0)s8|46(y-v?k-ReW|RC0*(Pt&Zq3clxLIW zC?$OU;^XwR^ZYp2uZm{phwwbOn}T$#NR#K&U%|QMontTl_&``PvfyqO5T!SK+TvVz zgV4HL$u$?qMy}jWs9c64b5m=SmXnEbwJFW8;I2SDggHw2YU$LSXy1N==4yb4IhD~l zh_CFKlnpu}Ur4dyfC4fRcc-U#Wb;&{!5#+P4b<_BR zH?nEG;li4?>i0JF8Y1x7oda{)#3@oq8$jI0_^^Gdzo^(uzo9e>`? z)q3G*XslV9`%a$UEX6tZ4(>R7WbRJLKCX}x@1>FvDYLH zotqd=75@j|ZYO5+OdIg~P5 zb?ALxr#b8vqS!9)4zHB;v;Kx8Rcok46t1+O#-&|(Sr5a4sh__y+cAyeCOT)@uDA|t zu~zUwPDaSorC5?A|7HXF+p|wMCHu&XC+7XY1kcepb37#meNLM(v-(Y@ zf*<9KdBuBqJul`<3D#5v9VZ&r4{p&LX?=OoRIZ~kofV`$GNoUd#A=Jhw&9zreDVU; z+jwpDQ>!}yJBWJ2Hd~393`+NV8o^fjGW4K^N_462I!iv+YQ~f`%B}J`gBT@tKBa4r}?WE1p46Uhzeb^>@Vo-n35qY;RDB{AWOM zfPmmFf8PJ!Vo`OmwE2&vXX(c&vM>7M6k*CqiZnKFmx4->!eu-lcI2eS2{M{&38KZq z!%<40!1ve%eF2X8-jg}Wt2Ad#G6q52sa{WI^_7$VdH&S{)XN;b@P=$yC+9s^%^bO5 z_8N(&gQ&XXocA3ugkBa5GmdYVj)87)OQHD@g3lY7^+U#A7$pmMlL?-Sd{9k}B%smb z3Q@P8gU#olB2gD|y61K8CwNUf6UB-LHuSW;(M@b{_0kuFn5EVbvcVkj?G}#x(n_&> zM?na^^h6yI^n3M25@|19mC9QZ(mqWoDU)JzG5p5@ub@#zbNop5xqg=T}*0 zTL6gnDkp%sjQ?36rk<6XZSX-rP@WjPklFVDP%#Vp6dlcj@(6sLTs~fr`%=a^q`a~P ziBjA;X{UZdV0OV~U<(6KJ>j$x98-`M_8&RMI50v?9aItNwox)O@SWuzq$c`i^I9Vz z{UACv%7@_Olmtz5Uk`ihZoWHK`1z0_Go9Iusc$amy*{g9(3F_VxSN|BYCSFO1g)W% zTG$5e1O9hfek$9bx?ZSb3YJpo3WtKPNg?J5LJ|Mn`hg{`8;~lIB!3Wf@D)E>gt+lZ z;I6w^wktQDMc4=M8`OZ?kbuBPA3c35O-vv!#Tmse-3DybtbM)fk!SVqo`~Xs=ZuvO zkI#mIX6ggm1Tw|DW3WSdLoq2>bh&<_5Gco8N7>qG-czBQM4deKemLYeAX`g`c3et~ z-WgWfnJ9yYX+~Ia1y|hyt8doZnD}H$dSMI7mV12f-_l?N$@RT`@|KYJgV%8sUq!=P zppDj8Z5);uU(@Lt#> z5Ae1buMl-o^?QNhniOu?RBo*Ljx9UePWFkWCx%Z3~!gc!P3wkEf zuPSL(Jtb%1lXq+@^*947{nJFp?uzad%lMs9YA$av2+Eia;X`^6|1U0{8-zP+^K~&r z3TxE%siFpSZYAELe0y79T@?nh`H%~cvG7x&R=I*6)7<&9a!gnzz9C+jL?li8*s^^& zkp`UjuMI|x1G3MRPB`6h$?tRT8GhXsP)uR{!zie2WyAa9%>cdENsN7%ORH0&IrnXc zO7F3jSFYNG|Ue=<~W8fU0H#0NJR)1Iuc`0hYD7V z8)k1Yx0&!P=r$pa z*nAs~u>mQpRwvkT9;Vh$Jou%6E@bdfqiQoKRWepi^}CUgRK_Cf?# z#-Km&q$a|EBXH4(h=43`^PIi|>3`uhb?T$MkObvzh~1N$b`yW-t#YIf`p z-mj)lIdOreM3hw5jzV6JIa^`Iy^j{LfB50qevl}fRo8RDVB~D$+Y6)Ur+Im#M>+L0 z;vJ(b3O>5GUM)gfbdl#58{p%5K`;B)g!M`Z`K$ZjPG{=q$PHO$g@+3LQyjQjwQf7j?Sfn`oLko19{m%f=(Z)QRyxVka-qy-K ziVu2(A^p$c?`tZB+)`8CvS6j=3CE=FC{Ac1^&`?h>p7(ED}k)4(TMc$L6p|Q*!L; zSm4knkgvMTK_D3>{Gb?LdSt`OQ2tn(5Q>HAKHM*l3(QkjAJ?AY?d6-Gz%C&UtNSrh zCQ+cYCTv>d4CLSiI`QP5_7Ay==n&w`E$J}=kbzGNHUiQ`K5m3+78Tu=_&(tVBACmN zq4-E zf=i-%f#JwC(UOahXINrng?B|Ug5T)_Hd#FYwVK}*?81fEbO+8iil>)@;=~0)eEr*I zG_5(!l`^-wns7{Cy*M*>Z%+5f@$l%RFztWGOPO(l1KKs6>OEiWGcywgnpqQDcdYXv z>%7{h09Hr1p^%cv7A1n?m(xM>h8ek`C29(IV zwTP4F0nz2J3kOc!8_dk-7*@y;2@ZSpYOlm=$lt#a(he4WLHi^RbaaHSaXz`=KRJxC zQ>!#<sEl=r+dhRrxXhuN zSi3#q2Ii8<&KuRR!qR`i=B=JDcV;BLZ z6n9;PEhwUU_rC2=HAj6$n6*VKT2GeyOa@-317?$LtY?y{i&hQpoy=pE!+nuRofIAn zyt914yI;da2X#!!jCw$~3UsBQx`3PLs8Y>!T*PAXyjSnfUJ;sQEvZa$q!Da6U$Zfw z%Lm2Ak*7R8QL50=q+qBWjtcuONn~DQj0rG#;HBh*FaNwoZ#mN5kZDN=N;*Tb37MYs z$xU4JIb89rn(GGO zNV6a~TTJ0n62019D+d8`@V|lN2c7^zh-dQq2k_5qb1))=8F(IPI7p<-;leOlc;XgE zGZM%zUNnqVIL>H|T6n4w;imhHTyckzsvJyVAt$)Mipvcddr&l^cpDl}f$B|WO8ZT8 z?8N9IHpUa~u*ik#EiD$ztTmGYD~SCisW9W;{|PRG#=xVj1{_}E5nKsBq4(Zmg{{<> z{juVb#2>2Wjzr3~F7zWnb7nzngJO)_Yz>lIZ4TfnFk}QkGPa1!I^&A1+w8*K-$ZuT zGBeL5w|YkXu6cb2n&C;a`D=S7>(eM0Bhs4$db4wlgoAV^OE{ni6xjY8wbHOb6yw+` zQ47@SsEZB+{F`c3aORiN7Z3slK|_34IHV1v9y~m8trrY=!eZEVcLz7``^|*ESLaqo z$Jy@zeyPh(mT}7AA8`(*W6%q&xOD!$GO?zec#4x3gCJZ{ zUNrI6TrIk7kmp)}en~s z^LBDU#%X%v99&NL-zizb;Pq96beZ%6T=av*{&OGTL6P!6~EFyx`#1uT)im!#Ucg1rh9JLKoUsy>nce6gmrDpyDV7Jq120*TP|(#{-)CpEIDJlP*BnAx3fd4U>-^sa zc++K75n7M#Dtw)2J;UJeW#*C;8=&%OLtp1_ao^@=j$o{y-zuSDufZk>?Kj+*a~ zIn>y;k!CCiHbe#E^rx)eK@?6=_%u9r=Ya#iNFkYaB?}5Y)ATlOt@rnKz?eY9a5|sW z1@U|B&9iDH&KLYMxn&sh85LJH8&RWwIfi40a#)_l>L(y)tZRVgv?uK@8%o+*ym|oC z()WPi_!`(unwo)lBuIDzI$Mg6Ci$%5v;iDN(qh`q3#@w+0{KK)vAz z9B}WN!ox96g-aGou$T<6fCIvO|DjIW^dbaEN}IHWw9e>Z97sygKbUF5iqWt4De%O!tC~XctOn*Axw1x(z{Nrwxe_Au&@TpvhewMH*MmRX_66YVP`{!iY+A z-m4D9cwH)tYd(iMji)m&5~KRgdb2lTfBWmkU&%nw9qcHCw%(m77!>xjYc1zexuP;k zG(OJLnrydnkol_m%HDTos2nC!-&C)--T_)!Cs;#VWdkxe%1d1BWp}!-!@MKq(cB8N zoFHS*l5#@>RnmA-b*VdKWoKs0g6O1$z1ghExrU|DOe;G=s_TBCzXsbL6(OM|c|}zP zSe@@Wh4*(H<15dh#y%Co%@9E;_zSB?E#ewuyn{gE|@L+jWcM4LYH6`qtr zN%=Wpe$9Q3q%N{^lpw5gZx~J|YJ&Xa^fclY2pEkxi}#ux%!X~QO;9(QJt?~~0>Nq! zm}~{-kThX-$zr{9&*34TW;j_*AD}^XQWQc##W08KdCrUO8>T+TR)hPzsEO(+Y|I4* zPEb?Q3lV+H0fXJ@$F4?!947b*l>v=jjqnd}%aCH-s3mf8+sHV1DYPKX4bj$25;*v> z0JKcP-4@@?0p4L1)*tz@i>SzD&v*HTk&Sb$Q`4H~){!>AnfuI?n-LEB2enJD%L_Wv z3hK1QL}B;9(m`Xxwb?v^0>lUk&eAc!t?;je1v++m-acxH3a;;lhUiWS5->he!i-&` z`)wolken4;BM9q;%=0Tm!=w%1!TpEJ|KaK!0t5?}C0(}BWmlJN+qP}nwr$(CZQHhO*Yth! zhWoQRo5;*R;)@tC&3F9-JmVP`iKx-qeXqpwp*Z|?I9^)K?a|ljwR7-JvODE#w*`+y zEKmaDDFO|d8vxc7Q%`-wFlh7$ay&Tyzp`tG>wIcgA*=msFb2atj6`0?VQw{eE{5=M zpQWmv-}<(8b}G?khKIwbhnlSJ!s z%YQTDl^Wl{bf!~^HkkPv-;F21#!&)H?CU@ZKC>**Rl#`&<9-7k(k$(B?jSxw+|-hvZ|Gy_}GB) zW-CC}Sxs(=J}S3-mgt`VsBeC*Ug$(cEsw0o_!^ppo0H1{tK=`cAFq2#yz!b?49orf zQgYkh5^)4p^@>UGp3aJ$?R9->Ns}_JX;aBjO@u_QAc2# z0z%@bYE?F71NKgt;pIInTbE#l+*!_G8v2IDYtwi1l_v^v=0KNbPFVApc2SHXmt*cw zS9U9Gsn<&}P6&sQi*%C|;q*`SPf*vOtBY|SHxl43ej_8|WXpa_QehS>pQ>;$Zuv=_ zru`_7z^9^jexajF6wBd&3 zFs7~rdD4tUR=q8EKKrc9UZ&4f&)S^tEh&EzhW(U;t~H@}-pWNT<;Q0a^$ilkSE@Wv z#c3`6qF|Q$bD+}JAO>3|MeLR(G@5~0oVA=2{QVd&u{_wp^ea@=@PTOXwOm>G9(9{Q z2guyX#eg6fFTy43Bxez$RXLQnZ4-b7yT?v$KiEg+XGGiePy|ZCNqj!i(g}-ElEuxH zNM=ioc((RICCz3|Ou|UARpd`+_X!p{0W*_;@}YxIF9?s6Oo40!6Lav!rd92XwRLQ# z1PYonvo|+^gUs64=gl#zM~i1w2r}Qr_6G)#f9P*oDWH=5wRRGK2QKE3aG8?j6^Ig= zcvi@6N*^ArX+;pSgNsx-y-zuwY{i5olfRLo7oe~TUSQH*S=6xk8KVyq(zvAoNumJ% z5`=6C#oiNvocI%93^&(l{6~v+ zM=Z>%5OI}lU?KTBMf6~&h<3lXu)yo0_w@WL^K!3H+P8MU-gN2FL>pW_TKJ*x0`-Ko zftP8V)Fg*1P&u@foPP2KOXTub`SA_wj*lsp`N0=OeRNxt=AP0}Sp zgtS19v}(B@N}UHq?5oCp=i3q_T8`eJhd;fWG2A<8vw`s+x1n#>x&H7en_dTXmF?$s zIxb<*?fX62=bM?AQvvMA-B1H}@FaJe&{WvG#^Zu1EkdN=l@SZj6-49Z#*R7xinivc z=oEVh>AxX>SCa<~$SkR>$$PBC|MsoXe1JZ?MomA;8wYwkni$D^bw(2ZJuaZ@e`mZs zCiFHsWzvNF`<>G}&9B28i&f(Kg_&Zt$ro91%;myi3d@LBo8{J^YF~P|aoevySrG@7 zo47{3_O`_>_bP1opkYeBseQsjsZi8BtVIkQOR`or#F<#bBL*NRH+i~SVkF9}Cfh_O zL@vyF4dmyK@~m}NTAfQGTvkIH+3_~;Zf5|0t^>mE9)Pf6rx#`KEMC~^bh*tQ20kQ9 zy=;+LPh;mFC+?dQ9m!dAm}5Y!0OF$e9g_s_R2Y5KhZ4aN*#~&GUf+$;jd}oqeOD}p z-pQyNyZCdeJ(32={26Ik6rRrr6lnBor-45*4X5vtkaQPII;(i$_I_MFw&821R|oMK zbv+}eXu277d1;V8nOp28%ilfz&`hl!%Io*w7SB$tcH0%{(k=&DA~pzJi}VBe5oneH zgsr3?91H{Yx1b^{ttjKqHy}xLDe)UgO5j_lMVKB1%Or|FZNFq7+G9EI@YbX|<9 zTK4vguqrA#{T*lYiEJ!wOB-Fm>1dwPu_n%pQYHMHn^)g$=fAt}fU{#XS@_ zn?Vg(kpa2j^M)7Uhi&6D%v9`rC%9<|uQOv*k%a8zT*zEWp#j^`QY|tzi4M~e&~6^A zj3j{xv-kUdk?Q`F`Tn9`eNG4eN2tU9->+q6=8pe5Z`}VYlqep%NQct%NI69gNuke9 zPyq-#$byuKo&qdDme^L^FCB3$N0IhB^Jp_FT?!10Sg=f$jDkVZSJZeuSBcX zI)vPWujORrNOhOc+1VN(*OvJ>*iwMSZ{h41z)q@7NgKNf<~uq)sOVl;Hs6e;`k=nM z0wm^8UBt&*gP-(_O+VgKxQmknqWfeNZp-{yuOzJo%OxBg`n|p;BdTHg`-X6%%|F)6g)AeM|&8 zO4nug&YqGk5TVyNi8n+Jy;$WhnUWN%jh~D;yZLFEfS$UvNfAp3B~nDT{Vg+0-Tk0w z>>9^-K2}_6We%+au}9D3idyG(Wn$Fu4X645MD_(gv&;k_HUNkU&Lb-S~u@|7b3fh6N-!bF3BJs4yaGn;I1aGv8LP!i;w5;SaGih;l8u1yy0pCA@@GOvSwdHjOR+4AMK>_Qk0hBm2c#J?At!pkfu74D!sB-oQ@o}(@ZOf4a! zbtQK`;fP9a9S0D&L>l%4f>C0ZU9kTubb-!f=vgo<2?s;5MvE^Mp@v#`cJ|F_Gv5rwrCS$)tPjNdbPdV|Lfg?xjyo0SLe$%XQz?=&TL45 zna$fU(nLlzch5m=>*^`s?w#p-$+^>eI>-_ zTe>YkAM`y51xUnzO@NfhXUUuvGO3fsP=hv|ITbfaYOWGMZYN5+1L+90@xUvEDYB;b z{5W}Mgz!m`9v#hS8oi;H5x!=k@$b4>7vI|0I{T~pem=Qf0<0FHLeQg^+Vb$tc4C6a zt>cA{3?k%#@J2QokD>qxXAJV#71rm@v%5IQ-*<~=2|NO%Tz#~b-)Y4cCI!68A$0^C z3ABeS6ydkHadASnO`vjTi7T%)PH-3Pm2AnOTFSFb1%6*hh@jzNC|gly%B1p|5YIkep6r?7KhStK^SL2) z!V%Z!A%g&ul|<)v?SMLKycZnis7 zo&_)7hCeofMnk35JVQks-a&>)7Q3C-mWaOmy)kNsPZvnXfNaT9F!s!A$9`^Sd@Vc(b+l~xwHC`s%K4^QtHwE}~! z5+Um1*+X~bim!|?s_tUXXfP1Z!-57iw4`E8?iTjy(l%Z3gBm%eOLv;9lhnLPbAI zp4ynAGjDts?;pkSYQ2X-H|f7Q|1=?|31`g5-QQKSs&N0n4;U-FdBqC*U{=e!AHAMo zl{MgO;Eb)*QKuhT%^5UR$CC->4_}9iebZ936nL!`hPN2AJ({j+H4 zPUi_>s1BZ{@41fc;9fKUY2zTt_y9Rgj_epNo!% z(gARG@8bXJt^1FL$HpTL1Azem0HXr{ApK9r%YSRQxRbHy`H3BbDHr3PfemPHFajBc=APOXBTzffpCsVb0IgF1% z7?Wm&*h#&al1GIkG#tD?MdV4Ir;)ux9uo>HS3Os2i3l-{E#&0FNuyxc-b=vv2*OeW zBUBSm0vV}{;C<$zB$Oi_iG)v(qUAj_?zI5DES^oyJmK>}jN+66PAJxI0sV6dnnL$F zjIJ>Qpaz=N2g&8(?SG6ZCL+*k?~;lzKJE=YPx3P)_E;kJk%W{3ZU?`ier%!Xl7za8 zjoz261U{zGH^1TJX&_XF+8^bn)hW6ykE^tJ3cn(sOxlw76CMh*0!lYf)`&cQHBF==WO0Vj+ksq`khZ<)M~OicF~|5RGa`)opu7 z8WNxfB3aUt+2)d3u0Ry>N1XbUS(yYy-jt>Tuyd+Rk&DV4kSGCO=Z8jlO9%(fFf(8P zhk>&Q)@i{b$f>tjPhqd4nEhS)UvPzj|HoTqvooLjI}9H;R3aZ7RY{X(bs zpE45u!J9}_--Kvhu5Y#3N29hSk)5jd$M4$olKY}03M_X3`+6;Vu+MjJ65D6{fwTk0 zP2b0#lVw-hA(f2ZtF(~p{QyZC>%%Ix4F4#Rcvs_#Top_KmQAQ*lVINcwXkT_O|HbITJ>v7JrX$`4VAPGF%;l|D!-RtJXps@7(l4`G zAC5@g;!A{{VjVpHLCfb56P(D`#LnUJ1xq6s&YD;w!^G?stiR>qcU`K{d>6PB>Coyz zyvcxcfZ|F8Hb1s$3GW_}w33ak3E#e?rJ`>73f{0lz*=$1Jj~sso(Ba zcRjiZrPHy5p+pB0ZYaTMc0%v+JVm&bFB$=kudjm3^yWf<$cS4LHLE39fOV_JWjSZX z`h4kg3A(a1jxAdwUl~i6Yta?cF3#|7dfS=!R&ZJD9{l@C*63i6^~81DUciI-ZgV=@ z$i^}2mhp)HGk@k+09AE0Y!mgxSmkAkeBEpVHl;p7E4c$J6?<;0Qq{T02}msL_-kUx ziKPvPL^SQb3GHIjeCWkUG&pO5hoJgpW3O3Yv?G|d66KcNoD}UGJAA7G&UERE z2;)ZQ;6qf{n@w^30jHClFvy26=%^d8SfihIOdl2sZr_1?d{o?u5VTu2t822JwFo|- zrlo!IvhKl8us7E7h@AVZ^&%(71i2StLqounBxkrQBk#N1c2~D+<+`vQPaIVChONSE z_&^>mExq!-WHNaoY5YFomDnf>0w#dRk{c2F*y>zJ7mDK}keV608mj`2bB3+aqxp2R z!cidrRyPZg6Nh5mX}4yit+-V|a0a_UWq0V&R`Xz+OyEc>G<0_ZNJ#D%H9Vy{>Mxiju z`3wqw3>`PrGop$ez6^!%USfHG>#_$pA;)M0L+!~NVW>{h87b+lRTMrx0-lraTMq-( zA7~yv9uxQh4!Fa<9#SBjss4xKgkGfM0EmA#S-lhYZ4y3bxvJI6h~2?QQA4k(G-bzsPanau zTq}UyW)P^Y_y4>UdrYCYwlJ~NAJ%Y2m4xF@r1HL0oPu3Ym9?MQZc7B~71vSqg)Dy` zh8^uu@VLQ=7bqlA)1XMcLH>_N@;{0pF|n8%oU&Z)eM#*OM@t8%rr=425 zQeruUw)_FVwelg7kYj){2dq+N^wI_#4UjL++0JaIJTU}wj`Hu9Z)X<_Yqiz^nCjMo zPk|CMBD5|7@C7clb6Q&zV#`wAks1dFIo16j{2lFUcUp1BXUabg zKzL@7#TP@Ykv{+KPN$Z_oH`mVs2@E1WdPX3$$6H_TUmX8*7EH9cUlbxOML-$kZ#W* zWu9)|?nE6qthDzbNvI$9hfaGM*2H{RBX-18=}c1wtzEeI18+)d}RP{6@1$f05r-E;eKGBu!1rh~Du6f$exh*N2BQ&fJ9BgrW%C>%b*ArgrT+lRaKjr0-t zpkfHP0+;q;sQ2lss@U$=6?dFIGn_4}ZuuFl5iAS(7>{}Fe+ywj)t+m-q~ZFu1w_by z{a5-BfA)YUZM|@?lPjsM^SD?$EH8ImKRmsW0h~^ncl`M{l{v^|<6;5i>zDrMv}CJs z6bLheA_3E!6h-J`)EWet(~1WlwOpz@#`Idu-{C466TbWn6Z}g~u*OkxYhxNeZWf5@ zF7t94?_d+U=Y&<$eu<;(n(DFEHOgAsS4?J7gaRD|ADiZ}g9)9jJKVsh>Xi-h=s?K# zL8@kR>ncscN(W1vRp@ln{p-e9-2G?B%vbIfMl55%@Sb7XoKaS&(?Iw!%R=N$#JUu+ zYk-m+{O5xT#MdjF@Ofa80jahs;0b}PtSN?7I^VLNcmn2Q zD%6sa>n@tL`jjc-+~J=Nmk!jbXa0UrTTZ7xcLh4oVew{A8^rerhNL0#F0zhW=mw(J znFcQb)6uStcZCu0_x1C>Kc*R+6YPND8ZfBt*aP(t{5q_))#6?l5}{cge=WM50Y*TT zcYYOs(kZ+0Eej#%UjB`#Cx~Z%e6{_|Y(b#O3Nwjjrl}7O7U!!B(my7{dhs`WRbLv~ z7N`wl7B0Bhsk5*T+kL}XJ3eNm3*7*0J#H@koYKxn3zJoz*9k=9Y}_(I@*1%31eRcJ zQnM2SuX9$kM3zK76fm1ufhOiLYP`Xz)G1SDtxX)C|2d1v20I1pQ<<>8V&8e~X-`%1 z>rXqRjbf?~Y*$PRjrXn1)+RDa;#MlVUqY>pw~JH}0~%yr$mjkQ>!&vqdatXi5$>?z zM22-L%Wviyy0oSfj9MzMMhm%MlZ-JG=#Z9X5t%ZR+#N6Hx;>5o2$PWwRWW|&jr*NY zX8GSK}0bta==K5?%(}##tE* zmu(-ncZmrs*{t z06d4IEb1XcK9ePpDt2Vwcj1d;D%f6lPP;#U(m@G$VbhA7>G*BmU!rl@*seJUXO9gw zSMczhA$Z|46{i+SJ4SX%K4O1n-TSWrZJC4%>YbzHFj{9-R#zPxRc|>J@O}YQ5SaIu zf?v3T@eWg>5MP7|TY_~WU(U~Ds^IkO_;8nhK$u~|2Um&x^ci>}zhzZsZr5R!oxkwG>tu}p|th%#oM0RA# zwm9LW@Mg8ALgaF3k(bk&+j`X0i0gbFJ$NX_S&lvxKbG6}aq`eU&hPb+tuJ@D`mHwV z4h<&qLo@R)_0$LsdsOTQa7H(qjjLm-2{!hb`Ms$!g&kJd!~e%KyMng}r|SX$fRq9O zK>hEX!^zr;!BF4EMckD}kUotI^1J`IwR(bthsf-!+%jk$dr~TKM|JE|8?DS+XZ}@f} zYjw!}QnYR^x(IdK+j#mA^WicjQBNjkfAPLo2Dm;p#_wAw#Vbb|4Hq9o?rMm5ZbsJ_ z(O5PuSTJ~FMquGoEa(ctL_94z?6ug5P^ZeoClRR~Ck*Op}7B@qfrpOvym-V4}XMbh~tTM){vr5=uBf{>`3)iBlSw14q7j4dg z$Dp4UJRPrfzb&ukFSl1@2*Z`hRu`CCdi7?6D?Qh9bw|-Tcl;^X>)_Ss!S9WiaGhrcIl>{ zS1Kp#az8oBAE@eOE?(CHL3%JG$f| zM$0wCJK6DI{N2PZ1^;l@O)i)N0C0Ur6VXAs<%FcQASP_zY-$!B zaeDO7(zm44N;L!}O`#aX;e2Q)z=$*9h$c;^KXiMlXG*sGL!cHC@VyA3x-rM=FPCpb zBkiamFWQUIW4dw09cLtvFK;&=gm)P>FhJPg`TGt(2JJ9S=oz3OVIf0v2y;1vvUvoD zy2*!zGMdSY!C9Go*_hR-3O3j~;!JTl&;vrzV^8a_z@FP2)AoB)#NPzIIT=N^R&Nm* zJ&)vI-rHGVJa&6{zhlV=11(`DCEG(gBKf`-eqaIld+a~TT#PwA9>YaSqkn}{fPQw; z*6xi==(-7z4;+&%UFxSLQ1I*N?8qo98_?U31TOsvlvoye$?;MvLnn%KSr63Fw=lK; zhL9eUM`5bBE+Y@)^HeeHwlk09$$03a2f4SGKYO1E#_@8-WM8^l4FRS>(7mA{myOeZ z_37FhazOT>M;L78vNe-B^g@286_nEm?X1T7(l=_3k0l;u!*{PpzCA|o)5!;xn$A9e z294Ou95!;*PSuf*`}v z54f!fxP>eQkGzB?C5{eJA(73VTEygvKgl7-I=&ZKmu!vT?)|BM{}?@IY|oDTyK$}@ zPm7$HZDx6>i2$BFWV}`|d5LmVje1m_yPTSw+3L%Wq z;yPRsZpF#XOl{*Ew+(4Bl$y@jjI;R~xYpNSAvpS-w{LrE=$nao0@I$kDHeec{fCjH;yJu4>rPfvAwI0A zwb&`O$hF8Rwy5^ligX~2WJ7t|BamBrzk$HL!;h5JeL$VJ^6$+g6Ig^_5spzLCKb_I zlS84s*(ajZ-x$1A;>Czs;bcPc`FRGN{)*rQYO$0dEn+2N2Dq5 z7RA}3JgRW!ERv~=`>5kdyp2*&fMyZ%`$}3$pL^rs>w<&l3u>gS zHR5iA&-%~Df%fcndcYmNy=K@q3rasHOazn%V*RaK1X$IH9`oJ#j$CL=z%^m7;qZzme#3HuguQZd+D$$o$c1 zpz^^xp}NWsLyIoeYWGz&VPRH45kdQgdzt)V1}$v~vN_5u&Uj|7Vrd8v{BvpvR;d3T zHG6|@jFJd^7sT=UpYE__&75Mv9Dk%>qBCtKCqm46ED&SZF*rifvieQHE-YV4jLoGx zP&BU*GHlgvFk3MeSh{jp$c>&vo7WQEImQXS6@!i34-}a}-&wan=04R`9maEN((dUJ zlqmwDOois6`Adqh>MxM^lC4aixCgHNJ64{cOeUweHT z>%3v~z~@X054GdUcKARGNj9%Y)ma?U=E#+XEM{9pKe5`Xly}TLvxjhKbFpPI1^x9G zcqE*Q)Sx)6Ud#7lgJ+p!2*qu_-&dlI^6K9;s00nQ%_iV3W<`w;WBwlrPAS2dY_`XK z4i69j66Skj4lp4eaoX*8ie*cVZ}%g-;4%&n#9CR;na?qRrl$+$>uS%8Jg(poG-j$O zax*i?fSI_J*iUSJ(L#;|+BHr=B(UT|s18}5=xCv~B?O7&NQmHpmboYmI}VBIZ7=mt z6X8OXAJ1(bgSMjJLOPZIHVR`pOlHP}omL>&5G^ct5DmCvqAW2M=H8RmiVbolM4x^I z4Tx(+z-Y|jUxlV|nD3aH^n%=Bv&*uMqYd%(AnLyWr>cZ|5^!%IA+m@TfTdtc=`W$d zN_-uOmeQbvrWZ6djg>Vjq4BFb3#bUljMfogQfun7{-d+3L2(mxkHT!PV&7#=o7Zqa zy>kGiL9r0$E6`L8CH^unw=W|dU_90&)`%zFeY7}i%}Hs- z??C+F`lWe0*&pQDs{}w|?nHqf_ry+DmOV?-O64#Z!>;-W#j2fe#b<+h4E02-vow*p zlQ?IatS_?sD+A{U*>xoW-G&K;Dr0$i`pMFW)$!}X+#q8U_>A$EdL?!@5<{57P^rTa zptd&0b?Gqr7!V)PgVsHA{)qXeA+m&H4OCOsv*T&vmTRy|$t_89<41M=WUP63d#Oka z)N$5L#OM#F5@$_Z1965-hjdB#r!U#CINWHSSVBIlMslM$Qzwy=lKSLG=j(EOAJs9$whhTskJPAYOo8eu=*dcY#(b;y-dT@grv(JSaSU;;f>Y{* zBwvz1ikQSu!*S^x2xq}21CyB4YL=pg-S(cvKt;JNTudSDOzQX9jF1f0?^g58!5;NU zik5BC4b0G?YXl?BD@`VvSM{Q6)FdY9zpo$u&d=c^E8gW1;?03e-vYZ%dPhgW{xj9_D8 ztK@CzSajkGr;r)D+h=7UZ?Jlkp-au+-k=b3qiq0cZaE|GMhIrM&yqRR_w?9+a6lQh zV0m!*jh5rl&%i0FSokSdM>ov52O}?#t504+LLw=z%0K_-gb z#ZSJY1(gUl+d9(*PSUmQ{3}4^Br;VPp5`OibFYZ|Tw6^NpGDZ=kLjC5@L4z+gkPEY zP~~=);RhotG?DSAIK?OzmS>zKYXb*y6+!^FI8pM*CPWl6D#gfFNj1_PUmTli$zVk1 z9?C#7%6a#{V}TCoB9*HqBqK?t1mmbM20&##dY|n`NU<3&=3HMWA3$aMdosLmW59@D zO^LWomCrM7N%`18Tw6HRD87R^>DjLJy2b`Z;Vd5(r`$@iUAaYjMkAlymvBiV zqSmU>DlQ@eddme}k-1|W9wq*fL~!8__oLq&0qMU1XU|>ynmz-bOal$(DAdGzTmwaX zKIdnK1ePP}ZaZ`?Ixp9*Wao~-PER|GD=8^0=SW<<5WAjE9XhC6^7pf-7SQ{oy^C6$ z{Y6VBCXRN(ILGmN9*#f@QVyD*)}X;%yGo!?GgYf;{BI#LWEHW-rfgE98Xr4l^dd0& z@*t=dmigJ^XHV@k9v~+IKLNmS-vj8X(Z!~uLa)#@gGEOC4s2#z5&7h~eU+#YP3*k0|k7X>1T(ES~N# z(|yp0a?e8o`LNe3x>c+|0d6CA5o;V+W* zw=juEXh73)37m9(WeVqqM2YvO8zg9r*5~@G=76p^l@(}0I0DW=~Allppf z^}&iJm1BF_3}t=8$_zxD+>Yt{yR)ynSCgpMDZ6n)Z6SYfD(_I2y78*{EPUtU25aN> z^ohJW#bD8Ym5{|2F%H40l^lA-orCvoZf#!IIwfDg5NbvURMW4m=?9aIKPn6VG*2;& zfQI;Dq$0jX4NMb2O%84aw5}Cm7 zcNa^u8A|7@ePX(XVOga_WMYXg{eoN(ZDOgFNtsE&ZM;;)&!uGv&Lko^J9RqSBm!)G zigmrf_L!a1l&uuC)o2r-RkMxi@*tL2QA!gzktP~T2?xotcatt?Ku(L6uo5_THb@i>Hb*ZOO7ZUvPm0eXO4g#Tfi;F>e;1 zqt1K^msm^lNMC^D$fm^zK-^=AJ{9JOCcz4PJtUN|dR0EI(4C=-zwJb@y}UPZm$nZ2 zFG5Hkn%G{q$M$Dse|47imh8zR#6P$goHd8+*&PU2PYOTNICW|wvX!O|lcwkgAp{6)OSz!Fa)doXpFd(C8qB`}o-&;I!nhPiyto?H{nc7v$@E zYt_x!cX@Ci4O=AuAQdSIK>19tz9R=dkcv7SN~y3>3u|`kIq769`FLsowd!W21iadQ zonaS07!@<{eJN#s^@@J7naQgz+Q}e?1b!#V)@s7mxL4HI6JOQUcB8{5Key0sKvl?w z`KLgvSs5=@5*rKf?*1LOU$3wIveJ9yL$+T$+3Vgl>u4*uOiRdYlIXU8w1FgK4GlW0 zq>wIvZwu^hQpHbs+a_S#;uRhElb0wXm1ptK#LfbJU-Vj|^AFEx5N~_6FZ#q-AdAE< zma7uI?E2`~TV{U$F~|Wd+B$+fb+{loz9aO#Ei*m%J&hs99qj zYeJ8icx0J7pp9fA&t_#f*~GaFJ52WseH@mCC12RYlsukRL)~gnm1L5lcLRs`WHk0a z=y@g;wyN|W0dQWNe?j4oN7hrFSav8PE9t|dPZ(B*KLR)7-D_@2%An$q?}sE9t9%yF zpn>Aaq{=qF6sHR6rW;H5P{*03LCQ85i8s7OXq7z#qkN$EbB8bSOb*Ccy8v~HEF3o*y z6B^_w`DZU zZ3!YG=7x(uKFoGe0nlx@23)eQT`d}BO-qOBjKp)70AjPgaGy}#ia5^pRAzQg zlYf&ZqYH#ta8cme*Q}vFIM(!zc5b1giQFIyQEb<=}i0MZ={%HD)3-ut2 zqsa*dgIP{_(_BG<7zpwumWJL(7EY|{k2s~Taz;)41ctQqG+1oG7QmIWiF~(HWNc%e z9_R$Ok^-olCm<~-QZIoCH?H=W(fNH?2z)8{nCHvIa~ta!T9sO(R*Vg9w zL#4;75Fo3jo+A+^jr%Yx4vgwtV%$>~}^peGJ2wN*^ zw4@xGqSg&SuXBprLa_fQ1dc~+7!^BH@l;5PYRB7yu9G!6_HQV7Y zF zJnhC~ojLjei&TX{^nynIQjW3()`I~9C76h|-(S-PV|E60>-+?-Z5|8pAC}0;pPbW4 zbfsimNKQ4Bq)3&ZK*dDTjV>ln+1S#AnN`aeg8;{ zeV0#)jM}jH>oZzkaT`Qy32P#3v&FEDuHT0~uX&~PUsPMb*?!gIYxurqc$YVN%f|J3 z2}Hg#P9{aoUU}gKtBz0KtbL*2uklnA4_v%ZKs{Ko)JJO`B}s0@*O!FHG7{F(Mjrz=x`nyBH;yI=0P)gsCmHz z5+&_CIDftaf8K!c2y}C&D{j6yxX`F&SrV3BY(ZDf5u!Z6{r0zQ`&vg2Rf0|Ad$??X z!@%5vTJIqq&TC-uz2`x=ZKKEg+_f6oQ#^xSvG@N#M|Dk2y|xXJNY>J(BH^oaJ(2b5 zcxqJyn-z`%X!rV%zgsbgOA{C+KPfeZRJ&!iZFz6KJb7;+bNX@K?4+^?Rb;5~T0(7vYf5-;5syPjT3ZZq zLXX{yTR1sBUoAF^?j)VQA+zoBU_9T4vEKQ^!4MBpVl=Me7nr7mj3?0M47c_f<#IL1 zm$+mUMy?IK1hq+t44$%O?IF?+6+x0h*>>Yt-pz2RC>^FM0rx<$x)^;xWqq>}UDk=( zP0*kcn-r{R{H@YSA70fl6`-qWNcl!I4LPbV36AsgS)BSA7% zh^uu_pPFI$c$wi~XT8GDqy8)-H*>T((CX^=B?+3{%1>@$-FPrwRxdYy{Q1VNuBq9% zwsoq;b?3t0jg!s!+>ST4UjBg~s6kGR;MpWfVQAPd75*4Y4=iN989m2;GvG_~9e(6j z)v((s0SyF1rqq9#g9alOQX(InS2===O?)KSioS$@DCY$KF7(>4|JCjG+9-2fY8?5{ z+pG!yi8`m7rm9brxoQ|{cHvkyDc3w75_`ymHk(Mn-dp!R0+>bK@=#^rWvmh>Y&Xr6 zz=k2GYqzHa%EBtUJ&4we(i;U zd%TzHCZEQ;oXR2Dl-RfOlmNh_Ml2q`!fSyEIEGFdOYQ#QxRcrD4mpe>z@S%xfuJ|*?mY7URjQ(@{m$cEfh$=kurE# zai`~%SX?Kiq^5=*4I~uc`v5BN0);M&4vPy{wi)-Rc7>-JpA6D)F~F+{h<^auerKyd zpfI)>3WxLSFG!>gow}h$uCj3vN1Va{WtCM&etxZ0-qMg1);#1x!|qwm0^$%owOgCO z$}6a##GXYe-6N*t8t%o)HOkp=D-6LD4s!53q@*zh{LXxfa^t7KD~1Qj-D4p5#P?HJ z*|GKedbxlUiQulATU9GEwLS?1_;Gg(ghGNiosrvMAcV4(3MGfh?KQgG5u>E-&)y45 zEk5h*-OvL>ZviOLQj1H*AG=y~95Og~Ubb`SYZkGWd6`fvv876MUbRpoCrqF8bQh?k z)=&J1?W*r9ZYkuIf6P!xzGd}k}qjPbVDpGWRYB#ovtU6yz0yBa%uy5%U>xf;c`w@ z`E_(wk09#NuhwOqx(+bbtSsdH7IE$U332V+Ddf3Zv6&fRCU5O|nIIX1u*e}akX;JL zvQ&!MEPOUUDXj9i5pLSA)F-}NghP@i&_;)qy?};r%EJT?wFe3X0a@5ZZeMGXo6HLv z&w4GSIqXr7G2QRKRmE)aZY`>T-}_kq;z- zo8eO@P+tO8B4w~4;axr~j9A@=P76p+u{xo8TAaMI+%maoMx}fX?p-{&C(pLXt=<5E zZL>mn@SNO}d0v>-Q{vmQFDnV>6tMYPM=+yp(nHT7)C@qj^%JUa#ky|Bdl-B?dEf%) zFAcTNx`z-86q@F~7%g{k!Fqh#MR*u@u37dIlH>i=k-A9Tpy9nNzA>Nj|f|9Jo`=- za)z)=qJw;zkwMOtsp)DYsC*)HsAS{cMPJK_QyhK;(spK7>xt^++3SSWF=Ac3ZMBC& zY)GJHpw%fW@V@g?s@jLlUql+ec<%aiQH`A%GC&8t`! zxINR;*GF|(onLdCiC2LJn((Xy2?8X_He8?f&HN(=GEoUufd$n60YN~%zfIZ=3b0SO zKcGmzBf%7Zw>t&-twa%E3>%eC0tV7#a=Yw!{NbQSLg(kx_=RMxOS1@}Dx&dfFaW{* z0s0dV*&d#Z;kOi(zne#pMD)*i4-cT=O2)GmZc6QB-Efo9l7TyZdt!}n2xSWQcKYDs zPu+_}`R~3zPjc23@bF#{i)^C(t2Y843M7@BaI~pEZ;BmZ}&N(?c5;<3$de$Z2QVZ;h;Of9JeE*zNB?UOSt2*cDq_c1raukWlQYtTD}>#xHRk*m&zGP^%W z05Z(_-Wm+7T|~Q;O&(j{Q(~S=>1kqKWODa`Zy@xoOyUs2=MK*It-;>OK| zOZ^865;OdOk#tN@tYQPs+LT8eZaDEAeK|UPs7gjZFYK_OB$;EBC8y2= zu8Vp4qHJbS()-iLmD2L5Ijf-l70$5rS!AN4p=ldK+x?agO)0S+-8YuZwd1KLuA!-n?(xRVvw0dfmuJ3Ym# zvB0Hhw}_>Dz^h7Mz8l$ew`I{QqI6pkINg|x3BE5fZ4(jQekjl5faQn zV#qruipa^EO)6|xP7q!db{;pbl%*Fxf%wJ+ZQ&-Ex^#HG_&6&l%?veV>6rt2BDeao z)R&A3OI;Gro{A~0W!9>`bOruqEM7IH84M6T0%8;^%LTC6=C90b|7zitc8j4=nK--m9pf_E|_6({iQ7BUN~`4f3QWGvMgNdtK1*B zWUJ60h;xblK&+Me11#7|qc*!}e5qNRc|o)YofX)~EI^fAVV2>-zs|H0Ho72{@v&pd zWp4X)Nqoa{Z%z`GIKRlPa=?zquA%aDJ{z`572%|Yp|@8^Jd_m|i`23=cgnm+z4T%n zJV?xvI&i<7U!0VYP#4nVeQFr(9DGjLdoDC(juQ8ksH}4C=~AnIMaNM%ivR;(>!8u3 z+u2Hezlfpea>C^|>7IC2zWxA*Q)H{Z+MBcf|C+r&-)r`K`PFV+n$*dNfGvrDEC4F9 zOW%!F;pp!%4*v=wj*w*Xh7##;uk?j!*;x6|^n$2kX1c?H7gQN$?`h3lDqqU z6W=j-4yM%L7!4@8a@nztdm6oNWxbzXRzSI99reesvGy+=PI5!mvnP%T((G2k38q>p znJ4o(Cv%y5MwVvAl0#6*vz0)?rUc@l_SztC5zdm74$^=BJI{rn9oN!2wA>|@__L6^ z+Nh&D8yoDojn7GLCzrc+rgY=%=1#=HRx*yEhliu_IrR7*ge1ktQOCKNTDU-#IRv53@4BcBZntI~cZA@sg^)C?eE;13wJ-;YY7(vpAk_udd$S-ZpR7 zny|^g+G({~2wMC08~pR_U-DJO;hj88@mgVM-;ze7?rg#T^#;+{yFkIo=s;El_b@Z1 zms^ztNiT7&uP$*Z`FI?G>%#QAxt^6dnb0Z{S7=cSEvl7GQRi~fN%c=yDxVpP5tw`J zMvgR;q>(~}+HiF0va9y*uOhFE_>|PfiPVN#sg-3{;?)S#H>IPm^yNo zh;asPD0!ZVy%LRfXfXfb3M!(ClE{wfT0?G1Umy+LqsHCW1#n9{T z4TjzCzzw!+j?7h92Je6zyPzH8zl79^uefm`r=2yUB~4vadfjjxSTUBXmlfp*h~ z6_06!*A`l+9g?_pG(}xZTpg~U8rj&qbUlx64A;V|3s_L2<&Qdvt6up-i=lyt;P5|? z)F`2=TRsiohXhkDSA|`srEPtM5#P#YtbY@Pz(Jo5CYV+0CZU>q(f_+iWfcdehKtVh zA*|DsU~NDxo4he#O307uT7A`wXO5qUraMV=8Bo>I!w)v;Ba=zJx{x1By z*2)SruJofFD^(E~q^BMi@NvPS3Q+Y@m@Ur!f^unQW;OH z0gI}EQkkrv0=`1qi5a|Xx5j%?)b|k5@Wz48f2@^Y#vUrN^^!GW<4K9B z_Mipi&Tw>0UqqqV+T#~>@E&Sr(g*DlL=la(^GHk)#5~e|%&2#KG#nh$J3rd?$#E6< zYkl@%b7SQEyue$xb(8{l7f(cvvmdF&83G@t&4h{X_ec8X{)fHeTyCBS{^u#oFkl%R zV>^w6Hg*Ud0!gSDh7q<10!IpxLI`CBC-mNX@4ff>5-|J*(aSrqdnfs%+dGvIIvMb1 zukKEJdwY9(dwaWZ8gaoKEYQI8u&nraI;raLUa@+N&~CeTrRtcb`)8kB)9Y|}Ms<|c zb3HRoLBdZ+j+%!ackqhZxtL>1^*{yVx6?HD;^f0s>1>tXPj^@t0WY0;!%L;!fS*^A zBUmjeDF#{sKenT!3vov+oYoy(h!eo&<@uxJ3vr#LV-Yx>1fJ13{Vco)r+0Z#QSS2S zx*i^NrfRrYLpca?U%=u!zX)&{^@Y8#ewCQ3K42Tu+_ zkTw@^A1oB*X|TaJ?m_A;C)y575jA+0fN72fI-%6ou~VG!$T|B27G@tff+wuuIu^u)SgNz*SjcEc)&Sc+h0WUNRe8 zIvtwPN)TB6{8mt$Wwc`Y7Zhj({RA3@oVYuux6eA<4lUM$Y zE}rvT1-NKNQU7=p`2^svTs%`4h~=qSkC)6AUDu?JU@Zu&&nmG%{VX^G50W1xl{y+= z<7Bzx1V+a&-|$s|3yV9C2otwVbybT(u%}vFWxvj2_OFXxk;sS{xN~kFT!C#T@Ci2)pHhoQ8e?3G zMzln_N$zRt9a^D0?yzFL3rr8+)d>vrLX{I!Ihd$&a47Q>+ zSOhR;{P6*2vQrjMV+N4J%XDH-7ZCwY&rM@3#!gtYa?n9I;GLM22s4pa1G8XE*w_{` zD+&;gW@Icjijz7fa1_G}+&Ol5H2C$nAZONt80#K^%u>g%`@^^P1n>&yJQ}ji2;f;O z3MY2O6~bp9+L#(YWI`FQ%`iL&#grPfi0P#Jv6D+8VOV6^iy}r^{~rJi`Ack{KkwmU-=nPA z#`bCti}`q>>9Nh^fW8y zx;xmy@n}u40U=XYy()<*8pm6$BnHlk2Cgl|ON(@f&I%ifa}eu85NiOOqm1y4uuQDS z+k21ogc56s_oGgXvre>ev|>=3fm&=h)Ll(AmD}$>TlG!SIXVKKb2l*8{c?04rC~b* z+hO+zj|;4|=y*N$H9_#grek?oG1?|1Uv(GLOUpT@5jc|snyl_2B;Pd9pSbqBdz@X` zMuw>_oLB|woyI=lj_GODa|A9uHX+kAC~(EH6J6yY+M!iT+WV4^`>x`~(pZZLcsmZ# zi(40S^<;Am6dsKq7rx$7y#C6{<^?v;#;_FJ86&KloErAX%_|psZNw?`N4GF#!uTqs z*JYG+k>*E5C$h1<;B?#Cl=a9XN|^}orv;j(}rX>k_&>hL7O{mZF=Z@@1a+T z!iqqIM&wuFu5ZmPEipX&n&H+fHr0Xchz#o@FJIM+QsY(i#d-8`R(K@AT^4zQHqR+I*H;GK7{a_p+Ja zOSzQ|XvJ@&@3|jJR)>xBM3j@zY~&=NIW=D@+H0#SmNHI_+%q@gyfrx#cGsbB+-LT4 z3@CL_fq`W7DL9Z9Sox!Fr*2lAN;=2wRvLUiz9V>z7-ms#59tZz>OZ-)|8BJT6Ebjey{2Pn7$^RKg5pH^fqe+(toFnzD{7R zTAn{!S!r40^~wyoBu?VT#K`G;20;ix0RD!b@C$y#3chfr!-mr4n3JmYG+>TEjv_@U zLenMnI+u^bEmELW^J}Aw_VKP$C#f2+8 zxt>6-BamweSHSL5!0uJR?oq(*R>1C3!0uGQ?ohyPSHNB*kQWH#c>;NkK%OO#rwQaq z0(pW!9w(4T3FKh{c?cl#_}s66-KT)vOUF?OyNA}Lr3i$+k+w}+zMGCa9d$b9bi@lt z+Ef2^lJH?ScTv!t6m$m#6_L7|iW9zi#j9hc%&yv(7!Tdi!K(wFT|w%dM}pO@!>bDCFUigZ zKBkRWv^PAfztOV{DO{x@g=*vxa45bMEQjbqXLQhaEnse8-~a&4@=3empjSfCkQi6i z!8H%P+PcaJX{V{lqx1!ZhBA+P14cCTJ2J4eXLRtr4tAhZIT#~GDo=AeU=6mg*UDpE zM~U{T8f}@hA`U=hjJXuIaPT-Spa@6UZzE&1?<9w9j-W-%eroJ=B08FB_j9W=qu2YnNStClDNLHMX) zHuEvkvr$RUV;iV>RIUWMWbG?C&tZJvQ@38^rm-3L zivZD#`!^4CGP$zH2(9=K!Tj})M<1R^Vlo}a+ zgG27bp_LwuOpL_`P~2rswP`Z*cMhZ!z_6r# ze*<*I1wzvkjFxySN1#{BE7#)XG>Eoqzq0}6E{q(3+G}oGJuIhb>5%B)LQg8A7exyV zR(i}sG!|@>h)721y*S#eIZ^!}m1_v{pO|Fu^WaJ=--&r7ZykY@E}g#0^{bc%k5}Q2 z<|uyHd(zlD@#FBSq3U@zeqN8N3k>t(;L;h*QgEuJRQ2nto~#~Pq!FHVP20?U&lYQj zr(n}J^J%eWl!-p~QHQ@-#Zj6#1WvN1L3$%Q>%xqQTLP5{Bz_Yw2KhjLzYtOh$*Jk! z9H4?@e%&|kU-iw0H-Gc~4c|WW&^I66{p~fceDnU!x7WP%%?FQEQKu;MzC`9W&HFa# zIc}#;KrIRyhed-zdjzB(8d}toAhq21%cOA(mYmz=P91v0djJ?`U|8{ry)==TPW@8O zVlxwy@G&)mDniM&S+=>%wx=;LY`av`K&v86Pa)RLQZ1(v*y@|cTPkh*oM_?1E75$E z>#|7UWTul`rkG(&G1xn%$bIiF=N}?Up@YAC{zZuevj)9AIX;1(6XT@@ohKbEI_fML zSSDAuT5bGnmt#Geu`pATfBVYq-@Jdvx369E?JckU@agN{zW3I*w_N|-!!Le+_gg<+ zbHjJn-~7#o&lH#EB)eheyT8Bt&2K(<;G6g1zu|Y+-}vo&Z+!dVgFk%w(6>*${QU#( zmwRg>3t}PiEAtg;uA`0K#^yxRBy#CEcj}eq6 zi=l*hw*GKBz5Q4@Iw4ZKpwrv0e|y_7rqi`*Iti4@(Ft=L7N=3J{v>Gh&HL9?vBu7$ z;r7$v&W+*r2OP6zNyG}E#pv|Lw;$jB?QPqD7SKsT3+a@D)^stnXc9v`ZiSYh>M!>X ze|hBNUmkh;m+g;#*?#$#`=9>h;U|9i;PGE?zWb+lU{Dn`ZhGbC*WdW%&4+(}?q=2V zpP#!Pn)~_c>wmfN>58I2mx87xNLgYW-^pj7Le$8ag``G$R_+lsn!leKMY%STg1oC* zu7w|RKPuhAJS)=VW@--;%_;nBO_o}>S=QTp{jbFpz*F}^0gO`RX7^@#rpZ2M%Jqil z(ammpYO0N&)8!N#o@O_XOif0njlCdKoL5(;%M_cC;cz<~UL6jv4Tsl%;9E!fg=DH-+0bhugP= z+qZ?=w};zzgxhz9+jmuWH8)c^hJQCju12)5GcU1jywAG&1RxDvMZ6JFAP{`H9w>s{ zK+-(TsPH1|-c>+Q>=hCPYTbsNM{?YO)IqXd&nURf=z9yJ%MgeKv<5-|5s_X<@dtKC zjwmN_7MG8YH{1BxD#zt4+3@dYy6q=%dES0D++VCWf7dfgyvTb062l#6249|MM0y#ig>T9(||NRJ%yi# zl+y-STH?&{Yfenz=VZxtS=QprhFjAU_<2Y<;|HcS&TMvSY63r}OE$}s9%r_E$TZ{R zL&|Y-qy>~oqpC2&|DRCx|AeZ4dP3DHl25hON^yW$$d7@aJg%9SMq!oG^isz0>@-*~ zzNNrj_mwdQHTfTXs6fL{rT~iYeyz&EBOHwuQVrTr;{uF3Z)Qf1w;E=@KNr_9yvl(Q zUiG-8M&RU$1_Ds4ysouEU&Eq zvkDJ@4UMr*1Mc&}=a#Mqq7o()29*E8WHj|Eg814J)l0ML3)<@&sF*<|yNye;s@JpYZe`W2RW@zt9UIF`9O%#& zP22(USOydnC%u8aUPPEkBATwEh&)BCGKx?I%X|(?`sO8;p<}=TOIw1FjdhR@%+D`i zO=B;$i3fG!LLj5>l9+{_1*@oM8GAZ9qntGbhbY#n^}=G*BA>U-=>l`T=&0$3EaKx_X`W0qW+fCjO~q8b zz2#VJu}HVE&qaIGN%iQD#2%EOWz&Pt0$mV2pt?Rul$6jM_7q{{j{>-M^s?L1%WgsG z^Q=|dIR)OO5s6Z4%#JR-)sad;u9jMKa}AYo-^i0{H%{p+AKN&6er|bTF^YMI8yV9J zNKc3laV!CJNLsAZ7~o^sH9XX*JW#1JE6qlgK%Yugs%O@s9qP`XeH^$W&7HP*`aD@O zsSJ%q=Q10de>ObCH$RzOL?+bsJ$KN!G(WwZRAZ}14bTEhy#dOXZNG5CjV)GgZ&S6+ zis@l`JtTXkZV8{B*|#_RdS=P3!X@*|G_xMID+lsj)G5bh72CI|eVDhn^aiePq0rb{ z8SPoUz;spzMOW9+{hl&Qj#F|GT?C{OZ`*DWPK{8vSSY-D@OVa zhF0}GA2+!eZ_%^Zn;Mt4G>Zc2X;Rs(R=q^S%@Peai>Y;$ipeaMrF5#GI1g~Wm7@s% zMEdAxkNO92#v%-uIoNZ~Q1+NF!(yy@@J7qi31TNw-qsUkb<({{88Y25orLvt;>)S; zQ&KLLZ_0|qaO2XVTXkmG6zOj1Bh8x(WZNhaeR0O^*77mO8&l$^M$b|6i@2R3xPk`> zj5%Mwwzx5Kh$@O5A&q4#Fs&S%=!L#gkK54sZlneIQR-8H8=3gMT zc5Zh0@jZZp9^ec8ZB%haDq}4L!@ZFXJI3vzDm}bdz_GJuVWhQDZY^y)Ll28MVSq zjzODa&L1$QQDnwF()^+$Lb3bRkE!dh@cL>3u*Yo3>lp=3H$B^Qf~+EEWJo^|T{Y|Z z(dL>xP%g0NG%j>)hb3X$6BDa`r9#RX=5EYV_~)?WV0JvwfYNJ5Ei$(5leJ-Ya`tyT zA&Ake<(2cSODxZ~jNF2RR;W?s?nWcJ_!pRccaxpMB4zlwYccw0+FCgOeBTPrtQ=mT zBCh=|FAw71EOgkE`|7hwzWS`acy)KM!3lUCd?{32@FmKUd|L_pMci1VbtoG}xXoSC zX_ZJ7>ZGF{7idBfv?WX!_%~aUCdH^xiVnYn0?I)bjvGw1^|1TpbXuX+da8V{EQgn# z>YgHhZfSuL-wn@|E6lO0tIYD;5P6+N6PXrPF(q+1ImtqwEc6YCzZyX;mm?eJMd!+S zd}%gDwj3k3)lwW);ifGQYZwxH6%iD1m3&2-|F!aq_`5ej;$NJ~VArg$aC$LL_zMQ* zzd0bOBzK>{<3eo}11;kQLCqtK2pj>l7{jd$vrtlPu#sKvo(N zizs%KLQ7Hf9rg5RiRSQlFF*2kJT%w#%nn4ODE~Pwb)qrqO{dwC$4JL0YxnMPH$*2i zMRm#u@t)I^lie>$xM1L4b61aY%|ZEgx81$i%6qXDt9Yf9yFc82!?%J3%ncQ66`43W z4mYa<_dIjZ8LVGmqQP@7@f?{fi=e3t&?o*1d0|mo54Ky(K@ssZf)zBQ1}iQ0*=C>P z>~n&BPM%Y!t;pFCtW3Ihd%0cs9sXJ}k{wOxx0-0&iqn1o5BPu2TM>#o5x?U`MEX9& z@4O9B=q^O*n-JyhL0q|y_*Uu$#BT3D@Y@f9kAxyvWC#iJH8?o3;bSAEcY5s?VKOkh74TjsjWHaNJF!rYvjYYl5r{?Z!Ttp87~aDw-R8ThA z!1-cOBGo0rsSy&_l@xzc3py2SMXQ>LX;T>!OvkP_toc>FN*7J4Oly5I-zd8o5ZA)i zYqQlXYh|kPtQL`Tu;)E9Fjmgtwtr4*i)Gs?dQ^Yq9!xL`1>~PM#n|iqpJZf`smS#I zH2ddGv$X2n*@rZ%Q@Wi$Tj>^f8Z09p7oK9a zy3XG=R%KDqllq-tl|P#$$Ue+sR{5hL0_C}9K+rxm8YlBePdFeD;HPuKxo0da9tEQk z*B1m`fTQa32kzz>p1H1}syIdxKw+4!G7I+Drt9^qv#LAWUPGX8D5=epW+!XLET?IV zcP%j#f1`njGeD;@?JO;KmLZU0(#Ewoeax zbxt{M8RE2_4d8Jt+u*tVa%^PV9q(+cL)YP}mIY$`6g&VjD7!B7SXZ}auG;}#64q80 zB*^3mB=cX!5vj%Avv3&9;5cV}Bj~cTDz@g^&H$QRvIfw8bi5(pYz#XfkLeR^Cskq9 zire-g_wNnuJ<5-yh)rkLpPKt6Hv}gpM@{qM zD4{NLr$B4JLeS58YHJ%=!`=|umXlS&99H#nY-9dR_)1;bxI zQEMJyN7pOSe~BmOv!PPU2eK;AoDCinbTR$>=%VG3fc$Jl$X!{|QTe2cxFbv&iq~9m z1sY7P-bLrRmnI)zWqK0LN?QH+p)Q_}?HE?tQ=k(6);OKhjO}FCuf}s9)$W__`2`30 zqXE|xs*G?Imnz0*#;3-?YciB!Q;I!9Usq-GZ!tPZWmg&&Nn(dgW{L2IytxIu%Y@Tyy3L%4?CkM>axW-n{YLU*t?7u7-w;i_P69rdT}tJI9*y-;W0`((NqhaKXX0*N z_L;*3a6K^CuW!vQEwOEYUz6rMc}XN1PPeU1?&G!wd}H-lZQK;2lRc3*X6iS2Y?x8- zv~^+a5*8?ZapWi{8c5;@!>#EnAy0@p_)}NKfmtN#ZC+pp))IJuS%{tEB2AH?{e0l z0wN+v2$|G7!1(U_XjRTol8?l-ho3FR!Zn@<2US|N=(ZXrwWAUtDo;~>M&VuJmRPu% z^#P3G1?~WLLR?Hj1FY)b!BiAm?~-OB@w4E$P>Y&mk|2|VnhB5}pB|aTPLD)Qm!CvU zq%g9vxisRkE7CvG4++;+91_*TNTA5hL$cM1j&W|%$>^M(`qI(7BGJwLSUlqGViZ|$ z?xoz4;sW4;2plC5_G>Vm3k0ww$%tJ!88OPZ!dK5`qc+&_(-|Nq{2KKmjrrS)CUg8O z#nwn%%Ry-ejGOwYU&ku5%9y?zI31u76B=2y&g8cmp)B!lJ~dVFEPX+=*$L}a!k$Kp zu2Rp6RZw^w36%1rQ0WPCNU)Vv&=s@q>c&hXT~tGUqSsZJX`QB-or~}13jHO$?knQ? z`lE$v3Ct1&+VcSZi({BCSTu}k<6H@qiMKa0sGoq^ir1ENCdi*9UgM?mNb9)eg;lea{HuH=;6$!l6&y@b)2yWOtkC9f1xjsr}PX!;K&2 zL>b;JroO6k-gbVUy6L5qm<|SmaxA8m?AydXQDwQ4n7y)+Oq60&V%W;g+xJj}AF5QF zQPenG2y+2kGrXwZhpG>p&bK{3VC}-EDyOz-7C=$T*>Acft&u}v@J&$|E7lVNf?`P3IOx!B4N3aql z;I*hDNg?(ZYGVJp#s3H0;{TC~s3i`6_uNyRMOMl8P-S{yx%i>QLdB=U>*q(-ukUqC z`+||`Ya+gUeluBd>Pt0LI!gWTjZvQ;>AiZi>p?RPmlLJKy^CP)*Fad>VkNw^fzjf_I;;PuxxU$r}r{C)@F19Cz6)j0A z@wasPF_ps$MIDRVft^#ZK6~)No12@B&GClotsdNNHk$|gm&iA=e$;>n+!ka1=Us)oNNkK;%_Ni z>r$u?6fC<1WxaxBtxGZ7p9vG)cQ?GAr;c1V|J=&t zY&>wy{*vWIYc+6i{s|yxw{b{&Bc;~s_BU98ONAQQ=C}@GkbG&}3VE+(#Ji1je@Kh$ zLJw+xs>i<9Q&>-{eKRm;ZA20$-$9qI4G!&HfOdl5@QvX7u|t#!f#vkvzIEE-ad;Hw zI;fjsU(Y=0#1Tn7u!;HckL7qp=+sC$t-ml)Ug{J=*kN&pkv8ojBxN$zdW@n|=2R^o zt7Kz{*9a4_-$f(^hM>iht8&C>lWdjdDT{iXhgz!V5pH_yir^)V&8?Lk3qReNn! zUDeC2>aUxQx^7q0rOs1?O}e!NCq!JJiWp|ZBL5QGx6iW&cCf{EWOl!AMTlsti15m6 z=P!QdSHq~ySZVYlyULpBt=bME*37{vy5vfV>U@cG21l+T!(y}q_cKpC_qdZf$IR=B z#k^{@De2SuvGM*E4bvXXVp+Wi+OssV%94>n&&LM;>t3HG2My-o0&aX zZjy5d&l}J(F6Ibm93>33sAop5ePT&ovChd%DJn`uwNh)T(NVHQy8V2E^d6ZW|3qyb znH~yXx>eMx;C-9Y;t*2PWLFQq(8qK1JU1er9z*gR!@>-x96fs(<4YMY(4|R#l z4!A=toqOi7i`aAeba8&^l!cR*AfoSCr_Ar8+Kmp}^XNVlqd1~~qE=iz0>qOxGC&<0 z1nX#FwEVyzPP4qwQSO>)J8>bTrQS)*F#JNMI;`j?)N~1zno?zJH~D;K@os_*A4{pq zaq6(5Ca{IU5~QrVjvwpVh1|Z9L5`3PN81By(K7p%r%MXl!8G~vm%zGmqU{Hk10{9m ze@G!+fSghpgFK^yz1tXwRW&y<2pfdfdXku82zuZ`;^1O_^MN4)OJ6Z0| z6L!;sVea@xfj~cP@x(Oy6bZ}B7|P+h3Hl_(kf>Xz>Nq1^k;(!=6+#F-k?3)?UT-z7t8Vb3LNsW(L*G2mks3kRMHJEjM z*(JOZ2=gGS^1-GaQQ6q43XPB%&KYb#}BM6?e^w?P;`m^z?u(=`36#B-;h1zp&}V znhB2##%)!|J)ISgsb=s`hUu%K3?_bMT1#;;IK*Tvsi?%zsT#Qn(LO}F2?51uED3iH zV@V*@Y`yX$=+6w3mnS74&I&2o6~x(c2bSq1BccY(YX>%q(17@npsS0pl-F*h)o3=F zVE0gb{|h2NLheXC!IJ=ko&;9NkhfS5G$AcsPRY!ck{Q@O@O*DSYl( z%)1e7{|%dJUvXLCg^Wxv0B`b$8O4=>Q)$%n(-5o((!Pptl5=4Wp>m3RP~xO%Z~9wK zZ*-O=zymmQSq3dJfM+dymJzz6y5ITiPgmor6Pbw4B81cQVJ z%q)-AO!+k|GM_Yf1L*>H)0(aHfVVEOd)6rszG|?DmmhH0rLqA_1@!^J4^yS~#oO+tnEL4r=2)AOZT_@$yr2$-18DS3qMW8A<8aot)1r%8g^iL zX5iwY9`zIJsl73b+-xE7Lbh^_=0JeVTd|6Zd6R#_8qH5{YZsAj%{ot4yCPBG9Nk`U zUxSSeY7c(uOt+>tK=ET;lOO8>Gwy4#l{r$w_`N;xI!dL2$*ixe^h^=cO@WBR8pGLu zgzPAr0Imk1&q-O7#6T5~?GYNBH<8+Jd&SD5X_oP}q=UISfA0Lwa z*KrPvA@CpOZe3dsDuD~S9teny9=yo{ZN?e1gXmZ}-Y-?t+pNOJtH!CZ&Wd{KjI7b( z)5(^s(IT`xE{9uVEj5!+ms}RM8Dw%oy0i+-O(sAC25KfC8?5~SRhm!TL#3GrO`6@{ zR9T1Kq?hqiYE&F>ExwHv#JMoZA>F4H zsa}(viqpb)wlZk2IFqMz7Uxf1mi4|(c1&6p1+26C_x2^F+5){b4T`@gEPvX@8`_0lj zpWC+4Buq_)4>*V^TxQ>-ps=$gTkQBu;bjFB^0n7YZuF$rcOqUD#r4lB>2|<-NRN9^ z{{hn;c$#Dtvl17u;zDL6EN9~uGZB3(zzeGyuCc`u#N`bi1LEOuiNgno4-{YS18EU# z0CRQ``jpa_%ewS7`&!(I*OAn=Sm`OElGOG+p@-t~(pk7e(+biwo2C^7;~%#PvFp@b zJjaU0jAahJ%-BGEgbqGah`jH&(a!G-hZ1C(xA6CmM)1y{dV?ps5t5j5#|a;ycGMJ4Q1xu8 zeALvBssa+uQp7E?S8te=NEoDIETgajir;DTktw@miGLCS?d<-5g2s=H-v&<*zFWa2 z?Gvt2YNWdh>q_sS$D4@Bk9TbG-z4BVLKQCJ1uNFEqv|Ur$V!C+BZBJ-`?HP5cHrO^8F){l)YTQTxLvJX=b_hHJydUao1WzL^Hy_UuLW?Y2=9K;Y)9e z8qWsv%Ntmad@1!^WW~E}N_A;u1-Gkp>WvI+Zb?9LkgV=$2@t3#QkFn*=aQTqK}GNk zndl)&&`wf+ewy5$pGE!oeJS`CQs4&ebFp>sbq5c#1BY?=_8Q`v^=0`i z%TswwX+kX+j#&hUKX|FUHy1vAqN-Bi;xzoHrc@d1Q`9QMpr}|;aO%lQQf$jRDzSAY zv7)rzF=?&GYUOT>q|%IaH7R|xgvLl`Ly%0UU-$FOokT3U5vgndjFRZpm9FjucEazY zGfgG0+jHmGwtbbH%|)e%ggAT(2W-x%^Kc2If5Dc$aSzAD3NmEt2c^uJh{L6H$9ZxK zym6E6TOdR@D~iTdZ|unmZ_djxyN_UE;8>68Pcwv}%J)MU=!U!##Q~?9lp^~WFVY8I zU@iB0jrYHLjo0@i;HPJoYZn5`s0)FEkbF#(F8Th8-<@9@h+~~Tv)+pwj75M02t5HK zh44p?c!(8VVkh zAn9O#n22kW`&scEiJyNwg-0I-YKfXFxwYf@C}#@Cojig1tFEwxy=P7Ssd0=GA$38o zq>vQU(bJVtj4HxN?uF76)A;r3)jww~ew{V^KW7cQf)Ri339m{7rN~Zw7J*eN^3WD_ z=$Xly5Nv1QBS&A-LVuks`hiA2&}jKGVy-5$QLlc=a~maf@;oXwD(;6ncRj1!s>B{?3( zp)dfT#ly@gjJG?*TTG&c5)R{$5CfNVw`(3}JZBl^v_y?p70OP%L;CCIit@2E!Lfs* zA|0tmy@+&&o3~JWDsNCZ5a*d9nBrmb6s}#UzLX}P6VCtcS&I15Qs6;cwa1lSFJ!!4 z$auYw@&CM#!KS>?$L*Q9Z1V}OL(gce?7MBet_iw|{$Bd-iZAWe%6=<+Q`q(D#?xX- z&wBf3uER&k;$9v_n}M%ZPq2q%KV`4QZ&L>Y=uBXHNedL7<700YWk1b`DOj|B;Mw=j z1ni9Vty{bm&iTx_zZ6ceIyAO$A-b&&Itg;{`E3m*2^X0|`op<+5r?dV>we~&N@H-; zCgaFyPTb9oJnOHudwT0IQw+v6y6px6mV=SUqwWul?qOy>7>Q0(0pV^m?uX-EZ+Ms~ zh0qR()&{J*RdOckohVG6sY{j#(qWX0aDgbLkgw}B-) zJEdJoVy`{wbl2E3U%`&rUL2SYAS;C6xvVwBL6oaMXk=ipRA82nisuvj)PgK8lF%Iz zkeOp2t|-MK!i6qyV=A0~9{7o6Q7C_)^6CTZNC0@ldqBGqAj%gXU{3;oV(F*vOVUy3 z{B+LG(B$y;5gUml6W$I@Jgn=u^Y|&jbmExQIn;FV>0$hWV)=$L^vjt1>{v@O0>+Uz z49j~MHgA(LFx3)=0ev+m=SPi`lzV$=+pBaGRB6TGK|5RuBdAct(_y|(&W<7%m)ly- zXUVxyAmiKM@*z1l_RyHzXxd0G9`tY$1$Yb#XHRdFv8?-UVk>Mfp-FKI{7#`gxSmhO zc}?ARsiS41g9_#=5WYHNQmHG$ ztd27U+XP<^Q$xoF&!oP!jgB+ZI~W}*6Y=0qngSjiN>l0CUTvml zjTq5GR5C(;hLAj7Z7U3W-Z-u>`fV#JFArm?4)d@o3@E|LN(#30;UzG!Nx_w_?E{k_ z@s-+`Jh=7{_7q}IdPSC|l{u^iCl6_>QopI z+%~Gi&^qn7QL7L6Dvi%W2XJy27g|Ds(XH?W91s#=s6H6bb8sR@<0qF~P^kIfQ2rbV z(*C880}T+dS+I7HCq^96(j1#Lz=n7XVE2y8&$$&j03!FDM3l#UQ;GVU+= zFyuY?^9T(37()O!K*zrb|F@712Vyt?dCn6-n?{>RE28gu>DU~cW!TM>+vBIBsup{`ovSwiRw5gV$4+Ej* z2913TFB%;Bf(RG}L-3P2gcy$ik)i8njvl9TDc)E;NQ(yzsL)Y7yJ-v}Ry6*TBC14DQ7d@x-^UqxC#uM#o=*C7n~6rlcovHuU)G*D`}Td-#DF)N{}7 zMD|f_Cw8Fq6I-qLwcu@f-|9dWrB)ncy6{mPEZgVhsrykpl0H|VV%BVS~99pa_j>k0THQS7qM z@gjiVWxx17`|Z~D#V_B@e);ZA?xQc}K7c@6+R%1udIKBv-|Emu7lSTx`GChAC-J>$ zaq{qKktJY z9}hJ~s6sr{<<0#PL5gu8tTRPx?A*~e{PLf#YcFH2-~7q!y+OG_2p;iOhInX0@mu_* zQgMs-o}R9_fzeN#y5A$XIRDOqaueiX3oZzv6N0U+=%k%KwFr>{o?H^1?QLZ|p9^^S zR&REm1#HtSO8y$XGUiMI=6QBQlzbErF@}2Y*zUmD!;XX;Ht%FL?cmf9{oV z>zD8i>t2U1<=sf8%l!+5isQ_4P7RaqAcht^p3?^TabX9?tnAwfz`Xy31*KW;yKMH& zR_?pp7h&%uS)t|vCE~aP9lFx<2_cu)OrGfmXa-+$&Ca8@IK}iXxinx`RE}^u@SsE9ClTc&?^fJ-Tsu%%+5ev$Ol6;6%l-!lEX!(xgoC|!tcFY1Dqa;urHYuO5{(QXXK zNh@0&R*2+i0P#g}Nqe$>H1zLW)WUT4W^(74aru0b|69vcNekjb-`uq4lPH?_)+y|L zZ~~SJ|1I#zO)$M>7)M_6!Zh!Ksbb^f+v!iR3i9$}SidG#Y)2$6DXU+P|B_WP!hPn- zLSTJVYcpF8Q~go1H57oUhe$C!+6upz1v|P=@B(c6zSys_g;FjZ>ZC;VH_{)W)JZ&R(I6V zAn5cejVfGhR9a{%-2QyMvHb76vHW^{>-GB9>-DYw=k=`#8|lTz9?J(2C&N@69W}cm z&pG#}XHieQ*@V$(Cm(rOr;rc3g)5Z8zS9ajA&+PLUJ3K5%dU~|*J#+K5&j-b=$gn3 zzfmdh=h#9QKn(mY2aHPijpcJUkD*%{b^H#{bBEsndb;pk3Y6c#??8Di{0`K2h~I(o z-{N*05x{2!Q!md_(XJxOatZeZ!hk?U9ODm&1} zAv%$}SY23K@(LhHHMm3+j5uu`X7+*+=ckdYTQ$IO5W)d>jBY|%5J@3?TdW8%#ZU}6 z%-n|}Gyn-vTOUW<_v;9<8;Sv9+)xA%GYUrFbsQ^v5hwE6VRsODk)Q`Ss-agpN5JV) z2npmdLP!AQDj0DD#}KYV5zt)q5Z|DBcfknKfMP{Pt-8vJ-#|LH!LFBgQNY{~GYc_BRbi2* zO&oK#oXgt21vy9+D%Nkip94z+v!o-81dCn~;y=&q1X9j01zct92jYIlxH>qV4aDJ! z<_PE4FeS*I13j>(EqKlP{fcMDO9jsw|Ou zs1=t-6X41ecZj{?1UPfU*lln)PIrsFclZ^l>= zG>^%^_xLipLJ|C4`|4W_{4DWX*#gO)llS-Q>N@gw+_GM|OAjG0-pR?G0cK^C<`geG zh!VrG2}vc7g)+kZqWwNYAx(&%Wk9dXDW6cFw%j=muZuJt$E`Irk3oPa$|V7X&>kf7 zHO@&3`Mn}tf@i+MDdz5OeusGkj{S!@J<$Di&f;#dP%a1*$>`=xlhK}9JA^?^=mSoo zfKl^Bq`|*kQai=%g|O!>fY$`iWrBr+n;w_k@)K)h048{PgRJ|@Eh;O*&UoacW+>*a z;>(PNj9#woP;r_RN!i-cE@XOR!o+v23_i@up^(Izoa`9PuaPQ3)e$y^a)(jw;QJVH z6x)>I?QO@ScykuooP{-*gNo|t&@Ot6FRrwR%!-LBz4J1<%3Mbc!0;j5{b`CX+Mq7F1YFw#<|tE%ZoJ? zp__4jM_S_WliX41K_vgRs@re15Js`P(E&|36$;T?7%jZP2l&L3p%cpX%r}rcLDwdE z;V>qoID&#HGNDIunaZDXQlqe5w>b)Qn>Fwcsld}*D&{jK;C)KxIE()0I9MkN#-=s? zq!4(9ZQ}R1cR2B3KO6jKE1}dq#wY~dOJmdlgH5b2Lf}f{9-c?!Q$3p!d5}?SiEr5x zk=Ez1{>|K7C~?o@8!e$44_1R`qv6pE&&yvD93=wIe#{hL3q_pVrUKe*NQiA)ppCai zF;#90y9@%Mz2CNgTi`7=4Ad&fRf?dT*0?2B#2j1FL$=@zoLcQW%!fF{N{J(f9w_A4 zUytfkB(6ROs{xoJK&q8W5Bn@x7e#7VvGqV@zxC=C z5_*v;5m=<|`l-~#)ZL5zS%t!%g}eg$pNUFp$%rr_y4~ot8W78~RZ&kxqyYvL9HK6~ zMi#3l<`!i`%;X7Ku(d&$??B64Jc%C>WS?hHa|tNLi4EGSwJ#yy6B}`^*QNt(S2_i4 z`!y9Q6UT&bJ=?jM8DDpMJ851WZf}K3qD3n>tOQ#N4MLeixa<%QL^QKR;z?4Id6K-9dXk*Pdy+gw`X|gmw%q8G zR8x}0PzqY$;~MF4I;k3>wO5&Y~elU-gV zaYM!PwW{DgeqAY(nnuA`!i=Q{yZh^iuW;}BVCO*bq3J`(Wl{y>YMO~Cr z+_9U7j*I4`-LoQ!>5thJq7@}o%ifBDjr2?e!L~705bP<&stEQ<+=CLU%Brv>yl}|s z9zKYQmCtO6kf`4HktHw(fz12>Eq97Mu$d!$Y7T<&A;mtuOmA9+V~zirM=gHfTdN5# zRV>Y)?&nK$hC?jv&OanQY4OiKQ*kq&KKT)Xh*-Xv+}+(g$j|YyU1MIJvTxJG(~=^z zIN>qr)p)8#Sibf6|0SgH+s^Q{wUx9fwEEV(pvMq{7t>Uavk9#z&BrLDTotyUxvUBz z`G&S;K(qpHSL77WB|hKN4C~Lxd2dnCZ?5K-a*cjV_4yL@x$t&=M4LMp7t!T5jVp%Y zrWvkEgYh>}PYd_-bas;8Ej)o5=~7Y2z6Z_C4Rv@V(7yFf(0?hP#}gdxzRcW%1W&0= z8X}mYcj(-5YwI3#ehzK46fh@Dc6sjyBlv6XPH>yLZYf&T-lVq@BR59k(#_Ls$|LRqZTgg#sc7H=68avSk zIV2KQC`6y7i;>1+^eDJglqWD**CIF2v&nseJr$7o`s+}}DP~OUY3Qjwl;sAqNPFxQ zs0!BeK9(wu9$#OG64l3i$qHo-%aZ$C_#}EZT}$toD9zu2NUbBI)CU|D&foyqF@&D5OVL^73OYAyE*Xk_EuIA|~# z?2P19T0(AP2&NUWB1|d`tFiEMY8N zi%FkNR@AP!nQ36TiD>|ix+oY1Nc@R4Q@8;rt~_uDkYR{}_$srrQ#{zk`3}Noc6LjJ z1Mj3K)2}-L`B6N68}dDurGGiwza@0!y2zmhcEG}h1%Hyc;Z|Pp-?~x0HCgXhT5bEa z~QGT|QeB(7vEsHDzX5eMQV!lPU=qxKHb z!5qVi54FK=-{%`jn)!DNS)ouU!~bgw14k**PZw&JIoItF(UpI#b?GS{49FYvJ#IcY zfj;wT%O&f7Iw_Mz#U|v4T;Zn|-5?qvHT+{(WJI(vsg}vPrJ1BQCS#)6q)v!Q=r?54 z4ah;}MDLTPMQozmq?ISDzJ5SDBXVYGZ-e=N?pIFOcjcIL7o=oW-jbe64oGF6kiJ$S z#)ur-TEnUVB^GJA#yc{cYDaFhN=A8YNU9@p;%eul>X5UJX1X<;#gn;P8pP%fXr;IOzJiet8J0`7U_@miq$wJ@5)-;YP==$vfi~CTVyfPhyCV| z+&KE!Z7#{Jp_~1dMizN}-fta~yM=D|TQ*q|{hqW5ar*ktq~VfoUoVmNg8WFx9%<*v zJ69+DPLsSRl^W@|z}ZUE>fDo`$CV?i2Yek@23B`K3XRIh>P|?(u8c`{PKu3+h0Rd2 zA=Dm7X()>W;QJw7XR|@XY6?q_) z9rwr~U-Td6Jk+k8TEiVLwI4gRo_lVBDA$hN^R9MNCMV?l5<^x_OjzsGApA+YHEIcPJJ9oL zWp_~1>~d}4PLOYvx^=v>hHE-CkeeFHh3!t3+Okt~+=)fnPR(^M+ZxDc-o2b?E4x+W=@y>~GDQG0Oe9WpIwKac7?Yo==lc5PtI23ofJu(e+^$ld3f2MQ917_!oP;E;cNIBzJ{;i%MND+t&~@QdqP<5 zz`SeH(suU^`TT#se&fzyez;%1b4?n*bj^}hz ztNmPt_0p8+RTrlE){zbqVcRmsQ+;4PU>kA#$0mtt3kzSoP&fM!;-LNY) z%b(wC@AUe#VUp_|y>2&5_j+Hi=NmKkx~$h14b!^b)9Y^Is()S5VKHX*uXpvj)3_qn z2e0{F^S$Q#d-7eAd0TIk8y!OEI{sP1=D2ZV%}@1b4XyNYU&H@hm^e=Elp8eMZ8TuK z{7G*&8u!+m*~6?KYkGqH?7^Ma$r$Y?b0}odDD{85(R=yE0r_#?&j)}_-CDrQSa!2v zEpGMUxZZXbCH-7Qo;MDWF8Eg^o)HO*Z)lXQyQGiC*cJ@(XoPKg#vvmQ##RlCu4S@^ z#@3Fj)hq*yf>W*Q8em*?wKG_O_ZQdtTcdSLmQ%3E)$7C|Fb`-`c!`JNONJ?vyOotelj)w^qrlOenlXHVO^1@)OZctld)#?f$M8Uq7q7oA$cy z7bOf2+`Z=uZ>L9oeO|-Y@HKps9SkKPflI{kO2+v1m@oO<6y4 zVFzi!^?AdBZ@sObcQ8EH&-a_Q`*x{=9(G)SV|MR-#CPv5h}P*e9}r)s4Dgi`eaOd! zIKBRpJ3iGwpYw5~GSgwDv`cR9_2aT}U_m)Y<)+rRyE@p zESleK_1&Lff5&OP>%X1pC!N-*YxDBkQv>sZy&vGUCE!aM&rD4oAK=fzIOr9j421T=>qths@KqFrTsRL*Mznqg4K;p`}7+cd@3gOcdy7DB@*d z6Z`S5hxgj8yVxFE#DPz%V-PpJJf)D8S0nDMqK`T>Ue9-w>^CnWbQR&`;Zgs&_^1*} z=_qQf|L;^PiT1c^B^Cekg}xjP`|k&ps@>@*=1U4?`@>`FJuCt24t&3_)EAvA7rq-K z{Dv^!5%cROm1Z!W;koNWzLwK*+=smie7n}eL8SwDWA~*i$Cd7)WA?S5VBGAK$oqZL z8+Z1|&v`iPu+Enr!fFFF0h~suSNi2{)yk*y;dw)|G8lIi;QskAs^|1_*Kfb>-@>4>8fImyYTH)t~yG@tpI3Z;vxQ)UR>7~orO9?lStD^A_)(iTj65I<27mJ=rb}cj!+5vsdzI7`YTBNKn z9{iPI<%=)eK0S>}NHokN6#HrU@ycNf3xFlM`!&^>;R|;Xkt@Oz;;?u~#=%4NoIJdm~ zH-uq18>z^lLbyPAm{2)&K`v0<`ecUT&?RROV!N7DZc%QGeT?s6yEC{vd}~K2-xy+g z^@(x{cugkv&l%&YlJY?-mciEXduyQV;d=+{7OF|e|4Zpp4*nv#e>?_w z1v--E%^fM7Qa-YLe!373^u^H4$GJ_$9n^2MJe7KE6cWXD;31PkO%ea!6DH9M>8bO1 z3=`IWspUU5jH4UVz4jk7xeU_#6nesZ(d6HPTwu8>a*E;8=o9F~`YMb=3hf&SpC-p- z`Mh+HWop0k<{yf1ilL@hU)7M~RVzOvf1AoHKa7v% zpUAH$y{ufUmyn*wKZc*nmzrIvhKBFE@=zsiMf{)7!qzm~(eWg4f;q*oMDezI8XNr7HsDJ!=!KX)@ zw>ZLjD=6>J)(@*>v-t*>8|8i|(=S3j#Q6`+pUOYg`4g^d{t5m?@c8ofZ2S|)g^l@# zbSdjc1%8ZF<}(}B-yhEfePN`Qqbv45L0)VjKEU_Q?N5}BN8}UqqKG$s+~E36u1C0j zi?efWvK|fa$4r%{D&0JqK5s~V@dTaf)uZG{kS* zw+`90qvPP?>>s%P>SKQ24hHs11NSkHseC?0k1K^6ubaElZ$*0yhJTrTT4(YtvMh3Q|j-{dggFJPW#&VGlyVzu*s?QyrI(kQs6(2m#v@F=B1CA-znuM zOJ({uo%blfKYqUTCws@*+&B&Ve!s%Z0I_Ks(&KpbfR2+(p>Q16Udv-jVcf(`4XIsh zhqTcCcXlN^vL)GCIXM^x%3~9IwOXxKtJP|yH2H7Uc;{eac@6gdb$gr}>8fp5%D8z0f)?>H|S>+Q6Ds>xd$$6337MgAhRV^jMN1U_xsU-&hz zXB|QC2UJ-2L#I$4;S>CR!RKLPyo@eifmhw%LVvl?JMq1;|NG^}>L)=$|N5KT$3Z$9 z<9{vvw1tFqKv6%%j~Dz3JI~frE%6Q7co0zIpRYIm1U{{P0WJ13L_KW0cASSxsP+$= zmyG;&@Y7R@-LZg$9$CaoP3wDsuU)t3<1B>rC5I__U)2iM>rvm++F!1J%lZCUOWtu) zJB@x?fk$hX1tiEH@vP%31iAnX`C-=d8t9k(V%%?+=8X>V;I$y*&*=Ymf?EA*-N!ZN z-%0vd8<+L>YJXdf|28Poq2>8B%Y(MQk=CueoJF3I1+>avQtgNS`GH?M4`9q+mgGUM z$3ouP`hAWk#;<@Q@%<3{eZ=(uzkgXg|GLPl4~r@GJ2B<{fUwNB4@H*_m?|mx=lWZq zkZwWe)IU(|{tv}^@mu!Zd>%!aM?`xkHMtq>HMe6g_3;26=f-mg;(WqKHT@QRA^)`X zBOll0`JXC8dCAWSc(W23%T=J+KQ16`-B>_z-XbZ_XB6^G8vFBv=RW{nYP>=^_knoz z^Bf1O^CHIh5n-H(a&{wuhg%~!7RrL>|VYq@7H!7 zk0uuet^AACej<_Yxj#B>q=$5f^(qkQetE>`)9{B+Xm+s`8tq3XSd5p~0BQB>?4X(c zO0EPxRA|<7Liq|EBHiLW+5WbSZ}q#NQ$izsEfjohVthX-#|gk1-|g)|e9i~J>Ui@R zq}2NbkuU4{%ocL_*XAXxS3I|_cO&gDpym8QhoaxLu&QVCT7O9I@wvbQSl1_IynLyS zQ^Z&3ANmTtDy+3bT)kxDA5zAT9J+kM^K?e1(maLh1~&g`zZ31M4pR8VdMJ1#*w~&< z`nRG(lN0;?+S)_Hr@;--GtVz1xK_MGg~oHMgmc_xf2o__MdDw?@ig>@Usv|2{S$!X z{V{({#h^Fi(x9W>5^G`J}`3VfaXljI|y1wDU&{e8@z55MpaCjPg}X1mYv8s2k= z-{+jp@OuR+ajw(Kd;c+~zrz2*A5SXs9UkNJQ}%ug@5OhHzYZJ|@vNZWPoa;`b@=1T zz8a6u9xr*n92~v&_BYWx*5KFihNtkI_t&>|eI(XThe(%#w?6b!Nguy&8CL{)G*}(a zHumL|>BpD=jrO4fZ0TpSJ!*tne;epgpptLDX&c1XT2jn+S!^G#og?+R?mACvPy zY5A76`}qyy+wwkx(muZ^^n;YwS%s8yU*8kUW4S6FaXwY8r|ch!-6ZAl67px&@kBib z!0?Rch7g|;r}}DX7yluRbHY7j&yE;0=8r1(^ZCPX{R8l0kJg5#L_9Mz>ILaMTn&oy zv~zD%DCibf3C=bPzoq!|n_A}pl>B{*_^5U~Dfc!G{g!(khfj?6Kz@t!hWZ`r{Z55? zI<#@t&7URNwXWx+2ylGlTeXkQ2cbO{dZD2ofc$LEsWbSwkMYVe!XKC)TE;oo$^Wgc zcg_1{h{wOH>t+6ai19xb_bc}=6?!dk?F)aH)YjdU{f2cR?}rIOIv}~*N!U@&H z$iF`z_Zz8x3)sE=uSb6C`n_uTu697%-p=z$70UP3t=A8NKg<1*hII?gj&zd0m48o= zTUR;+{pl26HORyIUXWILP4_D^*mVE(+V@0ip?W@(kY824*ZMDYIDE1h{W&n}ztwXK zh;nHfKWclAUW5HF>B#c!a1V~km&Lvqjo#+kPoPVpQ-g$dsc{0$`TK7AY!R<*fL->7 z4Zl-lo8L#MS3tY_hzb2mi|b^@`}9cdCA3e&U&!|bX?d%ayv(q2Z-X(u5A?sO+y`ad zFQj>&P~LvMZ|pyjhsxpD=6*MG{e<{{KUl+lS?tqV*aOo2+oQ}bPNBKiLd*}3&MD)&ZEu!#OG=2-)HOYzgVmv59sBndiK?_+xqgWjjuoJ@D=_j z`FQ3ZEr-wiaZP`pm3aI;;@RtWOTEu*=zT?$heiK&Y!9LSQTN{;l=44m^ep@{jlFrX z8U1RWcUt!6@O{|LK3n9ekzm($chC!qa(45)B^(j?9c6a@6YlpD>Czz~&wxZ{-E&|B zx+FR@NFCp{_Rq?GaJ;az7v%hGJ4o7>Cf(28dOl-5CT6|_fM_|tH1Bp8c(CtkN6t7y^i}liN8Cce_rZ~ zy55oPon89{?4~~|{JZj%I-G+$@GZ`_b)`>(I=YnogmvMNXul2jR9oW-L;59}xH^wUYp~dbMueyHC_(Kc(e8Flf9#>|}LM0`a~?0YfN9 z!K=dB{hQY1Y3Khn@K^t zzive2r=dUB8CO;OHT$uvoXm1>)??*6LZiH!q1fW(_w4KRW@hA{L7Kfd^o`|7^-%S; zfL+D~y*#Zxgx35M#&_6}|ByZ&tM*YIHxxZl?X0TLc6#=ud7gMJ^Aa^UY_n}N$kJjtUZcKvN9+;(!$`4gVw zUvH6xPL`+9B!?pW**6!zgp<5K4KJfOe3>RUVVd8$P_Fm$&tdj;GF{BW-nR3n^LsE~ zgnP~#1Lwgj3d6J1Nu5uf-2GtnEJRwtVxGhEk`>2Ciutw^b7uJ88*YtN@e2Qj`ccN9>w8{V(toPpzPh`j?13w_zSij)ByiXlEAs^sa5cyf{eQX{4eXr;cf1EUVoazAc42v)|PPd{>>u0 za)Um0JSeF1M(Et%J9&Q|#Cr_Md2zFpGfto@mPU0P=K^OCIWiNY=8vE^`W&kTDYS=RVg((*! zPuBNh=)pJv@QD)^ss`V-w&Vh0@(9oJb6Hky+7IK!HE$E(RKB7X!$4(hD}^RWd>PFa z91qn_gVtjMqKDQ7^#_YB(r{Ng#5gsvcUZNO&fs?;* z%r4G8aI^8i6U!gVUygaT=Lkm^+RLv99A<2gzc@dlNBNR_U@g;(E z7Urnz+SkbqQp`{;()$n$T09L?H;3wkO3AZgrOXfoaaJXwj6BfUJ*USBzeuLwA4mw? zR}gxtHSIpk^4~^T1mnilOhck|qM~6i`E`~ii+JkC(_xar;|z%FCS9rID2ekhW{!bk zS9x*q)vE0U;cg;8#YLlm%xW6}@3cBC>nMMr%FpjluA=!A8O;i7DkQD`)zHBtkAumT z7$CKwqvs>9j+ChMi!o93@d@}e$hIU2Rigb1R3DIb zJ04C2^CUH+T|)nxv2tMVSvX1303}Joe{~g1lVt^!X|y<*SKz&dePGiq=mJkIYKHVp+T;$louCf} zc(RxWc{xyr$*tF}BtA(+N&(&k(`gjXXvi1LWVN8`r7cz%t+n*P#kmO6o&%ma&i2VA zsQWUSvN6B<_?a^>sNa5xYrunvn&Y)GJ?z5tRT#~#(0y5bCbG?u34C+JX1$NGLSUe+ zWoDGs*qh9wn|7@`lhpMk*DFxhmqC8zp(S6WzlYNy(@pQZRpHE&hWM-5heH^8MjPrl zMvLd5I|R+)++x$<-+0>@dghX=@zKTTp>xxr=))uG(}$+0fREN|1pSQtmFX6cX*mP$ zvkAYZ8!7Wl_rR~+uz#X+nO>W-qF-gNtlx^2%Eu8-K;Q|Uq(PkV>EHEWiKZphN{Q)i zA>xKkk_>S_ORht=z16Chta4S5dxfM~Tx8xKeslb6eEjpPlOLXs`!BwEF>W>#Zv4;x`{$&tosnh552{pb0}7d?LAA+ zx6N`e^Jk;25+9e*eD0d5E4`>&&JF8Y?_yNU-hr!*1=Zb`A`7bQYij?gUhTPTOe8vq zwU7iOz?j{ZG_YAF`tbt~b-pI>Aq1h0n;|nRoN2J^ z%#uYq3H#S!ew9qYu!u*{C*|_FL8bOJL-RPi343n5Y<=HlWl3C95>}H9Mn7&5!1Pu0N9dIyrB4UG3$LtOOxFLP%LZ2fIRi9{}uCpWCXopuc4 zFsaAC3R@Fk@1e*clAQcalLj+6q!4J^;9q}eb{?2wSau$i#v!Tecbz>dg{d2sK*MrK z>qlfNXepz+wr8j2P8Wts<$ zxzgbDbC493d$`I7wYpYY!ap)DUb~CoRStvOECqWH9d+Kv{qH;gg-fe@bIlG_UdFw? zxd|o_Y-#IfD~yS7@&BA~#Kx?XYA0oaZoQHQ>*3a`fGT0Luf-LtHkX_49M_+)c(~RT zix=}bwnQJGtgqh$rN&@tt$IEImDV&B#reDi-Y!qW*|wnu)>cbw*GQ~VX8X~aG3Fw8 z7WOL&yxNV0{;`eY>X%Y`O#0M1HfNStRU6p@Uc&39Jz$pU@qVKZk%NBd=W~3wt9=)+ zcaOF2GWPC0?Yo4%d!l_8!Mme|W=vQ!qHX7~_VpZIPa2xBVDEM{;S*ANfEXCsnlTET z=I*JtiWj5fMVtpQP#TU1WWQXK(&;-mo7 z97m)ztd%{BB`Y`tN9{14gQa;60nxeZVI-1g?he_0V)^-LdrILM4sN8aif(CYvchwy zO`p!SPgCvFSo?ISeHxUm945_V4I6+NlXdN3267LiM_XH!@4D_tYL%U3Qgn@=z1Ei;}))m#XFMX!w}`^3HlLm3Z1S*u@p+aNlsxa!lQcI zc5C1FOw>QIp^o%-u!80)A}lI+7SA-@u&at6$fG3xq2no{=iJJg?z`~f*C?+?F8p+c zmLaT%h}aX3SbHQwF#@X|LHYUB7yipJzNtrARwqE}M`!*&FZ2I-ng7qr{AbV0u-JVB zhbZ3j_#p~__0u%?a^NZFFsf_ljG+a}>5C`8gLD8Q;yNSGTiB6){Xm9aKak;zHay5g zCo9W9J~XlJfr$rULs{V9-Je|OB5&Wt_}M*#z3x+7)!bhsd7fN*uG8?s+kf-jNXTu$ zNu6!&obUfQedotM{C~@P%Tb=xN*!S-_vY5Sf9u`_17CZ&YzUA$2|Cqf4P3Uj!dq38RoH8Qt+MPt{WFFp!bI1mRbJHTj>^-nKN|mD0lxa{S*P@~?P?o)&C0l6haJ(Tr z|J_Y77K6>=R4q(0ft05`sQB0XbX5esk&eoSuR;DH0ZjE4!9}R3NOpxWIK}Jj1Qr z2xYIR?btHMK z2284$m^;7`2r$LavVV~!^Fwfq5T=d*3S}k;s3V=ZNT)ESIX2Q96*M6(I@;QL z+FTS}qY)_ZDUO$I?oOh;VD=z5BUrfYJ;U(%XP^3(H6l%Up2kn0}hHhdA^Kd*fD4bXi{8gQYJxO zN3pynN6{zX_VE>^ngPfQ1{awNduRjC*{VH&dkfkM+{p#*cI7rH1RjH6L$S@KywWAB zd8$vutoea^iHZlC;}Z|ev8N3}e?eB$5Dn2a28rBL;Jf_@DZj#^$5)o6yRmzYO6hWk zf$JHh10W`URG__o?&-qvqvEn7Rng#8v7A!J%%2a6;={9=#H84pjzL*%Amvs)3jCbe z-2+&ZGyDHtlwY03QLfP{U)39|NcZ%~xvVmpiH0kToWN9T#{2qa+-mZ;L(k9#d6d|@sUOp4iL2JQ-7OL!vBAKu5!FP z(6W5TSjN|uJn!x{Fuh(6YWvXP^)#nH@_Zp~*wj)sq5OJ+{4fY^gpyf2ho1cf?p7&1^}&lma&|GBb1QM`tbPpNc>Ssm;8{yx<8w~{c< zSyj@pdqqfMPxC5IFj`o=QW|-K{NvV!S`Y(~4HS9Iuz{v<+OXwK)R96Xd8oRDy8E8+ zMZLBU+$V@Av1)fZhi|E7CWNPeQ>1`3XG4-Te-Gk2hd_|jWAhL2Zk8&15WAPfc zgk`BUo;uO6!_<#8t6EG$S7#Z_Cs(Hn*B!zThuD-S)=3^Syn%RLPIjW9iXZ~8&u)~x z2wu3ES4_+q&R?pnQpIy3iAP+Qr_?9kc!oaE0Olk3zo4kRD<=ybN;%_jB1Q~7sdLz0 zpDrd+=BQ|s*tt;C29-5)2$~$DBa`C?akNm$`B1Zkh8XB&xuDmJ>t_W;#Sw-Zaa1hL z3K3dgAdQ%Jwue5IR1B%9d;NP-T8ko9l?-?1-evK>9rj^csU4yzwaUDH4MVG3*LvkD zdPMDwT+Zzc*uy(@>!ohlZO5-K^T?YV-6>(H}x`Ym%!rtf3KXMP@w2CpxyWq}kI1 zckA7&N`un5ve|$o6Yx(&th9|*Mu?PLjVK~jXg+v{(PAMep%hKq78CuQMs{87yi26f zsBDc#W=>qNoG5qLyA-*Fb=xt4nHIHM5#$^e_B&V_KHb5m04L~)=7LPBg0e;T#!OFe z``0v#)QQH&T{%?EQZO=k)d+hqyd6!7T&h{Khwr97&_AHug z&(X^E90}XA=wy5J3o2f13e`Y3kY&RHKebRT#v$?lxS}we65#H7#vJviAvE>7^C>mm zTpz&_8|6Lelv=KNmTI2GnrB1Rp$u3)p_;pQ|Kk+X^h74!zQ+>rw$#Ku4XQ|{6eFHh zgs2rnPEvZPDV(shkzu)$71X*Y!D#PrYfFx1NA*Hgg20J3f3kBjhMt+Xb?3aH(4wuTg}xB8O>-1gQhjqIcfk<|U+oqcLj28^<1*EK^Ig6* zj}I{b(Yv|rp)`B4VLZYPLa{=m9OMfBY~eErE8c(X^bLhe}o_u2YZU&yHEoHA?heEta@;%h(xN)g=bGdQK3&Emkep^!kL89yMxB^ zBK5tQPVX&do`Bwa+I&Y*5hx#gd91_Qt6?Ea;Dd;Or;Eird@XbOQ0ta|@c5d1MC@Jp z0D?OWXZM&idXN91=pa*G99Z4^u%K zn!@j83>-R+?ZfSUG|(+dPy$905Fh5j=3GaDQ=ptD;`sQcsX%4RK(6kg`KLE9_V|ze zj#urVB=`?;_#GVbOqOgT`dKnrT!Yg$!sqG#Cm8=f!TA3P#{W++;t59DFaG`ii(mih zU;G;KU)fU6o_-)5K3%wQa`k;ra{yI5iIgAlniM5>YbEC#?*sMh>SBXuSIbqRD^GGX zZLZxI!Li6cC`LFPyO}exhMyG^zpZr{rXjE~o`=`Pr3MYC*(6Qo^Ke>VW^Bf6z?~#F zckEtx#EKh`B6e>L-u~T+Hcw`=$^kf=Uq7q=f*2z*Y((KVf<8}zDI!Y8Yo!=Ho9zF|i@++1U&_HQgXr<^Be9S#G{jXfX z^)X9O;8LAs3KG6&ig(s4Kvh=O_Ndpod$xG5`tv#OSQd`#aOIZizDgWO8a+aLpwLtD zVcLFR?63B&yt#E6i2t8YVU8KwG|g+dr;p1mDRg*HUej_+DU6$_t%uYuwnMqzcV|~? zMYax0P7BNcnRzd%tz)&4R=ca!Pav#svx-e%j!7=)y8;=RSqgSOOg9zSo(z09ielmg zqbTv}lja1bl1DR{m67edey7dOC|QH8yYqn?F?Tw1tAq{UMC%PL!!P~$s#>&PZOK1Tn9Ut%}5Q4BWF&5V((E2aI&S0ytL~Uit$tD#hfL( zTc&e%fKZ1B0gyc4qPIp;K9YcLMDw7_ghtMb<6evhX;g=xSN?_C6fMMV?T5T|xSJ3) z!)12ESY2^7$7{B(0ikbTO_6D|_56xleN%L1QMYVtc8m@>wr$(ClP|Vy+qRvKZFX$i zwv(GP{&Vjc=RWM0{kZ0uqiRi58PF*(p2^Bd>|V%~yWB*ojy?X})%W1PG%Hh8ddCy* zn*pXN%%NkgaieRE#hg^U&bmD@fJ5CREhxyY(P1fE0Zrm%@y-BI3TZS4ealXSZxtEW~>q5aNvkm7(NGQ22Y_{oQ3I{Ja*9_znP=y6 zKT>##6#I=TyEyGGQu?v8F?uc}&wS$py_@cQ3~C8ts(3O$YaYg^N3>9g(;pjmb4iuQ z{qh^ew#8Ui#SNI#+QZi7E-VLU!xAwe)uI1sa{-vB4&A~H)nSOJF#&rP{w$gbfy}}P z*BcUV4o{b9(Uw)>`l{D;<)lbHmu`Y}`N>!+SnI7;>8*ikQ7;mKc@u(D+~8;Y9pK=( z%vmGebl$LTdDcq!?&1)z+?sc*c_uhY6yq);g0N{x{J8b~WCn}kTzOk3ZJQ1`@^W*9 zskC&PE;L7HWvLv#M_qo-*rB~h4TI5}d71g<^7@wLy5$n0d%~?_W2Pp)#u~-SjYbza zFOIT&f0!WX_++;%# z>C&HH*!EaWw@tD_A2GJ+egL%P7<|DajfumWHunZOY|`}%p#fV68gD~Wc&Vht z{a{?8#U1JG#H%awNZGaZ!7t2HjgwX|@8w@IQtUieXwt-C9|QV&OWdqtX=`*!=p`%-Bq#%Ha@Uo+|D z5@8PLZ-EM`+9A(beci~AS;OjRvDQh*c8mcP%5Z|FczDV^$v;QTICWB4s89nO&l0i` zc$QQiQ&z=JDW2@_9j9D)0Q^WhB|gt@>Y>Q}$aSunJ#_Vw5n5fP5;aaT$kV^q@#B@` z&moT78y&P;z~Dj_j}HrMS`xY)LMuWwn}j!sfsq@J*wHVEXmI)Q-=^{G>W)4FX4n^Z z7BStTO{5EZ)fy1*>ROqvT77F|v-95j-8xgrHW-guFjPYadI1WpKmC8oL7iRDe{Ur_ zp<4G#)`z%~Bl-+@c>UmOrw^I)_}%PZZWi073K(b?Oj|y>c!c#7fxc4fpE^=y?u?YHJ0d30EKzu zGRPYrZcVpFK)Sfkm$(0ubUfjrD$mGj$A0jnW_l(Hn)(?fcUf6gWl8>oNR5kwXiygX=0DNZqD%LJFt4%GF?Kc6hL+_gxz@{3GLI*K3X=Ql{(rp=o)$2bZ#kWbc% zN$ZrcM;HLORsV@xB$u)F^DdK%%5wy~5iW1`8s{}KqPNeG>>=-|pMz%utY=t$5>Z_L z_8>AD9by7qx1?$QCU6O2;*KUC@1Zb?!np_Uq=+LbRYkSkd02PYwYJkz7e9 zw|w;$>+-&?-4CFLZ`f~6smoNg%Vj;&`RxXUkHeb6b zu!3^zE`RRLrc7j2o6MUijt)M`_B^z>m>6{3DMcsd;wffCHiSEAC#WLeM)YTrLglG-i*8;rT!><5)QGZ7YKwA&C~v40 z9Pcn9Q|j?A0l+6>zVWqKxUMXG$g1pdHI6F$emMHozz(0KM_`u(>v~Y4ht)L^@6|vw zKkm}DE~x$xWEByAPLzOGg(3LyCdpFt;~o6v>rL>fIbg81WL~mL>_}_cvRgWD4}VcT z?87lMRQ5#u{$}MQa;UtUeBM(x0IG9F4k5EpCn{_fGN-I*EhCS^P#@}EpsXveP&o{J zCeif0`Nf(`XK7sqBxmdIKM~bF-pSfGna?+eS^S8FhP5$MqX$u!CSy_KMkEVv;Hc6H zqeKTn)tClkfWFl2k3ZZNtl~>T=!Q&+y}Rz%jn!mHrsJjf(X!LrAy_Z?G%xShE>IHb zLojZ(EZ^~RiEIq79B=xSMz#hO+qp+GZXw#$hIN4;OMW8e2D|OTANF2Z`()01X73S< z^0{)L?Ab7r6V&6Iy6;M4`W%p|hoB3RTt%MfQ*%){a3 z^-Hj{;kGW%O1V~}K?M9;>fZ0@o$pb?j{07&vLR1Qprx=hyvUxYT4YFGqt*KM! z+12`zr&F)AfZiJ(rS>*YI4KY}R=&sQQ|4{xKHv^pH{#0sF}Ozl*Ww!Tsc;!?kQa-F zIudG}mCkg9kt0pi9yCjlZ2R}Qlo!T4w0e=(0UZ5Y6e&*Jy23Xt2abl^G)iS#JZ=8t zKlAHw6>}YJQCQYcmeY#^s1~G1Tr-6J=OJ&L&}MF;=Qfv^M{w(hsHMB;d5aZCYzjt$ z4Gf^)N~iKWN4*G&=;@*Po30vxvY<^yCtPAgh7Q{eWDB?(j_|8F3i|M7Nw0oE*1sD5 z(nbd^{<$R~eR>Rn@Yh?mBpR+J%zCTAs`wK%`=FcRxjEa=|CB=5_jz{Hkrw{2ocouu z<6lZNjAtSZI&}+aH&q4Py1xW)lRr%rMQS5;(0T{gP22lWMjh=Hy^dbOM1gi)Lh0Om zRke#~&p`x|rFk&}-Gv8DQ+IElR23)PLc8U0AJkfHa9U`)HUo=iKn!vqLFw`M9^X<* zDyK`#B)yX!lk0gtKlz`*Jn_b&2t7Lsb0}F8#yIA9KFgQzP%z(Wi?rYOnan+=r0{}d zI3CAPZ1R02vnB~Ydqruwje(Tmh4n`E+|#fRPm5LdJaX*8Ohq$Ugc)=inl)nvS(BqL#Jd8}ylg@%!*K7fnz<5|u{sg5*7NL{%P!6w*r<;Z^4=tL#i z;`WdORz&F<1WBGVBVQis#TLhI{XBKaEVZ1eVaD%A(&YR0m2O8Lx|p@zc6{)``F96s@Eh%da+Ac$8WiSA{j*`6@W z%`1r~QAFCSiQC@e0|uoGs(l*&B!L@b`dF)rdwxn}Qt6OTM%R1-6z{#53H&IUg#9%X zsY-{3iMDmD+T{vH-L2(l2y#>{*5aYxF98S_rr)AX5ezJ~T*>&w8F_qBHv_$xwc!YXF%{eOL)D+1NifcxoPG6!;7OyHh z*UKEMJj4kyb0YR)Hmk~xSW%!df@k0`O5$1{9@<$)6EIoWhM1hys6s(DsQHx`qGM9{ z`1pDFTr;8KjAMOOeZ^6~=C?zP_fYSwoS}Khn96M7G_F;VFgW=%N2Lk#KgZa#UPj}Z zK$?;^&omBk9982nNrUeqR{xlPDL_3Znwn?&bM{k*U493$eY^H%x}rWDg(2D1_cp+0 zXuAj`PBbqnB47OlPHIy}M6h+*58cCVVaQ^#209;D{`VjlD8dQ~!?gd7e-(VHnsJ}H z>YM_*uw|)=e-BB2momgX)Byc3k(4eEN527e?1G5xU`+~7Zq(Cj$#EWUmhtZz{8>cy zlq_v#Ze&wy<8f{0BOyY>Q1nmVjtAjT%pK@K@TVjc$6gH~GE9VW)obGFYN{SyZq^t5 z`&lABFRw&5@7o?qo`rbWvlM2Q)Pn^9%#;3}XTcy|WR41xI(8;<{L6>~3S?Q7Q@wg< z5b@m`4~m(zv!v(=792sRx-bSAFvSK?Qz6sfbYdi_Xr2YDu=2l{X5UXj-Y0Yu%tV{v zj9vsCxeP))^N$&6JQwOzH5Pq#Y>1*DgF1Y~Su?PbZ+|hre+04DH|O|%TsdNvdTIN~ zhq-tTVTM=Vj1t0=2lp$0E4)zyi{B!mRMWIu)XffNHEHmYiQ=am0(ChXbdSgZ%_jmm@jIvn}7pCcWVHu$+oKFmhs2Yy;<(k<0kaGc`)zHZUc41 zT^|?3X2AAAKfUeigFXM#p_{iEBn0nKAElbg249MHE9|a8hJO!78En8Nv2bB82|l1;}eLwSqau%FDYx2{Atd$JKLZ#h9 zkjNJCWAeBIW*)4kn_pP^GskP=kBw((zC7y)`GR_PoiK>I-tY~QcV86myvo`}YQJrP zKpqsa@Koq25~||t6OP~ZRE=_@<}fW>ri(<>Rrv@YuY}mPjG85BLTbCC>mIYH1XeFM zY!6tKr%P0LD#;b?#`+|Hd#tlN*^$`(Te292f4G7Qf6x7hPp& z5`WEMD)M7_-B2a?>DL@O=BkezBd{QZgh%w9)7)UjLqUv6mCZrKwQk`s0S|)7h@{pl zfC_&59j|c?&f0>B;OTJAz{-Y2|B`->k#7{hsOpVgpB6h}`C`D5S+PeK7RA(oXvdqIVLZpybm8TD6&!XS;4 zS?)?ZvAMd16=J6)>v>*91&hvPJC?)9eGYd0Zrzd_gm%MR``S7_Lr#vz2BxBCMGH-^ zKCO*~y;`|z9X3Ys1a2D#hSZ@y3kYI*&TZ%&ps-o(vIT_(jeK7=CoPm6wXXCK1^F&G z_PpojN-B;YG2|K6n21!Hg0EY#$|88{QYQi%j`x5FVF|i;mfr1~_9U*Ddw3u@=sHK4 zPtUjIapJPU+r_N7IHU6^X(~5r{WJ$>u4#MQ(xQGi>lpsXAJNUP-cLozZ@S*a2$;~$ zZ!b1@nQqMoR8E+O>Po{Ms5+(<(@(g;!^&>_q9Ua6>9zZy)qHPETzs z`B(9{4z_M#1x+fO&d?MW<ZcQiJ1~f=6{O6pYdzty184aR=_4{H3ty&Omrr$v81+FC=dtsOj3Hti z4}?)YjUkxh9oVk@=y1Zb76>d1+#Ow$Vl#(|0azi~f`+w#=B$F%tp$*cEtUOs50Z&% zU`YMmflM$z(f{IPTzw;>c3&~P{5|rH9eO)4on{o$o26S&c-pBfGv1Xha zFgo-3hB{cbtoV4p9NvcR{~A$0Rm^2t#yy~-$p92ua>>>EA$|jI1CKZn2+mFrz$8pKB!th`vx5RG1XPj@q z*AcAu67TQ!K+eMqslZL02X}4Mcvc!8$mIt8Sq^19VH)RK^`q&#^wJ^J3*$r81j_D2 z8fzfb581RB2ZFS313@;;rq>J4$#YZJknM~w9o0|Q#AT*s=FfQjFuEMiqNd9|y=CLu zoK4e|AU|Gfp0aYKlR?il(>a~+^zFNm+DBLoF>Ro$BjU*VsPq8!EWZ$p`f z5fz?#F=Fhqag=C{5&UUU2IrLpxlh@J7K=1u8-smql2StGJR&zXGFG4DbAI1IfUFNu7ONd{yxb z(vGqZ08{cWY{g1vV#;OgiXQ=L;I7=8GhDoDpv-4RV7E3jZOJ8t(fRA ze_l|pyKW>}E>-kRwH>4lgix0&KMVw#86 z@{K+WCW~TvvTqbQy{Fl;RS`FxW10H=iXUZS>PH@r87u7iwvGeS=Q+EaL)=S<2VG_p ze}td)a|=sV!nlmcmLcpfk&Y*5YXEI#P!Avv&Ppq4F@wgv0`u>we+st@WoWSZf-v|$ z@%%NS>U(ul`q_kj7)x+6Jx+h-lfo#la&qyuX0XF5WV66H6!7fED+xuJ56i^L7R_Z= z9FN0sE(ALnw81|dvfUSVD!bhpD)}=cfXrLqFU7H0`u&~5(3k#W~vx@pQlMa{KtMoHKx;A$@|2H`<~6`TK%AgJKyW{QEgb1=Y@N)FOlU0} zgBAO1*6HE8j;Y)#4*%FSIL-o}(p!PHSFf~hv4kfFQz}xhA{A+|)qu17QYxr4U4GbB9Ie-Dy} z^-Hh-fX0FWD=UvXftZHl^dfwMvg{0TDp>)EGO+Uqe;?Vrf2AYX{`W`Z7NAtzqn|)T zE>QvLe<|%zryD9n+t#E72MRsge|VhX>JRHs8%8Tmvqs{jS-YGbl^ez^tQV$X@w;YT z0AB0i0kRm6O;?X8{4ew)>E;d8SOGfPK!oQ58C^w9SJV#Zd#GJHjR|lpDCwJugCV;9 zwLlUO<;%szr0ep;!~0I#B?3`&0bz5kIbYBvgK1=Db1$iat%)~uj{3LS$lDoxC$g+Q zLhUfVCNrswN2Uf{C*4)mGiJ~BSEp%)hE$6BZslU#d;*g8Qyl_FWhQ;;{kT@v+olW< z1Jl&YpMndE0#yV#T3DF6$W}8AeP~7e7ce++qG~$YB$}jzWiIxV=hKb*0vAF>-Vv{$ zf^vlUB@>*O>bxz|7+s+M9oIBp{iPKsARxNmKtS;SiL0%hlew*p<4<5GHN0cz=rO;) zc}1d!;dzdw3=O$wcd{gv5fG&Y> zmrFSC_i>B=2276;W<($iyh_d~m*Ins!E!H7??>z@&uQmbvLW_Mj44WRz(yybzuEi6 zQLDb8XyhZm(n6!~qsxSQMa|dF2c%M;2kz9Njg^Oi#oLl=@Xjj+CAxqKPANo~a0(Hc zYvfCfGj=Oe3vrTlCK;>Cbs13NnYuB^0qmaDDEcN;s5_k#>rY5zs&xFzEW(HDnq+ zJiHJ$dljI<_BYU;AG4E;B$6o?wT>>O$w7V=JsU4vM!(T<*)wwbaC*%B9?VW86NND2 zFd@!~f3VE1eXnwb8{guU^XR>MFljM!j;T*7QvXaK^x5KYU%KRB!X^3Zg7>$Sn?@x2 zyzv;0`>JnhZ{B}*?4K+r$_xwrhBIqNpu+JfJqMNsa!MkTImcTPLxMF!!}jH40_mrc z?!O_@Hi3`DJb_ILrtubeSJ_;r*vy5UJu~C55knj)?u%{-(Sa$W$`DyBI`OD^tW`lg z*S+H>X1kQ3Jg|U$Gy{|D=KF&&a^5TWL|376YN`~3u%slJWh>0i>!CscM%;dXjmKYx zhNIDkT3zNV-pT57Sn0K^>|QyoO@~pE2}*?L=eD`7p<@$Q{94XFMIfUjK*R)5idgrr zX?#c9LO9ByCsZ2gy)1pAh=dd~+@Pj7Jmf`4jx8}rB8b}5q8TLw)Z@^ZOUPGte-P`zLV6Bm$Q%9Sy@@=_W>;3VR?LNyO|GP{ZJTdYjYtpr6}^ zF_~-_UJ6I*zlbkZ^Pms7yfq1AFc;1U6hw=;M(Pk?^~xTJG4zEX{7asS5=;!6$?$6T zaA9W$9DhNCumj4K>e4Oty16!fL#*3By>a(0*J=fJqUO~?vDE3}Q&%5PB3=;#RFOHo zVw&Q{$vVZ#Y1TwY8ch-(+E_L7-x}j}w&evzm`feduxYf4FUNanoXX)#y{Kk7^QO*D zljeq^;t4W5&|8rXC>Bt$t`t|J8dYI=gj-k};d=!GXZ<5%-sS-zBAC(uLMIJ)&15!Z1Pu|9hw30kMtK9! zr(l6bVt1I}ui-2x|I*$I38ljpI>LBy zSppki)fwXA`7-Xj;+FX>^BB%HeqE}0RiXUEx2OeE#<6+p=eY==PLF4t@%=SKCITbH zLGa^?AOryU@<3~OthVxsQKPTTRuduwqOO`>Nes(Z$SL5nthOvJah=k82J#Z?;5l@3{!(TBk~;2I3kBmAGI%;Hum?JA6qlFdA7zZuqod1D*3b%qt9{> zlU>YhM61>3YGe)uDLhJg_a0$Zyn^eJOZzGqhJROoSEfJ;Eo<@5P0{s`BV?U8R8Oj6erZ)fSNj zvm=|?7o{N9!}*KhO6#VRZ)@18v$HRIh+wB9|BcNTyBlo9l7_4N_1AfU-zG#OB@vUi z#1iYDSk88|yUluMBv+|Wk3Gab3Rn%zW5s5WMJP~5k}M!1=;@(CNvWC>SPi4;Xc=JH z;yP70)#{y5eHq?yR>~}mcVF^lYI)G~z6rvv|Q;r4S!>ShIS)5rM%KpmGHvYbEX}(j#!)S6=Uux>ofrm6? z5{)F*i(Pd#B9>!sW{_6oF=0C>Tca~?_EW`nrg^71x*7WT)6-q2d#K~hL#bn; za5q!!fO6{MBUqWPw=>Sq)4tux-9?FQ+=3w$RL0ccR+BWc<}3 z7hPitzCf2h#}n}t?#gnfQ>IRbBkerLCv;~hhsHwNX1+1beC3yGi*=OK(*V)D=3eks z5Gj^X0${mec{ToPZJ?663g{AfKlY6KDCNiITZrg}n!-j~M7X#2DS)T6d6XKZG?t|_ z03+6r%ajr{#y7mhHA&?rDy3Eb4X@5;(X67$-5N@t#*I)#oaMaT+tL5*nq${gk)dok z{*0uEYS)g0^0+O-YDz2r>|u9Z?tfDtG2jBHjvs29|3ht&|3iW7OdPDu9UcFh1|=)W z*y0c(b-k-J8xD-;Q@!v3Ydce6dJ zZ#}Q#6Q5XMc)>fm0K|D=`o!0>oBjR*65iKAa3vuTn?D_v;EGciy+UXDBI6XHNY`V~ zdU73BM?uC^q>sp0q_&pF90$g^M!gZ=xg#k6U6XvA0mskYnm}-)DiiYO?}5+iK~=B1 zsRVN{kWAoYM7V_VV3mD$qJCJc#HUyN0W z8iYfpN*HOoV`D`7|#9HlVsGj zk#%u>Vz!kPk?}_tJF`xtq@^ik&PM$N{oj#ZEObJS{vo?G)IdP6{~c*tJ7>H9qPm*j zKU5d>JG-aAVvirVhnRHO7TTdqI4E+&Jc^;n3cR9lsG6(ud%hUoUkDt>nt}n3U{w#fsF*F;?%)qTb@tY)kfu_8L}fd zclF3T&WRa3AsGxbj0nHZE_ZcbV48X62U3s(-X#YzUH!W?-c6W$DM8*AAaKw{d=OG{ zsTS=oy-9_e_72cc50|9jH2w_IOFTa!=<-jI5}LXIiAM}uiysIUdOMM%B&xw3rETT8 z6o`K}SZX|EHQ^q7mOIKN|E;=gQN*kaq2(40u>fZ}x3t7OH=1kz{_oi9&86LgeVENQ zEk8G=v+UczGIVi#F!LJf@VxN>3^E__uYV~KCmc|%dI1uWm|BW6B)joIM7*uO-`&J4 z9@{hdGbIMO3Ig?VLU9_lDdaGyNFu;OQB?|@(-FgQ?-;@f zHkAe|$AdZHyxyBD!NNmX-M>gr+w?kOB;Z$Le%?%s&aYKn-#C}Tep27iAMpL-}fn!+wFa8A-;sB_G+*qO8h>p0W z&e$Y(uiuFL?5FOUX~x)6;{cpkt4yLo<_{@UK%m}v?qQybKO{lQ&i*r)XX@`Gcy=(3 zIFEXP-fvx=Vsmmk4h65Ca^^7eyXwl}9)25LB-4x6)%^+J5xiRu41%(7Ko)po7AXvk zi=Lum5CJKST9A8rBVrtT$wKK~LyZ|ZRq?}E#VFJa7;HE1VI^SkP#P$qE(cD3`uuI- z^9h1!n#|urcY^wNq}lC|f^kCjsL|s6=M5At!$6$hU)CH2({PDZEA^q71L{IeFWXw8 z{Qw(OFnz`e(EgN^D=-6T9z$V;H!#(w=xK_ysxz}=v(m0ziR+?tG2s18AG0{FF9-Uw z?#pax-A70snWX&`rw^%2#^qSxzXQb@PAU+1uT(5 z|0y|LZyj?(UhDzr0%&?Nkfcz;s=_>Y<6G$H-gP$_9J55ZP*Zu$J(;y%UldE;%cnPO zlG{&>l@RxxHpRMlbRFbk8MxM(?fMt{ErBhWMH zh0{w=siY4ZYG~tk=|>2~sz3JquK%?Q@9R=PTd!7-TfXjsZEf&vd2wZ6_T4qxUt8ssIs2;hJHJ#X(I1>+gdiGdc(a^q-WZCHJK$Ylaqrp0~+YV+>=&k@S$8@K)+``<$N9 zq`Ik8>qQ<4o4fv_)J1yM!rFJ5l6#|r>>BtCC6c?^4*qoQ^Iq}LoUMQxSBuMfADF+t zy+z0pXwH&vju2M)V!|au=3<0JiH%?k;kZN$?MfWzYAJ{+UjXl|@h3r_by)k=s%;hR zc`Z9Xq~?DNrjaqEnEuS#s=Cv6x9Yv{+aJZmd=}rAb0axQ4hWv;&I^~avLE)BB$q0T z-LuT`rzJZ#2W~}2Zy)ZIuath&kqLq3^)p(MWknq67S&l|MZuII2O*r?C()mn4?FM9 z!3HqfzCLDCN8eCBOYrHae2^`vjI1c~_Q?>b`fj0Bw|sOmvUxO)0PDeShHg{z5km-9 z^PRV%A+0D_S9=-lGtj4j)QBv-PPcV@7-)pcSr&w}huFeF4w(a|pVAnVvQVX82iVHM zt}-^9*Ap1WiOro7zM<~Bta&Beb&|sf^j6e1JWw-FQuop2A@L&wZ;i5dSgPGp3QL%& zh}qB@<$Ef)8@-7pzXnc$m49=Rx?f*$bIDwaDp0;){N*8eX`UR05}_Hhj@Rr`Z-YePF&5wj@KFb@J$M z(CbxLJNy_lD-EiXCJ2Y@>;!#@#TfhyoduZZ&D=osKM&(ljF}c{B~H#G$uxp1DGo1~ z>7oY^rc#Osi0@RWj&NPoU8nB?pq`cIEsL+~d6ITEPhSr)-Kw7!;-=coj*~l!^E57OI~Kg^Lv0|ID?$%?T4+$Dr@n{2r2?Z$nC7(65iuo z6Vf1Rjiip(-~Gg{q3T%C(nE#JA2FCLmvCyev1NKiLyEiJG?t`-zPu*77s-jZsh;myKstbS zLk^h?^XAePc&}t(Baly7ynG{o`5@!!Y2@+clb=-65NpCPgw`lBKl2Ny_fYAu=$(=> zX}iVwAJ#Hx*&=_O|H5kl2?R8Y0R)8bAJ*bvVr1)L;^6*6T$hi=tOpxlF8WA-#h? z4g^&P)k|LIXsBmGYh^$tuyIjQK2O8ahtTzT_YBzP7rhH3XqQZz{j4^~^KlmXn#z)T zd)E~(T&zt}4HYCOi*y&vbD8$k(6d^=(;GFFT>w15F{-xO;EygTcT2$~-o{B*LOb7@ z7b=n;EtR#Rq&k?3f!`H+pTbcr170X#UI!>`D$%I)FM@4?s}@t#w<1}}me7aNvbSK* zqXi-6it`mZX@^l<&JPZPf_7se)-6uK63h8ohe=?tx$7{SqJuNC8^E!Fm3nMn)7@*g z1dDzAh9~86vr{)NjE4k;F+GkXUNk_j<4emls|7UQ5SrB_u_v%?s-}U)_qAxPus`p2N_Vv;?cvG^bufJhxDsw zpUmb0hBIFCaPBdcj>njm%8#|lCt;3bW4V`%PZ?yHUV3MV;aMs4m<{t ztl<4aJ<_pc^^31ys1hMH&id;-rld(Na*WJ%*)?R`6@k;1*088^IFy^ow)(eN8GC{o z;HuJxj!D!!dm~h~6y#^5*!p-1Fgb{`SeLrA%x6Q|6aY<3puoV46I3v%Y#_OplPl!f z8s?T%Los;o({~^AcF8el3LTB~@SqKKja8rHem;M{aNkeLT&jBdmBRGVmf$l|`@+U* zN86EjKf>mGF;-K?fT=t&&46Eo-?rhfmC&BpSU5Ueu56*wWGM~4INk~T=GE${icy&4 z5JW4CwJ6E_=t$UububN{VuPp@IWx-!vRKMLmq_u|mRXkyKU%D_d-r&rovr}w)J&jN z^i9kw$5gPS;<;BvmABpVmxNM^FjZX=>)vMqjw@C(B%^40_ERXDC9hq`H2=F^cR*ihMV!j@nfkhR?Hc*xj!a`|`7-Yh0^jj3a07!PtD%G`FLA1P?N*VnJl z^$lM6UE>nQN;I6j^S8Ic_pQijJkF={0;av7^|CS>N%Ko9p5O%-`U%Z0;Xl4L59VA~_T;{yL1q7{0y?1|aX(uB08-olhaY9Wo0!wrSj zTn>&8Nj(IgTG)%mKB_eMTd1(^fF;DD&lgJA8{cl4zEMFukm#LIUqA08SY`$M34zJ0 zj5N|7cO~2JpOOAiDPje9X&fubC zhXpa4_1K7?#gw->+{^{IHF_>RK(S(+u(%%b^qpbny)t{*2{1ci-d59-W843l@vISD z9S>%mh2P*HIYh=!oB$fkw8NhDbDnUtz|8aPLZq^Kk0A}f31LG@#joc!K}C8CA2tu4 z#w1whi0n}>-f!C&uT-@ToN+!2-JLX!_p+(F=*i?L{;ufRYJvs+=_);R9qDzR1)XZN z{aGxq3+f&`E$!%kW538|mv>{9p>fdie8ti*54I-o-ArTYJ@h0lsQyz-N)_^F?LJ5B zi9!kao)nDU+Y7Gj#~ZTgT)V%>Q%5Qo7ov2>8g3PMhZEnNPH^3Onl!5L1K+OnZ@tj! z4U?BFCPZ^++YLjS4$1b+?|i=NNg;Nkg`fi2-1dJv_GNvgoX^|`D!A@{ls3U}lP`FB z(}Q5BF7xIv4_~~ru{V6832t@cKa}CNs>mc_8dbf=-j1+nMF)785lLe39R1V8TVkZy z1Oriyy(Vf2k4rgxG$jQ}^r$>-bBEmC9%5j`v>q2FWLI{A z(1o~YA6OVpizBr?|AWf^)ezPAx6ljzQ#H!``OyC_DmyyaI+)v-(YTu17~8u3ptDSz zfZPB*T=4ZfS~p9!DAyE<_5a%97d?lA(6q$SiuzXa0riNfCzp|M-lF^H@Xz}SmxjxYU zRkhRRajQRL!N{!QTk+4k{Ax8yY6%+|fla~qkR>#;Q{4c9_z`%DTAi<#)ZGhX4rid* z*ra(}P8M7=dh+Zw1BE-A zSuFM&G40#6{^iV5E>0pOP3Ukre7RCtNKd(_q((zVDK0p|W&7U}B$iTPgQI0qzsEcH z|2{a9f5I30AV5H}5I{hP|2a5EfUSd*k+ai(^&F#Bwr%I>k$krG3`mK|>PkRw{a860 z^P!QX1+8uZP8_pxEqmJnEkC5np%R4x+MjIJ!um5@!-dwsnrBMhk|wEuk-(i z_;n*V+A-HLTwz-fL`_!*Cj#_QZtz-P3?KfLB+e=glY}-wa4nv?M%fZY%hnFDteFnb7$W27 zl=G@v>la@GUeCzVyhiAcy(y`W&pM&G zLl&z1%Hm-m_LTO=_rR;)ZFqI!lOxYH=YAd`Lz6nG{a5$GQ$JyQhRjojE`Um=kl;ch z{yOd=hA*GyMUG8PZ*>B?!@Kl>$FqBD^3tB2@~1B<43#*b@or+tb8um-mpHk4?>z2* z7q3fKaFgk36yeZ}K{PB=Wc}h>j?Yx4Y0YOvV{HuTpW!JaWz|EMDI`hM=2CA9$-)Y` znT@)(_5K=t3@ZMc)m85IbC`z%ENTpA-r;W+QtMnF8U!PJIh9#z)ZcMdli0RpA=RhG z+*fM$n9q}YLNQL~zcxRiXDD@$Sg+1oiA6!s>`zCT>fi5B9_6bUys`M zogzM(FZg{xIe7TRDwUFAq~@VXeb+>OMNLpkSPJdN9>TCwRs9gcavWQn%6Oc$vt34q zGS*I&FC>)=lMZU@8wKyQcCUoJYj{4A1eWCKR5;=ck$F=2t-5bS+kBh)r@(P?s>(M#I^UeL3O^TVBQyQp~3bSdY4x z=Wpb#wCh-u$4Z=uCwkk}Q|=jQztdc0Ni=FyPIq@$=sOe-ci2nNek|qH=|RC}B*jvu z8rgq83xjJJL~+q)ol1~5RRpCM*8}YhP4s?}Rn(F3yqfqnJ5J$#MWsljShs50dcvRd zkyL++-4z=z`Is^Vnbi{d_m?XfXb{Ge&3_Bwo+?)-&GXVq4s()g8J&1pnaRB-K(n#B z={5@9CDK$j%JC6*M$tYuv zdNC~L6VINby`2t9(IiQQ4%8)X8gHzITdrU-YT?71kkD!c)(QX7B|#u=00&X3T;WgY z)&Z3il1g!jL8XEmfms*W$akXml(O#XwXI@TGpn-l0b@6Geb{8t#ivx(48iKF^h#oC$1rS}Z3aCB=uPkEI_ba`$3j(pU8WbeqfL>a8k zwxt*m=Ls=C6&NtLz+lU{AL#bq4_q!75n-NY`?N4LT`qIB3R^WNmr3rl|arjle*ME z@ziDrkzT6i8l|LXo^#$8UM6i^EN&e>KAQOmZLTNW`&Y*$Y2*`^_DTmNm&b6&{upp( zJ^2?SM#aifJYLW`-u210q zfwY027dk}@`Zd81q-B8rzag6cq_FW%4tFWb#IDgJb=^}Pp_@g5bfGJlt94jV`8Tfh zZ^rkvV|HwY8!S=mk=CwDrU@71;>VI$7c>X)cK@AQ9whWOcb-< zD_=@89#7R=q7NNa51hR~yh+muux<7CUZA?Tl=G+{OVaSRYyfX5Pae5g;%gYwt-tt! z^K2JllC}hxG5QBO+3{n9+~yhhsO&m=vPPKw9>B^bH=6O*p}`P%A`C$M?9?#{6GLH7 zohzg9*yC{RT|M!(^upnWaNyn$Oy}t^mZ?x_KNj>>(!tAsOq|>G$GWnoqM97SZaM}^ z*mxm!9{nAzR+jbU#E@}b8XV>_p6Kk{P$($Iki}V}RN28$_h_n;3U&XagoPQx)&$y3HCo% z2~m?;vDsvJ)c*$!0)L?3zvi*54Q$L!O&pzmE|RTHlZs624>$U`N(I_+enl3p6aY^_ z0;Eu$yng6v>XCHPl9=B^tkz9y-%~47W~)DQ)nyBv>1?(i+|9On!V1*p;I}HMC=Oj; zg8H@_h($+|zc7f1efIAhW~z3Z1U~W~6eLI9;G=D@uIJp_rH^%*;G6o9@-fkL@r}b4 zW|XzL5=39f1fj4q%;Da@*M128jCaZgaOl;%WFM6cfgXM_mXhA2X{~APa9EBY4y}Gf zU4ugM0P6#rndFxY9d@3mmQLWmdW?ZKzJvN_3ER*#D z1=XY0ll3^%e-E^SJr7kgd~g_?pTQ~xKwb}<(ea205rMl_2}_y`{O+s>zC**$alSBl z%Q0&+EP&{L<}5cIOd;L#7n$I&Vk;xRR-Q8cPhn>PR@Kt=aZ*}BK}tYGly0PvlI{kP z?(US9?ht9DyBk4DQo0)n0qIbX{Pq!#0(#%?-se2)9zFN}n>Dlc^vo8??+@Zj_KJB} z<56~7B1D;Q=gwFV^C7G%?$TSPd9S?Nb%s4fGh#;gDqf>;ZBWhj*!!x>8uV7PvSxME z6h=x2T(q&-X@+rPgFVG%;tJ&1Y@eNP3uH~8~&{QFau9m$hq zUS$m-?JJ^!EAn)ULFN0-MElFG4PwU1$n4f7)ik?WB_EWITKj*5s}vZivL{_czRAR} zG%wpz^d_xfPgXp$@7TjBRNk!Pd^h%(-E@e0ZZ5{|hpXEU*92zu>3H8A0yk=FrGeY@ z)8tey zSzvXeIywQ@3A5tf*2T~(tIj;3crSO^7b*gq)1g9}M5399oxyu}sz_!~FQq%5rl8;u zbO^v(bW*5>&$m3m|L`hsn3fH5aDVrQ&}1ft%M<6L62W+RR=V70hww6|Hrz*kzU>`Y zN4MweL@F&TFwT_iUvtMjfB!PZMf+vZ;;Na|BgzP(DD3R7I*JR6lsm^~V+zJbO!&5} zBWd+`)#xnS^QHrRSjH3S+IQMr<>*B7IV6X=BIRk0b!!C|o|3RrTUR(&rYqnL6){B- zy=zU&RW6lws7NH+GEOLT^?#oH*kpMvRe9k(t^y^0-tp;K;@eisok{+Zi*)%1rr0*`d62efwpj9!f$Wxw{eHpo-$XNEG%f=?HJb+HJ-HSrb zEtuK??etFk+on%=uFeMir5mt)uc|e7`<;`}VdZ)Z)ABgJ#yA9OBl=V=X=IDHI~Qd4eckdI40^< z{}871ktoE5(f9GOR&A4$Ufnizgs$6r1Z|auifeXoXJzMCnmW+1_v@yaV=ORoOC`VT zt%5g;f}E~bQ3ZOdcU|>95W^slq*EK$qQKn8xMvw&jS%L*!!NPG{7G#rT)<}e zJR+$B^UjN;^N6jo8vP_<6}o7d$D{#b;|Fvfti0x1#-2j<&l4_VNI^cvL4nd=cW%)BC^Hy|^-W0fRL#`CrW ze}Gb+uhJVTToW?uuElRU(uEX+EwbkO-wi_$o!|>$(r&fA&4tyDxid?@(Dosk+=Dk# z!>2!|1m*$N`}#Y~DXZbNu~SC#cyaF;EJh)MO*Vt#6-LHmZ-vJa5_Xox-O|l-ZS`b$ zH2plBTL^pjDQQfDQ4p(rOm`ew~aU5$032~-_oM9k=}-mT0-*LPEG;Zjjuz2)?M z9_NI^wbGe_zB4nyx(n_k95Ao&WEM}xKr{AL*3|vgN%QZX3q-kHMH`ou!*v>E5Hlch) z)3?!1iJmb66Mt+fbAg=`oq6sU|IOv@=)@anYC+9cOXfAU`1i#6`q+^b#YUOa&llV8 z`ydGw$Z;l{)@U%_T0hv>u!KX+e*)Z?yq+vh!+r!|c#*R;&Cp%nU{*PtS!17Pt+Ac+ z)JHO|Wa1RNubb_i9|rE(?T>_t=8x%2dN98*EGBH3kcEuR^6-qi-YxcZLaLZG;}0{2 zT7;)sU^aP$!dRM@gUi@BXxuti`mV40t$(49Q9lG9!h-pfR3eqjL(LUU(=fiaQ4$Id z;?D&^#q)1p*S9(=d@(!NHYSnEhh}NDREjfu{E{zq{^)&WRVftm(>wIl0mdBc<``k} z%_*)h${7+|5H*(TZ{x(<*)D4O_+q)4E>v^36z-6U_{o)=!ds5yQA;OaZ_Qlz%hb3m zI7->0e=V4msk4-g_I(i95JC3l-%Xs_B}z z=P1cO=4W>JyS^hADet4dMEYS$i)iDgv!R$PS`^pvrZ|lxk@WC0Px5t2<);gC5{L7y zFCdc{TZro^&7T%FjET|QEy@GlXR`uq$Y+JKc?#=3)72La^Fh@|l6~dqBqkz4F+KUn z7#(=;UMp7i;rISRgyDSWn0`pTHZd)aebzVkKauM=CQUVc;~J2clV3}tv+WqP39GGt zf$sNN6Zx}-4?MPy^pRK3PD_)>r&|aWrL$@;zE^;zsudrPS&vO*2 zxu1H1@hOTbA`Q;FvJ_V<@_k$S(M&Kd`u8>CzTIx5S{<7Tdzg5F%GwrZdJ#vo@E6gr z@A2F}H@XVw;|xL?dra53h98_Rth{eous# zwwcr+t3Kl`-rIw5`5#V5o@3nkDUc0tmFkQkE2<6~1NYF+as?WOF~}PHNNMd61Nnxi zC%=9wM_PB*85A>(34S|%KcX~p9i{06dUpkS_ntc;zXhw5hv35^*^5Ut7{$)_-uOqC z?HWxIhY8{HO=}V#d+ZI8`%Q)wLh6{j!@t)>M9;xJL^F_6ptZ7juZ1p zGjE&+V;sjuT+PLzHBTWDhc@4Q2wUaufl9Ar8`@0SxNYsLdET*DAXtNwAIdvpqK$+Q zBUqNEW~-P!PwSqYefHdpF7^}KX^5MIFh952he3pFHIK!)@mYb}*{E4suuX59e0dhd z%iIR-C(=}(#WQ_jLCZ@$3tM?5@bUo5aY9f>zM~N*aLzOYUmdO?*cjIu^+Vn;%0Agw z^*>!~P!l%jNgm+{G}*O4HyaITwy$pX12tobvYf!2E!xaJMNq6N5~&XfG_;tIP$PcL zZg_Qi$Z{RjkHdsbSDCOUd^UZDyIZppWHg_~2bXvb%5lG@e)6F*kiEwnQPnnEnQ&P^OiM*EbuX;^A#J=ZwaF1uOsDDk1H+FFS6t zsHf(OM$7ij@1QAQ4TNmLA(k?_7iUJ?=MtoRJ&>;d{cD?isUbnq79ME`VRgp@f9ZmsOmfp*FizqP1@Syh#W%cPrs z`^*@>%UtY3)OT*?ubk?kuwO-t}z!OvsW-Oq?A_na`Ms0Ml@n!h()K4O8T6C?&ke^Wu#6&vld+=j(M` z<5jg)o$qoXC_GS@l_>u4Odc*;X9wj4}B%89|)(b8;& zHx`3zRWWD71w2&@qJyg>W=xd^Jb|%3*|U+hPIoHIi@%8@Nt`Ooa<4|nk942rAl@k= zRwtZ&H zm+csn+lWR`md8|6_ck$(Z3cF=_W~qwX$VY@QKoI?8r@wA8vJ(hdAP}KzX#P$z6d4W#Q2mGnvc#v5P? zBnQ~202;Uc-k|_0unhU12gEq5)ZeWQ%4+F6^U$<#8oxc|Zp&V7&l8TVnn;BZkud7U zEmE48ZuSL*9Y)J!Z+ADmyvu&juV0nO)*!xaou1GED#m_HQ8(>?2IGDuW25L3@589! z+uv0K^gi>=HL`Kq^qUwSZyUQm(=NX!F=2sw(Td8!ozco(k|EiU9gW)dZ4Rp3^=xTP zO<5=AgRceAC&(AvNT}qD&!VOWySSgnV{}5R=k&nUX9Ue~yJ*7Wx~0_9#~IE-Y3m5= zbw7c}`>gEUQbi|7pC%_TOpeR`(3u!_ixW|EH(#+YM0HqH7y(zUP$cK}3N<5_L|-^H zZf*gF+MFYj%J;n7bwv?XeR8;L>kuwC?p619AC;99i^S?HYg5yYplfLhOo~W)rIP3LDmqzKA7$D|*V8(DOJXVA%>O_I%($bp<8COq288?hC(~8@Q(7MXv?I2Q`#9qn2e}n( zu!YdZ(qb=B7FlzewcGI4=TqhtXYJv3fCuvJxW{E}+mbC8)43*=$%u`Y?G-!M{qF zelYs<$}SsFs}PeC(Ma{o&oO-y;-(?E5uZyo-6N%9b$~-KeJPA*j~8l5rL%bIGlMSAV`hgb zb8Z@_oHU4fy-KjfBBmPyaufxa6$R~E`m@USvz3i%vWllg^Xc1_&Hnn}alEAjCqxXv zB*CO8!Lx_`x0c*ng#xqQzp{rNFNq{g!sno*JUKhr?pjh0Dze0VRz7aOtQVPFm?B||JoR-AUiI!y~jvfmhtK77U#aKLfy%uQsu7;-kNo}1jRfg;D2eG4B( z{LtM%?as>cgXUiNhTQx_mW%F@21~5^_cCt^f>&FjqLxp((y=4YUb4q2OMczCN5>4avYcBNPk{5Z^ zR1R~6bv;TzW#4pJ=kPp5`&6*glp!7*Ao{k><`uE3Y)6GxdxadeXAuJh(TF0C4t}EG zsXQqW8TW)9@=l!6yOZjDh_@610bCE5T$`qoM~XKw*t4l3(h>b$b!X)wi@_r_noSL*`BBPc% zl{z=2It|;9j#Lm4-`yYeZ-zxWD=b!C#INiH#u>COXotI}D|rXDdYAMo>v9-$e zw_RVnKSLawn``*sUMt{R5o0EVKk#rnr+&kwL@7$3oG^PzX{xv-zo2CH-Gkty7Kv^x z?5v@^wgApyTz`cLe#=?S7U&MsFVYwNl!BJP9-ObI+Of?pdL_BNowRbsHES}s^Xi>m zVFBk{EG`p_6JdM)miR$h9lKg==HaJlI*%V`NKHYq%zVi?v*;e%#DH=7G_n`0tSfKp zc$S0cFf#0b*+Nd5w;=VKa!6z|~858wwsk|R;?7fUk-cTH~H zuMJO`Xhd%}vqW}f-5|XnnjBH6Rqc7`xP&FG_qH6508*@S;)H~ZML!WX!8Fn}r|C2Q z{kTO>*&Poiw7aK|L)t=;jj5PCB^%w?IQjZ2A%a4s+E>I*IDW)1R@!NBQ2GQ_xE*?A zNZhj2OKPj@fUj{^)95meokmNJB#WmJio_QTyyhw{<6ZvUPK-y7M2+Y{E61|R3x zcjQ@nZE6jRQ5K-snkRN&~SQf5qh$)2~(xYp}+x#8i1s?-hPQ zm4oeDcX0>1ZX079wm$8<1((a?yp`Fr^pK;iX`UmaV&T=QY0r*(UM7bu!MF^EDwUf% z4+%y_PIL6O{huI~&M1eZ#cN6ISL;MU;5OrM2vZnux(z(SGau1+^}0YN3q^=z(Y351 zSv^#YAa#4{Wz2DB|E@loWBC17Ymw_5nGS>lF9&C&>+d?cOD_}(l9(g7R@ylSjJXdk zR_)54H|pp?;b@(+6t^iL)bE+=2Xi;SQc zs8_gLX522?sa-)UG0Mn=l8BxZSuU@uS0Tm0C=1b^xExT9sx>7L<-h zD6it7S#W)(TH!Z)A?;lH@Ms>5l8DxpSyJayh@Z9aXzH_zDh5^y$A;`~c)Kt>&yd|B zx{qq#EKEeKHu#ClF&^X7Qutdp1<|hY<6S&HsS9XbftVn*w=$L%4>l#Zk39CIR!COrt>?FNE$&b6nnKZ~b+UwXnX=16N^{Lv zwHUeV`^vkX_;a@3VzNNCMGSIq^IO^^axe+RVc|!TY}^c}hRmj=AtA1L6*FJhZye5pXJ+q92|su)@(y-m zuGJk%dpCs6GKg0(68S>=owg1BxY+mFMG8_(7p)c!Xu@}sgT@Jaf=K>iRSI4{Zbg*N z=ahnV=i@l4K|S0+q38aLdegq-&_{U-4ONbwXvnF-ZAVn&`;DPF$j9asda}C6uP;!e zg9PfQ{qd#~FRbErA3#n+$!0*avvh9y_aqK|7sc0aULMhV69pT$yo+5_GvO7bt4mmi z$7nXN6Uaq&U-DQf#b?T|?_@K%(XR5 zbggOr{HzODbpQPu;6Fh7W`6%n*X;K%;UVGxLF>C=v4$8B5F_#s5I8q}X{u{&t*NgI z+IePfR{z2} zIpwdte)@?y^3i!;9_=2ABMTRbjo!5l?1L;cU#iD=Ji|mhUwAPfau)9~v)nu2TkPVpBZ2A=-3Tp~;x(z?)EAZuX^hg>AbG6))hbNG00) zz8e+Eh{f+f%!~S)#9(Qoi=7WK>WK=nCvufL}AUjm!~5JB^z6cBGsr ztW8>y9Kor{@P57rlkl)y483=CM<0%z;^S+b1mvPeqw-@I$2lruOZH{GHX|5RD1Nre za);}wd)8&O1ZYRMw_C@sMI1iJx6f8DEeIlqYS=StjAs;>j6jtQZXrFK6iyh;bm+D% z5RN60%7Gg>;8-~(3Pd}pViXF(u6%eeCEr6Ep*h+0h|Pz}?4XdzM*pbR2&YZ?gn1s{ zT(}Z9=#I*ls2_;yZOz3}bSie*F9knsb_qt}oAx1TA=!Vy@pnXUA`h+7irI@3e3h|` zE3A+819Q}9j-abzdX*Y;-{skM>Y}|s-8M5qabLjqeX~1R)|4vz#yQyC4Z%P`jEdJ$ z2dzaZj|ER+^+Cg^o3OS`i5`^~$ozP&cgXv6A-j(Lo~~u6fgn<#NQVe*C7w^`4%1k( z!8_sC!%(DRRl#&67;`Zq&5U}^uzOTtL=*PK4Wci%<6;2)O_O+u|@HoeG^y0j$5)PFA2lhKI&H*YQ)HCtC);I4E^X< zUL9t1JnX+!US|4@BeS)&a-79BjW8g=UM$TZ`ROr4cPg@}3ei|bO~NX{iR#lV@6XOY zq3LRH%AY%V7B4 zo5s?Zl9{y+TQAX*IcOT5SFk`g2cJz)zBw7?Vn2f@5L(Z03oNqx@<19Ah?)g0c#_qP(Q7;M?zlZYmuc4v@o zWDTg{fVFU7M%C5QupSN(c}?vO`~?!i-Vp2Nzm+SuczA$^4Yax{Y@JWZptWWS`$TjcSL=d7PCT4Y|6mi~j zX~)w!ov{!b=qs0}K2uW4PU~8+Q`MxOSQ>p_7TDHPffbANXrb))}6)` zvlgzPxZL;a5A7#KWH3g7PU37kK0&Sb9An6^?Iqi{@)U!#1#B2)vf(T|w>$co9Y(Qq zcUL|%OJno+@;bgAZTbu~px9cON1sa4oyu7NvkaTS$lNtQ{H*_bL2|DOR`D%Nx07#U z>fcjK@|KvJrJo+Y*XzjSC&Pm;_<9@9yLjB=y{3Ys-Wv0Z4}IUlE4xtS?xuGS-WtIf zfi@KH)~YfWXlX*XjG@5B*Bc+HIu90jk8*F9H!+Fp+f&_qyB2c)Z=@7d2pNqZ6g+zG z-rAod?<(0&>TM&97_Y3Tao()JUzhrdi_|b_7`(TM2&Ywaf8(iOBOLx-j z=mw&Xmd01qrCdqwc_-hOqmTLT8u(WUiXS5fV}zzg$cs-++{R=)P$BR567bwI_L1<% zkk4%06|4H6&g@4rGCsVMX_1oGWJes3(P-AKfsS=c-&;DRwIz7Pf3y&4mE5XP9WPR_ z9i4}IJ{vna@_GEdFhg;J6XJ|24yP>hJzW3VjHPe$rFZP?c$OiQd8t`DJ7bk)H*&R9 zb)wQ;56&cewMF(xZUakiJ-3t+#c3pIog3X3^th}>Br!h4(@VF1o2W9xQ`WS@tMJ_) zy8qF@uZ<*`ao}Rhw4i+WXb1~#lFoG?yT21QPPv<@NBc=!ez=~bcOBw->t_Q;Pc1&u zXHuV0lKGFmrH47Fh;0$sd=jcw=Pr3Y&56Z-I$+62uRsh77o8^cr?9MRct*D7JxaBUyh}l-WfO-oskuP* zndg!3-I1Xkl0d3YaBHOeUctPnOf2o`jjIvw!&Jw1*>qF-i_RO+lNlO;#0)^ zLo_*MY-c%U=Pu;BRvy;-OnB6UFHKN*ZJ$aSTk*Mut$0TpXqd7J=pOb|?!%)G)_(6m zW2xRJX|BY$+nKwvCl&LR?Rhij;Ua4+pWs7L6Bv$nErM(xwBpWK@w}rjr|!HpRoR}c z%WPE|T432=vztX8|1lErIX^vXBwNiF+26%z(P%JAK9`)LVy&)q*t&NqMMw~)%fh*M zw~JB(zT!fP(t!nDue8BPa^=|iW%Vg_<#Z=5BcbsisT&go5zBd9{ZVQ#>I`zC+R0w}y)&b1Rf*U~YGW?B78Ydm2uEys^zE4rG_$*J_f9pNm#=4M%J4BCo03)g6U*5=lV?(dvApH=9y)cdMU)(kxPs?!w6uXW_*wk-j?p~Cs- z)~WbIjiku=8YA?NnH!tZSP20{R42SjM7Fa}>QoA#KE;y4g~h#bPV_XYJ*yo!K`Wd> z;&7vbw4e1$hKFu=UNS0G@J6kP;;k<%DcQJ~s)GI+e9W4HXy;5@M5o@1_j)lOsXK_< zWoN179VM`oeC>T4;*%M+%_vsCovtz^QA%o(yEH5DRHPbsB^Y1Y zu=@kC3N=X;LtPB4^4%lD+u$GG;sGmZycrl8)KasM zoKqn4+N4Gk#i9{cCO&WKAj@r<{liKox)OMbVVK!hU9$c9A%E8XeTO5VwvcDppwFt!7d^FCyHmItH8 z!}yAVoHvT9mT+_C$?wqjk6()Wt_$ZaNZT-NHVOp)$XxVncM|MbJXeKqRN%1Udl|I2 zmRLWwFT^dZJh=dkQWo#V$KC;*FN1HiL7*Om!)Dh~?C@k7hW>*`T&yQ5%spvgn|+_G z#4@bmPlXo?m7+=kjQP{Zb6U)L79x=>xB{>D`#l7N69MrBd}+@DpF>`CdOlQaR%^B*(z)cM5gvFE+NrHecA5Rbl%^C1fq|v)JL< zYBKNlP@_rkheN*+ha6k|Orz_~zv)haafhmX4)x(+G1sXWOju>Ula#*vh|EKLbUB$+ z4jn|MN0rux!XZ;cX}Igk4<{_ z&3CI1=5LZu#wAbb5kHTR2j$V(HrQxN@~SqOi84u3TB01gqn2s7PA?A~e12Wk;Xp@-kT$m4GB$RDh zkx2bRrwWxvq)QLkih9o-m6{^kZfTf3!@nQMZCj~`Qj2!<%wh2QY zX~&LY9|G5IL?Y!*-F`FF1n*NLije)rv{KTnK)=>dVrwT>bm{Gi57etDY!f*3*Ha(x z*^lfVensWu@K6&HP-3woaOJtbX-4Zn#(fz0D&GCwDRW7|#*A9GIiDg8sZ@GzZ0qN_ zA3gCSFq^Ti0aUXMlXjTqCl5#`vv+X@w%hJitg)m8EmLpsan>#FDd3`C&U*J~j-Av2HDBok*k0q&dJnf1X^5$Z7xkarQ=c_b(2V+InM+-vl z#<)Uw$LG1-i$k^1asp7!xG)aOho)ds5@m6j^|%GchM%&Fc}>3AakaHDvr-+guB=g!Fw`DRcP}F z{roTs{@{_^T-Durkyb_gQ`D4x*zo;1q@5aq=l!P&3+$l*Zsf1+`d}zpP?1cu^;44< z9thQ(iTc38aOD`xo_=(!NL_H1l3{e?iz%Y?wCg;}y{j^*H;IlULFU|EM~cdheHKOd zJfCAN2(H|DW+6x?755nVThz&X&;t)s1I*alR$=~R6lIIm%B%S1bAf}0AAd+x>6kK^ zq~7U63;RA17>t=Xa9C+dxmWxkCSl4$23~iecBQMs&1I5C@8!|gLb~;OM&-E^VxT_i~H}3 zSDiw-mVIXjy+xMeT7=Z|1#m?49*-1yQ$YuJ*U6c&bPb)L^M)quz_V0{Qc*zT@nA6k z>mbb1{=1YT9TEp^F?ylJkTqs(FMx~m2wJI^Am6?`I(h8|%WWy7>>uhBgLjaJ};@>|s%_*VK$ zRYzCLR-YQszb5~MYkr4v6mqKfQg$)xZ+RUl3vrl_gQ@a>?@xhMNwjP7>cCzjP@?tB z&1`f{Ow9ixY%$OUz8d~b0F$ofIcPJ%tbUkHKQK{04kY)w0}H^6CWvsko9RCs82omb zaIn29FN6LCdR0>V z@>TlZfSiZ~&NZW7%O5Y`3X-4lzt?eZdJsM>as-s{d;H512HUHMXkcMDG_<~x1<0UC zAcL+4d=>!&#AWG%RyD2`Z$JlTX%7&SV4G!h$@ruFcTB?mPCh6m;T}LhfQt5?K^b3t zDVGs`Qx+aVABY--9}Znfz}BWE;Dhm778I1^VAH|&z)( zKoZ2+fMghg_Psd%RU<(Bdbr$f9sPWE!S;_j@c*h^pS{0cBlvPaKp2|pU(5Up>gc*Y zpiIHmXYOj|UuF#Gfg-FLdF%?L5cI+Soo097Th1?4Z38QFQ(b;tJxyB^o9CK#hT7(4 z)D~v?*K+8F5C27jcQizaJo@?Stps>@6R+sjP5bgvB4TtclO zb6y!J642*55P|DD(C+{75QU_xe{vYo)cF!P29DvWw9HnAoc-jpF4A_cwUUl%YMWq2?MRz~ns>g6PYo59K{{zPCK*xO3FSn`rCJ+j2Id=Z` zYXLyX;Rack0hK&9;2Xg;6xrMVK&k6n={nxz1-w@50`b6>K=;RAy@x7*NBFsQm>$Sh z8^W8eVQ2i!W1x3npudSKoUDxpp}>~$-ruMS0A*nCQSBUPc8-Ax_IfUQ)chCfMuAo8 zzKjK-z;?S+?dSKa1(pJ!_){q*s)5TVF!65YVrAohp#GVQiOobFARgF~a{cXEJiyb0 zsu$CTfq-}n1j+SM%kBT4yc_=YtUY@L;(_ge_~rMj{wV^y-Ns_;2akaMBoO`Avr>HI zZyqCy1LI#0+T`v#S`Z3s9|ryHnmB-hIC!gN2-IZEcW$CGj{ggF!>d#T`$r%Y*zQN! z{rrB_t6KnS{cG>HR{}uSQtE0845~l`fSXuAO^YdT1`gD3v$eh%gwD=TBV7OkY)f#M z-*p1tuQC>a=Ii~d(n&382#EV`HyL{(mket&b8{z0bsJ4BYHPb|&5QQODZYL{6Kn~~ z{?4*YfRSOege@%r+<@W$Jjd6bVef>S40TO=O=I1gB&{DWAwVRsU44A~*V7AXHZfH5 zsow!rd>PQ&eQ=G0wEl0BI&guFzM+|>$xS4<{m1oP&jPjBq#Bp@Y6gOk4Jb`o3_z%J z0x@yDmS5la3;F-SJo`3(!oc<_tX>Hi+YHp4KYIZIv1fQQClz;p!G5(TRQk4#RGKC> zH{;?I+V?dmF2ELM^6xSm0Z5+TtB@VFfv4Bask$w zv-tG@kui6dnR}=|a>~LXrU>w%LK${xhz12Sgn%MK6cVM%RakQ%#GY5opEN z%anrc)xZLYPx&>4K+!`$9BkhlB3ilrOtF@xwz0mIxvd%Kiic~-|3#Q)Ir;fW=Ad8N zs|3(<5^>9E)Eh`XHIV#2y>L+SQ;RPNmm~8V>c4uhP6d~$V0%>^l>S9%GAw!EDSQGn zIM)XfQl&rDf!?u=u9=Osww0j;=yHL7x!~_}2?5)y5RePZfn4TLxIiZo=;XlvE>@5W zqm@4)I$AfCez{px-Rp^ZrZapX2`<$^Ip-O?>(@=fU=B zvNa8=q=KJfe!v9=vgoE)t9Vedzl>gro10SEm{S>=0vm&FIzZTtcMQZ2pT#9ZO8A$( zGU)=!f8++{ch3O_%z$l2*N4!wTR$24);vHZ>j=C-3AFX-U%Af_b14nBSKR>RemnHA z`ePt?YJt-Vx3A@X#{Mq^-_J48P5oclM7(^dPt)+X3n2aGwhYzRK=`aZ1>MsHt{Onu zboBj~K6sdQ!+~D_3gok&FQcEX$k(K0OEWGy4uF#nr47ERyRTL`%9pjd-~g@8(@1C z1Pa?HC5*+7fF~~o=-&V7`hwiSR{8_tH?-E)w9@$x)UUFy1Wql3TA)_GOM4TQ86`+2 z4!lla;L*+KvQhhklD5^g{i_=JMQ8}WR0fl-5bb;$tRn+%bz85su)XQT^>@l$Rd+M^sSdt0%zW4%w8L z-b8d&96W|EXSvK8u)QgM{gR)n;zbd#5a6fx=K2g+9XxOY+negw?_ap8ZWRmr*KG{{ zN`IF6|4#q)s{^hQaN+^N?~4Tfr5#^zsSUO_Q-A%S`&I4s1la4x-v1^4_T*ANc=*!Z zl)ruq`Kr8MGD!Z$llxy~pf3#lvkr13zO*+n*U#o&#Z0Ea-Z-iIFE<1mE_J12{?`Bd z;OABSnN&a@+@Jhwm1&IZdn0I#4{TK}{?`BdFx*vrvP{^kN8_#~eo#D*18)@a>GGv0 z*omu|^Y<~UtKyW|VDZZntXI`zeelgdOXgq;ruIA|gK9MG q8|v2%)m%m8><%e_906M}Qc4sS=vYBO$OHePJpj6K4L}bb;{O0VRY({B literal 0 HcmV?d00001 diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 6f2c194f..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,117 +0,0 @@ -module.exports = function(grunt) { - require('time-grunt')(grunt); - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - manifest: grunt.file.readJSON('src/manifest.json'), - config: { - tempDir: - grunt.cli.tasks[0] === 'tgut' ? 'build/tgut-temp/' : 'build/tgs-temp/', - buildName: - grunt.cli.tasks[0] === 'tgut' - ? 'tgut-<%= manifest.version %>' - : 'tgs-<%= manifest.version %>', - }, - copy: { - main: { - expand: true, - src: ['src/**', '!src/tests.html', '!src/js/tests/**'], - dest: '<%= config.tempDir %>', - }, - }, - 'string-replace': { - debugoff: { - files: { - '<%= config.tempDir %>src/js/': - '<%= config.tempDir %>src/js/gsUtils.js', - }, - options: { - replacements: [ - { - pattern: /debugInfo\s*=\s*true/, - replacement: 'debugInfo = false', - }, - { - pattern: /debugError\s*=\s*true/, - replacement: 'debugError = false', - }, - ], - }, - }, - debugon: { - files: { - '<%= config.tempDir %>src/js/': - '<%= config.tempDir %>src/js/gsUtils.js', - }, - options: { - replacements: [ - { - pattern: /debugInfo\s*=\s*false/, - replacement: 'debugInfo = true', - }, - { - pattern: /debugError\s*=\s*false/, - replacement: 'debugError = true', - }, - ], - }, - }, - localesTgut: { - files: { - '<%= config.tempDir %>src/_locales/': - '<%= config.tempDir %>src/_locales/**', - }, - options: { - replacements: [ - { - pattern: /The Great Suspender/gi, - replacement: 'The Great Tester', - }, - ], - }, - }, - }, - crx: { - public: { - src: [ - '<%= config.tempDir %>src/**/*', - '!**/html2canvas.js', - '!**/Thumbs.db', - ], - dest: 'build/zip/<%= config.buildName %>.zip', - }, - private: { - src: [ - '<%= config.tempDir %>src/**/*', - '!**/html2canvas.js', - '!**/Thumbs.db', - ], - dest: 'build/crx/<%= config.buildName %>.crx', - options: { - privateKey: 'key.pem', - }, - }, - }, - clean: ['<%= config.tempDir %>'], - }); - - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-string-replace'); - grunt.loadNpmTasks('grunt-crx'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.registerTask('default', [ - 'copy', - 'string-replace:debugoff', - 'crx:public', - 'crx:private', - 'clean', - ]); - grunt.registerTask('tgut', [ - 'copy', - 'string-replace:debugon', - 'string-replace:localesTgut', - 'crx:public', - 'crx:private', - 'clean', - ]); -}; diff --git a/README.md b/README.md index 214f18d0..fd38ebf1 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,23 @@ -# The Great Suspender +# The Marvellous Suspender - +"**The Marvellous Suspender**" is a free and open-source Google Chrome extension for people who find that chrome is consuming too much system resource or suffer from frequent chrome crashing. Totally based on the original "[The Great Suspender](https://github.com/greatsuspender/thegreatsuspender)" but without ADS tracking and problems explained [in this GitHub issue](https://go.gioxx.org/tgs-ads). -"The Great Suspender" is a free and open-source Google Chrome extension for people who find that chrome is consuming too much system resource or suffer from frequent chrome crashing. Once installed and enabled, this extension will automatically *suspend* tabs that have not been used for a while, freeing up memory and cpu that the tab was consuming. +Once installed and enabled, this extension will automatically *suspend* tabs that have not been used for a while, freeing up memory and CPU that the tab was consuming. -If you have suggestions or problems using the extension, please [submit a bug or a feature request](https://github.com/greatsuspender/thegreatsuspender/issues/). For other enquiries you can email me at greatsuspender@gmail.com. +If you have suggestions or problems using the extension, please [submit a bug or a feature request](https://github.com/gioxx/MarvellousSuspender/issues/). -**If you have lost tabs from your browser:** I have written a guide for how to recover your lost tabs [here](https://github.com/deanoemcke/thegreatsuspender/issues/526 +**If you have lost tabs from your browser** you can read a guide for how to recover them [here](https://github.com/deanoemcke/thegreatsuspender/issues/526 ). -### Chrome Web Store +## Chrome Web Store -The Great Suspender is [available via the official Chrome Web Store](https://chrome.google.com/webstore/detail/the-great-suspender/klbibkeccnjlkjkiokjodocebajanakg). - -Please note that the webstore version may be behind the latest version here. That is because I try to keep webstore updates down to a minimum due to their [disruptive effect](https://github.com/greatsuspender/thegreatsuspender/issues/526). +The Marvellous Suspender is [available via the official Chrome Web Store](https://go.gioxx.org/tgs). For more information on the permissions required for the extension, please refer to this gitHub issue: (https://github.com/greatsuspender/thegreatsuspender/issues/213) ### Install as an extension from source -1. Download the **[latest available version](https://github.com/greatsuspender/thegreatsuspender/releases)** and unarchive to your preferred location (whichever suits you). +1. Download the **[latest available version](https://github.com/gioxx/MarvellousSuspender/releases)** and unarchive to your preferred location (whichever suits you). 2. Using **Google Chrome** browser, navigate to chrome://extensions/ and enable "Developer mode" in the upper right corner. 3. Click on the Load unpacked extension... button. 4. Browse to the src directory of the unarchived folder and confirm. @@ -28,65 +26,17 @@ If you have completed the above steps, the "welcome" page will open indicating s Be sure to unsuspend all suspended tabs before removing any other version of the extension or they will disappear forever! -### Build from github - -Dependencies: openssl, npm. - -Clone the repository and run these commands: -``` -npm install -npm run generate-key -npm run build -``` - -It should say: -``` -Done, without errors. -``` - -The extension in crx format will be inside the build/crx/ directory. You can drag it into [extensions] (chrome://extensions) to install locally. - -### Integrating with another Chrome extension or app - -This extension has a small external api to allow other extensions to request the suspension of a tab. See [this issue](https://github.com/greatsuspender/thegreatsuspender/issues/276) for more information. And please let me know about it so that I can try it out! +## Contributing to this extension -### Windows Group Policies - -It is possible to force settings by defining group policies on Microsoft -Windows. - -The whitelist is stored internally as a string, with one URL per line. - -The following settings can be defined: - -* `SCREEN_CAPTURE` (string, default: '0') -* `SCREEN_CAPTURE_FORCE` (boolean, default: false) -* `SUSPEND_IN_PLACE_OF_DISCARD` (boolean, default: false) -* `DISCARD_IN_PLACE_OF_SUSPEND` (boolean, default: false) -* `USE_ALT_SCREEN_CAPTURE_LIB` (boolean, default: false) -* `DISCARD_AFTER_SUSPEND` (boolean, default: false) -* `IGNORE_WHEN_OFFLINE` (boolean, default: false) -* `IGNORE_WHEN_CHARGING` (boolean, default: false) -* `UNSUSPEND_ON_FOCUS` (boolean, default: false) -* `IGNORE_PINNED` (boolean, default: true) -* `IGNORE_FORMS` (boolean, default: true) -* `IGNORE_AUDIO` (boolean, default: true) -* `IGNORE_ACTIVE_TABS` (boolean, default: true) -* `IGNORE_CACHE` (boolean, default: false) -* `ADD_CONTEXT` (boolean, default: true) -* `SYNC_SETTINGS` (boolean, default: true) -* `SUSPEND_TIME` (string (minutes), default: '60') -* `NO_NAG` (boolean, default: false) -* `WHITELIST` (string (one URL per line), default: '') -* `THEME` (string, default: 'light') +Contributions are very welcome. Feel free to submit pull requests for new features and bug fixes. For new features, ideally you would raise an issue for the proposed change first so that we can discuss ideas. This will go a long way to ensuring your pull request is accepted. -### Contributing to this extension +### Localization (l10n) -Contributions are very welcome. Feel free to submit pull requests for new features and bug fixes. For new features, ideally you would raise an issue for the proposed change first so that we can discuss ideas. This will go a long way to ensuring your pull request is accepted. +Feel free to help me to localize this extension in any language, you can do it using Crowdin connecting to https://crowdin.com/project/tms. If your mothertongue language is not available please "ping me" on [Twitter](https://twitter.com/Gioxx) or [submit a feature request](https://github.com/gioxx/MarvellousSuspender/issues/). -### License +## License -This work is licensed under a GNU GENERAL PUBLIC LICENSE (v2) +This work is licensed under a GNU GENERAL PUBLIC LICENSE (v3) ### Shoutouts diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000..8fc70cf5 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,3 @@ +files: + - source: /src/_locales/en/messages.json + translation: /src/_locales/%locale%/messages.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 8a0005a9..00000000 --- a/package-lock.json +++ /dev/null @@ -1,3664 +0,0 @@ -{ - "name": "thegreatsuspender", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "archiver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", - "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "walkdir": "^0.0.11", - "zip-stream": "^1.1.0" - }, - "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - } - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coffee-script": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", - "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "requires": { - "buffer": "^5.1.0" - } - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crx": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/crx/-/crx-3.2.1.tgz", - "integrity": "sha1-Fyk+51790IxtHIs+F0nS1XV89Cs=", - "dev": true, - "requires": { - "archiver": "^1.1.0", - "commander": "^2.5.0", - "es6-promise": "^3.0.0", - "node-rsa": "^0.2.10" - } - }, - "date-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz", - "integrity": "sha1-GIdtC9pMGf5w3Tv0sDTygbEqQLY=", - "dev": true, - "requires": { - "time-zone": "^0.1.0" - } - }, - "dateformat": { - "version": "1.0.2-1.2.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", - "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", - "dev": true - }, - "db.js": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/db.js/-/db.js-0.15.0.tgz", - "integrity": "sha1-I5MoqPsXQQGwXzTuJd5wBryPdOQ=" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - } - }, - "eslint-config-prettier": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz", - "integrity": "sha512-Mhl90VLucfBuhmcWBgbUNtgBiK955iCDK1+aHAz7QfDQF6wuzWZ6JjihZ3ejJoGlJWIuko7xLqNm8BA5uenKhA==", - "dev": true, - "requires": { - "get-stdin": "^5.0.1" - } - }, - "eslint-config-standard": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", - "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", - "dev": true, - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", - "has": "^1.0.3", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", - "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", - "dev": true, - "requires": { - "ignore": "^3.3.6", - "minimatch": "^3.0.4", - "resolve": "^1.3.3", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", - "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", - "dev": true - }, - "eslint-plugin-standard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", - "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==", - "dev": true - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "findup-sync": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", - "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", - "dev": true, - "requires": { - "glob": "~3.2.9", - "lodash": "~2.4.1" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2", - "minimatch": "0.3" - } - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "fined": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", - "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "grunt": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", - "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", - "dev": true, - "requires": { - "async": "~0.1.22", - "coffee-script": "~1.3.3", - "colors": "~0.6.2", - "dateformat": "1.0.2-1.2.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.1.2", - "getobject": "~0.1.0", - "glob": "~3.1.21", - "grunt-legacy-log": "~0.1.0", - "grunt-legacy-util": "~0.2.0", - "hooker": "~0.2.3", - "iconv-lite": "~0.2.11", - "js-yaml": "~2.0.5", - "lodash": "~0.9.2", - "minimatch": "~0.2.12", - "nopt": "~1.0.10", - "rimraf": "~2.2.8", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "dependencies": { - "argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", - "dev": true, - "requires": { - "underscore": "~1.7.0", - "underscore.string": "~2.4.0" - }, - "dependencies": { - "underscore.string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", - "dev": true - } - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", - "dev": true - }, - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "iconv-lite": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "js-yaml": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", - "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", - "dev": true, - "requires": { - "argparse": "~ 0.1.11", - "esprima": "~ 1.0.2" - } - }, - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - }, - "which": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", - "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", - "dev": true - } - } - }, - "grunt-cli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", - "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", - "dev": true, - "requires": { - "grunt-known-options": "~1.1.0", - "interpret": "~1.1.0", - "liftoff": "~2.5.0", - "nopt": "~4.0.1", - "v8flags": "~3.1.1" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, - "grunt-contrib-clean": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", - "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", - "dev": true, - "requires": { - "async": "^1.5.2", - "rimraf": "^2.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "file-sync-cmp": "^0.1.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "grunt-crx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/grunt-crx/-/grunt-crx-1.0.5.tgz", - "integrity": "sha1-nU5QHO8WtyF3KmBBxNQdH5KFirU=", - "dev": true, - "requires": { - "crx": "^3.0.1", - "es6-promise": "^3.0.0", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "xtend": "^4.0.1" - } - }, - "grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", - "dev": true - }, - "grunt-legacy-log": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", - "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", - "dev": true, - "requires": { - "colors": "~0.6.2", - "grunt-legacy-log-utils": "~0.1.1", - "hooker": "~0.2.3", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } - }, - "grunt-legacy-log-utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", - "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", - "dev": true, - "requires": { - "colors": "~0.6.2", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } - }, - "grunt-legacy-util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", - "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", - "dev": true, - "requires": { - "async": "~0.1.22", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~0.9.2", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "dependencies": { - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true - }, - "which": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", - "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", - "dev": true - } - } - }, - "grunt-string-replace": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/grunt-string-replace/-/grunt-string-replace-1.3.1.tgz", - "integrity": "sha1-YzoDvHhIKg4OH5339kWBH8H7sWI=", - "dev": true, - "requires": { - "async": "^2.0.0", - "chalk": "^1.0.0" - }, - "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-rsa": { - "version": "0.2.30", - "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.2.30.tgz", - "integrity": "sha1-iRLiw7G2TM5sp4PKsa8oKzAK3uY=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "lodash": "3.3.0" - }, - "dependencies": { - "lodash": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.3.0.tgz", - "integrity": "sha1-ARzlLQGxTmDq7qdqy5uLpCxwWBs=", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "dev": true - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prettier": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz", - "integrity": "sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w==", - "dev": true - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "dev": true, - "requires": { - "is-finite": "^1.0.1", - "parse-ms": "^1.0.0", - "plur": "^1.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "time-grunt": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.2.2.tgz", - "integrity": "sha1-k88k1LficEuBPu27e8AMrU7zcwk=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "date-time": "^1.0.0", - "figures": "^1.0.0", - "hooker": "^0.2.3", - "number-is-nan": "^1.0.0", - "pretty-ms": "^2.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "time-zone": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz", - "integrity": "sha1-Sncotqwo2w4Aj1FAQ/1VW9VXO0Y=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true - }, - "underscore.string": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", - "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", - "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 2434dbad..00000000 --- a/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "thegreatsuspender", - "version": "0.0.0", - "description": "A chrome extension for suspending all tabs to free up memory", - "main": "", - "scripts": { - "build": "grunt", - "generate-key": "openssl genrsa -out key.pem", - "test": "echo \"Error: no test specified\" && exit 1", - "eslint-check": "eslint --print-config .eslintrc.js | eslint-config-prettier-check" - }, - "repository": { - "type": "git", - "url": "git://github.com/greatsuspender/thegreatsuspender.git" - }, - "keywords": [ - "chrome", - "extension", - "addon", - "memory", - "suspend", - "tab" - ], - "author": "deanoemcke", - "license": "GPLv2", - "bugs": { - "url": "https://github.com/greatsuspender/thegreatsuspender/issues" - }, - "devDependencies": { - "eslint": "^4.19.1", - "eslint-config-prettier": "^2.9.0", - "eslint-config-standard": "^10.2.1", - "eslint-plugin-import": "^2.7.0", - "eslint-plugin-node": "^5.1.1", - "eslint-plugin-promise": "^3.5.0", - "eslint-plugin-standard": "^3.0.1", - "grunt": "~0.4.5", - "grunt-cli": "^1.2.0", - "grunt-contrib-clean": "^1.1.0", - "grunt-contrib-copy": "^1.0.0", - "grunt-crx": "~1.0.5", - "grunt-string-replace": "^1.3.1", - "prettier": "1.13.7", - "time-grunt": "~1.2.1" - }, - "dependencies": { - "db.js": "^0.15.0" - } -} diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index a1071ecf..074557b6 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -1,245 +1,734 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Lass deinen Computer geschmeidiger laufen, in dem du Tabs aussetzen lässt, die du nicht benutzt" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Aktiven Tab aussetzen/aufwachen" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Aussetzen des aktiven Tabs pausieren/fortführen" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Ausgewählte Tabs aussetzen" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Ausgewählte Tabs aufwachen" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Alle anderen Tabs im aktiven Fenster aussetzen" }, - "ext_cmd_force_suspend_active_window_description": { "message": "Alle anderen Tabs im aktiven Fenster aussetzen (forcieren)" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Alle Tabs in diesem Fenster aufwachen" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Alle Tabs in allen Fenstern aussetzen" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Alle Tabs in allen Fenstern aussetzen (forcieren)" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Alle Tabs in allen Fenstern aufwachen" }, - "js_context_open_link_in_suspended_tab": { "message": "Öffne Link in neuem ausgesetztem Tab" }, - "js_context_toggle_suspend_state": { "message": "Diesen Tab aussetzen/aufwachen" }, - "js_context_toggle_pause_suspension": { "message": "Aussetzen dieses Tabs pausieren/fortführen" }, - "js_context_never_suspend_domain": { "message": "Diese Domain nicht aussetzen" }, - "js_context_never_suspend_page": { "message": "Diese URL nicht aussetzen" }, - "js_context_suspend_selected_tabs": { "message": "Ausgewählte Tabs aussetzen" }, - "js_context_unsuspend_selected_tabs": { "message": "Ausgewählte Tabs aufwachen" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Alle anderen Tabs in diesem Fenster aussetzen" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Alle anderen Tabs in diesem Fenster aussetzen (forcieren)" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Alle Tabs in diesem Fenster aufwachen" }, - "js_context_soft_suspend_all_tabs": { "message": "Alle Tabs in allen Fenstern aussetzen" }, - "js_context_force_suspend_all_tabs": { "message": "Alle Tabs in allen Fenstern aussetzen (forcieren)" }, - "js_context_unsuspend_all_tabs": { "message": "Alle Tabs in allen Fenstern aufwachen" }, - "html_about_title": { "message": "Über" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "Wenn du Feedback hast oder einen Fehler melden möchtest, melde das auf der" }, - "html_about_report_issues_suffix": { "message": ". Bitte prüfe vorab, ob deine Idee oder dein Fehler schon gemeldet wurde. Danke!" }, - "html_about_debugging_prefix": { "message": "Um die Protokollierung zu aktivieren oder Debugging-Flags festzulegen, gehen Sie auf die " }, - "html_about_debugging_suffix": { "message": "Debug-Seite." }, - "html_about_the_github_issues_page": { "message": "GitHub Projektseite" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Diese Erweiterung nutzt die" }, - "html_about_html2canvas_suffix": { "message": "Bibliothek, programmiert von Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "Sie nutzt auch den indexedDb wrapper" }, - "html_about_indexedDb_suffix": { "message": "programmiert von Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Ein weiterer Dank an" }, - "html_about_browserstack_suffix": { "message": "für die kostenlosen Chrome Testwerkzeuge." }, - "html_history_title": { "message": "Sitzungsverwaltung" }, - "html_history_current_session": { "message": "Aktuelle Sitzung" }, - "html_history_recent_sessions": { "message": "Kürzliche Sitzungen" }, - "html_history_saved_sessions": { "message": "Gespeicherte Sitzungen" }, - "html_history_import_session": { "message": "Sitzung importieren" }, - "html_notice_title": { "message": "Mitteilung" }, - "html_notice_important_notice": { "message": "Wichtige Mitteilung von The Great Suspender" }, - "html_options_title": { "message": "Einstellungen" }, - "html_options_suspend_title": { "message": "Automatisches Tab Aussetzen" }, - "html_options_suspended_title": { "message": "Ausgesetzte Tabs" }, - "html_options_other_title": { "message": "Andere" }, - "html_options_suspend_automatically_after": { "message": "Tabs automatisch aussetzen nach" }, - "html_options_suspend_never": { "message": "Nie" }, - "html_options_suspend_seconds": { "message": "Sekunden" }, - "html_options_suspend_minute": { "message": "Min." }, - "html_options_suspend_minutes": { "message": "Minuten" }, - "html_options_suspend_hour": { "message": "Stunde" }, - "html_options_suspend_hours": { "message": "Stunden" }, - "html_options_suspend_day": { "message": "Tag" }, - "html_options_suspend_days": { "message": "Tage" }, - "html_options_suspend_week": { "message": "Woche" }, - "html_options_suspend_weeks": { "message": "Wochen" }, - "html_options_suspend_no_pinned": { "message": "Gepinnte Tabs nicht aussetzen" }, - "html_options_suspend_no_forms": { "message": "Tabs mit ungespeicherten Formularen nicht aussetzen" }, - "html_options_suspend_no_audio": { "message": "Tabs mit Audiowiedergabe nicht aussetzen" }, - "html_options_suspend_only_connected": { "message": "Tabs nicht aussetzen im Offline-Modus" }, - "html_options_suspend_only_on_battery": { "message": "Tabs nicht aussetzen bei aktiver Stromversorgung" }, - "html_options_suspend_no_active_tabs": { "message": "Aktive Tabs in jedem Fenster nicht aussetzen" }, - "html_options_suspend_automatically_unsuspend": { "message": "Tab automatisch aufwachen, wenn er aufgerufen wird" }, - "html_options_suspend_discard_after_suspend": { "message": "Benutze integrierte Speicherfunktion von Chrome beim Aussetzen" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Reduziert den Speicherverbrauch eines Tabs dank" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "der integrierten \"Tab verwerfen\" Funktion in Chrome. Das kann bis" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "zu 500% mehr Speicher sparen, wenn man eine Vielzahl von Tabs geöffnet hat." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "Das kann aber auch zu kurzen Darstellungsdauern führen beim Auswählen" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "eines ausgesetzten Tabs." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "Mehr Informationen über diese Funktionalität gibt es hier:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "Aussehen" }, - "html_options_suspend_theme_light": { "message": "hell" }, - "html_options_suspend_theme_dark": { "message": "dunkel" }, - "html_options_suspend_screen_capturing": { "message": "Bildschirmaufnahme" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Gesperrt" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Nur oberen Bereich aufnehmen" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Ganze Seite aufnehmen" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "Die Erweiterung kann eine Vorschau des ausgesetzten Tabs anzeigen," }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "die zeigt, wie der Tab vor dem Aussetzen aussah." }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "Diese experimentelle Einstellung kann für signifikante CPU-Last und" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "erhöhte Speicherbelegung sorgen." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Wenn sich Tabs stark verzögert aussetzen lassen oder Chrome" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "unerwartet abstürzt, solltest du diese Einstellung deaktivieren." }, - "html_options_suspend_force_screen_capture": { "message": "Hochwertige Bildschirmaufnahmen aktivieren" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Wenn inaktiv, dann haben Bildschirmaufnahmen die folgenden Einschränkungen zur Leistungsverbesserung:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- Bildschirmaufnahmen in niedriger Qualtität" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- keine Bildschirmaufnahme, wenn es länger als 1 Minute dauert, das Bild zu erstellen" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- maximale Höhe der Bildschirmaufnahme limitiert auf 5000px" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Aktivieren der hochwertigen Bildschirmaufnahmen kann signifikant die CPU-Last" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "und den Speicherverbrauch erhöhen." }, - "html_options_whitelist_title": { "message": "Tabs mit URL aus der Ausnahmeliste nicht aussetzen:" }, - "html_options_whitelist_tooltip_line1": { "message": "Füge die URL jeder Seite, die zugelassen werden soll in eine eigene Zeile. Zum Beispiel:" }, - "html_options_whitelist_tooltip_line2": { "message": "Um mehrere Seiten in einer Zeile zuzulassen, kannst du stattdessen einen Teil der URL angeben:" }, - "html_options_whitelist_tooltip_line3": { "message": "Du kannst auch reguläre Ausdrücke verwenden, wenn der Text von Schrägstrichen eingeschlossen ist:" }, - "html_options_whitelist_test": { "message": "Zulässige Seiten testen" }, - "html_options_other_enable_context_menu": { "message": "Füge The Great Suspender zum Rechtsklick-Kontextmenü hinzu" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Macht Einstellungen der Erweiterung im Rechtsklick-Kontextmenü einer Webseite verfügbar." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Das ermöglicht den Zugriff auf umfangreichere Aktionen, die sonst" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "nicht in der Erweiterung zu finden sind." }, - "html_options_other_enable_sync": { "message": "Synchronisiere die Einstellungen mit deinem Chrome Profil" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "Einstellungen der Erweiterung werden zu allen Chrome Browsern synchronisiert," }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "auf denen das gleiche Profil angemeldet ist." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Das synchronisiert die Einstellungen auch für den Inkognitomodus." }, - "html_options_other_enable_sync_warning": { "message": "Diese Option wird die Einstellungen für alle Browser mit dem gleichen Chrome Profil überschreiben" }, - "html_options_suspend_on_low_memory": { "message": "Bei geringer Speicherverfügbarkeit sofort aussetzen" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "Diese Option wird die automatische Tab verwerfen Funktion von Chrome ausschalten." }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "Ist sie aktiv, wird ein Tab ausgesetzt statt verworfen." }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "Typischerweise wird Chrome Tabs nur bei geringer Speicherverfügbarkeit verwerfen." }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "Hinweis: Das kann Tabs früher aussetzen als" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "in den Einstellung für automatisches Tab aussetzen." }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "Mehr Informationen zu Chromes Verwerfen Funktionalität findest du unter:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "Diesen Tab aufwachen" }, - "html_popup_suspend_tab": { "message": "Diesen Tab jetzt aussetzen" }, - "html_popup_dont_suspend_now": { "message": "Jetzt nicht aussetzen" }, - "html_popup_never_suspend_domain": { "message": "Diese Domain nicht aussetzen" }, - "html_popup_never_suspend_page": { "message": "Diese URL nicht aussetzen" }, - "html_popup_suspend_other_tabs": { "message": "Alle anderen Tabs aussetzen" }, - "html_popup_unsuspend_all_tabs": { "message": "Alle Tabs aufwachen" }, - "html_popup_suspend_selected_tabs": { "message": "Ausgewählte Tabs aussetzen" }, - "html_popup_unsuspend_selected_tabs": { "message": "Ausgewählte Tabs aufwachen" }, - "html_popup_settings": { "message": "Einstellungen" }, - "html_restoring_title": { "message": "Fenster wird wiederhergestellt" }, - "html_restoring_heading": { "message": "Tabs wiederherstellen" }, - "html_restoring_detail": { "message": "Bitte warten Sie, bis ich dieses Fenster wiederhergestellt habe..." }, - "html_recovery_title": { "message": "Wiederherstellung" }, - "html_recovery_ruh_roh": { "message": "Oh oh!" }, - "html_recovery_description_line1": { "message": "Es sieht so aus als wäre die Erweiterung abgestürzt." }, - "html_recovery_description_line2": { "message": "Deine ausgesetzten Tabs sind abgestürzt oder verschwunden." }, - "html_recovery_restore_tabs_automatically": { "message": "Tabs automatisch wiederherstellen" }, - "html_recovery_go_to_session_manager": { "message": "Gehe zur Sitzungsverwaltung" }, - "html_recovery_important_message": { "message": "Aktuell ist die Bildschirmaufnahme aktiv. Sollte diese Erweiterung häufig abstürzen, solltest du diese Option deaktivieren." }, - "html_recovery_disable_screen_capturing": { "message": "Bildschirmaufnahme deaktivieren" }, - "html_recovery_tabs_to_restore": { "message": "Tabs zur Wiederherstellung" }, - "html_shortcuts_title": { "message": "Tastenkombinationen" }, - "html_shortcuts_keyboard_shortcuts": { "message": "Tastenkombinationen" }, - "html_shortcuts_context_menu_note": { "message": "Hinweis: Diese Aktionen sind auch über das Rechtsklick-Kontextmenü verfügbar." }, - "html_shortcuts_remap_keys": { "message": "Tastenkombinationen ändern" }, - "html_sidebar_general_settings": { "message": "Einstellungen" }, - "html_sidebar_session_management": { "message": "Sitzungsverwaltung" }, - "html_sidebar_shortcuts": { "message": "Tastenkombinationen" }, - "html_sidebar_support": { "message": "Über" }, - "html_success_great_success": { "message": "Großartig!" }, - "html_success_all_tabs_restored": { "message": "Alles Tabs wurden wiederhergestellt." }, - "html_success_goto_advanced_prefix": { "message": "Für eine erweitertete Sitzungsverwaltung, öffne die" }, - "html_success_goto_advanced_suffix": { "message": "Seite" }, - "html_session_manager": { "message": "Sitzungsverwaltung" }, - "html_suspended_title": { "message": "Ausgesetzter Tab" }, - "html_suspended_tab_suspended": { "message": "Tab ausgesetzt" }, - "html_suspended_tab_reload": { "message": "Tab neu laden" }, - "html_suspended_tab_whitelist_prefix": { "message": "Nicht aussetzen" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "Aktualisieren oder Klicken zum Neuladen" }, - "html_suspended_toast_not_connected": { "message": "Du bist nicht mit dem Internet verbunden." }, - "html_suspended_toast_reload_disabled": { "message": "Automatische Tab Aktualisierung ist temporär deaktiviert." }, - "html_permissions_title": { "message": "Berechtigungen" }, - "html_permissions_heading": { "message": "Bitte erlaube Zugriff auf lokale (Datei-) URLs" }, - "html_permissions_info": { "message": "Diese Erweiterung darf derzeit keine URLs aussetzen, die beginnen mit: \"file\".\nUm das zu ändern, aktiviere \"Zugriff auf lokale (Datei-) URLs\" in den Einstellungen der Erweiterung." }, - "html_permissions_backup": { "message": "Hinweis: Das Ändern der Option lässt deine ausgesetzten Tabs kurz verschwinden.\nFür den Fall der Fälle solltest du jetzt eine Sicherung der aktuellen Sitzung anlegen." }, - "html_update_title": { "message": "Aktualisierung" }, - "html_update_heading2": { "message": "wird jetzt noch besser" }, - "html_update_info": { "message": "Eine neue Version von The Great Suspender kann installiert werden.\nHinweis: Während der Aktualisierung verschwinden die ausgesetzten Tabs für kurze Zeit." }, - "html_update_info_withbackup": { "message": "Für den Fall der Fälle solltest du eine Sicherung der aktuellen Sitzung anlegen." }, - "html_update_info_nobackup_prefix": { "message": "Empfehlung: exportiere eine Kopie deiner aktuellen Sitzung von " }, - "html_update_info_nobackup_suffix": { "message": " bevor du die Aktualisierung durchführst." }, - "html_updated_title": { "message": "Aktualisiert" }, - "html_updating_heading": { "message": "wird aktualisiert" }, - "html_updating_message": { "message": "Bitte warte, während die ausgesetzten Tabs wiederhergestellt werden..." }, - "html_updated_great_suspender_updated": { "message": "wurde aktualisiert" }, - "html_updated_info_line1": { "message": "Eine automatische Sicherung deiner Tabs wurde vor der Aktualisierung angelegt." }, - "html_updated_info_line2_prefix": { "message": "Sollte etwas während der Aktualisierung schief gehen, öffne die" }, - "html_updated_info_line2_suffix": { "message": " Seite." }, - "html_updated_detail_header_prefix": { "message": "Was ist neu in " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_new_features_header": { "message": "Neue Funktionen:" }, - "html_updated_bug_fixes_header": { "message": "Fehlerbehebungen:" }, - "html_updated_release_notes": { "message": "Besuche GitHub für alle Änderungen: " }, - "html_updated_patch_message": { "message": "Entschuldige die Störung. Es wurden Wartungsarbeiten durchgeführt." }, - "html_welcome_title": { "message": "Willkommen!" }, - "html_welcome_text_line1": { "message": "Danke fürs Ausprobieren." }, - "html_welcome_text_line2": { "message": "Ich lasse deinen Computer geschmeidiger laufen indem ich Tabs aussetze, die du nicht benutzt." }, - "html_welcome_text_line3": { "message": "Du kannst unten die Einstellungen verändern." }, - "html_thanks_title": { "message": "Danke" }, - "html_thanks_header": { "message": "Danke für deine Unterstützung!" }, - "html_thanks_sub_header": { "message": "Mögen dir großartige Dinge geschehen." }, - "js_popup_normal": { "message": "Tab wird automatisch ausgesetzt." }, - "js_popup_normal_pause": { "message": "Nicht jetzt" }, - "js_popup_special": { "message": "Tab kann nicht ausgesetzt werden" }, - "js_popup_suspended": { "message": "Tab ausgesetzt" }, - "js_popup_suspended_pause": { "message": "Nicht aussetzen" }, - "js_popup_whitelisted": { "message": "Seite zur Ausnahmeliste hinzugefügt." }, - "js_popup_whitelisted_remove": { "message": "Von Ausnahmeliste entfernen" }, - "js_popup_audible": { "message": "Audiowiedergabe in diesem Tab." }, - "js_popup_form_input": { "message": "Formulareingabe in diesem Tab." }, - "js_popup_form_input_unpause": { "message": "Fortführen" }, - "js_popup_pinned": { "message": "Tab wurde gepinnt" }, - "js_popup_temp_whitelist": { "message": "Aussetzen pausiert." }, - "js_popup_temp_whitelist_unpause": { "message": "Fortführen" }, - "js_popup_never": { "message": "Automatisches Aussetzen ist deaktiviert." }, - "js_popup_no_connectivity": { "message": "Keine Netzwerkverbindung" }, - "js_popup_charging": { "message": "Stromversorgung ist aktiv" }, - "js_popup_blockedFile": { "message": "Lokale Dateien können nicht ausgesetzt werden." }, - "js_popup_blockedFile_enable": { "message": "Aktivieren" }, - "js_popup_unknown": { "message": "Lade den Tab..." }, - "js_popup_initialising": { "message": "Initialisiere die Erweiterung..." }, - "js_popup_error": { "message": "Automatisches Aussetzen für diesen Tab nicht verfügbar" }, - "js_history_delete": { "message": "löschen" }, - "js_history_export": { "message": "exportieren" }, - "js_history_reload": { "message": "neu laden" }, - "js_history_resuspend": { "message": "wieder aussetzen" }, - "js_history_save": { "message": "speichern" }, - "js_history_window": { "message": "Fenster" }, - "js_history_tab": { "message": "Tab" }, - "js_history_plural": { "message": "s" }, - "js_history_enter_name_for_session": { "message": "Benenne diese Sitzung" }, - "js_history_confirm_delete": { "message": "Bist du sicher, dass du diese Sitzung löschen willst?" }, - "js_history_confirm_session_overwrite": { "message": "Es gibt bereits eine gespeicherte Sitzung mit diesem Namen. Bestehende Sitzung überschreiben?" }, - "js_history_import_fail": { "message": "Datei konnte nicht geladen werden. Stelle sicher, dass es eine Textdatei ist und sie eine URL pro Zeile enthält." }, - "js_suspended_remove_from_whitelist": { "message": "Seite aus Ausnahmeliste entfernen" }, - "js_suspended_hotkey_to_reload": { "message": "Tastenkombination setzen" }, - "js_suspended_low_memory": { "message": "Tab ausgesetzt aufgrund von niedrigem Speicher" }, - "js_options_incognito_warning": { "message": "Du bist im Inkognitomodus. Einige Funktionen sind nicht verfügbar." }, - "js_options_whitelist_no_matches": { "message": "Es sind keine offenen Seiten vorhanden, die den aktuell zulässigen Seiten entsprechen." }, - "js_options_whitelist_matches_heading": { "message": "Erlaubte offene Seiten:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "und" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "weitere." }, - "js_permissions_button_export": { "message": "Sicherung anlegen" }, - "js_permissions_button_set": { "message": "Einstellungen öffnen" }, - "js_update_confirm": { "message": "Es existiert keine Sicherung. Erweiterung trotzdem aktualisieren?" }, - "js_update_button_export": { "message": "Sicherung anlegen" }, - "js_update_button_reload": { "message": "Erweiterung jetzt aktualisieren" }, - "js_shortcuts_not_set": { "message": "nicht gesetzt" }, - "js_session_save_point": { "message": "Automatischer Sicherungspunkt für v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Lass deinen Computer geschmeidiger laufen, in dem du Tabs aussetzen lässt, die du nicht benutzt" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Aktiven Tab aussetzen/aufwachen" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Aussetzen des aktiven Tabs pausieren/fortführen" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Ausgewählte Tabs aussetzen" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Ausgewählte Tabs aufwachen" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Alle anderen Tabs im aktiven Fenster aussetzen" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Alle anderen Tabs im aktiven Fenster aussetzen (forcieren)" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Alle Tabs in diesem Fenster aufwachen" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Alle Tabs in allen Fenstern aussetzen" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Alle Tabs in allen Fenstern aussetzen (forcieren)" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Alle Tabs in allen Fenstern aufwachen" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Öffne Link in neuem ausgesetztem Tab" + }, + "js_context_toggle_suspend_state": { + "message": "Diesen Tab aussetzen/aufwachen" + }, + "js_context_toggle_pause_suspension": { + "message": "Aussetzen dieses Tabs pausieren/fortführen" + }, + "js_context_never_suspend_domain": { + "message": "Diese Domain nicht aussetzen" + }, + "js_context_never_suspend_page": { + "message": "Diese URL nicht aussetzen" + }, + "js_context_suspend_selected_tabs": { + "message": "Ausgewählte Tabs aussetzen" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Ausgewählte Tabs aufwachen" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Alle anderen Tabs in diesem Fenster aussetzen" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Alle anderen Tabs in diesem Fenster aussetzen (forcieren)" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Alle Tabs in diesem Fenster aufwachen" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Alle Tabs in allen Fenstern aussetzen" + }, + "js_context_force_suspend_all_tabs": { + "message": "Alle Tabs in allen Fenstern aussetzen (forcieren)" + }, + "js_context_unsuspend_all_tabs": { + "message": "Alle Tabs in allen Fenstern aufwachen" + }, + "html_about_title": { + "message": "Über" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking (more information available on" + }, + "html_about_fork_end": { + "message": ")" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Wenn du Feedback hast oder einen Fehler melden möchtest, melde das auf der" + }, + "html_about_report_issues_suffix": { + "message": ". Bitte prüfe vorab, ob deine Idee oder dein Fehler schon gemeldet wurde. Danke!" + }, + "html_about_debugging_prefix": { + "message": "Um die Protokollierung zu aktivieren oder Debugging-Flags festzulegen, gehen Sie auf die " + }, + "html_about_debugging_suffix": { + "message": "Debug-Seite." + }, + "html_about_the_github_issues_page": { + "message": "GitHub Projektseite" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Diese Erweiterung nutzt die" + }, + "html_about_html2canvas_suffix": { + "message": "Bibliothek, programmiert von Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Sie nutzt auch den indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "programmiert von Aaron Powell." + }, + "html_about_browserstack": { + "message": "browserstack" + }, + "html_about_browserstack_prefix": { + "message": "Ein weiterer Dank an" + }, + "html_about_browserstack_suffix": { + "message": "für die kostenlosen Chrome Testwerkzeuge." + }, + "html_history_title": { + "message": "Sitzungsverwaltung" + }, + "html_history_current_session": { + "message": "Aktuelle Sitzung" + }, + "html_history_recent_sessions": { + "message": "Kürzliche Sitzungen" + }, + "html_history_saved_sessions": { + "message": "Gespeicherte Sitzungen" + }, + "html_history_import_session": { + "message": "Sitzung importieren" + }, + "html_notice_title": { + "message": "Mitteilung" + }, + "html_notice_important_notice": { + "message": "Wichtige Mitteilung von The Marvellous Suspender" + }, + "html_options_title": { + "message": "Einstellungen" + }, + "html_options_suspend_title": { + "message": "Automatisches Tab Aussetzen" + }, + "html_options_suspended_title": { + "message": "Ausgesetzte Tabs" + }, + "html_options_other_title": { + "message": "Andere" + }, + "html_options_suspend_automatically_after": { + "message": "Tabs automatisch aussetzen nach" + }, + "html_options_suspend_never": { + "message": "Nie" + }, + "html_options_suspend_seconds": { + "message": "Sekunden" + }, + "html_options_suspend_minute": { + "message": "Min." + }, + "html_options_suspend_minutes": { + "message": "Minuten" + }, + "html_options_suspend_hour": { + "message": "Stunde" + }, + "html_options_suspend_hours": { + "message": "Stunden" + }, + "html_options_suspend_day": { + "message": "Tag" + }, + "html_options_suspend_days": { + "message": "Tage" + }, + "html_options_suspend_week": { + "message": "Woche" + }, + "html_options_suspend_weeks": { + "message": "Wochen" + }, + "html_options_suspend_no_pinned": { + "message": "Gepinnte Tabs nicht aussetzen" + }, + "html_options_suspend_no_forms": { + "message": "Tabs mit ungespeicherten Formularen nicht aussetzen" + }, + "html_options_suspend_no_audio": { + "message": "Tabs mit Audiowiedergabe nicht aussetzen" + }, + "html_options_suspend_only_connected": { + "message": "Tabs nicht aussetzen im Offline-Modus" + }, + "html_options_suspend_only_on_battery": { + "message": "Tabs nicht aussetzen bei aktiver Stromversorgung" + }, + "html_options_suspend_no_active_tabs": { + "message": "Aktive Tabs in jedem Fenster nicht aussetzen" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Tab automatisch aufwachen, wenn er aufgerufen wird" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Benutze integrierte Speicherfunktion von Chrome beim Aussetzen" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduziert den Speicherverbrauch eines Tabs dank" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "der integrierten \"Tab verwerfen\" Funktion in Chrome. Das kann bis" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "zu 500% mehr Speicher sparen, wenn man eine Vielzahl von Tabs geöffnet hat." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Das kann aber auch zu kurzen Darstellungsdauern führen beim Auswählen" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "eines ausgesetzten Tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Mehr Informationen über diese Funktionalität gibt es hier:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Aussehen" + }, + "html_options_suspend_theme_light": { + "message": "hell" + }, + "html_options_suspend_theme_dark": { + "message": "dunkel" + }, + "html_options_suspend_screen_capturing": { + "message": "Bildschirmaufnahme" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Gesperrt" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Nur oberen Bereich aufnehmen" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Ganze Seite aufnehmen" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Die Erweiterung kann eine Vorschau des ausgesetzten Tabs anzeigen," + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "die zeigt, wie der Tab vor dem Aussetzen aussah." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "Diese experimentelle Einstellung kann für signifikante CPU-Last und" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "erhöhte Speicherbelegung sorgen." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Wenn sich Tabs stark verzögert aussetzen lassen oder Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "unerwartet abstürzt, solltest du diese Einstellung deaktivieren." + }, + "html_options_suspend_force_screen_capture": { + "message": "Hochwertige Bildschirmaufnahmen aktivieren" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Wenn inaktiv, dann haben Bildschirmaufnahmen die folgenden Einschränkungen zur Leistungsverbesserung:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Bildschirmaufnahmen in niedriger Qualtität" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- keine Bildschirmaufnahme, wenn es länger als 1 Minute dauert, das Bild zu erstellen" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- maximale Höhe der Bildschirmaufnahme limitiert auf 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Aktivieren der hochwertigen Bildschirmaufnahmen kann signifikant die CPU-Last" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "und den Speicherverbrauch erhöhen." + }, + "html_options_whitelist_title": { + "message": "Tabs mit URL aus der Ausnahmeliste nicht aussetzen:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Füge die URL jeder Seite, die zugelassen werden soll in eine eigene Zeile. Zum Beispiel:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Um mehrere Seiten in einer Zeile zuzulassen, kannst du stattdessen einen Teil der URL angeben:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Du kannst auch reguläre Ausdrücke verwenden, wenn der Text von Schrägstrichen eingeschlossen ist:" + }, + "html_options_whitelist_test": { + "message": "Zulässige Seiten testen" + }, + "html_options_other_enable_context_menu": { + "message": "Füge The Marvellous Suspender zum Rechtsklick-Kontextmenü hinzu" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Macht Einstellungen der Erweiterung im Rechtsklick-Kontextmenü einer Webseite verfügbar." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Das ermöglicht den Zugriff auf umfangreichere Aktionen, die sonst" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "nicht in der Erweiterung zu finden sind." + }, + "html_options_other_enable_sync": { + "message": "Synchronisiere die Einstellungen mit deinem Chrome Profil" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Einstellungen der Erweiterung werden zu allen Chrome Browsern synchronisiert," + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "auf denen das gleiche Profil angemeldet ist." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Das synchronisiert die Einstellungen auch für den Inkognitomodus." + }, + "html_options_other_enable_sync_warning": { + "message": "Diese Option wird die Einstellungen für alle Browser mit dem gleichen Chrome Profil überschreiben" + }, + "html_options_suspend_on_low_memory": { + "message": "Bei geringer Speicherverfügbarkeit sofort aussetzen" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Diese Option wird die automatische Tab verwerfen Funktion von Chrome ausschalten." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Ist sie aktiv, wird ein Tab ausgesetzt statt verworfen." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Typischerweise wird Chrome Tabs nur bei geringer Speicherverfügbarkeit verwerfen." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Hinweis: Das kann Tabs früher aussetzen als" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "in den Einstellung für automatisches Tab aussetzen." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Mehr Informationen zu Chromes Verwerfen Funktionalität findest du unter:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Diesen Tab aufwachen" + }, + "html_popup_suspend_tab": { + "message": "Diesen Tab jetzt aussetzen" + }, + "html_popup_dont_suspend_now": { + "message": "Jetzt nicht aussetzen" + }, + "html_popup_never_suspend_domain": { + "message": "Diese Domain nicht aussetzen" + }, + "html_popup_never_suspend_page": { + "message": "Diese URL nicht aussetzen" + }, + "html_popup_suspend_other_tabs": { + "message": "Alle anderen Tabs aussetzen" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Alle Tabs aufwachen" + }, + "html_popup_suspend_selected_tabs": { + "message": "Ausgewählte Tabs aussetzen" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Ausgewählte Tabs aufwachen" + }, + "html_popup_settings": { + "message": "Einstellungen" + }, + "html_restoring_title": { + "message": "Fenster wird wiederhergestellt" + }, + "html_restoring_heading": { + "message": "Tabs wiederherstellen" + }, + "html_restoring_detail": { + "message": "Bitte warten Sie, bis ich dieses Fenster wiederhergestellt habe..." + }, + "html_recovery_title": { + "message": "Wiederherstellung" + }, + "html_recovery_ruh_roh": { + "message": "Oh oh!" + }, + "html_recovery_description_line1": { + "message": "Es sieht so aus als wäre die Erweiterung abgestürzt." + }, + "html_recovery_description_line2": { + "message": "Deine ausgesetzten Tabs sind abgestürzt oder verschwunden." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Tabs automatisch wiederherstellen" + }, + "html_recovery_go_to_session_manager": { + "message": "Gehe zur Sitzungsverwaltung" + }, + "html_recovery_important_message": { + "message": "Aktuell ist die Bildschirmaufnahme aktiv. Sollte diese Erweiterung häufig abstürzen, solltest du diese Option deaktivieren." + }, + "html_recovery_disable_screen_capturing": { + "message": "Bildschirmaufnahme deaktivieren" + }, + "html_recovery_tabs_to_restore": { + "message": "Tabs zur Wiederherstellung" + }, + "html_shortcuts_title": { + "message": "Tastenkombinationen" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Tastenkombinationen" + }, + "html_shortcuts_context_menu_note": { + "message": "Hinweis: Diese Aktionen sind auch über das Rechtsklick-Kontextmenü verfügbar." + }, + "html_shortcuts_remap_keys": { + "message": "Tastenkombinationen ändern" + }, + "html_sidebar_general_settings": { + "message": "Einstellungen" + }, + "html_sidebar_session_management": { + "message": "Sitzungsverwaltung" + }, + "html_sidebar_shortcuts": { + "message": "Tastenkombinationen" + }, + "html_sidebar_support": { + "message": "Über" + }, + "html_success_great_success": { + "message": "Großartig!" + }, + "html_success_all_tabs_restored": { + "message": "Alles Tabs wurden wiederhergestellt." + }, + "html_success_goto_advanced_prefix": { + "message": "Für eine erweitertete Sitzungsverwaltung, öffne die" + }, + "html_success_goto_advanced_suffix": { + "message": "Seite" + }, + "html_session_manager": { + "message": "Sitzungsverwaltung" + }, + "html_suspended_title": { + "message": "Ausgesetzter Tab" + }, + "html_suspended_tab_suspended": { + "message": "Tab ausgesetzt" + }, + "html_suspended_tab_reload": { + "message": "Tab neu laden" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Nicht aussetzen" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Aktualisieren oder Klicken zum Neuladen" + }, + "html_suspended_toast_not_connected": { + "message": "Du bist nicht mit dem Internet verbunden." + }, + "html_suspended_toast_reload_disabled": { + "message": "Automatische Tab Aktualisierung ist temporär deaktiviert." + }, + "html_permissions_title": { + "message": "Berechtigungen" + }, + "html_permissions_heading": { + "message": "Bitte erlaube Zugriff auf lokale (Datei-) URLs" + }, + "html_permissions_info": { + "message": "Diese Erweiterung darf derzeit keine URLs aussetzen, die beginnen mit: \"file\".\nUm das zu ändern, aktiviere \"Zugriff auf lokale (Datei-) URLs\" in den Einstellungen der Erweiterung." + }, + "html_permissions_backup": { + "message": "Hinweis: Das Ändern der Option lässt deine ausgesetzten Tabs kurz verschwinden.\nFür den Fall der Fälle solltest du jetzt eine Sicherung der aktuellen Sitzung anlegen." + }, + "html_update_title": { + "message": "Aktualisierung" + }, + "html_update_heading2": { + "message": "wird jetzt noch besser" + }, + "html_update_info": { + "message": "Eine neue Version von The Marvellous Suspender kann installiert werden.\nHinweis: Während der Aktualisierung verschwinden die ausgesetzten Tabs für kurze Zeit." + }, + "html_update_info_withbackup": { + "message": "Für den Fall der Fälle solltest du eine Sicherung der aktuellen Sitzung anlegen." + }, + "html_update_info_nobackup_prefix": { + "message": "Empfehlung: exportiere eine Kopie deiner aktuellen Sitzung von " + }, + "html_update_info_nobackup_suffix": { + "message": " bevor du die Aktualisierung durchführst." + }, + "html_updated_title": { + "message": "Aktualisiert" + }, + "html_updating_heading": { + "message": "wird aktualisiert" + }, + "html_updating_message": { + "message": "Bitte warte, während die ausgesetzten Tabs wiederhergestellt werden..." + }, + "html_updated_great_suspender_updated": { + "message": "wurde aktualisiert" + }, + "html_updated_info_line1": { + "message": "Eine automatische Sicherung deiner Tabs wurde vor der Aktualisierung angelegt." + }, + "html_updated_info_line2_prefix": { + "message": "Sollte etwas während der Aktualisierung schief gehen, öffne die" + }, + "html_updated_info_line2_suffix": { + "message": " Seite." + }, + "html_updated_detail_header_prefix": { + "message": "Was ist neu in " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Neue Funktionen:" + }, + "html_updated_bug_fixes_header": { + "message": "Fehlerbehebungen:" + }, + "html_updated_release_notes": { + "message": "Besuche GitHub für alle Änderungen: " + }, + "html_updated_patch_message": { + "message": "Entschuldige die Störung. Es wurden Wartungsarbeiten durchgeführt." + }, + "html_welcome_title": { + "message": "Willkommen!" + }, + "html_welcome_text_line1": { + "message": "Danke fürs Ausprobieren." + }, + "html_welcome_text_line2": { + "message": "Ich lasse deinen Computer geschmeidiger laufen indem ich Tabs aussetze, die du nicht benutzt." + }, + "html_welcome_text_line3": { + "message": "Du kannst unten die Einstellungen verändern." + }, + "js_popup_normal": { + "message": "Tab wird automatisch ausgesetzt." + }, + "js_popup_normal_pause": { + "message": "Nicht jetzt" + }, + "js_popup_special": { + "message": "Tab kann nicht ausgesetzt werden" + }, + "js_popup_suspended": { + "message": "Tab ausgesetzt" + }, + "js_popup_suspended_pause": { + "message": "Nicht aussetzen" + }, + "js_popup_whitelisted": { + "message": "Seite zur Ausnahmeliste hinzugefügt." + }, + "js_popup_whitelisted_remove": { + "message": "Von Ausnahmeliste entfernen" + }, + "js_popup_audible": { + "message": "Audiowiedergabe in diesem Tab." + }, + "js_popup_form_input": { + "message": "Formulareingabe in diesem Tab." + }, + "js_popup_form_input_unpause": { + "message": "Fortführen" + }, + "js_popup_pinned": { + "message": "Tab wurde gepinnt" + }, + "js_popup_temp_whitelist": { + "message": "Aussetzen pausiert." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Fortführen" + }, + "js_popup_never": { + "message": "Automatisches Aussetzen ist deaktiviert." + }, + "js_popup_no_connectivity": { + "message": "Keine Netzwerkverbindung" + }, + "js_popup_charging": { + "message": "Stromversorgung ist aktiv" + }, + "js_popup_blockedFile": { + "message": "Lokale Dateien können nicht ausgesetzt werden." + }, + "js_popup_blockedFile_enable": { + "message": "Aktivieren" + }, + "js_popup_unknown": { + "message": "Lade den Tab..." + }, + "js_popup_initialising": { + "message": "Initialisiere die Erweiterung..." + }, + "js_popup_error": { + "message": "Automatisches Aussetzen für diesen Tab nicht verfügbar" + }, + "js_history_delete": { + "message": "löschen" + }, + "js_history_export": { + "message": "exportieren" + }, + "js_history_reload": { + "message": "neu laden" + }, + "js_history_resuspend": { + "message": "wieder aussetzen" + }, + "js_history_save": { + "message": "speichern" + }, + "js_history_window": { + "message": "Fenster" + }, + "js_history_tab": { + "message": "Tab" + }, + "js_history_plural": { + "message": "s" + }, + "js_history_enter_name_for_session": { + "message": "Benenne diese Sitzung" + }, + "js_history_confirm_delete": { + "message": "Bist du sicher, dass du diese Sitzung löschen willst?" + }, + "js_history_confirm_session_overwrite": { + "message": "Es gibt bereits eine gespeicherte Sitzung mit diesem Namen. Bestehende Sitzung überschreiben?" + }, + "js_history_import_fail": { + "message": "Datei konnte nicht geladen werden. Stelle sicher, dass es eine Textdatei ist und sie eine URL pro Zeile enthält." + }, + "js_suspended_remove_from_whitelist": { + "message": "Seite aus Ausnahmeliste entfernen" + }, + "js_suspended_hotkey_to_reload": { + "message": "Tastenkombination setzen" + }, + "js_suspended_low_memory": { + "message": "Tab ausgesetzt aufgrund von niedrigem Speicher" + }, + "js_options_incognito_warning": { + "message": "Du bist im Inkognitomodus. Einige Funktionen sind nicht verfügbar." + }, + "js_options_whitelist_no_matches": { + "message": "Es sind keine offenen Seiten vorhanden, die den aktuell zulässigen Seiten entsprechen." + }, + "js_options_whitelist_matches_heading": { + "message": "Erlaubte offene Seiten:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "und" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "weitere." + }, + "js_permissions_button_export": { + "message": "Sicherung anlegen" + }, + "js_permissions_button_set": { + "message": "Einstellungen öffnen" + }, + "js_update_confirm": { + "message": "Es existiert keine Sicherung. Erweiterung trotzdem aktualisieren?" + }, + "js_update_button_export": { + "message": "Sicherung anlegen" + }, + "js_update_button_reload": { + "message": "Erweiterung jetzt aktualisieren" + }, + "js_shortcuts_not_set": { + "message": "nicht gesetzt" + }, + "js_session_save_point": { + "message": "Automatischer Sicherungspunkt für v" + } } diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index d9b59ff2..b015ea57 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -1,7 +1,7 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, + "ext_extension_name": { "message": "The Marvellous Suspender" }, "ext_extension_description": { "message": "Make your computer run smoothly by suspending the tabs you aren't using" }, - "ext_default_title": { "message": "The Great Suspender" }, + "ext_default_title": { "message": "The Marvellous Suspender" }, "ext_cmd_toggle_tab_suspension_description": { "message": "Suspend/Unsuspend active tab" }, "ext_cmd_toggle_tab_pause_description": { "message": "Pause/Unpause suspension of active tab" }, "ext_cmd_suspend_selected_tabs_description": { "message": "Suspend selected tabs" }, @@ -26,7 +26,11 @@ "js_context_force_suspend_all_tabs": { "message": "Force suspend all tabs in all windows" }, "js_context_unsuspend_all_tabs": { "message": "Unsuspend all tabs in all windows" }, "html_about_title": { "message": "About" }, + "html_about_fork_beginning": { "message": "Based on the original" }, + "html_about_fork_mid": { "message": "available on GitHub, without ADS tracking (more information available on" }, + "html_about_fork_end": { "message": ")" }, "html_about_github_title": { "message": "GitHub" }, + "html_about_blog_title": { "message": "Blog" }, "html_about_twitter_title": { "message": "Twitter" }, "html_about_report_issues_prefix": { "message": "If you have feedback or would like to report an issue, you can do so on the" }, "html_about_report_issues_suffix": { "message": ". Please check to see if your idea or issue already exists before creating a new one. Thanks!" }, @@ -48,7 +52,7 @@ "html_history_saved_sessions": { "message": "Saved sessions" }, "html_history_import_session": { "message": "Import session" }, "html_notice_title": { "message": "Notice" }, - "html_notice_important_notice": { "message": "Important notice from The Great Suspender" }, + "html_notice_important_notice": { "message": "Important notice from The Marvellous Suspender" }, "html_options_title": { "message": "Settings" }, "html_options_suspend_title": { "message": "Automatic tab suspension" }, "html_options_suspended_title": { "message": "Suspended tabs" }, @@ -99,16 +103,12 @@ "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- Maximum height of screen capture limited to 5000px" }, "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Enabling high quality screen capture mode may significantly increase CPU load" }, "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "and memory usage." }, - "html_options_clean_screen_captures": { "message": "Clean screencaps" }, - "html_options_clean_screen_captures_line1": { "message": "Enabling this option will block advertisements and other annoyances during suspension of a tab." }, - "html_options_clean_screen_captures_line2": { "message": "This will help with the recongnizability of a screencaptured website and save resources." }, - "html_options_clean_screen_captures_line3": { "message": "It will make use of the following host block list: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts." }, "html_options_whitelist_title": { "message": "Never suspend tabs with URLs from the following list:" }, "html_options_whitelist_tooltip_line1": { "message": "Add the URL of each page you want to whitelist on a new line. For example:" }, "html_options_whitelist_tooltip_line2": { "message": "To whitelist multiple sites in one line you can specify part of the url instead:" }, "html_options_whitelist_tooltip_line3": { "message": "You can also specify regular expressions by enclosing the text in forward slashes:" }, "html_options_whitelist_test": { "message": "Test whitelist" }, - "html_options_other_enable_context_menu": { "message": "Add The Great Suspender to right-click context menu" }, + "html_options_other_enable_context_menu": { "message": "Add The Marvellous Suspender to right-click context menu" }, "html_options_other_enable_context_menu_tooltip_line1": { "message": "Add controls for this extension to the right-click menu of a web page." }, "html_options_other_enable_context_menu_tooltip_line2": { "message": "This will give you access to advanced suspending actions not available" }, "html_options_other_enable_context_menu_tooltip_line3": { "message": "elsewhere in the extension." }, @@ -117,8 +117,6 @@ "html_options_other_enable_sync_tooltip_line1b": { "message": "logged in with the same profile." }, "html_options_other_enable_sync_tooltip_line2": { "message": "This will also synchronise settings in incognito mode." }, "html_options_other_enable_sync_warning": { "message": "Turning this on will overwrite settings on all other browsers logged into the same Chrome profile" }, - "html_options_tracking_opt_out": { "message": "Automatic deactivation of any kind of tracking" }, - "html_options_tracking_opt_out_line1": { "message": "This option will disable tracking code, such as that from Google Analytics." }, "html_options_suspend_on_low_memory": { "message": "Instantly suspend when system memory gets very low" }, "html_options_suspend_on_low_memory_tooltip_line1": { "message": "This option will override Chrome's automatic tab discarding functionality." }, "html_options_suspend_on_low_memory_tooltip_line2": { "message": "If enabled, it will force a tab to suspend instead of being discarded by Chrome." }, @@ -157,7 +155,7 @@ "html_sidebar_session_management": { "message": "Session management" }, "html_sidebar_shortcuts": { "message": "Keyboard shortcuts" }, "html_sidebar_support": { "message": "About" }, - "html_success_great_success": { "message": "Great success!" }, + "html_success_great_success": { "message": "Marvellous success!" }, "html_success_all_tabs_restored": { "message": "All your tabs have been restored." }, "html_success_goto_advanced_prefix": { "message": "For advanced session management, visit the" }, "html_success_goto_advanced_suffix": { "message": "page" }, @@ -176,7 +174,7 @@ "html_permissions_backup": { "message": "Please note: changing this option will cause all your suspended tabs will briefly disappear.\nJust in case, now might be a good time to save a backup of your current tab session." }, "html_update_title": { "message": "Update" }, "html_update_heading2": { "message": "is about to get greater" }, - "html_update_info": { "message": "A new version of The Great Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." }, + "html_update_info": { "message": "A new version of The Marvellous Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." }, "html_update_info_withbackup": { "message": "Just in case, now might be a good time to save a backup of your current tab session." }, "html_update_info_nobackup_prefix": { "message": "It is strongly recommended that you export a copy of your current session from " }, "html_update_info_nobackup_suffix": { "message": " before continuing with the update." }, diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json new file mode 100644 index 00000000..f1e4a683 --- /dev/null +++ b/src/_locales/it/messages.json @@ -0,0 +1,734 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Fai funzionare il computer senza intoppi sospendendo le schede che non stai usando" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Sospendi/Riattiva la scheda attiva" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Ferma/Riprendi la sospensione della scheda attiva" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Sospendi le schede selezionate" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Riattiva le schede selezionate" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Sospendi tutte le altre schede nella finestra attiva" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Forza la sospensione delle altre schede nella finestra attiva" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Riattiva tutte le schede nella finestra attiva" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Sospendi tutte le schede in ogni finestra" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Forza la sospensione di tutte le schede in ogni finestra" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Riattiva tutte le schede in ogni finestra" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Open Link in New Suspended Tab" + }, + "js_context_toggle_suspend_state": { + "message": "Sospendi/Riattiva questa scheda" + }, + "js_context_toggle_pause_suspension": { + "message": "Ferma/Riprendi la sospensione di questa scheda" + }, + "js_context_never_suspend_domain": { + "message": "Non sospendere mai questo dominio" + }, + "js_context_never_suspend_page": { + "message": "Non sospendere mai questo indirizzo" + }, + "js_context_suspend_selected_tabs": { + "message": "Sospendi le schede selezionate" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Riattiva le schede selezionate" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Sospendi tutte le altre schede in questa finestra" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Forza la sospensione delle altre schede in questa finestra" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Riattiva tutte le schede in questa finestra" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Sospendi tutte le schede in ogni finestra" + }, + "js_context_force_suspend_all_tabs": { + "message": "Forza la sospensione di tutte le schede in ogni finestra" + }, + "js_context_unsuspend_all_tabs": { + "message": "Riattiva tutte le schede in ogni finestra" + }, + "html_about_title": { + "message": "Informazioni" + }, + "html_about_fork_beginning": { + "message": "Basata sull'originale" + }, + "html_about_fork_mid": { + "message": "disponibile su GitHub, senza tracciamento pubblicitario (maggiori informazioni disponibili su" + }, + "html_about_fork_end": { + "message": ")" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "If you have feedback or would like to report an issue, you can do so on the" + }, + "html_about_report_issues_suffix": { + "message": ". Please check to see if your idea or issue already exists before creating a new one. Thanks!" + }, + "html_about_debugging_prefix": { + "message": "To enable logging, or to set debugging flags, go to the " + }, + "html_about_debugging_suffix": { + "message": "debug page." + }, + "html_about_the_github_issues_page": { + "message": "GitHub issues page" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "This extension uses the" + }, + "html_about_html2canvas_suffix": { + "message": "library written by Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "It also uses the indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "scritto da Aaron Powell." + }, + "html_about_browserstack": { + "message": "browserstack" + }, + "html_about_browserstack_prefix": { + "message": "Grazie inoltre a" + }, + "html_about_browserstack_suffix": { + "message": "for providing free chrome testing tools." + }, + "html_history_title": { + "message": "Session management" + }, + "html_history_current_session": { + "message": "Sessione corrente" + }, + "html_history_recent_sessions": { + "message": "Sessioni recenti" + }, + "html_history_saved_sessions": { + "message": "Sessioni salvate" + }, + "html_history_import_session": { + "message": "Importa sessione" + }, + "html_notice_title": { + "message": "Notice" + }, + "html_notice_important_notice": { + "message": "Important notice from The Marvellous Suspender" + }, + "html_options_title": { + "message": "Impostazioni" + }, + "html_options_suspend_title": { + "message": "Sospensione automatica delle schede" + }, + "html_options_suspended_title": { + "message": "Schede sospese" + }, + "html_options_other_title": { + "message": "Other" + }, + "html_options_suspend_automatically_after": { + "message": "Sospendi automaticamente le schede dopo" + }, + "html_options_suspend_never": { + "message": "Mai" + }, + "html_options_suspend_seconds": { + "message": "secondi" + }, + "html_options_suspend_minute": { + "message": "minuto" + }, + "html_options_suspend_minutes": { + "message": "minuti" + }, + "html_options_suspend_hour": { + "message": "ora" + }, + "html_options_suspend_hours": { + "message": "ore" + }, + "html_options_suspend_day": { + "message": "giorno" + }, + "html_options_suspend_days": { + "message": "giorni" + }, + "html_options_suspend_week": { + "message": "settimana" + }, + "html_options_suspend_weeks": { + "message": "settimane" + }, + "html_options_suspend_no_pinned": { + "message": "Non sospendere mai le schede fissate" + }, + "html_options_suspend_no_forms": { + "message": "Non sospendere le schede che contengono moduli compilati non salvati" + }, + "html_options_suspend_no_audio": { + "message": "Non sospendere mai le schede che stanno riproducendo audio" + }, + "html_options_suspend_only_connected": { + "message": "Non sospendere mai le schede quando non sei connesso a Internet" + }, + "html_options_suspend_only_on_battery": { + "message": "Non sospendere mai le schede quando il PC è collegato all'alimentazione" + }, + "html_options_suspend_no_active_tabs": { + "message": "Non sospendere mai la scheda attiva in ogni finestra" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Automatically unsuspend tab when it is viewed" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Apply Chrome's built-in memory-saving when suspending" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduces a suspended tab's memory usage even more, by utilizing" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "Chrome's built-in 'tab discarding' functionality. This can result in up" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "to 500% memory savings when working with large numbers of tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "However, it will also cause a slight rendering delay when selecting" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "a suspended tab." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Chiaro" + }, + "html_options_suspend_theme_dark": { + "message": "Scuro" + }, + "html_options_suspend_screen_capturing": { + "message": "Cattura dello schermo" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Disabilitata" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capture top of screen only" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Cattura l'intera pagina" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "On a suspended tab, the extension can display an image preview of the what the tab" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "looked like just before it was suspended." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "The screen capturing feature is experimental and can cause significant CPU usage as" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "well as slightly increased memory usage." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "If you notice strange behaviour such as tabs taking a long time to suspend, or chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crashing unexpectedly, try turning this feature off." + }, + "html_options_suspend_force_screen_capture": { + "message": "Abilita la modalità di cattura dello schermo in alta qualità" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "When disabled, screen captures have the following limitations to aid in performance:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Cattura dello schermo di bassa qualità" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Will not capture screen if it takes more than 1 minute to generate image" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Maximum height of screen capture limited to 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Enabling high quality screen capture mode may significantly increase CPU load" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "and memory usage." + }, + "html_options_whitelist_title": { + "message": "Non sospendere mai le schede contenenti i seguenti indirizzi:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Aggiungi l'indirizzo di ogni pagina che desideri inserire nella lista bianca, uno per riga. Per esempio:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Per autorizzare più siti in una riga puoi invece specificare una parte dell'indirizzo:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Puoi anche usare le espressioni regolari racchiudendo il testo tra due slash:" + }, + "html_options_whitelist_test": { + "message": "Verifica il funzionamento della lista bianca" + }, + "html_options_other_enable_context_menu": { + "message": "Aggiungi The Marvellous Suspender al menu contestuale del tasto destro del mouse" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Add controls for this extension to the right-click menu of a web page." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "This will give you access to advanced suspending actions not available" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "elsewhere in the extension." + }, + "html_options_other_enable_sync": { + "message": "Sync settings with your Chrome profile" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Extension settings will be synchronised across all chrome browsers which are" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "logged in with the same profile." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "This will also synchronise settings in incognito mode." + }, + "html_options_other_enable_sync_warning": { + "message": "Turning this on will overwrite settings on all other browsers logged into the same Chrome profile" + }, + "html_options_suspend_on_low_memory": { + "message": "Sospendi istantaneamente quando la memoria di sistema diventa molto bassa" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "This option will override Chrome's automatic tab discarding functionality." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Se abilitata, forzerà la sospensione di una scheda invece di essere scartata da Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Typically, Chrome will only discard tabs once system memory gets very low." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Please note: This may cause tabs to suspend earlier than the time you have" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "specified in the Automatic tab suspension options." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Riattiva questa scheda" + }, + "html_popup_suspend_tab": { + "message": "Sospendi questa scheda ora" + }, + "html_popup_dont_suspend_now": { + "message": "Non sospendere per ora" + }, + "html_popup_never_suspend_domain": { + "message": "Non sospendere mai questo dominio" + }, + "html_popup_never_suspend_page": { + "message": "Non sospendere mai questo indirizzo" + }, + "html_popup_suspend_other_tabs": { + "message": "Sospendi tutte le altre schede" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Riattiva tutte le schede" + }, + "html_popup_suspend_selected_tabs": { + "message": "Sospendi le schede selezionate" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Riattiva le schede selezionate" + }, + "html_popup_settings": { + "message": "Impostazioni" + }, + "html_restoring_title": { + "message": "Ripristino la finestra" + }, + "html_restoring_heading": { + "message": "Ripristino le schede" + }, + "html_restoring_detail": { + "message": "Please wait while I restore this window..." + }, + "html_recovery_title": { + "message": "Recovery" + }, + "html_recovery_ruh_roh": { + "message": "D'oh!" + }, + "html_recovery_description_line1": { + "message": "Looks like you're recovering from an extension crash." + }, + "html_recovery_description_line2": { + "message": "Your suspended tabs may have crashed or disappeared." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Ripristina automaticamente le schede" + }, + "html_recovery_go_to_session_manager": { + "message": "Go to session manager" + }, + "html_recovery_important_message": { + "message": "You currently have screen capturing turned on. If this extension is repeatedly crashing it is recommended you disable this option." + }, + "html_recovery_disable_screen_capturing": { + "message": "Turn off screen capturing" + }, + "html_recovery_tabs_to_restore": { + "message": "Tabs to restore" + }, + "html_shortcuts_title": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_context_menu_note": { + "message": "Note: These actions are also available via the right-click context menu." + }, + "html_shortcuts_remap_keys": { + "message": "Change shortcuts" + }, + "html_sidebar_general_settings": { + "message": "Impostazioni" + }, + "html_sidebar_session_management": { + "message": "Gestione delle sessioni" + }, + "html_sidebar_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_sidebar_support": { + "message": "Informazioni" + }, + "html_success_great_success": { + "message": "Meraviglioso successo!" + }, + "html_success_all_tabs_restored": { + "message": "Tutte le schede sono state ripristinate." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "gestione delle sessioni" + }, + "html_suspended_title": { + "message": "Schede sospese" + }, + "html_suspended_tab_suspended": { + "message": "Scheda sospesa" + }, + "html_suspended_tab_reload": { + "message": "Ricarica scheda" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Non sospendere mai" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Aggiorna o fai clic per ricaricare" + }, + "html_suspended_toast_not_connected": { + "message": "You are not connected to the internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "Automatic tab reloading is temporarily disabled." + }, + "html_permissions_title": { + "message": "Permissions" + }, + "html_permissions_heading": { + "message": "Per favore dammi accesso agli indirizzi dei file locali" + }, + "html_permissions_info": { + "message": "Questa estensione non è attualmente autorizzata a sospendere gli indirizzi che cominciano per \"file\".\nPer modificare questo comportamento attiva \"Consenti accesso agli indirizzi dei file\" dalla pagina delle impostazioni dell'estensione." + }, + "html_permissions_backup": { + "message": "Please note: changing this option will cause all your suspended tabs will briefly disappear.\nJust in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_title": { + "message": "Update" + }, + "html_update_heading2": { + "message": "is about to get greater" + }, + "html_update_info": { + "message": "A new version of The Marvellous Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." + }, + "html_update_info_withbackup": { + "message": "Just in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_info_nobackup_prefix": { + "message": "It is strongly recommended that you export a copy of your current session from " + }, + "html_update_info_nobackup_suffix": { + "message": " before continuing with the update." + }, + "html_updated_title": { + "message": "Updated" + }, + "html_updating_heading": { + "message": "è in aggiornamento" + }, + "html_updating_message": { + "message": "Please wait while I restore your suspended tabs..." + }, + "html_updated_great_suspender_updated": { + "message": "has been updated" + }, + "html_updated_info_line1": { + "message": "An automatic backup was made of your tabs before the update." + }, + "html_updated_info_line2_prefix": { + "message": "If you encountered any issues during the update, you can recover lost tabs from the " + }, + "html_updated_info_line2_suffix": { + "message": " page." + }, + "html_updated_detail_header_prefix": { + "message": "What's new in " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "New features:" + }, + "html_updated_bug_fixes_header": { + "message": "Bug fixes:" + }, + "html_updated_release_notes": { + "message": "Visita GitHub per le note di rilascio complete: " + }, + "html_updated_patch_message": { + "message": "Sorry for the disturbance. I just needed to perform a little maintenance." + }, + "html_welcome_title": { + "message": "Ciao" + }, + "html_welcome_text_line1": { + "message": "Grazie per aver provato" + }, + "html_welcome_text_line2": { + "message": "Faccio funzionare il computer senza intoppi sospendendo le schede che non stai usando." + }, + "html_welcome_text_line3": { + "message": "Puoi mettere a punto le impostazioni qui sotto." + }, + "js_popup_normal": { + "message": "La scheda verrà sospesa automaticamente." + }, + "js_popup_normal_pause": { + "message": "Non ora" + }, + "js_popup_special": { + "message": "La scheda non può essere sospesa" + }, + "js_popup_suspended": { + "message": "Tab suspended" + }, + "js_popup_suspended_pause": { + "message": "Non sospendere" + }, + "js_popup_whitelisted": { + "message": "Site whitelisted." + }, + "js_popup_whitelisted_remove": { + "message": "Remove from whitelist" + }, + "js_popup_audible": { + "message": "Tab is playing audio." + }, + "js_popup_form_input": { + "message": "Tab is receiving form input." + }, + "js_popup_form_input_unpause": { + "message": "Riprendi" + }, + "js_popup_pinned": { + "message": "La scheda è stata fissata" + }, + "js_popup_temp_whitelist": { + "message": "Sospensione della scheda disattivata." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Riprendi" + }, + "js_popup_never": { + "message": "Automatic tab suspension disabled." + }, + "js_popup_no_connectivity": { + "message": "No network connection" + }, + "js_popup_charging": { + "message": "Collegato all'alimentazione elettrica" + }, + "js_popup_blockedFile": { + "message": "I file locali non possono essere sospesi." + }, + "js_popup_blockedFile_enable": { + "message": "Abilita" + }, + "js_popup_unknown": { + "message": "Waiting for tab to load..." + }, + "js_popup_initialising": { + "message": "Waiting for extension to initialize..." + }, + "js_popup_error": { + "message": "Sospensione automatica non disponibile per questa scheda" + }, + "js_history_delete": { + "message": "cancella" + }, + "js_history_export": { + "message": "esporta" + }, + "js_history_reload": { + "message": "open and load" + }, + "js_history_resuspend": { + "message": "apri e sospendi" + }, + "js_history_save": { + "message": "salva" + }, + "js_history_window": { + "message": "Finestra" + }, + "js_history_tab": { + "message": "Scheda" + }, + "js_history_plural": { + "message": "s" + }, + "js_history_enter_name_for_session": { + "message": "Inserisci un nome per questa sessione" + }, + "js_history_confirm_delete": { + "message": "Sei sicuro di voler eliminare questa sessione?" + }, + "js_history_confirm_session_overwrite": { + "message": "There is already a saved session with this name. Overwrite existing session?" + }, + "js_history_import_fail": { + "message": "Caricamento del file non riuscito. Assicurati che il file sia composto da puro testo e che contenga un singolo indirizzo per riga." + }, + "js_suspended_remove_from_whitelist": { + "message": "Rimuovi sito dalla lista bianca" + }, + "js_suspended_hotkey_to_reload": { + "message": "Set keyboard shortcuts" + }, + "js_suspended_low_memory": { + "message": "Tab suspended due to low system memory" + }, + "js_options_incognito_warning": { + "message": "You are in incognito mode. Some features will not be available." + }, + "js_options_whitelist_no_matches": { + "message": "Non ci sono schede aperte che corrispondono all'attuale lista bianca." + }, + "js_options_whitelist_matches_heading": { + "message": "Whitelisted open tabs:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "e" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "altro." + }, + "js_permissions_button_export": { + "message": "Salva backup" + }, + "js_permissions_button_set": { + "message": "Open extension settings" + }, + "js_update_confirm": { + "message": "You have not saved a backup yet. Update the extension anyway?" + }, + "js_update_button_export": { + "message": "Salva backup" + }, + "js_update_button_reload": { + "message": "Aggiorna l'estensione ora" + }, + "js_shortcuts_not_set": { + "message": "not set" + }, + "js_session_save_point": { + "message": "Automatic save point for v" + } +} diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index 73eda089..10757864 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -1,242 +1,734 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Faça o seu computador funcionar sem problemas suspendendo as guias que você não está usando" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Suspender/Recarregar a guia ativa" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Pausar/Retomar suspensão da guia ativa" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Suspender guias selecionadas" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Recarregar guias selecionadas" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Suspender todas as outras guias na janela ativa" }, - "ext_cmd_force_suspend_active_window_description": { "message": "Forçar suspender todas as outras guias na janela ativa" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Recarregar todas as guias na janela ativa" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Suspender todas as guias em todas as janelas" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Forçar suspensão de todas as guias em todas as janelas" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Recarregar todas as guias em todas as janelas" }, - "js_context_open_link_in_suspended_tab": { "message": "Abrir Link em Nova Guia Suspensa" }, - "js_context_toggle_suspend_state": { "message": "Suspender/Recarregar esta guia" }, - "js_context_toggle_pause_suspension": { "message": "Pausar/Retomar a suspensão desta guia" }, - "js_context_never_suspend_domain": { "message": "Nunca suspender este domínio" }, - "js_context_never_suspend_page": { "message": "Nunca suspender esta URL" }, - "js_context_suspend_selected_tabs": { "message": "Suspender as guias selecionadas" }, - "js_context_unsuspend_selected_tabs": { "message": "Recarregar as guias selecionadas" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Suspender todas as outras guias nessa janela" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Forçar a suspensão de todas as outras guias nessa janela" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Recarregar todas as guias nessa janela" }, - "js_context_soft_suspend_all_tabs": { "message": "Suspender todas as guias em todas as janelas" }, - "js_context_force_suspend_all_tabs": { "message": "Forçar a suspensão de todas as guias em todas as janelas" }, - "js_context_unsuspend_all_tabs": { "message": "Recarregar todas as guias em todas as janelas" }, - "html_about_title": { "message": "Sobre" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "Se você tiver comentários ou quiser denunciar um problema, poderá fazer isso no" }, - "html_about_report_issues_suffix": { "message": ". Por favor, verifique se a sua ideia ou problema já existe antes de criar um novo. Obrigado!" }, - "html_about_debugging_prefix": { "message": "Para habilitar o log, ou para definir sinalizadores de depuração, vá para a " }, - "html_about_debugging_suffix": { "message": "página de depuração." }, - "html_about_the_github_issues_page": { "message": "Página de problemas do GitHub" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Esta extensão usa a" }, - "html_about_html2canvas_suffix": { "message": "biblioteca escrita por Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "Ela também usa o indexedDb wrapper" }, - "html_about_indexedDb_suffix": { "message": "escrito por Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Obrigado também por" }, - "html_about_browserstack_suffix": { "message": "disponibilizar ferramentas gratuitas de teste do Chrome." }, - "html_history_title": { "message": "Gerenciamento de sessão" }, - "html_history_current_session": { "message": "Sessão atual" }, - "html_history_recent_sessions": { "message": "Sessões recentes" }, - "html_history_saved_sessions": { "message": "Sessões salvas" }, - "html_history_import_session": { "message": "Importar sessão" }, - "html_notice_title": { "message": "Aviso" }, - "html_notice_important_notice": { "message": "Aviso importante do The Great Suspender" }, - "html_options_title": { "message": "Configurações" }, - "html_options_suspend_title": { "message": "Suspensão de aba automática" }, - "html_options_suspended_title": { "message": "Guias suspensas" }, - "html_options_other_title": { "message": "Outros" }, - "html_options_suspend_automatically_after": { "message": "Suspender automaticamente as guias depois de" }, - "html_options_suspend_never": { "message": "Nunca" }, - "html_options_suspend_seconds": { "message": "segundos" }, - "html_options_suspend_minute": { "message": "min" }, - "html_options_suspend_minutes": { "message": "mins" }, - "html_options_suspend_hour": { "message": "hora" }, - "html_options_suspend_hours": { "message": "horas" }, - "html_options_suspend_day": { "message": "dia" }, - "html_options_suspend_days": { "message": "dias" }, - "html_options_suspend_week": { "message": "semana" }, - "html_options_suspend_weeks": { "message": "semanas" }, - "html_options_suspend_no_pinned": { "message": "Nunca suspender as guias fixadas" }, - "html_options_suspend_no_forms": { "message": "Nunca suspender as guias que contenham entradas de formulário não salvas" }, - "html_options_suspend_no_audio": { "message": "Nunca suspender as guias que estiverem reproduzindo áudio" }, - "html_options_suspend_only_connected": { "message": "Nunca suspender as guias quando estiver off-line" }, - "html_options_suspend_only_on_battery": { "message": "Nunca suspender as guias quando estiver conectado à fonte de energia" }, - "html_options_suspend_no_active_tabs": { "message": "Nunca suspender a guia ativa em cada janela" }, - "html_options_suspend_automatically_unsuspend": { "message": "Recarregar automaticamente quando a guia for visualizada" }, - "html_options_suspend_discard_after_suspend": { "message": "Aplicar a economia de memória integrada do Chrome ao suspender" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Reduz ainda mais o uso de memória de uma guia suspensa, utilizando a" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "funcionalidade de \"descartar de guias\" do Chrome. Isso pode resultar em" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "até 500% de economia de memória ao trabalhar com um grande número de abas." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "No entanto, isso também causará um pequeno atraso na renderização ao selecionar" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "uma guia suspensa." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "Para mais informações sobre o descarte do Chrome, consulte:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "Tema" }, - "html_options_suspend_theme_light": { "message": "Claro" }, - "html_options_suspend_theme_dark": { "message": "Escuro" }, - "html_options_suspend_screen_capturing": { "message": "Captura de tela" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Desativado" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Capture somente a parte superior da tela" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Capturar a página inteira" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "Em uma guia suspensa, a extensão poderá exibir uma visualização de imagem da" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "aparência da guia bem antes de ser suspensa." }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "O recurso de captura de tela é experimental e pode causar um uso significativo da CPU, bem como" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "um aumento pequeno no uso de memória." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Se você notar algum comportamento estranho, como as guias demorarem muito tempo para serem suspensas, ou se o Chrome" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "travar inesperadamente, tente desativar esse recurso." }, - "html_options_suspend_force_screen_capture": { "message": "Ativar o modo de captura de tela de alta qualidade" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Quando desativada, as capturas de tela têm as seguintes limitações para auxiliar no desempenho:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- Captura de tela de baixa qualidade" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- Não irá capturar a tela se levar mais de 1 minuto para gerar a imagem" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- A altura máxima de captura de tela é limitada a 5000px" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Ativar o modo de captura de tela de alta qualidade pode aumentar significativamente a carga da CPU" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "e o uso de memória." }, - "html_options_whitelist_title": { "message": "Nunca suspender as guias com URLs da lista a seguir:" }, - "html_options_whitelist_tooltip_line1": { "message": "Adicione a URL de cada página que você deseja colocar na lista branca em uma nova linha. Por exemplo:" }, - "html_options_whitelist_tooltip_line2": { "message": "Para colocar na lista branca vários sites em uma linha, você pode especificar parte da URL:" }, - "html_options_whitelist_tooltip_line3": { "message": "Você também pode especificar expressões regulares colocando o texto em barras:" }, - "html_options_whitelist_test": { "message": "Lista branca de teste" }, - "html_options_other_enable_context_menu": { "message": "Adicionar The Great Suspender no menu de contexto do clique do botão direito" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Adicione controles para esta extensão no menu do botão direito de uma página da web." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Isso lhe dará acesso a ações avançadas de suspensão que não estão disponíveis" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "em outro lugar na extensão." }, - "html_options_other_enable_sync": { "message": "Sincronizar as configurações com seu perfil do Chrome" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "As configurações de extensão serão sincronizadas em todos os navegadores Chrome que estiverem" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "conectados com o mesmo perfil." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Isso também sincronizará as configurações no modo de navegação anônima." }, - "html_options_other_enable_sync_warning": { "message": "Ativar essa opção substituirá as configurações de todos os outros navegadores conectados ao mesmo perfil do Chrome." }, - "html_options_suspend_on_low_memory": { "message": "Suspender instantaneamente quando a memória do sistema ficar muito baixa" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "Essa opção substituirá a funcionalidade de descarte de guia automático do Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "Se ativado, isso forçará uma guia a ser suspensa, em vez de ser descartada pelo Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "Normalmente, o Chrome só irá descartar as guias quando a memória do sistema ficar muito baixa." }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "Observação: Isso pode fazer com que as guias sejam suspensas mais cedo do que a hora" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "especificada nas opções de suspensão de guia Automática." }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "Para mais informações sobre o descarte do Chrome, consulte:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "Recarregar esta guia" }, - "html_popup_suspend_tab": { "message": "Suspender esta guia agora" }, - "html_popup_dont_suspend_now": { "message": "Não suspender agora" }, - "html_popup_never_suspend_domain": { "message": "Nunca suspender este domínio" }, - "html_popup_never_suspend_page": { "message": "Nunca suspender esta URL" }, - "html_popup_suspend_other_tabs": { "message": "Suspender todas as outras guias" }, - "html_popup_unsuspend_all_tabs": { "message": "Recarregar todas as outras guias" }, - "html_popup_suspend_selected_tabs": { "message": "Suspender as guias selecionadas" }, - "html_popup_unsuspend_selected_tabs": { "message": "Recarregar as guias selecionadas" }, - "html_popup_settings": { "message": "Configurações" }, - "html_restoring_title": { "message": "Restaurando janela" }, - "html_restoring_heading": { "message": "Restaurando abas" }, - "html_restoring_detail": { "message": "Por favor, aguarde enquanto eu restauro esta janela..." }, - "html_recovery_title": { "message": "Recuperação" }, - "html_recovery_ruh_roh": { "message": "Opa!" }, - "html_recovery_description_line1": { "message": "Parece que você está recuperando de uma falha na extensão." }, - "html_recovery_description_line2": { "message": "Suas guias suspensas podem ter travado ou desaparecido." }, - "html_recovery_restore_tabs_automatically": { "message": "Restaurar guias automaticamente" }, - "html_recovery_go_to_session_manager": { "message": "Ir para o gerenciador de sessões" }, - "html_recovery_important_message": { "message": "No momento, você está com a captura de tela ativada. Se esta extensão estiver falhando repetidamente, recomenda-se que você desative essa opção." }, - "html_recovery_disable_screen_capturing": { "message": "Desligue a captura de tela" }, - "html_recovery_tabs_to_restore": { "message": "Guias a restaurar" }, - "html_shortcuts_title": { "message": "Atalhos do teclado" }, - "html_shortcuts_keyboard_shortcuts": { "message": "Atalhos do teclado" }, - "html_shortcuts_context_menu_note": { "message": "Nota: Essas ações também estão disponíveis através do menu de contexto do botão direito do mouse." }, - "html_shortcuts_remap_keys": { "message": "Alterar atalhos" }, - "html_sidebar_general_settings": { "message": "Configurações" }, - "html_sidebar_session_management": { "message": "Gerenciamento de sessões" }, - "html_sidebar_shortcuts": { "message": "Atalhos do teclado" }, - "html_sidebar_support": { "message": "Sobre" }, - "html_success_great_success": { "message": "Grande sucesso!" }, - "html_success_all_tabs_restored": { "message": "Todas as suas guias foram restauradas." }, - "html_success_goto_advanced_prefix": { "message": "For advanced session management, visit the" }, - "html_success_goto_advanced_suffix": { "message": "página" }, - "html_session_manager": { "message": "gerenciamento de sessões" }, - "html_suspended_title": { "message": "Guia suspensa" }, - "html_suspended_tab_suspended": { "message": "Guia suspensa" }, - "html_suspended_tab_reload": { "message": "Recarregar guia" }, - "html_suspended_tab_whitelist_prefix": { "message": "Nunca suspender" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "Atualize ou clique para recarregar" }, - "html_suspended_toast_not_connected": { "message": "Você não está conectado à Internet" }, - "html_suspended_toast_reload_disabled": { "message": "O recarregamento automático de guias está temporariamente desativado." }, - "html_permissions_title": { "message": "Permissões" }, - "html_permissions_heading": { "message": "Por favor, me dê acesso a URLs de arquivos locais" }, - "html_permissions_info": { "message": "No momento, esta extensão não está permitida a suspender as URLs que começam com a palavra \"file\".\nPara mudar isso, ative \"Permitir acesso a URLs de arquivo\" na página de configurações da extensão." }, - "html_permissions_backup": { "message": "Observação: a alteração dessa opção fará com que todas as suas guias suspensas desapareçam brevemente.\nNeste caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." }, - "html_update_title": { "message": "Atualização" }, - "html_update_heading2": { "message": "está prestes a ficar maior" }, - "html_update_info": { "message": "Uma nova versão do The Great Suspender está pronta para ser instalada.\nObservação: durante a atualização, suas guias suspensas desaparecerão brevemente." }, - "html_update_info_withbackup": { "message": "este caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." }, - "html_update_info_nobackup_prefix": { "message": "É altamente recomendável que você exporte uma cópia de sua sessão atual de " }, - "html_update_info_nobackup_suffix": { "message": " antes de continuar com a atualização." }, - "html_updated_title": { "message": "Atualizado" }, - "html_updating_heading": { "message": "está atualizando" }, - "html_updating_message": { "message": "Por favor, aguarde enquanto eu restauro as suas guias suspensas..." }, - "html_updated_great_suspender_updated": { "message": "foi atualizado" }, - "html_updated_info_line1": { "message": "Um backup automático foi feito de suas guias antes da atualização." }, - "html_updated_info_line2_prefix": { "message": "Se você encontrou algum problema durante a atualização, você pode recuperar as guias perdidas da " }, - "html_updated_info_line2_suffix": { "message": " página." }, - "html_updated_detail_header_prefix": { "message": "O que há de novo em " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_new_features_header": { "message": "Novos recursos:" }, - "html_updated_bug_fixes_header": { "message": "Correções de bugs:" }, - "html_updated_release_notes": { "message": "Visite o GitHub para obter notas da versão completas: " }, - "html_updated_patch_message": { "message": "Desculpe pelo incômodo. Eu só precisava fazer uma pequena manutenção." }, - "html_welcome_title": { "message": "Bem-vindo" }, - "html_welcome_text_line1": { "message": "Obrigado por experimentar" }, - "html_welcome_text_line2": { "message": "Eu deixo seu computador funcionar sem problemas suspendendo as guias que você não está usando." }, - "html_welcome_text_line3": { "message": "Você pode ajustar bem as configurações abaixo." }, - "js_popup_normal": { "message": "A guia será suspensa automaticamente." }, - "js_popup_normal_pause": { "message": "Agora não" }, - "js_popup_special": { "message": "A guia não pôde ser suspensa" }, - "js_popup_suspended": { "message": "Guia suspensa" }, - "js_popup_suspended_pause": { "message": "Não suspender" }, - "js_popup_whitelisted": { "message": "Site adicionado à lista branca." }, - "js_popup_whitelisted_remove": { "message": "Remover da lista branca" }, - "js_popup_audible": { "message": "Esta guia está reproduzindo áudio." }, - "js_popup_form_input": { "message": "A guia está recebendo entrada de formulário." }, - "js_popup_form_input_unpause": { "message": "Retomar" }, - "js_popup_pinned": { "message": "A guia foi fixada" }, - "js_popup_temp_whitelist": { "message": "Suspensão de guias pausada." }, - "js_popup_temp_whitelist_unpause": { "message": "Retomar" }, - "js_popup_never": { "message": "Suspensão automática de guias desativada." }, - "js_popup_no_connectivity": { "message": "Sem conexão de rede" }, - "js_popup_charging": { "message": "Conectado à fonte de energia" }, - "js_popup_blockedFile": { "message": "Arquivos locais não podem ser suspensos." }, - "js_popup_blockedFile_enable": { "message": "Habilitar" }, - "js_popup_unknown": { "message": "Aguardando a guia carregar..." }, - "js_popup_initialising": { "message": "Aguardando a extensão inicializar..." }, - "js_popup_error": { "message": "Suspensão automática indisponível para esta guia" }, - "js_history_delete": { "message": "excluir" }, - "js_history_export": { "message": "exportar" }, - "js_history_reload": { "message": "abrir e carregar" }, - "js_history_resuspend": { "message": "abrir e suspender" }, - "js_history_save": { "message": "salvar" }, - "js_history_window": { "message": "Janela" }, - "js_history_tab": { "message": "Guia" }, - "js_history_plural": { "message": "s" }, - "js_history_enter_name_for_session": { "message": "Digite um nome para esta sessão" }, - "js_history_confirm_delete": { "message": "Tem certeza de que deseja excluir esta sessão?" }, - "js_history_confirm_session_overwrite": { "message": "Já existe uma sessão salva com este nome. Sobrescrever a sessão existente?" }, - "js_history_import_fail": { "message": "Falha ao carregar o arquivo. Certifique-se de que o arquivo seja um texto simples e contenha uma única URL por linha." }, - "js_suspended_remove_from_whitelist": { "message": "Remover site da lista branca" }, - "js_suspended_hotkey_to_reload": { "message": "Definir atalhos do teclado" }, - "js_suspended_low_memory": { "message": "Guia suspensa devido a baixa memória do sistema" }, - "js_options_incognito_warning": { "message": "Você está no modo de navegação anônima. Alguns recursos não estarão disponíveis." }, - "js_options_whitelist_no_matches": { "message": "Não há guias abertas que correspondam à lista branca atual." }, - "js_options_whitelist_matches_heading": { "message": "Guias permitidas abertas:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "e" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "mais." }, - "js_permissions_button_export": { "message": "Salvar backup" }, - "js_permissions_button_set": { "message": "Abrir configurações da extensão" }, - "js_update_confirm": { "message": "Você ainda não salvou um backup. Quer atualizar a extensão mesmo assim?" }, - "js_update_button_export": { "message": "Salvar backup" }, - "js_update_button_reload": { "message": "Atualizar a extensão agora" }, - "js_shortcuts_not_set": { "message": "não definido" }, - "js_session_save_point": { "message": "Ponto de salvamento automático para v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Faça o seu computador funcionar sem problemas suspendendo as guias que você não está usando" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Suspender/Recarregar a guia ativa" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Pausar/Retomar suspensão da guia ativa" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Suspender guias selecionadas" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Recarregar guias selecionadas" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Suspender todas as outras guias na janela ativa" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Forçar suspender todas as outras guias na janela ativa" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Recarregar todas as guias na janela ativa" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Suspender todas as guias em todas as janelas" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Forçar suspensão de todas as guias em todas as janelas" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Recarregar todas as guias em todas as janelas" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Abrir Link em Nova Guia Suspensa" + }, + "js_context_toggle_suspend_state": { + "message": "Suspender/Recarregar esta guia" + }, + "js_context_toggle_pause_suspension": { + "message": "Pausar/Retomar a suspensão desta guia" + }, + "js_context_never_suspend_domain": { + "message": "Nunca suspender este domínio" + }, + "js_context_never_suspend_page": { + "message": "Nunca suspender esta URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Suspender as guias selecionadas" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Recarregar as guias selecionadas" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Suspender todas as outras guias nessa janela" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Forçar a suspensão de todas as outras guias nessa janela" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Recarregar todas as guias nessa janela" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Suspender todas as guias em todas as janelas" + }, + "js_context_force_suspend_all_tabs": { + "message": "Forçar a suspensão de todas as guias em todas as janelas" + }, + "js_context_unsuspend_all_tabs": { + "message": "Recarregar todas as guias em todas as janelas" + }, + "html_about_title": { + "message": "Sobre" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking (more information available on" + }, + "html_about_fork_end": { + "message": ")" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Se você tiver comentários ou quiser denunciar um problema, poderá fazer isso no" + }, + "html_about_report_issues_suffix": { + "message": ". Por favor, verifique se a sua ideia ou problema já existe antes de criar um novo. Obrigado!" + }, + "html_about_debugging_prefix": { + "message": "Para habilitar o log, ou para definir sinalizadores de depuração, vá para a " + }, + "html_about_debugging_suffix": { + "message": "página de depuração." + }, + "html_about_the_github_issues_page": { + "message": "Página de problemas do GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Esta extensão usa a" + }, + "html_about_html2canvas_suffix": { + "message": "biblioteca escrita por Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Ela também usa o indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "escrito por Aaron Powell." + }, + "html_about_browserstack": { + "message": "browserstack" + }, + "html_about_browserstack_prefix": { + "message": "Obrigado também por" + }, + "html_about_browserstack_suffix": { + "message": "disponibilizar ferramentas gratuitas de teste do Chrome." + }, + "html_history_title": { + "message": "Gerenciamento de sessão" + }, + "html_history_current_session": { + "message": "Sessão atual" + }, + "html_history_recent_sessions": { + "message": "Sessões recentes" + }, + "html_history_saved_sessions": { + "message": "Sessões salvas" + }, + "html_history_import_session": { + "message": "Importar sessão" + }, + "html_notice_title": { + "message": "Aviso" + }, + "html_notice_important_notice": { + "message": "Aviso importante do The Marvellous Suspender" + }, + "html_options_title": { + "message": "Configurações" + }, + "html_options_suspend_title": { + "message": "Suspensão de aba automática" + }, + "html_options_suspended_title": { + "message": "Guias suspensas" + }, + "html_options_other_title": { + "message": "Outros" + }, + "html_options_suspend_automatically_after": { + "message": "Suspender automaticamente as guias depois de" + }, + "html_options_suspend_never": { + "message": "Nunca" + }, + "html_options_suspend_seconds": { + "message": "segundos" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "mins" + }, + "html_options_suspend_hour": { + "message": "hora" + }, + "html_options_suspend_hours": { + "message": "horas" + }, + "html_options_suspend_day": { + "message": "dia" + }, + "html_options_suspend_days": { + "message": "dias" + }, + "html_options_suspend_week": { + "message": "semana" + }, + "html_options_suspend_weeks": { + "message": "semanas" + }, + "html_options_suspend_no_pinned": { + "message": "Nunca suspender as guias fixadas" + }, + "html_options_suspend_no_forms": { + "message": "Nunca suspender as guias que contenham entradas de formulário não salvas" + }, + "html_options_suspend_no_audio": { + "message": "Nunca suspender as guias que estiverem reproduzindo áudio" + }, + "html_options_suspend_only_connected": { + "message": "Nunca suspender as guias quando estiver off-line" + }, + "html_options_suspend_only_on_battery": { + "message": "Nunca suspender as guias quando estiver conectado à fonte de energia" + }, + "html_options_suspend_no_active_tabs": { + "message": "Nunca suspender a guia ativa em cada janela" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Recarregar automaticamente quando a guia for visualizada" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Aplicar a economia de memória integrada do Chrome ao suspender" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduz ainda mais o uso de memória de uma guia suspensa, utilizando a" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "funcionalidade de \"descartar de guias\" do Chrome. Isso pode resultar em" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "até 500% de economia de memória ao trabalhar com um grande número de abas." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "No entanto, isso também causará um pequeno atraso na renderização ao selecionar" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "uma guia suspensa." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Para mais informações sobre o descarte do Chrome, consulte:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Claro" + }, + "html_options_suspend_theme_dark": { + "message": "Escuro" + }, + "html_options_suspend_screen_capturing": { + "message": "Captura de tela" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Desativado" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capture somente a parte superior da tela" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capturar a página inteira" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Em uma guia suspensa, a extensão poderá exibir uma visualização de imagem da" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "aparência da guia bem antes de ser suspensa." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "O recurso de captura de tela é experimental e pode causar um uso significativo da CPU, bem como" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "um aumento pequeno no uso de memória." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Se você notar algum comportamento estranho, como as guias demorarem muito tempo para serem suspensas, ou se o Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "travar inesperadamente, tente desativar esse recurso." + }, + "html_options_suspend_force_screen_capture": { + "message": "Ativar o modo de captura de tela de alta qualidade" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Quando desativada, as capturas de tela têm as seguintes limitações para auxiliar no desempenho:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Captura de tela de baixa qualidade" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Não irá capturar a tela se levar mais de 1 minuto para gerar a imagem" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- A altura máxima de captura de tela é limitada a 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Ativar o modo de captura de tela de alta qualidade pode aumentar significativamente a carga da CPU" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "e o uso de memória." + }, + "html_options_whitelist_title": { + "message": "Nunca suspender as guias com URLs da lista a seguir:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Adicione a URL de cada página que você deseja colocar na lista branca em uma nova linha. Por exemplo:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Para colocar na lista branca vários sites em uma linha, você pode especificar parte da URL:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Você também pode especificar expressões regulares colocando o texto em barras:" + }, + "html_options_whitelist_test": { + "message": "Lista branca de teste" + }, + "html_options_other_enable_context_menu": { + "message": "Adicionar The Marvellous Suspender no menu de contexto do clique do botão direito" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Adicione controles para esta extensão no menu do botão direito de uma página da web." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Isso lhe dará acesso a ações avançadas de suspensão que não estão disponíveis" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "em outro lugar na extensão." + }, + "html_options_other_enable_sync": { + "message": "Sincronizar as configurações com seu perfil do Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "As configurações de extensão serão sincronizadas em todos os navegadores Chrome que estiverem" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "conectados com o mesmo perfil." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Isso também sincronizará as configurações no modo de navegação anônima." + }, + "html_options_other_enable_sync_warning": { + "message": "Ativar essa opção substituirá as configurações de todos os outros navegadores conectados ao mesmo perfil do Chrome." + }, + "html_options_suspend_on_low_memory": { + "message": "Suspender instantaneamente quando a memória do sistema ficar muito baixa" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Essa opção substituirá a funcionalidade de descarte de guia automático do Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Se ativado, isso forçará uma guia a ser suspensa, em vez de ser descartada pelo Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Normalmente, o Chrome só irá descartar as guias quando a memória do sistema ficar muito baixa." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Observação: Isso pode fazer com que as guias sejam suspensas mais cedo do que a hora" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "especificada nas opções de suspensão de guia Automática." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Para mais informações sobre o descarte do Chrome, consulte:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Recarregar esta guia" + }, + "html_popup_suspend_tab": { + "message": "Suspender esta guia agora" + }, + "html_popup_dont_suspend_now": { + "message": "Não suspender agora" + }, + "html_popup_never_suspend_domain": { + "message": "Nunca suspender este domínio" + }, + "html_popup_never_suspend_page": { + "message": "Nunca suspender esta URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspender todas as outras guias" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Recarregar todas as outras guias" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspender as guias selecionadas" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Recarregar as guias selecionadas" + }, + "html_popup_settings": { + "message": "Configurações" + }, + "html_restoring_title": { + "message": "Restaurando janela" + }, + "html_restoring_heading": { + "message": "Restaurando abas" + }, + "html_restoring_detail": { + "message": "Por favor, aguarde enquanto eu restauro esta janela..." + }, + "html_recovery_title": { + "message": "Recuperação" + }, + "html_recovery_ruh_roh": { + "message": "Opa!" + }, + "html_recovery_description_line1": { + "message": "Parece que você está recuperando de uma falha na extensão." + }, + "html_recovery_description_line2": { + "message": "Suas guias suspensas podem ter travado ou desaparecido." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restaurar guias automaticamente" + }, + "html_recovery_go_to_session_manager": { + "message": "Ir para o gerenciador de sessões" + }, + "html_recovery_important_message": { + "message": "No momento, você está com a captura de tela ativada. Se esta extensão estiver falhando repetidamente, recomenda-se que você desative essa opção." + }, + "html_recovery_disable_screen_capturing": { + "message": "Desligue a captura de tela" + }, + "html_recovery_tabs_to_restore": { + "message": "Guias a restaurar" + }, + "html_shortcuts_title": { + "message": "Atalhos do teclado" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Atalhos do teclado" + }, + "html_shortcuts_context_menu_note": { + "message": "Nota: Essas ações também estão disponíveis através do menu de contexto do botão direito do mouse." + }, + "html_shortcuts_remap_keys": { + "message": "Alterar atalhos" + }, + "html_sidebar_general_settings": { + "message": "Configurações" + }, + "html_sidebar_session_management": { + "message": "Gerenciamento de sessões" + }, + "html_sidebar_shortcuts": { + "message": "Atalhos do teclado" + }, + "html_sidebar_support": { + "message": "Sobre" + }, + "html_success_great_success": { + "message": "Grande sucesso!" + }, + "html_success_all_tabs_restored": { + "message": "Todas as suas guias foram restauradas." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "página" + }, + "html_session_manager": { + "message": "gerenciamento de sessões" + }, + "html_suspended_title": { + "message": "Guia suspensa" + }, + "html_suspended_tab_suspended": { + "message": "Guia suspensa" + }, + "html_suspended_tab_reload": { + "message": "Recarregar guia" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Nunca suspender" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Atualize ou clique para recarregar" + }, + "html_suspended_toast_not_connected": { + "message": "Você não está conectado à Internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "O recarregamento automático de guias está temporariamente desativado." + }, + "html_permissions_title": { + "message": "Permissões" + }, + "html_permissions_heading": { + "message": "Por favor, me dê acesso a URLs de arquivos locais" + }, + "html_permissions_info": { + "message": "No momento, esta extensão não está permitida a suspender as URLs que começam com a palavra \"file\".\nPara mudar isso, ative \"Permitir acesso a URLs de arquivo\" na página de configurações da extensão." + }, + "html_permissions_backup": { + "message": "Observação: a alteração dessa opção fará com que todas as suas guias suspensas desapareçam brevemente.\nNeste caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." + }, + "html_update_title": { + "message": "Atualização" + }, + "html_update_heading2": { + "message": "está prestes a ficar maior" + }, + "html_update_info": { + "message": "Uma nova versão do The Marvellous Suspender está pronta para ser instalada.\nObservação: durante a atualização, suas guias suspensas desaparecerão brevemente." + }, + "html_update_info_withbackup": { + "message": "este caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." + }, + "html_update_info_nobackup_prefix": { + "message": "É altamente recomendável que você exporte uma cópia de sua sessão atual de " + }, + "html_update_info_nobackup_suffix": { + "message": " antes de continuar com a atualização." + }, + "html_updated_title": { + "message": "Atualizado" + }, + "html_updating_heading": { + "message": "está atualizando" + }, + "html_updating_message": { + "message": "Por favor, aguarde enquanto eu restauro as suas guias suspensas..." + }, + "html_updated_great_suspender_updated": { + "message": "foi atualizado" + }, + "html_updated_info_line1": { + "message": "Um backup automático foi feito de suas guias antes da atualização." + }, + "html_updated_info_line2_prefix": { + "message": "Se você encontrou algum problema durante a atualização, você pode recuperar as guias perdidas da " + }, + "html_updated_info_line2_suffix": { + "message": " página." + }, + "html_updated_detail_header_prefix": { + "message": "O que há de novo em " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Novos recursos:" + }, + "html_updated_bug_fixes_header": { + "message": "Correções de bugs:" + }, + "html_updated_release_notes": { + "message": "Visite o GitHub para obter notas da versão completas: " + }, + "html_updated_patch_message": { + "message": "Desculpe pelo incômodo. Eu só precisava fazer uma pequena manutenção." + }, + "html_welcome_title": { + "message": "Bem-vindo" + }, + "html_welcome_text_line1": { + "message": "Obrigado por experimentar" + }, + "html_welcome_text_line2": { + "message": "Eu deixo seu computador funcionar sem problemas suspendendo as guias que você não está usando." + }, + "html_welcome_text_line3": { + "message": "Você pode ajustar bem as configurações abaixo." + }, + "js_popup_normal": { + "message": "A guia será suspensa automaticamente." + }, + "js_popup_normal_pause": { + "message": "Agora não" + }, + "js_popup_special": { + "message": "A guia não pôde ser suspensa" + }, + "js_popup_suspended": { + "message": "Guia suspensa" + }, + "js_popup_suspended_pause": { + "message": "Não suspender" + }, + "js_popup_whitelisted": { + "message": "Site adicionado à lista branca." + }, + "js_popup_whitelisted_remove": { + "message": "Remover da lista branca" + }, + "js_popup_audible": { + "message": "Esta guia está reproduzindo áudio." + }, + "js_popup_form_input": { + "message": "A guia está recebendo entrada de formulário." + }, + "js_popup_form_input_unpause": { + "message": "Retomar" + }, + "js_popup_pinned": { + "message": "A guia foi fixada" + }, + "js_popup_temp_whitelist": { + "message": "Suspensão de guias pausada." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Retomar" + }, + "js_popup_never": { + "message": "Suspensão automática de guias desativada." + }, + "js_popup_no_connectivity": { + "message": "Sem conexão de rede" + }, + "js_popup_charging": { + "message": "Conectado à fonte de energia" + }, + "js_popup_blockedFile": { + "message": "Arquivos locais não podem ser suspensos." + }, + "js_popup_blockedFile_enable": { + "message": "Habilitar" + }, + "js_popup_unknown": { + "message": "Aguardando a guia carregar..." + }, + "js_popup_initialising": { + "message": "Aguardando a extensão inicializar..." + }, + "js_popup_error": { + "message": "Suspensão automática indisponível para esta guia" + }, + "js_history_delete": { + "message": "excluir" + }, + "js_history_export": { + "message": "exportar" + }, + "js_history_reload": { + "message": "abrir e carregar" + }, + "js_history_resuspend": { + "message": "abrir e suspender" + }, + "js_history_save": { + "message": "salvar" + }, + "js_history_window": { + "message": "Janela" + }, + "js_history_tab": { + "message": "Guia" + }, + "js_history_plural": { + "message": "s" + }, + "js_history_enter_name_for_session": { + "message": "Digite um nome para esta sessão" + }, + "js_history_confirm_delete": { + "message": "Tem certeza de que deseja excluir esta sessão?" + }, + "js_history_confirm_session_overwrite": { + "message": "Já existe uma sessão salva com este nome. Sobrescrever a sessão existente?" + }, + "js_history_import_fail": { + "message": "Falha ao carregar o arquivo. Certifique-se de que o arquivo seja um texto simples e contenha uma única URL por linha." + }, + "js_suspended_remove_from_whitelist": { + "message": "Remover site da lista branca" + }, + "js_suspended_hotkey_to_reload": { + "message": "Definir atalhos do teclado" + }, + "js_suspended_low_memory": { + "message": "Guia suspensa devido a baixa memória do sistema" + }, + "js_options_incognito_warning": { + "message": "Você está no modo de navegação anônima. Alguns recursos não estarão disponíveis." + }, + "js_options_whitelist_no_matches": { + "message": "Não há guias abertas que correspondam à lista branca atual." + }, + "js_options_whitelist_matches_heading": { + "message": "Guias permitidas abertas:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "e" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "mais." + }, + "js_permissions_button_export": { + "message": "Salvar backup" + }, + "js_permissions_button_set": { + "message": "Abrir configurações da extensão" + }, + "js_update_confirm": { + "message": "Você ainda não salvou um backup. Quer atualizar a extensão mesmo assim?" + }, + "js_update_button_export": { + "message": "Salvar backup" + }, + "js_update_button_reload": { + "message": "Atualizar a extensão agora" + }, + "js_shortcuts_not_set": { + "message": "não definido" + }, + "js_session_save_point": { + "message": "Ponto de salvamento automático para v" + } } diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 857e8eef..10757864 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -1,242 +1,734 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Faça o seu computador funcionar sem problemas suspendendo as guias que você não está usando" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Suspender/Recarregar a guia ativa" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Pausar/Retomar suspensão da guia ativa" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Suspender guias selecionadas" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Recarregar guias selecionadas" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Suspender todas as outras guias na janela ativa" }, - "ext_cmd_force_suspend_active_window_description": { "message": "Forçar suspender todas as outras guias na janela ativa" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Recarregar todas as guias na janela ativa" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Suspender todas as guias em todas as janelas" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Forçar suspensão de todas as guias em todas as janelas" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Recarregar todas as guias em todas as janelas" }, - "js_context_open_link_in_suspended_tab": { "message": "Abrir Link em Nova Guia Suspensa" }, - "js_context_toggle_suspend_state": { "message": "Suspender/Recarregar esta guia" }, - "js_context_toggle_pause_suspension": { "message": "Pausar/Retomar a suspensão desta guia" }, - "js_context_never_suspend_domain": { "message": "Nunca suspender este domínio" }, - "js_context_never_suspend_page": { "message": "Nunca suspender esta URL" }, - "js_context_suspend_selected_tabs": { "message": "Suspender as guias selecionadas" }, - "js_context_unsuspend_selected_tabs": { "message": "Recarregar as guias selecionadas" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Suspender todas as outras guias nessa janela" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Forçar a suspensão de todas as outras guias nessa janela" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Recarregar todas as guias nessa janela" }, - "js_context_soft_suspend_all_tabs": { "message": "Suspender todas as guias em todas as janelas" }, - "js_context_force_suspend_all_tabs": { "message": "Forçar a suspensão de todas as guias em todas as janelas" }, - "js_context_unsuspend_all_tabs": { "message": "Recarregar todas as guias em todas as janelas" }, - "html_about_title": { "message": "Sobre" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "Se você tiver comentários ou quiser denunciar um problema, poderá fazer isso no" }, - "html_about_report_issues_suffix": { "message": ". Por favor, verifique se a sua ideia ou problema já existe antes de criar um novo. Obrigado!" }, - "html_about_debugging_prefix": { "message": "Para habilitar o log, ou para definir sinalizadores de depuração, vá para a " }, - "html_about_debugging_suffix": { "message": "página de depuração." }, - "html_about_the_github_issues_page": { "message": "Página de problemas do GitHub" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Esta extensão usa a" }, - "html_about_html2canvas_suffix": { "message": "biblioteca escrita por Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "Ela também usa o indexedDb wrapper" }, - "html_about_indexedDb_suffix": { "message": "escrito por Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Obrigado também por" }, - "html_about_browserstack_suffix": { "message": "disponibilizar ferramentas gratuitas de teste do Chrome." }, - "html_history_title": { "message": "Gerenciamento de sessão" }, - "html_history_current_session": { "message": "Sessão atual" }, - "html_history_recent_sessions": { "message": "Sessões recentes" }, - "html_history_saved_sessions": { "message": "Sessões salvas" }, - "html_history_import_session": { "message": "Importar sessão" }, - "html_notice_title": { "message": "Aviso" }, - "html_notice_important_notice": { "message": "Aviso importante do The Great Suspender" }, - "html_options_title": { "message": "Configurações" }, - "html_options_suspend_title": { "message": "Suspensão de aba automática" }, - "html_options_suspended_title": { "message": "Guias suspensas" }, - "html_options_other_title": { "message": "Outros" }, - "html_options_suspend_automatically_after": { "message": "Suspender automaticamente as guias depois de" }, - "html_options_suspend_never": { "message": "Nunca" }, - "html_options_suspend_seconds": { "message": "segundos" }, - "html_options_suspend_minute": { "message": "min" }, - "html_options_suspend_minutes": { "message": "mins" }, - "html_options_suspend_hour": { "message": "hora" }, - "html_options_suspend_hours": { "message": "horas" }, - "html_options_suspend_day": { "message": "dia" }, - "html_options_suspend_days": { "message": "dias" }, - "html_options_suspend_week": { "message": "semana" }, - "html_options_suspend_weeks": { "message": "semanas" }, - "html_options_suspend_no_pinned": { "message": "Nunca suspender as guias fixadas" }, - "html_options_suspend_no_forms": { "message": "Nunca suspender as guias que contenham entradas de formulário não salvas" }, - "html_options_suspend_no_audio": { "message": "Nunca suspender as guias que estiverem reproduzindo áudio" }, - "html_options_suspend_only_connected": { "message": "Nunca suspender as guias quando estiver off-line" }, - "html_options_suspend_only_on_battery": { "message": "Nunca suspender as guias quando estiver conectado à fonte de energia" }, - "html_options_suspend_no_active_tabs": { "message": "Nunca suspender a guia ativa em cada janela" }, - "html_options_suspend_automatically_unsuspend": { "message": "Recarregar automaticamente quando a guia for visualizada" }, - "html_options_suspend_discard_after_suspend": { "message": "Aplicar a economia de memória integrada do Chrome ao suspender" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Reduz ainda mais o uso de memória de uma guia suspensa, utilizando a" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "funcionalidade de \"descartar de guias\" do Chrome. Isso pode resultar em" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "até 500% de economia de memória ao trabalhar com um grande número de abas." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "No entanto, isso também causará um pequeno atraso na renderização ao selecionar" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "uma guia suspensa." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "Para mais informações sobre o descarte do Chrome, consulte:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "Tema" }, - "html_options_suspend_theme_light": { "message": "Claro" }, - "html_options_suspend_theme_dark": { "message": "Escuro" }, - "html_options_suspend_screen_capturing": { "message": "Captura de tela" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Desativado" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Capture somente a parte superior da tela" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Capturar a página inteira" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "Em uma guia suspensa, a extensão poderá exibir uma visualização de imagem da" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "aparência da guia bem antes de ser suspensa." }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "O recurso de captura de tela é experimental e pode causar um uso significativo da CPU, bem como" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "um aumento pequeno no uso de memória." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Se você notar algum comportamento estranho, como as guias demorarem muito tempo para serem suspensas, ou se o Chrome" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "travar inesperadamente, tente desativar esse recurso." }, - "html_options_suspend_force_screen_capture": { "message": "Ativar o modo de captura de tela de alta qualidade" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Quando desativada, as capturas de tela têm as seguintes limitações para auxiliar no desempenho:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- Captura de tela de baixa qualidade" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- Não irá capturar a tela se levar mais de 1 minuto para gerar a imagem" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- A altura máxima de captura de tela é limitada a 5000px" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Ativar o modo de captura de tela de alta qualidade pode aumentar significativamente a carga da CPU" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "e o uso de memória." }, - "html_options_whitelist_title": { "message": "Nunca suspender as guias com URLs da lista a seguir:" }, - "html_options_whitelist_tooltip_line1": { "message": "Adicione a URL de cada página que você deseja colocar na lista branca em uma nova linha. Por exemplo:" }, - "html_options_whitelist_tooltip_line2": { "message": "Para colocar na lista branca vários sites em uma linha, você pode especificar parte da URL:" }, - "html_options_whitelist_tooltip_line3": { "message": "Você também pode especificar expressões regulares colocando o texto em barras:" }, - "html_options_whitelist_test": { "message": "Lista branca de teste" }, - "html_options_other_enable_context_menu": { "message": "Adicionar The Great Suspender no menu de contexto do clique do botão direito" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Adicione controles para esta extensão no menu do botão direito de uma página da web." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Isso lhe dará acesso a ações avançadas de suspensão que não estão disponíveis" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "em outro lugar na extensão." }, - "html_options_other_enable_sync": { "message": "Sincronizar as configurações com seu perfil do Chrome" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "As configurações de extensão serão sincronizadas em todos os navegadores Chrome que estiverem" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "conectados com o mesmo perfil." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Isso também sincronizará as configurações no modo de navegação anônima." }, - "html_options_other_enable_sync_warning": { "message": "Ativar essa opção substituirá as configurações de todos os outros navegadores conectados ao mesmo perfil do Chrome." }, - "html_options_suspend_on_low_memory": { "message": "Suspender instantaneamente quando a memória do sistema ficar muito baixa" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "Essa opção substituirá a funcionalidade de descarte de guia automático do Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "Se ativado, isso forçará uma guia a ser suspensa, em vez de ser descartada pelo Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "Normalmente, o Chrome só irá descartar as guias quando a memória do sistema ficar muito baixa." }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "Observação: Isso pode fazer com que as guias sejam suspensas mais cedo do que a hora" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "especificada nas opções de suspensão de guia Automática." }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "Para mais informações sobre o descarte do Chrome, consulte:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "Recarregar esta guia" }, - "html_popup_suspend_tab": { "message": "Suspender esta guia agora" }, - "html_popup_dont_suspend_now": { "message": "Não suspender agora" }, - "html_popup_never_suspend_domain": { "message": "Nunca suspender este domínio" }, - "html_popup_never_suspend_page": { "message": "Nunca suspender esta URL" }, - "html_popup_suspend_other_tabs": { "message": "Suspender todas as outras guias" }, - "html_popup_unsuspend_all_tabs": { "message": "Recarregar todas as outras guias" }, - "html_popup_suspend_selected_tabs": { "message": "Suspender as guias selecionadas" }, - "html_popup_unsuspend_selected_tabs": { "message": "Recarregar as guias selecionadas" }, - "html_popup_settings": { "message": "Configurações" }, - "html_restoring_title": { "message": "Restaurando janela" }, - "html_restoring_heading": { "message": "Restaurando abas" }, - "html_restoring_detail": { "message": "Por favor, aguarde enquanto eu restauro esta janela..." }, - "html_recovery_title": { "message": "Recuperação" }, - "html_recovery_ruh_roh": { "message": "Opa!" }, - "html_recovery_description_line1": { "message": "Parece que você está recuperando de uma falha na extensão." }, - "html_recovery_description_line2": { "message": "Suas guias suspensas podem ter travado ou desaparecido." }, - "html_recovery_restore_tabs_automatically": { "message": "Restaurar guias automaticamente" }, - "html_recovery_go_to_session_manager": { "message": "Ir para o gerenciador de sessões" }, - "html_recovery_important_message": { "message": "No momento, você está com a captura de tela ativada. Se esta extensão estiver falhando repetidamente, recomenda-se que você desative essa opção." }, - "html_recovery_disable_screen_capturing": { "message": "Desligue a captura de tela" }, - "html_recovery_tabs_to_restore": { "message": "Guias a restaurar" }, - "html_shortcuts_title": { "message": "Atalhos do teclado" }, - "html_shortcuts_keyboard_shortcuts": { "message": "Atalhos do teclado" }, - "html_shortcuts_context_menu_note": { "message": "Nota: Essas ações também estão disponíveis através do menu de contexto do botão direito do mouse." }, - "html_shortcuts_remap_keys": { "message": "Alterar atalhos" }, - "html_sidebar_general_settings": { "message": "Configurações" }, - "html_sidebar_session_management": { "message": "Gerenciamento de sessões" }, - "html_sidebar_shortcuts": { "message": "Atalhos do teclado" }, - "html_sidebar_support": { "message": "Sobre" }, - "html_success_great_success": { "message": "Grande sucesso!" }, - "html_success_all_tabs_restored": { "message": "Todas as suas guias foram restauradas." }, - "html_success_goto_advanced_prefix": { "message": "For advanced session management, visit the" }, - "html_success_goto_advanced_suffix": { "message": "página" }, - "html_session_manager": { "message": "gerenciamento de sessões" }, - "html_suspended_title": { "message": "Guia suspensa" }, - "html_suspended_tab_suspended": { "message": "Guia suspensa" }, - "html_suspended_tab_reload": { "message": "Recarregar guia" }, - "html_suspended_tab_whitelist_prefix": { "message": "Nunca suspender" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "Atualize ou clique para recarregar" }, - "html_suspended_toast_not_connected": { "message": "Você não está conectado à Internet" }, - "html_suspended_toast_reload_disabled": { "message": "O recarregamento automático de guias está temporariamente desativado." }, - "html_permissions_title": { "message": "Permissões" }, - "html_permissions_heading": { "message": "Por favor, me dê acesso a URLs de arquivos locais" }, - "html_permissions_info": { "message": "No momento, esta extensão não está permitida a suspender as URLs que começam com a palavra \"file\".\nPara mudar isso, ative \"Permitir acesso a URLs de arquivo\" na página de configurações da extensão." }, - "html_permissions_backup": { "message": "Observação: a alteração dessa opção fará com que todas as suas guias suspensas desapareçam brevemente.\nNeste caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." }, - "html_update_title": { "message": "Atualização" }, - "html_update_heading2": { "message": "está prestes a ficar maior" }, - "html_update_info": { "message": "Uma nova versão do The Great Suspender está pronta para ser instalada.\nObservação: durante a atualização, suas guias suspensas desaparecerão brevemente." }, - "html_update_info_withbackup": { "message": "este caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." }, - "html_update_info_nobackup_prefix": { "message": "É altamente recomendável que você exporte uma cópia de sua sessão atual de " }, - "html_update_info_nobackup_suffix": { "message": " antes de continuar com a atualização." }, - "html_updated_title": { "message": "Atualizado" }, - "html_updating_heading": { "message": "está atualizando" }, - "html_updating_message": { "message": "Por favor, aguarde enquanto eu restauro as suas guias suspensas..." }, - "html_updated_great_suspender_updated": { "message": "foi atualizado" }, - "html_updated_info_line1": { "message": "Um backup automático foi feito de suas guias antes da atualização." }, - "html_updated_info_line2_prefix": { "message": "Se você encontrou algum problema durante a atualização, você pode recuperar as guias perdidas da " }, - "html_updated_info_line2_suffix": { "message": " página." }, - "html_updated_detail_header_prefix": { "message": "O que há de novo em " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_new_features_header": { "message": "Novos recursos:" }, - "html_updated_bug_fixes_header": { "message": "Correções de bugs:" }, - "html_updated_release_notes": { "message": "Visite o GitHub para obter notas da versão completas: " }, - "html_updated_patch_message": { "message": "Desculpe pelo incômodo. Eu só precisava fazer uma pequena manutenção." }, - "html_welcome_title": { "message": "Bem-vindo" }, - "html_welcome_text_line1": { "message": "Obrigado por experimentar" }, - "html_welcome_text_line2": { "message": "Eu deixo seu computador funcionar sem problemas suspendendo as guias que você não está usando." }, - "html_welcome_text_line3": { "message": "Você pode ajustar bem as configurações abaixo." }, - "js_popup_normal": { "message": "A guia será suspensa automaticamente." }, - "js_popup_normal_pause": { "message": "Agora não" }, - "js_popup_special": { "message": "A guia não pôde ser suspensa" }, - "js_popup_suspended": { "message": "Guia suspensa" }, - "js_popup_suspended_pause": { "message": "Não suspender" }, - "js_popup_whitelisted": { "message": "Site adicionado à lista branca." }, - "js_popup_whitelisted_remove": { "message": "Remover da lista branca" }, - "js_popup_audible": { "message": "Esta guia está reproduzindo áudio." }, - "js_popup_form_input": { "message": "A guia está recebendo entrada de formulário." }, - "js_popup_form_input_unpause": { "message": "Retomar" }, - "js_popup_pinned": { "message": "A guia foi fixada" }, - "js_popup_temp_whitelist": { "message": "Suspensão de guias pausada." }, - "js_popup_temp_whitelist_unpause": { "message": "Retomar" }, - "js_popup_never": { "message": "Suspensão automática de guias desativada." }, - "js_popup_no_connectivity": { "message": "Sem conexão de rede" }, - "js_popup_charging": { "message": "Conectado à fonte de energia" }, - "js_popup_blockedFile": { "message": "Arquivos locais não podem ser suspensos." }, - "js_popup_blockedFile_enable": { "message": "Habilitar" }, - "js_popup_unknown": { "message": "Aguardando a guia carregar..." }, - "js_popup_initialising": { "message": "Aguardando a extensão inicializar..." }, - "js_popup_error": { "message": "Suspensão automática indisponível para esta guia" }, - "js_history_delete": { "message": "excluir" }, - "js_history_export": { "message": "exportar" }, - "js_history_reload": { "message": "abrir e carregar" }, - "js_history_resuspend": { "message": "abrir e suspender" }, - "js_history_save": { "message": "salvar" }, - "js_history_window": { "message": "Janela" }, - "js_history_tab": { "message": "Guia" }, - "js_history_plural": { "message": "s" }, - "js_history_enter_name_for_session": { "message": "Digite um nome para esta sessão" }, - "js_history_confirm_delete": { "message": "Tem certeza de que deseja excluir esta sessão?" }, - "js_history_confirm_session_overwrite": { "message": "Já existe uma sessão salva com este nome. Sobrescrever a sessão existente?" }, - "js_history_import_fail": { "message": "Falha ao carregar o arquivo. Certifique-se de que o arquivo seja um texto simples e contenha uma única URL por linha." }, - "js_suspended_remove_from_whitelist": { "message": "Remover site da lista branca" }, - "js_suspended_hotkey_to_reload": { "message": "Definir atalhos do teclado" }, - "js_suspended_low_memory": { "message": "Guia suspensa devido a baixa memória do sistema" }, - "js_options_incognito_warning": { "message": "Você está no modo de navegação anônima. Alguns recursos não estarão disponíveis." }, - "js_options_whitelist_no_matches": { "message": "Não há guias abertas que correspondam à lista branca atual." }, - "js_options_whitelist_matches_heading": { "message": "Guias permitidas abertas:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "e" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "mais." }, - "js_permissions_button_export": { "message": "Salvar backup" }, - "js_permissions_button_set": { "message": "Abrir configurações da extensão" }, - "js_update_confirm": { "message": "Você ainda não salvou um backup. Quer atualizar a extensão mesmo assim?" }, - "js_update_button_export": { "message": "Salvar backup" }, - "js_update_button_reload": { "message": "Atualizar a extensão agora" }, - "js_shortcuts_not_set": { "message": "não definido" }, - "js_session_save_point": { "message": "Ponto de salvamento automático para v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Faça o seu computador funcionar sem problemas suspendendo as guias que você não está usando" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Suspender/Recarregar a guia ativa" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Pausar/Retomar suspensão da guia ativa" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Suspender guias selecionadas" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Recarregar guias selecionadas" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Suspender todas as outras guias na janela ativa" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Forçar suspender todas as outras guias na janela ativa" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Recarregar todas as guias na janela ativa" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Suspender todas as guias em todas as janelas" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Forçar suspensão de todas as guias em todas as janelas" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Recarregar todas as guias em todas as janelas" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Abrir Link em Nova Guia Suspensa" + }, + "js_context_toggle_suspend_state": { + "message": "Suspender/Recarregar esta guia" + }, + "js_context_toggle_pause_suspension": { + "message": "Pausar/Retomar a suspensão desta guia" + }, + "js_context_never_suspend_domain": { + "message": "Nunca suspender este domínio" + }, + "js_context_never_suspend_page": { + "message": "Nunca suspender esta URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Suspender as guias selecionadas" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Recarregar as guias selecionadas" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Suspender todas as outras guias nessa janela" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Forçar a suspensão de todas as outras guias nessa janela" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Recarregar todas as guias nessa janela" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Suspender todas as guias em todas as janelas" + }, + "js_context_force_suspend_all_tabs": { + "message": "Forçar a suspensão de todas as guias em todas as janelas" + }, + "js_context_unsuspend_all_tabs": { + "message": "Recarregar todas as guias em todas as janelas" + }, + "html_about_title": { + "message": "Sobre" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking (more information available on" + }, + "html_about_fork_end": { + "message": ")" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Se você tiver comentários ou quiser denunciar um problema, poderá fazer isso no" + }, + "html_about_report_issues_suffix": { + "message": ". Por favor, verifique se a sua ideia ou problema já existe antes de criar um novo. Obrigado!" + }, + "html_about_debugging_prefix": { + "message": "Para habilitar o log, ou para definir sinalizadores de depuração, vá para a " + }, + "html_about_debugging_suffix": { + "message": "página de depuração." + }, + "html_about_the_github_issues_page": { + "message": "Página de problemas do GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Esta extensão usa a" + }, + "html_about_html2canvas_suffix": { + "message": "biblioteca escrita por Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Ela também usa o indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "escrito por Aaron Powell." + }, + "html_about_browserstack": { + "message": "browserstack" + }, + "html_about_browserstack_prefix": { + "message": "Obrigado também por" + }, + "html_about_browserstack_suffix": { + "message": "disponibilizar ferramentas gratuitas de teste do Chrome." + }, + "html_history_title": { + "message": "Gerenciamento de sessão" + }, + "html_history_current_session": { + "message": "Sessão atual" + }, + "html_history_recent_sessions": { + "message": "Sessões recentes" + }, + "html_history_saved_sessions": { + "message": "Sessões salvas" + }, + "html_history_import_session": { + "message": "Importar sessão" + }, + "html_notice_title": { + "message": "Aviso" + }, + "html_notice_important_notice": { + "message": "Aviso importante do The Marvellous Suspender" + }, + "html_options_title": { + "message": "Configurações" + }, + "html_options_suspend_title": { + "message": "Suspensão de aba automática" + }, + "html_options_suspended_title": { + "message": "Guias suspensas" + }, + "html_options_other_title": { + "message": "Outros" + }, + "html_options_suspend_automatically_after": { + "message": "Suspender automaticamente as guias depois de" + }, + "html_options_suspend_never": { + "message": "Nunca" + }, + "html_options_suspend_seconds": { + "message": "segundos" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "mins" + }, + "html_options_suspend_hour": { + "message": "hora" + }, + "html_options_suspend_hours": { + "message": "horas" + }, + "html_options_suspend_day": { + "message": "dia" + }, + "html_options_suspend_days": { + "message": "dias" + }, + "html_options_suspend_week": { + "message": "semana" + }, + "html_options_suspend_weeks": { + "message": "semanas" + }, + "html_options_suspend_no_pinned": { + "message": "Nunca suspender as guias fixadas" + }, + "html_options_suspend_no_forms": { + "message": "Nunca suspender as guias que contenham entradas de formulário não salvas" + }, + "html_options_suspend_no_audio": { + "message": "Nunca suspender as guias que estiverem reproduzindo áudio" + }, + "html_options_suspend_only_connected": { + "message": "Nunca suspender as guias quando estiver off-line" + }, + "html_options_suspend_only_on_battery": { + "message": "Nunca suspender as guias quando estiver conectado à fonte de energia" + }, + "html_options_suspend_no_active_tabs": { + "message": "Nunca suspender a guia ativa em cada janela" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Recarregar automaticamente quando a guia for visualizada" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Aplicar a economia de memória integrada do Chrome ao suspender" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduz ainda mais o uso de memória de uma guia suspensa, utilizando a" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "funcionalidade de \"descartar de guias\" do Chrome. Isso pode resultar em" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "até 500% de economia de memória ao trabalhar com um grande número de abas." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "No entanto, isso também causará um pequeno atraso na renderização ao selecionar" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "uma guia suspensa." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Para mais informações sobre o descarte do Chrome, consulte:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Claro" + }, + "html_options_suspend_theme_dark": { + "message": "Escuro" + }, + "html_options_suspend_screen_capturing": { + "message": "Captura de tela" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Desativado" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capture somente a parte superior da tela" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capturar a página inteira" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Em uma guia suspensa, a extensão poderá exibir uma visualização de imagem da" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "aparência da guia bem antes de ser suspensa." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "O recurso de captura de tela é experimental e pode causar um uso significativo da CPU, bem como" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "um aumento pequeno no uso de memória." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Se você notar algum comportamento estranho, como as guias demorarem muito tempo para serem suspensas, ou se o Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "travar inesperadamente, tente desativar esse recurso." + }, + "html_options_suspend_force_screen_capture": { + "message": "Ativar o modo de captura de tela de alta qualidade" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Quando desativada, as capturas de tela têm as seguintes limitações para auxiliar no desempenho:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Captura de tela de baixa qualidade" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Não irá capturar a tela se levar mais de 1 minuto para gerar a imagem" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- A altura máxima de captura de tela é limitada a 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Ativar o modo de captura de tela de alta qualidade pode aumentar significativamente a carga da CPU" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "e o uso de memória." + }, + "html_options_whitelist_title": { + "message": "Nunca suspender as guias com URLs da lista a seguir:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Adicione a URL de cada página que você deseja colocar na lista branca em uma nova linha. Por exemplo:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Para colocar na lista branca vários sites em uma linha, você pode especificar parte da URL:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Você também pode especificar expressões regulares colocando o texto em barras:" + }, + "html_options_whitelist_test": { + "message": "Lista branca de teste" + }, + "html_options_other_enable_context_menu": { + "message": "Adicionar The Marvellous Suspender no menu de contexto do clique do botão direito" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Adicione controles para esta extensão no menu do botão direito de uma página da web." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Isso lhe dará acesso a ações avançadas de suspensão que não estão disponíveis" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "em outro lugar na extensão." + }, + "html_options_other_enable_sync": { + "message": "Sincronizar as configurações com seu perfil do Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "As configurações de extensão serão sincronizadas em todos os navegadores Chrome que estiverem" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "conectados com o mesmo perfil." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Isso também sincronizará as configurações no modo de navegação anônima." + }, + "html_options_other_enable_sync_warning": { + "message": "Ativar essa opção substituirá as configurações de todos os outros navegadores conectados ao mesmo perfil do Chrome." + }, + "html_options_suspend_on_low_memory": { + "message": "Suspender instantaneamente quando a memória do sistema ficar muito baixa" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Essa opção substituirá a funcionalidade de descarte de guia automático do Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Se ativado, isso forçará uma guia a ser suspensa, em vez de ser descartada pelo Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Normalmente, o Chrome só irá descartar as guias quando a memória do sistema ficar muito baixa." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Observação: Isso pode fazer com que as guias sejam suspensas mais cedo do que a hora" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "especificada nas opções de suspensão de guia Automática." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Para mais informações sobre o descarte do Chrome, consulte:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Recarregar esta guia" + }, + "html_popup_suspend_tab": { + "message": "Suspender esta guia agora" + }, + "html_popup_dont_suspend_now": { + "message": "Não suspender agora" + }, + "html_popup_never_suspend_domain": { + "message": "Nunca suspender este domínio" + }, + "html_popup_never_suspend_page": { + "message": "Nunca suspender esta URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspender todas as outras guias" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Recarregar todas as outras guias" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspender as guias selecionadas" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Recarregar as guias selecionadas" + }, + "html_popup_settings": { + "message": "Configurações" + }, + "html_restoring_title": { + "message": "Restaurando janela" + }, + "html_restoring_heading": { + "message": "Restaurando abas" + }, + "html_restoring_detail": { + "message": "Por favor, aguarde enquanto eu restauro esta janela..." + }, + "html_recovery_title": { + "message": "Recuperação" + }, + "html_recovery_ruh_roh": { + "message": "Opa!" + }, + "html_recovery_description_line1": { + "message": "Parece que você está recuperando de uma falha na extensão." + }, + "html_recovery_description_line2": { + "message": "Suas guias suspensas podem ter travado ou desaparecido." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restaurar guias automaticamente" + }, + "html_recovery_go_to_session_manager": { + "message": "Ir para o gerenciador de sessões" + }, + "html_recovery_important_message": { + "message": "No momento, você está com a captura de tela ativada. Se esta extensão estiver falhando repetidamente, recomenda-se que você desative essa opção." + }, + "html_recovery_disable_screen_capturing": { + "message": "Desligue a captura de tela" + }, + "html_recovery_tabs_to_restore": { + "message": "Guias a restaurar" + }, + "html_shortcuts_title": { + "message": "Atalhos do teclado" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Atalhos do teclado" + }, + "html_shortcuts_context_menu_note": { + "message": "Nota: Essas ações também estão disponíveis através do menu de contexto do botão direito do mouse." + }, + "html_shortcuts_remap_keys": { + "message": "Alterar atalhos" + }, + "html_sidebar_general_settings": { + "message": "Configurações" + }, + "html_sidebar_session_management": { + "message": "Gerenciamento de sessões" + }, + "html_sidebar_shortcuts": { + "message": "Atalhos do teclado" + }, + "html_sidebar_support": { + "message": "Sobre" + }, + "html_success_great_success": { + "message": "Grande sucesso!" + }, + "html_success_all_tabs_restored": { + "message": "Todas as suas guias foram restauradas." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "página" + }, + "html_session_manager": { + "message": "gerenciamento de sessões" + }, + "html_suspended_title": { + "message": "Guia suspensa" + }, + "html_suspended_tab_suspended": { + "message": "Guia suspensa" + }, + "html_suspended_tab_reload": { + "message": "Recarregar guia" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Nunca suspender" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Atualize ou clique para recarregar" + }, + "html_suspended_toast_not_connected": { + "message": "Você não está conectado à Internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "O recarregamento automático de guias está temporariamente desativado." + }, + "html_permissions_title": { + "message": "Permissões" + }, + "html_permissions_heading": { + "message": "Por favor, me dê acesso a URLs de arquivos locais" + }, + "html_permissions_info": { + "message": "No momento, esta extensão não está permitida a suspender as URLs que começam com a palavra \"file\".\nPara mudar isso, ative \"Permitir acesso a URLs de arquivo\" na página de configurações da extensão." + }, + "html_permissions_backup": { + "message": "Observação: a alteração dessa opção fará com que todas as suas guias suspensas desapareçam brevemente.\nNeste caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." + }, + "html_update_title": { + "message": "Atualização" + }, + "html_update_heading2": { + "message": "está prestes a ficar maior" + }, + "html_update_info": { + "message": "Uma nova versão do The Marvellous Suspender está pronta para ser instalada.\nObservação: durante a atualização, suas guias suspensas desaparecerão brevemente." + }, + "html_update_info_withbackup": { + "message": "este caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." + }, + "html_update_info_nobackup_prefix": { + "message": "É altamente recomendável que você exporte uma cópia de sua sessão atual de " + }, + "html_update_info_nobackup_suffix": { + "message": " antes de continuar com a atualização." + }, + "html_updated_title": { + "message": "Atualizado" + }, + "html_updating_heading": { + "message": "está atualizando" + }, + "html_updating_message": { + "message": "Por favor, aguarde enquanto eu restauro as suas guias suspensas..." + }, + "html_updated_great_suspender_updated": { + "message": "foi atualizado" + }, + "html_updated_info_line1": { + "message": "Um backup automático foi feito de suas guias antes da atualização." + }, + "html_updated_info_line2_prefix": { + "message": "Se você encontrou algum problema durante a atualização, você pode recuperar as guias perdidas da " + }, + "html_updated_info_line2_suffix": { + "message": " página." + }, + "html_updated_detail_header_prefix": { + "message": "O que há de novo em " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Novos recursos:" + }, + "html_updated_bug_fixes_header": { + "message": "Correções de bugs:" + }, + "html_updated_release_notes": { + "message": "Visite o GitHub para obter notas da versão completas: " + }, + "html_updated_patch_message": { + "message": "Desculpe pelo incômodo. Eu só precisava fazer uma pequena manutenção." + }, + "html_welcome_title": { + "message": "Bem-vindo" + }, + "html_welcome_text_line1": { + "message": "Obrigado por experimentar" + }, + "html_welcome_text_line2": { + "message": "Eu deixo seu computador funcionar sem problemas suspendendo as guias que você não está usando." + }, + "html_welcome_text_line3": { + "message": "Você pode ajustar bem as configurações abaixo." + }, + "js_popup_normal": { + "message": "A guia será suspensa automaticamente." + }, + "js_popup_normal_pause": { + "message": "Agora não" + }, + "js_popup_special": { + "message": "A guia não pôde ser suspensa" + }, + "js_popup_suspended": { + "message": "Guia suspensa" + }, + "js_popup_suspended_pause": { + "message": "Não suspender" + }, + "js_popup_whitelisted": { + "message": "Site adicionado à lista branca." + }, + "js_popup_whitelisted_remove": { + "message": "Remover da lista branca" + }, + "js_popup_audible": { + "message": "Esta guia está reproduzindo áudio." + }, + "js_popup_form_input": { + "message": "A guia está recebendo entrada de formulário." + }, + "js_popup_form_input_unpause": { + "message": "Retomar" + }, + "js_popup_pinned": { + "message": "A guia foi fixada" + }, + "js_popup_temp_whitelist": { + "message": "Suspensão de guias pausada." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Retomar" + }, + "js_popup_never": { + "message": "Suspensão automática de guias desativada." + }, + "js_popup_no_connectivity": { + "message": "Sem conexão de rede" + }, + "js_popup_charging": { + "message": "Conectado à fonte de energia" + }, + "js_popup_blockedFile": { + "message": "Arquivos locais não podem ser suspensos." + }, + "js_popup_blockedFile_enable": { + "message": "Habilitar" + }, + "js_popup_unknown": { + "message": "Aguardando a guia carregar..." + }, + "js_popup_initialising": { + "message": "Aguardando a extensão inicializar..." + }, + "js_popup_error": { + "message": "Suspensão automática indisponível para esta guia" + }, + "js_history_delete": { + "message": "excluir" + }, + "js_history_export": { + "message": "exportar" + }, + "js_history_reload": { + "message": "abrir e carregar" + }, + "js_history_resuspend": { + "message": "abrir e suspender" + }, + "js_history_save": { + "message": "salvar" + }, + "js_history_window": { + "message": "Janela" + }, + "js_history_tab": { + "message": "Guia" + }, + "js_history_plural": { + "message": "s" + }, + "js_history_enter_name_for_session": { + "message": "Digite um nome para esta sessão" + }, + "js_history_confirm_delete": { + "message": "Tem certeza de que deseja excluir esta sessão?" + }, + "js_history_confirm_session_overwrite": { + "message": "Já existe uma sessão salva com este nome. Sobrescrever a sessão existente?" + }, + "js_history_import_fail": { + "message": "Falha ao carregar o arquivo. Certifique-se de que o arquivo seja um texto simples e contenha uma única URL por linha." + }, + "js_suspended_remove_from_whitelist": { + "message": "Remover site da lista branca" + }, + "js_suspended_hotkey_to_reload": { + "message": "Definir atalhos do teclado" + }, + "js_suspended_low_memory": { + "message": "Guia suspensa devido a baixa memória do sistema" + }, + "js_options_incognito_warning": { + "message": "Você está no modo de navegação anônima. Alguns recursos não estarão disponíveis." + }, + "js_options_whitelist_no_matches": { + "message": "Não há guias abertas que correspondam à lista branca atual." + }, + "js_options_whitelist_matches_heading": { + "message": "Guias permitidas abertas:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "e" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "mais." + }, + "js_permissions_button_export": { + "message": "Salvar backup" + }, + "js_permissions_button_set": { + "message": "Abrir configurações da extensão" + }, + "js_update_confirm": { + "message": "Você ainda não salvou um backup. Quer atualizar a extensão mesmo assim?" + }, + "js_update_button_export": { + "message": "Salvar backup" + }, + "js_update_button_reload": { + "message": "Atualizar a extensão agora" + }, + "js_shortcuts_not_set": { + "message": "não definido" + }, + "js_session_save_point": { + "message": "Ponto de salvamento automático para v" + } } diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index fc7d6e93..60849e65 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -1,242 +1,734 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Заставь свой браузер работать быстрее, приостанавливая неактивные вкладки" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Приостановить/Возобновить активную вкладку" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Поставить на паузу/Возобновить приостановку активной вкладки" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Приостановить выбранные вкладки" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Возобновить выбранные вкладки" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Приостановить все остальные вкладки в активном окне" }, - "ext_cmd_force_suspend_active_window_description": { "message": "Принудительно приостановить все остальные вкладки в активном окне" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Возобновить все вкладки в активном окне" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Приостановить все вкладки во всех окнах" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Принудительно приостановить все вкладки во всех окнах" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Возобновить все вкладки во всех окнах" }, - "js_context_open_link_in_suspended_tab": { "message": "Открыть ссылку в новой приостановленной вкладке" }, - "js_context_toggle_suspend_state": { "message": "Приостановить/Возобновить эту вкладку" }, - "js_context_toggle_pause_suspension": { "message": "Поставить на паузу/Возобновить приостановку этой вкладки" }, - "js_context_never_suspend_domain": { "message": "Никогда не приостанавливать этот домен" }, - "js_context_never_suspend_page": { "message": "Никогда не приостанавливать этот URL" }, - "js_context_suspend_selected_tabs": { "message": "Приостановить выбранные вкладки" }, - "js_context_unsuspend_selected_tabs": { "message": "Возобновить выбранные вкладки" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Приостановить все остальные вкладки в этом окне" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Принудительно приостановить все остальные вкладки в этом окне" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Возобновить все вкладки в этом окне" }, - "js_context_soft_suspend_all_tabs": { "message": "Приостановить все вкладки во всех окнах" }, - "js_context_force_suspend_all_tabs": { "message": "Принудительно приостановить все вкладки во всех окнах" }, - "js_context_unsuspend_all_tabs": { "message": "Возобновить все вкладки во всех окнах" }, - "html_about_title": { "message": "О расширении" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "Связаться с нами или сообщить о баге можно на" }, - "html_about_report_issues_suffix": { "message": ". Пожалуйста, убедитесь, что Ваша идея или предложение не были опубликованы ранее. Спасибо!" }, - "html_about_debugging_prefix": { "message": "Чтобы включить ведение журнала или установить флаги отладки, перейдите на " }, - "html_about_debugging_suffix": { "message": "страницу отладки." }, - "html_about_the_github_issues_page": { "message": "странице предложений GitHub" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Это расширение использует" }, - "html_about_html2canvas_suffix": { "message": "библиотеку Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "Также используется " }, - "html_about_indexedDb_suffix": { "message": "обёртка для indexedDb от Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Отдельное спасибо" }, - "html_about_browserstack_suffix": { "message": "за бесплатные средства отладки Chrome." }, - "html_history_title": { "message": "Управление сессиями" }, - "html_history_current_session": { "message": "Текущая сессия" }, - "html_history_recent_sessions": { "message": "Предыдущие сессии" }, - "html_history_saved_sessions": { "message": "Сохранённые сессии" }, - "html_history_import_session": { "message": "Импорт сессии" }, - "html_notice_title": { "message": "Уведомление" }, - "html_notice_important_notice": { "message": "Важное уведомление от The Great Suspender" }, - "html_options_title": { "message": "Настройки" }, - "html_options_suspend_title": { "message": "Автоматическая приостановка вкладок" }, - "html_options_suspended_title": { "message": "Приостановленные вкладки" }, - "html_options_other_title": { "message": "Прочее" }, - "html_options_suspend_automatically_after": { "message": "Автоматически приостанавливать вкладки после" }, - "html_options_suspend_never": { "message": "никогда" }, - "html_options_suspend_seconds": { "message": "секунд" }, - "html_options_suspend_minute": { "message": "минуты" }, - "html_options_suspend_minutes": { "message": "минут" }, - "html_options_suspend_hour": { "message": "часа" }, - "html_options_suspend_hours": { "message": "часов" }, - "html_options_suspend_day": { "message": "дня" }, - "html_options_suspend_days": { "message": "дней" }, - "html_options_suspend_week": { "message": "недели" }, - "html_options_suspend_weeks": { "message": "недель" }, - "html_options_suspend_no_pinned": { "message": "Никогда не приостанавливать закреплённые вкладки" }, - "html_options_suspend_no_forms": { "message": "Никогда не приостанавливать вкладки с несохранёнными полями ввода" }, - "html_options_suspend_no_audio": { "message": "Никогда не приостанавливать вкладки с проигрывающимся аудио" }, - "html_options_suspend_only_connected": { "message": "Никогда не приостанавливать вкладки в режиме оффлайн" }, - "html_options_suspend_only_on_battery": { "message": "Никогда не приостанавливать вкладки, когда подключён источник питания" }, - "html_options_suspend_no_active_tabs": { "message": "Никогда не приостанавливать активную вкладку в каждом окне" }, - "html_options_suspend_automatically_unsuspend": { "message": "Автоматически возобновлять приостановленную вкладку при переходе на неё" }, - "html_options_suspend_discard_after_suspend": { "message": "Использовать встроенный в Chrome механизм экономии памяти для приостановленных вкладок" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Ещё больше уменьшает потребление памяти для приостановленных вкладок, используя" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "встроенный в Chrome механизм выгрузки вкладок. Это позволит уменьшить" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "потребление памяти до 500% (при работе с большим количеством вкладок)." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "Однако, это может привести к небольшой задержке прорисовки приостановленной" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "вкладки при переходе на неё." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": {"message": "Для получения дополнительной информации о механизме выгрузки вкладок Chrome см.:"}, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "Тема" }, - "html_options_suspend_theme_light": { "message": "Светлая" }, - "html_options_suspend_theme_dark": { "message": "Тёмная" }, - "html_options_suspend_screen_capturing": { "message": "Скриншот страницы" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Отключено" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Захватывать только верх страницы" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Захватывать всю страницу" }, - "html_options_suspend_screen_capturing_tooltip_line1a": {"message": "На приостановленной вкладке расширение будет отображать скриншот страницы"}, - "html_options_suspend_screen_capturing_tooltip_line1b": {"message": "до её приостановки." }, - "html_options_suspend_screen_capturing_tooltip_line2a": {"message": "Скриншот страницы является экспериментальной функцией и может привести к значительной"}, - "html_options_suspend_screen_capturing_tooltip_line2b": {"message": "нагрузке на процессор, а также к повышенному потреблению памяти." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Если Вы заметили странное поведение, например, долгую приостановку вкладки или" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "внезапные вылеты Chrome, попробуйте отключить эту функцию." }, - "html_options_suspend_force_screen_capture": { "message": "Использовать более высокое качество скриншотов страниц" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Когда отключено, снимки экрана имеют следующие ограничения:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": {"message": "- Низкое качество скриншота страницы"}, - "html_options_suspend_force_screen_capture_tooltip_line4": {"message": "- Скриншота страницы не будет, если для генерации изображения требуется более 1 минуты"}, - "html_options_suspend_force_screen_capture_tooltip_line5": {"message": "- Максимальная высота скриншота страницы 5000px"}, - "html_options_suspend_force_screen_capture_tooltip_line6": {"message": "Использование скриншотов страниц высокого качества может значительно увеличить"}, - "html_options_suspend_force_screen_capture_tooltip_line7": {"message": "нагрузку на процессор и потребление памяти." }, - "html_options_whitelist_title": { "message": "Никогда не приостанавливать вкладки с URL-адресами из следующего списка:" }, - "html_options_whitelist_tooltip_line1": {"message": "Добавьте URL-адрес каждой страницы, которую Вы хотите добавить в белый список, например:"}, - "html_options_whitelist_tooltip_line2": {"message": "Чтобы не перечислять несколько сайтов, Вы можете указать совпадающую часть URL:"}, - "html_options_whitelist_tooltip_line3": {"message": "Вы также можете использовать регулярные выражения, используя в тексте косые черты:"}, - "html_options_whitelist_test": { "message": "Протестировать белый список" }, - "html_options_other_enable_context_menu": {"message": "Добавить The Great Suspender в контекстное меню правой кнопки мыши"}, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Добавить элементы управления для этого расширения в контекстное меню веб-страницы." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Это даст Вам доступ к дополнительным действиям с вкладками, которые" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "недоступны в другом месте расширения." }, - "html_options_other_enable_sync": { "message": "Синхронизировать настройки с Вашим профилем Chrome" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "Настройки расширения будут синхронизированы с Вашим профилем между" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "всеми браузерами Chrome." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Также синхронизирует настройки в режиме инкогнито." }, - "html_options_other_enable_sync_warning": { "message": "Включение этой опции приведет к перезаписыванию настроек расширения для Вашего профиля между всеми браузерами Chrome" }, - "html_options_suspend_on_low_memory": { "message": "Приостанавливать вкладки при нехватке системной памяти" }, - "html_options_suspend_on_low_memory_tooltip_line1": {"message": "Этот параметр заменяет встроенный в Chrome механизм выгрузки вкладок." }, - "html_options_suspend_on_low_memory_tooltip_line2": {"message": "Если включено, вкладка будет принудительно приостанавливаться, вместо использования механизма выгрузки Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line3": {"message": "Как правило, Chrome выгружает вкладки, только когда системной памяти остаётся очень мало." }, - "html_options_suspend_on_low_memory_tooltip_line4": {"message": "Обратите внимание: это может привести к приостановке вкладок раньше, чем выбрано"}, - "html_options_suspend_on_low_memory_tooltip_line5": {"message": "в настройке \"Автоматически приостанавливать вкладки после\"." }, - "html_options_suspend_on_low_memory_tooltip_line6": {"message": "Для получения дополнительной информации о механизме выгрузки вкладок Chrome см.:"}, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "Возобновить эту вкладку" }, - "html_popup_suspend_tab": { "message": "Приостановить эту вкладку" }, - "html_popup_dont_suspend_now": { "message": "Не приостанавливать" }, - "html_popup_never_suspend_domain": { "message": "Никогда не приостанавливать этот домен" }, - "html_popup_never_suspend_page": { "message": "Никогда не приостанавливать этот URL" }, - "html_popup_suspend_other_tabs": { "message": "Приостановить все остальные вкладки" }, - "html_popup_unsuspend_all_tabs": { "message": "Возобновить все вкладки" }, - "html_popup_suspend_selected_tabs": { "message": "Приостановить выбранные вкладки" }, - "html_popup_unsuspend_selected_tabs": { "message": "Возобновить выбранные вкладки" }, - "html_popup_settings": { "message": "Настройки" }, - "html_restoring_title": { "message": "Восстановление окна" }, - "html_restoring_heading": { "message": "Восстановление вкладок" }, - "html_restoring_detail": { "message": "Пожалуйста, подождите, пока я восстановлю это окно..." }, - "html_recovery_title": { "message": "Восстановление" }, - "html_recovery_ruh_roh": { "message": "Ой-ой!" }, - "html_recovery_description_line1": { "message": "Кажется, расширение завершило работу некорректно." }, - "html_recovery_description_line2": { "message": "Ваши приостановленные вкладки могли пропасть." }, - "html_recovery_restore_tabs_automatically": { "message": "Автоматическое восстановление вкладок" }, - "html_recovery_go_to_session_manager": { "message": "Перейти к управлению сессиями" }, - "html_recovery_important_message": { "message": "У Вас включена функция скриншота страницы. Рекомендуется отключить её, если наблюдаются проблемы с расширением." }, - "html_recovery_disable_screen_capturing": { "message": "Выключить функцию скриншота страницы" }, - "html_recovery_tabs_to_restore": { "message": "Восстановить вкладки" }, - "html_shortcuts_title": { "message": "Горячие клавиши" }, - "html_shortcuts_keyboard_shortcuts": { "message": "Горячие клавиши" }, - "html_shortcuts_context_menu_note": { "message": "Примечание: эти действия также доступны из контекстного меню правой кнопки мыши." }, - "html_shortcuts_remap_keys": { "message": "Изменить горячие клавиши" }, - "html_sidebar_general_settings": { "message": "Настройки" }, - "html_sidebar_session_management": { "message": "Управление сессиями" }, - "html_sidebar_shortcuts": { "message": "Горячие клавиши" }, - "html_sidebar_support": { "message": "О расширении" }, - "html_success_great_success": { "message": "Отлично!" }, - "html_success_all_tabs_restored": { "message": "Все Ваши вкладки были восстановлены." }, - "html_success_goto_advanced_prefix": { "message": "Более продвинутое управление сессиями доступно в разделе " }, - "html_success_goto_advanced_suffix": { "message": "" }, - "html_session_manager": { "message": "управление сессиями" }, - "html_suspended_title": { "message": "Приостановленная вкладка" }, - "html_suspended_tab_suspended": { "message": "Вкладка приостановлена" }, - "html_suspended_tab_reload": { "message": "Обновить вкладку" }, - "html_suspended_tab_whitelist_prefix": { "message": "Никогда не приостанавливать" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "Обновите или нажмите для обновления" }, - "html_suspended_toast_not_connected": { "message": "Нет подключения к интернету" }, - "html_suspended_toast_reload_disabled": { "message": "Автоматическое обновление вкладок временно отключено." }, - "html_permissions_title": { "message": "Разрешения" }, - "html_permissions_heading": { "message": "Пожалуйста, разрешите доступ к локальным файлам" }, - "html_permissions_info": { "message": "У расширения в данный момент нет разрешения приостанавливать вкладки с URL-адресами, начинающимися со слова \"file\".\nЧтобы это изменить, включите \"Разрешить открывать локальные файлы по ссылкам\" со страницы настроек расширения." }, - "html_permissions_backup": { "message": "Примечание: изменение этой опции приведет к временному исчезновению всех приостановленных вкладок.\nНа всякий случай рекомендуем сделать резервную копию вкладок текущей сессии в разделе \"Управление сессиями\"." }, - "html_update_title": { "message": "Обновление" }, - "html_update_heading2": { "message": "становится всё лучше" }, - "html_update_info": { "message": "Новая версия The Great Suspender готова к установке.\nПримечание: в процессе обновления приостановленные вкладки могут временно пропасть." }, - "html_update_info_withbackup": { "message": "На всякий случай рекомендуется сделать резервную копию вкладок текущей сессии." }, - "html_update_info_nobackup_prefix": { "message": "Рекомендуется сделать экспорт текущей сессии" }, - "html_update_info_nobackup_suffix": { "message": " перед обновлением расширения." }, - "html_updated_title": { "message": "Обновлено" }, - "html_updating_heading": { "message": "обновляется" }, - "html_updating_message": { "message": "Восстанавливаются приостановленные вкладки..." }, - "html_updated_great_suspender_updated": { "message": "успешно обновлён" }, - "html_updated_info_line1": { "message": "Перед обновлением была создана резервная копия Ваших вкладок." }, - "html_updated_info_line2_prefix": { "message": "Если во время обновления возникли проблемы, то Вы можете восстановить потерянные вкладки из резервной копии в разделе " }, - "html_updated_info_line2_suffix": { "message": "." }, - "html_updated_detail_header_prefix": { "message": "Что нового в " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_new_features_header": { "message": "Новый функционал:" }, - "html_updated_bug_fixes_header": { "message": "Исправлены баги:" }, - "html_updated_release_notes": { "message": "Прочитать на странице расширения в GitHub: " }, - "html_updated_patch_message": { "message": "Извините за беспокойство. Мне просто нужно было выполнить небольшое техобслуживание." }, - "html_welcome_title": { "message": "Добро пожаловать" }, - "html_welcome_text_line1": { "message": "Спасибо за использование" }, - "html_welcome_text_line2": { "message": "Я ускорю Ваш компьютер, приостанавливая неиспользуемые вкладки." }, - "html_welcome_text_line3": { "message": "Вы можете настроить параметры ниже." }, - "js_popup_normal": { "message": "Вкладка будет приостановлена автоматически." }, - "js_popup_normal_pause": { "message": "Не сейчас" }, - "js_popup_special": { "message": "Вкладка не может быть приостановлена" }, - "js_popup_suspended": { "message": "Вкладка приостановлена" }, - "js_popup_suspended_pause": { "message": "Не приостанавливать" }, - "js_popup_whitelisted": { "message": "Сайт добавлен в белый список." }, - "js_popup_whitelisted_remove": { "message": "Удалить из белого списка" }, - "js_popup_audible": { "message": "Вкладка проигрывает аудио." }, - "js_popup_form_input": { "message": "Вкладка имеет несохранённые поля ввода." }, - "js_popup_form_input_unpause": { "message": "Снять с паузы" }, - "js_popup_pinned": { "message": "Вкладка закреплена" }, - "js_popup_temp_whitelist": { "message": "Приостановка вкладки поставлена на паузу." }, - "js_popup_temp_whitelist_unpause": { "message": "Снять с паузы" }, - "js_popup_never": { "message": "Автоматическая приостановка вкладок отключена." }, - "js_popup_no_connectivity": { "message": "Нет соединения" }, - "js_popup_charging": { "message": "Подключено к источнику питания" }, - "js_popup_blockedFile": { "message": "Локальные файлы не могут быть приостановлены." }, - "js_popup_blockedFile_enable": { "message": "Разрешить" }, - "js_popup_unknown": { "message": "Вкладка загружается..." }, - "js_popup_initialising": { "message": "Расширение запускается..." }, - "js_popup_error": { "message": "Авто-приостановка недоступна для этой вкладки" }, - "js_history_delete": { "message": "удалить" }, - "js_history_export": { "message": "экспортировать" }, - "js_history_reload": { "message": "открыть и загрузить" }, - "js_history_resuspend": { "message": "открыть и приостановить" }, - "js_history_save": { "message": "сохранить" }, - "js_history_window": { "message": "Окно" }, - "js_history_tab": { "message": "Вкладка" }, - "js_history_plural": { "message": "" }, - "js_history_enter_name_for_session": { "message": "Введите имя для сессии" }, - "js_history_confirm_delete": { "message": "Вы точно хотите удалить эту сессию?" }, - "js_history_confirm_session_overwrite": { "message": "Сессия с таким именем уже существует. Перезаписать?" }, - "js_history_import_fail": { "message": "Ошибка при загрузке файла. Убедитесь, что это текстовый файл, и что он содержит не более одного URL-адреса в каждой строке." }, - "js_suspended_remove_from_whitelist": { "message": "Удалить сайт из белого списка" }, - "js_suspended_hotkey_to_reload": { "message": "Назначить горячие клавиши" }, - "js_suspended_low_memory": { "message": "Вкладка приостановлена из-за нехватки памяти" }, - "js_options_incognito_warning": { "message": "Вы находитесь в режиме инкогнито. Некоторые функции будут недоступны." }, - "js_options_whitelist_no_matches": { "message": "Нет открытых вкладок, подходящих под текущий белый список." }, - "js_options_whitelist_matches_heading": { "message": "Открытые вкладки, подходящие под текущий белый список:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "и" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "ещё." }, - "js_permissions_button_export": { "message": "Сохранить резервную копию" }, - "js_permissions_button_set": { "message": "Открыть настройки расширения" }, - "js_update_confirm": { "message": "Вы ещё не сделали резервную копию. Всё равно обновить?" }, - "js_update_button_export": { "message": "Сохранить резервную копию" }, - "js_update_button_reload": { "message": "Обновить расширение" }, - "js_shortcuts_not_set": { "message": "не задано" }, - "js_session_save_point": { "message": "Автоматическая точка восстановления для версии " } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Заставь свой браузер работать быстрее, приостанавливая неактивные вкладки" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Приостановить/Возобновить активную вкладку" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Поставить на паузу/Возобновить приостановку активной вкладки" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Приостановить выбранные вкладки" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Возобновить выбранные вкладки" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Приостановить все остальные вкладки в активном окне" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Принудительно приостановить все остальные вкладки в активном окне" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Возобновить все вкладки в активном окне" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Приостановить все вкладки во всех окнах" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Принудительно приостановить все вкладки во всех окнах" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Возобновить все вкладки во всех окнах" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Открыть ссылку в новой приостановленной вкладке" + }, + "js_context_toggle_suspend_state": { + "message": "Приостановить/Возобновить эту вкладку" + }, + "js_context_toggle_pause_suspension": { + "message": "Поставить на паузу/Возобновить приостановку этой вкладки" + }, + "js_context_never_suspend_domain": { + "message": "Никогда не приостанавливать этот домен" + }, + "js_context_never_suspend_page": { + "message": "Никогда не приостанавливать этот URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Приостановить выбранные вкладки" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Возобновить выбранные вкладки" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Приостановить все остальные вкладки в этом окне" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Принудительно приостановить все остальные вкладки в этом окне" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Возобновить все вкладки в этом окне" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Приостановить все вкладки во всех окнах" + }, + "js_context_force_suspend_all_tabs": { + "message": "Принудительно приостановить все вкладки во всех окнах" + }, + "js_context_unsuspend_all_tabs": { + "message": "Возобновить все вкладки во всех окнах" + }, + "html_about_title": { + "message": "О расширении" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking (more information available on" + }, + "html_about_fork_end": { + "message": ")" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Связаться с нами или сообщить о баге можно на" + }, + "html_about_report_issues_suffix": { + "message": ". Пожалуйста, убедитесь, что Ваша идея или предложение не были опубликованы ранее. Спасибо!" + }, + "html_about_debugging_prefix": { + "message": "Чтобы включить ведение журнала или установить флаги отладки, перейдите на " + }, + "html_about_debugging_suffix": { + "message": "страницу отладки." + }, + "html_about_the_github_issues_page": { + "message": "странице предложений GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Это расширение использует" + }, + "html_about_html2canvas_suffix": { + "message": "библиотеку Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Также используется " + }, + "html_about_indexedDb_suffix": { + "message": "обёртка для indexedDb от Aaron Powell." + }, + "html_about_browserstack": { + "message": "browserstack" + }, + "html_about_browserstack_prefix": { + "message": "Отдельное спасибо" + }, + "html_about_browserstack_suffix": { + "message": "за бесплатные средства отладки Chrome." + }, + "html_history_title": { + "message": "Управление сессиями" + }, + "html_history_current_session": { + "message": "Текущая сессия" + }, + "html_history_recent_sessions": { + "message": "Предыдущие сессии" + }, + "html_history_saved_sessions": { + "message": "Сохранённые сессии" + }, + "html_history_import_session": { + "message": "Импорт сессии" + }, + "html_notice_title": { + "message": "Уведомление" + }, + "html_notice_important_notice": { + "message": "Важное уведомление от The Marvellous Suspender" + }, + "html_options_title": { + "message": "Настройки" + }, + "html_options_suspend_title": { + "message": "Автоматическая приостановка вкладок" + }, + "html_options_suspended_title": { + "message": "Приостановленные вкладки" + }, + "html_options_other_title": { + "message": "Прочее" + }, + "html_options_suspend_automatically_after": { + "message": "Автоматически приостанавливать вкладки после" + }, + "html_options_suspend_never": { + "message": "никогда" + }, + "html_options_suspend_seconds": { + "message": "секунд" + }, + "html_options_suspend_minute": { + "message": "минуты" + }, + "html_options_suspend_minutes": { + "message": "минут" + }, + "html_options_suspend_hour": { + "message": "часа" + }, + "html_options_suspend_hours": { + "message": "часов" + }, + "html_options_suspend_day": { + "message": "дня" + }, + "html_options_suspend_days": { + "message": "дней" + }, + "html_options_suspend_week": { + "message": "недели" + }, + "html_options_suspend_weeks": { + "message": "недель" + }, + "html_options_suspend_no_pinned": { + "message": "Никогда не приостанавливать закреплённые вкладки" + }, + "html_options_suspend_no_forms": { + "message": "Никогда не приостанавливать вкладки с несохранёнными полями ввода" + }, + "html_options_suspend_no_audio": { + "message": "Никогда не приостанавливать вкладки с проигрывающимся аудио" + }, + "html_options_suspend_only_connected": { + "message": "Никогда не приостанавливать вкладки в режиме оффлайн" + }, + "html_options_suspend_only_on_battery": { + "message": "Никогда не приостанавливать вкладки, когда подключён источник питания" + }, + "html_options_suspend_no_active_tabs": { + "message": "Никогда не приостанавливать активную вкладку в каждом окне" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Автоматически возобновлять приостановленную вкладку при переходе на неё" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Использовать встроенный в Chrome механизм экономии памяти для приостановленных вкладок" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Ещё больше уменьшает потребление памяти для приостановленных вкладок, используя" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "встроенный в Chrome механизм выгрузки вкладок. Это позволит уменьшить" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "потребление памяти до 500% (при работе с большим количеством вкладок)." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Однако, это может привести к небольшой задержке прорисовки приостановленной" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "вкладки при переходе на неё." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Для получения дополнительной информации о механизме выгрузки вкладок Chrome см.:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Тема" + }, + "html_options_suspend_theme_light": { + "message": "Светлая" + }, + "html_options_suspend_theme_dark": { + "message": "Тёмная" + }, + "html_options_suspend_screen_capturing": { + "message": "Скриншот страницы" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Отключено" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Захватывать только верх страницы" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Захватывать всю страницу" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "На приостановленной вкладке расширение будет отображать скриншот страницы" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "до её приостановки." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "Скриншот страницы является экспериментальной функцией и может привести к значительной" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "нагрузке на процессор, а также к повышенному потреблению памяти." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Если Вы заметили странное поведение, например, долгую приостановку вкладки или" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "внезапные вылеты Chrome, попробуйте отключить эту функцию." + }, + "html_options_suspend_force_screen_capture": { + "message": "Использовать более высокое качество скриншотов страниц" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Когда отключено, снимки экрана имеют следующие ограничения:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Низкое качество скриншота страницы" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Скриншота страницы не будет, если для генерации изображения требуется более 1 минуты" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Максимальная высота скриншота страницы 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Использование скриншотов страниц высокого качества может значительно увеличить" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "нагрузку на процессор и потребление памяти." + }, + "html_options_whitelist_title": { + "message": "Никогда не приостанавливать вкладки с URL-адресами из следующего списка:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Добавьте URL-адрес каждой страницы, которую Вы хотите добавить в белый список, например:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Чтобы не перечислять несколько сайтов, Вы можете указать совпадающую часть URL:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Вы также можете использовать регулярные выражения, используя в тексте косые черты:" + }, + "html_options_whitelist_test": { + "message": "Протестировать белый список" + }, + "html_options_other_enable_context_menu": { + "message": "Добавить The Marvellous Suspender в контекстное меню правой кнопки мыши" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Добавить элементы управления для этого расширения в контекстное меню веб-страницы." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Это даст Вам доступ к дополнительным действиям с вкладками, которые" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "недоступны в другом месте расширения." + }, + "html_options_other_enable_sync": { + "message": "Синхронизировать настройки с Вашим профилем Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Настройки расширения будут синхронизированы с Вашим профилем между" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "всеми браузерами Chrome." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Также синхронизирует настройки в режиме инкогнито." + }, + "html_options_other_enable_sync_warning": { + "message": "Включение этой опции приведет к перезаписыванию настроек расширения для Вашего профиля между всеми браузерами Chrome" + }, + "html_options_suspend_on_low_memory": { + "message": "Приостанавливать вкладки при нехватке системной памяти" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Этот параметр заменяет встроенный в Chrome механизм выгрузки вкладок." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Если включено, вкладка будет принудительно приостанавливаться, вместо использования механизма выгрузки Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Как правило, Chrome выгружает вкладки, только когда системной памяти остаётся очень мало." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Обратите внимание: это может привести к приостановке вкладок раньше, чем выбрано" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "в настройке \"Автоматически приостанавливать вкладки после\"." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Для получения дополнительной информации о механизме выгрузки вкладок Chrome см.:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Возобновить эту вкладку" + }, + "html_popup_suspend_tab": { + "message": "Приостановить эту вкладку" + }, + "html_popup_dont_suspend_now": { + "message": "Не приостанавливать" + }, + "html_popup_never_suspend_domain": { + "message": "Никогда не приостанавливать этот домен" + }, + "html_popup_never_suspend_page": { + "message": "Никогда не приостанавливать этот URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Приостановить все остальные вкладки" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Возобновить все вкладки" + }, + "html_popup_suspend_selected_tabs": { + "message": "Приостановить выбранные вкладки" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Возобновить выбранные вкладки" + }, + "html_popup_settings": { + "message": "Настройки" + }, + "html_restoring_title": { + "message": "Восстановление окна" + }, + "html_restoring_heading": { + "message": "Восстановление вкладок" + }, + "html_restoring_detail": { + "message": "Пожалуйста, подождите, пока я восстановлю это окно..." + }, + "html_recovery_title": { + "message": "Восстановление" + }, + "html_recovery_ruh_roh": { + "message": "Ой-ой!" + }, + "html_recovery_description_line1": { + "message": "Кажется, расширение завершило работу некорректно." + }, + "html_recovery_description_line2": { + "message": "Ваши приостановленные вкладки могли пропасть." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Автоматическое восстановление вкладок" + }, + "html_recovery_go_to_session_manager": { + "message": "Перейти к управлению сессиями" + }, + "html_recovery_important_message": { + "message": "У Вас включена функция скриншота страницы. Рекомендуется отключить её, если наблюдаются проблемы с расширением." + }, + "html_recovery_disable_screen_capturing": { + "message": "Выключить функцию скриншота страницы" + }, + "html_recovery_tabs_to_restore": { + "message": "Восстановить вкладки" + }, + "html_shortcuts_title": { + "message": "Горячие клавиши" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Горячие клавиши" + }, + "html_shortcuts_context_menu_note": { + "message": "Примечание: эти действия также доступны из контекстного меню правой кнопки мыши." + }, + "html_shortcuts_remap_keys": { + "message": "Изменить горячие клавиши" + }, + "html_sidebar_general_settings": { + "message": "Настройки" + }, + "html_sidebar_session_management": { + "message": "Управление сессиями" + }, + "html_sidebar_shortcuts": { + "message": "Горячие клавиши" + }, + "html_sidebar_support": { + "message": "О расширении" + }, + "html_success_great_success": { + "message": "Отлично!" + }, + "html_success_all_tabs_restored": { + "message": "Все Ваши вкладки были восстановлены." + }, + "html_success_goto_advanced_prefix": { + "message": "Более продвинутое управление сессиями доступно в разделе " + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "управление сессиями" + }, + "html_suspended_title": { + "message": "Приостановленная вкладка" + }, + "html_suspended_tab_suspended": { + "message": "Вкладка приостановлена" + }, + "html_suspended_tab_reload": { + "message": "Обновить вкладку" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Никогда не приостанавливать" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Обновите или нажмите для обновления" + }, + "html_suspended_toast_not_connected": { + "message": "Нет подключения к интернету" + }, + "html_suspended_toast_reload_disabled": { + "message": "Автоматическое обновление вкладок временно отключено." + }, + "html_permissions_title": { + "message": "Разрешения" + }, + "html_permissions_heading": { + "message": "Пожалуйста, разрешите доступ к локальным файлам" + }, + "html_permissions_info": { + "message": "У расширения в данный момент нет разрешения приостанавливать вкладки с URL-адресами, начинающимися со слова \"file\".\nЧтобы это изменить, включите \"Разрешить открывать локальные файлы по ссылкам\" со страницы настроек расширения." + }, + "html_permissions_backup": { + "message": "Примечание: изменение этой опции приведет к временному исчезновению всех приостановленных вкладок.\nНа всякий случай рекомендуем сделать резервную копию вкладок текущей сессии в разделе \"Управление сессиями\"." + }, + "html_update_title": { + "message": "Обновление" + }, + "html_update_heading2": { + "message": "становится всё лучше" + }, + "html_update_info": { + "message": "Новая версия The Marvellous Suspender готова к установке.\nПримечание: в процессе обновления приостановленные вкладки могут временно пропасть." + }, + "html_update_info_withbackup": { + "message": "На всякий случай рекомендуется сделать резервную копию вкладок текущей сессии." + }, + "html_update_info_nobackup_prefix": { + "message": "Рекомендуется сделать экспорт текущей сессии" + }, + "html_update_info_nobackup_suffix": { + "message": " перед обновлением расширения." + }, + "html_updated_title": { + "message": "Обновлено" + }, + "html_updating_heading": { + "message": "обновляется" + }, + "html_updating_message": { + "message": "Восстанавливаются приостановленные вкладки..." + }, + "html_updated_great_suspender_updated": { + "message": "успешно обновлён" + }, + "html_updated_info_line1": { + "message": "Перед обновлением была создана резервная копия Ваших вкладок." + }, + "html_updated_info_line2_prefix": { + "message": "Если во время обновления возникли проблемы, то Вы можете восстановить потерянные вкладки из резервной копии в разделе " + }, + "html_updated_info_line2_suffix": { + "message": "." + }, + "html_updated_detail_header_prefix": { + "message": "Что нового в " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Новый функционал:" + }, + "html_updated_bug_fixes_header": { + "message": "Исправлены баги:" + }, + "html_updated_release_notes": { + "message": "Прочитать на странице расширения в GitHub: " + }, + "html_updated_patch_message": { + "message": "Извините за беспокойство. Мне просто нужно было выполнить небольшое техобслуживание." + }, + "html_welcome_title": { + "message": "Добро пожаловать" + }, + "html_welcome_text_line1": { + "message": "Спасибо за использование" + }, + "html_welcome_text_line2": { + "message": "Я ускорю Ваш компьютер, приостанавливая неиспользуемые вкладки." + }, + "html_welcome_text_line3": { + "message": "Вы можете настроить параметры ниже." + }, + "js_popup_normal": { + "message": "Вкладка будет приостановлена автоматически." + }, + "js_popup_normal_pause": { + "message": "Не сейчас" + }, + "js_popup_special": { + "message": "Вкладка не может быть приостановлена" + }, + "js_popup_suspended": { + "message": "Вкладка приостановлена" + }, + "js_popup_suspended_pause": { + "message": "Не приостанавливать" + }, + "js_popup_whitelisted": { + "message": "Сайт добавлен в белый список." + }, + "js_popup_whitelisted_remove": { + "message": "Удалить из белого списка" + }, + "js_popup_audible": { + "message": "Вкладка проигрывает аудио." + }, + "js_popup_form_input": { + "message": "Вкладка имеет несохранённые поля ввода." + }, + "js_popup_form_input_unpause": { + "message": "Снять с паузы" + }, + "js_popup_pinned": { + "message": "Вкладка закреплена" + }, + "js_popup_temp_whitelist": { + "message": "Приостановка вкладки поставлена на паузу." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Снять с паузы" + }, + "js_popup_never": { + "message": "Автоматическая приостановка вкладок отключена." + }, + "js_popup_no_connectivity": { + "message": "Нет соединения" + }, + "js_popup_charging": { + "message": "Подключено к источнику питания" + }, + "js_popup_blockedFile": { + "message": "Локальные файлы не могут быть приостановлены." + }, + "js_popup_blockedFile_enable": { + "message": "Разрешить" + }, + "js_popup_unknown": { + "message": "Вкладка загружается..." + }, + "js_popup_initialising": { + "message": "Расширение запускается..." + }, + "js_popup_error": { + "message": "Авто-приостановка недоступна для этой вкладки" + }, + "js_history_delete": { + "message": "удалить" + }, + "js_history_export": { + "message": "экспортировать" + }, + "js_history_reload": { + "message": "открыть и загрузить" + }, + "js_history_resuspend": { + "message": "открыть и приостановить" + }, + "js_history_save": { + "message": "сохранить" + }, + "js_history_window": { + "message": "Окно" + }, + "js_history_tab": { + "message": "Вкладка" + }, + "js_history_plural": { + "message": "s" + }, + "js_history_enter_name_for_session": { + "message": "Введите имя для сессии" + }, + "js_history_confirm_delete": { + "message": "Вы точно хотите удалить эту сессию?" + }, + "js_history_confirm_session_overwrite": { + "message": "Сессия с таким именем уже существует. Перезаписать?" + }, + "js_history_import_fail": { + "message": "Ошибка при загрузке файла. Убедитесь, что это текстовый файл, и что он содержит не более одного URL-адреса в каждой строке." + }, + "js_suspended_remove_from_whitelist": { + "message": "Удалить сайт из белого списка" + }, + "js_suspended_hotkey_to_reload": { + "message": "Назначить горячие клавиши" + }, + "js_suspended_low_memory": { + "message": "Вкладка приостановлена из-за нехватки памяти" + }, + "js_options_incognito_warning": { + "message": "Вы находитесь в режиме инкогнито. Некоторые функции будут недоступны." + }, + "js_options_whitelist_no_matches": { + "message": "Нет открытых вкладок, подходящих под текущий белый список." + }, + "js_options_whitelist_matches_heading": { + "message": "Открытые вкладки, подходящие под текущий белый список:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "и" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "ещё." + }, + "js_permissions_button_export": { + "message": "Сохранить резервную копию" + }, + "js_permissions_button_set": { + "message": "Открыть настройки расширения" + }, + "js_update_confirm": { + "message": "Вы ещё не сделали резервную копию. Всё равно обновить?" + }, + "js_update_button_export": { + "message": "Сохранить резервную копию" + }, + "js_update_button_reload": { + "message": "Обновить расширение" + }, + "js_shortcuts_not_set": { + "message": "не задано" + }, + "js_session_save_point": { + "message": "Автоматическая точка восстановления для версии " + } } diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index a9c55c48..649bdf9a 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -1,242 +1,734 @@ { - "ext_cmd_force_suspend_active_window_description": { "message": "Aktif pencere dışında tüm sekmeleri zorla askıya al" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Tüm penceredeki tüm sekmeleri zorla askıya al" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Aktif pencere dışında tüm sekmeleri askıya al" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Tüm pencerelerde tüm sekmeleri askıya al" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Seçilen sekmeyi askıya al" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Aktif sekmenin askı durumunu Duraklat/Devam Et" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Askıya Al/Askıyı Kaldır active tab" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Aktif penceredeki tüm sekmelerin askıya almasını kaldır" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Tüm pencerelerde tüm sekmelerin askıya almasını kaldır" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Seçilen sekmenin askısını kaldır" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Kullanmadığınız sekmeleri askıya alarak bilgisayarınızın sorunsuz çalışmasını sağlayın" }, - "ext_extension_name": { "message": "The Great Suspender" }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Ayrıca teşekkürler" }, - "html_about_browserstack_suffix": { "message": "ücretsiz Chrome test araçları sağladığı için." }, - "html_about_debugging_prefix": { "message": "Hata ayıklama ve günlük (log) kayıtlarının kontrolü için " }, - "html_about_debugging_suffix": { "message": "hata ayıklama sayfası." }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Bu eklentinin kullandığı" }, - "html_about_html2canvas_suffix": { "message": "kütüphane programcısı Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "indexedDb de kullanılır" }, - "html_about_indexedDb_suffix": { "message": "programcı Aaron Powell." }, - "html_about_report_issues_prefix": { "message": "Geri bildiriminiz varsa veya bir sorunu bildirmek istiyorsanız" }, - "html_about_report_issues_suffix": { "message": ". Lütfen yeni bir tane oluşturmadan önce fikrinizin veya sorununun mevcut olup olmaduğını kontrol ediniz. Teşekkürler!" }, - "html_about_the_github_issues_page": { "message": "GitHub sorunlar sayfası" }, - "html_about_title": { "message": "Hakkında" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_history_current_session": { "message": "Şuanki oturum" }, - "html_history_import_session": { "message": "Oturum Al" }, - "html_history_recent_sessions": { "message": "Son oturumlar" }, - "html_history_saved_sessions": { "message": "Kayıtlı oturumlar" }, - "html_history_title": { "message": "Oturum yönetimi" }, - "html_notice_important_notice": { "message": "Great Suspender'dan önemli uyarı" }, - "html_notice_title": { "message": "Not" }, - "html_options_other_enable_context_menu": { "message": "Sağ tuş menüye Great Suspender için menü ekle" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Web sayfasının sağ tıklama menüsüne bu uzantı için kontrol ekle." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Gelişmiş askıya alma işlemlerine" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "buradan erişmenizi sağlayacaktır." }, - "html_options_other_enable_sync": { "message": "Ayarları Chrome profilinizle senkronize yap" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "Yaptığınız uzantı ayarları, aynı profil ile giriş yaptığınız tarayıcı" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "arasında senkronize edilir." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Bu aynı zamanda ayarları gizli modda senkronize edecektir." }, - "html_options_other_enable_sync_warning": { "message": "Bunu açtığınızda, aynı Chrome profilinde oturum açan tarayıcıların ayarlarının üzerine yazılacak" }, - "html_options_other_title": { "message": "Diğer" }, - "html_options_suspend_automatically_after": { "message": "Otomatik sekmeyi askıya al" }, - "html_options_suspend_automatically_unsuspend": { "message": "Sekme görüntülendiğinde askısını kaldır" }, - "html_options_suspend_day": { "message": "gün" }, - "html_options_suspend_days": { "message": "gün" }, - "html_options_suspend_discard_after_suspend": { "message": "Askıya alırken Chrome'un dahili hafıza tasarrufunu uygula" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Askıya alınmış bir sekmenin bellek kullanımını daha da azaltarak" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "Chrome'un yerleşil 'sekme atma' özelliği. Bu sonuçlabilir" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "çok sayıda sekmeler ile çalışırken %500'e varan bellek tasarrufu." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "Ancak, seçildiğinde askıya alınmış sekmede." }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "işlem işlemede gecikmeye sebep olur." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "Bilgi için Chrome'un referans bilgisi:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_force_screen_capture": { "message": "Yüksek kaliteli ekran görüntüsü yakalamayı etkinleştir" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Devre dışı olduğunda, ekran görüntü yakalaması performansa yardımcı olmak için aşağıdaki sınırlamalara sahiptir:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- Düşük kalite ekran görüntüsü yakalama" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- Ekran yakalama görüntüsü oluşturması 1 dakikadan uzun sürerse görüntü yakalanamaz" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- Ekran görüntüsü yakalamanın maksimum yüksekliği 5000px" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Yüksek kaliteli ekran görüntüsü yakalama modu etkinleştirildiğinde işlemci (CPU) yükünü önemli şekilde yükseltebilir" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "ve bellek kullanımı." }, - "html_options_suspend_hour": { "message": "saat" }, - "html_options_suspend_hours": { "message": "saat" }, - "html_options_suspend_minute": { "message": "dakika" }, - "html_options_suspend_minutes": { "message": "saniye" }, - "html_options_suspend_never": { "message": "Hiç" }, - "html_options_suspend_no_active_tabs": { "message": "Asla aktif penceredeki sekmeye askıya al yapma" }, - "html_options_suspend_no_audio": { "message": "Asla ses çalan sekmelere askıya al yapma" }, - "html_options_suspend_no_forms": { "message": "Asla kaydedilmemiş form girişleri içeren sekmeleri askıya al yapma" }, - "html_options_suspend_no_pinned": { "message": "Sabitlenmiş sekmeleri asla askıya al yapma" }, - "html_options_suspend_on_low_memory": { "message": "Sistem belleği çok azaldığında anında askıya al" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "Bu seçenek, Chrome'un otomatik sekme atma özelliğini geçersiz kılar." }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "Etkinleştirilirse, Chrome tarafından atılmak yerine sekmeyi askıya almaya zorlar." }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "Genellikle, Chrome yalnızca sistem belleği çok azaldığında sekmeleri atar." }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "Lütfen dikkat: Bu, sekmelerin sahip olduğunuz süreden daha erken askıya alınmasına sebep olabilir." }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "otomatik sekme askıya alma seçeneklerinde belirtilen." }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "Daha fazla bilgi için Chrome'un referansına bakınız:" }, - "html_options_suspend_only_connected": { "message": "Çevrimdışı olduğunda askıya al yapma" }, - "html_options_suspend_only_on_battery": { "message": "Güç kaynağına bağlı iken sekmeleri askıya al yapma" }, - "html_options_suspend_screen_capturing": { "message": "Ekran görüntüsü yakalama" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Devre dışı" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Tüm sayfayı yakala" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Sadece ekranın üst kısmını yakala" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "Askıya alınmış bir sekmede, uzantı sekmenin ne olduğuna ilişkin resim önizlemesi görüntüleyebilir" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "askıya alınmamış hali gibi." }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "Ekran görüntüsü yakalama özelliği önemli miktarda işlemci (cpu) kullanımına sebep olabilir" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "ve az miktarda bellek kullanımına." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Sekmelerin askıya alınması uzun zaman alıyorsa veya chrome uygulamasında " }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "beklenmedik çekilde çökme vb. olursa, bu özelliği kapatmayı deneyin." }, - "html_options_suspend_seconds": { "message": "saniye" }, - "html_options_suspend_theme": { "message": "Tema" }, - "html_options_suspend_theme_dark": { "message": "Koyu" }, - "html_options_suspend_theme_light": { "message": "Açık" }, - "html_options_suspend_title": { "message": "Otomatik sekme askıya alma" }, - "html_options_suspend_week": { "message": "hafta" }, - "html_options_suspend_weeks": { "message": "hafta" }, - "html_options_suspended_title": { "message": "Askıya alınmış sekmeler" }, - "html_options_title": { "message": "Ayarlar" }, - "html_options_whitelist_test": { "message": "Beyaz liste test" }, - "html_options_whitelist_title": { "message": "Aşağıdaki listede bulunan URL adreslerine askıya al yapma:" }, - "html_options_whitelist_tooltip_line1": { "message": "Beyaz listeye eklemek istediğiniz her sayfanın URL'sini yeni bir satıra ekleyin. Örneğin:" }, - "html_options_whitelist_tooltip_line2": { "message": "Tek bir satırda birden fazla siteyi beyaz listeye almak için URL’nin bir bölümünü belirleyebilirsiniz:" }, - "html_options_whitelist_tooltip_line3": { "message": "Ayrıca, slash vb. ekleyerek de düzenli ifadeler belirleyebilirsiniz:" }, - "html_permissions_backup": { "message": "Lütfen dikkat: Bu seçeneğin değiştirilmesi, askıya alınan tüm sekmelerinizin kısa bir süre kaybolmasına neden olur.\nBu durumda şuanki oturumunu kaydetmeniz iyi bir seçenek olabilir." }, - "html_permissions_heading": { "message": "Yerel dosyalar için lütfen yetki veriniz" }, - "html_permissions_info": { "message": "Bu uzantı, \"file\" kelimesi ile başlayan URL’leri askıya almasına izin veremiyor.\nBunu değiştirmek için uzantı ayarları sayfasından ayrıntılarına girip \"Dosya URL'lerine erişime izin ver\" seçeneğini açınız." }, - "html_permissions_title": { "message": "Yetkiler" }, - "html_popup_dont_suspend_now": { "message": "Şimdilik askıya almasını kaldır" }, - "html_popup_never_suspend_domain": { "message": "Bu alanadını hiçbir zaman askıya alma" }, - "html_popup_never_suspend_page": { "message": "Bu URL adresini hiçbir zaman askıya alma" }, - "html_popup_settings": { "message": "Ayarlar" }, - "html_popup_suspend_other_tabs": { "message": "Diğer seklemeri askıya al" }, - "html_popup_suspend_selected_tabs": { "message": "Seçilen sekmeyi askıya al" }, - "html_popup_suspend_tab": { "message": "Bu sekmeyi askıya al" }, - "html_popup_unsuspend_all_tabs": { "message": "Tüm sekmelerin askısını kaldır" }, - "html_popup_unsuspend_selected_tabs": { "message": "Seçilen sekmenin askısını kaldır" }, - "html_popup_unsuspend_tab": { "message": "Bu sekmenin askısını kaldır" }, - "html_recovery_description_line1": { "message": "Uzantının çökmesinden kurtuldunuz gibi görünüyor." }, - "html_recovery_description_line2": { "message": "Askıya alınan sekmeleriniz çökmüş veya kaybolmuş olabilir." }, - "html_recovery_disable_screen_capturing": { "message": "Ekran görüntüsü yakalama devre dışı" }, - "html_recovery_go_to_session_manager": { "message": "Oturum yöneticisine git" }, - "html_recovery_important_message": { "message": "Şu anda ekran görüntüsü yakalamayı açtınız. Bu uzantı art arda çöküyorsa, bu seçeneği devre dışı bırakmanız önerilir." }, - "html_recovery_restore_tabs_automatically": { "message": "Sekmeleri otomatik geri yükle" }, - "html_recovery_ruh_roh": { "message": "Ruh roh!" }, - "html_recovery_tabs_to_restore": { "message": "Sekmeleri geri yükle" }, - "html_recovery_title": { "message": "Kurtarma" }, - "html_restoring_detail": { "message": "Bu pencereyi geri yüklerken lütfen bekleyin..." }, - "html_restoring_heading": { "message": "Sekmeler geri yükleniyor" }, - "html_restoring_title": { "message": "Pencere geri yükleniyor" }, - "html_session_manager": { "message": "oturum yöneticisi" }, - "html_shortcuts_context_menu_note": { "message": "Not: Bu işlemlere mouse sağ tuş menü üzerinden de erişilebilir." }, - "html_shortcuts_keyboard_shortcuts": { "message": "Klavye kısayolları" }, - "html_shortcuts_remap_keys": { "message": "Klavye kısayol değiştir" }, - "html_shortcuts_title": { "message": "Klavye kısayolları" }, - "html_sidebar_general_settings": { "message": "Ayarlar" }, - "html_sidebar_session_management": { "message": "Oturum yöneticisi" }, - "html_sidebar_shortcuts": { "message": "Klavye kısayolları" }, - "html_sidebar_support": { "message": "Hakkında" }, - "html_success_all_tabs_restored": { "message": "Tüm sekmeleriniz geri yüklendi." }, - "html_success_goto_advanced_prefix": { "message": "Gelişmiş oturum yöneticisi için, ziyaret edin" }, - "html_success_goto_advanced_suffix": { "message": "sayfa" }, - "html_success_great_success": { "message": "Başarılı!" }, - "html_suspended_click_to_reload": { "message": "Sayfa askıya alındı.\n\nSayfayı geri yüklemek için tıklayın veya sayfayı yenileyin." }, - "html_suspended_tab_reload": { "message": "Sekmeyi Yeniden Yükle" }, - "html_suspended_tab_suspended": { "message": "Sekme askıya alındı" }, - "html_suspended_tab_whitelist_prefix": { "message": "Askıya Alma Yapma" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_title": { "message": "Askıya Alınmış Sekme" }, - "html_suspended_toast_not_connected": { "message": "Internete bağlı değilsiniz" }, - "html_suspended_toast_reload_disabled": { "message": "Otomatik geri yükleme geçici olarak devre dışı." }, - "html_update_heading2": { "message": "daha büyük olma üzere" }, - "html_update_info": { "message": "The Great Suspender yeni bir sürümü kurulmaya hazır.\nLütfen dikkat: Güncelleme sırasında askıya alınmış sekmeleriniz kısa bir süre kaybolacaktır." }, - "html_update_info_nobackup_prefix": { "message": "Şu anki oturumunuzun buradan kopyasını dışarı aktarma yapmanızı öneririz " }, - "html_update_info_nobackup_suffix": { "message": " güncellemeye devam etmeden önce." }, - "html_update_info_withbackup": { "message": "Şu anki sekmenin oturum yedeğini almak için uygun zaman olabilir." }, - "html_update_title": { "message": "Güncelle" }, - "html_updated_bug_fixes_header": { "message": "Yamalar:" }, - "html_updated_detail_header_prefix": { "message": "Yenilikler " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_great_suspender_updated": { "message": "güncellendi" }, - "html_updated_info_line1": { "message": "Güncelleme öncesinde sekmeleriniz otomatik olarak yedeklenir." }, - "html_updated_info_line2_prefix": { "message": "Güncelleme sırasında herhangi bir sorunla karşılaştıysanız, kaybolan sekmeleri geri yüklebilirsiniz " }, - "html_updated_info_line2_suffix": { "message": " sayfa." }, - "html_updated_new_features_header": { "message": "Yeni özellikler:" }, - "html_updated_patch_message": { "message": "Özür dileriz. Sadece biraz bakım yapmamız gerekiyor." }, - "html_updated_release_notes": { "message": "Tüm sürüm notları için GitHub'ı ziyaret edin: " }, - "html_updated_title": { "message": "Güncellendi" }, - "html_updating_heading": { "message": "günceleniyor" }, - "html_updating_message": { "message": "Askıya alınmış sekmeleriniz geri yüklenirken lütfen bekleyiniz..." }, - "html_welcome_text_line1": { "message": "Tekrar için deneniyor teşekkürler" }, - "html_welcome_text_line2": { "message": "Kullanmadığınız sekmeleri askıya alarak bilgisayarınızın sorunsuz çalışmasını sağlayabilirsiniz." }, - "html_welcome_text_line3": { "message": "Aşağıdaki ayarları hassas şekilde yapabilirsiniz." }, - "html_welcome_title": { "message": "Hoşgeldiniz" }, - "js_context_force_suspend_all_tabs": { "message": "Tüm penceredeki tüm sekmeleri zorla askıya al" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Bu pencere dışındaki tüm sekmeleri zorla askıya al" }, - "js_context_never_suspend_domain": { "message": "Bu alanadını hiçbir zaman askıya alma" }, - "js_context_never_suspend_page": { "message": "Bu URL adresini hiçbir zaman askıya alma" }, - "js_context_open_link_in_suspended_tab": { "message": "Askıya Alınmış Sekmede Adresi Aç" }, - "js_context_soft_suspend_all_tabs": { "message": "Tüm penceredeki tüm sekmeleri askıya al" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Bu pencere dışındaki tüm sekmeleri askıya al" }, - "js_context_suspend_selected_tabs": { "message": "Seçilen sekmeyi askıya al" }, - "js_context_toggle_pause_suspension": { "message": "Bu sekmenin askı durumunu Duraklat/Devam Et" }, - "js_context_toggle_suspend_state": { "message": "Bu sekmeyi Askıya Al/Askısını Kaldır" }, - "js_context_unsuspend_all_tabs": { "message": "Tüm penceredeki tüm sekmelerin askısını kaldır" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Bu penceredeki tüm sekmelerin askısını kaldır" }, - "js_context_unsuspend_selected_tabs": { "message": "Seçilen sekmenin askısını kaldır" }, - "js_history_confirm_delete": { "message": "Bu oturumu silmek istediğinizden emin misiniz??" }, - "js_history_confirm_session_overwrite": { "message": "Bu oturum bu isim ile zaten kaydedilmiş. Üzerine kayıt yapılsın mı?" }, - "js_history_delete": { "message": "Sil" }, - "js_history_enter_name_for_session": { "message": "Bu oturum için bir isim girin" }, - "js_history_export": { "message": "Dışa aktar" }, - "js_history_import_fail": { "message": "Dosya yükleme başarısız. Dosyanın düz metin olduğundan ve satır başına tek bir URL içerdiğinden emin olunuz." }, - "js_history_plural": { "message": "s" }, - "js_history_reload": { "message": "Aç ve yükle" }, - "js_history_resuspend": { "message": "Aç ve askıya al" }, - "js_history_save": { "message": "Kaydet" }, - "js_history_tab": { "message": "Sekme" }, - "js_history_window": { "message": "Pencere" }, - "js_options_incognito_warning": { "message": "Gizli moddasınız. Bazı özellikler kullanılamayacak." }, - "js_options_whitelist_matches_heading": { "message": "Sekme beyaz listesi:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "ve" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "dahası." }, - "js_options_whitelist_no_matches": { "message": "Mevcut beyaz listeyle eşleşen açık sekme yok." }, - "js_permissions_button_export": { "message": "Yedeği kaydet" }, - "js_permissions_button_set": { "message": "Uzantı ayarlarını aç" }, - "js_popup_audible": { "message": "Sekme ses çalıyor." }, - "js_popup_blockedFile": { "message": "Yerel dosyalar askıya alınamaz." }, - "js_popup_blockedFile_enable": { "message": "Açık" }, - "js_popup_charging": { "message": "Güç kaynağına bağlandı" }, - "js_popup_error": { "message": "Bu sekme için otomatik askıya alma kullanılamıyor" }, - "js_popup_form_input": { "message": "Sekme form girişi yapıyor." }, - "js_popup_form_input_unpause": { "message": "Devam Et" }, - "js_popup_initialising": { "message": "Uzantının başlatılması bekleniyor..." }, - "js_popup_never": { "message": "Otomatik sekme askıya alma devre dışı." }, - "js_popup_no_connectivity": { "message": "Ağ bağlantısı yok" }, - "js_popup_normal": { "message": "Otomatik sekmeyi askıya al." }, - "js_popup_normal_pause": { "message": "Şimdi değil" }, - "js_popup_pinned": { "message": "Sekme sabit" }, - "js_popup_special": { "message": "Askıya alınmadı" }, - "js_popup_suspended": { "message": "Sekme askıya alındı" }, - "js_popup_suspended_pause": { "message": "Askı Duraklatıldı" }, - "js_popup_temp_whitelist": { "message": "Sekme askı durumu duraklatıldı." }, - "js_popup_temp_whitelist_unpause": { "message": "Devam Et" }, - "js_popup_unknown": { "message": "Geri yükleme için sekme bekleniyor..." }, - "js_popup_whitelisted": { "message": "Site beyaz listede." }, - "js_popup_whitelisted_remove": { "message": "Beyaz listeden kaldır" }, - "js_session_save_point": { "message": "v için otomatik kaydetme noktası" }, - "js_shortcuts_not_set": { "message": "tanımsız" }, - "js_suspended_hotkey_to_reload": { "message": "Klavye kısayolları" }, - "js_suspended_low_memory": { "message": "Düşük sistem belleği nedeni ile sekme askıya alındı" }, - "js_suspended_remove_from_whitelist": { "message": "Bu web sitesini beyaz listeden kaldır" }, - "js_update_button_export": { "message": "Yedeği sakla" }, - "js_update_button_reload": { "message": "Uzantı güncelle" }, - "js_update_confirm": { "message": "Henüz bir yedekleme yapmadınız. Uzantıyı yine de güncellensin mi?" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Kullanmadığınız sekmeleri askıya alarak bilgisayarınızın sorunsuz çalışmasını sağlayın" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Askıya Al/Askıyı Kaldır active tab" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Aktif sekmenin askı durumunu Duraklat/Devam Et" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Seçilen sekmeyi askıya al" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Seçilen sekmenin askısını kaldır" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Aktif pencere dışında tüm sekmeleri askıya al" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Aktif pencere dışında tüm sekmeleri zorla askıya al" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Aktif penceredeki tüm sekmelerin askıya almasını kaldır" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Tüm pencerelerde tüm sekmeleri askıya al" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Tüm penceredeki tüm sekmeleri zorla askıya al" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Tüm pencerelerde tüm sekmelerin askıya almasını kaldır" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Askıya Alınmış Sekmede Adresi Aç" + }, + "js_context_toggle_suspend_state": { + "message": "Bu sekmeyi Askıya Al/Askısını Kaldır" + }, + "js_context_toggle_pause_suspension": { + "message": "Bu sekmenin askı durumunu Duraklat/Devam Et" + }, + "js_context_never_suspend_domain": { + "message": "Bu alanadını hiçbir zaman askıya alma" + }, + "js_context_never_suspend_page": { + "message": "Bu URL adresini hiçbir zaman askıya alma" + }, + "js_context_suspend_selected_tabs": { + "message": "Seçilen sekmeyi askıya al" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Seçilen sekmenin askısını kaldır" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Bu pencere dışındaki tüm sekmeleri askıya al" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Bu pencere dışındaki tüm sekmeleri zorla askıya al" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Bu penceredeki tüm sekmelerin askısını kaldır" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Tüm penceredeki tüm sekmeleri askıya al" + }, + "js_context_force_suspend_all_tabs": { + "message": "Tüm penceredeki tüm sekmeleri zorla askıya al" + }, + "js_context_unsuspend_all_tabs": { + "message": "Tüm penceredeki tüm sekmelerin askısını kaldır" + }, + "html_about_title": { + "message": "Hakkında" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking (more information available on" + }, + "html_about_fork_end": { + "message": ")" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Geri bildiriminiz varsa veya bir sorunu bildirmek istiyorsanız" + }, + "html_about_report_issues_suffix": { + "message": ". Lütfen yeni bir tane oluşturmadan önce fikrinizin veya sorununun mevcut olup olmaduğını kontrol ediniz. Teşekkürler!" + }, + "html_about_debugging_prefix": { + "message": "Hata ayıklama ve günlük (log) kayıtlarının kontrolü için " + }, + "html_about_debugging_suffix": { + "message": "hata ayıklama sayfası." + }, + "html_about_the_github_issues_page": { + "message": "GitHub sorunlar sayfası" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Bu eklentinin kullandığı" + }, + "html_about_html2canvas_suffix": { + "message": "kütüphane programcısı Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "indexedDb de kullanılır" + }, + "html_about_indexedDb_suffix": { + "message": "programcı Aaron Powell." + }, + "html_about_browserstack": { + "message": "browserstack" + }, + "html_about_browserstack_prefix": { + "message": "Ayrıca teşekkürler" + }, + "html_about_browserstack_suffix": { + "message": "ücretsiz Chrome test araçları sağladığı için." + }, + "html_history_title": { + "message": "Oturum yönetimi" + }, + "html_history_current_session": { + "message": "Şuanki oturum" + }, + "html_history_recent_sessions": { + "message": "Son oturumlar" + }, + "html_history_saved_sessions": { + "message": "Kayıtlı oturumlar" + }, + "html_history_import_session": { + "message": "Oturum Al" + }, + "html_notice_title": { + "message": "Not" + }, + "html_notice_important_notice": { + "message": "Marvellous Suspender'dan önemli uyarı" + }, + "html_options_title": { + "message": "Ayarlar" + }, + "html_options_suspend_title": { + "message": "Otomatik sekme askıya alma" + }, + "html_options_suspended_title": { + "message": "Askıya alınmış sekmeler" + }, + "html_options_other_title": { + "message": "Diğer" + }, + "html_options_suspend_automatically_after": { + "message": "Otomatik sekmeyi askıya al" + }, + "html_options_suspend_never": { + "message": "Hiç" + }, + "html_options_suspend_seconds": { + "message": "saniye" + }, + "html_options_suspend_minute": { + "message": "dakika" + }, + "html_options_suspend_minutes": { + "message": "saniye" + }, + "html_options_suspend_hour": { + "message": "saat" + }, + "html_options_suspend_hours": { + "message": "saat" + }, + "html_options_suspend_day": { + "message": "gün" + }, + "html_options_suspend_days": { + "message": "gün" + }, + "html_options_suspend_week": { + "message": "hafta" + }, + "html_options_suspend_weeks": { + "message": "hafta" + }, + "html_options_suspend_no_pinned": { + "message": "Sabitlenmiş sekmeleri asla askıya al yapma" + }, + "html_options_suspend_no_forms": { + "message": "Asla kaydedilmemiş form girişleri içeren sekmeleri askıya al yapma" + }, + "html_options_suspend_no_audio": { + "message": "Asla ses çalan sekmelere askıya al yapma" + }, + "html_options_suspend_only_connected": { + "message": "Çevrimdışı olduğunda askıya al yapma" + }, + "html_options_suspend_only_on_battery": { + "message": "Güç kaynağına bağlı iken sekmeleri askıya al yapma" + }, + "html_options_suspend_no_active_tabs": { + "message": "Asla aktif penceredeki sekmeye askıya al yapma" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Sekme görüntülendiğinde askısını kaldır" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Askıya alırken Chrome'un dahili hafıza tasarrufunu uygula" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Askıya alınmış bir sekmenin bellek kullanımını daha da azaltarak" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "Chrome'un yerleşil 'sekme atma' özelliği. Bu sonuçlabilir" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "çok sayıda sekmeler ile çalışırken %500'e varan bellek tasarrufu." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Ancak, seçildiğinde askıya alınmış sekmede." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "işlem işlemede gecikmeye sebep olur." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Bilgi için Chrome'un referans bilgisi:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Açık" + }, + "html_options_suspend_theme_dark": { + "message": "Koyu" + }, + "html_options_suspend_screen_capturing": { + "message": "Ekran görüntüsü yakalama" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Devre dışı" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Sadece ekranın üst kısmını yakala" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Tüm sayfayı yakala" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Askıya alınmış bir sekmede, uzantı sekmenin ne olduğuna ilişkin resim önizlemesi görüntüleyebilir" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "askıya alınmamış hali gibi." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "Ekran görüntüsü yakalama özelliği önemli miktarda işlemci (cpu) kullanımına sebep olabilir" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "ve az miktarda bellek kullanımına." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Sekmelerin askıya alınması uzun zaman alıyorsa veya chrome uygulamasında " + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "beklenmedik çekilde çökme vb. olursa, bu özelliği kapatmayı deneyin." + }, + "html_options_suspend_force_screen_capture": { + "message": "Yüksek kaliteli ekran görüntüsü yakalamayı etkinleştir" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Devre dışı olduğunda, ekran görüntü yakalaması performansa yardımcı olmak için aşağıdaki sınırlamalara sahiptir:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Düşük kalite ekran görüntüsü yakalama" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Ekran yakalama görüntüsü oluşturması 1 dakikadan uzun sürerse görüntü yakalanamaz" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Ekran görüntüsü yakalamanın maksimum yüksekliği 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Yüksek kaliteli ekran görüntüsü yakalama modu etkinleştirildiğinde işlemci (CPU) yükünü önemli şekilde yükseltebilir" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "ve bellek kullanımı." + }, + "html_options_whitelist_title": { + "message": "Aşağıdaki listede bulunan URL adreslerine askıya al yapma:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Beyaz listeye eklemek istediğiniz her sayfanın URL'sini yeni bir satıra ekleyin. Örneğin:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Tek bir satırda birden fazla siteyi beyaz listeye almak için URL’nin bir bölümünü belirleyebilirsiniz:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Ayrıca, slash vb. ekleyerek de düzenli ifadeler belirleyebilirsiniz:" + }, + "html_options_whitelist_test": { + "message": "Beyaz liste test" + }, + "html_options_other_enable_context_menu": { + "message": "Sağ tuş menüye Marvellous Suspender için menü ekle" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Web sayfasının sağ tıklama menüsüne bu uzantı için kontrol ekle." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Gelişmiş askıya alma işlemlerine" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "buradan erişmenizi sağlayacaktır." + }, + "html_options_other_enable_sync": { + "message": "Ayarları Chrome profilinizle senkronize yap" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Yaptığınız uzantı ayarları, aynı profil ile giriş yaptığınız tarayıcı" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "arasında senkronize edilir." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Bu aynı zamanda ayarları gizli modda senkronize edecektir." + }, + "html_options_other_enable_sync_warning": { + "message": "Bunu açtığınızda, aynı Chrome profilinde oturum açan tarayıcıların ayarlarının üzerine yazılacak" + }, + "html_options_suspend_on_low_memory": { + "message": "Sistem belleği çok azaldığında anında askıya al" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Bu seçenek, Chrome'un otomatik sekme atma özelliğini geçersiz kılar." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Etkinleştirilirse, Chrome tarafından atılmak yerine sekmeyi askıya almaya zorlar." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Genellikle, Chrome yalnızca sistem belleği çok azaldığında sekmeleri atar." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Lütfen dikkat: Bu, sekmelerin sahip olduğunuz süreden daha erken askıya alınmasına sebep olabilir." + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "otomatik sekme askıya alma seçeneklerinde belirtilen." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Daha fazla bilgi için Chrome'un referansına bakınız:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Bu sekmenin askısını kaldır" + }, + "html_popup_suspend_tab": { + "message": "Bu sekmeyi askıya al" + }, + "html_popup_dont_suspend_now": { + "message": "Şimdilik askıya almasını kaldır" + }, + "html_popup_never_suspend_domain": { + "message": "Bu alanadını hiçbir zaman askıya alma" + }, + "html_popup_never_suspend_page": { + "message": "Bu URL adresini hiçbir zaman askıya alma" + }, + "html_popup_suspend_other_tabs": { + "message": "Diğer seklemeri askıya al" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Tüm sekmelerin askısını kaldır" + }, + "html_popup_suspend_selected_tabs": { + "message": "Seçilen sekmeyi askıya al" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Seçilen sekmenin askısını kaldır" + }, + "html_popup_settings": { + "message": "Ayarlar" + }, + "html_restoring_title": { + "message": "Pencere geri yükleniyor" + }, + "html_restoring_heading": { + "message": "Sekmeler geri yükleniyor" + }, + "html_restoring_detail": { + "message": "Bu pencereyi geri yüklerken lütfen bekleyin..." + }, + "html_recovery_title": { + "message": "Kurtarma" + }, + "html_recovery_ruh_roh": { + "message": "Ruh roh!" + }, + "html_recovery_description_line1": { + "message": "Uzantının çökmesinden kurtuldunuz gibi görünüyor." + }, + "html_recovery_description_line2": { + "message": "Askıya alınan sekmeleriniz çökmüş veya kaybolmuş olabilir." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Sekmeleri otomatik geri yükle" + }, + "html_recovery_go_to_session_manager": { + "message": "Oturum yöneticisine git" + }, + "html_recovery_important_message": { + "message": "Şu anda ekran görüntüsü yakalamayı açtınız. Bu uzantı art arda çöküyorsa, bu seçeneği devre dışı bırakmanız önerilir." + }, + "html_recovery_disable_screen_capturing": { + "message": "Ekran görüntüsü yakalama devre dışı" + }, + "html_recovery_tabs_to_restore": { + "message": "Sekmeleri geri yükle" + }, + "html_shortcuts_title": { + "message": "Klavye kısayolları" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Klavye kısayolları" + }, + "html_shortcuts_context_menu_note": { + "message": "Not: Bu işlemlere mouse sağ tuş menü üzerinden de erişilebilir." + }, + "html_shortcuts_remap_keys": { + "message": "Klavye kısayol değiştir" + }, + "html_sidebar_general_settings": { + "message": "Ayarlar" + }, + "html_sidebar_session_management": { + "message": "Oturum yöneticisi" + }, + "html_sidebar_shortcuts": { + "message": "Klavye kısayolları" + }, + "html_sidebar_support": { + "message": "Hakkında" + }, + "html_success_great_success": { + "message": "Başarılı!" + }, + "html_success_all_tabs_restored": { + "message": "Tüm sekmeleriniz geri yüklendi." + }, + "html_success_goto_advanced_prefix": { + "message": "Gelişmiş oturum yöneticisi için, ziyaret edin" + }, + "html_success_goto_advanced_suffix": { + "message": "sayfa" + }, + "html_session_manager": { + "message": "oturum yöneticisi" + }, + "html_suspended_title": { + "message": "Askıya Alınmış Sekme" + }, + "html_suspended_tab_suspended": { + "message": "Sekme askıya alındı" + }, + "html_suspended_tab_reload": { + "message": "Sekmeyi Yeniden Yükle" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Askıya Alma Yapma" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Sayfa askıya alındı.\n\nSayfayı geri yüklemek için tıklayın veya sayfayı yenileyin." + }, + "html_suspended_toast_not_connected": { + "message": "Internete bağlı değilsiniz" + }, + "html_suspended_toast_reload_disabled": { + "message": "Otomatik geri yükleme geçici olarak devre dışı." + }, + "html_permissions_title": { + "message": "Yetkiler" + }, + "html_permissions_heading": { + "message": "Yerel dosyalar için lütfen yetki veriniz" + }, + "html_permissions_info": { + "message": "Bu uzantı, \"file\" kelimesi ile başlayan URL’leri askıya almasına izin veremiyor.\nBunu değiştirmek için uzantı ayarları sayfasından ayrıntılarına girip \"Dosya URL'lerine erişime izin ver\" seçeneğini açınız." + }, + "html_permissions_backup": { + "message": "Lütfen dikkat: Bu seçeneğin değiştirilmesi, askıya alınan tüm sekmelerinizin kısa bir süre kaybolmasına neden olur.\nBu durumda şuanki oturumunu kaydetmeniz iyi bir seçenek olabilir." + }, + "html_update_title": { + "message": "Güncelle" + }, + "html_update_heading2": { + "message": "daha büyük olma üzere" + }, + "html_update_info": { + "message": "The Marvellous Suspender yeni bir sürümü kurulmaya hazır.\nLütfen dikkat: Güncelleme sırasında askıya alınmış sekmeleriniz kısa bir süre kaybolacaktır." + }, + "html_update_info_withbackup": { + "message": "Şu anki sekmenin oturum yedeğini almak için uygun zaman olabilir." + }, + "html_update_info_nobackup_prefix": { + "message": "Şu anki oturumunuzun buradan kopyasını dışarı aktarma yapmanızı öneririz " + }, + "html_update_info_nobackup_suffix": { + "message": " güncellemeye devam etmeden önce." + }, + "html_updated_title": { + "message": "Güncellendi" + }, + "html_updating_heading": { + "message": "günceleniyor" + }, + "html_updating_message": { + "message": "Askıya alınmış sekmeleriniz geri yüklenirken lütfen bekleyiniz..." + }, + "html_updated_great_suspender_updated": { + "message": "güncellendi" + }, + "html_updated_info_line1": { + "message": "Güncelleme öncesinde sekmeleriniz otomatik olarak yedeklenir." + }, + "html_updated_info_line2_prefix": { + "message": "Güncelleme sırasında herhangi bir sorunla karşılaştıysanız, kaybolan sekmeleri geri yüklebilirsiniz " + }, + "html_updated_info_line2_suffix": { + "message": " sayfa." + }, + "html_updated_detail_header_prefix": { + "message": "Yenilikler " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Yeni özellikler:" + }, + "html_updated_bug_fixes_header": { + "message": "Yamalar:" + }, + "html_updated_release_notes": { + "message": "Tüm sürüm notları için GitHub'ı ziyaret edin: " + }, + "html_updated_patch_message": { + "message": "Özür dileriz. Sadece biraz bakım yapmamız gerekiyor." + }, + "html_welcome_title": { + "message": "Hoşgeldiniz" + }, + "html_welcome_text_line1": { + "message": "Tekrar için deneniyor teşekkürler" + }, + "html_welcome_text_line2": { + "message": "Kullanmadığınız sekmeleri askıya alarak bilgisayarınızın sorunsuz çalışmasını sağlayabilirsiniz." + }, + "html_welcome_text_line3": { + "message": "Aşağıdaki ayarları hassas şekilde yapabilirsiniz." + }, + "js_popup_normal": { + "message": "Otomatik sekmeyi askıya al." + }, + "js_popup_normal_pause": { + "message": "Şimdi değil" + }, + "js_popup_special": { + "message": "Askıya alınmadı" + }, + "js_popup_suspended": { + "message": "Sekme askıya alındı" + }, + "js_popup_suspended_pause": { + "message": "Askı Duraklatıldı" + }, + "js_popup_whitelisted": { + "message": "Site beyaz listede." + }, + "js_popup_whitelisted_remove": { + "message": "Beyaz listeden kaldır" + }, + "js_popup_audible": { + "message": "Sekme ses çalıyor." + }, + "js_popup_form_input": { + "message": "Sekme form girişi yapıyor." + }, + "js_popup_form_input_unpause": { + "message": "Devam Et" + }, + "js_popup_pinned": { + "message": "Sekme sabit" + }, + "js_popup_temp_whitelist": { + "message": "Sekme askı durumu duraklatıldı." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Devam Et" + }, + "js_popup_never": { + "message": "Otomatik sekme askıya alma devre dışı." + }, + "js_popup_no_connectivity": { + "message": "Ağ bağlantısı yok" + }, + "js_popup_charging": { + "message": "Güç kaynağına bağlandı" + }, + "js_popup_blockedFile": { + "message": "Yerel dosyalar askıya alınamaz." + }, + "js_popup_blockedFile_enable": { + "message": "Açık" + }, + "js_popup_unknown": { + "message": "Geri yükleme için sekme bekleniyor..." + }, + "js_popup_initialising": { + "message": "Uzantının başlatılması bekleniyor..." + }, + "js_popup_error": { + "message": "Bu sekme için otomatik askıya alma kullanılamıyor" + }, + "js_history_delete": { + "message": "Sil" + }, + "js_history_export": { + "message": "Dışa aktar" + }, + "js_history_reload": { + "message": "Aç ve yükle" + }, + "js_history_resuspend": { + "message": "Aç ve askıya al" + }, + "js_history_save": { + "message": "Kaydet" + }, + "js_history_window": { + "message": "Pencere" + }, + "js_history_tab": { + "message": "Sekme" + }, + "js_history_plural": { + "message": "s" + }, + "js_history_enter_name_for_session": { + "message": "Bu oturum için bir isim girin" + }, + "js_history_confirm_delete": { + "message": "Bu oturumu silmek istediğinizden emin misiniz??" + }, + "js_history_confirm_session_overwrite": { + "message": "Bu oturum bu isim ile zaten kaydedilmiş. Üzerine kayıt yapılsın mı?" + }, + "js_history_import_fail": { + "message": "Dosya yükleme başarısız. Dosyanın düz metin olduğundan ve satır başına tek bir URL içerdiğinden emin olunuz." + }, + "js_suspended_remove_from_whitelist": { + "message": "Bu web sitesini beyaz listeden kaldır" + }, + "js_suspended_hotkey_to_reload": { + "message": "Klavye kısayolları" + }, + "js_suspended_low_memory": { + "message": "Düşük sistem belleği nedeni ile sekme askıya alındı" + }, + "js_options_incognito_warning": { + "message": "Gizli moddasınız. Bazı özellikler kullanılamayacak." + }, + "js_options_whitelist_no_matches": { + "message": "Mevcut beyaz listeyle eşleşen açık sekme yok." + }, + "js_options_whitelist_matches_heading": { + "message": "Sekme beyaz listesi:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "ve" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "dahası." + }, + "js_permissions_button_export": { + "message": "Yedeği kaydet" + }, + "js_permissions_button_set": { + "message": "Uzantı ayarlarını aç" + }, + "js_update_confirm": { + "message": "Henüz bir yedekleme yapmadınız. Uzantıyı yine de güncellensin mi?" + }, + "js_update_button_export": { + "message": "Yedeği sakla" + }, + "js_update_button_reload": { + "message": "Uzantı güncelle" + }, + "js_shortcuts_not_set": { + "message": "tanımsız" + }, + "js_session_save_point": { + "message": "v için otomatik kaydetme noktası" + } } diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 1eec5a20..2a64cc19 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -1,242 +1,734 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "冻结暂时用不到的标签页,以便释放系统资源。" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "冻结/恢复当前标签页" }, - "ext_cmd_toggle_tab_pause_description": { "message": "暂停/取消暂停当前标签页的冻结" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "冻结已选择标签页" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "恢复已选择标签页" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "冻结当前窗口中所有的标签页" }, - "ext_cmd_force_suspend_active_window_description": { "message": "强制冻结当前窗口中的所有标签页" }, - "ext_cmd_unsuspend_active_window_description": { "message": "恢复当前窗口中所有的标签页" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "冻结所有窗口的所有标签页" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "强制冻结所有窗口的所有标签页" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "恢复所有窗口的所有标签页" }, - "js_context_open_link_in_suspended_tab": { "message": "在新的冻结标签页打开链接" }, - "js_context_toggle_suspend_state": { "message": "冻结/恢复此标签页" }, - "js_context_toggle_pause_suspension": { "message": "暂停/取消暂停此标签页的冻结" }, - "js_context_never_suspend_domain": { "message": "永远不要冻结此域名" }, - "js_context_never_suspend_page": { "message": "永远不要冻结此页面" }, - "js_context_suspend_selected_tabs": { "message": "冻结已选择标签页" }, - "js_context_unsuspend_selected_tabs": { "message": "恢复已选择标签页" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "冻结当前窗口中所有的标签页" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "强制冻结当前窗口中的所有标签页" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "恢复当前窗口中所有的标签页" }, - "js_context_soft_suspend_all_tabs": { "message": "冻结所有窗口的所有标签页" }, - "js_context_force_suspend_all_tabs": { "message": "强制冻结所有窗口的所有标签页" }, - "js_context_unsuspend_all_tabs": { "message": "恢复所有窗口的所有标签页" }, - "html_about_title": { "message": "关于" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "如果您有反馈意见或者想报告问题,可以在" }, - "html_about_report_issues_suffix": { "message": ". 在提出新的想法或问题之前,请检查相关想法或问题是否已存在。谢谢!" }, - "html_about_debugging_prefix": { "message": "要启用日志记录或设置调试断点,请转至" }, - "html_about_debugging_suffix": { "message": "调试页面。" }, - "html_about_the_github_issues_page": { "message": "GitHub 上进行" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "这个扩展使用了 Niklas von Hertzen 编写的" }, - "html_about_html2canvas_suffix": { "message": "项目。" }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "也使用了 Aaron Powell 撰写编写的" }, - "html_about_indexedDb_suffix": { "message": "项目" }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "同时也感谢" }, - "html_about_browserstack_suffix": { "message": "提供免费的 Chrome 测试工具" }, - "html_history_title": { "message": "会话管理" }, - "html_history_current_session": { "message": "当前会话" }, - "html_history_recent_sessions": { "message": "最近会话" }, - "html_history_saved_sessions": { "message": "已储存会话" }, - "html_history_import_session": { "message": "导入会话" }, - "html_notice_title": { "message": "通知" }, - "html_notice_important_notice": { "message": "来自 The Great Suspender 的重要通知" }, - "html_options_title": { "message": "设置" }, - "html_options_suspend_title": { "message": "标签页自动冻结" }, - "html_options_suspended_title": { "message": "冻结的标签页" }, - "html_options_other_title": { "message": "其他设置" }, - "html_options_suspend_automatically_after": { "message": "多久后自动冻结标签页" }, - "html_options_suspend_never": { "message": "永不" }, - "html_options_suspend_seconds": { "message": "秒" }, - "html_options_suspend_minute": { "message": "分钟" }, - "html_options_suspend_minutes": { "message": "分钟" }, - "html_options_suspend_hour": { "message": "小时" }, - "html_options_suspend_hours": { "message": "小时" }, - "html_options_suspend_day": { "message": "天" }, - "html_options_suspend_days": { "message": "天" }, - "html_options_suspend_week": { "message": "周" }, - "html_options_suspend_weeks": { "message": "周" }, - "html_options_suspend_no_pinned": { "message": "不要冻结已固定的标签页" }, - "html_options_suspend_no_forms": { "message": "不要冻结输入框有文字且尚未储存的标签页" }, - "html_options_suspend_no_audio": { "message": "不要冻结正在播放声音的标签页" }, - "html_options_suspend_only_connected": { "message": "只在联网时才自动冻结" }, - "html_options_suspend_only_on_battery": { "message": "只在未充电时才自动冻结" }, - "html_options_suspend_no_active_tabs": { "message": "不要冻结每个窗口中的正在使用中的标签页" }, - "html_options_suspend_automatically_unsuspend": { "message": "当标签页被浏览就自动恢复标签页" }, - "html_options_suspend_discard_after_suspend": { "message": "冻结时应用 Chrome 内置的内存节省功能" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "通过启用 Chrome 内置的内存节省功能,可以更多的降低内存使用。" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "当多个标签页同时打开时,可以降低 500% 的系统内存消耗。" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "" }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "但是,当重新打开一个被冻结/暂停的标签页时,会导致页面有微小的加载延时。" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "" }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "有关 Chrome discarding 的更多信息,请参阅:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "主题" }, - "html_options_suspend_theme_light": { "message": "浅色" }, - "html_options_suspend_theme_dark": { "message": "深色" }, - "html_options_suspend_screen_capturing": { "message": "屏幕截图" }, - "html_options_suspend_screen_capturing_disabled": { "message": "停用" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "只截取可见的画面" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "截取整个页面" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "在暂停的标签页上,扩展会显示该标签页在被冻结时的图像预览" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "" }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "屏幕截图功能是实验性的,可能会导致明显的 CPU 占用以及内存使用量略微增加。" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "" }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "如果您注意到奇怪的行为,如标签页需要很长时间才能冻结,或者 Chrome 意外崩溃,请尝试关闭此功能。" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "" }, - "html_options_suspend_force_screen_capture": { "message": "启用高质量的屏幕截图模式" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "禁用时,屏幕截图具有以下限制以帮助提高性能:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- 低质量的屏幕截图" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- 如果生成图像需要 1 分钟以上,将不会使用屏幕截图" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- 图片的最大高度限制为 5000 像素" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "启用高质量的屏幕截图模式可能会显着增加 CPU 负载和内存使用量。" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "" }, - "html_options_whitelist_title": { "message": "白名单" }, - "html_options_whitelist_tooltip_line1": { "message": "在每一行上添加要列入白名单的每个页面的 URL。例如:" }, - "html_options_whitelist_tooltip_line2": { "message": "要在一行中将多个网站列入白名单,可以指定 URL 的一部分:" }, - "html_options_whitelist_tooltip_line3": { "message": "您还可以通过正则表达式将 URL 添加白名单:" }, - "html_options_whitelist_test": { "message": "测试白名单" }, - "html_options_other_enable_context_menu": { "message": "把 The Great Suspender 加到右键菜单" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "将控件添加到网页的右键单击菜单。" }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "这样,您就可以访问扩展中在其他地方无法使用的高级冻结操作了。" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "" }, - "html_options_other_enable_sync": { "message": "在不同系统之间同步设置" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "扩展的设置将在所有使用相同配置文件登录的 Chrome 浏览器中同步" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "。" }, - "html_options_other_enable_sync_tooltip_line2": { "message": "在无痕模式下也会进行设置同步。" }, - "html_options_other_enable_sync_warning": { "message": "打开此项将覆盖其他同步系统上保存的设置" }, - "html_options_suspend_on_low_memory": { "message": "当系统内存变得非常低时冻结标签页" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "此选项会覆盖 Chrome 的 automatic tab discarding 功能。" }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "如果启用,该页面将被强制冻结,而不是被 Chrome 删除。" }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "通常,Chrome 仅在系统内存非常低时删除页面。" }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "注意:这可能导致标签页在“标签页自动冻结”选项中指定的时间之前冻结。" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "" }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "有关 automatic tab discarding 的更多信息,请参阅:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "恢复当前标签页" }, - "html_popup_suspend_tab": { "message": "冻结此标签页" }, - "html_popup_dont_suspend_now": { "message": "现在还不要冻结" }, - "html_popup_never_suspend_domain": { "message": "永远不要冻结此域名" }, - "html_popup_never_suspend_page": { "message": "永远不要冻结此网页" }, - "html_popup_suspend_other_tabs": { "message": "冻结其他标签页" }, - "html_popup_unsuspend_all_tabs": { "message": "恢复所有标签页" }, - "html_popup_suspend_selected_tabs": { "message": "冻结已选择标签页" }, - "html_popup_unsuspend_selected_tabs": { "message": "恢复已选择标签页" }, - "html_popup_settings": { "message": "设置" }, - "html_restoring_title": { "message": "恢复窗口" }, - "html_restoring_heading": { "message": "恢复标签页" }, - "html_restoring_detail": { "message": "恢复此窗口中,请稍等..." }, - "html_recovery_title": { "message": "复原" }, - "html_recovery_ruh_roh": { "message": "噢!" }, - "html_recovery_description_line1": { "message": "看来你刚从崩溃的扩展恢复过来。" }, - "html_recovery_description_line2": { "message": "你之前冻结的标签页有可能无法还原。" }, - "html_recovery_restore_tabs_automatically": { "message": "自动恢复标签页" }, - "html_recovery_go_to_session_manager": { "message": "前往会话管理器" }, - "html_recovery_important_message": { "message": "你目前已开启屏幕截图,如果扩展多次崩溃,建议你取消勾选。" }, - "html_recovery_disable_screen_capturing": { "message": "关闭屏幕截图" }, - "html_recovery_tabs_to_restore": { "message": "标签页恢复" }, - "html_shortcuts_title": { "message": "键盘快捷键" }, - "html_shortcuts_keyboard_shortcuts": { "message": "键盘快捷键" }, - "html_shortcuts_context_menu_note": { "message": "注意:您也可以通过右键单击上下文菜单来使用这些操作。" }, - "html_shortcuts_remap_keys": { "message": "修改键盘快捷键" }, - "html_sidebar_general_settings": { "message": "设置" }, - "html_sidebar_session_management": { "message": "会话管理" }, - "html_sidebar_shortcuts": { "message": "键盘快捷键" }, - "html_sidebar_support": { "message": "关于" }, - "html_success_great_success": { "message": "成功!" }, - "html_success_all_tabs_restored": { "message": "你所有的标签页均已恢复完成。" }, - "html_success_goto_advanced_prefix": { "message": "进阶的会话管理,请前往" }, - "html_success_goto_advanced_suffix": { "message": "" }, - "html_session_manager": { "message": "会话管理页面" }, - "html_suspended_title": { "message": "冻结标签页" }, - "html_suspended_tab_suspended": { "message": "标签页已被冻结" }, - "html_suspended_tab_reload": { "message": "重新加载标签页" }, - "html_suspended_tab_whitelist_prefix": { "message": "永远不要冻结" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "刷新页面或点击此处重新加载" }, - "html_suspended_toast_not_connected": { "message": "您未连接网络" }, - "html_suspended_toast_reload_disabled": { "message": "暂时禁用标签页自动重新加载。" }, - "html_permissions_title": { "message": "许可权限" }, - "html_permissions_heading": { "message": "请授予允许访问本地文件 URL 的权限" }, - "html_permissions_info": { "message": "这个扩展目前不允许冻结那些以 \"file\" 开头的 URL 链接。\n要想改变这个设置, 可以在扩展设置页面打开允许访问文件 URL 的设置。" }, - "html_permissions_backup": { "message": "请注意:改变这个设置可能会使你当前所有的冻结标签页短暂的消失。\n为了以防万一,最好对当前标签页的会话的做备份。" }, - "html_update_title": { "message": "更新" }, - "html_update_heading2": { "message": "即将变得更好" }, - "html_update_info": { "message": "一个新版本的 The Great Suspender 已准备好安装。\n请注意:冻结的页面将在更新过程中暂时消失。" }, - "html_update_info_withbackup": { "message": "为了以防万一,最好对当前标签页的会话的做备份。" }, - "html_update_info_nobackup_prefix": { "message": "强烈建议您在继续更新之前在 " }, - "html_update_info_nobackup_suffix": { "message": " 导出当前标签页会话的备份。" }, - "html_updated_title": { "message": "更新" }, - "html_updating_heading": { "message": "正在更新" }, - "html_updating_message": { "message": "恢复冻结的标签页中,请稍等..." }, - "html_updated_great_suspender_updated": { "message": "已更新" }, - "html_updated_info_line1": { "message": "更新之前,您的标签页已被自动保存。" }, - "html_updated_info_line2_prefix": { "message": "如果在更新过程中遇到任何问题,可以从 " }, - "html_updated_info_line2_suffix": { "message": " 页面中恢复丢失的标签页。" }, - "html_updated_detail_header_prefix": { "message": "在 " }, - "html_updated_detail_header_suffix": { "message": "有什么新功能?" }, - "html_updated_new_features_header": { "message": "新的功能:" }, - "html_updated_bug_fixes_header": { "message": "Bug 修复:" }, - "html_updated_release_notes": { "message": "请浏览 GitHub 获取完整的发行说明: " }, - "html_updated_patch_message": { "message": "很抱歉打扰你。我们需要做一些小维护。" }, - "html_welcome_title": { "message": "欢迎来到" }, - "html_welcome_text_line1": { "message": "感谢你安装" }, - "html_welcome_text_line2": { "message": "我能把你暂时不用的标签页冻结起来,希望这会让你的电脑运行地更流畅一些。" }, - "html_welcome_text_line3": { "message": "您可以在下面更改设置" }, - "js_popup_normal": { "message": "标签页将会自动被冻结。" }, - "js_popup_normal_pause": { "message": "暂时不要冻结" }, - "js_popup_special": { "message": "标签页无法被冻结" }, - "js_popup_suspended": { "message": "标签页已经被冻结" }, - "js_popup_suspended_pause": { "message": "暂时不要冻结" }, - "js_popup_whitelisted": { "message": "白名单。" }, - "js_popup_whitelisted_remove": { "message": "从白名单移除" }, - "js_popup_audible": { "message": "标签页正在播放声音。" }, - "js_popup_form_input": { "message": "标签页有文字还在输入。" }, - "js_popup_form_input_unpause": { "message": "取消暂停" }, - "js_popup_pinned": { "message": "标签页已经被固定" }, - "js_popup_temp_whitelist": { "message": "页面冻结暂停。" }, - "js_popup_temp_whitelist_unpause": { "message": "取消暂停" }, - "js_popup_never": { "message": "禁止自动冻结标签页。" }, - "js_popup_no_connectivity": { "message": "网络未连接" }, - "js_popup_charging": { "message": "已接上电源" }, - "js_popup_blockedFile": { "message": "无法冻结本地文件。" }, - "js_popup_blockedFile_enable": { "message": "启用" }, - "js_popup_unknown": { "message": "等待页面加载..." }, - "js_popup_initialising": { "message": "等待扩展初始化..." }, - "js_popup_error": { "message": "自动冻结在此页面上不可用" }, - "js_history_delete": { "message": "删除" }, - "js_history_export": { "message": "导出" }, - "js_history_reload": { "message": "重新加载" }, - "js_history_resuspend": { "message": "重新冻结" }, - "js_history_save": { "message": "保存" }, - "js_history_window": { "message": " 个窗口" }, - "js_history_tab": { "message": " 个标签页" }, - "js_history_plural": { "message": "" }, - "js_history_enter_name_for_session": { "message": "为此会话命名" }, - "js_history_confirm_delete": { "message": "你确定要删除此会话吗?" }, - "js_history_confirm_session_overwrite": { "message": "已经保存有同名的会话。要覆盖现有会话吗?" }, - "js_history_import_fail": { "message": "无法导入文件。确保文件是纯文本,并且每行只有一条 URL。" }, - "js_suspended_remove_from_whitelist": { "message": "从白名单移除" }, - "js_suspended_hotkey_to_reload": { "message": "设置键盘快捷键" }, - "js_suspended_low_memory": { "message": "由于系统内存不足而冻结的页面" }, - "js_options_incognito_warning": { "message": "您现在处于无痕模式。某些功能将无法使用。" }, - "js_options_whitelist_no_matches": { "message": "没有与当前白单匹配的打开标签页。" }, - "js_options_whitelist_matches_heading": { "message": "这些打开标签页签符合当前白名单:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "和另外" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "个。" }, - "js_permissions_button_export": { "message": "导出备份" }, - "js_permissions_button_set": { "message": "打开扩展设置" }, - "js_update_confirm": { "message": "您尚未保存备份。即使如此也要更新扩展吗?" }, - "js_update_button_export": { "message": "导出备份" }, - "js_update_button_reload": { "message": "现在更新扩展" }, - "js_shortcuts_not_set": { "message": "未设置" }, - "js_session_save_point": { "message": "自动保存点 v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "冻结暂时用不到的标签页,以便释放系统资源。" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "冻结/恢复当前标签页" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "暂停/取消暂停当前标签页的冻结" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "冻结已选择标签页" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "恢复已选择标签页" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "冻结当前窗口中所有的标签页" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "强制冻结当前窗口中的所有标签页" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "恢复当前窗口中所有的标签页" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "冻结所有窗口的所有标签页" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "强制冻结所有窗口的所有标签页" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "恢复所有窗口的所有标签页" + }, + "js_context_open_link_in_suspended_tab": { + "message": "在新的冻结标签页打开链接" + }, + "js_context_toggle_suspend_state": { + "message": "冻结/恢复此标签页" + }, + "js_context_toggle_pause_suspension": { + "message": "暂停/取消暂停此标签页的冻结" + }, + "js_context_never_suspend_domain": { + "message": "永远不要冻结此域名" + }, + "js_context_never_suspend_page": { + "message": "永远不要冻结此页面" + }, + "js_context_suspend_selected_tabs": { + "message": "冻结已选择标签页" + }, + "js_context_unsuspend_selected_tabs": { + "message": "恢复已选择标签页" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "冻结当前窗口中所有的标签页" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "强制冻结当前窗口中的所有标签页" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "恢复当前窗口中所有的标签页" + }, + "js_context_soft_suspend_all_tabs": { + "message": "冻结所有窗口的所有标签页" + }, + "js_context_force_suspend_all_tabs": { + "message": "强制冻结所有窗口的所有标签页" + }, + "js_context_unsuspend_all_tabs": { + "message": "恢复所有窗口的所有标签页" + }, + "html_about_title": { + "message": "关于" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking (more information available on" + }, + "html_about_fork_end": { + "message": ")" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "如果您有反馈意见或者想报告问题,可以在" + }, + "html_about_report_issues_suffix": { + "message": ". 在提出新的想法或问题之前,请检查相关想法或问题是否已存在。谢谢!" + }, + "html_about_debugging_prefix": { + "message": "要启用日志记录或设置调试断点,请转至" + }, + "html_about_debugging_suffix": { + "message": "调试页面。" + }, + "html_about_the_github_issues_page": { + "message": "GitHub 上进行" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "这个扩展使用了 Niklas von Hertzen 编写的" + }, + "html_about_html2canvas_suffix": { + "message": "项目。" + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "也使用了 Aaron Powell 撰写编写的" + }, + "html_about_indexedDb_suffix": { + "message": "项目" + }, + "html_about_browserstack": { + "message": "browserstack" + }, + "html_about_browserstack_prefix": { + "message": "同时也感谢" + }, + "html_about_browserstack_suffix": { + "message": "提供免费的 Chrome 测试工具" + }, + "html_history_title": { + "message": "会话管理" + }, + "html_history_current_session": { + "message": "当前会话" + }, + "html_history_recent_sessions": { + "message": "最近会话" + }, + "html_history_saved_sessions": { + "message": "已储存会话" + }, + "html_history_import_session": { + "message": "导入会话" + }, + "html_notice_title": { + "message": "通知" + }, + "html_notice_important_notice": { + "message": "来自 The Marvellous Suspender 的重要通知" + }, + "html_options_title": { + "message": "设置" + }, + "html_options_suspend_title": { + "message": "标签页自动冻结" + }, + "html_options_suspended_title": { + "message": "冻结的标签页" + }, + "html_options_other_title": { + "message": "其他设置" + }, + "html_options_suspend_automatically_after": { + "message": "多久后自动冻结标签页" + }, + "html_options_suspend_never": { + "message": "永不" + }, + "html_options_suspend_seconds": { + "message": "秒" + }, + "html_options_suspend_minute": { + "message": "分钟" + }, + "html_options_suspend_minutes": { + "message": "分钟" + }, + "html_options_suspend_hour": { + "message": "小时" + }, + "html_options_suspend_hours": { + "message": "小时" + }, + "html_options_suspend_day": { + "message": "天" + }, + "html_options_suspend_days": { + "message": "天" + }, + "html_options_suspend_week": { + "message": "周" + }, + "html_options_suspend_weeks": { + "message": "周" + }, + "html_options_suspend_no_pinned": { + "message": "不要冻结已固定的标签页" + }, + "html_options_suspend_no_forms": { + "message": "不要冻结输入框有文字且尚未储存的标签页" + }, + "html_options_suspend_no_audio": { + "message": "不要冻结正在播放声音的标签页" + }, + "html_options_suspend_only_connected": { + "message": "只在联网时才自动冻结" + }, + "html_options_suspend_only_on_battery": { + "message": "只在未充电时才自动冻结" + }, + "html_options_suspend_no_active_tabs": { + "message": "不要冻结每个窗口中的正在使用中的标签页" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "当标签页被浏览就自动恢复标签页" + }, + "html_options_suspend_discard_after_suspend": { + "message": "冻结时应用 Chrome 内置的内存节省功能" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "通过启用 Chrome 内置的内存节省功能,可以更多的降低内存使用。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "当多个标签页同时打开时,可以降低 500% 的系统内存消耗。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "to 500% memory savings when working with large numbers of tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "但是,当重新打开一个被冻结/暂停的标签页时,会导致页面有微小的加载延时。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "a suspended tab." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "有关 Chrome discarding 的更多信息,请参阅:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "主题" + }, + "html_options_suspend_theme_light": { + "message": "浅色" + }, + "html_options_suspend_theme_dark": { + "message": "深色" + }, + "html_options_suspend_screen_capturing": { + "message": "屏幕截图" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "停用" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "只截取可见的画面" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "截取整个页面" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "在暂停的标签页上,扩展会显示该标签页在被冻结时的图像预览" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "looked like just before it was suspended." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "屏幕截图功能是实验性的,可能会导致明显的 CPU 占用以及内存使用量略微增加。" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "well as slightly increased memory usage." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "如果您注意到奇怪的行为,如标签页需要很长时间才能冻结,或者 Chrome 意外崩溃,请尝试关闭此功能。" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crashing unexpectedly, try turning this feature off." + }, + "html_options_suspend_force_screen_capture": { + "message": "启用高质量的屏幕截图模式" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "禁用时,屏幕截图具有以下限制以帮助提高性能:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- 低质量的屏幕截图" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- 如果生成图像需要 1 分钟以上,将不会使用屏幕截图" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- 图片的最大高度限制为 5000 像素" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "启用高质量的屏幕截图模式可能会显着增加 CPU 负载和内存使用量。" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "and memory usage." + }, + "html_options_whitelist_title": { + "message": "白名单" + }, + "html_options_whitelist_tooltip_line1": { + "message": "在每一行上添加要列入白名单的每个页面的 URL。例如:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "要在一行中将多个网站列入白名单,可以指定 URL 的一部分:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "您还可以通过正则表达式将 URL 添加白名单:" + }, + "html_options_whitelist_test": { + "message": "测试白名单" + }, + "html_options_other_enable_context_menu": { + "message": "把 The Marvellous Suspender 加到右键菜单" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "将控件添加到网页的右键单击菜单。" + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "这样,您就可以访问扩展中在其他地方无法使用的高级冻结操作了。" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "elsewhere in the extension." + }, + "html_options_other_enable_sync": { + "message": "在不同系统之间同步设置" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "扩展的设置将在所有使用相同配置文件登录的 Chrome 浏览器中同步" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "。" + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "在无痕模式下也会进行设置同步。" + }, + "html_options_other_enable_sync_warning": { + "message": "打开此项将覆盖其他同步系统上保存的设置" + }, + "html_options_suspend_on_low_memory": { + "message": "当系统内存变得非常低时冻结标签页" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "此选项会覆盖 Chrome 的 automatic tab discarding 功能。" + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "如果启用,该页面将被强制冻结,而不是被 Chrome 删除。" + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "通常,Chrome 仅在系统内存非常低时删除页面。" + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "注意:这可能导致标签页在“标签页自动冻结”选项中指定的时间之前冻结。" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "specified in the Automatic tab suspension options." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "有关 automatic tab discarding 的更多信息,请参阅:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "恢复当前标签页" + }, + "html_popup_suspend_tab": { + "message": "冻结此标签页" + }, + "html_popup_dont_suspend_now": { + "message": "现在还不要冻结" + }, + "html_popup_never_suspend_domain": { + "message": "永远不要冻结此域名" + }, + "html_popup_never_suspend_page": { + "message": "永远不要冻结此网页" + }, + "html_popup_suspend_other_tabs": { + "message": "冻结其他标签页" + }, + "html_popup_unsuspend_all_tabs": { + "message": "恢复所有标签页" + }, + "html_popup_suspend_selected_tabs": { + "message": "冻结已选择标签页" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "恢复已选择标签页" + }, + "html_popup_settings": { + "message": "设置" + }, + "html_restoring_title": { + "message": "恢复窗口" + }, + "html_restoring_heading": { + "message": "恢复标签页" + }, + "html_restoring_detail": { + "message": "恢复此窗口中,请稍等..." + }, + "html_recovery_title": { + "message": "复原" + }, + "html_recovery_ruh_roh": { + "message": "噢!" + }, + "html_recovery_description_line1": { + "message": "看来你刚从崩溃的扩展恢复过来。" + }, + "html_recovery_description_line2": { + "message": "你之前冻结的标签页有可能无法还原。" + }, + "html_recovery_restore_tabs_automatically": { + "message": "自动恢复标签页" + }, + "html_recovery_go_to_session_manager": { + "message": "前往会话管理器" + }, + "html_recovery_important_message": { + "message": "你目前已开启屏幕截图,如果扩展多次崩溃,建议你取消勾选。" + }, + "html_recovery_disable_screen_capturing": { + "message": "关闭屏幕截图" + }, + "html_recovery_tabs_to_restore": { + "message": "标签页恢复" + }, + "html_shortcuts_title": { + "message": "键盘快捷键" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "键盘快捷键" + }, + "html_shortcuts_context_menu_note": { + "message": "注意:您也可以通过右键单击上下文菜单来使用这些操作。" + }, + "html_shortcuts_remap_keys": { + "message": "修改键盘快捷键" + }, + "html_sidebar_general_settings": { + "message": "设置" + }, + "html_sidebar_session_management": { + "message": "会话管理" + }, + "html_sidebar_shortcuts": { + "message": "键盘快捷键" + }, + "html_sidebar_support": { + "message": "关于" + }, + "html_success_great_success": { + "message": "成功!" + }, + "html_success_all_tabs_restored": { + "message": "你所有的标签页均已恢复完成。" + }, + "html_success_goto_advanced_prefix": { + "message": "进阶的会话管理,请前往" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "会话管理页面" + }, + "html_suspended_title": { + "message": "冻结标签页" + }, + "html_suspended_tab_suspended": { + "message": "标签页已被冻结" + }, + "html_suspended_tab_reload": { + "message": "重新加载标签页" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "永远不要冻结" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "刷新页面或点击此处重新加载" + }, + "html_suspended_toast_not_connected": { + "message": "您未连接网络" + }, + "html_suspended_toast_reload_disabled": { + "message": "暂时禁用标签页自动重新加载。" + }, + "html_permissions_title": { + "message": "许可权限" + }, + "html_permissions_heading": { + "message": "请授予允许访问本地文件 URL 的权限" + }, + "html_permissions_info": { + "message": "这个扩展目前不允许冻结那些以 \"file\" 开头的 URL 链接。\n要想改变这个设置, 可以在扩展设置页面打开允许访问文件 URL 的设置。" + }, + "html_permissions_backup": { + "message": "请注意:改变这个设置可能会使你当前所有的冻结标签页短暂的消失。\n为了以防万一,最好对当前标签页的会话的做备份。" + }, + "html_update_title": { + "message": "更新" + }, + "html_update_heading2": { + "message": "即将变得更好" + }, + "html_update_info": { + "message": "一个新版本的 The Marvellous Suspender 已准备好安装。\n请注意:冻结的页面将在更新过程中暂时消失。" + }, + "html_update_info_withbackup": { + "message": "为了以防万一,最好对当前标签页的会话的做备份。" + }, + "html_update_info_nobackup_prefix": { + "message": "强烈建议您在继续更新之前在 " + }, + "html_update_info_nobackup_suffix": { + "message": " 导出当前标签页会话的备份。" + }, + "html_updated_title": { + "message": "更新" + }, + "html_updating_heading": { + "message": "正在更新" + }, + "html_updating_message": { + "message": "恢复冻结的标签页中,请稍等..." + }, + "html_updated_great_suspender_updated": { + "message": "已更新" + }, + "html_updated_info_line1": { + "message": "更新之前,您的标签页已被自动保存。" + }, + "html_updated_info_line2_prefix": { + "message": "如果在更新过程中遇到任何问题,可以从 " + }, + "html_updated_info_line2_suffix": { + "message": " 页面中恢复丢失的标签页。" + }, + "html_updated_detail_header_prefix": { + "message": "在 " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "新的功能:" + }, + "html_updated_bug_fixes_header": { + "message": "Bug 修复:" + }, + "html_updated_release_notes": { + "message": "请浏览 GitHub 获取完整的发行说明: " + }, + "html_updated_patch_message": { + "message": "很抱歉打扰你。我们需要做一些小维护。" + }, + "html_welcome_title": { + "message": "欢迎来到" + }, + "html_welcome_text_line1": { + "message": "感谢你安装" + }, + "html_welcome_text_line2": { + "message": "我能把你暂时不用的标签页冻结起来,希望这会让你的电脑运行地更流畅一些。" + }, + "html_welcome_text_line3": { + "message": "您可以在下面更改设置" + }, + "js_popup_normal": { + "message": "标签页将会自动被冻结。" + }, + "js_popup_normal_pause": { + "message": "暂时不要冻结" + }, + "js_popup_special": { + "message": "标签页无法被冻结" + }, + "js_popup_suspended": { + "message": "标签页已经被冻结" + }, + "js_popup_suspended_pause": { + "message": "暂时不要冻结" + }, + "js_popup_whitelisted": { + "message": "白名单。" + }, + "js_popup_whitelisted_remove": { + "message": "从白名单移除" + }, + "js_popup_audible": { + "message": "标签页正在播放声音。" + }, + "js_popup_form_input": { + "message": "标签页有文字还在输入。" + }, + "js_popup_form_input_unpause": { + "message": "取消暂停" + }, + "js_popup_pinned": { + "message": "标签页已经被固定" + }, + "js_popup_temp_whitelist": { + "message": "页面冻结暂停。" + }, + "js_popup_temp_whitelist_unpause": { + "message": "取消暂停" + }, + "js_popup_never": { + "message": "禁止自动冻结标签页。" + }, + "js_popup_no_connectivity": { + "message": "网络未连接" + }, + "js_popup_charging": { + "message": "已接上电源" + }, + "js_popup_blockedFile": { + "message": "无法冻结本地文件。" + }, + "js_popup_blockedFile_enable": { + "message": "启用" + }, + "js_popup_unknown": { + "message": "等待页面加载..." + }, + "js_popup_initialising": { + "message": "等待扩展初始化..." + }, + "js_popup_error": { + "message": "自动冻结在此页面上不可用" + }, + "js_history_delete": { + "message": "删除" + }, + "js_history_export": { + "message": "导出" + }, + "js_history_reload": { + "message": "重新加载" + }, + "js_history_resuspend": { + "message": "重新冻结" + }, + "js_history_save": { + "message": "保存" + }, + "js_history_window": { + "message": " 个窗口" + }, + "js_history_tab": { + "message": " 个标签页" + }, + "js_history_plural": { + "message": "s" + }, + "js_history_enter_name_for_session": { + "message": "为此会话命名" + }, + "js_history_confirm_delete": { + "message": "你确定要删除此会话吗?" + }, + "js_history_confirm_session_overwrite": { + "message": "已经保存有同名的会话。要覆盖现有会话吗?" + }, + "js_history_import_fail": { + "message": "无法导入文件。确保文件是纯文本,并且每行只有一条 URL。" + }, + "js_suspended_remove_from_whitelist": { + "message": "从白名单移除" + }, + "js_suspended_hotkey_to_reload": { + "message": "设置键盘快捷键" + }, + "js_suspended_low_memory": { + "message": "由于系统内存不足而冻结的页面" + }, + "js_options_incognito_warning": { + "message": "您现在处于无痕模式。某些功能将无法使用。" + }, + "js_options_whitelist_no_matches": { + "message": "没有与当前白单匹配的打开标签页。" + }, + "js_options_whitelist_matches_heading": { + "message": "这些打开标签页签符合当前白名单:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "和另外" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "个。" + }, + "js_permissions_button_export": { + "message": "导出备份" + }, + "js_permissions_button_set": { + "message": "打开扩展设置" + }, + "js_update_confirm": { + "message": "您尚未保存备份。即使如此也要更新扩展吗?" + }, + "js_update_button_export": { + "message": "导出备份" + }, + "js_update_button_reload": { + "message": "现在更新扩展" + }, + "js_shortcuts_not_set": { + "message": "未设置" + }, + "js_session_save_point": { + "message": "自动保存点 v" + } } diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 3c5d67e2..e1cbc5d7 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -1,242 +1,734 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "凍結暫時用不到的分頁,達到系統資源釋放。" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "凍結/回復目前分頁" }, - "ext_cmd_toggle_tab_pause_description": { "message": "暫停/取消暫停目前分頁的凍結" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "凍結已選擇分頁" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "回復已選擇分頁" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "凍結目前視窗中所有的分頁" }, - "ext_cmd_force_suspend_active_window_description": { "message": "強制凍結當前視窗中的所有分頁" }, - "ext_cmd_unsuspend_active_window_description": { "message": "凍結目前視窗中所有的分頁" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "凍結所有視窗的所有分頁" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "強制凍結所有視窗的所有分頁" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "回復所有視窗的所有分頁" }, - "js_context_open_link_in_suspended_tab": { "message": "在新的凍結分頁打開連結" }, - "js_context_toggle_suspend_state": { "message": "凍結/回復此分頁" }, - "js_context_toggle_pause_suspension": { "message": "暫停/取消暫停此分頁的凍結" }, - "js_context_never_suspend_domain": { "message": "永遠不要凍結此網域" }, - "js_context_never_suspend_page": { "message": "永遠不要凍結此網頁" }, - "js_context_suspend_selected_tabs": { "message": "凍結已選擇分頁" }, - "js_context_unsuspend_selected_tabs": { "message": "回復已選擇分頁" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "凍結目前視窗中所有的分頁" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "強制凍結當前視窗中的所有分頁" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "回復目前視窗中所有的分頁" }, - "js_context_soft_suspend_all_tabs": { "message": "凍結所有視窗的所有分頁" }, - "js_context_force_suspend_all_tabs": { "message": "強制凍結所有視窗的所有分頁" }, - "js_context_unsuspend_all_tabs": { "message": "回復所有視窗的所有分頁" }, - "html_about_title": { "message": "關於" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "如果您有建議或想回報問題,可以在" }, - "html_about_report_issues_suffix": { "message": ". 在建立新的想法或問題之前,請檢查您的想法或問題是否存在。謝謝!" }, - "html_about_debugging_prefix": { "message": "要啟用日誌記錄或設置調試標誌,請轉至" }, - "html_about_debugging_suffix": { "message": "測試分頁。" }, - "html_about_the_github_issues_page": { "message": "GitHub issues 網頁上提問" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "這個擴充功能使用 Niklas von Hertzen 撰寫的" }, - "html_about_html2canvas_suffix": { "message": "元件庫。" }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "也用了 Aaron Powell 撰寫的" }, - "html_about_indexedDb_suffix": { "message": "元件庫。" }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "同時也謝謝" }, - "html_about_browserstack_suffix": { "message": "提供免費的 Chrome 測試工具" }, - "html_history_title": { "message": "記錄管理" }, - "html_history_current_session": { "message": "目前記錄" }, - "html_history_recent_sessions": { "message": "最近記錄" }, - "html_history_saved_sessions": { "message": "已儲存記錄" }, - "html_history_import_session": { "message": "匯入記錄" }, - "html_notice_title": { "message": "通知" }, - "html_notice_important_notice": { "message": "來自 The Great Suspender 的重要通知" }, - "html_options_title": { "message": "設定" }, - "html_options_suspend_title": { "message": "自動凍結分頁" }, - "html_options_suspended_title": { "message": "凍結的分頁" }, - "html_options_other_title": { "message": "其他設定" }, - "html_options_suspend_automatically_after": { "message": "多久後自動凍結" }, - "html_options_suspend_never": { "message": "永不" }, - "html_options_suspend_seconds": { "message": "秒" }, - "html_options_suspend_minute": { "message": "分鐘" }, - "html_options_suspend_minutes": { "message": "分鐘" }, - "html_options_suspend_hour": { "message": "小時" }, - "html_options_suspend_hours": { "message": "小時" }, - "html_options_suspend_day": { "message": "天" }, - "html_options_suspend_days": { "message": "天" }, - "html_options_suspend_week": { "message": "週" }, - "html_options_suspend_weeks": { "message": "週" }, - "html_options_suspend_no_pinned": { "message": "不要凍結已固定的分頁" }, - "html_options_suspend_no_forms": { "message": "不要凍結輸入框有文字且尚未儲存的分頁" }, - "html_options_suspend_no_audio": { "message": "不要凍結正在播放聲音的分頁" }, - "html_options_suspend_only_connected": { "message": "只在網路連接下才自動凍結" }, - "html_options_suspend_only_on_battery": { "message": "只在電腦未接上電源時才自動凍結" }, - "html_options_suspend_no_active_tabs": { "message": "不要凍結每個視窗的正在使用中的分頁" }, - "html_options_suspend_automatically_unsuspend": { "message": "當分頁被瀏覽就自動回復分頁" }, - "html_options_suspend_discard_after_suspend": { "message": "使用 Chrome 內建的凍結/暫停分頁釋放系統記憶體功能" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "通過利用 Chrome 內建的分頁凍結/暫停功能,可以更多的降低記憶體使用。" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "當多個分頁同時打開時,可以降低500%的系統記憶體消耗。" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "" }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "盡管如此,當重新打開一個的凍結/暫停分頁時,將會有微小的分頁加載延時。" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "" }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "有關 Chrome discarding 的更多資訊,請參閱:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "主題" }, - "html_options_suspend_theme_light": { "message": "明亮" }, - "html_options_suspend_theme_dark": { "message": "深色" }, - "html_options_suspend_screen_capturing": { "message": "螢幕擷取" }, - "html_options_suspend_screen_capturing_disabled": { "message": "停用" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "只擷取可見的畫面" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "擷取整個分頁" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "在暫停的分頁上,擴充功能可以在分頁被暫停前顯示圖片預覽。" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "" }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "螢幕擷取功能是實驗性的,可能會讓 CPU 使用率以及記憶體使用量明顯地提高。" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "" }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "如果您注意到奇怪的行為,如分頁需要很長時間才能掛起,或者 Chrome 意外當機,請嘗試關閉此功能。" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "" }, - "html_options_suspend_force_screen_capture": { "message": "啟用高畫質的螢幕擷取模式" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "禁用時,螢幕擷取具有以下限制以幫助提高效能:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- 低品質的螢幕擷取" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- 如果產生圖片需要 1 分鐘以上,將不會螢幕擷取" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- 圖片的最大高度限制為 5000 像素" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "啟用高品質的畫面捕捉模式可能會讓 CPU 使用率和記憶體使用量明顯提高。" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "" }, - "html_options_whitelist_title": { "message": "白名單" }, - "html_options_whitelist_tooltip_line1": { "message": "在新的一列上新增要列入白名單的每個分頁的 URL。例如:" }, - "html_options_whitelist_tooltip_line2": { "message": "要在一列中將多個網站列入白名單,可以指定網址的一部分:" }, - "html_options_whitelist_tooltip_line3": { "message": "您還可以使用斜線包起來的文字來指定正規表示式:" }, - "html_options_whitelist_test": { "message": "測試白名單" }, - "html_options_other_enable_context_menu": { "message": "把 The Great Suspender 加到右鍵選單" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "將擴充套件新增到網頁的右鍵選單。" }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "這樣,您就可以訪問程序中其他位置無法使用的進階凍結操作。" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "" }, - "html_options_other_enable_sync": { "message": "使用Chrome 使用者設定檔同步設定" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "登入 Chrome 後,擴充功能將同步相同的設定" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "。" }, - "html_options_other_enable_sync_tooltip_line2": { "message": "這也將使無痕模式下的設定同步。" }, - "html_options_other_enable_sync_warning": { "message": "打開此項將覆蓋 Chrome 使用者設定並同步所有已登入的系統" }, - "html_options_suspend_on_low_memory": { "message": "當系統記憶體非常少時凍結分頁" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "此選項會覆蓋 Chrome 的 automatic tab discarding 功能。" }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "如果啟用,該分頁將被強制凍結,而不是被 Chrome 刪除。" }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "正常時 Chrome 僅在系統記憶體非常低時刪除分頁。" }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "注意:這可能導致分頁在「自動分頁凍結」選項中指定的時間之前凍結。" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "" }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "有關 Chrome discarding 的更多資訊,請參閱:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "回復目前分頁" }, - "html_popup_suspend_tab": { "message": "凍結此分頁" }, - "html_popup_dont_suspend_now": { "message": "現在還不要凍結" }, - "html_popup_never_suspend_domain": { "message": "永遠不要凍結此網域" }, - "html_popup_never_suspend_page": { "message": "永遠不要凍結此網頁" }, - "html_popup_suspend_other_tabs": { "message": "凍結其他分頁" }, - "html_popup_unsuspend_all_tabs": { "message": "回復所有分頁" }, - "html_popup_suspend_selected_tabs": { "message": "凍結已選擇分頁" }, - "html_popup_unsuspend_selected_tabs": { "message": "回復已選擇分頁" }, - "html_popup_settings": { "message": "設定" }, - "html_restoring_title": { "message": "回復視窗" }, - "html_restoring_heading": { "message": "回復分頁" }, - "html_restoring_detail": { "message": "請等待回復此視窗" }, - "html_recovery_title": { "message": "回復" }, - "html_recovery_ruh_roh": { "message": "噢!" }, - "html_recovery_description_line1": { "message": "看來你剛從當掉的擴充功能回復過來。" }, - "html_recovery_description_line2": { "message": "之前凍結的分頁可能無法還原。" }, - "html_recovery_restore_tabs_automatically": { "message": "自動回復分頁" }, - "html_recovery_go_to_session_manager": { "message": "前往記錄管理器" }, - "html_recovery_important_message": { "message": "你目前已開啟螢幕擷取,如果擴充功能多次發生故障,建議你取消勾選。" }, - "html_recovery_disable_screen_capturing": { "message": "關閉螢幕擷取" }, - "html_recovery_tabs_to_restore": { "message": "分頁回復" }, - "html_shortcuts_title": { "message": "鍵盤快速鍵" }, - "html_shortcuts_keyboard_shortcuts": { "message": "鍵盤快速鍵" }, - "html_shortcuts_context_menu_note": { "message": "注意:您也可以通過右鍵選單來使用這些操作。" }, - "html_shortcuts_remap_keys": { "message": "修改鍵盤快速鍵" }, - "html_sidebar_general_settings": { "message": "設定" }, - "html_sidebar_session_management": { "message": "記錄管理" }, - "html_sidebar_shortcuts": { "message": "鍵盤快速鍵" }, - "html_sidebar_support": { "message": "關於" }, - "html_success_great_success": { "message": "成功!" }, - "html_success_all_tabs_restored": { "message": "你的所有分頁已經回復完成。" }, - "html_success_goto_advanced_prefix": { "message": "進階的記錄管理,請前往" }, - "html_success_goto_advanced_suffix": { "message": "" }, - "html_session_manager": { "message": "記錄管理分頁" }, - "html_suspended_title": { "message": "分頁已經被凍結" }, - "html_suspended_tab_suspended": { "message": "分頁已經被凍結" }, - "html_suspended_tab_reload": { "message": "重新載入" }, - "html_suspended_tab_whitelist_prefix": { "message": "永遠不要凍結" }, - "html_suspended_tab_whitelist_suffix": { "message": "" }, - "html_suspended_click_to_reload": { "message": "點擊此處重新載入" }, - "html_suspended_toast_not_connected": { "message": "您沒有連接到網絡" }, - "html_suspended_toast_reload_disabled": { "message": "禁用自動重新載入。" }, - "html_permissions_title": { "message": "許可權限" }, - "html_permissions_heading": { "message": "請提供允許存取本機檔案 URL 的權限" }, - "html_permissions_info": { "message": "這個擴充功能目前不允許暫停那些以 file(檔案)開頭的 URL 連結。\n想要改變這個設定, 可以在擴充功能設定分頁打開允許存取檔案URL的設定。" }, - "html_permissions_backup": { "message": "請註意:改變這個設定可能會使你當前所有的暫停分頁短暫的消失。\n以防萬一,最好對當前分頁的瀏覽階段的做備份。" }, - "html_update_title": { "message": "更新" }, - "html_update_heading2": { "message": "即將變得更好" }, - "html_update_info": { "message": "一個新版本的 The Great Suspender 已準備好安裝。\n請注意:凍結分頁將在更新過程中暫時消失。" }, - "html_update_info_withbackup": { "message": "請在繼續之前儲存目前瀏覽階段的備份。" }, - "html_update_info_nobackup_prefix": { "message": "強烈建議您在繼續之前從" }, - "html_update_info_nobackup_suffix": { "message": " 儲存目前瀏覽階段的備份。" }, - "html_updated_title": { "message": "更新" }, - "html_updating_heading": { "message": "正在更新" }, - "html_updating_message": { "message": "請等我回復被暫停的分頁..." }, - "html_updated_great_suspender_updated": { "message": "已更新" }, - "html_updated_info_line1": { "message": "更新之前,您的分頁已被自動儲存。" }, - "html_updated_info_line2_prefix": { "message": "如果在更新過程中遇到任何問題,可以從 " }, - "html_updated_info_line2_suffix": { "message": " 分頁中回復遺失的分頁。" }, - "html_updated_detail_header_prefix": { "message": "在 " }, - "html_updated_detail_header_suffix": { "message": "有什麼新功能?" }, - "html_updated_new_features_header": { "message": "新的功能:" }, - "html_updated_bug_fixes_header": { "message": "錯誤修復:" }, - "html_updated_release_notes": { "message": "請瀏覽 GitHub 取得完整的發行說明:" }, - "html_updated_patch_message": { "message": "很抱歉打擾你。我們做了一些維護。" }, - "html_welcome_title": { "message": "歡迎來到" }, - "html_welcome_text_line1": { "message": "謝謝你安裝" }, - "html_welcome_text_line2": { "message": "通過暫停不使用的分頁,可以讓您的電腦減少記憶體的使用。" }, - "html_welcome_text_line3": { "message": "您可以在下面更改設定" }, - "js_popup_normal": { "message": "分頁將會自動被凍結。" }, - "js_popup_normal_pause": { "message": "暫時不要凍結" }, - "js_popup_special": { "message": "分頁無法被凍結" }, - "js_popup_suspended": { "message": "分頁已經被凍結" }, - "js_popup_suspended_pause": { "message": "暫時不要凍結" }, - "js_popup_whitelisted": { "message": "例外清單。" }, - "js_popup_whitelisted_remove": { "message": "從例外清單移除" }, - "js_popup_audible": { "message": "分頁正在播放聲音。" }, - "js_popup_form_input": { "message": "分頁有文字還在輸入。" }, - "js_popup_form_input_unpause": { "message": "取消暫停" }, - "js_popup_pinned": { "message": "分頁已經被固定" }, - "js_popup_temp_whitelist": { "message": "分頁凍結暫停。" }, - "js_popup_temp_whitelist_unpause": { "message": "取消暫停" }, - "js_popup_never": { "message": "禁止自動凍結分頁。" }, - "js_popup_no_connectivity": { "message": "未連接網路" }, - "js_popup_charging": { "message": "已接上電源" }, - "js_popup_blockedFile": { "message": "本機檔案無法暫停。" }, - "js_popup_blockedFile_enable": { "message": "啟用" }, - "js_popup_unknown": { "message": "等待分頁載入..." }, - "js_popup_initialising": { "message": "等待擴充功能初始化..." }, - "js_popup_error": { "message": "自動凍結在此分頁上不可用" }, - "js_history_delete": { "message": "刪除" }, - "js_history_export": { "message": "匯出" }, - "js_history_reload": { "message": "讀取和載入" }, - "js_history_resuspend": { "message": "重新凍結" }, - "js_history_save": { "message": "儲存" }, - "js_history_window": { "message": "個視窗" }, - "js_history_tab": { "message": "個分頁" }, - "js_history_plural": { "message": "" }, - "js_history_enter_name_for_session": { "message": "命名這個記錄" }, - "js_history_confirm_delete": { "message": "您確定要刪除此記錄嗎?" }, - "js_history_confirm_session_overwrite": { "message": "已經有儲存的名稱的記錄。要覆蓋現有記錄嗎?" }, - "js_history_import_fail": { "message": "無法匯入文件。確保文件是純文字檔案,並且每列只有一個 URL。" }, - "js_suspended_remove_from_whitelist": { "message": "從白名單移除" }, - "js_suspended_hotkey_to_reload": { "message": "設定鍵盤快捷鍵" }, - "js_suspended_low_memory": { "message": "由於系統記憶體不足而凍結的分頁" }, - "js_options_incognito_warning": { "message": "你目前使用隱私模式。某些功能將無法使用。" }, - "js_options_whitelist_no_matches": { "message": "沒有與當前白名單匹配的打開選項卡。" }, - "js_options_whitelist_matches_heading": { "message": "這些打開的選項卡與當前白名單相匹配:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "和另外" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "個。" }, - "js_permissions_button_export": { "message": "儲存備份" }, - "js_permissions_button_set": { "message": "打開擴充套件設定" }, - "js_update_confirm": { "message": "您尚未匯出備份。更新擴充功能?" }, - "js_update_button_export": { "message": "匯出備份" }, - "js_update_button_reload": { "message": "現在更新擴充功能" }, - "js_shortcuts_not_set": { "message": "沒有設定" }, - "js_session_save_point": { "message": "自動保存點 v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "凍結暫時用不到的分頁,達到系統資源釋放。" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "凍結/回復目前分頁" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "暫停/取消暫停目前分頁的凍結" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "凍結已選擇分頁" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "回復已選擇分頁" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "凍結目前視窗中所有的分頁" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "強制凍結當前視窗中的所有分頁" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "凍結目前視窗中所有的分頁" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "凍結所有視窗的所有分頁" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "強制凍結所有視窗的所有分頁" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "回復所有視窗的所有分頁" + }, + "js_context_open_link_in_suspended_tab": { + "message": "在新的凍結分頁打開連結" + }, + "js_context_toggle_suspend_state": { + "message": "凍結/回復此分頁" + }, + "js_context_toggle_pause_suspension": { + "message": "暫停/取消暫停此分頁的凍結" + }, + "js_context_never_suspend_domain": { + "message": "永遠不要凍結此網域" + }, + "js_context_never_suspend_page": { + "message": "永遠不要凍結此網頁" + }, + "js_context_suspend_selected_tabs": { + "message": "凍結已選擇分頁" + }, + "js_context_unsuspend_selected_tabs": { + "message": "回復已選擇分頁" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "凍結目前視窗中所有的分頁" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "強制凍結當前視窗中的所有分頁" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "回復目前視窗中所有的分頁" + }, + "js_context_soft_suspend_all_tabs": { + "message": "凍結所有視窗的所有分頁" + }, + "js_context_force_suspend_all_tabs": { + "message": "強制凍結所有視窗的所有分頁" + }, + "js_context_unsuspend_all_tabs": { + "message": "回復所有視窗的所有分頁" + }, + "html_about_title": { + "message": "關於" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking (more information available on" + }, + "html_about_fork_end": { + "message": ")" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "如果您有建議或想回報問題,可以在" + }, + "html_about_report_issues_suffix": { + "message": ". 在建立新的想法或問題之前,請檢查您的想法或問題是否存在。謝謝!" + }, + "html_about_debugging_prefix": { + "message": "要啟用日誌記錄或設置調試標誌,請轉至" + }, + "html_about_debugging_suffix": { + "message": "測試分頁。" + }, + "html_about_the_github_issues_page": { + "message": "GitHub issues 網頁上提問" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "這個擴充功能使用 Niklas von Hertzen 撰寫的" + }, + "html_about_html2canvas_suffix": { + "message": "元件庫。" + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "也用了 Aaron Powell 撰寫的" + }, + "html_about_indexedDb_suffix": { + "message": "元件庫。" + }, + "html_about_browserstack": { + "message": "browserstack" + }, + "html_about_browserstack_prefix": { + "message": "同時也謝謝" + }, + "html_about_browserstack_suffix": { + "message": "提供免費的 Chrome 測試工具" + }, + "html_history_title": { + "message": "記錄管理" + }, + "html_history_current_session": { + "message": "目前記錄" + }, + "html_history_recent_sessions": { + "message": "最近記錄" + }, + "html_history_saved_sessions": { + "message": "已儲存記錄" + }, + "html_history_import_session": { + "message": "匯入記錄" + }, + "html_notice_title": { + "message": "通知" + }, + "html_notice_important_notice": { + "message": "來自 The Marvellous Suspender 的重要通知" + }, + "html_options_title": { + "message": "設定" + }, + "html_options_suspend_title": { + "message": "自動凍結分頁" + }, + "html_options_suspended_title": { + "message": "凍結的分頁" + }, + "html_options_other_title": { + "message": "其他設定" + }, + "html_options_suspend_automatically_after": { + "message": "多久後自動凍結" + }, + "html_options_suspend_never": { + "message": "永不" + }, + "html_options_suspend_seconds": { + "message": "秒" + }, + "html_options_suspend_minute": { + "message": "分鐘" + }, + "html_options_suspend_minutes": { + "message": "分鐘" + }, + "html_options_suspend_hour": { + "message": "小時" + }, + "html_options_suspend_hours": { + "message": "小時" + }, + "html_options_suspend_day": { + "message": "天" + }, + "html_options_suspend_days": { + "message": "天" + }, + "html_options_suspend_week": { + "message": "週" + }, + "html_options_suspend_weeks": { + "message": "週" + }, + "html_options_suspend_no_pinned": { + "message": "不要凍結已固定的分頁" + }, + "html_options_suspend_no_forms": { + "message": "不要凍結輸入框有文字且尚未儲存的分頁" + }, + "html_options_suspend_no_audio": { + "message": "不要凍結正在播放聲音的分頁" + }, + "html_options_suspend_only_connected": { + "message": "只在網路連接下才自動凍結" + }, + "html_options_suspend_only_on_battery": { + "message": "只在電腦未接上電源時才自動凍結" + }, + "html_options_suspend_no_active_tabs": { + "message": "不要凍結每個視窗的正在使用中的分頁" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "當分頁被瀏覽就自動回復分頁" + }, + "html_options_suspend_discard_after_suspend": { + "message": "使用 Chrome 內建的凍結/暫停分頁釋放系統記憶體功能" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "通過利用 Chrome 內建的分頁凍結/暫停功能,可以更多的降低記憶體使用。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "當多個分頁同時打開時,可以降低500%的系統記憶體消耗。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "to 500% memory savings when working with large numbers of tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "盡管如此,當重新打開一個的凍結/暫停分頁時,將會有微小的分頁加載延時。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "a suspended tab." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "有關 Chrome discarding 的更多資訊,請參閱:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "主題" + }, + "html_options_suspend_theme_light": { + "message": "明亮" + }, + "html_options_suspend_theme_dark": { + "message": "深色" + }, + "html_options_suspend_screen_capturing": { + "message": "螢幕擷取" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "停用" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "只擷取可見的畫面" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "擷取整個分頁" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "在暫停的分頁上,擴充功能可以在分頁被暫停前顯示圖片預覽。" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "looked like just before it was suspended." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "螢幕擷取功能是實驗性的,可能會讓 CPU 使用率以及記憶體使用量明顯地提高。" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "well as slightly increased memory usage." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "如果您注意到奇怪的行為,如分頁需要很長時間才能掛起,或者 Chrome 意外當機,請嘗試關閉此功能。" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crashing unexpectedly, try turning this feature off." + }, + "html_options_suspend_force_screen_capture": { + "message": "啟用高畫質的螢幕擷取模式" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "禁用時,螢幕擷取具有以下限制以幫助提高效能:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- 低品質的螢幕擷取" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- 如果產生圖片需要 1 分鐘以上,將不會螢幕擷取" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- 圖片的最大高度限制為 5000 像素" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "啟用高品質的畫面捕捉模式可能會讓 CPU 使用率和記憶體使用量明顯提高。" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "and memory usage." + }, + "html_options_whitelist_title": { + "message": "白名單" + }, + "html_options_whitelist_tooltip_line1": { + "message": "在新的一列上新增要列入白名單的每個分頁的 URL。例如:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "要在一列中將多個網站列入白名單,可以指定網址的一部分:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "您還可以使用斜線包起來的文字來指定正規表示式:" + }, + "html_options_whitelist_test": { + "message": "測試白名單" + }, + "html_options_other_enable_context_menu": { + "message": "把 The Marvellous Suspender 加到右鍵選單" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "將擴充套件新增到網頁的右鍵選單。" + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "這樣,您就可以訪問程序中其他位置無法使用的進階凍結操作。" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "elsewhere in the extension." + }, + "html_options_other_enable_sync": { + "message": "使用Chrome 使用者設定檔同步設定" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "登入 Chrome 後,擴充功能將同步相同的設定" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "。" + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "這也將使無痕模式下的設定同步。" + }, + "html_options_other_enable_sync_warning": { + "message": "打開此項將覆蓋 Chrome 使用者設定並同步所有已登入的系統" + }, + "html_options_suspend_on_low_memory": { + "message": "當系統記憶體非常少時凍結分頁" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "此選項會覆蓋 Chrome 的 automatic tab discarding 功能。" + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "如果啟用,該分頁將被強制凍結,而不是被 Chrome 刪除。" + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "正常時 Chrome 僅在系統記憶體非常低時刪除分頁。" + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "注意:這可能導致分頁在「自動分頁凍結」選項中指定的時間之前凍結。" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "specified in the Automatic tab suspension options." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "有關 Chrome discarding 的更多資訊,請參閱:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "回復目前分頁" + }, + "html_popup_suspend_tab": { + "message": "凍結此分頁" + }, + "html_popup_dont_suspend_now": { + "message": "現在還不要凍結" + }, + "html_popup_never_suspend_domain": { + "message": "永遠不要凍結此網域" + }, + "html_popup_never_suspend_page": { + "message": "永遠不要凍結此網頁" + }, + "html_popup_suspend_other_tabs": { + "message": "凍結其他分頁" + }, + "html_popup_unsuspend_all_tabs": { + "message": "回復所有分頁" + }, + "html_popup_suspend_selected_tabs": { + "message": "凍結已選擇分頁" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "回復已選擇分頁" + }, + "html_popup_settings": { + "message": "設定" + }, + "html_restoring_title": { + "message": "回復視窗" + }, + "html_restoring_heading": { + "message": "回復分頁" + }, + "html_restoring_detail": { + "message": "請等待回復此視窗" + }, + "html_recovery_title": { + "message": "回復" + }, + "html_recovery_ruh_roh": { + "message": "噢!" + }, + "html_recovery_description_line1": { + "message": "看來你剛從當掉的擴充功能回復過來。" + }, + "html_recovery_description_line2": { + "message": "之前凍結的分頁可能無法還原。" + }, + "html_recovery_restore_tabs_automatically": { + "message": "自動回復分頁" + }, + "html_recovery_go_to_session_manager": { + "message": "前往記錄管理器" + }, + "html_recovery_important_message": { + "message": "你目前已開啟螢幕擷取,如果擴充功能多次發生故障,建議你取消勾選。" + }, + "html_recovery_disable_screen_capturing": { + "message": "關閉螢幕擷取" + }, + "html_recovery_tabs_to_restore": { + "message": "分頁回復" + }, + "html_shortcuts_title": { + "message": "鍵盤快速鍵" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "鍵盤快速鍵" + }, + "html_shortcuts_context_menu_note": { + "message": "注意:您也可以通過右鍵選單來使用這些操作。" + }, + "html_shortcuts_remap_keys": { + "message": "修改鍵盤快速鍵" + }, + "html_sidebar_general_settings": { + "message": "設定" + }, + "html_sidebar_session_management": { + "message": "記錄管理" + }, + "html_sidebar_shortcuts": { + "message": "鍵盤快速鍵" + }, + "html_sidebar_support": { + "message": "關於" + }, + "html_success_great_success": { + "message": "成功!" + }, + "html_success_all_tabs_restored": { + "message": "你的所有分頁已經回復完成。" + }, + "html_success_goto_advanced_prefix": { + "message": "進階的記錄管理,請前往" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "記錄管理分頁" + }, + "html_suspended_title": { + "message": "分頁已經被凍結" + }, + "html_suspended_tab_suspended": { + "message": "分頁已經被凍結" + }, + "html_suspended_tab_reload": { + "message": "重新載入" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "永遠不要凍結" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "點擊此處重新載入" + }, + "html_suspended_toast_not_connected": { + "message": "您沒有連接到網絡" + }, + "html_suspended_toast_reload_disabled": { + "message": "禁用自動重新載入。" + }, + "html_permissions_title": { + "message": "許可權限" + }, + "html_permissions_heading": { + "message": "請提供允許存取本機檔案 URL 的權限" + }, + "html_permissions_info": { + "message": "這個擴充功能目前不允許暫停那些以 file(檔案)開頭的 URL 連結。\n想要改變這個設定, 可以在擴充功能設定分頁打開允許存取檔案URL的設定。" + }, + "html_permissions_backup": { + "message": "請註意:改變這個設定可能會使你當前所有的暫停分頁短暫的消失。\n以防萬一,最好對當前分頁的瀏覽階段的做備份。" + }, + "html_update_title": { + "message": "更新" + }, + "html_update_heading2": { + "message": "即將變得更好" + }, + "html_update_info": { + "message": "一個新版本的 The Marvellous Suspender 已準備好安裝。\n請注意:凍結分頁將在更新過程中暫時消失。" + }, + "html_update_info_withbackup": { + "message": "請在繼續之前儲存目前瀏覽階段的備份。" + }, + "html_update_info_nobackup_prefix": { + "message": "強烈建議您在繼續之前從" + }, + "html_update_info_nobackup_suffix": { + "message": " 儲存目前瀏覽階段的備份。" + }, + "html_updated_title": { + "message": "更新" + }, + "html_updating_heading": { + "message": "正在更新" + }, + "html_updating_message": { + "message": "請等我回復被暫停的分頁..." + }, + "html_updated_great_suspender_updated": { + "message": "已更新" + }, + "html_updated_info_line1": { + "message": "更新之前,您的分頁已被自動儲存。" + }, + "html_updated_info_line2_prefix": { + "message": "如果在更新過程中遇到任何問題,可以從 " + }, + "html_updated_info_line2_suffix": { + "message": " 分頁中回復遺失的分頁。" + }, + "html_updated_detail_header_prefix": { + "message": "在 " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "新的功能:" + }, + "html_updated_bug_fixes_header": { + "message": "錯誤修復:" + }, + "html_updated_release_notes": { + "message": "請瀏覽 GitHub 取得完整的發行說明:" + }, + "html_updated_patch_message": { + "message": "很抱歉打擾你。我們做了一些維護。" + }, + "html_welcome_title": { + "message": "歡迎來到" + }, + "html_welcome_text_line1": { + "message": "謝謝你安裝" + }, + "html_welcome_text_line2": { + "message": "通過暫停不使用的分頁,可以讓您的電腦減少記憶體的使用。" + }, + "html_welcome_text_line3": { + "message": "您可以在下面更改設定" + }, + "js_popup_normal": { + "message": "分頁將會自動被凍結。" + }, + "js_popup_normal_pause": { + "message": "暫時不要凍結" + }, + "js_popup_special": { + "message": "分頁無法被凍結" + }, + "js_popup_suspended": { + "message": "分頁已經被凍結" + }, + "js_popup_suspended_pause": { + "message": "暫時不要凍結" + }, + "js_popup_whitelisted": { + "message": "例外清單。" + }, + "js_popup_whitelisted_remove": { + "message": "從例外清單移除" + }, + "js_popup_audible": { + "message": "分頁正在播放聲音。" + }, + "js_popup_form_input": { + "message": "分頁有文字還在輸入。" + }, + "js_popup_form_input_unpause": { + "message": "取消暫停" + }, + "js_popup_pinned": { + "message": "分頁已經被固定" + }, + "js_popup_temp_whitelist": { + "message": "分頁凍結暫停。" + }, + "js_popup_temp_whitelist_unpause": { + "message": "取消暫停" + }, + "js_popup_never": { + "message": "禁止自動凍結分頁。" + }, + "js_popup_no_connectivity": { + "message": "未連接網路" + }, + "js_popup_charging": { + "message": "已接上電源" + }, + "js_popup_blockedFile": { + "message": "本機檔案無法暫停。" + }, + "js_popup_blockedFile_enable": { + "message": "啟用" + }, + "js_popup_unknown": { + "message": "等待分頁載入..." + }, + "js_popup_initialising": { + "message": "等待擴充功能初始化..." + }, + "js_popup_error": { + "message": "自動凍結在此分頁上不可用" + }, + "js_history_delete": { + "message": "刪除" + }, + "js_history_export": { + "message": "匯出" + }, + "js_history_reload": { + "message": "讀取和載入" + }, + "js_history_resuspend": { + "message": "重新凍結" + }, + "js_history_save": { + "message": "儲存" + }, + "js_history_window": { + "message": "個視窗" + }, + "js_history_tab": { + "message": "個分頁" + }, + "js_history_plural": { + "message": "s" + }, + "js_history_enter_name_for_session": { + "message": "命名這個記錄" + }, + "js_history_confirm_delete": { + "message": "您確定要刪除此記錄嗎?" + }, + "js_history_confirm_session_overwrite": { + "message": "已經有儲存的名稱的記錄。要覆蓋現有記錄嗎?" + }, + "js_history_import_fail": { + "message": "無法匯入文件。確保文件是純文字檔案,並且每列只有一個 URL。" + }, + "js_suspended_remove_from_whitelist": { + "message": "從白名單移除" + }, + "js_suspended_hotkey_to_reload": { + "message": "設定鍵盤快捷鍵" + }, + "js_suspended_low_memory": { + "message": "由於系統記憶體不足而凍結的分頁" + }, + "js_options_incognito_warning": { + "message": "你目前使用隱私模式。某些功能將無法使用。" + }, + "js_options_whitelist_no_matches": { + "message": "沒有與當前白名單匹配的打開選項卡。" + }, + "js_options_whitelist_matches_heading": { + "message": "這些打開的選項卡與當前白名單相匹配:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "和另外" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "個。" + }, + "js_permissions_button_export": { + "message": "儲存備份" + }, + "js_permissions_button_set": { + "message": "打開擴充套件設定" + }, + "js_update_confirm": { + "message": "您尚未匯出備份。更新擴充功能?" + }, + "js_update_button_export": { + "message": "匯出備份" + }, + "js_update_button_reload": { + "message": "現在更新擴充功能" + }, + "js_shortcuts_not_set": { + "message": "沒有設定" + }, + "js_session_save_point": { + "message": "自動保存點 v" + } } diff --git a/src/about.html b/src/about.html index a9d6eb89..d9c5c3cf 100644 --- a/src/about.html +++ b/src/about.html @@ -36,20 +36,27 @@

+ +

+ TGS 7.1.6 go.gioxx.org/tgs-ads +

- github.com/greatsuspender/thegreatsuspender + github.com/gioxx/MarvellousSuspender +
+ + gioxx.org
- @greatsuspender + @gioxx

- +

diff --git a/src/broken.html b/src/broken.html index 274d5721..91d987ed 100644 --- a/src/broken.html +++ b/src/broken.html @@ -4,7 +4,7 @@ - The Great Suspender is broken + The Marvellous Suspender is broken @@ -16,8 +16,8 @@

Ruh Roh!

-

The Great Suspender failed to start. Perhaps you are using an incompatible version of chrome?

-

Try to restart the extension. If the problem persists, ask for help on the GitHub project page.

+

The Marvellous Suspender failed to start. Perhaps you are using an incompatible version of chrome?

+

Try to restart the extension. If the problem persists, ask for help on the GitHub project page.

You can recover lost tabs from the session management page.


diff --git a/src/debug.html b/src/debug.html index d028d1d0..daad0255 100644 --- a/src/debug.html +++ b/src/debug.html @@ -5,7 +5,7 @@ - The Great Suspender - Debugger + The Marvellous Suspender - Debugger diff --git a/src/img/ic_suspendy_128x128.png b/src/img/ic_suspendy_128x128.png index a4d3d4e81546a6a31fe596f3aec52dce09acd0d8..b221c72feb2cab7c4905280b719ee4e3ae8730fa 100644 GIT binary patch literal 14685 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 ABLDyZ diff --git a/src/img/ic_suspendy_128x128.xcf b/src/img/ic_suspendy_128x128.xcf new file mode 100644 index 0000000000000000000000000000000000000000..4bc3181fe011bfc48e946474081aceb57a336a8d GIT binary patch literal 12429 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 pUHHnk!?GPRe59;y^6B7 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 JMa$Q3{}<;#GmroP delta 390 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 delta 372 zcmbPX(84@HvYwfNfk8u;KNv`{q&xaLGB9lH=l+w(3gjy!dj$D1FjT2AFf_C+9?7?FEuRuzUAzAPM9G8B?ZA znLK&&>({TFo15?5yLb5T;aRh0End91e*OCO4<9~Uvt~_ob#-H7>6;=+dQ2n>KA)w{G3lt5=^qd2;8@owH}pW@TjoEnE57>phTSD+%%oW>~*w z_3~-kve~x+MHrL3-CYd}-1BOQ{^rcxEfGw|X3m{pp>%HT=O1ERPEq^KW{5a&E?}?W znPhTWuzS-a|A5uYT;Eig?wDLSYkKMJ{_Fg?J^w;qvy0fg;1p5gTFA=bEC;lV!PC{x JWt~$(696ian{)sG diff --git a/src/img/ic_suspendy_32x32.png b/src/img/ic_suspendy_32x32.png index 0c3db5263cf2cbec9896165b839514c6c2c7af5c..fab583453ad13989b137c719e02908b8757d8374 100644 GIT binary patch literal 8052 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 diff --git a/src/img/ic_suspendy_32x32.xcf b/src/img/ic_suspendy_32x32.xcf new file mode 100644 index 0000000000000000000000000000000000000000..5a6e927b57eb280b2c0998049868a69414c72e73 GIT binary patch literal 3578 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 Z74-5CX~#41IH((8j&`oLr);+D`WFUl(nA0M delta 633 zcmV-<0*3vSHjxF8BYyw{XF*Lt006O%3;baP0000WV@Og>004R>004l5008;`004mK z004C`008P>0026e000+ooVrmw00006VoOIv00000008+zyMF)x010qNS#tmY3labT z3lag+-G2N400H$$L_t(o!|j*9s@hN-$3KY`QpDvB6%k_|Kz|&H_=n~hbnOcS${l@y zUg#P!bP$4T+{H;BA+zYvqKN3Ah!iw9v`xC)*l0}~y~WAza&q$fb3VUw$T=qh5!7n6 z-a3x+8F&rgc^-lw9JRg#LHL$PBtB@G_BBfGS5cfC$9eKR@7-Sp#Rq%#{{*~`l3R@8 z1pM>|@!M0KfPY0Q>=J+L?5;PF5uibbH}+kuDEbq}jPVB4J7 zzqqd34}>)vjmFBKsz*gpKKhpZevjighe|~;>O}pP>$(rYz9dPNWHMRt`_t(Z;OS_s zWLds=pldXn%?{6(m-e4^2e<>=0nP&0woSL&{p0<3Jb$Ls>4YW=iY?@K-fX# z>)bZ|FP%NLQmGWZUXRskMK+ry9*?tLuNjR-6pO{sWa)I8e!tIhxkQ#_VzC&T&4%G{ z7#epLKv5KQUB|L47K;S{k|d#N8ktNc6d;$&q3b&BcANQp9w{#L+}>`t)a&(&rqhqB z)oPLbuX6edOw+_Lj6>fr3{2C!CROyCOHlcI9^1CDEDK4J04Nj+w*#nFt9YKrU@%~} z+fgc&D3{B(0}w?KRaH?{^{PRSa=kdi9pDad2Y8{5_JQDi{nh}@=RcKOstNE5QL)7! TUn?0D00000NkvXXu0mjf2ge#r diff --git a/src/img/ic_suspendy_32x32_grey.xcf b/src/img/ic_suspendy_32x32_grey.xcf new file mode 100644 index 0000000000000000000000000000000000000000..6d9fcb005912c5e94dcc4b2f53006bf58a881459 GIT binary patch literal 3623 zcmeHJZ%i9y7=L>$&{folNVcHyh7edHrR7iLLxE)eNlaK=+@>2JBu9HaZnnLqJ+LT+ zZp)-)vv*xVC`^Qei2^H#4t0s~i_y58-(CFZ2fu(WMqre#=kvBbITQmrKWM^x`Q7t- zpFi(C@1N&w8P@40eO5c!X)>D;G%^d!-v&Gc&}iWGFhGAqSR26rUI@?uw1A>4CqO=e z5U~PsKLbNovQCPjD;W=K0~NyK%vN~$E(c9|IR|SyY^bm^R?fkB$cnV6^e}A{X-Yrl z!(eXP#%w0j4>tR}ZpzBK7}9KlUe}ghwo}>RVtJBvS=(tZj^ONeFU^x_e-+Qrt&8g(hQdU2R>RX|tu5txz>vC(TnfidSMZKU$i6P6ydZd%P^?YA81wP30u* zvT`;^yrKN$iRUWo%bOYv7A3IJK#~@oVn`R|q#H_}^|5y2^LQbRM_Ar_jP@L-oNfnQ z(pXQzW2pkyzYa+UHq$PKZ!c-AsostE%dBlz&M$aa+Qm~m%&Mf(yu-*Z(y-$l*!Lvt z2c)ut|EbLY7`)c}R8^g6hmg~MC*)W=$8*M~@!2~LX9!kv+Zmj4x{W+*w;Q*etfgvm z&+rjZH7%d%*dGjqE?x=+Lw)DF9V3y*_~gLk!aKuL z6T^M{KzR1kh1iwpp^@vK%*Wp7i_G1a9k@JjIXbgA7wdTa!tngK7>P#2cjv|eZMN>d z%aMzNLRc6aJ=a$1f7Ktn6qz5Jj0$IM2VX(GTyJo2esM2px;_( z)1fv0)$_q%m#y#wf%bCR-8%iGvqTra`F{D%(sy6Yzx7OB%@-Sbc_S$`OePF+GC4K0 zVvsl1uN@j+)ywON>n2Uvd#kzfTH>=h0%=OeR&;W5{i7O!KuOKx(c6TaT$z57$U%1w z^!_0KJY1&9Lx~4Y-|!vK;2)**aVJ6IQYmJwt=llQAKAV@NcY}M)aZ({?MzCzLKkvvL>NkJ4uLP&|D1!x^8 zJOUx!6-2QB=|qj7$#@i?3=wig1JZ_d*hA2!-#RfRh}y6Q$zdX%ygCw#<&SD(@&pmz z2qP4ZACwaDdm^iua7h~M(MqWgx^tuyX1`2#OVSq8G&T+NYNaK$Y4&LQh5pXwK#p|# z+R^qmL$5UllsH04-146}!7t4+N5 zyXKxJy^;P_ar`bU-D7~g-HPw+)?RJ>D;LV2Yb#a#rT*L0=Vb**UNFe=`yl5)&Vrl) mIb}d{5fMm!ytKTWFKd_Oub~5fp8~~lGVs3>Ma6+s5&8}0bSmEf literal 0 HcmV?d00001 diff --git a/src/img/ic_suspendy_48x48.png b/src/img/ic_suspendy_48x48.png index 3fbaae5b8a274daaf2d60fb3f72e02a682be6384..a64439477e6b0036cd7debb89665dd7dc7972677 100644 GIT binary patch literal 12347 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 yR$-dA&#}J004R>004l5008;`004mK z004C`008P>0026e000+ooVrmw00006VoOIv00000008+zyMF)x010qNS#tmY3labT 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 literal 0 HcmV?d00001 diff --git a/src/img/marvellous.png b/src/img/marvellous.png new file mode 100644 index 0000000000000000000000000000000000000000..cde2dc05f27640f339fda092750b66c43a5902c4 GIT binary patch literal 20624 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 - - - - - - - - - - - - - - \ No newline at end of file + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/src/img/snoozy_tab_awake.svg b/src/img/snoozy_tab_awake.svg index 244bb625..7f87c6fd 100644 --- a/src/img/snoozy_tab_awake.svg +++ b/src/img/snoozy_tab_awake.svg @@ -1,12 +1,115 @@ - - - - - - - - - - - - \ No newline at end of file + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/src/img/snoozy_tab_awake_original.svg b/src/img/snoozy_tab_awake_original.svg new file mode 100644 index 00000000..244bb625 --- /dev/null +++ b/src/img/snoozy_tab_awake_original.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/img/snoozy_tab_original.svg b/src/img/snoozy_tab_original.svg new file mode 100644 index 00000000..f25e970b --- /dev/null +++ b/src/img/snoozy_tab_original.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/img/suspendy-guy-alt.png b/src/img/suspendy-guy-alt.png index 1266978f4e63cb7c9bb1e8460515ced3432bbed7..ce1def1f5a7c242b8b1e148c89e561afa45ed09e 100644 GIT binary patch literal 27122 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 diff --git a/src/img/suspendy-guy-oops.png b/src/img/suspendy-guy-oops.png index 17b219e8696e93f5d43efb6d7811e2d125fe98e3..331e6b71d0c94c479c6059d8415563f6a7ae8bee 100644 GIT binary patch literal 28958 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 literal 12545 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 z z-&EyI0NsZSv3^Lw%fAj+bseX0fU))*t8`XQy&vMSiQ6R&<@jFBrMJsdQBsa88G!X^ zEA^W6$w?uQ* z(S?2Z1{A7cD;Ln%%_N!FE1_@w&pAE;Ln+I=oF^z)p^jHo11UR+onOU_QX>2p z+cvE-WUz1h`JjSRjL?#^Cy6_Q&LivER>qN0u++|P8qRW5@M>e(3XKZ|EeH$bH86btR#`7)X8(j^38QOVmIvt@d(TXSK67S zB~>pOSMMy<)1vi3)ik!~!d%XSYkgvY%uaYPlIT|6I2x%I0$37l+S0#haXLlkEU*qP z!V7)y-EeyUe&?7qb2_F|;ye--7o(4P39svkq-4PBgLA4Tn9Tt8^-8ukf2$>Riq@br ztDKMe?d&iG9BhSko{w;<`zKX4-g({K%}{vD{>Fe`9opLAB`BonZtI=F$c6=tW^V#d z0}k-t`y-U{aeu)6C_8_je1n@9P0FhcD9QgW?3Ho@{P&2z74q*9v}0kk`|8{y@rEn$ zk8oxeCee?btp2tI?s({4_a31Xy6qmH<=gZ%k_H?`;b?ANZc(Io&B3+p4jbYVP%Ja| zbGq34rO!Qag2&3urIFAP_AqV&Zi>aoPB?lLxo_#N2#C_S|GvZ{1OcIwSh!&63VYZE z5q6QmMuojVEJ%xjxPl_;D)snkFxTLHG1du{3J??OmjvseZC9%B@Q)n`4fXM4lY+I5 z$M);smlOa%gdP9zur9+CIDfk#hz6B9N?&4teJOANrUbxxgA%NNE!{G~!J+#7Nk>Ek z!ulIN?4Lx0)VLS4$W{uK-6Y5;s4k9 zr(zs2L1D(i4gv8P|HZI)jrhOLKPr~uz_esIP@9jDVdeZ^82-QJD{!Rs4pWC>J#RsU zt$D5>nOIpUOCN+Gn87`Xl9`N&jIklbJi|N@>NjMSh@w@hW8KJmngu6{V za4!m>mbV#xrw+Eqxp$55oTG3^Z?q|qq>i~dmmQVFZK6iO>Gb=Ba+Qx5dxLv{$8j|v zf|;&Q6ru}~6rc&o@^*x@tbV9#J7W3v6)F0jd)f=Ndm=t*2?t<5X#9LQX?E{TVl{px zhp@N!=7?mAojB?O^-=en9mIO5YL>TzShY4+Qt?(5$40BbH~*$>gV^G3?{58PddXpF zcecKF9ZK_Y?Pm2%)Ll)QfY^B3wKTh9ra94x|4cn$3N&@xjx~ zDs)HtwBRn888mVv%$Sfc(|04> zLrQ-$WNN|tE-{8jPj4fz_?NchGcj=~b~#Z`k8J#}c5yfvr2%3F*TL(sZ^r;7c{RB* I8RMY;197Xf(*OVf diff --git a/src/img/suspendy-guy-uh-oh.png b/src/img/suspendy-guy-uh-oh.png index dc35e8be4969458eb57f273cff976ba2fc3a5f43..fc708911452100fbd9834b2f6f4fa782f7e08e7b 100644 GIT binary patch literal 27719 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 literal 10735 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 literal 27570 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 diff --git a/src/js/about.js b/src/js/about.js index 82f3d2bb..472c439a 100644 --- a/src/js/about.js +++ b/src/js/about.js @@ -1,4 +1,4 @@ -/* global chrome, XMLHttpRequest, gsStorage, gsAnalytics, gsUtils */ +/* global chrome, XMLHttpRequest, gsStorage, gsUtils */ (function(global) { 'use strict'; @@ -24,5 +24,4 @@ } }); - gsAnalytics.reportPageView('about.html'); })(this); diff --git a/src/js/background.js b/src/js/background.js index e3dc8a74..04b01116 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -1,4 +1,4 @@ -/* global gsStorage, gsChrome, gsIndexedDb, gsUtils, gsFavicon, gsSession, gsMessages, gsTabSuspendManager, gsTabDiscardManager, gsAnalytics, gsTabCheckManager, gsSuspendedTab, chrome, XMLHttpRequest */ +/* global gsStorage, gsChrome, gsIndexedDb, gsUtils, gsFavicon, gsSession, gsMessages, gsTabSuspendManager, gsTabDiscardManager, gsTabCheckManager, gsSuspendedTab, chrome, XMLHttpRequest */ /* * The Great Suspender * Copyright (C) 2017 Dean Oemcke @@ -56,7 +56,6 @@ var tgs = (function() { tgs, gsUtils, gsChrome, - gsAnalytics, gsStorage, gsIndexedDb, gsMessages, @@ -1217,7 +1216,7 @@ var tgs = (function() { ) { gsUtils.log( 'background', - `Notice target extension version: ${noticeTargetExtensionVersion} + `Notice target extension version: ${noticeTargetExtensionVersion} does not match actual extension version: ${ chrome.runtime.getManifest().version }` @@ -1237,11 +1236,6 @@ var tgs = (function() { //show notice - set global notice field (so that it can be trigger to show later) _noticeToDisplay = resp; - gsAnalytics.reportEvent( - 'Notice', - 'Prep', - resp.target + ':' + resp.version - ); } }; xhr.send(); @@ -1610,37 +1604,37 @@ var tgs = (function() { request.action ); - switch (request.action) { - case 'loadCleanScreencaptureBlocklist': - gsCleanScreencaps.loadList() - case 'reportTabState': - var contentScriptStatus = - request && request.status ? request.status : null; - if ( - contentScriptStatus === 'formInput' || - contentScriptStatus === 'tempWhitelist' - ) { - chrome.tabs.update(sender.tab.id, { autoDiscardable: false }); - } else if (!sender.tab.autoDiscardable) { - chrome.tabs.update(sender.tab.id, { autoDiscardable: true }); - } - // If tab is currently visible then update popup icon - if (sender.tab && isCurrentFocusedTab(sender.tab)) { - calculateTabStatus(sender.tab, contentScriptStatus, function (status) { - setIconStatus(status, sender.tab.id); - }); - } - sendResponse(); - return false; - case 'savePreviewData': - gsTabSuspendManager.handlePreviewImageResponse( - sender.tab, - request.previewUrl, - request.errorMsg - ); // async. unhandled promise - sendResponse(); - return false; + if (request.action === 'reportTabState') { + var contentScriptStatus = + request && request.status ? request.status : null; + if ( + contentScriptStatus === 'formInput' || + contentScriptStatus === 'tempWhitelist' + ) { + chrome.tabs.update(sender.tab.id, { autoDiscardable: false }); + } else if (!sender.tab.autoDiscardable) { + chrome.tabs.update(sender.tab.id, { autoDiscardable: true }); + } + // If tab is currently visible then update popup icon + if (sender.tab && isCurrentFocusedTab(sender.tab)) { + calculateTabStatus(sender.tab, contentScriptStatus, function(status) { + setIconStatus(status, sender.tab.id); + }); + } + sendResponse(); + return false; } + + if (request.action === 'savePreviewData') { + gsTabSuspendManager.handlePreviewImageResponse( + sender.tab, + request.previewUrl, + request.errorMsg + ); // async. unhandled promise + sendResponse(); + return false; + } + // Fallback to empty response to ensure callback is made sendResponse(); return false; @@ -1761,11 +1755,6 @@ var tgs = (function() { var noticeToDisplay = requestNotice(); if (noticeToDisplay) { chrome.tabs.create({ url: chrome.extension.getURL('notice.html') }); - gsAnalytics.reportEvent( - 'Notice', - 'Display', - noticeToDisplay.target + ':' + noticeToDisplay.version - ); } }); chrome.windows.onRemoved.addListener(function(windowId) { @@ -1827,7 +1816,6 @@ var tgs = (function() { function startAnalyticsUpdateJob() { window.setInterval(() => { - gsAnalytics.performPingReport(); const reset = true; gsSession.updateSessionMetrics(reset); }, analyticsCheckInterval); @@ -1886,17 +1874,14 @@ var tgs = (function() { Promise.resolve() .then(tgs.backgroundScriptsReadyAsPromised) // wait until all gsLibs have loaded .then(gsStorage.initSettingsAsPromised) // ensure settings have been loaded and synced - .then(gsStorage.checkManagedStorageAndOverride) // enforce managed settings .then(() => { // initialise other gsLibs return Promise.all([ - gsAnalytics.initAsPromised(), gsFavicon.initAsPromised(), gsTabSuspendManager.initAsPromised(), gsTabCheckManager.initAsPromised(), gsTabDiscardManager.initAsPromised(), gsSession.initAsPromised(), - gsCleanScreencaps.initAsPromised() ]); }) .catch(error => { @@ -1911,7 +1896,5 @@ Promise.resolve() gsUtils.error('background init error: ', error); }) .finally(() => { - gsAnalytics.performStartupReport(); - gsAnalytics.performVersionReport(); tgs.startTimers(); }); diff --git a/src/js/bck/about.js b/src/js/bck/about.js new file mode 100644 index 00000000..82f3d2bb --- /dev/null +++ b/src/js/bck/about.js @@ -0,0 +1,28 @@ +/* global chrome, XMLHttpRequest, gsStorage, gsAnalytics, gsUtils */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + var versionEl = document.getElementById('aboutVersion'); + versionEl.innerHTML = 'v' + chrome.runtime.getManifest().version; + + //hide incompatible sidebar items if in incognito mode + if (chrome.extension.inIncognitoContext) { + Array.prototype.forEach.call( + document.getElementsByClassName('noIncognito'), + function(el) { + el.style.display = 'none'; + } + ); + } + }); + + gsAnalytics.reportPageView('about.html'); +})(this); diff --git a/src/js/bck/background.js b/src/js/bck/background.js new file mode 100644 index 00000000..5e28eaaa --- /dev/null +++ b/src/js/bck/background.js @@ -0,0 +1,1915 @@ +/* global gsStorage, gsChrome, gsIndexedDb, gsUtils, gsFavicon, gsSession, gsMessages, gsTabSuspendManager, gsTabDiscardManager, gsAnalytics, gsTabCheckManager, gsSuspendedTab, chrome, XMLHttpRequest */ +/* + * The Great Suspender + * Copyright (C) 2017 Dean Oemcke + * Available under GNU GENERAL PUBLIC LICENSE v2 + * http://github.com/greatsuspender/thegreatsuspender + * ༼ つ ◕_◕ ༽つ +*/ +var tgs = (function() { + // eslint-disable-line no-unused-vars + 'use strict'; + + const ICON_SUSPENSION_ACTIVE = { + '16': 'img/ic_suspendy_16x16.png', + '32': 'img/ic_suspendy_32x32.png', + }; + const ICON_SUSPENSION_PAUSED = { + '16': 'img/ic_suspendy_16x16_grey.png', + '32': 'img/ic_suspendy_32x32_grey.png', + }; + + // Unsuspended tab props + const STATE_TIMER_DETAILS = 'timerDetails'; + + // Suspended tab props + const STATE_TEMP_WHITELIST_ON_RELOAD = 'whitelistOnReload'; + const STATE_DISABLE_UNSUSPEND_ON_RELOAD = 'disableUnsuspendOnReload'; + const STATE_INITIALISE_SUSPENDED_TAB = 'initialiseSuspendedTab'; + const STATE_UNLOADED_URL = 'unloadedUrl'; + const STATE_HISTORY_URL_TO_REMOVE = 'historyUrlToRemove'; + const STATE_SET_AUTODISCARDABLE = 'setAutodiscardable'; + const STATE_SUSPEND_REASON = 'suspendReason'; // 1=auto-suspend, 2=manual-suspend, 3=discarded + const STATE_SCROLL_POS = 'scrollPos'; + + const focusDelay = 500; + const noticeCheckInterval = 1000 * 60 * 60 * 12; // every 12 hours + const sessionMetricsCheckInterval = 1000 * 60 * 15; // every 15 minutes + const analyticsCheckInterval = 1000 * 60 * 60 * 23.5; // every 23.5 hours + + const _tabStateByTabId = {}; + const _currentFocusedTabIdByWindowId = {}; + const _currentStationaryTabIdByWindowId = {}; + + let _currentFocusedWindowId; + let _currentStationaryWindowId; + let _sessionSaveTimer; + let _newTabFocusTimer; + let _newWindowFocusTimer; + let _noticeToDisplay; + let _isCharging = false; + let _triggerHotkeyUpdate = false; + let _suspensionToggleHotkey; + + function getExtensionGlobals() { + const globals = { + tgs, + gsUtils, + gsChrome, + gsAnalytics, + gsStorage, + gsIndexedDb, + gsMessages, + gsSession, + gsFavicon, + gsTabCheckManager, + gsTabSuspendManager, + gsTabDiscardManager, + gsSuspendedTab, + }; + for (const lib of Object.values(globals)) { + if (!lib) { + return null; + } + } + return globals; + } + + function setViewGlobals(_window) { + const globals = getExtensionGlobals(); + if (!globals) { + throw new Error('Lib not ready'); + } + Object.assign(_window, globals); + } + + function backgroundScriptsReadyAsPromised(retries) { + retries = retries || 0; + if (retries > 300) { + // allow 30 seconds :scream: + chrome.tabs.create({ url: chrome.extension.getURL('broken.html') }); + return Promise.reject('Failed to initialise background scripts'); + } + return new Promise(function(resolve) { + const isReady = getExtensionGlobals() !== null; + resolve(isReady); + }).then(function(isReady) { + if (isReady) { + return Promise.resolve(); + } + return new Promise(function(resolve) { + window.setTimeout(resolve, 100); + }).then(function() { + retries += 1; + return backgroundScriptsReadyAsPromised(retries); + }); + }); + } + + function initAsPromised() { + return new Promise(async function(resolve) { + gsUtils.log('background', 'PERFORMING BACKGROUND INIT...'); + addCommandListeners(); + addMessageListeners(); + addChromeListeners(); + addMiscListeners(); + + //initialise unsuspended tab props + resetAutoSuspendTimerForAllTabs(); + + //add context menu items + //TODO: Report chrome bug where adding context menu in incognito removes it from main windows + if (!chrome.extension.inIncognitoContext) { + buildContextMenu(false); + var contextMenus = gsStorage.getOption(gsStorage.ADD_CONTEXT); + buildContextMenu(contextMenus); + } + + //initialise currentStationary and currentFocused vars + const activeTabs = await gsChrome.tabsQuery({ active: true }); + const currentWindow = await gsChrome.windowsGetLastFocused(); + for (let activeTab of activeTabs) { + _currentStationaryTabIdByWindowId[activeTab.windowId] = activeTab.id; + _currentFocusedTabIdByWindowId[activeTab.windowId] = activeTab.id; + if (currentWindow && currentWindow.id === activeTab.windowId) { + _currentStationaryWindowId = activeTab.windowId; + _currentFocusedWindowId = activeTab.windowId; + } + } + gsUtils.log('background', 'init successful'); + resolve(); + }); + } + + function startTimers() { + startNoticeCheckerJob(); + startSessionMetricsJob(); + startAnalyticsUpdateJob(); + } + + function getInternalViewByTabId(tabId) { + const internalViews = chrome.extension.getViews({ tabId: tabId }); + if (internalViews.length === 1) { + return internalViews[0]; + } + return null; + } + function getInternalViewsByViewName(viewName) { + const internalViews = chrome.extension + .getViews() + .filter(o => o.location.pathname.indexOf(viewName) >= 0); + return internalViews; + } + + function getCurrentlyActiveTab(callback) { + // wrap this in an anonymous async function so we can use await + (async function() { + const currentWindowActiveTabs = await gsChrome.tabsQuery({ + active: true, + currentWindow: true, + }); + if (currentWindowActiveTabs.length > 0) { + callback(currentWindowActiveTabs[0]); + return; + } + + // Fallback on chrome.windows.getLastFocused + const lastFocusedWindow = await gsChrome.windowsGetLastFocused(); + if (lastFocusedWindow) { + const lastFocusedWindowActiveTabs = await gsChrome.tabsQuery({ + active: true, + windowId: lastFocusedWindow.id, + }); + if (lastFocusedWindowActiveTabs.length > 0) { + callback(lastFocusedWindowActiveTabs[0]); + return; + } + } + + // Fallback on _currentStationaryWindowId + if (_currentStationaryWindowId) { + const currentStationaryWindowActiveTabs = await gsChrome.tabsQuery({ + active: true, + windowId: _currentStationaryWindowId, + }); + if (currentStationaryWindowActiveTabs.length > 0) { + callback(currentStationaryWindowActiveTabs[0]); + return; + } + + // Fallback on currentStationaryTabId + const currentStationaryTabId = + _currentStationaryTabIdByWindowId[_currentStationaryWindowId]; + if (currentStationaryTabId) { + const currentStationaryTab = await gsChrome.tabsGet( + currentStationaryTabId + ); + if (currentStationaryTab !== null) { + callback(currentStationaryTab); + return; + } + } + } + callback(null); + })(); + } + + // NOTE: Stationary here means has had focus for more than focusDelay ms + // So it may not necessarily have the tab.active flag set to true + function isCurrentStationaryTab(tab) { + if (tab.windowId !== _currentStationaryWindowId) { + return false; + } + var lastStationaryTabIdForWindow = + _currentStationaryTabIdByWindowId[tab.windowId]; + if (lastStationaryTabIdForWindow) { + return tab.id === lastStationaryTabIdForWindow; + } else { + // fallback on active flag + return tab.active; + } + } + + function isCurrentFocusedTab(tab) { + if (tab.windowId !== _currentFocusedWindowId) { + return false; + } + var currentFocusedTabIdForWindow = + _currentFocusedTabIdByWindowId[tab.windowId]; + if (currentFocusedTabIdForWindow) { + return tab.id === currentFocusedTabIdForWindow; + } else { + // fallback on active flag + return tab.active; + } + } + + function isCurrentActiveTab(tab) { + const activeTabIdForWindow = _currentFocusedTabIdByWindowId[tab.windowId]; + if (activeTabIdForWindow) { + return tab.id === activeTabIdForWindow; + } else { + // fallback on active flag + return tab.active; + } + } + + function whitelistHighlightedTab(includePath) { + includePath = includePath || false; + getCurrentlyActiveTab(function(activeTab) { + if (activeTab) { + if (gsUtils.isSuspendedTab(activeTab)) { + let url = gsUtils.getRootUrl( + gsUtils.getOriginalUrl(activeTab.url), + includePath, + false + ); + gsUtils.saveToWhitelist(url); + unsuspendTab(activeTab); + } else if (gsUtils.isNormalTab(activeTab)) { + let url = gsUtils.getRootUrl(activeTab.url, includePath, false); + gsUtils.saveToWhitelist(url); + calculateTabStatus(activeTab, null, function(status) { + setIconStatus(status, activeTab.id); + }); + } + } + }); + } + + function unwhitelistHighlightedTab(callback) { + getCurrentlyActiveTab(function(activeTab) { + if (activeTab) { + gsUtils.removeFromWhitelist(activeTab.url); + calculateTabStatus(activeTab, null, function(status) { + setIconStatus(status, activeTab.id); + if (callback) callback(status); + }); + } else { + if (callback) callback(gsUtils.STATUS_UNKNOWN); + } + }); + } + + function requestToggleTempWhitelistStateOfHighlightedTab(callback) { + getCurrentlyActiveTab(function(activeTab) { + if (!activeTab) { + if (callback) callback(status); + return; + } + if (gsUtils.isSuspendedTab(activeTab)) { + unsuspendTab(activeTab); + if (callback) callback(gsUtils.STATUS_UNKNOWN); + return; + } + if (!gsUtils.isNormalTab(activeTab, true)) { + if (callback) callback(gsUtils.STATUS_UNKNOWN); + return; + } + + calculateTabStatus(activeTab, null, function(status) { + if ( + status === gsUtils.STATUS_ACTIVE || + status === gsUtils.STATUS_NORMAL + ) { + setTempWhitelistStateForTab(activeTab, callback); + } else if ( + status === gsUtils.STATUS_TEMPWHITELIST || + status === gsUtils.STATUS_FORMINPUT + ) { + unsetTempWhitelistStateForTab(activeTab, callback); + } else { + if (callback) callback(status); + } + }); + }); + } + + function setTempWhitelistStateForTab(tab, callback) { + gsMessages.sendTemporaryWhitelistToContentScript(tab.id, function( + error, + response + ) { + if (error) { + gsUtils.warning( + tab.id, + 'Failed to sendTemporaryWhitelistToContentScript', + error + ); + } + var contentScriptStatus = + response && response.status ? response.status : null; + calculateTabStatus(tab, contentScriptStatus, function(newStatus) { + setIconStatus(newStatus, tab.id); + //This is a hotfix for issue #723 + if (newStatus === 'tempWhitelist' && tab.autoDiscardable) { + chrome.tabs.update(tab.id, { + autoDiscardable: false, + }); + } + if (callback) callback(newStatus); + }); + }); + } + + function unsetTempWhitelistStateForTab(tab, callback) { + gsMessages.sendUndoTemporaryWhitelistToContentScript(tab.id, function( + error, + response + ) { + if (error) { + gsUtils.warning( + tab.id, + 'Failed to sendUndoTemporaryWhitelistToContentScript', + error + ); + } + var contentScriptStatus = + response && response.status ? response.status : null; + calculateTabStatus(tab, contentScriptStatus, function(newStatus) { + setIconStatus(newStatus, tab.id); + //This is a hotfix for issue #723 + if (newStatus !== 'tempWhitelist' && !tab.autoDiscardable) { + chrome.tabs.update(tab.id, { + //async + autoDiscardable: true, + }); + } + if (callback) callback(newStatus); + }); + }); + } + + function openLinkInSuspendedTab(parentTab, linkedUrl) { + //imitate chromes 'open link in new tab' behaviour in how it selects the correct index + chrome.tabs.query({ windowId: chrome.windows.WINDOW_ID_CURRENT }, tabs => { + var newTabIndex = parentTab.index + 1; + var nextTab = tabs[newTabIndex]; + while (nextTab && nextTab.openerTabId === parentTab.id) { + newTabIndex++; + nextTab = tabs[newTabIndex]; + } + var newTabProperties = { + url: linkedUrl, + index: newTabIndex, + openerTabId: parentTab.id, + active: false, + }; + chrome.tabs.create(newTabProperties, tab => { + gsTabSuspendManager.queueTabForSuspension(tab, 1); + }); + }); + } + + function toggleSuspendedStateOfHighlightedTab() { + getCurrentlyActiveTab(activeTab => { + if (activeTab) { + if (gsUtils.isSuspendedTab(activeTab)) { + unsuspendTab(activeTab); + } else { + gsTabSuspendManager.queueTabForSuspension(activeTab, 1); + } + } + }); + } + + function suspendHighlightedTab() { + getCurrentlyActiveTab(activeTab => { + if (activeTab) { + gsTabSuspendManager.queueTabForSuspension(activeTab, 1); + } + }); + } + + function unsuspendHighlightedTab() { + getCurrentlyActiveTab(activeTab => { + if (activeTab && gsUtils.isSuspendedTab(activeTab)) { + unsuspendTab(activeTab); + } + }); + } + + function suspendAllTabs(force) { + const forceLevel = force ? 1 : 2; + getCurrentlyActiveTab(activeTab => { + if (!activeTab) { + gsUtils.warning( + 'background', + 'Could not determine currently active window.' + ); + return; + } + chrome.windows.get(activeTab.windowId, { populate: true }, curWindow => { + for (const tab of curWindow.tabs) { + if (!tab.active) { + gsTabSuspendManager.queueTabForSuspension(tab, forceLevel); + } + } + }); + }); + } + + function suspendAllTabsInAllWindows(force) { + const forceLevel = force ? 1 : 2; + chrome.tabs.query({}, tabs => { + for (const tab of tabs) { + gsTabSuspendManager.queueTabForSuspension(tab, forceLevel); + } + }); + } + + function unsuspendAllTabs() { + getCurrentlyActiveTab(function(activeTab) { + if (!activeTab) { + gsUtils.warning( + 'background', + 'Could not determine currently active window.' + ); + return; + } + chrome.windows.get(activeTab.windowId, { populate: true }, curWindow => { + for (const tab of curWindow.tabs) { + gsTabSuspendManager.unqueueTabForSuspension(tab); + if (gsUtils.isSuspendedTab(tab)) { + unsuspendTab(tab); + } else if (gsUtils.isNormalTab(tab) && !tab.active) { + resetAutoSuspendTimerForTab(tab); + } + } + }); + }); + } + + function unsuspendAllTabsInAllWindows() { + chrome.windows.getLastFocused({}, currentWindow => { + chrome.tabs.query({}, tabs => { + // Because of the way that unsuspending steals window focus, we defer the suspending of tabs in the + // current window until last + var deferredTabs = []; + for (const tab of tabs) { + gsTabSuspendManager.unqueueTabForSuspension(tab); + if (gsUtils.isSuspendedTab(tab)) { + if (tab.windowId === currentWindow.id) { + deferredTabs.push(tab); + } else { + unsuspendTab(tab); + } + } else if (gsUtils.isNormalTab(tab)) { + resetAutoSuspendTimerForTab(tab); + } + } + for (const tab of deferredTabs) { + unsuspendTab(tab); + } + }); + }); + } + + function suspendSelectedTabs() { + chrome.tabs.query( + { highlighted: true, lastFocusedWindow: true }, + selectedTabs => { + for (const tab of selectedTabs) { + gsTabSuspendManager.queueTabForSuspension(tab, 1); + } + } + ); + } + + function unsuspendSelectedTabs() { + chrome.tabs.query( + { highlighted: true, lastFocusedWindow: true }, + selectedTabs => { + for (const tab of selectedTabs) { + gsTabSuspendManager.unqueueTabForSuspension(tab); + if (gsUtils.isSuspendedTab(tab)) { + unsuspendTab(tab); + } + } + } + ); + } + + function queueSessionTimer() { + clearTimeout(_sessionSaveTimer); + _sessionSaveTimer = setTimeout(function() { + gsUtils.log('background', 'updating current session'); + gsSession.updateCurrentSession(); //async + }, 1000); + } + + function resetAutoSuspendTimerForTab(tab) { + clearAutoSuspendTimerForTabId(tab.id); + + const suspendTime = gsStorage.getOption(gsStorage.SUSPEND_TIME); + const timeToSuspend = suspendTime * (1000 * 60); + if ( + gsUtils.isProtectedActiveTab(tab) || + isNaN(suspendTime) || + suspendTime <= 0 + ) { + return; + } + + const timerDetails = {}; + timerDetails.tabId = tab.id; + timerDetails.suspendDateTime = new Date( + new Date().getTime() + timeToSuspend + ); + + timerDetails.timer = setTimeout(async () => { + const updatedTabId = timerDetails.tabId; // This may get updated via updateTabIdReferences + const updatedTab = await gsChrome.tabsGet(updatedTabId); + if (!updatedTab) { + gsUtils.warning(updatedTabId, 'Couldnt find tab. Aborting suspension'); + return; + } + gsTabSuspendManager.queueTabForSuspension(updatedTab, 3); + }, timeToSuspend); + gsUtils.log( + tab.id, + 'Adding tab timer for: ' + timerDetails.suspendDateTime + ); + + setTabStatePropForTabId(tab.id, STATE_TIMER_DETAILS, timerDetails); + } + + function resetAutoSuspendTimerForAllTabs() { + chrome.tabs.query({}, tabs => { + for (const tab of tabs) { + if (gsUtils.isNormalTab(tab)) { + resetAutoSuspendTimerForTab(tab); + } + } + }); + } + + function clearAutoSuspendTimerForTabId(tabId) { + const timerDetails = getTabStatePropForTabId(tabId, STATE_TIMER_DETAILS); + if (!timerDetails) { + return; + } + gsUtils.log(tabId, 'Removing tab timer.'); + clearTimeout(timerDetails.timer); + setTabStatePropForTabId(tabId, STATE_TIMER_DETAILS, null); + } + + function getTabStatePropForTabId(tabId, prop) { + return _tabStateByTabId[tabId] ? _tabStateByTabId[tabId][prop] : undefined; + } + function setTabStatePropForTabId(tabId, prop, value) { + // gsUtils.log(tabId, `Setting tab state prop: ${prop}:`, value); + const tabState = _tabStateByTabId[tabId] || {}; + tabState[prop] = value; + _tabStateByTabId[tabId] = tabState; + } + function clearTabStateForTabId(tabId) { + gsUtils.log(tabId, 'Clearing tab state props:', _tabStateByTabId[tabId]); + clearAutoSuspendTimerForTabId(tabId); + delete _tabStateByTabId[tabId]; + } + + function unsuspendTab(tab) { + if (!gsUtils.isSuspendedTab(tab)) return; + + const scrollPosition = gsUtils.getSuspendedScrollPosition(tab.url); + tgs.setTabStatePropForTabId(tab.id, tgs.STATE_SCROLL_POS, scrollPosition); + + let originalUrl = gsUtils.getOriginalUrl(tab.url); + if (originalUrl) { + // Reloading chrome.tabs.update causes a history item for the suspended tab + // to be made in the tab history. We clean this up on tab updated hook + setTabStatePropForTabId(tab.id, tgs.STATE_HISTORY_URL_TO_REMOVE, tab.url); + if (tab.autoDiscardable) { + setTabStatePropForTabId(tab.id, tgs.STATE_SET_AUTODISCARDABLE, tab.url); + } + // NOTE: Temporarily disable autoDiscardable, as there seems to be a bug + // where discarded (and frozen?) suspended tabs will not unsuspend with + // chrome.tabs.update if this is set to true. This gets unset again after tab + // has reloaded via the STATE_SET_AUTODISCARDABLE flag. + gsUtils.log(tab.id, 'Unsuspending tab via chrome.tabs.update'); + chrome.tabs.update(tab.id, { url: originalUrl, autoDiscardable: false }); + return; + } + + gsUtils.log(tab.id, 'Failed to execute unsuspend tab.'); + } + + function buildSuspensionToggleHotkey() { + return new Promise(resolve => { + let printableHotkey = ''; + chrome.commands.getAll(commands => { + const toggleCommand = commands.find(o => o.name === '1-suspend-tab'); + if (toggleCommand && toggleCommand.shortcut !== '') { + printableHotkey = gsUtils.formatHotkeyString(toggleCommand.shortcut); + resolve(printableHotkey); + } else { + resolve(null); + } + }); + }); + } + + function checkForTriggerUrls(tab, url) { + // test for a save of keyboard shortcuts (chrome://extensions/shortcuts) + if (url === 'chrome://extensions/shortcuts') { + _triggerHotkeyUpdate = true; + } + } + + function handleUnsuspendedTabStateChanged(tab, changeInfo) { + if ( + !changeInfo.hasOwnProperty('status') && + !changeInfo.hasOwnProperty('audible') && + !changeInfo.hasOwnProperty('pinned') && + !changeInfo.hasOwnProperty('discarded') + ) { + return; + } + gsUtils.log( + tab.id, + 'unsuspended tab state changed. changeInfo: ', + changeInfo + ); + + // Ensure we clear the STATE_UNLOADED_URL flag during load in case the + // tab is suspended again before loading can finish (in which case on + // suspended tab complete, the tab will reload again) + if ( + changeInfo.hasOwnProperty('status') && + changeInfo.status === 'loading' + ) { + setTabStatePropForTabId(tab.id, STATE_UNLOADED_URL, null); + } + + // Check if tab has just been discarded + if (changeInfo.hasOwnProperty('discarded') && changeInfo.discarded) { + const existingSuspendReason = getTabStatePropForTabId( + tab.id, + STATE_SUSPEND_REASON + ); + if (existingSuspendReason && existingSuspendReason === 3) { + // For some reason the discarded changeInfo gets called twice (chrome bug?) + // As a workaround we use the suspend reason to determine if we've already + // handled this discard + //TODO: Report chrome bug + return; + } + gsUtils.log( + tab.id, + 'Unsuspended tab has been discarded. Url: ' + tab.url + ); + gsTabDiscardManager.handleDiscardedUnsuspendedTab(tab); //async. unhandled promise. + + // When a tab is discarded the tab id changes. We need up-to-date UNSUSPENDED + // tabIds in the current session otherwise crash recovery will not work + queueSessionTimer(); + return; + } + + // Check if tab is queued for suspension + const queuedTabDetails = gsTabSuspendManager.getQueuedTabDetails(tab); + if (queuedTabDetails) { + // Requeue tab to wake it from possible sleep + delete queuedTabDetails.executionProps.refetchTab; + gsTabSuspendManager.queueTabForSuspension( + tab, + queuedTabDetails.executionProps.forceLevel + ); + return; + } + + let hasTabStatusChanged = false; + + // Check for change in tabs audible status + if (changeInfo.hasOwnProperty('audible')) { + //reset tab timer if tab has just finished playing audio + if (!changeInfo.audible && gsStorage.getOption(gsStorage.IGNORE_AUDIO)) { + resetAutoSuspendTimerForTab(tab); + } + hasTabStatusChanged = true; + } + if (changeInfo.hasOwnProperty('pinned')) { + //reset tab timer if tab has become unpinned + if (!changeInfo.pinned && gsStorage.getOption(gsStorage.IGNORE_PINNED)) { + resetAutoSuspendTimerForTab(tab); + } + hasTabStatusChanged = true; + } + + if (changeInfo.hasOwnProperty('status')) { + if (changeInfo.status === 'complete') { + const tempWhitelistOnReload = getTabStatePropForTabId( + tab.id, + STATE_TEMP_WHITELIST_ON_RELOAD + ); + const scrollPos = + getTabStatePropForTabId(tab.id, STATE_SCROLL_POS) || null; + const historyUrlToRemove = getTabStatePropForTabId( + tab.id, + STATE_HISTORY_URL_TO_REMOVE + ); + const setAutodiscardable = getTabStatePropForTabId( + tab.id, + STATE_SET_AUTODISCARDABLE + ); + clearTabStateForTabId(tab.id); + + if (historyUrlToRemove) { + removeTabHistoryForUnuspendedTab(historyUrlToRemove); + } + if (setAutodiscardable) { + gsChrome.tabsUpdate(tab.id, { autoDiscardable: true }); + } + + //init loaded tab + resetAutoSuspendTimerForTab(tab); + initialiseTabContentScript(tab, tempWhitelistOnReload, scrollPos) + .catch(error => { + gsUtils.warning( + tab.id, + 'Failed to send init to content script. Tab may not behave as expected.' + ); + }) + .then(() => { + // could use returned tab status here below + }); + } + + hasTabStatusChanged = true; + } + + //if tab is currently visible then update popup icon + if (hasTabStatusChanged && isCurrentFocusedTab(tab)) { + calculateTabStatus(tab, null, function(status) { + setIconStatus(status, tab.id); + }); + } + } + + function removeTabHistoryForUnuspendedTab(suspendedUrl) { + chrome.history.deleteUrl({ url: suspendedUrl }); + const originalUrl = gsUtils.getOriginalUrl(suspendedUrl); + chrome.history.getVisits({ url: originalUrl }, visits => { + //assume history entry will be the second to latest one (latest one is the currently visible page) + //NOTE: this will break if the same url has been visited by another tab more recently than the + //suspended tab (pre suspension) + const latestVisit = visits.pop(); + const previousVisit = visits.pop(); + if (previousVisit) { + chrome.history.deleteRange( + { + startTime: previousVisit.visitTime - 0.1, + endTime: previousVisit.visitTime + 0.1, + }, + () => {} + ); + } + }); + } + + function initialiseTabContentScript(tab, isTempWhitelist, scrollPos) { + return new Promise((resolve, reject) => { + const ignoreForms = gsStorage.getOption(gsStorage.IGNORE_FORMS); + gsMessages.sendInitTabToContentScript( + tab.id, + ignoreForms, + isTempWhitelist, + scrollPos, + (error, response) => { + if (error) { + reject(error); + } else { + resolve(response); + } + } + ); + }); + } + + function handleSuspendedTabStateChanged(tab, changeInfo) { + if ( + !changeInfo.hasOwnProperty('status') && + !changeInfo.hasOwnProperty('discarded') + ) { + return; + } + + gsUtils.log( + tab.id, + 'suspended tab status changed. changeInfo: ', + changeInfo + ); + + if (changeInfo.status && changeInfo.status === 'loading') { + tgs.setTabStatePropForTabId( + tab.id, + tgs.STATE_INITIALISE_SUSPENDED_TAB, + true + ); + return; + } + + if ( + (changeInfo.status && changeInfo.status === 'complete') || + changeInfo.discarded + ) { + gsTabSuspendManager.unqueueTabForSuspension(tab); //safety precaution + const shouldInitTab = getTabStatePropForTabId( + tab.id, + STATE_INITIALISE_SUSPENDED_TAB + ); + if (shouldInitTab) { + initialiseSuspendedTab(tab); + } + } + } + + function initialiseSuspendedTab(tab) { + const unloadedUrl = getTabStatePropForTabId(tab.id, STATE_UNLOADED_URL); + const disableUnsuspendOnReload = getTabStatePropForTabId( + tab.id, + STATE_DISABLE_UNSUSPEND_ON_RELOAD + ); + clearTabStateForTabId(tab.id); + + if (isCurrentFocusedTab(tab)) { + setIconStatus(gsUtils.STATUS_SUSPENDED, tab.id); + } + + //if a suspended tab is marked for unsuspendOnReload then unsuspend tab and return early + const suspendedTabRefreshed = unloadedUrl === tab.url; + if (suspendedTabRefreshed && !disableUnsuspendOnReload) { + unsuspendTab(tab); + return; + } + + const tabView = tgs.getInternalViewByTabId(tab.id); + const quickInit = + gsStorage.getOption(gsStorage.DISCARD_AFTER_SUSPEND) && !tab.active; + gsSuspendedTab + .initTab(tab, tabView, { quickInit }) + .catch(error => { + gsUtils.warning(tab.id, error); + }) + .then(() => { + gsTabCheckManager.queueTabCheck(tab, { refetchTab: true }, 3000); + }); + } + + function updateTabIdReferences(newTabId, oldTabId) { + gsUtils.log(oldTabId, 'update tabId references to ' + newTabId); + for (const windowId of Object.keys(_currentFocusedTabIdByWindowId)) { + if (_currentFocusedTabIdByWindowId[windowId] === oldTabId) { + _currentFocusedTabIdByWindowId[windowId] = newTabId; + } + } + for (const windowId of Object.keys(_currentStationaryTabIdByWindowId)) { + if (_currentStationaryTabIdByWindowId[windowId] === oldTabId) { + _currentStationaryTabIdByWindowId[windowId] = newTabId; + } + } + if (_tabStateByTabId[oldTabId]) { + _tabStateByTabId[newTabId] = _tabStateByTabId[oldTabId]; + delete _tabStateByTabId[oldTabId]; + } + const timerDetails = getTabStatePropForTabId(newTabId, STATE_TIMER_DETAILS); + if (timerDetails) { + timerDetails.tabId = newTabId; + } + } + + function removeTabIdReferences(tabId) { + gsUtils.log(tabId, 'removing tabId references to ' + tabId); + for (const windowId of Object.keys(_currentFocusedTabIdByWindowId)) { + if (_currentFocusedTabIdByWindowId[windowId] === tabId) { + _currentFocusedTabIdByWindowId[windowId] = null; + } + } + for (const windowId of Object.keys(_currentStationaryTabIdByWindowId)) { + if (_currentStationaryTabIdByWindowId[windowId] === tabId) { + _currentStationaryTabIdByWindowId[windowId] = null; + } + } + clearTabStateForTabId(tabId); + } + + async function getSuspensionToggleHotkey() { + if (_suspensionToggleHotkey === undefined) { + _suspensionToggleHotkey = await buildSuspensionToggleHotkey(); + } + return _suspensionToggleHotkey; + } + + function handleWindowFocusChanged(windowId) { + gsUtils.log(windowId, 'window gained focus'); + if (windowId < 0 || windowId === _currentFocusedWindowId) { + return; + } + _currentFocusedWindowId = windowId; + + // Get the active tab in the newly focused window + chrome.tabs.query({ active: true }, function(tabs) { + if (!tabs || !tabs.length) { + return; + } + var focusedTab; + for (var tab of tabs) { + if (tab.windowId === windowId) { + focusedTab = tab; + } + } + if (!focusedTab) { + gsUtils.warning( + 'background', + `Couldnt find active tab with windowId: ${windowId}. Window may have been closed.` + ); + return; + } + + //update icon + calculateTabStatus(focusedTab, null, function(status) { + setIconStatus(status, focusedTab.id); + }); + + //pause for a bit before assuming we're on a new window as some users + //will key through intermediate windows to get to the one they want. + queueNewWindowFocusTimer(focusedTab.id, windowId, focusedTab); + }); + } + + async function handleTabFocusChanged(tabId, windowId) { + gsUtils.log(tabId, 'tab gained focus'); + + const focusedTab = await gsChrome.tabsGet(tabId); + if (!focusedTab) { + // If focusedTab is null then assume tab has been discarded between the + // time the chrome.tabs.onActivated event was activated and now. + // If so, then a subsequeunt chrome.tabs.onActivated event will be called + // with the new discarded id + gsUtils.log( + tabId, + 'Could not find newly focused tab. Assuming it has been discarded' + ); + return; + } + + const previouslyFocusedTabId = _currentFocusedTabIdByWindowId[windowId]; + _currentFocusedTabIdByWindowId[windowId] = tabId; + + // If the tab focused before this was the keyboard shortcuts page, then update hotkeys on suspended pages + if (_triggerHotkeyUpdate) { + const oldHotkey = _suspensionToggleHotkey; + _suspensionToggleHotkey = await buildSuspensionToggleHotkey(); + if (oldHotkey !== _suspensionToggleHotkey) { + const suspendedViews = getInternalViewsByViewName('suspended'); + for (const suspendedView of suspendedViews) { + gsSuspendedTab.updateCommand(suspendedView, _suspensionToggleHotkey); + } + } + _triggerHotkeyUpdate = false; + } + + gsTabDiscardManager.unqueueTabForDiscard(focusedTab); + + // If normal tab, then ensure it has a responsive content script + let contentScriptStatus = null; + if (gsUtils.isNormalTab(focusedTab, true)) { + contentScriptStatus = await getContentScriptStatus(focusedTab.id); + if (!contentScriptStatus) { + contentScriptStatus = await gsTabCheckManager.queueTabCheckAsPromise( + focusedTab, + {}, + 0 + ); + } + gsUtils.log( + focusedTab.id, + 'Content script status: ' + contentScriptStatus + ); + } + + //update icon + const status = await new Promise(r => { + calculateTabStatus(focusedTab, contentScriptStatus, r); + }); + gsUtils.log(focusedTab.id, 'Focused tab status: ' + status); + + //if this tab still has focus then update icon + if (_currentFocusedTabIdByWindowId[windowId] === focusedTab.id) { + setIconStatus(status, focusedTab.id); + } + + //pause for a bit before assuming we're on a new tab as some users + //will key through intermediate tabs to get to the one they want. + queueNewTabFocusTimer(tabId, windowId, focusedTab); + + //test for a save of keyboard shortcuts (chrome://extensions/shortcuts) + if (focusedTab.url === 'chrome://extensions/shortcuts') { + _triggerHotkeyUpdate = true; + } + + let discardAfterSuspend = gsStorage.getOption( + gsStorage.DISCARD_AFTER_SUSPEND + ); + if (!discardAfterSuspend) { + return; + } + + //queue job to discard previously focused tab + const previouslyFocusedTab = previouslyFocusedTabId + ? await gsChrome.tabsGet(previouslyFocusedTabId) + : null; + if (!previouslyFocusedTab) { + gsUtils.log( + previouslyFocusedTabId, + 'Could not find tab. Has probably already been discarded' + ); + return; + } + if (!gsUtils.isSuspendedTab(previouslyFocusedTab)) { + return; + } + + //queue tabCheck for previouslyFocusedTab. that will force a discard afterwards + //but also avoids conflicts if this tab is already scheduled for checking + gsUtils.log( + previouslyFocusedTabId, + 'Queueing previously focused tab for discard via tabCheckManager' + ); + gsTabCheckManager.queueTabCheck(previouslyFocusedTab, {}, 1000); + } + + function queueNewWindowFocusTimer(tabId, windowId, focusedTab) { + clearTimeout(_newWindowFocusTimer); + _newWindowFocusTimer = setTimeout(function() { + var previousStationaryWindowId = _currentStationaryWindowId; + _currentStationaryWindowId = windowId; + var previousStationaryTabId = + _currentStationaryTabIdByWindowId[previousStationaryWindowId]; + handleNewStationaryTabFocus(tabId, previousStationaryTabId, focusedTab); + }, focusDelay); + } + + function queueNewTabFocusTimer(tabId, windowId, focusedTab) { + clearTimeout(_newTabFocusTimer); + _newTabFocusTimer = setTimeout(function() { + var previousStationaryTabId = _currentStationaryTabIdByWindowId[windowId]; + _currentStationaryTabIdByWindowId[windowId] = focusedTab.id; + handleNewStationaryTabFocus(tabId, previousStationaryTabId, focusedTab); + }, focusDelay); + } + + function handleNewStationaryTabFocus( + focusedTabId, + previousStationaryTabId, + focusedTab + ) { + gsUtils.log(focusedTabId, 'new stationary tab focus handled'); + + if (gsUtils.isSuspendedTab(focusedTab)) { + handleSuspendedTabFocusGained(focusedTab); //async. unhandled promise. + } else if (gsUtils.isNormalTab(focusedTab)) { + const queuedTabDetails = gsTabSuspendManager.getQueuedTabDetails( + focusedTab + ); + //if focusedTab is already in the queue for suspension then remove it. + if (queuedTabDetails) { + //although sometimes it seems that this is a 'fake' tab focus resulting + //from the popup menu disappearing. in these cases the previousStationaryTabId + //should match the current tabId (fix for issue #735) + const isRealTabFocus = + previousStationaryTabId && previousStationaryTabId !== focusedTabId; + + //also, only cancel suspension if the tab suspension request has a forceLevel > 1 + const isLowForceLevel = queuedTabDetails.executionProps.forceLevel > 1; + + if (isRealTabFocus && isLowForceLevel) { + gsTabSuspendManager.unqueueTabForSuspension(focusedTab); + } + } + } else if (focusedTab.url === chrome.extension.getURL('options.html')) { + const optionsView = getInternalViewByTabId(focusedTab.id); + if (optionsView && optionsView.exports) { + optionsView.exports.initSettings(); + } + } + + //Reset timer on tab that lost focus. + //NOTE: This may be due to a change in window focus in which case the tab may still have .active = true + if (previousStationaryTabId && previousStationaryTabId !== focusedTabId) { + chrome.tabs.get(previousStationaryTabId, function(previousStationaryTab) { + if (chrome.runtime.lastError) { + //Tab has probably been removed + return; + } + if ( + previousStationaryTab && + gsUtils.isNormalTab(previousStationaryTab) && + !gsUtils.isProtectedActiveTab(previousStationaryTab) + ) { + resetAutoSuspendTimerForTab(previousStationaryTab); + } + }); + } + } + + async function handleSuspendedTabFocusGained(focusedTab) { + if (focusedTab.status !== 'loading') { + //safety check to ensure suspended tab has been initialised + gsTabCheckManager.queueTabCheck(focusedTab, { refetchTab: false }, 0); + } + + //check for auto-unsuspend + var autoUnsuspend = gsStorage.getOption(gsStorage.UNSUSPEND_ON_FOCUS); + if (autoUnsuspend) { + if (navigator.onLine) { + unsuspendTab(focusedTab); + } else { + const suspendedView = getInternalViewByTabId(focusedTab.id); + if (suspendedView) { + gsSuspendedTab.showNoConnectivityMessage(suspendedView); + } + } + } + } + + function promptForFilePermissions() { + getCurrentlyActiveTab(activeTab => { + chrome.tabs.create({ + url: chrome.extension.getURL('permissions.html'), + index: activeTab.index + 1, + }); + }); + } + + function checkForNotices() { + gsUtils.log('background', 'Checking for notices..'); + var xhr = new XMLHttpRequest(); + var lastShownNoticeVersion = gsStorage.fetchNoticeVersion(); + + xhr.open('GET', 'https://greatsuspender.github.io/notice.json', true); + xhr.timeout = 4000; + xhr.setRequestHeader('Cache-Control', 'no-cache'); + xhr.onreadystatechange = function() { + if (xhr.readyState === 4 && xhr.responseText) { + var resp; + try { + resp = JSON.parse(xhr.responseText); + } catch (e) { + gsUtils.error( + 'background', + 'Failed to parse notice response', + xhr.responseText + ); + return; + } + + if (!resp || !resp.active || !resp.text) { + gsUtils.log('background', 'No new notice found'); + return; + } + + //only show notice if it is intended for this extension version + var noticeTargetExtensionVersion = String(resp.target); + if ( + noticeTargetExtensionVersion !== chrome.runtime.getManifest().version + ) { + gsUtils.log( + 'background', + `Notice target extension version: ${noticeTargetExtensionVersion} + does not match actual extension version: ${ + chrome.runtime.getManifest().version + }` + ); + return; + } + + //only show notice if it has not already been shown + var noticeVersion = String(resp.version); + if (noticeVersion <= lastShownNoticeVersion) { + gsUtils.log( + 'background', + `Notice version: ${noticeVersion} is not greater than last shown notice version: ${lastShownNoticeVersion}` + ); + return; + } + + //show notice - set global notice field (so that it can be trigger to show later) + _noticeToDisplay = resp; + gsAnalytics.reportEvent( + 'Notice', + 'Prep', + resp.target + ':' + resp.version + ); + } + }; + xhr.send(); + } + + function requestNotice() { + return _noticeToDisplay; + } + function clearNotice() { + _noticeToDisplay = undefined; + } + + function isCharging() { + return _isCharging; + } + + function getDebugInfo(tabId, callback) { + const timerDetails = getTabStatePropForTabId(tabId, STATE_TIMER_DETAILS); + const info = { + windowId: '', + tabId: '', + status: gsUtils.STATUS_UNKNOWN, + timerUp: timerDetails ? timerDetails.suspendDateTime : '-', + }; + + chrome.tabs.get(tabId, function(tab) { + if (chrome.runtime.lastError) { + gsUtils.error(tabId, chrome.runtime.lastError); + callback(info); + return; + } + + info.windowId = tab.windowId; + info.tabId = tab.id; + if (gsUtils.isNormalTab(tab, true)) { + gsMessages.sendRequestInfoToContentScript(tab.id, function( + error, + tabInfo + ) { + if (error) { + gsUtils.warning(tab.id, 'Failed to getDebugInfo', error); + } + if (tabInfo) { + calculateTabStatus(tab, tabInfo.status, function(status) { + info.status = status; + callback(info); + }); + } else { + callback(info); + } + }); + } else { + calculateTabStatus(tab, null, function(status) { + info.status = status; + callback(info); + }); + } + }); + } + + function getContentScriptStatus(tabId, knownContentScriptStatus) { + return new Promise(function(resolve) { + if (knownContentScriptStatus) { + resolve(knownContentScriptStatus); + } else { + gsMessages.sendRequestInfoToContentScript(tabId, function( + error, + tabInfo + ) { + if (error) { + gsUtils.warning(tabId, 'Failed to getContentScriptStatus', error); + } + if (tabInfo) { + resolve(tabInfo.status); + } else { + resolve(null); + } + }); + } + }); + } + + //possible suspension states are: + //loading: tab object has a state of 'loading' + //normal: a tab that will be suspended + //blockedFile: a file:// tab that can theoretically be suspended but is being blocked by the user's settings + //special: a tab that cannot be suspended + //suspended: a tab that is suspended + //discarded: a tab that has been discarded + //never: suspension timer set to 'never suspend' + //formInput: a tab that has a partially completed form (and IGNORE_FORMS is true) + //audible: a tab that is playing audio (and IGNORE_AUDIO is true) + //active: a tab that is active (and IGNORE_ACTIVE_TABS is true) + //tempWhitelist: a tab that has been manually paused + //pinned: a pinned tab (and IGNORE_PINNED is true) + //whitelisted: a tab that has been whitelisted + //charging: computer currently charging (and IGNORE_WHEN_CHARGING is true) + //noConnectivity: internet currently offline (and IGNORE_WHEN_OFFLINE is true) + //unknown: an error detecting tab status + function calculateTabStatus(tab, knownContentScriptStatus, callback) { + //check for loading + if (tab.status === 'loading') { + callback(gsUtils.STATUS_LOADING); + return; + } + //check if it is a blockedFile tab (this needs to have precedence over isSpecialTab) + if (gsUtils.isBlockedFileTab(tab)) { + callback(gsUtils.STATUS_BLOCKED_FILE); + return; + } + //check if it is a special tab + if (gsUtils.isSpecialTab(tab)) { + callback(gsUtils.STATUS_SPECIAL); + return; + } + //check if tab has been discarded + if (gsUtils.isDiscardedTab(tab)) { + callback(gsUtils.STATUS_DISCARDED); + return; + } + //check if it has already been suspended + if (gsUtils.isSuspendedTab(tab)) { + callback(gsUtils.STATUS_SUSPENDED); + return; + } + //check whitelist + if (gsUtils.checkWhiteList(tab.url)) { + callback(gsUtils.STATUS_WHITELISTED); + return; + } + //check never suspend + //should come after whitelist check as it causes popup to show the whitelisting option + if (gsStorage.getOption(gsStorage.SUSPEND_TIME) === '0') { + callback(gsUtils.STATUS_NEVER); + return; + } + getContentScriptStatus(tab.id, knownContentScriptStatus).then( + contentScriptStatus => { + if ( + contentScriptStatus && + contentScriptStatus !== gsUtils.STATUS_NORMAL + ) { + callback(contentScriptStatus); + return; + } + //check running on battery + if ( + gsStorage.getOption(gsStorage.IGNORE_WHEN_CHARGING) && + _isCharging + ) { + callback(gsUtils.STATUS_CHARGING); + return; + } + //check internet connectivity + if ( + gsStorage.getOption(gsStorage.IGNORE_WHEN_OFFLINE) && + !navigator.onLine + ) { + callback(gsUtils.STATUS_NOCONNECTIVITY); + return; + } + //check pinned tab + if (gsUtils.isProtectedPinnedTab(tab)) { + callback(gsUtils.STATUS_PINNED); + return; + } + //check audible tab + if (gsUtils.isProtectedAudibleTab(tab)) { + callback(gsUtils.STATUS_AUDIBLE); + return; + } + //check active + if (gsUtils.isProtectedActiveTab(tab)) { + callback(gsUtils.STATUS_ACTIVE); + return; + } + if (contentScriptStatus) { + callback(contentScriptStatus); // should be 'normal' + return; + } + callback(gsUtils.STATUS_UNKNOWN); + } + ); + } + + function getActiveTabStatus(callback) { + getCurrentlyActiveTab(function(tab) { + if (!tab) { + callback(gsUtils.STATUS_UNKNOWN); + return; + } + calculateTabStatus(tab, null, function(status) { + callback(status); + }); + }); + } + + //change the icon to either active or inactive + function setIconStatus(status, tabId) { + // gsUtils.log(tabId, 'Setting icon status: ' + status); + var icon = ![gsUtils.STATUS_NORMAL, gsUtils.STATUS_ACTIVE].includes(status) + ? ICON_SUSPENSION_PAUSED + : ICON_SUSPENSION_ACTIVE; + chrome.browserAction.setIcon({ path: icon, tabId: tabId }, function() { + if (chrome.runtime.lastError) { + gsUtils.warning( + tabId, + chrome.runtime.lastError, + `Failed to set icon for tab. Tab may have been closed.` + ); + } + }); + } + + function setIconStatusForActiveTab() { + getCurrentlyActiveTab(function(tab) { + if (!tab) { + return; + } + calculateTabStatus(tab, null, function(status) { + setIconStatus(status, tab.id); + }); + }); + } + + //HANDLERS FOR RIGHT-CLICK CONTEXT MENU + function buildContextMenu(showContextMenu) { + const allContexts = [ + 'page', + 'frame', + 'editable', + 'image', + 'video', + 'audio', + ]; //'selection', + + if (!showContextMenu) { + chrome.contextMenus.removeAll(); + } else { + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_open_link_in_suspended_tab'), + contexts: ['link'], + onclick: (info, tab) => { + openLinkInSuspendedTab(tab, info.linkUrl); + }, + }); + + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_toggle_suspend_state'), + contexts: allContexts, + onclick: () => toggleSuspendedStateOfHighlightedTab(), + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_toggle_pause_suspension'), + contexts: allContexts, + onclick: () => requestToggleTempWhitelistStateOfHighlightedTab(), + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_never_suspend_page'), + contexts: allContexts, + onclick: () => whitelistHighlightedTab(true), + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_never_suspend_domain'), + contexts: allContexts, + onclick: () => whitelistHighlightedTab(false), + }); + + chrome.contextMenus.create({ + type: 'separator', + contexts: allContexts, + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_suspend_selected_tabs'), + contexts: allContexts, + onclick: () => suspendSelectedTabs(), + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_unsuspend_selected_tabs'), + contexts: allContexts, + onclick: () => unsuspendSelectedTabs(), + }); + + chrome.contextMenus.create({ + type: 'separator', + contexts: allContexts, + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage( + 'js_context_soft_suspend_other_tabs_in_window' + ), + contexts: allContexts, + onclick: () => suspendAllTabs(false), + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage( + 'js_context_force_suspend_other_tabs_in_window' + ), + contexts: allContexts, + onclick: () => suspendAllTabs(true), + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage( + 'js_context_unsuspend_all_tabs_in_window' + ), + contexts: allContexts, + onclick: () => unsuspendAllTabs(), + }); + + chrome.contextMenus.create({ + type: 'separator', + contexts: allContexts, + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_soft_suspend_all_tabs'), + contexts: allContexts, + onclick: () => suspendAllTabsInAllWindows(false), + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_force_suspend_all_tabs'), + contexts: allContexts, + onclick: () => suspendAllTabsInAllWindows(true), + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('js_context_unsuspend_all_tabs'), + contexts: allContexts, + onclick: () => unsuspendAllTabsInAllWindows(), + }); + } + } + + //HANDLERS FOR KEYBOARD SHORTCUTS + + function addCommandListeners() { + chrome.commands.onCommand.addListener(function(command) { + if (command === '1-suspend-tab') { + toggleSuspendedStateOfHighlightedTab(); + } else if (command === '2-toggle-temp-whitelist-tab') { + requestToggleTempWhitelistStateOfHighlightedTab(); + } else if (command === '2a-suspend-selected-tabs') { + suspendSelectedTabs(); + } else if (command === '2b-unsuspend-selected-tabs') { + unsuspendSelectedTabs(); + } else if (command === '3-suspend-active-window') { + suspendAllTabs(false); + } else if (command === '3b-force-suspend-active-window') { + suspendAllTabs(true); + } else if (command === '4-unsuspend-active-window') { + unsuspendAllTabs(); + } else if (command === '4b-soft-suspend-all-windows') { + suspendAllTabsInAllWindows(false); + } else if (command === '5-suspend-all-windows') { + suspendAllTabsInAllWindows(true); + } else if (command === '6-unsuspend-all-windows') { + unsuspendAllTabsInAllWindows(); + } + }); + } + + //HANDLERS FOR MESSAGE REQUESTS + + function messageRequestListener(request, sender, sendResponse) { + gsUtils.log( + sender.tab.id, + 'background messageRequestListener', + request.action + ); + + if (request.action === 'reportTabState') { + var contentScriptStatus = + request && request.status ? request.status : null; + if ( + contentScriptStatus === 'formInput' || + contentScriptStatus === 'tempWhitelist' + ) { + chrome.tabs.update(sender.tab.id, { autoDiscardable: false }); + } else if (!sender.tab.autoDiscardable) { + chrome.tabs.update(sender.tab.id, { autoDiscardable: true }); + } + // If tab is currently visible then update popup icon + if (sender.tab && isCurrentFocusedTab(sender.tab)) { + calculateTabStatus(sender.tab, contentScriptStatus, function(status) { + setIconStatus(status, sender.tab.id); + }); + } + sendResponse(); + return false; + } + + if (request.action === 'savePreviewData') { + gsTabSuspendManager.handlePreviewImageResponse( + sender.tab, + request.previewUrl, + request.errorMsg + ); // async. unhandled promise + sendResponse(); + return false; + } + + // Fallback to empty response to ensure callback is made + sendResponse(); + return false; + } + + function externalMessageRequestListener(request, sender, sendResponse) { + gsUtils.log('background', 'external message request: ', request, sender); + + if (!request.action || !['suspend', 'unsuspend'].includes(request.action)) { + sendResponse('Error: unknown request.action: ' + request.action); + return; + } + + // wrap this in an anonymous async function so we can use await + (async function() { + let tab; + if (request.tabId) { + if (typeof request.tabId !== 'number') { + sendResponse('Error: tabId must be an int'); + return; + } + tab = await gsChrome.tabsGet(request.tabId); + if (!tab) { + sendResponse('Error: no tab found with id: ' + request.tabId); + return; + } + } else { + tab = await new Promise(r => { + getCurrentlyActiveTab(r); + }); + } + if (!tab) { + sendResponse('Error: failed to find a target tab'); + return; + } + + if (request.action === 'suspend') { + if (gsUtils.isSuspendedTab(tab, true)) { + sendResponse('Error: tab is already suspended'); + return; + } + + gsTabSuspendManager.queueTabForSuspension(tab, 1); + sendResponse(); + return; + } + + if (request.action === 'unsuspend') { + if (!gsUtils.isSuspendedTab(tab)) { + sendResponse('Error: tab is not suspended'); + return; + } + + unsuspendTab(tab); + sendResponse(); + return; + } + })(); + return true; + } + + function addMessageListeners() { + chrome.runtime.onMessage.addListener(messageRequestListener); + //attach listener to runtime for external messages, to allow + //interoperability with other extensions in the manner of an API + chrome.runtime.onMessageExternal.addListener( + externalMessageRequestListener + ); + } + + function addChromeListeners() { + chrome.windows.onFocusChanged.addListener(function(windowId) { + handleWindowFocusChanged(windowId); + }); + chrome.tabs.onActivated.addListener(function(activeInfo) { + handleTabFocusChanged(activeInfo.tabId, activeInfo.windowId); // async. unhandled promise + }); + chrome.tabs.onReplaced.addListener(function(addedTabId, removedTabId) { + updateTabIdReferences(addedTabId, removedTabId); + }); + chrome.tabs.onCreated.addListener(async function(tab) { + gsUtils.log(tab.id, 'tab created. tabUrl: ' + tab.url); + queueSessionTimer(); + + // It's unusual for a suspended tab to be created. Usually they are updated + // from a normal tab. This usually happens when using 'reopen closed tab'. + if (gsUtils.isSuspendedTab(tab) && !tab.active) { + // Queue tab for check but mark it as sleeping for 5 seconds to give + // a chance for the tab to load + gsTabCheckManager.queueTabCheck(tab, {}, 5000); + } + }); + chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) { + gsUtils.log(tabId, 'tab removed.'); + queueSessionTimer(); + removeTabIdReferences(tabId); + }); + chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { + if (!changeInfo) return; + + // if url has changed + if (changeInfo.url) { + gsUtils.log(tabId, 'tab url changed. changeInfo: ', changeInfo); + checkForTriggerUrls(tab, changeInfo.url); + queueSessionTimer(); + } + + if (gsUtils.isSuspendedTab(tab)) { + handleSuspendedTabStateChanged(tab, changeInfo); + } else if (gsUtils.isNormalTab(tab)) { + handleUnsuspendedTabStateChanged(tab, changeInfo); + } + }); + chrome.windows.onCreated.addListener(function(window) { + gsUtils.log(window.id, 'window created.'); + queueSessionTimer(); + + var noticeToDisplay = requestNotice(); + if (noticeToDisplay) { + chrome.tabs.create({ url: chrome.extension.getURL('notice.html') }); + gsAnalytics.reportEvent( + 'Notice', + 'Display', + noticeToDisplay.target + ':' + noticeToDisplay.version + ); + } + }); + chrome.windows.onRemoved.addListener(function(windowId) { + gsUtils.log(windowId, 'window removed.'); + queueSessionTimer(); + }); + } + + function addMiscListeners() { + //add listener for battery state changes + if (navigator.getBattery) { + navigator.getBattery().then(function(battery) { + _isCharging = battery.charging; + + battery.onchargingchange = function() { + _isCharging = battery.charging; + gsUtils.log('background', `_isCharging: ${_isCharging}`); + setIconStatusForActiveTab(); + //restart timer on all normal tabs + //NOTE: some tabs may have been prevented from suspending when computer was charging + if ( + !_isCharging && + gsStorage.getOption(gsStorage.IGNORE_WHEN_CHARGING) + ) { + resetAutoSuspendTimerForAllTabs(); + } + }; + }); + } + + //add listeners for online/offline state changes + window.addEventListener('online', function() { + gsUtils.log('background', 'Internet is online.'); + //restart timer on all normal tabs + //NOTE: some tabs may have been prevented from suspending when internet was offline + if (gsStorage.getOption(gsStorage.IGNORE_WHEN_OFFLINE)) { + resetAutoSuspendTimerForAllTabs(); + } + setIconStatusForActiveTab(); + }); + window.addEventListener('offline', function() { + gsUtils.log('background', 'Internet is offline.'); + setIconStatusForActiveTab(); + }); + } + + function startNoticeCheckerJob() { + checkForNotices(); + window.setInterval(checkForNotices, noticeCheckInterval); + } + + function startSessionMetricsJob() { + gsSession.updateSessionMetrics(true); + window.setInterval( + gsSession.updateSessionMetrics, + sessionMetricsCheckInterval + ); + } + + function startAnalyticsUpdateJob() { + window.setInterval(() => { + gsAnalytics.performPingReport(); + const reset = true; + gsSession.updateSessionMetrics(reset); + }, analyticsCheckInterval); + } + + return { + STATE_TIMER_DETAILS, + STATE_UNLOADED_URL, + STATE_INITIALISE_SUSPENDED_TAB, + STATE_HISTORY_URL_TO_REMOVE, + STATE_TEMP_WHITELIST_ON_RELOAD, + STATE_DISABLE_UNSUSPEND_ON_RELOAD, + STATE_SET_AUTODISCARDABLE, + STATE_SUSPEND_REASON, + STATE_SCROLL_POS, + getTabStatePropForTabId, + setTabStatePropForTabId, + + backgroundScriptsReadyAsPromised, + initAsPromised, + initialiseTabContentScript, + setViewGlobals, + getInternalViewByTabId, + getInternalViewsByViewName, + startTimers, + requestNotice, + clearNotice, + buildContextMenu, + getActiveTabStatus, + getDebugInfo, + calculateTabStatus, + isCharging, + isCurrentStationaryTab, + isCurrentFocusedTab, + isCurrentActiveTab, + clearAutoSuspendTimerForTabId, + resetAutoSuspendTimerForTab, + resetAutoSuspendTimerForAllTabs, + getSuspensionToggleHotkey, + + unsuspendTab, + unsuspendHighlightedTab, + unwhitelistHighlightedTab, + requestToggleTempWhitelistStateOfHighlightedTab, + suspendHighlightedTab, + suspendAllTabs, + unsuspendAllTabs, + suspendSelectedTabs, + unsuspendSelectedTabs, + whitelistHighlightedTab, + unsuspendAllTabsInAllWindows, + promptForFilePermissions, + }; +})(); + +Promise.resolve() + .then(tgs.backgroundScriptsReadyAsPromised) // wait until all gsLibs have loaded + .then(gsStorage.initSettingsAsPromised) // ensure settings have been loaded and synced + .then(() => { + // initialise other gsLibs + return Promise.all([ + gsAnalytics.initAsPromised(), + gsFavicon.initAsPromised(), + gsTabSuspendManager.initAsPromised(), + gsTabCheckManager.initAsPromised(), + gsTabDiscardManager.initAsPromised(), + gsSession.initAsPromised(), + ]); + }) + .catch(error => { + gsUtils.error('background init error: ', error); + }) + .then(gsSession.runStartupChecks) // performs crash check (and maybe recovery) and tab responsiveness checks + .catch(error => { + gsUtils.error('background startup checks error: ', error); + }) + .then(tgs.initAsPromised) // adds handle(Un)SuspendedTabChanged listeners! + .catch(error => { + gsUtils.error('background init error: ', error); + }) + .finally(() => { + gsAnalytics.performStartupReport(); + gsAnalytics.performVersionReport(); + tgs.startTimers(); + }); diff --git a/src/js/bck/broken.js b/src/js/bck/broken.js new file mode 100644 index 00000000..6941e739 --- /dev/null +++ b/src/js/bck/broken.js @@ -0,0 +1,32 @@ +/*global chrome, gsAnalytics */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + function init() { + document + .getElementById('restartExtension') + .addEventListener('click', function() { + chrome.runtime.reload(); + }); + document + .getElementById('sessionManagementLink') + .addEventListener('click', function() { + chrome.tabs.create({ url: chrome.extension.getURL('history.html') }); + }); + gsAnalytics.reportPageView('broken.html'); + } + if (document.readyState !== 'loading') { + init(); + } else { + document.addEventListener('DOMContentLoaded', function() { + init(); + }); + } +})(this); diff --git a/src/js/bck/debug.js b/src/js/bck/debug.js new file mode 100644 index 00000000..0e4b08ea --- /dev/null +++ b/src/js/bck/debug.js @@ -0,0 +1,148 @@ +/*global chrome, tgs, gsAnalytics, gsUtils, gsFavicon, gsStorage, gsChrome */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + var currentTabs = {}; + + function generateTabInfo(info) { + // console.log(info.tabId, info); + var timerStr = + info && info.timerUp && info && info.timerUp !== '-' + ? new Date(info.timerUp).toLocaleString() + : '-'; + var html = '', + windowId = info && info.windowId ? info.windowId : '?', + tabId = info && info.tabId ? info.tabId : '?', + tabIndex = info && info.tab ? info.tab.index : '?', + favicon = info && info.tab ? info.tab.favIconUrl : '', + tabTitle = info && info.tab ? gsUtils.htmlEncode(info.tab.title) : '?', + tabTimer = timerStr, + tabStatus = info ? info.status : '?'; + + favicon = + favicon && favicon.indexOf('data') === 0 + ? favicon + : gsFavicon.generateChromeFavIconUrlFromUrl(info.tab.url); + + html += ''; + html += '' + windowId + ''; + html += '' + tabId + ''; + html += '' + tabIndex + ''; + html += ''; + html += '' + tabTitle + ''; + html += '' + tabTimer + ''; + html += '' + tabStatus + ''; + html += ''; + + return html; + } + + async function fetchInfo() { + const tabs = await gsChrome.tabsQuery(); + const debugInfoPromises = []; + for (const [i, curTab] of tabs.entries()) { + currentTabs[tabs[i].id] = tabs[i]; + debugInfoPromises.push( + new Promise(r => + tgs.getDebugInfo(curTab.id, o => { + o.tab = curTab; + r(o); + }) + ) + ); + } + const debugInfos = await Promise.all(debugInfoPromises); + for (const debugInfo of debugInfos) { + var html, + tableEl = document.getElementById('gsProfilerBody'); + html = generateTabInfo(debugInfo); + tableEl.innerHTML = tableEl.innerHTML + html; + } + } + + function addFlagHtml(elementId, getterFn, setterFn) { + document.getElementById(elementId).innerHTML = getterFn(); + document.getElementById(elementId).onclick = function(e) { + const newVal = !getterFn(); + setterFn(newVal); + document.getElementById(elementId).innerHTML = newVal; + }; + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(async function() { + await fetchInfo(); + addFlagHtml( + 'toggleDebugInfo', + () => gsUtils.isDebugInfo(), + newVal => gsUtils.setDebugInfo(newVal) + ); + addFlagHtml( + 'toggleDebugError', + () => gsUtils.isDebugError(), + newVal => gsUtils.setDebugError(newVal) + ); + addFlagHtml( + 'toggleDiscardInPlaceOfSuspend', + () => gsStorage.getOption(gsStorage.DISCARD_IN_PLACE_OF_SUSPEND), + newVal => { + gsStorage.setOptionAndSync( + gsStorage.DISCARD_IN_PLACE_OF_SUSPEND, + newVal + ); + } + ); + addFlagHtml( + 'toggleUseAlternateScreenCaptureLib', + () => gsStorage.getOption(gsStorage.USE_ALT_SCREEN_CAPTURE_LIB), + newVal => { + gsStorage.setOptionAndSync( + gsStorage.USE_ALT_SCREEN_CAPTURE_LIB, + newVal + ); + } + ); + document.getElementById('claimSuspendedTabs').onclick = async function(e) { + const tabs = await gsChrome.tabsQuery(); + for (const tab of tabs) { + if ( + gsUtils.isSuspendedTab(tab, true) && + tab.url.indexOf(chrome.runtime.id) < 0 + ) { + const newUrl = tab.url.replace( + gsUtils.getRootUrl(tab.url), + chrome.runtime.id + ); + await gsChrome.tabsUpdate(tab.id, { url: newUrl }); + } + } + }; + + var extensionsUrl = `chrome://extensions/?id=${chrome.runtime.id}`; + document + .getElementById('backgroundPage') + .setAttribute('href', extensionsUrl); + document.getElementById('backgroundPage').onclick = function() { + chrome.tabs.create({ url: extensionsUrl }); + }; + + /* + chrome.processes.onUpdatedWithMemory.addListener(function (processes) { + chrome.tabs.query({}, function (tabs) { + var html = ''; + html += generateMemStats(processes); + html += '
'; + html += generateTabStats(tabs); + document.getElementById('gsProfiler').innerHTML = html; + }); + }); + */ + }); + gsAnalytics.reportPageView('debug.html'); +})(this); diff --git a/src/js/gsAnalytics.js b/src/js/bck/gsAnalytics.js similarity index 69% rename from src/js/gsAnalytics.js rename to src/js/bck/gsAnalytics.js index 2352dbf7..1615526c 100644 --- a/src/js/gsAnalytics.js +++ b/src/js/bck/gsAnalytics.js @@ -1,6 +1,6 @@ /*global ga, gsStorage, gsSession, gsUtils */ // eslint-disable-next-line no-unused-vars -var gsAnalytics = function() { +var gsAnalytics = (function() { 'use strict'; const DIMENSION_VERSION = 'dimension1'; @@ -16,13 +16,6 @@ var gsAnalytics = function() { function initAsPromised() { return new Promise(function(resolve) { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'init tracking aborted because tracking is disabled' - ); - resolve(); - } try { ga('create', 'UA-167314577-2', 'auto'); ga('set', 'checkProtocolTask', function() {}); @@ -36,13 +29,6 @@ var gsAnalytics = function() { } function setUserDimensions() { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'setting dimensions aborted because tracking is disabled' - ); - return; - } const dimensions = { [DIMENSION_VERSION]: chrome.runtime.getManifest().version + '', [DIMENSION_SCREEN_CAPTURE]: @@ -58,13 +44,6 @@ var gsAnalytics = function() { } function performStartupReport() { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'perfomStartupReport aborted because tracking is disabled' - ); - return; - } const category = 'System'; const action = gsSession.getStartupType(); @@ -89,13 +68,6 @@ var gsAnalytics = function() { } function performVersionReport() { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'performVersionReport aborted because tracking is disabled' - ); - return; - } const startupType = gsSession.getStartupType(); if (!['Install', 'Update'].includes(startupType)) { return; @@ -115,13 +87,6 @@ var gsAnalytics = function() { } function performPingReport() { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'performPingReport aborted because tracking is disabled' - ); - return; - } const category = 'System'; const action = 'Ping'; @@ -138,38 +103,18 @@ var gsAnalytics = function() { } function reportPageView(pageName) { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'reportPageView aborted because tracking is disabled' - ); - return; - } ga('send', 'pageview', pageName); } function reportEvent(category, action, label) { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'reportEvent aborted because tracking is disabled' - ); - return; - } ga('send', 'event', category, action, label); } function reportException(errorMessage) { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'reportException aborted because tracking is disabled' - ); - return; - } ga('send', 'exception', { exDescription: errorMessage, exFatal: false, }); } + return { initAsPromised, performStartupReport, @@ -180,9 +125,9 @@ var gsAnalytics = function() { reportEvent, reportException, }; -}; +})(); -function loadGoogleAnalytics(i, s, o, g, r, a, m) { +(function(i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; (i[r] = i[r] || @@ -194,25 +139,10 @@ function loadGoogleAnalytics(i, s, o, g, r, a, m) { a.async = 1; a.src = g; m.parentNode.insertBefore(a, m); -} - -function init() { - if (!gsStorage.getOption('trackingOptOut')) { - loadGoogleAnalytics( - window, - document, - 'script', - 'https://www.google-analytics.com/analytics.js', - 'ga' - ); - } - gsAnalytics = gsAnalytics(); -} - -if (document.readyState == 'complete') { - init(); -} else { - document.addEventListener('DOMContentLoaded', function() { - init(); - }); -} +})( + window, + document, + 'script', + 'https://www.google-analytics.com/analytics.js', + 'ga' +); diff --git a/src/js/bck/gsStorage.js b/src/js/bck/gsStorage.js new file mode 100644 index 00000000..1fb7bb0a --- /dev/null +++ b/src/js/bck/gsStorage.js @@ -0,0 +1,412 @@ +/*global chrome, gsAnalytics, gsSession, localStorage, gsUtils */ +'use strict'; + +var gsStorage = { + SCREEN_CAPTURE: 'screenCapture', + SCREEN_CAPTURE_FORCE: 'screenCaptureForce', + SUSPEND_IN_PLACE_OF_DISCARD: 'suspendInPlaceOfDiscard', + UNSUSPEND_ON_FOCUS: 'gsUnsuspendOnFocus', + SUSPEND_TIME: 'gsTimeToSuspend', + IGNORE_WHEN_OFFLINE: 'onlineCheck', + IGNORE_WHEN_CHARGING: 'batteryCheck', + IGNORE_PINNED: 'gsDontSuspendPinned', + IGNORE_FORMS: 'gsDontSuspendForms', + IGNORE_AUDIO: 'gsDontSuspendAudio', + IGNORE_ACTIVE_TABS: 'gsDontSuspendActiveTabs', + IGNORE_CACHE: 'gsIgnoreCache', + ADD_CONTEXT: 'gsAddContextMenu', + SYNC_SETTINGS: 'gsSyncSettings', + NO_NAG: 'gsNoNag', + THEME: 'gsTheme', + WHITELIST: 'gsWhitelist', + + DISCARD_AFTER_SUSPEND: 'discardAfterSuspend', + DISCARD_IN_PLACE_OF_SUSPEND: 'discardInPlaceOfSuspend', + USE_ALT_SCREEN_CAPTURE_LIB: 'useAlternateScreenCaptureLib', + + APP_VERSION: 'gsVersion', + LAST_NOTICE: 'gsNotice', + LAST_EXTENSION_RECOVERY: 'gsExtensionRecovery', + + SM_SESSION_METRICS: 'gsSessionMetrics', + SM_TIMESTAMP: 'sessionTimestamp', + SM_SUSPENDED_TAB_COUNT: 'suspendedTabCount', + SM_TOTAL_TAB_COUNT: 'totalTabCount', + + noop: function() {}, + + getSettingsDefaults: function() { + const defaults = {}; + defaults[gsStorage.SCREEN_CAPTURE] = '0'; + defaults[gsStorage.SCREEN_CAPTURE_FORCE] = false; + defaults[gsStorage.SUSPEND_IN_PLACE_OF_DISCARD] = false; + defaults[gsStorage.DISCARD_IN_PLACE_OF_SUSPEND] = false; + defaults[gsStorage.USE_ALT_SCREEN_CAPTURE_LIB] = false; + defaults[gsStorage.DISCARD_AFTER_SUSPEND] = false; + defaults[gsStorage.IGNORE_WHEN_OFFLINE] = false; + defaults[gsStorage.IGNORE_WHEN_CHARGING] = false; + defaults[gsStorage.UNSUSPEND_ON_FOCUS] = false; + defaults[gsStorage.IGNORE_PINNED] = true; + defaults[gsStorage.IGNORE_FORMS] = true; + defaults[gsStorage.IGNORE_AUDIO] = true; + defaults[gsStorage.IGNORE_ACTIVE_TABS] = true; + defaults[gsStorage.IGNORE_CACHE] = false; + defaults[gsStorage.ADD_CONTEXT] = true; + defaults[gsStorage.SYNC_SETTINGS] = true; + defaults[gsStorage.SUSPEND_TIME] = '60'; + defaults[gsStorage.NO_NAG] = false; + defaults[gsStorage.WHITELIST] = ''; + defaults[gsStorage.THEME] = 'light'; + + return defaults; + }, + + /** + * LOCAL STORAGE FUNCTIONS + */ + + //populate localstorage settings with sync settings where undefined + initSettingsAsPromised: function() { + return new Promise(function(resolve) { + var defaultSettings = gsStorage.getSettingsDefaults(); + var defaultKeys = Object.keys(defaultSettings); + chrome.storage.sync.get(defaultKeys, function(syncedSettings) { + gsUtils.log('gsStorage', 'syncedSettings on init: ', syncedSettings); + gsSession.setSynchedSettingsOnInit(syncedSettings); + + var rawLocalSettings; + try { + rawLocalSettings = JSON.parse(localStorage.getItem('gsSettings')); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'Failed to parse gsSettings: ', + localStorage.getItem('gsSettings') + ); + } + if (!rawLocalSettings) { + rawLocalSettings = {}; + } else { + //if we have some rawLocalSettings but SYNC_SETTINGS is not defined + //then define it as FALSE (as opposed to default of TRUE) + rawLocalSettings[gsStorage.SYNC_SETTINGS] = + rawLocalSettings[gsStorage.SYNC_SETTINGS] || false; + } + gsUtils.log('gsStorage', 'localSettings on init: ', rawLocalSettings); + var shouldSyncSettings = rawLocalSettings[gsStorage.SYNC_SETTINGS]; + + var mergedSettings = {}; + for (const key of defaultKeys) { + if (key === gsStorage.SYNC_SETTINGS) { + if (chrome.extension.inIncognitoContext) { + mergedSettings[key] = false; + } else { + mergedSettings[key] = rawLocalSettings.hasOwnProperty(key) + ? rawLocalSettings[key] + : defaultSettings[key]; + } + continue; + } + // If nags are disabled locally, then ensure we disable them on synced profile + if ( + key === gsStorage.NO_NAG && + shouldSyncSettings && + rawLocalSettings.hasOwnProperty(gsStorage.NO_NAG) && + rawLocalSettings[gsStorage.NO_NAG] + ) { + mergedSettings[gsStorage.NO_NAG] = true; + continue; + } + // if synced setting exists and local setting does not exist or + // syncing is enabled locally then overwrite with synced value + if ( + syncedSettings.hasOwnProperty(key) && + (!rawLocalSettings.hasOwnProperty(key) || shouldSyncSettings) + ) { + mergedSettings[key] = syncedSettings[key]; + } + //fallback on rawLocalSettings + if (!mergedSettings.hasOwnProperty(key)) { + mergedSettings[key] = rawLocalSettings[key]; + } + //fallback on defaultSettings + if ( + typeof mergedSettings[key] === 'undefined' || + mergedSettings[key] === null + ) { + gsUtils.errorIfInitialised( + 'gsStorage', + 'Missing key: ' + key + '! Will init with default.' + ); + mergedSettings[key] = defaultSettings[key]; + } + } + gsStorage.saveSettings(mergedSettings); + gsUtils.log('gsStorage', 'mergedSettings: ', mergedSettings); + + // if any of the new settings are different to those in sync, then trigger a resync + var triggerResync = false; + for (const key of defaultKeys) { + if ( + key !== gsStorage.SYNC_SETTINGS && + syncedSettings[key] !== mergedSettings[key] + ) { + triggerResync = true; + } + } + if (triggerResync) { + gsStorage.syncSettings(); + } + gsStorage.addSettingsSyncListener(); + gsUtils.log('gsStorage', 'init successful'); + resolve(); + }); + }); + }, + + // Listen for changes to synced settings + addSettingsSyncListener: function() { + chrome.storage.onChanged.addListener(function(remoteSettings, namespace) { + if (namespace !== 'sync' || !remoteSettings) { + return; + } + var shouldSync = gsStorage.getOption(gsStorage.SYNC_SETTINGS); + if (shouldSync) { + var localSettings = gsStorage.getSettings(); + var changedSettingKeys = []; + var oldValueBySettingKey = {}; + var newValueBySettingKey = {}; + Object.keys(remoteSettings).forEach(function(key) { + var remoteSetting = remoteSettings[key]; + + // If nags are disabled locally, then ensure we disable them on synced profile + if (key === gsStorage.NO_NAG) { + if (remoteSetting.newValue === false) { + return false; // don't process this key + } + } + + if (localSettings[key] !== remoteSetting.newValue) { + gsUtils.log( + 'gsStorage', + 'Changed value from sync', + key, + remoteSetting.newValue + ); + changedSettingKeys.push(key); + oldValueBySettingKey[key] = localSettings[key]; + newValueBySettingKey[key] = remoteSetting.newValue; + localSettings[key] = remoteSetting.newValue; + } + }); + + if (changedSettingKeys.length > 0) { + gsStorage.saveSettings(localSettings); + gsUtils.performPostSaveUpdates( + changedSettingKeys, + oldValueBySettingKey, + newValueBySettingKey + ); + } + } + }); + }, + + //due to migration issues and new settings being added, i have built in some redundancy + //here so that getOption will always return a valid value. + getOption: function(prop) { + var settings = gsStorage.getSettings(); + if (typeof settings[prop] === 'undefined' || settings[prop] === null) { + settings[prop] = gsStorage.getSettingsDefaults()[prop]; + gsStorage.saveSettings(settings); + } + return settings[prop]; + }, + + setOption: function(prop, value) { + var settings = gsStorage.getSettings(); + settings[prop] = value; + // gsUtils.log('gsStorage', 'gsStorage', 'setting prop: ' + prop + ' to value ' + value); + gsStorage.saveSettings(settings); + }, + + // Important to note that setOption (and ultimately saveSettings) uses localStorage whereas + // syncSettings saves to chrome.storage. + // Calling syncSettings has the unfortunate side-effect of triggering the chrome.storage.onChanged + // listener which the re-saves the setting to localStorage a second time. + setOptionAndSync: function(prop, value) { + gsStorage.setOption(prop, value); + gsStorage.syncSettings(); + }, + + getSettings: function() { + var settings; + try { + settings = JSON.parse(localStorage.getItem('gsSettings')); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'Failed to parse gsSettings: ', + localStorage.getItem('gsSettings') + ); + } + if (!settings) { + settings = gsStorage.getSettingsDefaults(); + gsStorage.saveSettings(settings); + } + return settings; + }, + + saveSettings: function(settings) { + try { + localStorage.setItem('gsSettings', JSON.stringify(settings)); + gsAnalytics.setUserDimensions(); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'failed to save gsSettings to local storage', + e + ); + } + }, + + // Push settings to sync + syncSettings: function() { + var settings = gsStorage.getSettings(); + if (settings[gsStorage.SYNC_SETTINGS]) { + // Since sync is a local setting, delete it to simplify things. + delete settings[gsStorage.SYNC_SETTINGS]; + gsUtils.log( + 'gsStorage', + 'gsStorage', + 'Pushing local settings to sync', + settings + ); + chrome.storage.sync.set(settings, () => { + if (chrome.runtime.lastError) { + gsUtils.error( + 'gsStorage', + 'failed to save to chrome.storage.sync: ', + chrome.runtime.lastError + ); + } + }); + } + }, + + fetchLastVersion: function() { + var version; + try { + version = JSON.parse(localStorage.getItem(gsStorage.APP_VERSION)); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'Failed to parse ' + gsStorage.APP_VERSION + ': ', + localStorage.getItem(gsStorage.APP_VERSION) + ); + } + version = version || '0.0.0'; + return version + ''; + }, + setLastVersion: function(newVersion) { + try { + localStorage.setItem(gsStorage.APP_VERSION, JSON.stringify(newVersion)); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'failed to save ' + gsStorage.APP_VERSION + ' to local storage', + e + ); + } + }, + + fetchNoticeVersion: function() { + var lastNoticeVersion; + try { + lastNoticeVersion = JSON.parse( + localStorage.getItem(gsStorage.LAST_NOTICE) + ); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'Failed to parse ' + gsStorage.LAST_NOTICE + ': ', + localStorage.getItem(gsStorage.LAST_NOTICE) + ); + } + lastNoticeVersion = lastNoticeVersion || '0'; + return lastNoticeVersion + ''; + }, + setNoticeVersion: function(newVersion) { + try { + localStorage.setItem(gsStorage.LAST_NOTICE, JSON.stringify(newVersion)); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'failed to save ' + gsStorage.LAST_NOTICE + ' to local storage', + e + ); + } + }, + + fetchLastExtensionRecoveryTimestamp: function() { + var lastExtensionRecoveryTimestamp; + try { + lastExtensionRecoveryTimestamp = JSON.parse( + localStorage.getItem(gsStorage.LAST_EXTENSION_RECOVERY) + ); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'Failed to parse ' + gsStorage.LAST_EXTENSION_RECOVERY + ': ', + localStorage.getItem(gsStorage.LAST_EXTENSION_RECOVERY) + ); + } + return lastExtensionRecoveryTimestamp; + }, + setLastExtensionRecoveryTimestamp: function(extensionRecoveryTimestamp) { + try { + localStorage.setItem( + gsStorage.LAST_EXTENSION_RECOVERY, + JSON.stringify(extensionRecoveryTimestamp) + ); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'failed to save ' + + gsStorage.LAST_EXTENSION_RECOVERY + + ' to local storage', + e + ); + } + }, + + fetchSessionMetrics: function() { + var sessionMetrics = {}; + try { + sessionMetrics = JSON.parse( + localStorage.getItem(gsStorage.SM_SESSION_METRICS) + ); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'Failed to parse ' + gsStorage.SM_SESSION_METRICS + ': ', + localStorage.getItem(gsStorage.SM_SESSION_METRICS) + ); + } + return sessionMetrics; + }, + setSessionMetrics: function(sessionMetrics) { + try { + localStorage.setItem( + gsStorage.SM_SESSION_METRICS, + JSON.stringify(sessionMetrics) + ); + } catch (e) { + gsUtils.error( + 'gsStorage', + 'failed to save ' + gsStorage.SM_SESSION_METRICS + ' to local storage', + e + ); + } + }, +}; diff --git a/src/js/bck/gsUtils.js b/src/js/bck/gsUtils.js new file mode 100644 index 00000000..3b025b3a --- /dev/null +++ b/src/js/bck/gsUtils.js @@ -0,0 +1,905 @@ +/*global chrome, localStorage, gsStorage, gsChrome, gsMessages, gsSession, gsTabSuspendManager, gsTabDiscardManager, gsSuspendedTab, gsFavicon, tgs */ +'use strict'; + +var debugInfo = false; +var debugError = false; + +var gsUtils = { + STATUS_NORMAL: 'normal', + STATUS_LOADING: 'loading', + STATUS_SPECIAL: 'special', + STATUS_BLOCKED_FILE: 'blockedFile', + STATUS_SUSPENDED: 'suspended', + STATUS_DISCARDED: 'discarded', + STATUS_NEVER: 'never', + STATUS_FORMINPUT: 'formInput', + STATUS_AUDIBLE: 'audible', + STATUS_ACTIVE: 'active', + STATUS_TEMPWHITELIST: 'tempWhitelist', + STATUS_PINNED: 'pinned', + STATUS_WHITELISTED: 'whitelisted', + STATUS_CHARGING: 'charging', + STATUS_NOCONNECTIVITY: 'noConnectivity', + STATUS_UNKNOWN: 'unknown', + + // eslint-disable-line no-unused-vars + contains: function(array, value) { + for (var i = 0; i < array.length; i++) { + if (array[i] === value) return true; + } + return false; + }, + + dir: function(object) { + if (debugInfo) { + console.dir(object); + } + }, + log: function(id, text, ...args) { + if (debugInfo) { + args = args || []; + console.log(id, (new Date() + '').split(' ')[4], text, ...args); + } + }, + warning: function(id, text, ...args) { + if (debugError) { + args = args || []; + const ignores = ['Error', 'gsUtils', 'gsMessages']; + const errorLine = gsUtils + .getStackTrace() + .split('\n') + .filter(o => !ignores.find(p => o.indexOf(p) >= 0)) + .join('\n'); + args.push(`\n${errorLine}`); + console.log( + 'WARNING:', + id, + (new Date() + '').split(' ')[4], + text, + ...args + ); + } + }, + errorIfInitialised: function(id, errorObj, ...args) { + args = args || []; + if (gsSession.isInitialising()) { + gsUtils.warning(id, errorObj, args); + } else { + gsUtils.error(id, errorObj, args); + } + }, + error: function(id, errorObj, ...args) { + if (errorObj === undefined) { + errorObj = id; + id = '?'; + } + //NOTE: errorObj may be just a string :/ + if (debugError) { + const stackTrace = errorObj.hasOwnProperty('stack') + ? errorObj.stack + : gsUtils.getStackTrace(); + const errorMessage = errorObj.hasOwnProperty('message') + ? errorObj.message + : typeof errorObj === 'string' + ? errorObj + : JSON.stringify(errorObj, null, 2); + errorObj = errorObj || {}; + console.log(id, (new Date() + '').split(' ')[4], 'Error:'); + console.error( + gsUtils.getPrintableError(errorMessage, stackTrace, ...args) + ); + } else { + // const logString = errorObj.hasOwnProperty('stack') + // ? errorObj.stack + // : `${JSON.stringify(errorObj)}\n${gsUtils.getStackTrace()}`; + // gsAnalytics.reportException(logString, false); + } + }, + // Puts all the error args into a single printable string so that all the info + // is displayed in chrome://extensions error console + getPrintableError(errorMessage, stackTrace, ...args) { + let errorString = errorMessage; + errorString += `\n${args.map(o => JSON.stringify(o, null, 2)).join('\n')}`; + errorString += `\n${stackTrace}`; + return errorString; + }, + getStackTrace: function() { + var obj = {}; + Error.captureStackTrace(obj, gsUtils.getStackTrace); + return obj.stack; + }, + + isDebugInfo: function() { + return debugInfo; + }, + + isDebugError: function() { + return debugError; + }, + + setDebugInfo: function(value) { + debugInfo = value; + }, + + setDebugError: function(value) { + debugError = value; + }, + + isDiscardedTab: function(tab) { + return tab.discarded; + }, + + //tests for non-standard web pages. does not check for suspended pages! + isSpecialTab: function(tab) { + const url = tab.url || tab.pendingUrl; + if (gsUtils.isSuspendedTab(tab, true)) { + return false; + } + // Careful, suspended urls start with "chrome-extension://" + if ( + url.indexOf('about') === 0 || + url.indexOf('chrome') === 0 || + // webstore urls no longer seem to crash the extension :D + // url.indexOf('chrome.google.com/webstore') >= 0 || + gsUtils.isBlockedFileTab(tab) + ) { + return true; + } + return false; + }, + + isFileTab: function(tab) { + const url = tab.url || tab.pendingUrl; + if (url.indexOf('file') === 0) { + return true; + } + return false; + }, + + //tests if the page is a file:// page AND the user has not enabled access to + //file URLs in extension settings + isBlockedFileTab: function(tab) { + if (gsUtils.isFileTab(tab) && !gsSession.isFileUrlsAccessAllowed()) { + return true; + } + return false; + }, + + //does not include suspended pages! + isInternalTab: function(tab) { + const url = tab.url || tab.pendingUrl; + var isLocalExtensionPage = + url.indexOf('chrome-extension://' + chrome.runtime.id) === 0; + return isLocalExtensionPage && !gsUtils.isSuspendedTab(tab); + }, + + isProtectedPinnedTab: function(tab) { + var dontSuspendPinned = gsStorage.getOption(gsStorage.IGNORE_PINNED); + return dontSuspendPinned && tab.pinned; + }, + + isProtectedAudibleTab: function(tab) { + var dontSuspendAudible = gsStorage.getOption(gsStorage.IGNORE_AUDIO); + return dontSuspendAudible && tab.audible; + }, + + isProtectedActiveTab: function(tab) { + var dontSuspendActiveTabs = gsStorage.getOption( + gsStorage.IGNORE_ACTIVE_TABS + ); + return ( + tgs.isCurrentFocusedTab(tab) || (dontSuspendActiveTabs && tab.active) + ); + }, + + // Note: Normal tabs may be in a discarded state + isNormalTab: function(tab, excludeDiscarded) { + excludeDiscarded = excludeDiscarded || false; + return ( + !gsUtils.isSpecialTab(tab) && + !gsUtils.isSuspendedTab(tab, true) && + (!excludeDiscarded || !gsUtils.isDiscardedTab(tab)) + ); + }, + + isSuspendedTab: function(tab, looseMatching) { + const url = tab.url || tab.pendingUrl; + return gsUtils.isSuspendedUrl(url, looseMatching); + }, + + isSuspendedUrl: function(url, looseMatching) { + if (!url) { + return false; + } else if (looseMatching) { + return url.indexOf('suspended.html') > 0; + } else { + return url.indexOf(chrome.extension.getURL('suspended.html')) === 0; + } + }, + + shouldSuspendDiscardedTabs: function() { + var suspendInPlaceOfDiscard = gsStorage.getOption( + gsStorage.SUSPEND_IN_PLACE_OF_DISCARD + ); + var discardInPlaceOfSuspend = gsStorage.getOption( + gsStorage.DISCARD_IN_PLACE_OF_SUSPEND + ); + return suspendInPlaceOfDiscard && !discardInPlaceOfSuspend; + }, + + removeTabsByUrlAsPromised: function(url) { + return new Promise(async resolve => { + const tabs = await gsChrome.tabsQuery({ url }); + chrome.tabs.remove(tabs.map(o => o.id), () => { + resolve(); + }); + }); + }, + + createTabAndWaitForFinishLoading: function(url, maxWaitTimeInMs) { + return new Promise(async resolve => { + let tab = await gsChrome.tabsCreate(url); + maxWaitTimeInMs = maxWaitTimeInMs || 1000; + const retryUntil = Date.now() + maxWaitTimeInMs; + let loaded = false; + while (!loaded && Date.now() < retryUntil) { + tab = await gsChrome.tabsGet(tab.id); + loaded = tab.status === 'complete'; + if (!loaded) { + await gsUtils.setTimeout(200); + } + } + resolve(tab); + }); + }, + + createWindowAndWaitForFinishLoading: function(createData, maxWaitTimeInMs) { + return new Promise(async resolve => { + let window = await gsChrome.windowsCreate(createData); + maxWaitTimeInMs = maxWaitTimeInMs || 1000; + const retryUntil = Date.now() + maxWaitTimeInMs; + let loaded = false; + while (!loaded && Date.now() < retryUntil) { + window = await gsChrome.windowsGet(window.id); + loaded = window.tabs.length > 0 && window.tabs[0].status === 'complete'; + if (!loaded) { + await gsUtils.setTimeout(200); + } + } + resolve(window); + }); + }, + + checkWhiteList: function(url) { + return gsUtils.checkSpecificWhiteList( + url, + gsStorage.getOption(gsStorage.WHITELIST) + ); + }, + + checkSpecificWhiteList: function(url, whitelistString) { + var whitelistItems = whitelistString + ? whitelistString.split(/[\s\n]+/) + : [], + whitelisted; + + whitelisted = whitelistItems.some(function(item) { + return gsUtils.testForMatch(item, url); + }, this); + return whitelisted; + }, + + removeFromWhitelist: function(url) { + var oldWhitelistString = gsStorage.getOption(gsStorage.WHITELIST) || '', + whitelistItems = oldWhitelistString.split(/[\s\n]+/).sort(), + i; + + for (i = whitelistItems.length - 1; i >= 0; i--) { + if (gsUtils.testForMatch(whitelistItems[i], url)) { + whitelistItems.splice(i, 1); + } + } + var whitelistString = whitelistItems.join('\n'); + gsStorage.setOptionAndSync(gsStorage.WHITELIST, whitelistString); + + var key = gsStorage.WHITELIST; + gsUtils.performPostSaveUpdates( + [key], + { [key]: oldWhitelistString }, + { [key]: whitelistString } + ); + }, + + testForMatch: function(whitelistItem, word) { + if (whitelistItem.length < 1) { + return false; + + //test for regex ( must be of the form /foobar/ ) + } else if ( + whitelistItem.length > 2 && + whitelistItem.indexOf('/') === 0 && + whitelistItem.indexOf('/', whitelistItem.length - 1) !== -1 + ) { + whitelistItem = whitelistItem.substring(1, whitelistItem.length - 1); + try { + new RegExp(whitelistItem); // eslint-disable-line no-new + } catch (e) { + return false; + } + return new RegExp(whitelistItem).test(word); + + // test as substring + } else { + return word.indexOf(whitelistItem) >= 0; + } + }, + + saveToWhitelist: function(newString) { + var oldWhitelistString = gsStorage.getOption(gsStorage.WHITELIST) || ''; + var newWhitelistString = oldWhitelistString + '\n' + newString; + newWhitelistString = gsUtils.cleanupWhitelist(newWhitelistString); + gsStorage.setOptionAndSync(gsStorage.WHITELIST, newWhitelistString); + + var key = gsStorage.WHITELIST; + gsUtils.performPostSaveUpdates( + [key], + { [key]: oldWhitelistString }, + { [key]: newWhitelistString } + ); + }, + + cleanupWhitelist: function(whitelist) { + var whitelistItems = whitelist ? whitelist.split(/[\s\n]+/).sort() : '', + i, + j; + + for (i = whitelistItems.length - 1; i >= 0; i--) { + j = whitelistItems.lastIndexOf(whitelistItems[i]); + if (j !== i) { + whitelistItems.splice(i + 1, j - i); + } + if (!whitelistItems[i] || whitelistItems[i] === '') { + whitelistItems.splice(i, 1); + } + } + if (whitelistItems.length) { + return whitelistItems.join('\n'); + } else { + return whitelistItems; + } + }, + + documentReadyAsPromsied: function(doc) { + return new Promise(function(resolve) { + if (doc.readyState !== 'loading') { + resolve(); + } else { + doc.addEventListener('DOMContentLoaded', function() { + resolve(); + }); + } + }); + }, + + localiseHtml: function(parentEl) { + var replaceTagFunc = function(match, p1) { + return p1 ? chrome.i18n.getMessage(p1) : ''; + }; + for (let el of parentEl.getElementsByTagName('*')) { + if (el.hasAttribute('data-i18n')) { + el.innerHTML = el + .getAttribute('data-i18n') + .replace(/__MSG_(\w+)__/g, replaceTagFunc) + .replace(/\n/g, '
'); + } + if (el.hasAttribute('data-i18n-tooltip')) { + el.setAttribute( + 'data-i18n-tooltip', + el + .getAttribute('data-i18n-tooltip') + .replace(/__MSG_(\w+)__/g, replaceTagFunc) + ); + } + } + }, + + documentReadyAndLocalisedAsPromsied: async function(doc) { + await gsUtils.documentReadyAsPromsied(doc); + gsUtils.localiseHtml(doc); + if (doc.body && doc.body.hidden) { + doc.body.hidden = false; + } + }, + + generateSuspendedUrl: function(url, title, scrollPos) { + let encodedTitle = gsUtils.encodeString(title); + var args = + '#' + + 'ttl=' + + encodedTitle + + '&' + + 'pos=' + + (scrollPos || '0') + + '&' + + 'uri=' + + url; + + return chrome.extension.getURL('suspended.html' + args); + }, + + getRootUrl: function(url, includePath, includeScheme) { + let rootUrlStr = url; + let scheme; + + // temporarily remove scheme + if (rootUrlStr.indexOf('//') > 0) { + scheme = rootUrlStr.substring(0, rootUrlStr.indexOf('//') + 2); + rootUrlStr = rootUrlStr.substring(rootUrlStr.indexOf('//') + 2); + } + + // remove path + if (!includePath) { + if (scheme === 'file://') { + rootUrlStr = rootUrlStr.replace(new RegExp('/[^/]*$', 'g'), ''); + } else { + const pathStartIndex = + rootUrlStr.indexOf('/') > 0 + ? rootUrlStr.indexOf('/') + : rootUrlStr.length; + rootUrlStr = rootUrlStr.substring(0, pathStartIndex); + } + } else { + // remove query string + var match = rootUrlStr.match(/\/?[?#]+/); + if (match) { + rootUrlStr = rootUrlStr.substring(0, match.index); + } + // remove trailing slash + match = rootUrlStr.match(/\/$/); + if (match) { + rootUrlStr = rootUrlStr.substring(0, match.index); + } + } + + // readd scheme + if (scheme && includeScheme) { + rootUrlStr = scheme + rootUrlStr; + } + return rootUrlStr; + }, + + getHashVariable: function(key, urlStr) { + var valuesByKey = {}, + keyPairRegEx = /^(.+)=(.+)/, + hashStr; + + if (!urlStr || urlStr.length === 0 || urlStr.indexOf('#') === -1) { + return false; + } + + //extract hash component from url + hashStr = urlStr.replace(/^[^#]+#+(.*)/, '$1'); + + if (hashStr.length === 0) { + return false; + } + + //handle possible unencoded final var called 'uri' + let uriIndex = hashStr.indexOf('uri='); + if (uriIndex >= 0) { + valuesByKey.uri = hashStr.substr(uriIndex + 4); + hashStr = hashStr.substr(0, uriIndex); + } + + hashStr.split('&').forEach(function(keyPair) { + if (keyPair && keyPair.match(keyPairRegEx)) { + valuesByKey[keyPair.replace(keyPairRegEx, '$1')] = keyPair.replace( + keyPairRegEx, + '$2' + ); + } + }); + return valuesByKey[key] || false; + }, + getSuspendedTitle: function(urlStr) { + return gsUtils.decodeString(gsUtils.getHashVariable('ttl', urlStr) || ''); + }, + getSuspendedScrollPosition: function(urlStr) { + return gsUtils.decodeString(gsUtils.getHashVariable('pos', urlStr) || ''); + }, + getOriginalUrl: function(urlStr) { + return ( + gsUtils.getHashVariable('uri', urlStr) || + gsUtils.decodeString(gsUtils.getHashVariable('url', urlStr) || '') + ); + }, + getCleanTabTitle: function(tab) { + let cleanedTitle = gsUtils.decodeString(tab.title); + if ( + !cleanedTitle || + cleanedTitle === '' || + cleanedTitle === gsUtils.decodeString(tab.url) || + cleanedTitle === 'Suspended Tab' + ) { + if (gsUtils.isSuspendedTab(tab)) { + cleanedTitle = + gsUtils.getSuspendedTitle(tab.url) || gsUtils.getOriginalUrl(tab.url); + } else { + cleanedTitle = tab.url; + } + } + return cleanedTitle; + }, + decodeString: function(string) { + try { + return decodeURIComponent(string); + } catch (e) { + return string; + } + }, + encodeString: function(string) { + try { + return encodeURIComponent(string); + } catch (e) { + return string; + } + }, + + formatHotkeyString: function(hotkeyString) { + return hotkeyString + .replace(/Command/, '⌘') + .replace(/[⌘\u2318]/, ' ⌘ ') + .replace(/[⇧\u21E7]/, ' Shift ') + .replace(/[⌃\u8963]/, ' Ctrl ') + .replace(/[⌥\u8997]/, ' Option ') + .replace(/\+/g, ' ') + .replace(/ +/g, ' ') + .trim() + .replace(/[ ]/g, ' \u00B7 '); + }, + + getSuspendedTabCount: async function() { + const currentTabs = await gsChrome.tabsQuery(); + const currentSuspendedTabs = currentTabs.filter(tab => + gsUtils.isSuspendedTab(tab) + ); + return currentSuspendedTabs.length; + }, + + htmlEncode: function(text) { + return document + .createElement('pre') + .appendChild(document.createTextNode(text)).parentNode.innerHTML; + }, + + getChromeVersion: function() { + var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); + return raw ? parseInt(raw[2], 10) : false; + }, + + generateHashCode: function(text) { + var hash = 0, + i, + chr, + len; + if (!text) return hash; + for (i = 0, len = text.length; i < len; i++) { + chr = text.charCodeAt(i); + hash = (hash << 5) - hash + chr; + hash |= 0; // Convert to 32bit integer + } + return Math.abs(hash); + }, + + getAllExpiredTabs: function(callback) { + var expiredTabs = []; + chrome.tabs.query({}, tabs => { + for (const tab of tabs) { + const timerDetails = tgs.getTabStatePropForTabId( + tab.id, + tgs.STATE_TIMER_DETAILS + ); + if ( + timerDetails && + timerDetails.suspendDateTime && + new Date(timerDetails.suspendDateTime) < new Date() + ) { + expiredTabs.push(tab); + } + } + callback(expiredTabs); + }); + }, + + performPostSaveUpdates: function( + changedSettingKeys, + oldValueBySettingKey, + newValueBySettingKey + ) { + chrome.tabs.query({}, function(tabs) { + tabs.forEach(function(tab) { + if (gsUtils.isSpecialTab(tab)) { + return; + } + + if (gsUtils.isSuspendedTab(tab)) { + //If toggling IGNORE_PINNED or IGNORE_ACTIVE_TABS to TRUE, then unsuspend any suspended pinned/active tabs + if ( + (changedSettingKeys.includes(gsStorage.IGNORE_PINNED) && + gsUtils.isProtectedPinnedTab(tab)) || + (changedSettingKeys.includes(gsStorage.IGNORE_ACTIVE_TABS) && + gsUtils.isProtectedActiveTab(tab)) + ) { + tgs.unsuspendTab(tab); + return; + } + + //if theme or screenshot preferences have changed then refresh suspended tabs + const updateTheme = changedSettingKeys.includes(gsStorage.THEME); + const updatePreviewMode = changedSettingKeys.includes( + gsStorage.SCREEN_CAPTURE + ); + if (updateTheme || updatePreviewMode) { + const suspendedView = tgs.getInternalViewByTabId(tab.id); + if (suspendedView) { + if (updateTheme) { + const theme = gsStorage.getOption(gsStorage.THEME); + gsFavicon.getFaviconMetaData(tab).then(faviconMeta => { + const isLowContrastFavicon = faviconMeta.isDark || false; + gsSuspendedTab.updateTheme( + suspendedView, + tab, + theme, + isLowContrastFavicon + ); + }); + } + if (updatePreviewMode) { + const previewMode = gsStorage.getOption( + gsStorage.SCREEN_CAPTURE + ); + gsSuspendedTab.updatePreviewMode( + suspendedView, + tab, + previewMode + ); // async. unhandled promise. + } + } + } + + //if discardAfterSuspend has changed then updated discarded tabs + const updateDiscardAfterSuspend = changedSettingKeys.includes( + gsStorage.DISCARD_AFTER_SUSPEND + ); + if ( + updateDiscardAfterSuspend && + gsStorage.getOption(gsStorage.DISCARD_AFTER_SUSPEND) && + gsUtils.isSuspendedTab(tab) && + !gsUtils.isDiscardedTab(tab) + ) { + gsTabDiscardManager.queueTabForDiscard(tab); + } + return; + } + + if (!gsUtils.isNormalTab(tab, true)) { + return; + } + + //update content scripts of normal tabs + const updateIgnoreForms = changedSettingKeys.includes( + gsStorage.IGNORE_FORMS + ); + if (updateIgnoreForms) { + gsMessages.sendUpdateToContentScriptOfTab(tab); //async. unhandled error + } + + //update suspend timers + const updateSuspendTime = + changedSettingKeys.includes(gsStorage.SUSPEND_TIME) || + (changedSettingKeys.includes(gsStorage.IGNORE_ACTIVE_TABS) && + tab.active) || + (changedSettingKeys.includes(gsStorage.IGNORE_PINNED) && + !gsStorage.getOption(gsStorage.IGNORE_PINNED) && + tab.pinned) || + (changedSettingKeys.includes(gsStorage.IGNORE_AUDIO) && + !gsStorage.getOption(gsStorage.IGNORE_AUDIO) && + tab.audible) || + (changedSettingKeys.includes(gsStorage.IGNORE_WHEN_OFFLINE) && + !gsStorage.getOption(gsStorage.IGNORE_WHEN_OFFLINE) && + !navigator.onLine) || + (changedSettingKeys.includes(gsStorage.IGNORE_WHEN_CHARGING) && + !gsStorage.getOption(gsStorage.IGNORE_WHEN_CHARGING) && + tgs.isCharging()) || + (changedSettingKeys.includes(gsStorage.WHITELIST) && + (gsUtils.checkSpecificWhiteList( + tab.url, + oldValueBySettingKey[gsStorage.WHITELIST] + ) && + !gsUtils.checkSpecificWhiteList( + tab.url, + newValueBySettingKey[gsStorage.WHITELIST] + ))); + if (updateSuspendTime) { + tgs.resetAutoSuspendTimerForTab(tab); + } + + //if SuspendInPlaceOfDiscard has changed then updated discarded tabs + const updateSuspendInPlaceOfDiscard = changedSettingKeys.includes( + gsStorage.SUSPEND_IN_PLACE_OF_DISCARD + ); + if (updateSuspendInPlaceOfDiscard && gsUtils.isDiscardedTab(tab)) { + gsTabDiscardManager.handleDiscardedUnsuspendedTab(tab); //async. unhandled promise. + //note: this may cause the tab to suspend + } + + //if we aren't resetting the timer on this tab, then check to make sure it does not have an expired timer + //should always be caught by tests above, but we'll check all tabs anyway just in case + // if (!updateSuspendTime) { + // gsMessages.sendRequestInfoToContentScript(tab.id, function (err, tabInfo) { // unhandled error + // tgs.calculateTabStatus(tab, tabInfo, function (tabStatus) { + // if (tabStatus === STATUS_NORMAL && tabInfo && tabInfo.timerUp && (new Date(tabInfo.timerUp)) < new Date()) { + // gsUtils.error(tab.id, 'Tab has an expired timer!', tabInfo); + // gsMessages.sendUpdateToContentScriptOfTab(tab, true, false); // async. unhandled error + // } + // }); + // }); + // } + }); + }); + + //if context menu has been disabled then remove from chrome + if (gsUtils.contains(changedSettingKeys, gsStorage.ADD_CONTEXT)) { + var addContextMenu = gsStorage.getOption(gsStorage.ADD_CONTEXT); + tgs.buildContextMenu(addContextMenu); + } + + //if screenshot preferences have changed then update the queue parameters + if ( + gsUtils.contains(changedSettingKeys, gsStorage.SCREEN_CAPTURE) || + gsUtils.contains(changedSettingKeys, gsStorage.SCREEN_CAPTURE_FORCE) + ) { + gsTabSuspendManager.initAsPromised(); //async. unhandled promise + } + }, + + getWindowFromSession: function(windowId, session) { + var window = false; + session.windows.some(function(curWindow) { + //leave this as a loose matching as sometimes it is comparing strings. other times ints + if (curWindow.id == windowId) { + // eslint-disable-line eqeqeq + window = curWindow; + return true; + } + }); + return window; + }, + + removeInternalUrlsFromSession: function(session) { + if (!session || !session.windows) { + return; + } + for (var i = session.windows.length - 1; i >= 0; i--) { + var curWindow = session.windows[i]; + for (var j = curWindow.tabs.length - 1; j >= 0; j--) { + var curTab = curWindow.tabs[j]; + if (gsUtils.isInternalTab(curTab)) { + curWindow.tabs.splice(j, 1); + } + } + if (curWindow.tabs.length === 0) { + session.windows.splice(i, 1); + } + } + }, + + getSimpleDate: function(date) { + var d = new Date(date); + return ( + ('0' + d.getDate()).slice(-2) + + '-' + + ('0' + (d.getMonth() + 1)).slice(-2) + + '-' + + d.getFullYear() + + ' ' + + ('0' + d.getHours()).slice(-2) + + ':' + + ('0' + d.getMinutes()).slice(-2) + ); + }, + + getHumanDate: function(date) { + var monthNames = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ], + d = new Date(date), + currentDate = d.getDate(), + currentMonth = d.getMonth(), + currentYear = d.getFullYear(), + currentHours = d.getHours(), + currentMinutes = d.getMinutes(); + + // var suffix; + // if (currentDate === 1 || currentDate === 21 || currentDate === 31) { + // suffix = 'st'; + // } else if (currentDate === 2 || currentDate === 22) { + // suffix = 'nd'; + // } else if (currentDate === 3 || currentDate === 23) { + // suffix = 'rd'; + // } else { + // suffix = 'th'; + // } + + var ampm = currentHours >= 12 ? 'pm' : 'am'; + var hoursString = currentHours % 12 || 12; + var minutesString = ('0' + currentMinutes).slice(-2); + + return ( + currentDate + + ' ' + + monthNames[currentMonth] + + ' ' + + currentYear + + ' ' + + hoursString + + ':' + + minutesString + + ampm + ); + }, + + debounce: function(func, wait) { + var timeout; + return function() { + var context = this, + args = arguments; + var later = function() { + timeout = null; + func.apply(context, args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + }, + + setTimeout: async function(timeout) { + return new Promise(resolve => { + window.setTimeout(resolve, timeout); + }); + }, + + executeWithRetries: async function( + promiseFn, + fnArgsArray, + maxRetries, + retryWaitTime + ) { + const retryFn = async retries => { + try { + return await promiseFn(...fnArgsArray); + } catch (e) { + if (retries >= maxRetries) { + gsUtils.warning('gsUtils', 'Max retries exceeded'); + return Promise.reject(e); + } + retries += 1; + await gsUtils.setTimeout(retryWaitTime); + return await retryFn(retries); + } + }; + const result = await retryFn(0); + return result; + }, +}; diff --git a/src/js/bck/history.js b/src/js/bck/history.js new file mode 100644 index 00000000..23c7e361 --- /dev/null +++ b/src/js/bck/history.js @@ -0,0 +1,262 @@ +/*global chrome, historyItems, historyUtils, gsAnalytics, gsSession, gsIndexedDb, gsUtils */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + async function reloadTabs(sessionId, windowId, openTabsAsSuspended) { + const session = await gsIndexedDb.fetchSessionBySessionId(sessionId); + if (!session || !session.windows) { + return; + } + + gsUtils.removeInternalUrlsFromSession(session); + + //if loading a specific window + let sessionWindows = []; + if (windowId) { + sessionWindows.push(gsUtils.getWindowFromSession(windowId, session)); + //else load all windows from session + } else { + sessionWindows = session.windows; + } + + for (let sessionWindow of sessionWindows) { + const suspendMode = openTabsAsSuspended ? 1 : 2; + await gsSession.restoreSessionWindow(sessionWindow, null, suspendMode); + } + } + + function deleteSession(sessionId) { + var result = window.confirm( + chrome.i18n.getMessage('js_history_confirm_delete') + ); + if (result) { + gsIndexedDb.removeSessionFromHistory(sessionId).then(function() { + window.location.reload(); + }); + } + } + + function removeTab(element, sessionId, windowId, tabId) { + var sessionEl, newSessionEl; + + gsIndexedDb + .removeTabFromSessionHistory(sessionId, windowId, tabId) + .then(function(session) { + gsUtils.removeInternalUrlsFromSession(session); + //if we have a valid session returned + if (session) { + sessionEl = element.parentElement.parentElement; + newSessionEl = createSessionElement(session); + sessionEl.parentElement.replaceChild(newSessionEl, sessionEl); + toggleSession(newSessionEl, session.sessionId); //async. unhandled promise + + //otherwise assume it was the last tab in session and session has been removed + } else { + window.location.reload(); + } + }); + } + + async function toggleSession(element, sessionId) { + var sessionContentsEl = element.getElementsByClassName( + 'sessionContents' + )[0]; + var sessionIcon = element.getElementsByClassName('sessionIcon')[0]; + if (sessionIcon.classList.contains('icon-plus-squared-alt')) { + sessionIcon.classList.remove('icon-plus-squared-alt'); + sessionIcon.classList.add('icon-minus-squared-alt'); + } else { + sessionIcon.classList.remove('icon-minus-squared-alt'); + sessionIcon.classList.add('icon-plus-squared-alt'); + } + + //if toggled on already, then toggle off + if (sessionContentsEl.childElementCount > 0) { + sessionContentsEl.innerHTML = ''; + return; + } + + gsIndexedDb + .fetchSessionBySessionId(sessionId) + .then(async function(curSession) { + if (!curSession || !curSession.windows) { + return; + } + gsUtils.removeInternalUrlsFromSession(curSession); + + for (const [i, curWindow] of curSession.windows.entries()) { + curWindow.sessionId = curSession.sessionId; + sessionContentsEl.appendChild( + createWindowElement(curSession, curWindow, i) + ); + + const tabPromises = []; + for (const curTab of curWindow.tabs) { + curTab.windowId = curWindow.id; + curTab.sessionId = curSession.sessionId; + curTab.title = gsUtils.getCleanTabTitle(curTab); + if (gsUtils.isSuspendedTab(curTab)) { + curTab.url = gsUtils.getOriginalUrl(curTab.url); + } + tabPromises.push(createTabElement(curSession, curWindow, curTab)); + } + const tabEls = await Promise.all(tabPromises); + for (const tabEl of tabEls) { + sessionContentsEl.appendChild(tabEl); + } + } + }); + } + + function addClickListenerToElement(element, func) { + if (element) { + element.onclick = func; + } + } + + function createSessionElement(session) { + var sessionEl = historyItems.createSessionHtml(session, true); + + addClickListenerToElement( + sessionEl.getElementsByClassName('sessionIcon')[0], + function() { + toggleSession(sessionEl, session.sessionId); //async. unhandled promise + } + ); + addClickListenerToElement( + sessionEl.getElementsByClassName('sessionLink')[0], + function() { + toggleSession(sessionEl, session.sessionId); //async. unhandled promise + } + ); + addClickListenerToElement( + sessionEl.getElementsByClassName('exportLink')[0], + function() { + historyUtils.exportSessionWithId(session.sessionId); + } + ); + addClickListenerToElement( + sessionEl.getElementsByClassName('resuspendLink')[0], + function() { + reloadTabs(session.sessionId, null, true); // async + } + ); + addClickListenerToElement( + sessionEl.getElementsByClassName('reloadLink')[0], + function() { + reloadTabs(session.sessionId, null, false); // async + } + ); + addClickListenerToElement( + sessionEl.getElementsByClassName('saveLink')[0], + function() { + historyUtils.saveSession(session.sessionId); + } + ); + addClickListenerToElement( + sessionEl.getElementsByClassName('deleteLink')[0], + function() { + deleteSession(session.sessionId); + } + ); + return sessionEl; + } + + function createWindowElement(session, window, index) { + var allowReload = session.sessionId !== gsSession.getSessionId(); + var windowEl = historyItems.createWindowHtml(window, index, allowReload); + + addClickListenerToElement( + windowEl.getElementsByClassName('resuspendLink')[0], + function() { + reloadTabs(session.sessionId, window.id, true); // async + } + ); + addClickListenerToElement( + windowEl.getElementsByClassName('reloadLink')[0], + function() { + reloadTabs(session.sessionId, window.id, false); // async + } + ); + return windowEl; + } + + async function createTabElement(session, window, tab) { + var allowDelete = session.sessionId !== gsSession.getSessionId(); + var tabEl = await historyItems.createTabHtml(tab, allowDelete); + + addClickListenerToElement( + tabEl.getElementsByClassName('removeLink')[0], + function() { + removeTab(tabEl, session.sessionId, window.id, tab.id); + } + ); + return tabEl; + } + + function render() { + var currentDiv = document.getElementById('currentSessions'), + sessionsDiv = document.getElementById('recoverySessions'), + historyDiv = document.getElementById('historySessions'), + importSessionEl = document.getElementById('importSession'), + importSessionActionEl = document.getElementById('importSessionAction'), + firstSession = true; + + currentDiv.innerHTML = ''; + sessionsDiv.innerHTML = ''; + historyDiv.innerHTML = ''; + + gsIndexedDb.fetchCurrentSessions().then(function(currentSessions) { + currentSessions.forEach(function(session, index) { + gsUtils.removeInternalUrlsFromSession(session); + var sessionEl = createSessionElement(session); + if (firstSession) { + currentDiv.appendChild(sessionEl); + firstSession = false; + } else { + sessionsDiv.appendChild(sessionEl); + } + }); + }); + + gsIndexedDb.fetchSavedSessions().then(function(savedSessions) { + savedSessions.forEach(function(session, index) { + gsUtils.removeInternalUrlsFromSession(session); + var sessionEl = createSessionElement(session); + historyDiv.appendChild(sessionEl); + }); + }); + + importSessionActionEl.addEventListener( + 'change', + historyUtils.importSession, + false + ); + importSessionEl.onclick = function() { + importSessionActionEl.click(); + }; + + //hide incompatible sidebar items if in incognito mode + if (chrome.extension.inIncognitoContext) { + Array.prototype.forEach.call( + document.getElementsByClassName('noIncognito'), + function(el) { + el.style.display = 'none'; + } + ); + } + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + render(); + }); + + gsAnalytics.reportPageView('history.html'); +})(this); diff --git a/src/js/bck/notice.js b/src/js/bck/notice.js new file mode 100644 index 00000000..7fdc8d5e --- /dev/null +++ b/src/js/bck/notice.js @@ -0,0 +1,29 @@ +/*global chrome, tgs, gsAnalytics, gsStorage, gsUtils */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + var notice = tgs.requestNotice(); + if ( + notice && + notice.hasOwnProperty('text') && + notice.hasOwnProperty('version') + ) { + var noticeContentEl = document.getElementById('gsNotice'); + noticeContentEl.innerHTML = notice.text; + //update local notice version + gsStorage.setNoticeVersion(notice.version); + } + + //clear notice (to prevent it showing again) + tgs.clearNotice(); + }); + gsAnalytics.reportPageView('notice.html'); +})(this); diff --git a/src/js/bck/options.js b/src/js/bck/options.js new file mode 100644 index 00000000..cb1171df --- /dev/null +++ b/src/js/bck/options.js @@ -0,0 +1,251 @@ +/*global chrome, gsAnalytics, gsStorage, gsChrome, gsUtils */ +(function(global) { + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + var elementPrefMap = { + preview: gsStorage.SCREEN_CAPTURE, + forceScreenCapture: gsStorage.SCREEN_CAPTURE_FORCE, + suspendInPlaceOfDiscard: gsStorage.SUSPEND_IN_PLACE_OF_DISCARD, + onlineCheck: gsStorage.IGNORE_WHEN_OFFLINE, + batteryCheck: gsStorage.IGNORE_WHEN_CHARGING, + unsuspendOnFocus: gsStorage.UNSUSPEND_ON_FOCUS, + discardAfterSuspend: gsStorage.DISCARD_AFTER_SUSPEND, + dontSuspendPinned: gsStorage.IGNORE_PINNED, + dontSuspendForms: gsStorage.IGNORE_FORMS, + dontSuspendAudio: gsStorage.IGNORE_AUDIO, + dontSuspendActiveTabs: gsStorage.IGNORE_ACTIVE_TABS, + ignoreCache: gsStorage.IGNORE_CACHE, + addContextMenu: gsStorage.ADD_CONTEXT, + syncSettings: gsStorage.SYNC_SETTINGS, + timeToSuspend: gsStorage.SUSPEND_TIME, + theme: gsStorage.THEME, + whitelist: gsStorage.WHITELIST, + }; + + function selectComboBox(element, key) { + var i, child; + + for (i = 0; i < element.children.length; i += 1) { + child = element.children[i]; + if (child.value === key) { + child.selected = 'true'; + break; + } + } + } + + //populate settings from synced storage + function initSettings() { + var optionEls = document.getElementsByClassName('option'), + pref, + element, + i; + + for (i = 0; i < optionEls.length; i++) { + element = optionEls[i]; + pref = elementPrefMap[element.id]; + populateOption(element, gsStorage.getOption(pref)); + } + + setForceScreenCaptureVisibility( + gsStorage.getOption(gsStorage.SCREEN_CAPTURE) !== '0' + ); + setAutoSuspendOptionsVisibility( + parseFloat(gsStorage.getOption(gsStorage.SUSPEND_TIME)) > 0 + ); + setSyncNoteVisibility(!gsStorage.getOption(gsStorage.SYNC_SETTINGS)); + + let searchParams = new URL(location.href).searchParams; + if (searchParams.has('firstTime')) { + document + .querySelector('.welcome-message') + .classList.remove('reallyHidden'); + document.querySelector('#options-heading').classList.add('reallyHidden'); + } + } + + function populateOption(element, value) { + if ( + element.tagName === 'INPUT' && + element.hasAttribute('type') && + element.getAttribute('type') === 'checkbox' + ) { + element.checked = value; + } else if (element.tagName === 'SELECT') { + selectComboBox(element, value); + } else if (element.tagName === 'TEXTAREA') { + element.value = value; + } + } + + function getOptionValue(element) { + if ( + element.tagName === 'INPUT' && + element.hasAttribute('type') && + element.getAttribute('type') === 'checkbox' + ) { + return element.checked; + } + if (element.tagName === 'SELECT') { + return element.children[element.selectedIndex].value; + } + if (element.tagName === 'TEXTAREA') { + return element.value; + } + } + + function setForceScreenCaptureVisibility(visible) { + if (visible) { + document.getElementById('forceScreenCaptureContainer').style.display = + 'block'; + } else { + document.getElementById('forceScreenCaptureContainer').style.display = + 'none'; + } + } + + function setSyncNoteVisibility(visible) { + if (visible) { + document.getElementById('syncNote').style.display = 'block'; + } else { + document.getElementById('syncNote').style.display = 'none'; + } + } + + function setAutoSuspendOptionsVisibility(visible) { + Array.prototype.forEach.call( + document.getElementsByClassName('autoSuspendOption'), + function(el) { + if (visible) { + el.style.display = 'block'; + } else { + el.style.display = 'none'; + } + } + ); + } + + function handleChange(element) { + return function() { + var pref = elementPrefMap[element.id], + interval; + + //add specific screen element listeners + if (pref === gsStorage.SCREEN_CAPTURE) { + setForceScreenCaptureVisibility(getOptionValue(element) !== '0'); + } else if (pref === gsStorage.SUSPEND_TIME) { + interval = getOptionValue(element); + setAutoSuspendOptionsVisibility(interval > 0); + } else if (pref === gsStorage.SYNC_SETTINGS) { + // we only really want to show this on load. not on toggle + if (getOptionValue(element)) { + setSyncNoteVisibility(false); + } + } + + var [oldValue, newValue] = saveChange(element); + if (oldValue !== newValue) { + var prefKey = elementPrefMap[element.id]; + gsUtils.performPostSaveUpdates( + [prefKey], + { [prefKey]: oldValue }, + { [prefKey]: newValue } + ); + } + }; + } + + function saveChange(element) { + var pref = elementPrefMap[element.id], + oldValue = gsStorage.getOption(pref), + newValue = getOptionValue(element); + + //clean up whitelist before saving + if (pref === gsStorage.WHITELIST) { + newValue = gsUtils.cleanupWhitelist(newValue); + } + + //save option + if (oldValue !== newValue) { + gsStorage.setOptionAndSync(elementPrefMap[element.id], newValue); + } + + return [oldValue, newValue]; + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + initSettings(); + + var optionEls = document.getElementsByClassName('option'), + element, + i; + + //add change listeners for all 'option' elements + for (i = 0; i < optionEls.length; i++) { + element = optionEls[i]; + if (element.tagName === 'TEXTAREA') { + element.addEventListener( + 'input', + gsUtils.debounce(handleChange(element), 200), + false + ); + } else { + element.onchange = handleChange(element); + } + } + + document.getElementById('testWhitelistBtn').onclick = async e => { + e.preventDefault(); + const tabs = await gsChrome.tabsQuery(); + const tabUrls = tabs + .map( + tab => + gsUtils.isSuspendedTab(tab) + ? gsUtils.getOriginalUrl(tab.url) + : tab.url + ) + .filter( + url => !gsUtils.isSuspendedUrl(url) && gsUtils.checkWhiteList(url) + ) + .map(url => (url.length > 55 ? url.substr(0, 52) + '...' : url)); + if (tabUrls.length === 0) { + alert(chrome.i18n.getMessage('js_options_whitelist_no_matches')); + return; + } + const firstUrls = tabUrls.splice(0, 22); + let alertString = `${chrome.i18n.getMessage( + 'js_options_whitelist_matches_heading' + )}\n${firstUrls.join('\n')}`; + + if (tabUrls.length > 0) { + alertString += `\n${chrome.i18n.getMessage( + 'js_options_whitelist_matches_overflow_prefix' + )} ${tabUrls.length} ${chrome.i18n.getMessage( + 'js_options_whitelist_matches_overflow_suffix' + )}`; + } + alert(alertString); + }; + + //hide incompatible sidebar items if in incognito mode + if (chrome.extension.inIncognitoContext) { + Array.prototype.forEach.call( + document.getElementsByClassName('noIncognito'), + function(el) { + el.style.display = 'none'; + } + ); + window.alert(chrome.i18n.getMessage('js_options_incognito_warning')); + } + }); + + global.exports = { + initSettings, + }; + gsAnalytics.reportPageView('options.html'); +})(this); diff --git a/src/js/bck/permissions.js b/src/js/bck/permissions.js new file mode 100644 index 00000000..1ffed56a --- /dev/null +++ b/src/js/bck/permissions.js @@ -0,0 +1,28 @@ +/*global chrome, historyUtils, gsSession, gsChrome, gsUtils, gsAnalytics */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + document.getElementById('exportBackupBtn').onclick = async function(e) { + const currentSession = await gsSession.buildCurrentSession(); + historyUtils.exportSession(currentSession, function() { + document.getElementById('exportBackupBtn').style.display = 'none'; + }); + }; + document.getElementById('setFilePermissiosnBtn').onclick = async function( + e + ) { + await gsChrome.tabsCreate({ + url: 'chrome://extensions?id=' + chrome.runtime.id, + }); + }; + }); + gsAnalytics.reportPageView('permissions.html'); +})(this); diff --git a/src/js/bck/recovery.js b/src/js/bck/recovery.js new file mode 100644 index 00000000..887ebad6 --- /dev/null +++ b/src/js/bck/recovery.js @@ -0,0 +1,175 @@ +/*global chrome, historyItems, gsAnalytics, gsMessages, gsSession, gsStorage, gsIndexedDb, gsChrome, gsUtils */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + var restoreAttempted = false; + var tabsToRecover = []; + + async function getRecoverableTabs(currentTabs) { + const lastSession = await gsIndexedDb.fetchLastSession(); + //check to see if they still exist in current session + if (lastSession) { + gsUtils.removeInternalUrlsFromSession(lastSession); + for (const window of lastSession.windows) { + for (const tabProperties of window.tabs) { + if (gsUtils.isSuspendedTab(tabProperties)) { + var originalUrl = gsUtils.getOriginalUrl(tabProperties.url); + // Ignore suspended tabs from previous session that exist unsuspended now + const originalTab = currentTabs.find(o => o.url === originalUrl); + if (!originalTab) { + tabProperties.windowId = window.id; + tabProperties.sessionId = lastSession.sessionId; + tabsToRecover.push(tabProperties); + } + } + } + } + return tabsToRecover; + } + } + + function removeTabFromList(tabToRemove) { + const recoveryTabsEl = document.getElementById('recoveryTabs'); + const childLinks = recoveryTabsEl.children; + + for (var i = 0; i < childLinks.length; i++) { + const element = childLinks[i]; + const url = tabToRemove.url || tabToRemove.pendingUrl; + const originalUrl = gsUtils.isSuspendedUrl(url) + ? gsUtils.getOriginalUrl(url) + : url; + + if ( + element.getAttribute('data-url') === originalUrl || + element.getAttribute('data-tabId') == tabToRemove.id + ) { + // eslint-disable-line eqeqeq + recoveryTabsEl.removeChild(element); + } + } + + //if removing the last element.. (re-get the element this function gets called asynchronously + if (document.getElementById('recoveryTabs').children.length === 0) { + //if we have already clicked the restore button then redirect to success page + if (restoreAttempted) { + document.getElementById('suspendy-guy-inprogress').style.display = + 'none'; + document.getElementById('recovery-inprogress').style.display = 'none'; + document.getElementById('suspendy-guy-complete').style.display = + 'inline-block'; + document.getElementById('recovery-complete').style.display = + 'inline-block'; + + //otherwise we have no tabs to recover so just hide references to recovery + } else { + hideRecoverySection(); + } + } + } + + function showTabSpinners() { + var recoveryTabsEl = document.getElementById('recoveryTabs'), + childLinks = recoveryTabsEl.children; + + for (var i = 0; i < childLinks.length; i++) { + var tabContainerEl = childLinks[i]; + tabContainerEl.removeChild(tabContainerEl.firstChild); + var spinnerEl = document.createElement('span'); + spinnerEl.classList.add('faviconSpinner'); + tabContainerEl.insertBefore(spinnerEl, tabContainerEl.firstChild); + } + } + + function hideRecoverySection() { + var recoverySectionEls = document.getElementsByClassName('recoverySection'); + for (var i = 0; i < recoverySectionEls.length; i++) { + recoverySectionEls[i].style.display = 'none'; + } + document.getElementById('restoreSession').style.display = 'none'; + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(async function() { + var restoreEl = document.getElementById('restoreSession'), + manageEl = document.getElementById('manageManuallyLink'), + previewsEl = document.getElementById('previewsOffBtn'), + recoveryEl = document.getElementById('recoveryTabs'), + warningEl = document.getElementById('screenCaptureNotice'), + tabEl; + + manageEl.onclick = function(e) { + e.preventDefault(); + chrome.tabs.create({ url: chrome.extension.getURL('history.html') }); + }; + + if (previewsEl) { + previewsEl.onclick = function(e) { + gsStorage.setOptionAndSync(gsStorage.SCREEN_CAPTURE, '0'); + window.location.reload(); + }; + + //show warning if screen capturing turned on + if (gsStorage.getOption(gsStorage.SCREEN_CAPTURE) !== '0') { + warningEl.style.display = 'block'; + } + } + + var performRestore = async function() { + restoreAttempted = true; + restoreEl.className += ' btnDisabled'; + restoreEl.removeEventListener('click', performRestore); + showTabSpinners(); + while (gsSession.isInitialising()) { + await gsUtils.setTimeout(200); + } + await gsSession.recoverLostTabs(); + }; + + restoreEl.addEventListener('click', performRestore); + + const currentTabs = await gsChrome.tabsQuery(); + const tabsToRecover = await getRecoverableTabs(currentTabs); + if (tabsToRecover.length === 0) { + hideRecoverySection(); + return; + } + + for (var tabToRecover of tabsToRecover) { + tabToRecover.title = gsUtils.getCleanTabTitle(tabToRecover); + tabToRecover.url = gsUtils.getOriginalUrl(tabToRecover.url); + tabEl = await historyItems.createTabHtml(tabToRecover, false); + tabEl.onclick = function() { + return function(e) { + e.preventDefault(); + chrome.tabs.create({ url: tabToRecover.url, active: false }); + removeTabFromList(tabToRecover); + }; + }; + recoveryEl.appendChild(tabEl); + } + + var currentSuspendedTabs = currentTabs.filter(o => + gsUtils.isSuspendedTab(o) + ); + for (const suspendedTab of currentSuspendedTabs) { + gsMessages.sendPingToTab(suspendedTab.id, function(error) { + if (error) { + gsUtils.warning(suspendedTab.id, 'Failed to sendPingToTab', error); + } else { + removeTabFromList(suspendedTab); + } + }); + } + }); + + global.exports = { + removeTabFromList, + }; + gsAnalytics.reportPageView('recovery.html'); +})(this); diff --git a/src/js/bck/restoring-window.js b/src/js/bck/restoring-window.js new file mode 100644 index 00000000..99b680e3 --- /dev/null +++ b/src/js/bck/restoring-window.js @@ -0,0 +1,16 @@ +/*global chrome, gsAnalytics, gsUtils */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + //do nothing + }); + gsAnalytics.reportPageView('restoring-window.html'); +})(this); diff --git a/src/js/bck/shortcuts.js b/src/js/bck/shortcuts.js new file mode 100644 index 00000000..ec989439 --- /dev/null +++ b/src/js/bck/shortcuts.js @@ -0,0 +1,49 @@ +/*global chrome, gsAnalytics, gsUtils */ +(function(global) { + 'use strict'; + + try { + chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); + } catch (e) { + window.setTimeout(() => window.location.reload(), 1000); + return; + } + + gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + var shortcutsEl = document.getElementById('keyboardShortcuts'); + var configureShortcutsEl = document.getElementById('configureShortcuts'); + + var notSetMessage = chrome.i18n.getMessage('js_shortcuts_not_set'); + var groupingKeys = [ + '2-toggle-temp-whitelist-tab', + '2b-unsuspend-selected-tabs', + '4-unsuspend-active-window', + ]; + + //populate keyboard shortcuts + chrome.commands.getAll(commands => { + commands.forEach(command => { + if (command.name !== '_execute_browser_action') { + const shortcut = + command.shortcut !== '' + ? gsUtils.formatHotkeyString(command.shortcut) + : '(' + notSetMessage + ')'; + var addMarginBottom = groupingKeys.includes(command.name); + shortcutsEl.innerHTML += `
${command.description}
+
${shortcut}
`; + } + }); + }); + + //listener for configureShortcuts + configureShortcutsEl.onclick = function(e) { + chrome.tabs.update({ url: 'chrome://extensions/shortcuts' }); + }; + }); + + gsAnalytics.reportPageView('shortcuts.html'); +})(this); diff --git a/src/js/broken.js b/src/js/broken.js index 6941e739..a600e3d1 100644 --- a/src/js/broken.js +++ b/src/js/broken.js @@ -1,4 +1,4 @@ -/*global chrome, gsAnalytics */ +/*global chrome */ (function(global) { 'use strict'; @@ -20,7 +20,6 @@ .addEventListener('click', function() { chrome.tabs.create({ url: chrome.extension.getURL('history.html') }); }); - gsAnalytics.reportPageView('broken.html'); } if (document.readyState !== 'loading') { init(); diff --git a/src/js/debug.js b/src/js/debug.js index 0e4b08ea..f421994e 100644 --- a/src/js/debug.js +++ b/src/js/debug.js @@ -1,4 +1,4 @@ -/*global chrome, tgs, gsAnalytics, gsUtils, gsFavicon, gsStorage, gsChrome */ +/*global chrome, tgs, gsUtils, gsFavicon, gsStorage, gsChrome */ (function(global) { 'use strict'; @@ -144,5 +144,4 @@ }); */ }); - gsAnalytics.reportPageView('debug.html'); })(this); diff --git a/src/js/gsCleanScreencaps.js b/src/js/gsCleanScreencaps.js deleted file mode 100644 index 606f9bc4..00000000 --- a/src/js/gsCleanScreencaps.js +++ /dev/null @@ -1,91 +0,0 @@ -var gsCleanScreencaps = { - // this will be filled with domain entries for O(1) lookups during screencaps - blacklist: {}, - - // listeners for request coming from a tab that is being suspended - listeners: {}, - - // load blacklist on initialization if option is enabled - initAsPromised: async ()=> - { - const useCleanScreencap = gsStorage.getOption( - gsStorage.ENABLE_CLEAN_SCREENCAPS - ); - - if (useCleanScreencap) { - await gsCleanScreencaps.loadList() - } - - return; - }, - - addListener: (tabId) => { - // remove a listener if there is already one present. That might not be the case, but the function checks for that case. - gsCleanScreencaps.removeListener(tabId); - - const listener = (details) => { - try { - const host = new URL(details.url).host - if (gsCleanScreencaps.blacklist[host]) { return { cancel: true }; } - } catch (err) { - gsUtils.log('background', 'error while trying to block in gsCleanScreencaps', err) - } - } - - chrome.webRequest.onBeforeRequest.addListener( - listener, - { urls: [""], types: ['image'], tabId: tabId }, - ["blocking"] - ); - - // place a callback that will remove the listener as soon as the suspension - // of the tab succeeded or failed - gsCleanScreencaps.listeners[tabId] = () => chrome.webRequest.onBeforeRequest.removeListener(listener) - }, - - // call the remove listener func and remove it from the hashmap - removeListener: (tabId) => { - let tmp; - if (tmp = gsCleanScreencaps.listeners[tabId]) { - delete gsCleanScreencaps[tabId]; - tmp(); - } - }, - - // do nothing but get the data out of the chrome.local.storage - storageData: () => { - return new Promise((res, _) => { - chrome.storage.local.get('gsCleanScreencapsBlacklist', (storage) => res(storage.gsCleanScreencapsBlacklist)) - }) - }, - - loadList: async () => { - const stored = await gsCleanScreencaps.storageData(); - // take the blocklist out of storage if it's not existent or newer than 30 days - if (!stored || stored.time + (3600 * 24 * 30) <= new Date().getTime()) { - const rex = /^0.0.0.0 (.*)(?:$|#)/ - let resp = await fetch('https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts').then(resp => resp.text()) - let m; - - try { - const blockedHosts = resp - .split(/\n/) - .reduce((res, e) => { - if (m = rex.exec(e)) { - res[m[1]] = true; - } - return res; - }, {}); - - gsCleanScreencaps.blacklist = blockedHosts; - chrome.storage.local.set({ gsCleanScreencapsBlacklist: { time: new Date().getTime(), blockedHosts } }) - return blockedHosts; - } catch (err) { - gsUtils.log('background', 'error while loading blocklist for clean screencapture:', err) - } - } else { - gsCleanScreencaps.blacklist = stored.blockedHosts; - return stored; - } - } -} \ No newline at end of file diff --git a/src/js/gsSession.js b/src/js/gsSession.js index 912295ae..e05cf34a 100644 --- a/src/js/gsSession.js +++ b/src/js/gsSession.js @@ -5,6 +5,7 @@ var gsSession = (function() { const tabsToRestorePerSecond = 12; + let updateUrl; let updatedUrl; let initialisationMode = true; @@ -20,6 +21,7 @@ var gsSession = (function() { let syncedSettingsOnInit; async function initAsPromised() { + updateUrl = chrome.extension.getURL('update.html'); updatedUrl = chrome.extension.getURL('updated.html'); // Set fileUrlsAccessAllowed to determine if extension can work on file:// URLs @@ -32,6 +34,7 @@ var gsSession = (function() { //remove any update screens await Promise.all([ + gsUtils.removeTabsByUrlAsPromised(updateUrl), gsUtils.removeTabsByUrlAsPromised(updatedUrl), ]); @@ -61,12 +64,14 @@ var gsSession = (function() { } const suspendedTabCount = await gsUtils.getSuspendedTabCount(); - if (suspendedTabCount === 0) { + if (!sessionRestorePoint || suspendedTabCount > 0) { + //show update screen + await gsChrome.tabsCreate(updateUrl); + //ensure we don't leave any windows with no unsuspended tabs + await unsuspendActiveTabInEachWindow(); + } else { // if there are no suspended tabs then simply install the update immediately chrome.runtime.reload(); - } else { - //do nothing. this prevents chrome from automatically updating and will instead wait - //until a browser restart to update } } @@ -299,6 +304,7 @@ var gsSession = (function() { } } + await gsUtils.removeTabsByUrlAsPromised(updateUrl); await gsUtils.removeTabsByUrlAsPromised(updatedUrl); await gsIndexedDb.performMigration(lastVersion); @@ -793,6 +799,21 @@ var gsSession = (function() { return sessionMetrics; } + async function unsuspendActiveTabInEachWindow() { + const activeTabs = await gsChrome.tabsQuery({ active: true }); + const suspendedActiveTabs = activeTabs.filter(tab => + gsUtils.isSuspendedTab(tab) + ); + if (suspendedActiveTabs.length === 0) { + return; + } + for (let suspendedActiveTab of suspendedActiveTabs) { + tgs.unsuspendTab(suspendedActiveTab); + } + await gsUtils.setTimeout(1000); + await unsuspendActiveTabInEachWindow(); + } + return { initAsPromised, runStartupChecks, @@ -813,5 +834,6 @@ var gsSession = (function() { prepareForUpdate, getUpdateType, updateSessionMetrics, + unsuspendActiveTabInEachWindow, }; })(); diff --git a/src/js/gsStorage.js b/src/js/gsStorage.js index 33812497..4037868e 100755 --- a/src/js/gsStorage.js +++ b/src/js/gsStorage.js @@ -1,10 +1,7 @@ -/*global chrome, gsAnalytics, gsSession, localStorage, gsUtils */ +/*global chrome, gsSession, localStorage, gsUtils */ 'use strict'; -// Used to keep track of which settings were defined in the managed storage -const managedOptions = []; // Example: ["gsTheme, gsWhitelist"] - -const gsStorageSettings = { +var gsStorage = { SCREEN_CAPTURE: 'screenCapture', SCREEN_CAPTURE_FORCE: 'screenCaptureForce', SUSPEND_IN_PLACE_OF_DISCARD: 'suspendInPlaceOfDiscard', @@ -26,12 +23,6 @@ const gsStorageSettings = { DISCARD_AFTER_SUSPEND: 'discardAfterSuspend', DISCARD_IN_PLACE_OF_SUSPEND: 'discardInPlaceOfSuspend', USE_ALT_SCREEN_CAPTURE_LIB: 'useAlternateScreenCaptureLib', - TRACKING_OPT_OUT: 'trackingOptOut', - ENABLE_CLEAN_SCREENCAPS: 'cleanScreencaps' -}; - -var gsStorage = { - ...gsStorageSettings, APP_VERSION: 'gsVersion', LAST_NOTICE: 'gsNotice', @@ -66,8 +57,6 @@ var gsStorage = { defaults[gsStorage.NO_NAG] = false; defaults[gsStorage.WHITELIST] = ''; defaults[gsStorage.THEME] = 'light'; - defaults[gsStorage.TRACKING_OPT_OUT] = false; - defaults[gsStorage.ENABLE_CLEAN_SCREENCAPS] = false; return defaults; }, @@ -175,40 +164,6 @@ var gsStorage = { }); }, - /** - * Checks the managed storage for settings and overrides the local storage - * Settings in managed storage are stored by key - * Settings in local storage are stored by name - * Example: in managed storage you will find "SYNC_SETTINGS": true. - * in local storage you will find "gsSyncSettings": true - * I did this because I think the key is easier to interpret for someone - * editing the managed storage manually. - */ - checkManagedStorageAndOverride() { - const settingsList = Object.keys(gsStorageSettings); - chrome.storage.managed.get(settingsList, result => { - const settings = gsStorage.getSettings(); - - Object.keys(result).forEach(key => { - if (key === 'WHITELIST') { - settings[gsStorage[key]] = result[key].replace(/[\s\n]+/g, '\n'); - } else { - settings[gsStorage[key]] = result[key]; - } - - // Mark option as managed - managedOptions.push(gsStorage[key]); - }); - - gsStorage.saveSettings(settings); - gsUtils.log( - 'gsStorage', - 'overrode settings with managed storage config:', - settings - ); - }); - }, - // Listen for changes to synced settings addSettingsSyncListener: function() { chrome.storage.onChanged.addListener(function(remoteSettings, namespace) { @@ -305,7 +260,6 @@ var gsStorage = { saveSettings: function(settings) { try { localStorage.setItem('gsSettings', JSON.stringify(settings)); - gsAnalytics.setUserDimensions(); } catch (e) { gsUtils.error( 'gsStorage', @@ -454,12 +408,4 @@ var gsStorage = { ); } }, - - /** - * Used by the options page to tell whether an option is set in managed storage - * and thus should not be changed. - * - * @param option The option name, such as "gsWhitelist" (not "WHITELIST") - */ - isOptionManaged: option => managedOptions.includes(option), }; diff --git a/src/js/gsTabSuspendManager.js b/src/js/gsTabSuspendManager.js index ed40b167..b912ccc3 100644 --- a/src/js/gsTabSuspendManager.js +++ b/src/js/gsTabSuspendManager.js @@ -212,9 +212,6 @@ var gsTabSuspendManager = (function() { } async function handlePreviewImageResponse(tab, previewUrl, errorMsg) { - // remove listener if there is any - gsCleanScreencaps.removeListener(tab.id); - const queuedTabDetails = getQueuedTabDetails(tab); if (!queuedTabDetails) { gsUtils.log( @@ -258,7 +255,6 @@ var gsTabSuspendManager = (function() { tab, queuedTabDetails.executionProps.suspendedUrl ); - queuedTabDetails.executionProps.resolveFn(success); } @@ -278,7 +274,8 @@ var gsTabSuspendManager = (function() { gsUtils.log( tab.id, QUEUE_ID, - `Tab took more than ${_suspensionQueue.getQueueProperties().jobTimeout + `Tab took more than ${ + _suspensionQueue.getQueueProperties().jobTimeout }ms to suspend. Will force suspension.` ); const success = await executeTabSuspension( @@ -496,9 +493,6 @@ var gsTabSuspendManager = (function() { const useAlternateScreenCaptureLib = gsStorage.getOption( gsStorage.USE_ALT_SCREEN_CAPTURE_LIB ); - const useCleanScreencap = gsStorage.getOption( - gsStorage.ENABLE_CLEAN_SCREENCAPS - ); const screenCaptureLib = useAlternateScreenCaptureLib ? 'js/dom-to-image.js' : 'js/html2canvas.min.js'; @@ -507,11 +501,6 @@ var gsTabSuspendManager = (function() { QUEUE_ID, `Injecting ${screenCaptureLib} into content script` ); - - if (useCleanScreencap) { - gsCleanScreencaps.addListener(tab.id) - } - gsMessages.executeScriptOnTab(tab.id, screenCaptureLib, error => { if (error) { handlePreviewImageResponse(tab, null, 'Failed to executeScriptOnTab'); //async. unhandled promise. @@ -571,16 +560,14 @@ var gsTabSuspendManager = (function() { if (useAlternateScreenCaptureLib) { // console.log('Generating via dom-to-image..'); generateCanvas = () => { - return domtoimage - .toCanvas(document.body, { width: width, height: height }) - .then(canvas => { - const croppedCanvas = document.createElement('canvas'); - const context = croppedCanvas.getContext('2d'); - croppedCanvas.width = width; - croppedCanvas.height = height; - context.drawImage(canvas, 0, 0); - return croppedCanvas; - }); + return domtoimage.toCanvas(document.body, {width: width, height: height}).then(canvas => { + const croppedCanvas = document.createElement('canvas'); + const context = croppedCanvas.getContext('2d'); + croppedCanvas.width = width; + croppedCanvas.height = height; + context.drawImage(canvas, 0, 0); + return croppedCanvas; + }); }; } else { // console.log('Generating via html2canvas..'); @@ -591,7 +578,6 @@ var gsTabSuspendManager = (function() { logging: false, imageTimeout: 10000, removeContainer: false, - foreignObjectRendering: true, async: true, }); }; @@ -659,4 +645,3 @@ var gsTabSuspendManager = (function() { getQueuedTabDetails, }; })(); - diff --git a/src/js/gsUtils.js b/src/js/gsUtils.js index 3b025b3a..344d0119 100644 --- a/src/js/gsUtils.js +++ b/src/js/gsUtils.js @@ -92,7 +92,6 @@ var gsUtils = { // const logString = errorObj.hasOwnProperty('stack') // ? errorObj.stack // : `${JSON.stringify(errorObj)}\n${gsUtils.getStackTrace()}`; - // gsAnalytics.reportException(logString, false); } }, // Puts all the error args into a single printable string so that all the info diff --git a/src/js/history.js b/src/js/history.js index 23c7e361..d02c7c9e 100644 --- a/src/js/history.js +++ b/src/js/history.js @@ -1,4 +1,4 @@ -/*global chrome, historyItems, historyUtils, gsAnalytics, gsSession, gsIndexedDb, gsUtils */ +/*global chrome, historyItems, historyUtils, gsSession, gsIndexedDb, gsUtils */ (function(global) { 'use strict'; @@ -258,5 +258,4 @@ render(); }); - gsAnalytics.reportPageView('history.html'); })(this); diff --git a/src/js/html2canvas.js b/src/js/html2canvas.js deleted file mode 100644 index 4d3d7487..00000000 --- a/src/js/html2canvas.js +++ /dev/null @@ -1,7274 +0,0 @@ -/*! - * html2canvas 1.0.0-alpha.12 - * Copyright (c) 2018 Niklas von Hertzen - * Released under MIT License - */ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["html2canvas"] = factory(); - else - root["html2canvas"] = factory(); -})(this, function() { - return /******/ (function(modules) { // webpackBootstrap - /******/ // The module cache - /******/ var installedModules = {}; - /******/ - /******/ // The require function - /******/ function __webpack_require__(moduleId) { - /******/ - /******/ // Check if module is in cache - /******/ if(installedModules[moduleId]) { - /******/ return installedModules[moduleId].exports; - /******/ } - /******/ // Create a new module (and put it into the cache) - /******/ var module = installedModules[moduleId] = { - /******/ i: moduleId, - /******/ l: false, - /******/ exports: {} - /******/ }; - /******/ - /******/ // Execute the module function - /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - /******/ - /******/ // Flag the module as loaded - /******/ module.l = true; - /******/ - /******/ // Return the exports of the module - /******/ return module.exports; - /******/ } - /******/ - /******/ - /******/ // expose the modules object (__webpack_modules__) - /******/ __webpack_require__.m = modules; - /******/ - /******/ // expose the module cache - /******/ __webpack_require__.c = installedModules; - /******/ - /******/ // define getter function for harmony exports - /******/ __webpack_require__.d = function(exports, name, getter) { - /******/ if(!__webpack_require__.o(exports, name)) { - /******/ Object.defineProperty(exports, name, { - /******/ configurable: false, - /******/ enumerable: true, - /******/ get: getter - /******/ }); - /******/ } - /******/ }; - /******/ - /******/ // getDefaultExport function for compatibility with non-harmony modules - /******/ __webpack_require__.n = function(module) { - /******/ var getter = module && module.__esModule ? - /******/ function getDefault() { return module['default']; } : - /******/ function getModuleExports() { return module; }; - /******/ __webpack_require__.d(getter, 'a', getter); - /******/ return getter; - /******/ }; - /******/ - /******/ // Object.prototype.hasOwnProperty.call - /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; - /******/ - /******/ // __webpack_public_path__ - /******/ __webpack_require__.p = ""; - /******/ - /******/ // Load entry module and return exports - /******/ return __webpack_require__(__webpack_require__.s = 27); - /******/ }) - /************************************************************************/ - /******/ ([ - /* 0 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - -// http://dev.w3.org/csswg/css-color/ - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var HEX3 = /^#([a-f0-9]{3})$/i; - var hex3 = function hex3(value) { - var match = value.match(HEX3); - if (match) { - return [parseInt(match[1][0] + match[1][0], 16), parseInt(match[1][1] + match[1][1], 16), parseInt(match[1][2] + match[1][2], 16), null]; - } - return false; - }; - - var HEX6 = /^#([a-f0-9]{6})$/i; - var hex6 = function hex6(value) { - var match = value.match(HEX6); - if (match) { - return [parseInt(match[1].substring(0, 2), 16), parseInt(match[1].substring(2, 4), 16), parseInt(match[1].substring(4, 6), 16), null]; - } - return false; - }; - - var RGB = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/; - var rgb = function rgb(value) { - var match = value.match(RGB); - if (match) { - return [Number(match[1]), Number(match[2]), Number(match[3]), null]; - } - return false; - }; - - var RGBA = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/; - var rgba = function rgba(value) { - var match = value.match(RGBA); - if (match && match.length > 4) { - return [Number(match[1]), Number(match[2]), Number(match[3]), Number(match[4])]; - } - return false; - }; - - var fromArray = function fromArray(array) { - return [Math.min(array[0], 255), Math.min(array[1], 255), Math.min(array[2], 255), array.length > 3 ? array[3] : null]; - }; - - var namedColor = function namedColor(name) { - var color = NAMED_COLORS[name.toLowerCase()]; - return color ? color : false; - }; - - var Color = function () { - function Color(value) { - _classCallCheck(this, Color); - - var _ref = Array.isArray(value) ? fromArray(value) : hex3(value) || rgb(value) || rgba(value) || namedColor(value) || hex6(value) || [0, 0, 0, null], - _ref2 = _slicedToArray(_ref, 4), - r = _ref2[0], - g = _ref2[1], - b = _ref2[2], - a = _ref2[3]; - - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } - - _createClass(Color, [{ - key: 'isTransparent', - value: function isTransparent() { - return this.a === 0; - } - }, { - key: 'toString', - value: function toString() { - return this.a !== null && this.a !== 1 ? 'rgba(' + this.r + ',' + this.g + ',' + this.b + ',' + this.a + ')' : 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')'; - } - }]); - - return Color; - }(); - - exports.default = Color; - - - var NAMED_COLORS = { - transparent: [0, 0, 0, 0], - aliceblue: [240, 248, 255, null], - antiquewhite: [250, 235, 215, null], - aqua: [0, 255, 255, null], - aquamarine: [127, 255, 212, null], - azure: [240, 255, 255, null], - beige: [245, 245, 220, null], - bisque: [255, 228, 196, null], - black: [0, 0, 0, null], - blanchedalmond: [255, 235, 205, null], - blue: [0, 0, 255, null], - blueviolet: [138, 43, 226, null], - brown: [165, 42, 42, null], - burlywood: [222, 184, 135, null], - cadetblue: [95, 158, 160, null], - chartreuse: [127, 255, 0, null], - chocolate: [210, 105, 30, null], - coral: [255, 127, 80, null], - cornflowerblue: [100, 149, 237, null], - cornsilk: [255, 248, 220, null], - crimson: [220, 20, 60, null], - cyan: [0, 255, 255, null], - darkblue: [0, 0, 139, null], - darkcyan: [0, 139, 139, null], - darkgoldenrod: [184, 134, 11, null], - darkgray: [169, 169, 169, null], - darkgreen: [0, 100, 0, null], - darkgrey: [169, 169, 169, null], - darkkhaki: [189, 183, 107, null], - darkmagenta: [139, 0, 139, null], - darkolivegreen: [85, 107, 47, null], - darkorange: [255, 140, 0, null], - darkorchid: [153, 50, 204, null], - darkred: [139, 0, 0, null], - darksalmon: [233, 150, 122, null], - darkseagreen: [143, 188, 143, null], - darkslateblue: [72, 61, 139, null], - darkslategray: [47, 79, 79, null], - darkslategrey: [47, 79, 79, null], - darkturquoise: [0, 206, 209, null], - darkviolet: [148, 0, 211, null], - deeppink: [255, 20, 147, null], - deepskyblue: [0, 191, 255, null], - dimgray: [105, 105, 105, null], - dimgrey: [105, 105, 105, null], - dodgerblue: [30, 144, 255, null], - firebrick: [178, 34, 34, null], - floralwhite: [255, 250, 240, null], - forestgreen: [34, 139, 34, null], - fuchsia: [255, 0, 255, null], - gainsboro: [220, 220, 220, null], - ghostwhite: [248, 248, 255, null], - gold: [255, 215, 0, null], - goldenrod: [218, 165, 32, null], - gray: [128, 128, 128, null], - green: [0, 128, 0, null], - greenyellow: [173, 255, 47, null], - grey: [128, 128, 128, null], - honeydew: [240, 255, 240, null], - hotpink: [255, 105, 180, null], - indianred: [205, 92, 92, null], - indigo: [75, 0, 130, null], - ivory: [255, 255, 240, null], - khaki: [240, 230, 140, null], - lavender: [230, 230, 250, null], - lavenderblush: [255, 240, 245, null], - lawngreen: [124, 252, 0, null], - lemonchiffon: [255, 250, 205, null], - lightblue: [173, 216, 230, null], - lightcoral: [240, 128, 128, null], - lightcyan: [224, 255, 255, null], - lightgoldenrodyellow: [250, 250, 210, null], - lightgray: [211, 211, 211, null], - lightgreen: [144, 238, 144, null], - lightgrey: [211, 211, 211, null], - lightpink: [255, 182, 193, null], - lightsalmon: [255, 160, 122, null], - lightseagreen: [32, 178, 170, null], - lightskyblue: [135, 206, 250, null], - lightslategray: [119, 136, 153, null], - lightslategrey: [119, 136, 153, null], - lightsteelblue: [176, 196, 222, null], - lightyellow: [255, 255, 224, null], - lime: [0, 255, 0, null], - limegreen: [50, 205, 50, null], - linen: [250, 240, 230, null], - magenta: [255, 0, 255, null], - maroon: [128, 0, 0, null], - mediumaquamarine: [102, 205, 170, null], - mediumblue: [0, 0, 205, null], - mediumorchid: [186, 85, 211, null], - mediumpurple: [147, 112, 219, null], - mediumseagreen: [60, 179, 113, null], - mediumslateblue: [123, 104, 238, null], - mediumspringgreen: [0, 250, 154, null], - mediumturquoise: [72, 209, 204, null], - mediumvioletred: [199, 21, 133, null], - midnightblue: [25, 25, 112, null], - mintcream: [245, 255, 250, null], - mistyrose: [255, 228, 225, null], - moccasin: [255, 228, 181, null], - navajowhite: [255, 222, 173, null], - navy: [0, 0, 128, null], - oldlace: [253, 245, 230, null], - olive: [128, 128, 0, null], - olivedrab: [107, 142, 35, null], - orange: [255, 165, 0, null], - orangered: [255, 69, 0, null], - orchid: [218, 112, 214, null], - palegoldenrod: [238, 232, 170, null], - palegreen: [152, 251, 152, null], - paleturquoise: [175, 238, 238, null], - palevioletred: [219, 112, 147, null], - papayawhip: [255, 239, 213, null], - peachpuff: [255, 218, 185, null], - peru: [205, 133, 63, null], - pink: [255, 192, 203, null], - plum: [221, 160, 221, null], - powderblue: [176, 224, 230, null], - purple: [128, 0, 128, null], - rebeccapurple: [102, 51, 153, null], - red: [255, 0, 0, null], - rosybrown: [188, 143, 143, null], - royalblue: [65, 105, 225, null], - saddlebrown: [139, 69, 19, null], - salmon: [250, 128, 114, null], - sandybrown: [244, 164, 96, null], - seagreen: [46, 139, 87, null], - seashell: [255, 245, 238, null], - sienna: [160, 82, 45, null], - silver: [192, 192, 192, null], - skyblue: [135, 206, 235, null], - slateblue: [106, 90, 205, null], - slategray: [112, 128, 144, null], - slategrey: [112, 128, 144, null], - snow: [255, 250, 250, null], - springgreen: [0, 255, 127, null], - steelblue: [70, 130, 180, null], - tan: [210, 180, 140, null], - teal: [0, 128, 128, null], - thistle: [216, 191, 216, null], - tomato: [255, 99, 71, null], - turquoise: [64, 224, 208, null], - violet: [238, 130, 238, null], - wheat: [245, 222, 179, null], - white: [255, 255, 255, null], - whitesmoke: [245, 245, 245, null], - yellow: [255, 255, 0, null], - yellowgreen: [154, 205, 50, null] - }; - - var TRANSPARENT = exports.TRANSPARENT = new Color([0, 0, 0, 0]); - - /***/ }), - /* 1 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.calculateLengthFromValueWithUnit = exports.LENGTH_TYPE = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var LENGTH_WITH_UNIT = /([\d.]+)(px|r?em|%)/i; - - var LENGTH_TYPE = exports.LENGTH_TYPE = { - PX: 0, - PERCENTAGE: 1 - }; - - var Length = function () { - function Length(value) { - _classCallCheck(this, Length); - - this.type = value.substr(value.length - 1) === '%' ? LENGTH_TYPE.PERCENTAGE : LENGTH_TYPE.PX; - var parsedValue = parseFloat(value); - if (true && isNaN(parsedValue)) { - console.error('Invalid value given for Length: "' + value + '"'); - } - this.value = isNaN(parsedValue) ? 0 : parsedValue; - } - - _createClass(Length, [{ - key: 'isPercentage', - value: function isPercentage() { - return this.type === LENGTH_TYPE.PERCENTAGE; - } - }, { - key: 'getAbsoluteValue', - value: function getAbsoluteValue(parentLength) { - return this.isPercentage() ? parentLength * (this.value / 100) : this.value; - } - }], [{ - key: 'create', - value: function create(v) { - return new Length(v); - } - }]); - - return Length; - }(); - - exports.default = Length; - - - var getRootFontSize = function getRootFontSize(container) { - var parent = container.parent; - return parent ? getRootFontSize(parent) : parseFloat(container.style.font.fontSize); - }; - - var calculateLengthFromValueWithUnit = exports.calculateLengthFromValueWithUnit = function calculateLengthFromValueWithUnit(container, value, unit) { - switch (unit) { - case 'px': - case '%': - return new Length(value + unit); - case 'em': - case 'rem': - var length = new Length(value); - length.value *= unit === 'em' ? parseFloat(container.style.font.fontSize) : getRootFontSize(container); - return length; - default: - // TODO: handle correctly if unknown unit is used - return new Length('0'); - } - }; - - /***/ }), - /* 2 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseBoundCurves = exports.calculatePaddingBoxPath = exports.calculateBorderBoxPath = exports.parsePathForBorder = exports.parseDocumentSize = exports.calculateContentBox = exports.calculatePaddingBox = exports.parseBounds = exports.Bounds = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Vector = __webpack_require__(7); - - var _Vector2 = _interopRequireDefault(_Vector); - - var _BezierCurve = __webpack_require__(32); - - var _BezierCurve2 = _interopRequireDefault(_BezierCurve); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var TOP = 0; - var RIGHT = 1; - var BOTTOM = 2; - var LEFT = 3; - - var H = 0; - var V = 1; - - var Bounds = exports.Bounds = function () { - function Bounds(x, y, w, h) { - _classCallCheck(this, Bounds); - - this.left = x; - this.top = y; - this.width = w; - this.height = h; - } - - _createClass(Bounds, null, [{ - key: 'fromClientRect', - value: function fromClientRect(clientRect, scrollX, scrollY) { - return new Bounds(clientRect.left + scrollX, clientRect.top + scrollY, clientRect.width, clientRect.height); - } - }]); - - return Bounds; - }(); - - var parseBounds = exports.parseBounds = function parseBounds(node, scrollX, scrollY) { - return Bounds.fromClientRect(node.getBoundingClientRect(), scrollX, scrollY); - }; - - var calculatePaddingBox = exports.calculatePaddingBox = function calculatePaddingBox(bounds, borders) { - return new Bounds(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth, bounds.width - (borders[RIGHT].borderWidth + borders[LEFT].borderWidth), bounds.height - (borders[TOP].borderWidth + borders[BOTTOM].borderWidth)); - }; - - var calculateContentBox = exports.calculateContentBox = function calculateContentBox(bounds, padding, borders) { - // TODO support percentage paddings - var paddingTop = padding[TOP].value; - var paddingRight = padding[RIGHT].value; - var paddingBottom = padding[BOTTOM].value; - var paddingLeft = padding[LEFT].value; - - return new Bounds(bounds.left + paddingLeft + borders[LEFT].borderWidth, bounds.top + paddingTop + borders[TOP].borderWidth, bounds.width - (borders[RIGHT].borderWidth + borders[LEFT].borderWidth + paddingLeft + paddingRight), bounds.height - (borders[TOP].borderWidth + borders[BOTTOM].borderWidth + paddingTop + paddingBottom)); - }; - - var parseDocumentSize = exports.parseDocumentSize = function parseDocumentSize(document) { - var body = document.body; - var documentElement = document.documentElement; - - if (!body || !documentElement) { - throw new Error( true ? 'Unable to get document size' : ''); - } - var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth)); - - var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight)); - - return new Bounds(0, 0, width, height); - }; - - var parsePathForBorder = exports.parsePathForBorder = function parsePathForBorder(curves, borderSide) { - switch (borderSide) { - case TOP: - return createPathFromCurves(curves.topLeftOuter, curves.topLeftInner, curves.topRightOuter, curves.topRightInner); - case RIGHT: - return createPathFromCurves(curves.topRightOuter, curves.topRightInner, curves.bottomRightOuter, curves.bottomRightInner); - case BOTTOM: - return createPathFromCurves(curves.bottomRightOuter, curves.bottomRightInner, curves.bottomLeftOuter, curves.bottomLeftInner); - case LEFT: - default: - return createPathFromCurves(curves.bottomLeftOuter, curves.bottomLeftInner, curves.topLeftOuter, curves.topLeftInner); - } - }; - - var createPathFromCurves = function createPathFromCurves(outer1, inner1, outer2, inner2) { - var path = []; - if (outer1 instanceof _BezierCurve2.default) { - path.push(outer1.subdivide(0.5, false)); - } else { - path.push(outer1); - } - - if (outer2 instanceof _BezierCurve2.default) { - path.push(outer2.subdivide(0.5, true)); - } else { - path.push(outer2); - } - - if (inner2 instanceof _BezierCurve2.default) { - path.push(inner2.subdivide(0.5, true).reverse()); - } else { - path.push(inner2); - } - - if (inner1 instanceof _BezierCurve2.default) { - path.push(inner1.subdivide(0.5, false).reverse()); - } else { - path.push(inner1); - } - - return path; - }; - - var calculateBorderBoxPath = exports.calculateBorderBoxPath = function calculateBorderBoxPath(curves) { - return [curves.topLeftOuter, curves.topRightOuter, curves.bottomRightOuter, curves.bottomLeftOuter]; - }; - - var calculatePaddingBoxPath = exports.calculatePaddingBoxPath = function calculatePaddingBoxPath(curves) { - return [curves.topLeftInner, curves.topRightInner, curves.bottomRightInner, curves.bottomLeftInner]; - }; - - var parseBoundCurves = exports.parseBoundCurves = function parseBoundCurves(bounds, borders, borderRadius) { - var tlh = borderRadius[CORNER.TOP_LEFT][H].getAbsoluteValue(bounds.width); - var tlv = borderRadius[CORNER.TOP_LEFT][V].getAbsoluteValue(bounds.height); - var trh = borderRadius[CORNER.TOP_RIGHT][H].getAbsoluteValue(bounds.width); - var trv = borderRadius[CORNER.TOP_RIGHT][V].getAbsoluteValue(bounds.height); - var brh = borderRadius[CORNER.BOTTOM_RIGHT][H].getAbsoluteValue(bounds.width); - var brv = borderRadius[CORNER.BOTTOM_RIGHT][V].getAbsoluteValue(bounds.height); - var blh = borderRadius[CORNER.BOTTOM_LEFT][H].getAbsoluteValue(bounds.width); - var blv = borderRadius[CORNER.BOTTOM_LEFT][V].getAbsoluteValue(bounds.height); - - var factors = []; - factors.push((tlh + trh) / bounds.width); - factors.push((blh + brh) / bounds.width); - factors.push((tlv + blv) / bounds.height); - factors.push((trv + brv) / bounds.height); - var maxFactor = Math.max.apply(Math, factors); - - if (maxFactor > 1) { - tlh /= maxFactor; - tlv /= maxFactor; - trh /= maxFactor; - trv /= maxFactor; - brh /= maxFactor; - brv /= maxFactor; - blh /= maxFactor; - blv /= maxFactor; - } - - var topWidth = bounds.width - trh; - var rightHeight = bounds.height - brv; - var bottomWidth = bounds.width - brh; - var leftHeight = bounds.height - blv; - - return { - topLeftOuter: tlh > 0 || tlv > 0 ? getCurvePoints(bounds.left, bounds.top, tlh, tlv, CORNER.TOP_LEFT) : new _Vector2.default(bounds.left, bounds.top), - topLeftInner: tlh > 0 || tlv > 0 ? getCurvePoints(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth, Math.max(0, tlh - borders[LEFT].borderWidth), Math.max(0, tlv - borders[TOP].borderWidth), CORNER.TOP_LEFT) : new _Vector2.default(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth), - topRightOuter: trh > 0 || trv > 0 ? getCurvePoints(bounds.left + topWidth, bounds.top, trh, trv, CORNER.TOP_RIGHT) : new _Vector2.default(bounds.left + bounds.width, bounds.top), - topRightInner: trh > 0 || trv > 0 ? getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borders[LEFT].borderWidth), bounds.top + borders[TOP].borderWidth, topWidth > bounds.width + borders[LEFT].borderWidth ? 0 : trh - borders[LEFT].borderWidth, trv - borders[TOP].borderWidth, CORNER.TOP_RIGHT) : new _Vector2.default(bounds.left + bounds.width - borders[RIGHT].borderWidth, bounds.top + borders[TOP].borderWidth), - bottomRightOuter: brh > 0 || brv > 0 ? getCurvePoints(bounds.left + bottomWidth, bounds.top + rightHeight, brh, brv, CORNER.BOTTOM_RIGHT) : new _Vector2.default(bounds.left + bounds.width, bounds.top + bounds.height), - bottomRightInner: brh > 0 || brv > 0 ? getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - borders[LEFT].borderWidth), bounds.top + Math.min(rightHeight, bounds.height + borders[TOP].borderWidth), Math.max(0, brh - borders[RIGHT].borderWidth), brv - borders[BOTTOM].borderWidth, CORNER.BOTTOM_RIGHT) : new _Vector2.default(bounds.left + bounds.width - borders[RIGHT].borderWidth, bounds.top + bounds.height - borders[BOTTOM].borderWidth), - bottomLeftOuter: blh > 0 || blv > 0 ? getCurvePoints(bounds.left, bounds.top + leftHeight, blh, blv, CORNER.BOTTOM_LEFT) : new _Vector2.default(bounds.left, bounds.top + bounds.height), - bottomLeftInner: blh > 0 || blv > 0 ? getCurvePoints(bounds.left + borders[LEFT].borderWidth, bounds.top + leftHeight, Math.max(0, blh - borders[LEFT].borderWidth), blv - borders[BOTTOM].borderWidth, CORNER.BOTTOM_LEFT) : new _Vector2.default(bounds.left + borders[LEFT].borderWidth, bounds.top + bounds.height - borders[BOTTOM].borderWidth) - }; - }; - - var CORNER = { - TOP_LEFT: 0, - TOP_RIGHT: 1, - BOTTOM_RIGHT: 2, - BOTTOM_LEFT: 3 - }; - - var getCurvePoints = function getCurvePoints(x, y, r1, r2, position) { - var kappa = 4 * ((Math.sqrt(2) - 1) / 3); - var ox = r1 * kappa; // control point offset horizontal - var oy = r2 * kappa; // control point offset vertical - var xm = x + r1; // x-middle - var ym = y + r2; // y-middle - - switch (position) { - case CORNER.TOP_LEFT: - return new _BezierCurve2.default(new _Vector2.default(x, ym), new _Vector2.default(x, ym - oy), new _Vector2.default(xm - ox, y), new _Vector2.default(xm, y)); - case CORNER.TOP_RIGHT: - return new _BezierCurve2.default(new _Vector2.default(x, y), new _Vector2.default(x + ox, y), new _Vector2.default(xm, ym - oy), new _Vector2.default(xm, ym)); - case CORNER.BOTTOM_RIGHT: - return new _BezierCurve2.default(new _Vector2.default(xm, y), new _Vector2.default(xm, y + oy), new _Vector2.default(x + ox, ym), new _Vector2.default(x, ym)); - case CORNER.BOTTOM_LEFT: - default: - return new _BezierCurve2.default(new _Vector2.default(xm, ym), new _Vector2.default(xm - ox, ym), new _Vector2.default(x, y + oy), new _Vector2.default(x, y)); - } - }; - - /***/ }), - /* 3 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - var _Util = __webpack_require__(4); - - var _background = __webpack_require__(5); - - var _border = __webpack_require__(12); - - var _borderRadius = __webpack_require__(33); - - var _display = __webpack_require__(34); - - var _float = __webpack_require__(35); - - var _font = __webpack_require__(36); - - var _letterSpacing = __webpack_require__(37); - - var _lineBreak = __webpack_require__(38); - - var _listStyle = __webpack_require__(8); - - var _margin = __webpack_require__(39); - - var _overflow = __webpack_require__(40); - - var _overflowWrap = __webpack_require__(18); - - var _padding = __webpack_require__(17); - - var _position = __webpack_require__(19); - - var _textDecoration = __webpack_require__(11); - - var _textShadow = __webpack_require__(41); - - var _textTransform = __webpack_require__(20); - - var _transform = __webpack_require__(42); - - var _visibility = __webpack_require__(43); - - var _wordBreak = __webpack_require__(44); - - var _zIndex = __webpack_require__(45); - - var _Bounds = __webpack_require__(2); - - var _Input = __webpack_require__(21); - - var _ListItem = __webpack_require__(14); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT']; - - var NodeContainer = function () { - function NodeContainer(node, parent, resourceLoader, index) { - var _this = this; - - _classCallCheck(this, NodeContainer); - - this.parent = parent; - this.tagName = node.tagName; - this.index = index; - this.childNodes = []; - this.listItems = []; - if (typeof node.start === 'number') { - this.listStart = node.start; - } - var defaultView = node.ownerDocument.defaultView; - var scrollX = defaultView.pageXOffset; - var scrollY = defaultView.pageYOffset; - var style = defaultView.getComputedStyle(node, null); - var display = (0, _display.parseDisplay)(style.display); - - var IS_INPUT = node.type === 'radio' || node.type === 'checkbox'; - - var position = (0, _position.parsePosition)(style.position); - - this.style = { - background: IS_INPUT ? _Input.INPUT_BACKGROUND : (0, _background.parseBackground)(style, resourceLoader), - border: IS_INPUT ? _Input.INPUT_BORDERS : (0, _border.parseBorder)(style), - borderRadius: (node instanceof defaultView.HTMLInputElement || node instanceof HTMLInputElement) && IS_INPUT ? (0, _Input.getInputBorderRadius)(node) : (0, _borderRadius.parseBorderRadius)(style), - color: IS_INPUT ? _Input.INPUT_COLOR : new _Color2.default(style.color), - display: display, - float: (0, _float.parseCSSFloat)(style.float), - font: (0, _font.parseFont)(style), - letterSpacing: (0, _letterSpacing.parseLetterSpacing)(style.letterSpacing), - listStyle: display === _display.DISPLAY.LIST_ITEM ? (0, _listStyle.parseListStyle)(style) : null, - lineBreak: (0, _lineBreak.parseLineBreak)(style.lineBreak), - margin: (0, _margin.parseMargin)(style), - opacity: parseFloat(style.opacity), - overflow: INPUT_TAGS.indexOf(node.tagName) === -1 ? (0, _overflow.parseOverflow)(style.overflow) : _overflow.OVERFLOW.HIDDEN, - overflowWrap: (0, _overflowWrap.parseOverflowWrap)(style.overflowWrap ? style.overflowWrap : style.wordWrap), - padding: (0, _padding.parsePadding)(style), - position: position, - textDecoration: (0, _textDecoration.parseTextDecoration)(style), - textShadow: (0, _textShadow.parseTextShadow)(style.textShadow), - textTransform: (0, _textTransform.parseTextTransform)(style.textTransform), - transform: (0, _transform.parseTransform)(style), - visibility: (0, _visibility.parseVisibility)(style.visibility), - wordBreak: (0, _wordBreak.parseWordBreak)(style.wordBreak), - zIndex: (0, _zIndex.parseZIndex)(position !== _position.POSITION.STATIC ? style.zIndex : 'auto') - }; - - if (this.isTransformed()) { - // getBoundingClientRect provides values post-transform, we want them without the transformation - node.style.transform = 'matrix(1,0,0,1,0,0)'; - } - - if (display === _display.DISPLAY.LIST_ITEM) { - var listOwner = (0, _ListItem.getListOwner)(this); - if (listOwner) { - var listIndex = listOwner.listItems.length; - listOwner.listItems.push(this); - this.listIndex = node.hasAttribute('value') && typeof node.value === 'number' ? node.value : listIndex === 0 ? typeof listOwner.listStart === 'number' ? listOwner.listStart : 1 : listOwner.listItems[listIndex - 1].listIndex + 1; - } - } - - // TODO move bound retrieval for all nodes to a later stage? - if (node.tagName === 'IMG') { - node.addEventListener('load', function () { - _this.bounds = (0, _Bounds.parseBounds)(node, scrollX, scrollY); - _this.curvedBounds = (0, _Bounds.parseBoundCurves)(_this.bounds, _this.style.border, _this.style.borderRadius); - }); - } - this.image = getImage(node, resourceLoader); - this.bounds = IS_INPUT ? (0, _Input.reformatInputBounds)((0, _Bounds.parseBounds)(node, scrollX, scrollY)) : (0, _Bounds.parseBounds)(node, scrollX, scrollY); - this.curvedBounds = (0, _Bounds.parseBoundCurves)(this.bounds, this.style.border, this.style.borderRadius); - - if (true) { - this.name = '' + node.tagName.toLowerCase() + (node.id ? '#' + node.id : '') + node.className.toString().split(' ').map(function (s) { - return s.length ? '.' + s : ''; - }).join(''); - } - } - - _createClass(NodeContainer, [{ - key: 'getClipPaths', - value: function getClipPaths() { - var parentClips = this.parent ? this.parent.getClipPaths() : []; - var isClipped = this.style.overflow !== _overflow.OVERFLOW.VISIBLE; - - return isClipped ? parentClips.concat([(0, _Bounds.calculatePaddingBoxPath)(this.curvedBounds)]) : parentClips; - } - }, { - key: 'isInFlow', - value: function isInFlow() { - return this.isRootElement() && !this.isFloating() && !this.isAbsolutelyPositioned(); - } - }, { - key: 'isVisible', - value: function isVisible() { - return !(0, _Util.contains)(this.style.display, _display.DISPLAY.NONE) && this.style.opacity > 0 && this.style.visibility === _visibility.VISIBILITY.VISIBLE; - } - }, { - key: 'isAbsolutelyPositioned', - value: function isAbsolutelyPositioned() { - return this.style.position !== _position.POSITION.STATIC && this.style.position !== _position.POSITION.RELATIVE; - } - }, { - key: 'isPositioned', - value: function isPositioned() { - return this.style.position !== _position.POSITION.STATIC; - } - }, { - key: 'isFloating', - value: function isFloating() { - return this.style.float !== _float.FLOAT.NONE; - } - }, { - key: 'isRootElement', - value: function isRootElement() { - return this.parent === null; - } - }, { - key: 'isTransformed', - value: function isTransformed() { - return this.style.transform !== null; - } - }, { - key: 'isPositionedWithZIndex', - value: function isPositionedWithZIndex() { - return this.isPositioned() && !this.style.zIndex.auto; - } - }, { - key: 'isInlineLevel', - value: function isInlineLevel() { - return (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_BLOCK) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_FLEX) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_GRID) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_LIST_ITEM) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_TABLE); - } - }, { - key: 'isInlineBlockOrInlineTable', - value: function isInlineBlockOrInlineTable() { - return (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_BLOCK) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_TABLE); - } - }]); - - return NodeContainer; - }(); - - exports.default = NodeContainer; - - - var getImage = function getImage(node, resourceLoader) { - if (node instanceof node.ownerDocument.defaultView.SVGSVGElement || node instanceof SVGSVGElement) { - var s = new XMLSerializer(); - return resourceLoader.loadImage('data:image/svg+xml,' + encodeURIComponent(s.serializeToString(node))); - } - switch (node.tagName) { - case 'IMG': - // $FlowFixMe - var img = node; - return resourceLoader.loadImage(img.currentSrc || img.src); - case 'CANVAS': - // $FlowFixMe - var canvas = node; - return resourceLoader.loadCanvas(canvas); - case 'IFRAME': - var iframeKey = node.getAttribute('data-html2canvas-internal-iframe-key'); - if (iframeKey) { - return iframeKey; - } - break; - } - - return null; - }; - - /***/ }), - /* 4 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var contains = exports.contains = function contains(bit, value) { - return (bit & value) !== 0; - }; - - var distance = exports.distance = function distance(a, b) { - return Math.sqrt(a * a + b * b); - }; - - var copyCSSStyles = exports.copyCSSStyles = function copyCSSStyles(style, target) { - // Edge does not provide value for cssText - for (var i = style.length - 1; i >= 0; i--) { - var property = style.item(i); - // Safari shows pseudoelements if content is set - if (property !== 'content') { - target.style.setProperty(property, style.getPropertyValue(property)); - } - } - return target; - }; - - var SMALL_IMAGE = exports.SMALL_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; - - /***/ }), - /* 5 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseBackgroundImage = exports.parseBackground = exports.calculateBackgroundRepeatPath = exports.calculateBackgroundPosition = exports.calculateBackgroungPositioningArea = exports.calculateBackgroungPaintingArea = exports.calculateGradientBackgroundSize = exports.calculateBackgroundSize = exports.BACKGROUND_ORIGIN = exports.BACKGROUND_CLIP = exports.BACKGROUND_SIZE = exports.BACKGROUND_REPEAT = undefined; - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - var _Size = __webpack_require__(31); - - var _Size2 = _interopRequireDefault(_Size); - - var _Vector = __webpack_require__(7); - - var _Vector2 = _interopRequireDefault(_Vector); - - var _Bounds = __webpack_require__(2); - - var _padding = __webpack_require__(17); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var BACKGROUND_REPEAT = exports.BACKGROUND_REPEAT = { - REPEAT: 0, - NO_REPEAT: 1, - REPEAT_X: 2, - REPEAT_Y: 3 - }; - - var BACKGROUND_SIZE = exports.BACKGROUND_SIZE = { - AUTO: 0, - CONTAIN: 1, - COVER: 2, - LENGTH: 3 - }; - - var BACKGROUND_CLIP = exports.BACKGROUND_CLIP = { - BORDER_BOX: 0, - PADDING_BOX: 1, - CONTENT_BOX: 2 - }; - - var BACKGROUND_ORIGIN = exports.BACKGROUND_ORIGIN = BACKGROUND_CLIP; - - var AUTO = 'auto'; - - var BackgroundSize = function BackgroundSize(size) { - _classCallCheck(this, BackgroundSize); - - switch (size) { - case 'contain': - this.size = BACKGROUND_SIZE.CONTAIN; - break; - case 'cover': - this.size = BACKGROUND_SIZE.COVER; - break; - case 'auto': - this.size = BACKGROUND_SIZE.AUTO; - break; - default: - this.value = new _Length2.default(size); - } - }; - - var calculateBackgroundSize = exports.calculateBackgroundSize = function calculateBackgroundSize(backgroundImage, image, bounds) { - var width = 0; - var height = 0; - var size = backgroundImage.size; - if (size[0].size === BACKGROUND_SIZE.CONTAIN || size[0].size === BACKGROUND_SIZE.COVER) { - var targetRatio = bounds.width / bounds.height; - var currentRatio = image.width / image.height; - return targetRatio < currentRatio !== (size[0].size === BACKGROUND_SIZE.COVER) ? new _Size2.default(bounds.width, bounds.width / currentRatio) : new _Size2.default(bounds.height * currentRatio, bounds.height); - } - - if (size[0].value) { - width = size[0].value.getAbsoluteValue(bounds.width); - } - - if (size[0].size === BACKGROUND_SIZE.AUTO && size[1].size === BACKGROUND_SIZE.AUTO) { - height = image.height; - } else if (size[1].size === BACKGROUND_SIZE.AUTO) { - height = width / image.width * image.height; - } else if (size[1].value) { - height = size[1].value.getAbsoluteValue(bounds.height); - } - - if (size[0].size === BACKGROUND_SIZE.AUTO) { - width = height / image.height * image.width; - } - - return new _Size2.default(width, height); - }; - - var calculateGradientBackgroundSize = exports.calculateGradientBackgroundSize = function calculateGradientBackgroundSize(backgroundImage, bounds) { - var size = backgroundImage.size; - var width = size[0].value ? size[0].value.getAbsoluteValue(bounds.width) : bounds.width; - var height = size[1].value ? size[1].value.getAbsoluteValue(bounds.height) : size[0].value ? width : bounds.height; - - return new _Size2.default(width, height); - }; - - var AUTO_SIZE = new BackgroundSize(AUTO); - - var calculateBackgroungPaintingArea = exports.calculateBackgroungPaintingArea = function calculateBackgroungPaintingArea(curves, clip) { - switch (clip) { - case BACKGROUND_CLIP.BORDER_BOX: - return (0, _Bounds.calculateBorderBoxPath)(curves); - case BACKGROUND_CLIP.PADDING_BOX: - default: - return (0, _Bounds.calculatePaddingBoxPath)(curves); - } - }; - - var calculateBackgroungPositioningArea = exports.calculateBackgroungPositioningArea = function calculateBackgroungPositioningArea(backgroundOrigin, bounds, padding, border) { - var paddingBox = (0, _Bounds.calculatePaddingBox)(bounds, border); - - switch (backgroundOrigin) { - case BACKGROUND_ORIGIN.BORDER_BOX: - return bounds; - case BACKGROUND_ORIGIN.CONTENT_BOX: - var paddingLeft = padding[_padding.PADDING_SIDES.LEFT].getAbsoluteValue(bounds.width); - var paddingRight = padding[_padding.PADDING_SIDES.RIGHT].getAbsoluteValue(bounds.width); - var paddingTop = padding[_padding.PADDING_SIDES.TOP].getAbsoluteValue(bounds.width); - var paddingBottom = padding[_padding.PADDING_SIDES.BOTTOM].getAbsoluteValue(bounds.width); - return new _Bounds.Bounds(paddingBox.left + paddingLeft, paddingBox.top + paddingTop, paddingBox.width - paddingLeft - paddingRight, paddingBox.height - paddingTop - paddingBottom); - case BACKGROUND_ORIGIN.PADDING_BOX: - default: - return paddingBox; - } - }; - - var calculateBackgroundPosition = exports.calculateBackgroundPosition = function calculateBackgroundPosition(position, size, bounds) { - return new _Vector2.default(position[0].getAbsoluteValue(bounds.width - size.width), position[1].getAbsoluteValue(bounds.height - size.height)); - }; - - var calculateBackgroundRepeatPath = exports.calculateBackgroundRepeatPath = function calculateBackgroundRepeatPath(background, position, size, backgroundPositioningArea, bounds) { - var repeat = background.repeat; - switch (repeat) { - case BACKGROUND_REPEAT.REPEAT_X: - return [new _Vector2.default(Math.round(bounds.left), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(size.height + backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left), Math.round(size.height + backgroundPositioningArea.top + position.y))]; - case BACKGROUND_REPEAT.REPEAT_Y: - return [new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(bounds.height + bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(bounds.height + bounds.top))]; - case BACKGROUND_REPEAT.NO_REPEAT: - return [new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(backgroundPositioningArea.top + position.y + size.height)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y + size.height))]; - default: - return [new _Vector2.default(Math.round(bounds.left), Math.round(bounds.top)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(bounds.top)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(bounds.height + bounds.top)), new _Vector2.default(Math.round(bounds.left), Math.round(bounds.height + bounds.top))]; - } - }; - - var parseBackground = exports.parseBackground = function parseBackground(style, resourceLoader) { - return { - backgroundColor: new _Color2.default(style.backgroundColor), - backgroundImage: parseBackgroundImages(style, resourceLoader), - backgroundClip: parseBackgroundClip(style.backgroundClip), - backgroundOrigin: parseBackgroundOrigin(style.backgroundOrigin) - }; - }; - - var parseBackgroundClip = function parseBackgroundClip(backgroundClip) { - switch (backgroundClip) { - case 'padding-box': - return BACKGROUND_CLIP.PADDING_BOX; - case 'content-box': - return BACKGROUND_CLIP.CONTENT_BOX; - } - return BACKGROUND_CLIP.BORDER_BOX; - }; - - var parseBackgroundOrigin = function parseBackgroundOrigin(backgroundOrigin) { - switch (backgroundOrigin) { - case 'padding-box': - return BACKGROUND_ORIGIN.PADDING_BOX; - case 'content-box': - return BACKGROUND_ORIGIN.CONTENT_BOX; - } - return BACKGROUND_ORIGIN.BORDER_BOX; - }; - - var parseBackgroundRepeat = function parseBackgroundRepeat(backgroundRepeat) { - switch (backgroundRepeat.trim()) { - case 'no-repeat': - return BACKGROUND_REPEAT.NO_REPEAT; - case 'repeat-x': - case 'repeat no-repeat': - return BACKGROUND_REPEAT.REPEAT_X; - case 'repeat-y': - case 'no-repeat repeat': - return BACKGROUND_REPEAT.REPEAT_Y; - case 'repeat': - return BACKGROUND_REPEAT.REPEAT; - } - - if (true) { - console.error('Invalid background-repeat value "' + backgroundRepeat + '"'); - } - - return BACKGROUND_REPEAT.REPEAT; - }; - - var parseBackgroundImages = function parseBackgroundImages(style, resourceLoader) { - var sources = parseBackgroundImage(style.backgroundImage).map(function (backgroundImage) { - if (backgroundImage.method === 'url') { - var key = resourceLoader.loadImage(backgroundImage.args[0]); - backgroundImage.args = key ? [key] : []; - } - return backgroundImage; - }); - var positions = style.backgroundPosition.split(','); - var repeats = style.backgroundRepeat.split(','); - var sizes = style.backgroundSize.split(','); - - return sources.map(function (source, index) { - var size = (sizes[index] || AUTO).trim().split(' ').map(parseBackgroundSize); - var position = (positions[index] || AUTO).trim().split(' ').map(parseBackgoundPosition); - - return { - source: source, - repeat: parseBackgroundRepeat(typeof repeats[index] === 'string' ? repeats[index] : repeats[0]), - size: size.length < 2 ? [size[0], AUTO_SIZE] : [size[0], size[1]], - position: position.length < 2 ? [position[0], position[0]] : [position[0], position[1]] - }; - }); - }; - - var parseBackgroundSize = function parseBackgroundSize(size) { - return size === 'auto' ? AUTO_SIZE : new BackgroundSize(size); - }; - - var parseBackgoundPosition = function parseBackgoundPosition(position) { - switch (position) { - case 'bottom': - case 'right': - return new _Length2.default('100%'); - case 'left': - case 'top': - return new _Length2.default('0%'); - case 'auto': - return new _Length2.default('0'); - } - return new _Length2.default(position); - }; - - var parseBackgroundImage = exports.parseBackgroundImage = function parseBackgroundImage(image) { - var whitespace = /^\s$/; - var results = []; - - var args = []; - var method = ''; - var quote = null; - var definition = ''; - var mode = 0; - var numParen = 0; - - var appendResult = function appendResult() { - var prefix = ''; - if (method) { - if (definition.substr(0, 1) === '"') { - definition = definition.substr(1, definition.length - 2); - } - - if (definition) { - args.push(definition.trim()); - } - - var prefix_i = method.indexOf('-', 1) + 1; - if (method.substr(0, 1) === '-' && prefix_i > 0) { - prefix = method.substr(0, prefix_i).toLowerCase(); - method = method.substr(prefix_i); - } - method = method.toLowerCase(); - if (method !== 'none') { - results.push({ - prefix: prefix, - method: method, - args: args - }); - } - } - args = []; - method = definition = ''; - }; - - image.split('').forEach(function (c) { - if (mode === 0 && whitespace.test(c)) { - return; - } - switch (c) { - case '"': - if (!quote) { - quote = c; - } else if (quote === c) { - quote = null; - } - break; - case '(': - if (quote) { - break; - } else if (mode === 0) { - mode = 1; - return; - } else { - numParen++; - } - break; - case ')': - if (quote) { - break; - } else if (mode === 1) { - if (numParen === 0) { - mode = 0; - appendResult(); - return; - } else { - numParen--; - } - } - break; - - case ',': - if (quote) { - break; - } else if (mode === 0) { - appendResult(); - return; - } else if (mode === 1) { - if (numParen === 0 && !method.match(/^url$/i)) { - args.push(definition.trim()); - definition = ''; - return; - } - } - break; - } - - if (mode === 0) { - method += c; - } else { - definition += c; - } - }); - - appendResult(); - return results; - }; - - /***/ }), - /* 6 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var PATH = exports.PATH = { - VECTOR: 0, - BEZIER_CURVE: 1, - CIRCLE: 2 - }; - - /***/ }), - /* 7 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _Path = __webpack_require__(6); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Vector = function Vector(x, y) { - _classCallCheck(this, Vector); - - this.type = _Path.PATH.VECTOR; - this.x = x; - this.y = y; - if (true) { - if (isNaN(x)) { - console.error('Invalid x value given for Vector'); - } - if (isNaN(y)) { - console.error('Invalid y value given for Vector'); - } - } - }; - - exports.default = Vector; - - /***/ }), - /* 8 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseListStyle = exports.parseListStyleType = exports.LIST_STYLE_TYPE = exports.LIST_STYLE_POSITION = undefined; - - var _background = __webpack_require__(5); - - var LIST_STYLE_POSITION = exports.LIST_STYLE_POSITION = { - INSIDE: 0, - OUTSIDE: 1 - }; - - var LIST_STYLE_TYPE = exports.LIST_STYLE_TYPE = { - NONE: -1, - DISC: 0, - CIRCLE: 1, - SQUARE: 2, - DECIMAL: 3, - CJK_DECIMAL: 4, - DECIMAL_LEADING_ZERO: 5, - LOWER_ROMAN: 6, - UPPER_ROMAN: 7, - LOWER_GREEK: 8, - LOWER_ALPHA: 9, - UPPER_ALPHA: 10, - ARABIC_INDIC: 11, - ARMENIAN: 12, - BENGALI: 13, - CAMBODIAN: 14, - CJK_EARTHLY_BRANCH: 15, - CJK_HEAVENLY_STEM: 16, - CJK_IDEOGRAPHIC: 17, - DEVANAGARI: 18, - ETHIOPIC_NUMERIC: 19, - GEORGIAN: 20, - GUJARATI: 21, - GURMUKHI: 22, - HEBREW: 22, - HIRAGANA: 23, - HIRAGANA_IROHA: 24, - JAPANESE_FORMAL: 25, - JAPANESE_INFORMAL: 26, - KANNADA: 27, - KATAKANA: 28, - KATAKANA_IROHA: 29, - KHMER: 30, - KOREAN_HANGUL_FORMAL: 31, - KOREAN_HANJA_FORMAL: 32, - KOREAN_HANJA_INFORMAL: 33, - LAO: 34, - LOWER_ARMENIAN: 35, - MALAYALAM: 36, - MONGOLIAN: 37, - MYANMAR: 38, - ORIYA: 39, - PERSIAN: 40, - SIMP_CHINESE_FORMAL: 41, - SIMP_CHINESE_INFORMAL: 42, - TAMIL: 43, - TELUGU: 44, - THAI: 45, - TIBETAN: 46, - TRAD_CHINESE_FORMAL: 47, - TRAD_CHINESE_INFORMAL: 48, - UPPER_ARMENIAN: 49, - DISCLOSURE_OPEN: 50, - DISCLOSURE_CLOSED: 51 - }; - - var parseListStyleType = exports.parseListStyleType = function parseListStyleType(type) { - switch (type) { - case 'disc': - return LIST_STYLE_TYPE.DISC; - case 'circle': - return LIST_STYLE_TYPE.CIRCLE; - case 'square': - return LIST_STYLE_TYPE.SQUARE; - case 'decimal': - return LIST_STYLE_TYPE.DECIMAL; - case 'cjk-decimal': - return LIST_STYLE_TYPE.CJK_DECIMAL; - case 'decimal-leading-zero': - return LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO; - case 'lower-roman': - return LIST_STYLE_TYPE.LOWER_ROMAN; - case 'upper-roman': - return LIST_STYLE_TYPE.UPPER_ROMAN; - case 'lower-greek': - return LIST_STYLE_TYPE.LOWER_GREEK; - case 'lower-alpha': - return LIST_STYLE_TYPE.LOWER_ALPHA; - case 'upper-alpha': - return LIST_STYLE_TYPE.UPPER_ALPHA; - case 'arabic-indic': - return LIST_STYLE_TYPE.ARABIC_INDIC; - case 'armenian': - return LIST_STYLE_TYPE.ARMENIAN; - case 'bengali': - return LIST_STYLE_TYPE.BENGALI; - case 'cambodian': - return LIST_STYLE_TYPE.CAMBODIAN; - case 'cjk-earthly-branch': - return LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH; - case 'cjk-heavenly-stem': - return LIST_STYLE_TYPE.CJK_HEAVENLY_STEM; - case 'cjk-ideographic': - return LIST_STYLE_TYPE.CJK_IDEOGRAPHIC; - case 'devanagari': - return LIST_STYLE_TYPE.DEVANAGARI; - case 'ethiopic-numeric': - return LIST_STYLE_TYPE.ETHIOPIC_NUMERIC; - case 'georgian': - return LIST_STYLE_TYPE.GEORGIAN; - case 'gujarati': - return LIST_STYLE_TYPE.GUJARATI; - case 'gurmukhi': - return LIST_STYLE_TYPE.GURMUKHI; - case 'hebrew': - return LIST_STYLE_TYPE.HEBREW; - case 'hiragana': - return LIST_STYLE_TYPE.HIRAGANA; - case 'hiragana-iroha': - return LIST_STYLE_TYPE.HIRAGANA_IROHA; - case 'japanese-formal': - return LIST_STYLE_TYPE.JAPANESE_FORMAL; - case 'japanese-informal': - return LIST_STYLE_TYPE.JAPANESE_INFORMAL; - case 'kannada': - return LIST_STYLE_TYPE.KANNADA; - case 'katakana': - return LIST_STYLE_TYPE.KATAKANA; - case 'katakana-iroha': - return LIST_STYLE_TYPE.KATAKANA_IROHA; - case 'khmer': - return LIST_STYLE_TYPE.KHMER; - case 'korean-hangul-formal': - return LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL; - case 'korean-hanja-formal': - return LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL; - case 'korean-hanja-informal': - return LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL; - case 'lao': - return LIST_STYLE_TYPE.LAO; - case 'lower-armenian': - return LIST_STYLE_TYPE.LOWER_ARMENIAN; - case 'malayalam': - return LIST_STYLE_TYPE.MALAYALAM; - case 'mongolian': - return LIST_STYLE_TYPE.MONGOLIAN; - case 'myanmar': - return LIST_STYLE_TYPE.MYANMAR; - case 'oriya': - return LIST_STYLE_TYPE.ORIYA; - case 'persian': - return LIST_STYLE_TYPE.PERSIAN; - case 'simp-chinese-formal': - return LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL; - case 'simp-chinese-informal': - return LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL; - case 'tamil': - return LIST_STYLE_TYPE.TAMIL; - case 'telugu': - return LIST_STYLE_TYPE.TELUGU; - case 'thai': - return LIST_STYLE_TYPE.THAI; - case 'tibetan': - return LIST_STYLE_TYPE.TIBETAN; - case 'trad-chinese-formal': - return LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL; - case 'trad-chinese-informal': - return LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL; - case 'upper-armenian': - return LIST_STYLE_TYPE.UPPER_ARMENIAN; - case 'disclosure-open': - return LIST_STYLE_TYPE.DISCLOSURE_OPEN; - case 'disclosure-closed': - return LIST_STYLE_TYPE.DISCLOSURE_CLOSED; - case 'none': - default: - return LIST_STYLE_TYPE.NONE; - } - }; - - var parseListStyle = exports.parseListStyle = function parseListStyle(style) { - var listStyleImage = (0, _background.parseBackgroundImage)(style.getPropertyValue('list-style-image')); - return { - listStyleType: parseListStyleType(style.getPropertyValue('list-style-type')), - listStyleImage: listStyleImage.length ? listStyleImage[0] : null, - listStylePosition: parseListStylePosition(style.getPropertyValue('list-style-position')) - }; - }; - - var parseListStylePosition = function parseListStylePosition(position) { - switch (position) { - case 'inside': - return LIST_STYLE_POSITION.INSIDE; - case 'outside': - default: - return LIST_STYLE_POSITION.OUTSIDE; - } - }; - - /***/ }), - /* 9 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _textTransform = __webpack_require__(20); - - var _TextBounds = __webpack_require__(22); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var TextContainer = function () { - function TextContainer(text, parent, bounds) { - _classCallCheck(this, TextContainer); - - this.text = text; - this.parent = parent; - this.bounds = bounds; - } - - _createClass(TextContainer, null, [{ - key: 'fromTextNode', - value: function fromTextNode(node, parent) { - var text = transform(node.data, parent.style.textTransform); - return new TextContainer(text, parent, (0, _TextBounds.parseTextBounds)(text, parent, node)); - } - }]); - - return TextContainer; - }(); - - exports.default = TextContainer; - - - var CAPITALIZE = /(^|\s|:|-|\(|\))([a-z])/g; - - var transform = function transform(text, _transform) { - switch (_transform) { - case _textTransform.TEXT_TRANSFORM.LOWERCASE: - return text.toLowerCase(); - case _textTransform.TEXT_TRANSFORM.CAPITALIZE: - return text.replace(CAPITALIZE, capitalize); - case _textTransform.TEXT_TRANSFORM.UPPERCASE: - return text.toUpperCase(); - default: - return text; - } - }; - - function capitalize(m, p1, p2) { - if (m.length > 0) { - return p1 + p2.toUpperCase(); - } - - return m; - } - - /***/ }), - /* 10 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _ForeignObjectRenderer = __webpack_require__(23); - - var testRangeBounds = function testRangeBounds(document) { - var TEST_HEIGHT = 123; - - if (document.createRange) { - var range = document.createRange(); - if (range.getBoundingClientRect) { - var testElement = document.createElement('boundtest'); - testElement.style.height = TEST_HEIGHT + 'px'; - testElement.style.display = 'block'; - document.body.appendChild(testElement); - - range.selectNode(testElement); - var rangeBounds = range.getBoundingClientRect(); - var rangeHeight = Math.round(rangeBounds.height); - document.body.removeChild(testElement); - if (rangeHeight === TEST_HEIGHT) { - return true; - } - } - } - - return false; - }; - -// iOS 10.3 taints canvas with base64 images unless crossOrigin = 'anonymous' - var testBase64 = function testBase64(document, src) { - var img = new Image(); - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - - return new Promise(function (resolve) { - // Single pixel base64 image renders fine on iOS 10.3??? - img.src = src; - - var onload = function onload() { - try { - ctx.drawImage(img, 0, 0); - canvas.toDataURL(); - } catch (e) { - return resolve(false); - } - - return resolve(true); - }; - - img.onload = onload; - img.onerror = function () { - return resolve(false); - }; - - if (img.complete === true) { - setTimeout(function () { - onload(); - }, 500); - } - }); - }; - - var testCORS = function testCORS() { - return typeof new Image().crossOrigin !== 'undefined'; - }; - - var testResponseType = function testResponseType() { - return typeof new XMLHttpRequest().responseType === 'string'; - }; - - var testSVG = function testSVG(document) { - var img = new Image(); - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - img.src = 'data:image/svg+xml,'; - - try { - ctx.drawImage(img, 0, 0); - canvas.toDataURL(); - } catch (e) { - return false; - } - return true; - }; - - var isGreenPixel = function isGreenPixel(data) { - return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255; - }; - - var testForeignObject = function testForeignObject(document) { - var canvas = document.createElement('canvas'); - var size = 100; - canvas.width = size; - canvas.height = size; - var ctx = canvas.getContext('2d'); - ctx.fillStyle = 'rgb(0, 255, 0)'; - ctx.fillRect(0, 0, size, size); - - var img = new Image(); - var greenImageSrc = canvas.toDataURL(); - img.src = greenImageSrc; - var svg = (0, _ForeignObjectRenderer.createForeignObjectSVG)(size, size, 0, 0, img); - ctx.fillStyle = 'red'; - ctx.fillRect(0, 0, size, size); - - return (0, _ForeignObjectRenderer.loadSerializedSVG)(svg).then(function (img) { - ctx.drawImage(img, 0, 0); - var data = ctx.getImageData(0, 0, size, size).data; - ctx.fillStyle = 'red'; - ctx.fillRect(0, 0, size, size); - - var node = document.createElement('div'); - node.style.backgroundImage = 'url(' + greenImageSrc + ')'; - node.style.height = size + 'px'; - // Firefox 55 does not render inline tags - return isGreenPixel(data) ? (0, _ForeignObjectRenderer.loadSerializedSVG)((0, _ForeignObjectRenderer.createForeignObjectSVG)(size, size, 0, 0, node)) : Promise.reject(false); - }).then(function (img) { - ctx.drawImage(img, 0, 0); - // Edge does not render background-images - return isGreenPixel(ctx.getImageData(0, 0, size, size).data); - }).catch(function (e) { - return false; - }); - }; - - var FEATURES = { - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_RANGE_BOUNDS() { - 'use strict'; - - var value = testRangeBounds(document); - Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_SVG_DRAWING() { - 'use strict'; - - var value = testSVG(document); - Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_BASE64_DRAWING() { - 'use strict'; - - return function (src) { - var _value = testBase64(document, src); - Object.defineProperty(FEATURES, 'SUPPORT_BASE64_DRAWING', { value: function value() { - return _value; - } }); - return _value; - }; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_FOREIGNOBJECT_DRAWING() { - 'use strict'; - - var value = typeof Array.from === 'function' && typeof window.fetch === 'function' ? testForeignObject(document) : Promise.resolve(false); - Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_CORS_IMAGES() { - 'use strict'; - - var value = testCORS(); - Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_RESPONSE_TYPE() { - 'use strict'; - - var value = testResponseType(); - Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_CORS_XHR() { - 'use strict'; - - var value = 'withCredentials' in new XMLHttpRequest(); - Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value }); - return value; - } - }; - - exports.default = FEATURES; - - /***/ }), - /* 11 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseTextDecoration = exports.TEXT_DECORATION_LINE = exports.TEXT_DECORATION = exports.TEXT_DECORATION_STYLE = undefined; - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var TEXT_DECORATION_STYLE = exports.TEXT_DECORATION_STYLE = { - SOLID: 0, - DOUBLE: 1, - DOTTED: 2, - DASHED: 3, - WAVY: 4 - }; - - var TEXT_DECORATION = exports.TEXT_DECORATION = { - NONE: null - }; - - var TEXT_DECORATION_LINE = exports.TEXT_DECORATION_LINE = { - UNDERLINE: 1, - OVERLINE: 2, - LINE_THROUGH: 3, - BLINK: 4 - }; - - var parseLine = function parseLine(line) { - switch (line) { - case 'underline': - return TEXT_DECORATION_LINE.UNDERLINE; - case 'overline': - return TEXT_DECORATION_LINE.OVERLINE; - case 'line-through': - return TEXT_DECORATION_LINE.LINE_THROUGH; - } - return TEXT_DECORATION_LINE.BLINK; - }; - - var parseTextDecorationLine = function parseTextDecorationLine(line) { - if (line === 'none') { - return null; - } - - return line.split(' ').map(parseLine); - }; - - var parseTextDecorationStyle = function parseTextDecorationStyle(style) { - switch (style) { - case 'double': - return TEXT_DECORATION_STYLE.DOUBLE; - case 'dotted': - return TEXT_DECORATION_STYLE.DOTTED; - case 'dashed': - return TEXT_DECORATION_STYLE.DASHED; - case 'wavy': - return TEXT_DECORATION_STYLE.WAVY; - } - return TEXT_DECORATION_STYLE.SOLID; - }; - - var parseTextDecoration = exports.parseTextDecoration = function parseTextDecoration(style) { - var textDecorationLine = parseTextDecorationLine(style.textDecorationLine ? style.textDecorationLine : style.textDecoration); - if (textDecorationLine === null) { - return TEXT_DECORATION.NONE; - } - - var textDecorationColor = style.textDecorationColor ? new _Color2.default(style.textDecorationColor) : null; - var textDecorationStyle = parseTextDecorationStyle(style.textDecorationStyle); - - return { - textDecorationLine: textDecorationLine, - textDecorationColor: textDecorationColor, - textDecorationStyle: textDecorationStyle - }; - }; - - /***/ }), - /* 12 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseBorder = exports.BORDER_SIDES = exports.BORDER_STYLE = undefined; - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var BORDER_STYLE = exports.BORDER_STYLE = { - NONE: 0, - SOLID: 1 - }; - - var BORDER_SIDES = exports.BORDER_SIDES = { - TOP: 0, - RIGHT: 1, - BOTTOM: 2, - LEFT: 3 - }; - - var SIDES = Object.keys(BORDER_SIDES).map(function (s) { - return s.toLowerCase(); - }); - - var parseBorderStyle = function parseBorderStyle(style) { - switch (style) { - case 'none': - return BORDER_STYLE.NONE; - } - return BORDER_STYLE.SOLID; - }; - - var parseBorder = exports.parseBorder = function parseBorder(style) { - return SIDES.map(function (side) { - var borderColor = new _Color2.default(style.getPropertyValue('border-' + side + '-color')); - var borderStyle = parseBorderStyle(style.getPropertyValue('border-' + side + '-style')); - var borderWidth = parseFloat(style.getPropertyValue('border-' + side + '-width')); - return { - borderColor: borderColor, - borderStyle: borderStyle, - borderWidth: isNaN(borderWidth) ? 0 : borderWidth - }; - }); - }; - - /***/ }), - /* 13 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var toCodePoints = exports.toCodePoints = function toCodePoints(str) { - var codePoints = []; - var i = 0; - var length = str.length; - while (i < length) { - var value = str.charCodeAt(i++); - if (value >= 0xd800 && value <= 0xdbff && i < length) { - var extra = str.charCodeAt(i++); - if ((extra & 0xfc00) === 0xdc00) { - codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000); - } else { - codePoints.push(value); - i--; - } - } else { - codePoints.push(value); - } - } - return codePoints; - }; - - var fromCodePoint = exports.fromCodePoint = function fromCodePoint() { - if (String.fromCodePoint) { - return String.fromCodePoint.apply(String, arguments); - } - - var length = arguments.length; - if (!length) { - return ''; - } - - var codeUnits = []; - - var index = -1; - var result = ''; - while (++index < length) { - var codePoint = arguments.length <= index ? undefined : arguments[index]; - if (codePoint <= 0xffff) { - codeUnits.push(codePoint); - } else { - codePoint -= 0x10000; - codeUnits.push((codePoint >> 10) + 0xd800, codePoint % 0x400 + 0xdc00); - } - if (index + 1 === length || codeUnits.length > 0x4000) { - result += String.fromCharCode.apply(String, codeUnits); - codeUnits.length = 0; - } - } - return result; - }; - - var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -// Use a lookup table to find the index. - var lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); - for (var i = 0; i < chars.length; i++) { - lookup[chars.charCodeAt(i)] = i; - } - - var decode = exports.decode = function decode(base64) { - var bufferLength = base64.length * 0.75, - len = base64.length, - i = void 0, - p = 0, - encoded1 = void 0, - encoded2 = void 0, - encoded3 = void 0, - encoded4 = void 0; - - if (base64[base64.length - 1] === '=') { - bufferLength--; - if (base64[base64.length - 2] === '=') { - bufferLength--; - } - } - - var buffer = typeof ArrayBuffer !== 'undefined' && typeof Uint8Array !== 'undefined' && typeof Uint8Array.prototype.slice !== 'undefined' ? new ArrayBuffer(bufferLength) : new Array(bufferLength); - var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer); - - for (i = 0; i < len; i += 4) { - encoded1 = lookup[base64.charCodeAt(i)]; - encoded2 = lookup[base64.charCodeAt(i + 1)]; - encoded3 = lookup[base64.charCodeAt(i + 2)]; - encoded4 = lookup[base64.charCodeAt(i + 3)]; - - bytes[p++] = encoded1 << 2 | encoded2 >> 4; - bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2; - bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63; - } - - return buffer; - }; - - var polyUint16Array = exports.polyUint16Array = function polyUint16Array(buffer) { - var length = buffer.length; - var bytes = []; - for (var _i = 0; _i < length; _i += 2) { - bytes.push(buffer[_i + 1] << 8 | buffer[_i]); - } - return bytes; - }; - - var polyUint32Array = exports.polyUint32Array = function polyUint32Array(buffer) { - var length = buffer.length; - var bytes = []; - for (var _i2 = 0; _i2 < length; _i2 += 4) { - bytes.push(buffer[_i2 + 3] << 24 | buffer[_i2 + 2] << 16 | buffer[_i2 + 1] << 8 | buffer[_i2]); - } - return bytes; - }; - - /***/ }), - /* 14 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.createCounterText = exports.inlineListItemElement = exports.getListOwner = undefined; - - var _Util = __webpack_require__(4); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _TextContainer = __webpack_require__(9); - - var _TextContainer2 = _interopRequireDefault(_TextContainer); - - var _listStyle = __webpack_require__(8); - - var _Unicode = __webpack_require__(24); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// Margin between the enumeration and the list item content - var MARGIN_RIGHT = 7; - - var ancestorTypes = ['OL', 'UL', 'MENU']; - - var getListOwner = exports.getListOwner = function getListOwner(container) { - var parent = container.parent; - if (!parent) { - return null; - } - - do { - var isAncestor = ancestorTypes.indexOf(parent.tagName) !== -1; - if (isAncestor) { - return parent; - } - parent = parent.parent; - } while (parent); - - return container.parent; - }; - - var inlineListItemElement = exports.inlineListItemElement = function inlineListItemElement(node, container, resourceLoader) { - var listStyle = container.style.listStyle; - - if (!listStyle) { - return; - } - - var style = node.ownerDocument.defaultView.getComputedStyle(node, null); - var wrapper = node.ownerDocument.createElement('html2canvaswrapper'); - (0, _Util.copyCSSStyles)(style, wrapper); - - wrapper.style.position = 'absolute'; - wrapper.style.bottom = 'auto'; - wrapper.style.display = 'block'; - wrapper.style.letterSpacing = 'normal'; - - switch (listStyle.listStylePosition) { - case _listStyle.LIST_STYLE_POSITION.OUTSIDE: - wrapper.style.left = 'auto'; - wrapper.style.right = node.ownerDocument.defaultView.innerWidth - container.bounds.left - container.style.margin[1].getAbsoluteValue(container.bounds.width) + MARGIN_RIGHT + 'px'; - wrapper.style.textAlign = 'right'; - break; - case _listStyle.LIST_STYLE_POSITION.INSIDE: - wrapper.style.left = container.bounds.left - container.style.margin[3].getAbsoluteValue(container.bounds.width) + 'px'; - wrapper.style.right = 'auto'; - wrapper.style.textAlign = 'left'; - break; - } - - var text = void 0; - var MARGIN_TOP = container.style.margin[0].getAbsoluteValue(container.bounds.width); - var styleImage = listStyle.listStyleImage; - if (styleImage) { - if (styleImage.method === 'url') { - var image = node.ownerDocument.createElement('img'); - image.src = styleImage.args[0]; - wrapper.style.top = container.bounds.top - MARGIN_TOP + 'px'; - wrapper.style.width = 'auto'; - wrapper.style.height = 'auto'; - wrapper.appendChild(image); - } else { - var size = parseFloat(container.style.font.fontSize) * 0.5; - wrapper.style.top = container.bounds.top - MARGIN_TOP + container.bounds.height - 1.5 * size + 'px'; - wrapper.style.width = size + 'px'; - wrapper.style.height = size + 'px'; - wrapper.style.backgroundImage = style.listStyleImage; - } - } else if (typeof container.listIndex === 'number') { - text = node.ownerDocument.createTextNode(createCounterText(container.listIndex, listStyle.listStyleType, true)); - wrapper.appendChild(text); - wrapper.style.top = container.bounds.top - MARGIN_TOP + 'px'; - } - - // $FlowFixMe - var body = node.ownerDocument.body; - body.appendChild(wrapper); - - if (text) { - container.childNodes.push(_TextContainer2.default.fromTextNode(text, container)); - body.removeChild(wrapper); - } else { - // $FlowFixMe - container.childNodes.push(new _NodeContainer2.default(wrapper, container, resourceLoader, 0)); - } - }; - - var ROMAN_UPPER = { - integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1], - values: ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'] - }; - - var ARMENIAN = { - integers: [9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], - values: ['Ք', 'Փ', 'Ւ', 'Ց', 'Ր', 'Տ', 'Վ', 'Ս', 'Ռ', 'Ջ', 'Պ', 'Չ', 'Ո', 'Շ', 'Ն', 'Յ', 'Մ', 'Ճ', 'Ղ', 'Ձ', 'Հ', 'Կ', 'Ծ', 'Խ', 'Լ', 'Ի', 'Ժ', 'Թ', 'Ը', 'Է', 'Զ', 'Ե', 'Դ', 'Գ', 'Բ', 'Ա'] - }; - - var HEBREW = { - integers: [10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 19, 18, 17, 16, 15, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], - values: ['י׳', 'ט׳', 'ח׳', 'ז׳', 'ו׳', 'ה׳', 'ד׳', 'ג׳', 'ב׳', 'א׳', 'ת', 'ש', 'ר', 'ק', 'צ', 'פ', 'ע', 'ס', 'נ', 'מ', 'ל', 'כ', 'יט', 'יח', 'יז', 'טז', 'טו', 'י', 'ט', 'ח', 'ז', 'ו', 'ה', 'ד', 'ג', 'ב', 'א'] - }; - - var GEORGIAN = { - integers: [10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], - values: ['ჵ', 'ჰ', 'ჯ', 'ჴ', 'ხ', 'ჭ', 'წ', 'ძ', 'ც', 'ჩ', 'შ', 'ყ', 'ღ', 'ქ', 'ფ', 'ჳ', 'ტ', 'ს', 'რ', 'ჟ', 'პ', 'ო', 'ჲ', 'ნ', 'მ', 'ლ', 'კ', 'ი', 'თ', 'ჱ', 'ზ', 'ვ', 'ე', 'დ', 'გ', 'ბ', 'ა'] - }; - - var createAdditiveCounter = function createAdditiveCounter(value, min, max, symbols, fallback, suffix) { - if (value < min || value > max) { - return createCounterText(value, fallback, suffix.length > 0); - } - - return symbols.integers.reduce(function (string, integer, index) { - while (value >= integer) { - value -= integer; - string += symbols.values[index]; - } - return string; - }, '') + suffix; - }; - - var createCounterStyleWithSymbolResolver = function createCounterStyleWithSymbolResolver(value, codePointRangeLength, isNumeric, resolver) { - var string = ''; - - do { - if (!isNumeric) { - value--; - } - string = resolver(value) + string; - value /= codePointRangeLength; - } while (value * codePointRangeLength >= codePointRangeLength); - - return string; - }; - - var createCounterStyleFromRange = function createCounterStyleFromRange(value, codePointRangeStart, codePointRangeEnd, isNumeric, suffix) { - var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1; - - return (value < 0 ? '-' : '') + (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, function (codePoint) { - return (0, _Unicode.fromCodePoint)(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart); - }) + suffix); - }; - - var createCounterStyleFromSymbols = function createCounterStyleFromSymbols(value, symbols) { - var suffix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '. '; - - var codePointRangeLength = symbols.length; - return createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, false, function (codePoint) { - return symbols[Math.floor(codePoint % codePointRangeLength)]; - }) + suffix; - }; - - var CJK_ZEROS = 1 << 0; - var CJK_TEN_COEFFICIENTS = 1 << 1; - var CJK_TEN_HIGH_COEFFICIENTS = 1 << 2; - var CJK_HUNDRED_COEFFICIENTS = 1 << 3; - - var createCJKCounter = function createCJKCounter(value, numbers, multipliers, negativeSign, suffix, flags) { - if (value < -9999 || value > 9999) { - return createCounterText(value, _listStyle.LIST_STYLE_TYPE.CJK_DECIMAL, suffix.length > 0); - } - var tmp = Math.abs(value); - var string = suffix; - - if (tmp === 0) { - return numbers[0] + string; - } - - for (var digit = 0; tmp > 0 && digit <= 4; digit++) { - var coefficient = tmp % 10; - - if (coefficient === 0 && (0, _Util.contains)(flags, CJK_ZEROS) && string !== '') { - string = numbers[coefficient] + string; - } else if (coefficient > 1 || coefficient === 1 && digit === 0 || coefficient === 1 && digit === 1 && (0, _Util.contains)(flags, CJK_TEN_COEFFICIENTS) || coefficient === 1 && digit === 1 && (0, _Util.contains)(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100 || coefficient === 1 && digit > 1 && (0, _Util.contains)(flags, CJK_HUNDRED_COEFFICIENTS)) { - string = numbers[coefficient] + (digit > 0 ? multipliers[digit - 1] : '') + string; - } else if (coefficient === 1 && digit > 0) { - string = multipliers[digit - 1] + string; - } - tmp = Math.floor(tmp / 10); - } - - return (value < 0 ? negativeSign : '') + string; - }; - - var CHINESE_INFORMAL_MULTIPLIERS = '十百千萬'; - var CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬'; - var JAPANESE_NEGATIVE = 'マイナス'; - var KOREAN_NEGATIVE = '마이너스 '; - - var createCounterText = exports.createCounterText = function createCounterText(value, type, appendSuffix) { - var defaultSuffix = appendSuffix ? '. ' : ''; - var cjkSuffix = appendSuffix ? '、' : ''; - var koreanSuffix = appendSuffix ? ', ' : ''; - switch (type) { - case _listStyle.LIST_STYLE_TYPE.DISC: - return '•'; - case _listStyle.LIST_STYLE_TYPE.CIRCLE: - return '◦'; - case _listStyle.LIST_STYLE_TYPE.SQUARE: - return '◾'; - case _listStyle.LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO: - var string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix); - return string.length < 4 ? '0' + string : string; - case _listStyle.LIST_STYLE_TYPE.CJK_DECIMAL: - return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.LOWER_ROMAN: - return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase(); - case _listStyle.LIST_STYLE_TYPE.UPPER_ROMAN: - return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.LOWER_GREEK: - return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.LOWER_ALPHA: - return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.UPPER_ALPHA: - return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.ARABIC_INDIC: - return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.ARMENIAN: - case _listStyle.LIST_STYLE_TYPE.UPPER_ARMENIAN: - return createAdditiveCounter(value, 1, 9999, ARMENIAN, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.LOWER_ARMENIAN: - return createAdditiveCounter(value, 1, 9999, ARMENIAN, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase(); - case _listStyle.LIST_STYLE_TYPE.BENGALI: - return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.CAMBODIAN: - case _listStyle.LIST_STYLE_TYPE.KHMER: - return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH: - return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.CJK_HEAVENLY_STEM: - return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.CJK_IDEOGRAPHIC: - case _listStyle.LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL: - return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL: - return createCJKCounter(value, '零壹貳參肆伍陸柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL: - return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL: - return createCJKCounter(value, '零壹贰叁肆伍陆柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.JAPANESE_INFORMAL: - return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0); - case _listStyle.LIST_STYLE_TYPE.JAPANESE_FORMAL: - return createCJKCounter(value, '零壱弐参四伍六七八九', '拾百千万', JAPANESE_NEGATIVE, cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL: - return createCJKCounter(value, '영일이삼사오육칠팔구', '십백천만', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL: - return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0); - case _listStyle.LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL: - return createCJKCounter(value, '零壹貳參四五六七八九', '拾百千', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.DEVANAGARI: - return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.GEORGIAN: - return createAdditiveCounter(value, 1, 19999, GEORGIAN, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.GUJARATI: - return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.GURMUKHI: - return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.HEBREW: - return createAdditiveCounter(value, 1, 10999, HEBREW, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.HIRAGANA: - return createCounterStyleFromSymbols(value, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん'); - case _listStyle.LIST_STYLE_TYPE.HIRAGANA_IROHA: - return createCounterStyleFromSymbols(value, 'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす'); - case _listStyle.LIST_STYLE_TYPE.KANNADA: - return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.KATAKANA: - return createCounterStyleFromSymbols(value, 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.KATAKANA_IROHA: - return createCounterStyleFromSymbols(value, 'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.LAO: - return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.MONGOLIAN: - return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.MYANMAR: - return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.ORIYA: - return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.PERSIAN: - return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.TAMIL: - return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.TELUGU: - return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.THAI: - return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.TIBETAN: - return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.DECIMAL: - default: - return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix); - } - }; - - /***/ }), - /* 15 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Path = __webpack_require__(6); - - var _textDecoration = __webpack_require__(11); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var addColorStops = function addColorStops(gradient, canvasGradient) { - var maxStop = Math.max.apply(null, gradient.colorStops.map(function (colorStop) { - return colorStop.stop; - })); - var f = 1 / Math.max(1, maxStop); - gradient.colorStops.forEach(function (colorStop) { - canvasGradient.addColorStop(f * colorStop.stop, colorStop.color.toString()); - }); - }; - - var CanvasRenderer = function () { - function CanvasRenderer(canvas) { - _classCallCheck(this, CanvasRenderer); - - this.canvas = canvas ? canvas : document.createElement('canvas'); - } - - _createClass(CanvasRenderer, [{ - key: 'render', - value: function render(options) { - this.ctx = this.canvas.getContext('2d'); - this.options = options; - this.canvas.width = Math.floor(options.width * options.scale); - this.canvas.height = Math.floor(options.height * options.scale); - this.canvas.style.width = options.width + 'px'; - this.canvas.style.height = options.height + 'px'; - - this.ctx.scale(this.options.scale, this.options.scale); - this.ctx.translate(-options.x, -options.y); - this.ctx.textBaseline = 'bottom'; - options.logger.log('Canvas renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + this.options.scale); - } - }, { - key: 'clip', - value: function clip(clipPaths, callback) { - var _this = this; - - if (clipPaths.length) { - this.ctx.save(); - clipPaths.forEach(function (path) { - _this.path(path); - _this.ctx.clip(); - }); - } - - callback(); - - if (clipPaths.length) { - this.ctx.restore(); - } - } - }, { - key: 'drawImage', - value: function drawImage(image, source, destination) { - this.ctx.drawImage(image, source.left, source.top, source.width, source.height, destination.left, destination.top, destination.width, destination.height); - } - }, { - key: 'drawShape', - value: function drawShape(path, color) { - this.path(path); - this.ctx.fillStyle = color.toString(); - this.ctx.fill(); - } - }, { - key: 'fill', - value: function fill(color) { - this.ctx.fillStyle = color.toString(); - this.ctx.fill(); - } - }, { - key: 'getTarget', - value: function getTarget() { - this.canvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0); - return Promise.resolve(this.canvas); - } - }, { - key: 'path', - value: function path(_path) { - var _this2 = this; - - this.ctx.beginPath(); - if (Array.isArray(_path)) { - _path.forEach(function (point, index) { - var start = point.type === _Path.PATH.VECTOR ? point : point.start; - if (index === 0) { - _this2.ctx.moveTo(start.x, start.y); - } else { - _this2.ctx.lineTo(start.x, start.y); - } - - if (point.type === _Path.PATH.BEZIER_CURVE) { - _this2.ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y); - } - }); - } else { - this.ctx.arc(_path.x + _path.radius, _path.y + _path.radius, _path.radius, 0, Math.PI * 2, true); - } - - this.ctx.closePath(); - } - }, { - key: 'rectangle', - value: function rectangle(x, y, width, height, color) { - this.ctx.fillStyle = color.toString(); - this.ctx.fillRect(x, y, width, height); - } - }, { - key: 'renderLinearGradient', - value: function renderLinearGradient(bounds, gradient) { - var linearGradient = this.ctx.createLinearGradient(bounds.left + gradient.direction.x1, bounds.top + gradient.direction.y1, bounds.left + gradient.direction.x0, bounds.top + gradient.direction.y0); - - addColorStops(gradient, linearGradient); - this.ctx.fillStyle = linearGradient; - this.ctx.fillRect(bounds.left, bounds.top, bounds.width, bounds.height); - } - }, { - key: 'renderRadialGradient', - value: function renderRadialGradient(bounds, gradient) { - var _this3 = this; - - var x = bounds.left + gradient.center.x; - var y = bounds.top + gradient.center.y; - - var radialGradient = this.ctx.createRadialGradient(x, y, 0, x, y, gradient.radius.x); - if (!radialGradient) { - return; - } - - addColorStops(gradient, radialGradient); - this.ctx.fillStyle = radialGradient; - - if (gradient.radius.x !== gradient.radius.y) { - // transforms for elliptical radial gradient - var midX = bounds.left + 0.5 * bounds.width; - var midY = bounds.top + 0.5 * bounds.height; - var f = gradient.radius.y / gradient.radius.x; - var invF = 1 / f; - - this.transform(midX, midY, [1, 0, 0, f, 0, 0], function () { - return _this3.ctx.fillRect(bounds.left, invF * (bounds.top - midY) + midY, bounds.width, bounds.height * invF); - }); - } else { - this.ctx.fillRect(bounds.left, bounds.top, bounds.width, bounds.height); - } - } - }, { - key: 'renderRepeat', - value: function renderRepeat(path, image, imageSize, offsetX, offsetY) { - this.path(path); - this.ctx.fillStyle = this.ctx.createPattern(this.resizeImage(image, imageSize), 'repeat'); - this.ctx.translate(offsetX, offsetY); - this.ctx.fill(); - this.ctx.translate(-offsetX, -offsetY); - } - }, { - key: 'renderTextNode', - value: function renderTextNode(textBounds, color, font, textDecoration, textShadows) { - var _this4 = this; - - this.ctx.font = [font.fontStyle, font.fontVariant, font.fontWeight, font.fontSize, font.fontFamily].join(' '); - - textBounds.forEach(function (text) { - _this4.ctx.fillStyle = color.toString(); - if (textShadows && text.text.trim().length) { - textShadows.slice(0).reverse().forEach(function (textShadow) { - _this4.ctx.shadowColor = textShadow.color.toString(); - _this4.ctx.shadowOffsetX = textShadow.offsetX * _this4.options.scale; - _this4.ctx.shadowOffsetY = textShadow.offsetY * _this4.options.scale; - _this4.ctx.shadowBlur = textShadow.blur; - - _this4.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height); - }); - } else { - _this4.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height); - } - - if (textDecoration !== null) { - var textDecorationColor = textDecoration.textDecorationColor || color; - textDecoration.textDecorationLine.forEach(function (textDecorationLine) { - switch (textDecorationLine) { - case _textDecoration.TEXT_DECORATION_LINE.UNDERLINE: - // Draws a line at the baseline of the font - // TODO As some browsers display the line as more than 1px if the font-size is big, - // need to take that into account both in position and size - var _options$fontMetrics$ = _this4.options.fontMetrics.getMetrics(font), - baseline = _options$fontMetrics$.baseline; - - _this4.rectangle(text.bounds.left, Math.round(text.bounds.top + baseline), text.bounds.width, 1, textDecorationColor); - break; - case _textDecoration.TEXT_DECORATION_LINE.OVERLINE: - _this4.rectangle(text.bounds.left, Math.round(text.bounds.top), text.bounds.width, 1, textDecorationColor); - break; - case _textDecoration.TEXT_DECORATION_LINE.LINE_THROUGH: - // TODO try and find exact position for line-through - var _options$fontMetrics$2 = _this4.options.fontMetrics.getMetrics(font), - middle = _options$fontMetrics$2.middle; - - _this4.rectangle(text.bounds.left, Math.ceil(text.bounds.top + middle), text.bounds.width, 1, textDecorationColor); - break; - } - }); - } - }); - } - }, { - key: 'resizeImage', - value: function resizeImage(image, size) { - if (image.width === size.width && image.height === size.height) { - return image; - } - - var canvas = this.canvas.ownerDocument.createElement('canvas'); - canvas.width = size.width; - canvas.height = size.height; - var ctx = canvas.getContext('2d'); - ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, size.width, size.height); - return canvas; - } - }, { - key: 'setOpacity', - value: function setOpacity(opacity) { - this.ctx.globalAlpha = opacity; - } - }, { - key: 'transform', - value: function transform(offsetX, offsetY, matrix, callback) { - this.ctx.save(); - this.ctx.translate(offsetX, offsetY); - this.ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); - this.ctx.translate(-offsetX, -offsetY); - - callback(); - - this.ctx.restore(); - } - }]); - - return CanvasRenderer; - }(); - - exports.default = CanvasRenderer; - - /***/ }), - /* 16 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Logger = function () { - function Logger(enabled, id, start) { - _classCallCheck(this, Logger); - - this.enabled = typeof window !== 'undefined' && enabled; - this.start = start ? start : Date.now(); - this.id = id; - } - - _createClass(Logger, [{ - key: 'child', - value: function child(id) { - return new Logger(this.enabled, id, this.start); - } - - // eslint-disable-next-line flowtype/no-weak-types - - }, { - key: 'log', - value: function log() { - if (this.enabled && window.console && window.console.log) { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - Function.prototype.bind.call(window.console.log, window.console).apply(window.console, [Date.now() - this.start + 'ms', this.id ? 'html2canvas (' + this.id + '):' : 'html2canvas:'].concat([].slice.call(args, 0))); - } - } - - // eslint-disable-next-line flowtype/no-weak-types - - }, { - key: 'error', - value: function error() { - if (this.enabled && window.console && window.console.error) { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - Function.prototype.bind.call(window.console.error, window.console).apply(window.console, [Date.now() - this.start + 'ms', this.id ? 'html2canvas (' + this.id + '):' : 'html2canvas:'].concat([].slice.call(args, 0))); - } - } - }]); - - return Logger; - }(); - - exports.default = Logger; - - /***/ }), - /* 17 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parsePadding = exports.PADDING_SIDES = undefined; - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var PADDING_SIDES = exports.PADDING_SIDES = { - TOP: 0, - RIGHT: 1, - BOTTOM: 2, - LEFT: 3 - }; - - var SIDES = ['top', 'right', 'bottom', 'left']; - - var parsePadding = exports.parsePadding = function parsePadding(style) { - return SIDES.map(function (side) { - return new _Length2.default(style.getPropertyValue('padding-' + side)); - }); - }; - - /***/ }), - /* 18 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var OVERFLOW_WRAP = exports.OVERFLOW_WRAP = { - NORMAL: 0, - BREAK_WORD: 1 - }; - - var parseOverflowWrap = exports.parseOverflowWrap = function parseOverflowWrap(overflow) { - switch (overflow) { - case 'break-word': - return OVERFLOW_WRAP.BREAK_WORD; - case 'normal': - default: - return OVERFLOW_WRAP.NORMAL; - } - }; - - /***/ }), - /* 19 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var POSITION = exports.POSITION = { - STATIC: 0, - RELATIVE: 1, - ABSOLUTE: 2, - FIXED: 3, - STICKY: 4 - }; - - var parsePosition = exports.parsePosition = function parsePosition(position) { - switch (position) { - case 'relative': - return POSITION.RELATIVE; - case 'absolute': - return POSITION.ABSOLUTE; - case 'fixed': - return POSITION.FIXED; - case 'sticky': - return POSITION.STICKY; - } - - return POSITION.STATIC; - }; - - /***/ }), - /* 20 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var TEXT_TRANSFORM = exports.TEXT_TRANSFORM = { - NONE: 0, - LOWERCASE: 1, - UPPERCASE: 2, - CAPITALIZE: 3 - }; - - var parseTextTransform = exports.parseTextTransform = function parseTextTransform(textTransform) { - switch (textTransform) { - case 'uppercase': - return TEXT_TRANSFORM.UPPERCASE; - case 'lowercase': - return TEXT_TRANSFORM.LOWERCASE; - case 'capitalize': - return TEXT_TRANSFORM.CAPITALIZE; - } - - return TEXT_TRANSFORM.NONE; - }; - - /***/ }), - /* 21 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.reformatInputBounds = exports.inlineSelectElement = exports.inlineTextAreaElement = exports.inlineInputElement = exports.getInputBorderRadius = exports.INPUT_BACKGROUND = exports.INPUT_BORDERS = exports.INPUT_COLOR = undefined; - - var _TextContainer = __webpack_require__(9); - - var _TextContainer2 = _interopRequireDefault(_TextContainer); - - var _background = __webpack_require__(5); - - var _border = __webpack_require__(12); - - var _Circle = __webpack_require__(50); - - var _Circle2 = _interopRequireDefault(_Circle); - - var _Vector = __webpack_require__(7); - - var _Vector2 = _interopRequireDefault(_Vector); - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - var _Bounds = __webpack_require__(2); - - var _TextBounds = __webpack_require__(22); - - var _Util = __webpack_require__(4); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var INPUT_COLOR = exports.INPUT_COLOR = new _Color2.default([42, 42, 42]); - var INPUT_BORDER_COLOR = new _Color2.default([165, 165, 165]); - var INPUT_BACKGROUND_COLOR = new _Color2.default([222, 222, 222]); - var INPUT_BORDER = { - borderWidth: 1, - borderColor: INPUT_BORDER_COLOR, - borderStyle: _border.BORDER_STYLE.SOLID - }; - var INPUT_BORDERS = exports.INPUT_BORDERS = [INPUT_BORDER, INPUT_BORDER, INPUT_BORDER, INPUT_BORDER]; - var INPUT_BACKGROUND = exports.INPUT_BACKGROUND = { - backgroundColor: INPUT_BACKGROUND_COLOR, - backgroundImage: [], - backgroundClip: _background.BACKGROUND_CLIP.PADDING_BOX, - backgroundOrigin: _background.BACKGROUND_ORIGIN.PADDING_BOX - }; - - var RADIO_BORDER_RADIUS = new _Length2.default('50%'); - var RADIO_BORDER_RADIUS_TUPLE = [RADIO_BORDER_RADIUS, RADIO_BORDER_RADIUS]; - var INPUT_RADIO_BORDER_RADIUS = [RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE]; - - var CHECKBOX_BORDER_RADIUS = new _Length2.default('3px'); - var CHECKBOX_BORDER_RADIUS_TUPLE = [CHECKBOX_BORDER_RADIUS, CHECKBOX_BORDER_RADIUS]; - var INPUT_CHECKBOX_BORDER_RADIUS = [CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE]; - - var getInputBorderRadius = exports.getInputBorderRadius = function getInputBorderRadius(node) { - return node.type === 'radio' ? INPUT_RADIO_BORDER_RADIUS : INPUT_CHECKBOX_BORDER_RADIUS; - }; - - var inlineInputElement = exports.inlineInputElement = function inlineInputElement(node, container) { - if (node.type === 'radio' || node.type === 'checkbox') { - if (node.checked) { - var size = Math.min(container.bounds.width, container.bounds.height); - container.childNodes.push(node.type === 'checkbox' ? [new _Vector2.default(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79), new _Vector2.default(container.bounds.left + size * 0.16, container.bounds.top + size * 0.5549), new _Vector2.default(container.bounds.left + size * 0.27347, container.bounds.top + size * 0.44071), new _Vector2.default(container.bounds.left + size * 0.39694, container.bounds.top + size * 0.5649), new _Vector2.default(container.bounds.left + size * 0.72983, container.bounds.top + size * 0.23), new _Vector2.default(container.bounds.left + size * 0.84, container.bounds.top + size * 0.34085), new _Vector2.default(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79)] : new _Circle2.default(container.bounds.left + size / 4, container.bounds.top + size / 4, size / 4)); - } - } else { - inlineFormElement(getInputValue(node), node, container, false); - } - }; - - var inlineTextAreaElement = exports.inlineTextAreaElement = function inlineTextAreaElement(node, container) { - inlineFormElement(node.value, node, container, true); - }; - - var inlineSelectElement = exports.inlineSelectElement = function inlineSelectElement(node, container) { - var option = node.options[node.selectedIndex || 0]; - inlineFormElement(option ? option.text || '' : '', node, container, false); - }; - - var reformatInputBounds = exports.reformatInputBounds = function reformatInputBounds(bounds) { - if (bounds.width > bounds.height) { - bounds.left += (bounds.width - bounds.height) / 2; - bounds.width = bounds.height; - } else if (bounds.width < bounds.height) { - bounds.top += (bounds.height - bounds.width) / 2; - bounds.height = bounds.width; - } - return bounds; - }; - - var inlineFormElement = function inlineFormElement(value, node, container, allowLinebreak) { - var body = node.ownerDocument.body; - if (value.length > 0 && body) { - var wrapper = node.ownerDocument.createElement('html2canvaswrapper'); - (0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node, null), wrapper); - wrapper.style.position = 'absolute'; - wrapper.style.left = container.bounds.left + 'px'; - wrapper.style.top = container.bounds.top + 'px'; - if (!allowLinebreak) { - wrapper.style.whiteSpace = 'nowrap'; - } - var text = node.ownerDocument.createTextNode(value); - wrapper.appendChild(text); - body.appendChild(wrapper); - container.childNodes.push(_TextContainer2.default.fromTextNode(text, container)); - body.removeChild(wrapper); - } - }; - - var getInputValue = function getInputValue(node) { - var value = node.type === 'password' ? new Array(node.value.length + 1).join('\u2022') : node.value; - - return value.length === 0 ? node.placeholder || '' : value; - }; - - /***/ }), - /* 22 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseTextBounds = exports.TextBounds = undefined; - - var _Bounds = __webpack_require__(2); - - var _textDecoration = __webpack_require__(11); - - var _Feature = __webpack_require__(10); - - var _Feature2 = _interopRequireDefault(_Feature); - - var _Unicode = __webpack_require__(24); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var TextBounds = exports.TextBounds = function TextBounds(text, bounds) { - _classCallCheck(this, TextBounds); - - this.text = text; - this.bounds = bounds; - }; - - var parseTextBounds = exports.parseTextBounds = function parseTextBounds(value, parent, node) { - var letterRendering = parent.style.letterSpacing !== 0; - var textList = letterRendering ? (0, _Unicode.toCodePoints)(value).map(function (i) { - return (0, _Unicode.fromCodePoint)(i); - }) : (0, _Unicode.breakWords)(value, parent); - var length = textList.length; - var defaultView = node.parentNode ? node.parentNode.ownerDocument.defaultView : null; - var scrollX = defaultView ? defaultView.pageXOffset : 0; - var scrollY = defaultView ? defaultView.pageYOffset : 0; - var textBounds = []; - var offset = 0; - for (var i = 0; i < length; i++) { - var text = textList[i]; - if (parent.style.textDecoration !== _textDecoration.TEXT_DECORATION.NONE || text.trim().length > 0) { - if (_Feature2.default.SUPPORT_RANGE_BOUNDS) { - textBounds.push(new TextBounds(text, getRangeBounds(node, offset, text.length, scrollX, scrollY))); - } else { - var replacementNode = node.splitText(text.length); - textBounds.push(new TextBounds(text, getWrapperBounds(node, scrollX, scrollY))); - node = replacementNode; - } - } else if (!_Feature2.default.SUPPORT_RANGE_BOUNDS) { - node = node.splitText(text.length); - } - offset += text.length; - } - return textBounds; - }; - - var getWrapperBounds = function getWrapperBounds(node, scrollX, scrollY) { - var wrapper = node.ownerDocument.createElement('html2canvaswrapper'); - wrapper.appendChild(node.cloneNode(true)); - var parentNode = node.parentNode; - if (parentNode) { - parentNode.replaceChild(wrapper, node); - var bounds = (0, _Bounds.parseBounds)(wrapper, scrollX, scrollY); - if (wrapper.firstChild) { - parentNode.replaceChild(wrapper.firstChild, wrapper); - } - return bounds; - } - return new _Bounds.Bounds(0, 0, 0, 0); - }; - - var getRangeBounds = function getRangeBounds(node, offset, length, scrollX, scrollY) { - var range = node.ownerDocument.createRange(); - range.setStart(node, offset); - range.setEnd(node, offset + length); - return _Bounds.Bounds.fromClientRect(range.getBoundingClientRect(), scrollX, scrollY); - }; - - /***/ }), - /* 23 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var ForeignObjectRenderer = function () { - function ForeignObjectRenderer(element) { - _classCallCheck(this, ForeignObjectRenderer); - - this.element = element; - } - - _createClass(ForeignObjectRenderer, [{ - key: 'render', - value: function render(options) { - var _this = this; - - this.options = options; - this.canvas = document.createElement('canvas'); - this.ctx = this.canvas.getContext('2d'); - this.canvas.width = Math.floor(options.width) * options.scale; - this.canvas.height = Math.floor(options.height) * options.scale; - this.canvas.style.width = options.width + 'px'; - this.canvas.style.height = options.height + 'px'; - - options.logger.log('ForeignObject renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + options.scale); - var svg = createForeignObjectSVG(Math.max(options.windowWidth, options.width) * options.scale, Math.max(options.windowHeight, options.height) * options.scale, options.scrollX * options.scale, options.scrollY * options.scale, this.element); - - return loadSerializedSVG(svg).then(function (img) { - if (options.backgroundColor) { - _this.ctx.fillStyle = options.backgroundColor.toString(); - _this.ctx.fillRect(0, 0, options.width * options.scale, options.height * options.scale); - } - - _this.ctx.drawImage(img, -options.x * options.scale, -options.y * options.scale); - return _this.canvas; - }); - } - }]); - - return ForeignObjectRenderer; - }(); - - exports.default = ForeignObjectRenderer; - var createForeignObjectSVG = exports.createForeignObjectSVG = function createForeignObjectSVG(width, height, x, y, node) { - var xmlns = 'http://www.w3.org/2000/svg'; - var svg = document.createElementNS(xmlns, 'svg'); - var foreignObject = document.createElementNS(xmlns, 'foreignObject'); - svg.setAttributeNS(null, 'width', width); - svg.setAttributeNS(null, 'height', height); - - foreignObject.setAttributeNS(null, 'width', '100%'); - foreignObject.setAttributeNS(null, 'height', '100%'); - foreignObject.setAttributeNS(null, 'x', x); - foreignObject.setAttributeNS(null, 'y', y); - foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true'); - svg.appendChild(foreignObject); - - foreignObject.appendChild(node); - - return svg; - }; - - var loadSerializedSVG = exports.loadSerializedSVG = function loadSerializedSVG(svg) { - return new Promise(function (resolve, reject) { - var img = new Image(); - img.onload = function () { - return resolve(img); - }; - img.onerror = reject; - - img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg)); - }); - }; - - /***/ }), - /* 24 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.breakWords = exports.fromCodePoint = exports.toCodePoints = undefined; - - var _cssLineBreak = __webpack_require__(46); - - Object.defineProperty(exports, 'toCodePoints', { - enumerable: true, - get: function get() { - return _cssLineBreak.toCodePoints; - } - }); - Object.defineProperty(exports, 'fromCodePoint', { - enumerable: true, - get: function get() { - return _cssLineBreak.fromCodePoint; - } - }); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _overflowWrap = __webpack_require__(18); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var breakWords = exports.breakWords = function breakWords(str, parent) { - var breaker = (0, _cssLineBreak.LineBreaker)(str, { - lineBreak: parent.style.lineBreak, - wordBreak: parent.style.overflowWrap === _overflowWrap.OVERFLOW_WRAP.BREAK_WORD ? 'break-word' : parent.style.wordBreak - }); - - var words = []; - var bk = void 0; - - while (!(bk = breaker.next()).done) { - words.push(bk.value.slice()); - } - - return words; - }; - - /***/ }), - /* 25 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.FontMetrics = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Util = __webpack_require__(4); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var SAMPLE_TEXT = 'Hidden Text'; - - var FontMetrics = exports.FontMetrics = function () { - function FontMetrics(document) { - _classCallCheck(this, FontMetrics); - - this._data = {}; - this._document = document; - } - - _createClass(FontMetrics, [{ - key: '_parseMetrics', - value: function _parseMetrics(font) { - var container = this._document.createElement('div'); - var img = this._document.createElement('img'); - var span = this._document.createElement('span'); - - var body = this._document.body; - if (!body) { - throw new Error( true ? 'No document found for font metrics' : ''); - } - - container.style.visibility = 'hidden'; - container.style.fontFamily = font.fontFamily; - container.style.fontSize = font.fontSize; - container.style.margin = '0'; - container.style.padding = '0'; - - body.appendChild(container); - - img.src = _Util.SMALL_IMAGE; - img.width = 1; - img.height = 1; - - img.style.margin = '0'; - img.style.padding = '0'; - img.style.verticalAlign = 'baseline'; - - span.style.fontFamily = font.fontFamily; - span.style.fontSize = font.fontSize; - span.style.margin = '0'; - span.style.padding = '0'; - - span.appendChild(this._document.createTextNode(SAMPLE_TEXT)); - container.appendChild(span); - container.appendChild(img); - var baseline = img.offsetTop - span.offsetTop + 2; - - container.removeChild(span); - container.appendChild(this._document.createTextNode(SAMPLE_TEXT)); - - container.style.lineHeight = 'normal'; - img.style.verticalAlign = 'super'; - - var middle = img.offsetTop - container.offsetTop + 2; - - body.removeChild(container); - - return { baseline: baseline, middle: middle }; - } - }, { - key: 'getMetrics', - value: function getMetrics(font) { - var key = font.fontFamily + ' ' + font.fontSize; - if (this._data[key] === undefined) { - this._data[key] = this._parseMetrics(font); - } - - return this._data[key]; - } - }]); - - return FontMetrics; - }(); - - /***/ }), - /* 26 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.Proxy = undefined; - - var _Feature = __webpack_require__(10); - - var _Feature2 = _interopRequireDefault(_Feature); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var Proxy = exports.Proxy = function Proxy(src, options) { - if (!options.proxy) { - return Promise.reject( true ? 'No proxy defined' : null); - } - var proxy = options.proxy; - - return new Promise(function (resolve, reject) { - var responseType = _Feature2.default.SUPPORT_CORS_XHR && _Feature2.default.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text'; - var xhr = _Feature2.default.SUPPORT_CORS_XHR ? new XMLHttpRequest() : new XDomainRequest(); - xhr.onload = function () { - if (xhr instanceof XMLHttpRequest) { - if (xhr.status === 200) { - if (responseType === 'text') { - resolve(xhr.response); - } else { - var reader = new FileReader(); - // $FlowFixMe - reader.addEventListener('load', function () { - return resolve(reader.result); - }, false); - // $FlowFixMe - reader.addEventListener('error', function (e) { - return reject(e); - }, false); - reader.readAsDataURL(xhr.response); - } - } else { - reject( true ? 'Failed to proxy resource ' + src.substring(0, 256) + ' with status code ' + xhr.status : ''); - } - } else { - resolve(xhr.responseText); - } - }; - - xhr.onerror = reject; - xhr.open('GET', proxy + '?url=' + encodeURIComponent(src) + '&responseType=' + responseType); - - if (responseType !== 'text' && xhr instanceof XMLHttpRequest) { - xhr.responseType = responseType; - } - - if (options.imageTimeout) { - var timeout = options.imageTimeout; - xhr.timeout = timeout; - xhr.ontimeout = function () { - return reject( true ? 'Timed out (' + timeout + 'ms) proxying ' + src.substring(0, 256) : ''); - }; - } - - xhr.send(); - }); - }; - - /***/ }), - /* 27 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - var _CanvasRenderer = __webpack_require__(15); - - var _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer); - - var _Logger = __webpack_require__(16); - - var _Logger2 = _interopRequireDefault(_Logger); - - var _Window = __webpack_require__(28); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var html2canvas = function html2canvas(element, conf) { - var config = conf || {}; - var logger = new _Logger2.default(typeof config.logging === 'boolean' ? config.logging : true); - logger.log('html2canvas ' + "1.0.0-alpha.11"); - - if (true && typeof config.onrendered === 'function') { - logger.error('onrendered option is deprecated, html2canvas returns a Promise with the canvas as the value'); - } - - var ownerDocument = element.ownerDocument; - if (!ownerDocument) { - return Promise.reject('Provided element is not within a Document'); - } - var defaultView = ownerDocument.defaultView; - - var defaultOptions = { - async: true, - allowTaint: false, - backgroundColor: '#ffffff', - imageTimeout: 15000, - logging: true, - proxy: null, - removeContainer: true, - foreignObjectRendering: false, - scale: defaultView.devicePixelRatio || 1, - target: new _CanvasRenderer2.default(config.canvas), - useCORS: false, - windowWidth: defaultView.innerWidth, - windowHeight: defaultView.innerHeight, - scrollX: defaultView.pageXOffset, - scrollY: defaultView.pageYOffset - }; - - var result = (0, _Window.renderElement)(element, _extends({}, defaultOptions, config), logger); - - if (true) { - return result.catch(function (e) { - logger.error(e); - throw e; - }); - } - return result; - }; - - html2canvas.CanvasRenderer = _CanvasRenderer2.default; - - module.exports = html2canvas; - - /***/ }), - /* 28 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.renderElement = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _Logger = __webpack_require__(16); - - var _Logger2 = _interopRequireDefault(_Logger); - - var _NodeParser = __webpack_require__(29); - - var _Renderer = __webpack_require__(51); - - var _Renderer2 = _interopRequireDefault(_Renderer); - - var _ForeignObjectRenderer = __webpack_require__(23); - - var _ForeignObjectRenderer2 = _interopRequireDefault(_ForeignObjectRenderer); - - var _Feature = __webpack_require__(10); - - var _Feature2 = _interopRequireDefault(_Feature); - - var _Bounds = __webpack_require__(2); - - var _Clone = __webpack_require__(54); - - var _Font = __webpack_require__(25); - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var renderElement = exports.renderElement = function renderElement(element, options, logger) { - var ownerDocument = element.ownerDocument; - - var windowBounds = new _Bounds.Bounds(options.scrollX, options.scrollY, options.windowWidth, options.windowHeight); - - // http://www.w3.org/TR/css3-background/#special-backgrounds - var documentBackgroundColor = ownerDocument.documentElement ? new _Color2.default(getComputedStyle(ownerDocument.documentElement).backgroundColor) : _Color.TRANSPARENT; - var bodyBackgroundColor = ownerDocument.body ? new _Color2.default(getComputedStyle(ownerDocument.body).backgroundColor) : _Color.TRANSPARENT; - - var backgroundColor = element === ownerDocument.documentElement ? documentBackgroundColor.isTransparent() ? bodyBackgroundColor.isTransparent() ? options.backgroundColor ? new _Color2.default(options.backgroundColor) : null : bodyBackgroundColor : documentBackgroundColor : options.backgroundColor ? new _Color2.default(options.backgroundColor) : null; - - return (options.foreignObjectRendering ? // $FlowFixMe - _Feature2.default.SUPPORT_FOREIGNOBJECT_DRAWING : Promise.resolve(false)).then(function (supportForeignObject) { - return supportForeignObject ? function (cloner) { - if (true) { - logger.log('Document cloned, using foreignObject rendering'); - } - - return cloner.inlineFonts(ownerDocument).then(function () { - return cloner.resourceLoader.ready(); - }).then(function () { - var renderer = new _ForeignObjectRenderer2.default(cloner.documentElement); - - var defaultView = ownerDocument.defaultView; - var scrollX = defaultView.pageXOffset; - var scrollY = defaultView.pageYOffset; - - var isDocument = element.tagName === 'HTML' || element.tagName === 'BODY'; - - var _ref = isDocument ? (0, _Bounds.parseDocumentSize)(ownerDocument) : (0, _Bounds.parseBounds)(element, scrollX, scrollY), - width = _ref.width, - height = _ref.height, - left = _ref.left, - top = _ref.top; - - return renderer.render({ - backgroundColor: backgroundColor, - logger: logger, - scale: options.scale, - x: typeof options.x === 'number' ? options.x : left, - y: typeof options.y === 'number' ? options.y : top, - width: typeof options.width === 'number' ? options.width : Math.ceil(width), - height: typeof options.height === 'number' ? options.height : Math.ceil(height), - windowWidth: options.windowWidth, - windowHeight: options.windowHeight, - scrollX: options.scrollX, - scrollY: options.scrollY - }); - }); - }(new _Clone.DocumentCloner(element, options, logger, true, renderElement)) : (0, _Clone.cloneWindow)(ownerDocument, windowBounds, element, options, logger, renderElement).then(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 3), - container = _ref3[0], - clonedElement = _ref3[1], - resourceLoader = _ref3[2]; - - if (true) { - logger.log('Document cloned, using computed rendering'); - } - - var stack = (0, _NodeParser.NodeParser)(clonedElement, resourceLoader, logger); - var clonedDocument = clonedElement.ownerDocument; - - if (backgroundColor === stack.container.style.background.backgroundColor) { - stack.container.style.background.backgroundColor = _Color.TRANSPARENT; - } - - return resourceLoader.ready().then(function (imageStore) { - var fontMetrics = new _Font.FontMetrics(clonedDocument); - if (true) { - logger.log('Starting renderer'); - } - - var defaultView = clonedDocument.defaultView; - var scrollX = defaultView.pageXOffset; - var scrollY = defaultView.pageYOffset; - - var isDocument = clonedElement.tagName === 'HTML' || clonedElement.tagName === 'BODY'; - - var _ref4 = isDocument ? (0, _Bounds.parseDocumentSize)(ownerDocument) : (0, _Bounds.parseBounds)(clonedElement, scrollX, scrollY), - width = _ref4.width, - height = _ref4.height, - left = _ref4.left, - top = _ref4.top; - - var renderOptions = { - backgroundColor: backgroundColor, - fontMetrics: fontMetrics, - imageStore: imageStore, - logger: logger, - scale: options.scale, - x: typeof options.x === 'number' ? options.x : left, - y: typeof options.y === 'number' ? options.y : top, - width: typeof options.width === 'number' ? options.width : Math.ceil(width), - height: typeof options.height === 'number' ? options.height : Math.ceil(height) - }; - - if (Array.isArray(options.target)) { - return Promise.all(options.target.map(function (target) { - var renderer = new _Renderer2.default(target, renderOptions); - return renderer.render(stack); - })); - } else { - var renderer = new _Renderer2.default(options.target, renderOptions); - var canvas = renderer.render(stack); - if (options.removeContainer === true) { - if (container.parentNode) { - container.parentNode.removeChild(container); - } else if (true) { - logger.log('Cannot detach cloned iframe as it is not in the DOM anymore'); - } - } - - return canvas; - } - }); - }); - }); - }; - - /***/ }), - /* 29 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.NodeParser = undefined; - - var _StackingContext = __webpack_require__(30); - - var _StackingContext2 = _interopRequireDefault(_StackingContext); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _TextContainer = __webpack_require__(9); - - var _TextContainer2 = _interopRequireDefault(_TextContainer); - - var _Input = __webpack_require__(21); - - var _ListItem = __webpack_require__(14); - - var _listStyle = __webpack_require__(8); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var NodeParser = exports.NodeParser = function NodeParser(node, resourceLoader, logger) { - if (true) { - logger.log('Starting node parsing'); - } - - var index = 0; - - var container = new _NodeContainer2.default(node, null, resourceLoader, index++); - var stack = new _StackingContext2.default(container, null, true); - - parseNodeTree(node, container, stack, resourceLoader, index); - - if (true) { - logger.log('Finished parsing node tree'); - } - - return stack; - }; - - var IGNORED_NODE_NAMES = ['SCRIPT', 'HEAD', 'TITLE', 'OBJECT', 'BR', 'OPTION']; - - var parseNodeTree = function parseNodeTree(node, parent, stack, resourceLoader, index) { - if (true && index > 50000) { - throw new Error('Recursion error while parsing node tree'); - } - - for (var childNode = node.firstChild, nextNode; childNode; childNode = nextNode) { - nextNode = childNode.nextSibling; - var defaultView = childNode.ownerDocument.defaultView; - if (childNode instanceof defaultView.Text || childNode instanceof Text || defaultView.parent && childNode instanceof defaultView.parent.Text) { - if (childNode.data.trim().length > 0) { - parent.childNodes.push(_TextContainer2.default.fromTextNode(childNode, parent)); - } - } else if (childNode instanceof defaultView.HTMLElement || childNode instanceof HTMLElement || defaultView.parent && childNode instanceof defaultView.parent.HTMLElement) { - if (IGNORED_NODE_NAMES.indexOf(childNode.nodeName) === -1) { - var container = new _NodeContainer2.default(childNode, parent, resourceLoader, index++); - if (container.isVisible()) { - if (childNode.tagName === 'INPUT') { - // $FlowFixMe - (0, _Input.inlineInputElement)(childNode, container); - } else if (childNode.tagName === 'TEXTAREA') { - // $FlowFixMe - (0, _Input.inlineTextAreaElement)(childNode, container); - } else if (childNode.tagName === 'SELECT') { - // $FlowFixMe - (0, _Input.inlineSelectElement)(childNode, container); - } else if (container.style.listStyle && container.style.listStyle.listStyleType !== _listStyle.LIST_STYLE_TYPE.NONE) { - (0, _ListItem.inlineListItemElement)(childNode, container, resourceLoader); - } - - var SHOULD_TRAVERSE_CHILDREN = childNode.tagName !== 'TEXTAREA'; - var treatAsRealStackingContext = createsRealStackingContext(container, childNode); - if (treatAsRealStackingContext || createsStackingContext(container)) { - // for treatAsRealStackingContext:false, any positioned descendants and descendants - // which actually create a new stacking context should be considered part of the parent stacking context - var parentStack = treatAsRealStackingContext || container.isPositioned() ? stack.getRealParentStackingContext() : stack; - var childStack = new _StackingContext2.default(container, parentStack, treatAsRealStackingContext); - parentStack.contexts.push(childStack); - if (SHOULD_TRAVERSE_CHILDREN) { - parseNodeTree(childNode, container, childStack, resourceLoader, index); - } - } else { - stack.children.push(container); - if (SHOULD_TRAVERSE_CHILDREN) { - parseNodeTree(childNode, container, stack, resourceLoader, index); - } - } - } - } - } else if (childNode instanceof defaultView.SVGSVGElement || childNode instanceof SVGSVGElement || defaultView.parent && childNode instanceof defaultView.parent.SVGSVGElement) { - var _container = new _NodeContainer2.default(childNode, parent, resourceLoader, index++); - var _treatAsRealStackingContext = createsRealStackingContext(_container, childNode); - if (_treatAsRealStackingContext || createsStackingContext(_container)) { - // for treatAsRealStackingContext:false, any positioned descendants and descendants - // which actually create a new stacking context should be considered part of the parent stacking context - var _parentStack = _treatAsRealStackingContext || _container.isPositioned() ? stack.getRealParentStackingContext() : stack; - var _childStack = new _StackingContext2.default(_container, _parentStack, _treatAsRealStackingContext); - _parentStack.contexts.push(_childStack); - } else { - stack.children.push(_container); - } - } - } - }; - - var createsRealStackingContext = function createsRealStackingContext(container, node) { - return container.isRootElement() || container.isPositionedWithZIndex() || container.style.opacity < 1 || container.isTransformed() || isBodyWithTransparentRoot(container, node); - }; - - var createsStackingContext = function createsStackingContext(container) { - return container.isPositioned() || container.isFloating(); - }; - - var isBodyWithTransparentRoot = function isBodyWithTransparentRoot(container, node) { - return node.nodeName === 'BODY' && container.parent instanceof _NodeContainer2.default && container.parent.style.background.backgroundColor.isTransparent(); - }; - - /***/ }), - /* 30 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _position = __webpack_require__(19); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var StackingContext = function () { - function StackingContext(container, parent, treatAsRealStackingContext) { - _classCallCheck(this, StackingContext); - - this.container = container; - this.parent = parent; - this.contexts = []; - this.children = []; - this.treatAsRealStackingContext = treatAsRealStackingContext; - } - - _createClass(StackingContext, [{ - key: 'getOpacity', - value: function getOpacity() { - return this.parent ? this.container.style.opacity * this.parent.getOpacity() : this.container.style.opacity; - } - }, { - key: 'getRealParentStackingContext', - value: function getRealParentStackingContext() { - return !this.parent || this.treatAsRealStackingContext ? this : this.parent.getRealParentStackingContext(); - } - }]); - - return StackingContext; - }(); - - exports.default = StackingContext; - - /***/ }), - /* 31 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Size = function Size(width, height) { - _classCallCheck(this, Size); - - this.width = width; - this.height = height; - }; - - exports.default = Size; - - /***/ }), - /* 32 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Path = __webpack_require__(6); - - var _Vector = __webpack_require__(7); - - var _Vector2 = _interopRequireDefault(_Vector); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var lerp = function lerp(a, b, t) { - return new _Vector2.default(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); - }; - - var BezierCurve = function () { - function BezierCurve(start, startControl, endControl, end) { - _classCallCheck(this, BezierCurve); - - this.type = _Path.PATH.BEZIER_CURVE; - this.start = start; - this.startControl = startControl; - this.endControl = endControl; - this.end = end; - } - - _createClass(BezierCurve, [{ - key: 'subdivide', - value: function subdivide(t, firstHalf) { - var ab = lerp(this.start, this.startControl, t); - var bc = lerp(this.startControl, this.endControl, t); - var cd = lerp(this.endControl, this.end, t); - var abbc = lerp(ab, bc, t); - var bccd = lerp(bc, cd, t); - var dest = lerp(abbc, bccd, t); - return firstHalf ? new BezierCurve(this.start, ab, abbc, dest) : new BezierCurve(dest, bccd, cd, this.end); - } - }, { - key: 'reverse', - value: function reverse() { - return new BezierCurve(this.end, this.endControl, this.startControl, this.start); - } - }]); - - return BezierCurve; - }(); - - exports.default = BezierCurve; - - /***/ }), - /* 33 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseBorderRadius = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var SIDES = ['top-left', 'top-right', 'bottom-right', 'bottom-left']; - - var parseBorderRadius = exports.parseBorderRadius = function parseBorderRadius(style) { - return SIDES.map(function (side) { - var value = style.getPropertyValue('border-' + side + '-radius'); - - var _value$split$map = value.split(' ').map(_Length2.default.create), - _value$split$map2 = _slicedToArray(_value$split$map, 2), - horizontal = _value$split$map2[0], - vertical = _value$split$map2[1]; - - return typeof vertical === 'undefined' ? [horizontal, horizontal] : [horizontal, vertical]; - }); - }; - - /***/ }), - /* 34 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var DISPLAY = exports.DISPLAY = { - NONE: 1 << 0, - BLOCK: 1 << 1, - INLINE: 1 << 2, - RUN_IN: 1 << 3, - FLOW: 1 << 4, - FLOW_ROOT: 1 << 5, - TABLE: 1 << 6, - FLEX: 1 << 7, - GRID: 1 << 8, - RUBY: 1 << 9, - SUBGRID: 1 << 10, - LIST_ITEM: 1 << 11, - TABLE_ROW_GROUP: 1 << 12, - TABLE_HEADER_GROUP: 1 << 13, - TABLE_FOOTER_GROUP: 1 << 14, - TABLE_ROW: 1 << 15, - TABLE_CELL: 1 << 16, - TABLE_COLUMN_GROUP: 1 << 17, - TABLE_COLUMN: 1 << 18, - TABLE_CAPTION: 1 << 19, - RUBY_BASE: 1 << 20, - RUBY_TEXT: 1 << 21, - RUBY_BASE_CONTAINER: 1 << 22, - RUBY_TEXT_CONTAINER: 1 << 23, - CONTENTS: 1 << 24, - INLINE_BLOCK: 1 << 25, - INLINE_LIST_ITEM: 1 << 26, - INLINE_TABLE: 1 << 27, - INLINE_FLEX: 1 << 28, - INLINE_GRID: 1 << 29 - }; - - var parseDisplayValue = function parseDisplayValue(display) { - switch (display) { - case 'block': - return DISPLAY.BLOCK; - case 'inline': - return DISPLAY.INLINE; - case 'run-in': - return DISPLAY.RUN_IN; - case 'flow': - return DISPLAY.FLOW; - case 'flow-root': - return DISPLAY.FLOW_ROOT; - case 'table': - return DISPLAY.TABLE; - case 'flex': - return DISPLAY.FLEX; - case 'grid': - return DISPLAY.GRID; - case 'ruby': - return DISPLAY.RUBY; - case 'subgrid': - return DISPLAY.SUBGRID; - case 'list-item': - return DISPLAY.LIST_ITEM; - case 'table-row-group': - return DISPLAY.TABLE_ROW_GROUP; - case 'table-header-group': - return DISPLAY.TABLE_HEADER_GROUP; - case 'table-footer-group': - return DISPLAY.TABLE_FOOTER_GROUP; - case 'table-row': - return DISPLAY.TABLE_ROW; - case 'table-cell': - return DISPLAY.TABLE_CELL; - case 'table-column-group': - return DISPLAY.TABLE_COLUMN_GROUP; - case 'table-column': - return DISPLAY.TABLE_COLUMN; - case 'table-caption': - return DISPLAY.TABLE_CAPTION; - case 'ruby-base': - return DISPLAY.RUBY_BASE; - case 'ruby-text': - return DISPLAY.RUBY_TEXT; - case 'ruby-base-container': - return DISPLAY.RUBY_BASE_CONTAINER; - case 'ruby-text-container': - return DISPLAY.RUBY_TEXT_CONTAINER; - case 'contents': - return DISPLAY.CONTENTS; - case 'inline-block': - return DISPLAY.INLINE_BLOCK; - case 'inline-list-item': - return DISPLAY.INLINE_LIST_ITEM; - case 'inline-table': - return DISPLAY.INLINE_TABLE; - case 'inline-flex': - return DISPLAY.INLINE_FLEX; - case 'inline-grid': - return DISPLAY.INLINE_GRID; - } - - return DISPLAY.NONE; - }; - - var setDisplayBit = function setDisplayBit(bit, display) { - return bit | parseDisplayValue(display); - }; - - var parseDisplay = exports.parseDisplay = function parseDisplay(display) { - return display.split(' ').reduce(setDisplayBit, 0); - }; - - /***/ }), - /* 35 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var FLOAT = exports.FLOAT = { - NONE: 0, - LEFT: 1, - RIGHT: 2, - INLINE_START: 3, - INLINE_END: 4 - }; - - var parseCSSFloat = exports.parseCSSFloat = function parseCSSFloat(float) { - switch (float) { - case 'left': - return FLOAT.LEFT; - case 'right': - return FLOAT.RIGHT; - case 'inline-start': - return FLOAT.INLINE_START; - case 'inline-end': - return FLOAT.INLINE_END; - } - return FLOAT.NONE; - }; - - /***/ }), - /* 36 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - - var parseFontWeight = function parseFontWeight(weight) { - switch (weight) { - case 'normal': - return 400; - case 'bold': - return 700; - } - - var value = parseInt(weight, 10); - return isNaN(value) ? 400 : value; - }; - - var parseFont = exports.parseFont = function parseFont(style) { - var fontFamily = style.fontFamily; - var fontSize = style.fontSize; - var fontStyle = style.fontStyle; - var fontVariant = style.fontVariant; - var fontWeight = parseFontWeight(style.fontWeight); - - return { - fontFamily: fontFamily, - fontSize: fontSize, - fontStyle: fontStyle, - fontVariant: fontVariant, - fontWeight: fontWeight - }; - }; - - /***/ }), - /* 37 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var parseLetterSpacing = exports.parseLetterSpacing = function parseLetterSpacing(letterSpacing) { - if (letterSpacing === 'normal') { - return 0; - } - var value = parseFloat(letterSpacing); - return isNaN(value) ? 0 : value; - }; - - /***/ }), - /* 38 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var LINE_BREAK = exports.LINE_BREAK = { - NORMAL: 'normal', - STRICT: 'strict' - }; - - var parseLineBreak = exports.parseLineBreak = function parseLineBreak(wordBreak) { - switch (wordBreak) { - case 'strict': - return LINE_BREAK.STRICT; - case 'normal': - default: - return LINE_BREAK.NORMAL; - } - }; - - /***/ }), - /* 39 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseMargin = undefined; - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var SIDES = ['top', 'right', 'bottom', 'left']; - - var parseMargin = exports.parseMargin = function parseMargin(style) { - return SIDES.map(function (side) { - return new _Length2.default(style.getPropertyValue('margin-' + side)); - }); - }; - - /***/ }), - /* 40 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var OVERFLOW = exports.OVERFLOW = { - VISIBLE: 0, - HIDDEN: 1, - SCROLL: 2, - AUTO: 3 - }; - - var parseOverflow = exports.parseOverflow = function parseOverflow(overflow) { - switch (overflow) { - case 'hidden': - return OVERFLOW.HIDDEN; - case 'scroll': - return OVERFLOW.SCROLL; - case 'auto': - return OVERFLOW.AUTO; - case 'visible': - default: - return OVERFLOW.VISIBLE; - } - }; - - /***/ }), - /* 41 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseTextShadow = undefined; - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var NUMBER = /^([+-]|\d|\.)$/i; - - var parseTextShadow = exports.parseTextShadow = function parseTextShadow(textShadow) { - if (textShadow === 'none' || typeof textShadow !== 'string') { - return null; - } - - var currentValue = ''; - var isLength = false; - var values = []; - var shadows = []; - var numParens = 0; - var color = null; - - var appendValue = function appendValue() { - if (currentValue.length) { - if (isLength) { - values.push(parseFloat(currentValue)); - } else { - color = new _Color2.default(currentValue); - } - } - isLength = false; - currentValue = ''; - }; - - var appendShadow = function appendShadow() { - if (values.length && color !== null) { - shadows.push({ - color: color, - offsetX: values[0] || 0, - offsetY: values[1] || 0, - blur: values[2] || 0 - }); - } - values.splice(0, values.length); - color = null; - }; - - for (var i = 0; i < textShadow.length; i++) { - var c = textShadow[i]; - switch (c) { - case '(': - currentValue += c; - numParens++; - break; - case ')': - currentValue += c; - numParens--; - break; - case ',': - if (numParens === 0) { - appendValue(); - appendShadow(); - } else { - currentValue += c; - } - break; - case ' ': - if (numParens === 0) { - appendValue(); - } else { - currentValue += c; - } - break; - default: - if (currentValue.length === 0 && NUMBER.test(c)) { - isLength = true; - } - currentValue += c; - } - } - - appendValue(); - appendShadow(); - - if (shadows.length === 0) { - return null; - } - - return shadows; - }; - - /***/ }), - /* 42 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseTransform = undefined; - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var toFloat = function toFloat(s) { - return parseFloat(s.trim()); - }; - - var MATRIX = /(matrix|matrix3d)\((.+)\)/; - - var parseTransform = exports.parseTransform = function parseTransform(style) { - var transform = parseTransformMatrix(style.transform || style.webkitTransform || style.mozTransform || - // $FlowFixMe - style.msTransform || - // $FlowFixMe - style.oTransform); - if (transform === null) { - return null; - } - - return { - transform: transform, - transformOrigin: parseTransformOrigin(style.transformOrigin || style.webkitTransformOrigin || style.mozTransformOrigin || - // $FlowFixMe - style.msTransformOrigin || - // $FlowFixMe - style.oTransformOrigin) - }; - }; - -// $FlowFixMe - var parseTransformOrigin = function parseTransformOrigin(origin) { - if (typeof origin !== 'string') { - var v = new _Length2.default('0'); - return [v, v]; - } - var values = origin.split(' ').map(_Length2.default.create); - return [values[0], values[1]]; - }; - -// $FlowFixMe - var parseTransformMatrix = function parseTransformMatrix(transform) { - if (transform === 'none' || typeof transform !== 'string') { - return null; - } - - var match = transform.match(MATRIX); - if (match) { - if (match[1] === 'matrix') { - var matrix = match[2].split(',').map(toFloat); - return [matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]]; - } else { - var matrix3d = match[2].split(',').map(toFloat); - return [matrix3d[0], matrix3d[1], matrix3d[4], matrix3d[5], matrix3d[12], matrix3d[13]]; - } - } - return null; - }; - - /***/ }), - /* 43 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var VISIBILITY = exports.VISIBILITY = { - VISIBLE: 0, - HIDDEN: 1, - COLLAPSE: 2 - }; - - var parseVisibility = exports.parseVisibility = function parseVisibility(visibility) { - switch (visibility) { - case 'hidden': - return VISIBILITY.HIDDEN; - case 'collapse': - return VISIBILITY.COLLAPSE; - case 'visible': - default: - return VISIBILITY.VISIBLE; - } - }; - - /***/ }), - /* 44 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var WORD_BREAK = exports.WORD_BREAK = { - NORMAL: 'normal', - BREAK_ALL: 'break-all', - KEEP_ALL: 'keep-all' - }; - - var parseWordBreak = exports.parseWordBreak = function parseWordBreak(wordBreak) { - switch (wordBreak) { - case 'break-all': - return WORD_BREAK.BREAK_ALL; - case 'keep-all': - return WORD_BREAK.KEEP_ALL; - case 'normal': - default: - return WORD_BREAK.NORMAL; - } - }; - - /***/ }), - /* 45 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var parseZIndex = exports.parseZIndex = function parseZIndex(zIndex) { - var auto = zIndex === 'auto'; - return { - auto: auto, - order: auto ? 0 : parseInt(zIndex, 10) - }; - }; - - /***/ }), - /* 46 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _Util = __webpack_require__(13); - - Object.defineProperty(exports, 'toCodePoints', { - enumerable: true, - get: function get() { - return _Util.toCodePoints; - } - }); - Object.defineProperty(exports, 'fromCodePoint', { - enumerable: true, - get: function get() { - return _Util.fromCodePoint; - } - }); - - var _LineBreak = __webpack_require__(47); - - Object.defineProperty(exports, 'LineBreaker', { - enumerable: true, - get: function get() { - return _LineBreak.LineBreaker; - } - }); - - /***/ }), - /* 47 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.LineBreaker = exports.inlineBreakOpportunities = exports.lineBreakAtIndex = exports.codePointsToCharacterClasses = exports.UnicodeTrie = exports.BREAK_ALLOWED = exports.BREAK_NOT_ALLOWED = exports.BREAK_MANDATORY = exports.classes = exports.LETTER_NUMBER_MODIFIER = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _Trie = __webpack_require__(48); - - var _linebreakTrie = __webpack_require__(49); - - var _linebreakTrie2 = _interopRequireDefault(_linebreakTrie); - - var _Util = __webpack_require__(13); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var LETTER_NUMBER_MODIFIER = exports.LETTER_NUMBER_MODIFIER = 50; - -// Non-tailorable Line Breaking Classes - var BK = 1; // Cause a line break (after) - var CR = 2; // Cause a line break (after), except between CR and LF - var LF = 3; // Cause a line break (after) - var CM = 4; // Prohibit a line break between the character and the preceding character - var NL = 5; // Cause a line break (after) - var SG = 6; // Do not occur in well-formed text - var WJ = 7; // Prohibit line breaks before and after - var ZW = 8; // Provide a break opportunity - var GL = 9; // Prohibit line breaks before and after - var SP = 10; // Enable indirect line breaks - var ZWJ = 11; // Prohibit line breaks within joiner sequences -// Break Opportunities - var B2 = 12; // Provide a line break opportunity before and after the character - var BA = 13; // Generally provide a line break opportunity after the character - var BB = 14; // Generally provide a line break opportunity before the character - var HY = 15; // Provide a line break opportunity after the character, except in numeric context - var CB = 16; // Provide a line break opportunity contingent on additional information -// Characters Prohibiting Certain Breaks - var CL = 17; // Prohibit line breaks before - var CP = 18; // Prohibit line breaks before - var EX = 19; // Prohibit line breaks before - var IN = 20; // Allow only indirect line breaks between pairs - var NS = 21; // Allow only indirect line breaks before - var OP = 22; // Prohibit line breaks after - var QU = 23; // Act like they are both opening and closing -// Numeric Context - var IS = 24; // Prevent breaks after any and before numeric - var NU = 25; // Form numeric expressions for line breaking purposes - var PO = 26; // Do not break following a numeric expression - var PR = 27; // Do not break in front of a numeric expression - var SY = 28; // Prevent a break before; and allow a break after -// Other Characters - var AI = 29; // Act like AL when the resolvedEAW is N; otherwise; act as ID - var AL = 30; // Are alphabetic characters or symbols that are used with alphabetic characters - var CJ = 31; // Treat as NS or ID for strict or normal breaking. - var EB = 32; // Do not break from following Emoji Modifier - var EM = 33; // Do not break from preceding Emoji Base - var H2 = 34; // Form Korean syllable blocks - var H3 = 35; // Form Korean syllable blocks - var HL = 36; // Do not break around a following hyphen; otherwise act as Alphabetic - var ID = 37; // Break before or after; except in some numeric context - var JL = 38; // Form Korean syllable blocks - var JV = 39; // Form Korean syllable blocks - var JT = 40; // Form Korean syllable blocks - var RI = 41; // Keep pairs together. For pairs; break before and after other classes - var SA = 42; // Provide a line break opportunity contingent on additional, language-specific context analysis - var XX = 43; // Have as yet unknown line breaking behavior or unassigned code positions - - var classes = exports.classes = { - BK: BK, - CR: CR, - LF: LF, - CM: CM, - NL: NL, - SG: SG, - WJ: WJ, - ZW: ZW, - GL: GL, - SP: SP, - ZWJ: ZWJ, - B2: B2, - BA: BA, - BB: BB, - HY: HY, - CB: CB, - CL: CL, - CP: CP, - EX: EX, - IN: IN, - NS: NS, - OP: OP, - QU: QU, - IS: IS, - NU: NU, - PO: PO, - PR: PR, - SY: SY, - AI: AI, - AL: AL, - CJ: CJ, - EB: EB, - EM: EM, - H2: H2, - H3: H3, - HL: HL, - ID: ID, - JL: JL, - JV: JV, - JT: JT, - RI: RI, - SA: SA, - XX: XX - }; - - var BREAK_MANDATORY = exports.BREAK_MANDATORY = '!'; - var BREAK_NOT_ALLOWED = exports.BREAK_NOT_ALLOWED = '×'; - var BREAK_ALLOWED = exports.BREAK_ALLOWED = '÷'; - var UnicodeTrie = exports.UnicodeTrie = (0, _Trie.createTrieFromBase64)(_linebreakTrie2.default); - - var ALPHABETICS = [AL, HL]; - var HARD_LINE_BREAKS = [BK, CR, LF, NL]; - var SPACE = [SP, ZW]; - var PREFIX_POSTFIX = [PR, PO]; - var LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE); - var KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3]; - var HYPHEN = [HY, BA]; - - var codePointsToCharacterClasses = exports.codePointsToCharacterClasses = function codePointsToCharacterClasses(codePoints) { - var lineBreak = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'strict'; - - var types = []; - var indicies = []; - var categories = []; - codePoints.forEach(function (codePoint, index) { - var classType = UnicodeTrie.get(codePoint); - if (classType > LETTER_NUMBER_MODIFIER) { - categories.push(true); - classType -= LETTER_NUMBER_MODIFIER; - } else { - categories.push(false); - } - - if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) { - // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0 - if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) { - indicies.push(index); - return types.push(CB); - } - } - - if (classType === CM || classType === ZWJ) { - // LB10 Treat any remaining combining mark or ZWJ as AL. - if (index === 0) { - indicies.push(index); - return types.push(AL); - } - - // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of - // the base character in all of the following rules. Treat ZWJ as if it were CM. - var prev = types[index - 1]; - if (LINE_BREAKS.indexOf(prev) === -1) { - indicies.push(indicies[index - 1]); - return types.push(prev); - } - indicies.push(index); - return types.push(AL); - } - - indicies.push(index); - - if (classType === CJ) { - return types.push(lineBreak === 'strict' ? NS : ID); - } - - if (classType === SA) { - return types.push(AL); - } - - if (classType === AI) { - return types.push(AL); - } - - // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL - // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised - // to take into account the actual line breaking properties for these characters. - if (classType === XX) { - if (codePoint >= 0x20000 && codePoint <= 0x2fffd || codePoint >= 0x30000 && codePoint <= 0x3fffd) { - return types.push(ID); - } else { - return types.push(AL); - } - } - - types.push(classType); - }); - - return [indicies, types, categories]; - }; - - var isAdjacentWithSpaceIgnored = function isAdjacentWithSpaceIgnored(a, b, currentIndex, classTypes) { - var current = classTypes[currentIndex]; - if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) { - var i = currentIndex; - while (i <= classTypes.length) { - i++; - var next = classTypes[i]; - - if (next === b) { - return true; - } - - if (next !== SP) { - break; - } - } - } - - if (current === SP) { - var _i = currentIndex; - - while (_i > 0) { - _i--; - var prev = classTypes[_i]; - - if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) { - var n = currentIndex; - while (n <= classTypes.length) { - n++; - var _next = classTypes[n]; - - if (_next === b) { - return true; - } - - if (_next !== SP) { - break; - } - } - } - - if (prev !== SP) { - break; - } - } - } - return false; - }; - - var previousNonSpaceClassType = function previousNonSpaceClassType(currentIndex, classTypes) { - var i = currentIndex; - while (i >= 0) { - var type = classTypes[i]; - if (type === SP) { - i--; - } else { - return type; - } - } - return 0; - }; - - var _lineBreakAtIndex = function _lineBreakAtIndex(codePoints, classTypes, indicies, index, forbiddenBreaks) { - if (indicies[index] === 0) { - return BREAK_NOT_ALLOWED; - } - - var currentIndex = index - 1; - if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) { - return BREAK_NOT_ALLOWED; - } - - var beforeIndex = currentIndex - 1; - var afterIndex = currentIndex + 1; - var current = classTypes[currentIndex]; - - // LB4 Always break after hard line breaks. - // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks. - var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0; - var next = classTypes[afterIndex]; - - if (current === CR && next === LF) { - return BREAK_NOT_ALLOWED; - } - - if (HARD_LINE_BREAKS.indexOf(current) !== -1) { - return BREAK_MANDATORY; - } - - // LB6 Do not break before hard line breaks. - if (HARD_LINE_BREAKS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB7 Do not break before spaces or zero width space. - if (SPACE.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB8 Break before any character following a zero-width space, even if one or more spaces intervene. - if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) { - return BREAK_ALLOWED; - } - - // LB8a Do not break between a zero width joiner and an ideograph, emoji base or emoji modifier. - if (UnicodeTrie.get(codePoints[currentIndex]) === ZWJ && (next === ID || next === EB || next === EM)) { - return BREAK_NOT_ALLOWED; - } - - // LB11 Do not break before or after Word joiner and related characters. - if (current === WJ || next === WJ) { - return BREAK_NOT_ALLOWED; - } - - // LB12 Do not break after NBSP and related characters. - if (current === GL) { - return BREAK_NOT_ALLOWED; - } - - // LB12a Do not break before NBSP and related characters, except after spaces and hyphens. - if ([SP, BA, HY].indexOf(current) === -1 && next === GL) { - return BREAK_NOT_ALLOWED; - } - - // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. - if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB14 Do not break after ‘[’, even after spaces. - if (previousNonSpaceClassType(currentIndex, classTypes) === OP) { - return BREAK_NOT_ALLOWED; - } - - // LB15 Do not break within ‘”[’, even with intervening spaces. - if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) { - return BREAK_NOT_ALLOWED; - } - - // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces. - if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) { - return BREAK_NOT_ALLOWED; - } - - // LB17 Do not break within ‘——’, even with intervening spaces. - if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) { - return BREAK_NOT_ALLOWED; - } - - // LB18 Break after spaces. - if (current === SP) { - return BREAK_ALLOWED; - } - - // LB19 Do not break before or after quotation marks, such as ‘ ” ’. - if (current === QU || next === QU) { - return BREAK_NOT_ALLOWED; - } - - // LB20 Break before and after unresolved CB. - if (next === CB || current === CB) { - return BREAK_ALLOWED; - } - - // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents. - if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) { - return BREAK_NOT_ALLOWED; - } - - // LB21a Don't break after Hebrew + Hyphen. - if (before === HL && HYPHEN.indexOf(current) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB21b Don’t break between Solidus and Hebrew letters. - if (current === SY && next === HL) { - return BREAK_NOT_ALLOWED; - } - - // LB22 Do not break between two ellipses, or between letters, numbers or exclamations and ellipsis. - if (next === IN && ALPHABETICS.concat(IN, EX, NU, ID, EB, EM).indexOf(current) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB23 Do not break between digits and letters. - if (ALPHABETICS.indexOf(next) !== -1 && current === NU || ALPHABETICS.indexOf(current) !== -1 && next === NU) { - return BREAK_NOT_ALLOWED; - } - - // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes. - if (current === PR && [ID, EB, EM].indexOf(next) !== -1 || [ID, EB, EM].indexOf(current) !== -1 && next === PO) { - return BREAK_NOT_ALLOWED; - } - - // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix. - if (ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1 || PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB25 Do not break between the following pairs of classes relevant to numbers: - if ( - // (PR | PO) × ( OP | HY )? NU - [PR, PO].indexOf(current) !== -1 && (next === NU || [OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU) || - // ( OP | HY ) × NU - [OP, HY].indexOf(current) !== -1 && next === NU || - // NU × (NU | SY | IS) - current === NU && [NU, SY, IS].indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP) - if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) { - var prevIndex = currentIndex; - while (prevIndex >= 0) { - var type = classTypes[prevIndex]; - if (type === NU) { - return BREAK_NOT_ALLOWED; - } else if ([SY, IS].indexOf(type) !== -1) { - prevIndex--; - } else { - break; - } - } - } - - // NU (NU | SY | IS)* (CL | CP)? × (PO | PR)) - if ([PR, PO].indexOf(next) !== -1) { - var _prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex; - while (_prevIndex >= 0) { - var _type = classTypes[_prevIndex]; - if (_type === NU) { - return BREAK_NOT_ALLOWED; - } else if ([SY, IS].indexOf(_type) !== -1) { - _prevIndex--; - } else { - break; - } - } - } - - // LB26 Do not break a Korean syllable. - if (JL === current && [JL, JV, H2, H3].indexOf(next) !== -1 || [JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1 || [JT, H3].indexOf(current) !== -1 && next === JT) { - return BREAK_NOT_ALLOWED; - } - - // LB27 Treat a Korean Syllable Block the same as ID. - if (KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1 || KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR) { - return BREAK_NOT_ALLOWED; - } - - // LB28 Do not break between alphabetics (“at”). - if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”). - if (current === IS && ALPHABETICS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses. - if (ALPHABETICS.concat(NU).indexOf(current) !== -1 && next === OP || ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP) { - return BREAK_NOT_ALLOWED; - } - - // LB30a Break between two regional indicator symbols if and only if there are an even number of regional - // indicators preceding the position of the break. - if (current === RI && next === RI) { - var i = indicies[currentIndex]; - var count = 1; - while (i > 0) { - i--; - if (classTypes[i] === RI) { - count++; - } else { - break; - } - } - if (count % 2 !== 0) { - return BREAK_NOT_ALLOWED; - } - } - - // LB30b Do not break between an emoji base and an emoji modifier. - if (current === EB && next === EM) { - return BREAK_NOT_ALLOWED; - } - - return BREAK_ALLOWED; - }; - - var lineBreakAtIndex = exports.lineBreakAtIndex = function lineBreakAtIndex(codePoints, index) { - // LB2 Never break at the start of text. - if (index === 0) { - return BREAK_NOT_ALLOWED; - } - - // LB3 Always break at the end of text. - if (index >= codePoints.length) { - return BREAK_MANDATORY; - } - - var _codePointsToCharacte = codePointsToCharacterClasses(codePoints), - _codePointsToCharacte2 = _slicedToArray(_codePointsToCharacte, 2), - indicies = _codePointsToCharacte2[0], - classTypes = _codePointsToCharacte2[1]; - - return _lineBreakAtIndex(codePoints, classTypes, indicies, index); - }; - - var cssFormattedClasses = function cssFormattedClasses(codePoints, options) { - if (!options) { - options = { lineBreak: 'normal', wordBreak: 'normal' }; - } - - var _codePointsToCharacte3 = codePointsToCharacterClasses(codePoints, options.lineBreak), - _codePointsToCharacte4 = _slicedToArray(_codePointsToCharacte3, 3), - indicies = _codePointsToCharacte4[0], - classTypes = _codePointsToCharacte4[1], - isLetterNumber = _codePointsToCharacte4[2]; - - if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') { - classTypes = classTypes.map(function (type) { - return [NU, AL, SA].indexOf(type) !== -1 ? ID : type; - }); - } - - var forbiddenBreakpoints = options.wordBreak === 'keep-all' ? isLetterNumber.map(function (isLetterNumber, i) { - return isLetterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff; - }) : null; - - return [indicies, classTypes, forbiddenBreakpoints]; - }; - - var inlineBreakOpportunities = exports.inlineBreakOpportunities = function inlineBreakOpportunities(str, options) { - var codePoints = (0, _Util.toCodePoints)(str); - var output = BREAK_NOT_ALLOWED; - - var _cssFormattedClasses = cssFormattedClasses(codePoints, options), - _cssFormattedClasses2 = _slicedToArray(_cssFormattedClasses, 3), - indicies = _cssFormattedClasses2[0], - classTypes = _cssFormattedClasses2[1], - forbiddenBreakpoints = _cssFormattedClasses2[2]; - - codePoints.forEach(function (codePoint, i) { - output += (0, _Util.fromCodePoint)(codePoint) + (i >= codePoints.length - 1 ? BREAK_MANDATORY : _lineBreakAtIndex(codePoints, classTypes, indicies, i + 1, forbiddenBreakpoints)); - }); - - return output; - }; - - var Break = function () { - function Break(codePoints, lineBreak, start, end) { - _classCallCheck(this, Break); - - this._codePoints = codePoints; - this.required = lineBreak === BREAK_MANDATORY; - this.start = start; - this.end = end; - } - - _createClass(Break, [{ - key: 'slice', - value: function slice() { - return _Util.fromCodePoint.apply(undefined, _toConsumableArray(this._codePoints.slice(this.start, this.end))); - } - }]); - - return Break; - }(); - - var LineBreaker = exports.LineBreaker = function LineBreaker(str, options) { - var codePoints = (0, _Util.toCodePoints)(str); - - var _cssFormattedClasses3 = cssFormattedClasses(codePoints, options), - _cssFormattedClasses4 = _slicedToArray(_cssFormattedClasses3, 3), - indicies = _cssFormattedClasses4[0], - classTypes = _cssFormattedClasses4[1], - forbiddenBreakpoints = _cssFormattedClasses4[2]; - - var length = codePoints.length; - var lastEnd = 0; - var nextIndex = 0; - - return { - next: function next() { - if (nextIndex >= length) { - return { done: true }; - } - var lineBreak = BREAK_NOT_ALLOWED; - while (nextIndex < length && (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) === BREAK_NOT_ALLOWED) {} - - if (lineBreak !== BREAK_NOT_ALLOWED || nextIndex === length) { - var value = new Break(codePoints, lineBreak, lastEnd, nextIndex); - lastEnd = nextIndex; - return { value: value, done: false }; - } - - return { done: true }; - } - }; - }; - - /***/ }), - /* 48 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.Trie = exports.createTrieFromBase64 = exports.UTRIE2_INDEX_2_MASK = exports.UTRIE2_INDEX_2_BLOCK_LENGTH = exports.UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = exports.UTRIE2_INDEX_1_OFFSET = exports.UTRIE2_UTF8_2B_INDEX_2_LENGTH = exports.UTRIE2_UTF8_2B_INDEX_2_OFFSET = exports.UTRIE2_INDEX_2_BMP_LENGTH = exports.UTRIE2_LSCP_INDEX_2_LENGTH = exports.UTRIE2_DATA_MASK = exports.UTRIE2_DATA_BLOCK_LENGTH = exports.UTRIE2_LSCP_INDEX_2_OFFSET = exports.UTRIE2_SHIFT_1_2 = exports.UTRIE2_INDEX_SHIFT = exports.UTRIE2_SHIFT_1 = exports.UTRIE2_SHIFT_2 = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Util = __webpack_require__(13); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - /** Shift size for getting the index-2 table offset. */ - var UTRIE2_SHIFT_2 = exports.UTRIE2_SHIFT_2 = 5; - - /** Shift size for getting the index-1 table offset. */ - var UTRIE2_SHIFT_1 = exports.UTRIE2_SHIFT_1 = 6 + 5; - - /** - * Shift size for shifting left the index array values. - * Increases possible data size with 16-bit index values at the cost - * of compactability. - * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY. - */ - var UTRIE2_INDEX_SHIFT = exports.UTRIE2_INDEX_SHIFT = 2; - - /** - * Difference between the two shift sizes, - * for getting an index-1 offset from an index-2 offset. 6=11-5 - */ - var UTRIE2_SHIFT_1_2 = exports.UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2; - - /** - * The part of the index-2 table for U+D800..U+DBFF stores values for - * lead surrogate code _units_ not code _points_. - * Values for lead surrogate code _points_ are indexed with this portion of the table. - * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.) - */ - var UTRIE2_LSCP_INDEX_2_OFFSET = exports.UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2; - - /** Number of entries in a data block. 32=0x20 */ - var UTRIE2_DATA_BLOCK_LENGTH = exports.UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2; - /** Mask for getting the lower bits for the in-data-block offset. */ - var UTRIE2_DATA_MASK = exports.UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1; - - var UTRIE2_LSCP_INDEX_2_LENGTH = exports.UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2; - /** Count the lengths of both BMP pieces. 2080=0x820 */ - var UTRIE2_INDEX_2_BMP_LENGTH = exports.UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH; - /** - * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820. - * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2. - */ - var UTRIE2_UTF8_2B_INDEX_2_OFFSET = exports.UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH; - var UTRIE2_UTF8_2B_INDEX_2_LENGTH = exports.UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */ - /** - * The index-1 table, only used for supplementary code points, at offset 2112=0x840. - * Variable length, for code points up to highStart, where the last single-value range starts. - * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1. - * (For 0x100000 supplementary code points U+10000..U+10ffff.) - * - * The part of the index-2 table for supplementary code points starts - * after this index-1 table. - * - * Both the index-1 table and the following part of the index-2 table - * are omitted completely if there is only BMP data. - */ - var UTRIE2_INDEX_1_OFFSET = exports.UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH; - - /** - * Number of index-1 entries for the BMP. 32=0x20 - * This part of the index-1 table is omitted from the serialized form. - */ - var UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = exports.UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1; - - /** Number of entries in an index-2 block. 64=0x40 */ - var UTRIE2_INDEX_2_BLOCK_LENGTH = exports.UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2; - /** Mask for getting the lower bits for the in-index-2-block offset. */ - var UTRIE2_INDEX_2_MASK = exports.UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1; - - var createTrieFromBase64 = exports.createTrieFromBase64 = function createTrieFromBase64(base64) { - var buffer = (0, _Util.decode)(base64); - var view32 = Array.isArray(buffer) ? (0, _Util.polyUint32Array)(buffer) : new Uint32Array(buffer); - var view16 = Array.isArray(buffer) ? (0, _Util.polyUint16Array)(buffer) : new Uint16Array(buffer); - var headerLength = 24; - - var index = view16.slice(headerLength / 2, view32[4] / 2); - var data = view32[5] === 2 ? view16.slice((headerLength + view32[4]) / 2) : view32.slice(Math.ceil((headerLength + view32[4]) / 4)); - - return new Trie(view32[0], view32[1], view32[2], view32[3], index, data); - }; - - var Trie = exports.Trie = function () { - function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) { - _classCallCheck(this, Trie); - - this.initialValue = initialValue; - this.errorValue = errorValue; - this.highStart = highStart; - this.highValueIndex = highValueIndex; - this.index = index; - this.data = data; - } - - /** - * Get the value for a code point as stored in the Trie. - * - * @param codePoint the code point - * @return the value - */ - - - _createClass(Trie, [{ - key: 'get', - value: function get(codePoint) { - var ix = void 0; - if (codePoint >= 0) { - if (codePoint < 0x0d800 || codePoint > 0x0dbff && codePoint <= 0x0ffff) { - // Ordinary BMP code point, excluding leading surrogates. - // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. - // 16 bit data is stored in the index array itself. - ix = this.index[codePoint >> UTRIE2_SHIFT_2]; - ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); - return this.data[ix]; - } - - if (codePoint <= 0xffff) { - // Lead Surrogate Code Point. A Separate index section is stored for - // lead surrogate code units and code points. - // The main index has the code unit data. - // For this function, we need the code point data. - // Note: this expression could be refactored for slightly improved efficiency, but - // surrogate code points will be so rare in practice that it's not worth it. - ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + (codePoint - 0xd800 >> UTRIE2_SHIFT_2)]; - ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); - return this.data[ix]; - } - - if (codePoint < this.highStart) { - // Supplemental code point, use two-level lookup. - ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1); - ix = this.index[ix]; - ix += codePoint >> UTRIE2_SHIFT_2 & UTRIE2_INDEX_2_MASK; - ix = this.index[ix]; - ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); - return this.data[ix]; - } - if (codePoint <= 0x10ffff) { - return this.data[this.highValueIndex]; - } - } - - // Fall through. The code point is outside of the legal range of 0..0x10ffff. - return this.errorValue; - } - }]); - - return Trie; - }(); - - /***/ }), - /* 49 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - module.exports = 'KwAAAAAAAAAACA4AIDoAAPAfAAACAAAAAAAIABAAGABAAEgAUABYAF4AZgBeAGYAYABoAHAAeABeAGYAfACEAIAAiACQAJgAoACoAK0AtQC9AMUAXgBmAF4AZgBeAGYAzQDVAF4AZgDRANkA3gDmAOwA9AD8AAQBDAEUARoBIgGAAIgAJwEvATcBPwFFAU0BTAFUAVwBZAFsAXMBewGDATAAiwGTAZsBogGkAawBtAG8AcIBygHSAdoB4AHoAfAB+AH+AQYCDgIWAv4BHgImAi4CNgI+AkUCTQJTAlsCYwJrAnECeQKBAk0CiQKRApkCoQKoArACuALAAsQCzAIwANQC3ALkAjAA7AL0AvwCAQMJAxADGAMwACADJgMuAzYDPgOAAEYDSgNSA1IDUgNaA1oDYANiA2IDgACAAGoDgAByA3YDfgOAAIQDgACKA5IDmgOAAIAAogOqA4AAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAK8DtwOAAIAAvwPHA88D1wPfAyAD5wPsA/QD/AOAAIAABAQMBBIEgAAWBB4EJgQuBDMEIAM7BEEEXgBJBCADUQRZBGEEaQQwADAAcQQ+AXkEgQSJBJEEgACYBIAAoASoBK8EtwQwAL8ExQSAAIAAgACAAIAAgACgAM0EXgBeAF4AXgBeAF4AXgBeANUEXgDZBOEEXgDpBPEE+QQBBQkFEQUZBSEFKQUxBTUFPQVFBUwFVAVcBV4AYwVeAGsFcwV7BYMFiwWSBV4AmgWgBacFXgBeAF4AXgBeAKsFXgCyBbEFugW7BcIFwgXIBcIFwgXQBdQF3AXkBesF8wX7BQMGCwYTBhsGIwYrBjMGOwZeAD8GRwZNBl4AVAZbBl4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAGMGXgBqBnEGXgBeAF4AXgBeAF4AXgBeAF4AXgB5BoAG4wSGBo4GkwaAAIADHgR5AF4AXgBeAJsGgABGA4AAowarBrMGswagALsGwwbLBjAA0wbaBtoG3QbaBtoG2gbaBtoG2gblBusG8wb7BgMHCwcTBxsHCwcjBysHMAc1BzUHOgdCB9oGSgdSB1oHYAfaBloHaAfaBlIH2gbaBtoG2gbaBtoG2gbaBjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHbQdeAF4ANQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQd1B30HNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B4MH2gaKB68EgACAAIAAgACAAIAAgACAAI8HlwdeAJ8HpweAAIAArwe3B14AXgC/B8UHygcwANAH2AfgB4AA6AfwBz4B+AcACFwBCAgPCBcIogEYAR8IJwiAAC8INwg/CCADRwhPCFcIXwhnCEoDGgSAAIAAgABvCHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIhAiLCI4IMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAANQc1BzUHNQc1BzUHNQc1BzUHNQc1B54INQc1B6II2gaqCLIIugiAAIAAvgjGCIAAgACAAIAAgACAAIAAgACAAIAAywiHAYAA0wiAANkI3QjlCO0I9Aj8CIAAgACAAAIJCgkSCRoJIgknCTYHLwk3CZYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiAAIAAAAFAAXgBeAGAAcABeAHwAQACQAKAArQC9AJ4AXgBeAE0A3gBRAN4A7AD8AMwBGgEAAKcBNwEFAUwBXAF4QkhCmEKnArcCgAHHAsABz4LAAcABwAHAAd+C6ABoAG+C/4LAAcABwAHAAc+DF4MAAcAB54M3gweDV4Nng3eDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEeDqABVg6WDqABoQ6gAaABoAHXDvcONw/3DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DncPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB7cPPwlGCU4JMACAAIAAgABWCV4JYQmAAGkJcAl4CXwJgAkwADAAMAAwAIgJgACLCZMJgACZCZ8JowmrCYAAswkwAF4AXgB8AIAAuwkABMMJyQmAAM4JgADVCTAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAqwYWBNkIMAAwADAAMADdCeAJ6AnuCR4E9gkwAP4JBQoNCjAAMACAABUK0wiAAB0KJAosCjQKgAAwADwKQwqAAEsKvQmdCVMKWwowADAAgACAALcEMACAAGMKgABrCjAAMAAwADAAMAAwADAAMAAwADAAMAAeBDAAMAAwADAAMAAwADAAMAAwADAAMAAwAIkEPQFzCnoKiQSCCooKkAqJBJgKoAqkCokEGAGsCrQKvArBCjAAMADJCtEKFQHZCuEK/gHpCvEKMAAwADAAMACAAIwE+QowAIAAPwEBCzAAMAAwADAAMACAAAkLEQswAIAAPwEZCyELgAAOCCkLMAAxCzkLMAAwADAAMAAwADAAXgBeAEELMAAwADAAMAAwADAAMAAwAEkLTQtVC4AAXAtkC4AAiQkwADAAMAAwADAAMAAwADAAbAtxC3kLgAuFC4sLMAAwAJMLlwufCzAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAApwswADAAMACAAIAAgACvC4AAgACAAIAAgACAALcLMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAvwuAAMcLgACAAIAAgACAAIAAyguAAIAAgACAAIAA0QswADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAANkLgACAAIAA4AswADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACJCR4E6AswADAAhwHwC4AA+AsADAgMEAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMACAAIAAGAwdDCUMMAAwAC0MNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQw1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHPQwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADUHNQc1BzUHNQc1BzUHNQc2BzAAMAA5DDUHNQc1BzUHNQc1BzUHNQc1BzUHNQdFDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAATQxSDFoMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAF4AXgBeAF4AXgBeAF4AYgxeAGoMXgBxDHkMfwxeAIUMXgBeAI0MMAAwADAAMAAwAF4AXgCVDJ0MMAAwADAAMABeAF4ApQxeAKsMswy7DF4Awgy9DMoMXgBeAF4AXgBeAF4AXgBeAF4AXgDRDNkMeQBqCeAM3Ax8AOYM7Az0DPgMXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgCgAAANoAAHDQ4NFg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAeDSYNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAC4NMABeAF4ANg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD4NRg1ODVYNXg1mDTAAbQ0wADAAMAAwADAAMAAwADAA2gbaBtoG2gbaBtoG2gbaBnUNeg3CBYANwgWFDdoGjA3aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gaUDZwNpA2oDdoG2gawDbcNvw3HDdoG2gbPDdYN3A3fDeYN2gbsDfMN2gbaBvoN/g3aBgYODg7aBl4AXgBeABYOXgBeACUG2gYeDl4AJA5eACwO2w3aBtoGMQ45DtoG2gbaBtoGQQ7aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B1EO2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQdZDjUHNQc1BzUHNQc1B2EONQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHaA41BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B3AO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B2EO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBkkOeA6gAKAAoAAwADAAMAAwAKAAoACgAKAAoACgAKAAgA4wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAD//wQABAAEAAQABAAEAAQABAAEAA0AAwABAAEAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAKABMAFwAeABsAGgAeABcAFgASAB4AGwAYAA8AGAAcAEsASwBLAEsASwBLAEsASwBLAEsAGAAYAB4AHgAeABMAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAFgAbABIAHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYADQARAB4ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkAFgAaABsAGwAbAB4AHQAdAB4ATwAXAB4ADQAeAB4AGgAbAE8ATwAOAFAAHQAdAB0ATwBPABcATwBPAE8AFgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwArAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAAQABAANAA0ASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAUAArACsAKwArACsAKwArACsABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAGgAaAFAAUABQAFAAUABMAB4AGwBQAB4AKwArACsABAAEAAQAKwBQAFAAUABQAFAAUAArACsAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUAArAFAAUAArACsABAArAAQABAAEAAQABAArACsAKwArAAQABAArACsABAAEAAQAKwArACsABAArACsAKwArACsAKwArAFAAUABQAFAAKwBQACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwAEAAQAUABQAFAABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQAKwArAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeABsAKwArACsAKwArACsAKwBQAAQABAAEAAQABAAEACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAKwArACsAKwArACsAKwArAAQABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwAEAFAAKwBQAFAAUABQAFAAUAArACsAKwBQAFAAUAArAFAAUABQAFAAKwArACsAUABQACsAUAArAFAAUAArACsAKwBQAFAAKwArACsAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQAKwArACsABAAEAAQAKwAEAAQABAAEACsAKwBQACsAKwArACsAKwArAAQAKwArACsAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAB4AHgAeAB4AHgAeABsAHgArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArAFAAUABQACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAB4AUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArACsAKwArACsAKwArAFAAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwArAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAKwBcAFwAKwBcACsAKwBcACsAKwArACsAKwArAFwAXABcAFwAKwBcAFwAXABcAFwAXABcACsAXABcAFwAKwBcACsAXAArACsAXABcACsAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgArACoAKgBcACsAKwBcAFwAXABcAFwAKwBcACsAKgAqACoAKgAqACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAFwAXABcAFwAUAAOAA4ADgAOAB4ADgAOAAkADgAOAA0ACQATABMAEwATABMACQAeABMAHgAeAB4ABAAEAB4AHgAeAB4AHgAeAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUAANAAQAHgAEAB4ABAAWABEAFgARAAQABABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAAQABAAEAAQABAANAAQABABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsADQANAB4AHgAeAB4AHgAeAAQAHgAeAB4AHgAeAB4AKwAeAB4ADgAOAA0ADgAeAB4AHgAeAB4ACQAJACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgAeAB4AHgBcAFwAXABcAFwAXAAqACoAKgAqAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAKgAqACoAKgAqACoAKgBcAFwAXAAqACoAKgAqAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAXAAqAEsASwBLAEsASwBLAEsASwBLAEsAKgAqACoAKgAqACoAUABQAFAAUABQAFAAKwBQACsAKwArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQACsAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwAEAAQABAAeAA0AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAEQArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAADQANAA0AUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAA0ADQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoADQANABUAXAANAB4ADQAbAFwAKgArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAB4AHgATABMADQANAA4AHgATABMAHgAEAAQABAAJACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAUABQAFAAUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwAeACsAKwArABMAEwBLAEsASwBLAEsASwBLAEsASwBLAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwBcAFwAXABcAFwAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcACsAKwArACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwAeAB4AXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsABABLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKgAqACoAKgAqACoAKgBcACoAKgAqACoAKgAqACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAUABQAFAAUABQAFAAUAArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4ADQANAA0ADQAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAHgAeAB4AHgBQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwANAA0ADQANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwBQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsABAAEAAQAHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAABABQAFAAUABQAAQABAAEAFAAUAAEAAQABAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAKwBQACsAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAKwArAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAKwAeAB4AHgAeAB4AHgAeAA4AHgArAA0ADQANAA0ADQANAA0ACQANAA0ADQAIAAQACwAEAAQADQAJAA0ADQAMAB0AHQAeABcAFwAWABcAFwAXABYAFwAdAB0AHgAeABQAFAAUAA0AAQABAAQABAAEAAQABAAJABoAGgAaABoAGgAaABoAGgAeABcAFwAdABUAFQAeAB4AHgAeAB4AHgAYABYAEQAVABUAFQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgANAB4ADQANAA0ADQAeAA0ADQANAAcAHgAeAB4AHgArAAQABAAEAAQABAAEAAQABAAEAAQAUABQACsAKwBPAFAAUABQAFAAUAAeAB4AHgAWABEATwBQAE8ATwBPAE8AUABQAFAAUABQAB4AHgAeABYAEQArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGgAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgBQABoAHgAdAB4AUAAeABoAHgAeAB4AHgAeAB4AHgAeAB4ATwAeAFAAGwAeAB4AUABQAFAAUABQAB4AHgAeAB0AHQAeAFAAHgBQAB4AUAAeAFAATwBQAFAAHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AUABQAFAAUABPAE8AUABQAFAAUABQAE8AUABQAE8AUABPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAE8ATwBPAE8ATwBPAE8ATwBPAE8AUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAATwAeAB4AKwArACsAKwAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB0AHQAeAB4AHgAdAB0AHgAeAB0AHgAeAB4AHQAeAB0AGwAbAB4AHQAeAB4AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB0AHgAdAB4AHQAdAB0AHQAdAB0AHgAdAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAdAB0AHQAdAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAlACUAHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB0AHQAeAB4AHgAeAB0AHQAdAB4AHgAdAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB0AHQAeAB4AHQAeAB4AHgAeAB0AHQAeAB4AHgAeACUAJQAdAB0AJQAeACUAJQAlACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHQAdAB0AHgAdACUAHQAdAB4AHQAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHQAdAB0AHQAlAB4AJQAlACUAHQAlACUAHQAdAB0AJQAlAB0AHQAlAB0AHQAlACUAJQAeAB0AHgAeAB4AHgAdAB0AJQAdAB0AHQAdAB0AHQAlACUAJQAlACUAHQAlACUAIAAlAB0AHQAlACUAJQAlACUAJQAlACUAHgAeAB4AJQAlACAAIAAgACAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeABcAFwAXABcAFwAXAB4AEwATACUAHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACUAJQBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwArACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAE8ATwBPAE8ATwBPAE8ATwAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeACsAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUAArACsAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQBQAFAAUABQACsAKwArACsAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAABAAEAAQAKwAEAAQAKwArACsAKwArAAQABAAEAAQAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsABAAEAAQAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsADQANAA0ADQANAA0ADQANAB4AKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAUABQAFAAUABQAA0ADQANAA0ADQANABQAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwANAA0ADQANAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAeAAQABAAEAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLACsADQArAB4AKwArAAQABAAEAAQAUABQAB4AUAArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwAEAAQABAAEAAQABAAEAAQABAAOAA0ADQATABMAHgAeAB4ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0AUABQAFAAUAAEAAQAKwArAAQADQANAB4AUAArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXABcAA0ADQANACoASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUAArACsAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANACsADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEcARwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwAeAAQABAANAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAEAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUAArACsAUAArACsAUABQACsAKwBQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAeAB4ADQANAA0ADQAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAArAAQABAArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAEAAQABAAEAAQABAAEACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAFgAWAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAKwBQACsAKwArACsAKwArAFAAKwArACsAKwBQACsAUAArAFAAKwBQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQACsAUAArAFAAKwBQACsAUABQACsAUAArACsAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAUABQAFAAUAArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUAArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAlACUAJQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeACUAJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeACUAJQAlACUAJQAeACUAJQAlACUAJQAgACAAIAAlACUAIAAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIQAhACEAIQAhACUAJQAgACAAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAIAAlACUAJQAlACAAJQAgACAAIAAgACAAIAAgACAAIAAlACUAJQAgACUAJQAlACUAIAAgACAAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeACUAHgAlAB4AJQAlACUAJQAlACAAJQAlACUAJQAeACUAHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAIAAgACAAIAAgAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFwAXABcAFQAVABUAHgAeAB4AHgAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAlACAAIAAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsA'; - - /***/ }), - /* 50 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _Path = __webpack_require__(6); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Circle = function Circle(x, y, radius) { - _classCallCheck(this, Circle); - - this.type = _Path.PATH.CIRCLE; - this.x = x; - this.y = y; - this.radius = radius; - if (true) { - if (isNaN(x)) { - console.error('Invalid x value given for Circle'); - } - if (isNaN(y)) { - console.error('Invalid y value given for Circle'); - } - if (isNaN(radius)) { - console.error('Invalid radius value given for Circle'); - } - } - }; - - exports.default = Circle; - - /***/ }), - /* 51 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Bounds = __webpack_require__(2); - - var _Font = __webpack_require__(25); - - var _Gradient = __webpack_require__(52); - - var _TextContainer = __webpack_require__(9); - - var _TextContainer2 = _interopRequireDefault(_TextContainer); - - var _background = __webpack_require__(5); - - var _border = __webpack_require__(12); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Renderer = function () { - function Renderer(target, options) { - _classCallCheck(this, Renderer); - - this.target = target; - this.options = options; - target.render(options); - } - - _createClass(Renderer, [{ - key: 'renderNode', - value: function renderNode(container) { - if (container.isVisible()) { - this.renderNodeBackgroundAndBorders(container); - this.renderNodeContent(container); - } - } - }, { - key: 'renderNodeContent', - value: function renderNodeContent(container) { - var _this = this; - - var callback = function callback() { - if (container.childNodes.length) { - container.childNodes.forEach(function (child) { - if (child instanceof _TextContainer2.default) { - var style = child.parent.style; - _this.target.renderTextNode(child.bounds, style.color, style.font, style.textDecoration, style.textShadow); - } else { - _this.target.drawShape(child, container.style.color); - } - }); - } - - if (container.image) { - var _image = _this.options.imageStore.get(container.image); - if (_image) { - var contentBox = (0, _Bounds.calculateContentBox)(container.bounds, container.style.padding, container.style.border); - var _width = typeof _image.width === 'number' && _image.width > 0 ? _image.width : contentBox.width; - var _height = typeof _image.height === 'number' && _image.height > 0 ? _image.height : contentBox.height; - if (_width > 0 && _height > 0) { - _this.target.clip([(0, _Bounds.calculatePaddingBoxPath)(container.curvedBounds)], function () { - _this.target.drawImage(_image, new _Bounds.Bounds(0, 0, _width, _height), contentBox); - }); - } - } - } - }; - var paths = container.getClipPaths(); - if (paths.length) { - this.target.clip(paths, callback); - } else { - callback(); - } - } - }, { - key: 'renderNodeBackgroundAndBorders', - value: function renderNodeBackgroundAndBorders(container) { - var _this2 = this; - - var HAS_BACKGROUND = !container.style.background.backgroundColor.isTransparent() || container.style.background.backgroundImage.length; - - var hasRenderableBorders = container.style.border.some(function (border) { - return border.borderStyle !== _border.BORDER_STYLE.NONE && !border.borderColor.isTransparent(); - }); - - var callback = function callback() { - var backgroundPaintingArea = (0, _background.calculateBackgroungPaintingArea)(container.curvedBounds, container.style.background.backgroundClip); - - if (HAS_BACKGROUND) { - _this2.target.clip([backgroundPaintingArea], function () { - if (!container.style.background.backgroundColor.isTransparent()) { - _this2.target.fill(container.style.background.backgroundColor); - } - - _this2.renderBackgroundImage(container); - }); - } - - container.style.border.forEach(function (border, side) { - if (border.borderStyle !== _border.BORDER_STYLE.NONE && !border.borderColor.isTransparent()) { - _this2.renderBorder(border, side, container.curvedBounds); - } - }); - }; - - if (HAS_BACKGROUND || hasRenderableBorders) { - var paths = container.parent ? container.parent.getClipPaths() : []; - if (paths.length) { - this.target.clip(paths, callback); - } else { - callback(); - } - } - } - }, { - key: 'renderBackgroundImage', - value: function renderBackgroundImage(container) { - var _this3 = this; - - container.style.background.backgroundImage.slice(0).reverse().forEach(function (backgroundImage) { - if (backgroundImage.source.method === 'url' && backgroundImage.source.args.length) { - _this3.renderBackgroundRepeat(container, backgroundImage); - } else if (/gradient/i.test(backgroundImage.source.method)) { - _this3.renderBackgroundGradient(container, backgroundImage); - } - }); - } - }, { - key: 'renderBackgroundRepeat', - value: function renderBackgroundRepeat(container, background) { - var image = this.options.imageStore.get(background.source.args[0]); - if (image) { - var backgroundPositioningArea = (0, _background.calculateBackgroungPositioningArea)(container.style.background.backgroundOrigin, container.bounds, container.style.padding, container.style.border); - var backgroundImageSize = (0, _background.calculateBackgroundSize)(background, image, backgroundPositioningArea); - var position = (0, _background.calculateBackgroundPosition)(background.position, backgroundImageSize, backgroundPositioningArea); - var _path = (0, _background.calculateBackgroundRepeatPath)(background, position, backgroundImageSize, backgroundPositioningArea, container.bounds); - - var _offsetX = Math.round(backgroundPositioningArea.left + position.x); - var _offsetY = Math.round(backgroundPositioningArea.top + position.y); - this.target.renderRepeat(_path, image, backgroundImageSize, _offsetX, _offsetY); - } - } - }, { - key: 'renderBackgroundGradient', - value: function renderBackgroundGradient(container, background) { - var backgroundPositioningArea = (0, _background.calculateBackgroungPositioningArea)(container.style.background.backgroundOrigin, container.bounds, container.style.padding, container.style.border); - var backgroundImageSize = (0, _background.calculateGradientBackgroundSize)(background, backgroundPositioningArea); - var position = (0, _background.calculateBackgroundPosition)(background.position, backgroundImageSize, backgroundPositioningArea); - var gradientBounds = new _Bounds.Bounds(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y), backgroundImageSize.width, backgroundImageSize.height); - - var gradient = (0, _Gradient.parseGradient)(container, background.source, gradientBounds); - if (gradient) { - switch (gradient.type) { - case _Gradient.GRADIENT_TYPE.LINEAR_GRADIENT: - // $FlowFixMe - this.target.renderLinearGradient(gradientBounds, gradient); - break; - case _Gradient.GRADIENT_TYPE.RADIAL_GRADIENT: - // $FlowFixMe - this.target.renderRadialGradient(gradientBounds, gradient); - break; - } - } - } - }, { - key: 'renderBorder', - value: function renderBorder(border, side, curvePoints) { - this.target.drawShape((0, _Bounds.parsePathForBorder)(curvePoints, side), border.borderColor); - } - }, { - key: 'renderStack', - value: function renderStack(stack) { - var _this4 = this; - - if (stack.container.isVisible()) { - var _opacity = stack.getOpacity(); - if (_opacity !== this._opacity) { - this.target.setOpacity(stack.getOpacity()); - this._opacity = _opacity; - } - - var _transform = stack.container.style.transform; - if (_transform !== null) { - this.target.transform(stack.container.bounds.left + _transform.transformOrigin[0].value, stack.container.bounds.top + _transform.transformOrigin[1].value, _transform.transform, function () { - return _this4.renderStackContent(stack); - }); - } else { - this.renderStackContent(stack); - } - } - } - }, { - key: 'renderStackContent', - value: function renderStackContent(stack) { - var _splitStackingContext = splitStackingContexts(stack), - _splitStackingContext2 = _slicedToArray(_splitStackingContext, 5), - negativeZIndex = _splitStackingContext2[0], - zeroOrAutoZIndexOrTransformedOrOpacity = _splitStackingContext2[1], - positiveZIndex = _splitStackingContext2[2], - nonPositionedFloats = _splitStackingContext2[3], - nonPositionedInlineLevel = _splitStackingContext2[4]; - - var _splitDescendants = splitDescendants(stack), - _splitDescendants2 = _slicedToArray(_splitDescendants, 2), - inlineLevel = _splitDescendants2[0], - nonInlineLevel = _splitDescendants2[1]; - - // https://www.w3.org/TR/css-position-3/#painting-order - // 1. the background and borders of the element forming the stacking context. - - - this.renderNodeBackgroundAndBorders(stack.container); - // 2. the child stacking contexts with negative stack levels (most negative first). - negativeZIndex.sort(sortByZIndex).forEach(this.renderStack, this); - // 3. For all its in-flow, non-positioned, block-level descendants in tree order: - this.renderNodeContent(stack.container); - nonInlineLevel.forEach(this.renderNode, this); - // 4. All non-positioned floating descendants, in tree order. For each one of these, - // treat the element as if it created a new stacking context, but any positioned descendants and descendants - // which actually create a new stacking context should be considered part of the parent stacking context, - // not this new one. - nonPositionedFloats.forEach(this.renderStack, this); - // 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks. - nonPositionedInlineLevel.forEach(this.renderStack, this); - inlineLevel.forEach(this.renderNode, this); - // 6. All positioned, opacity or transform descendants, in tree order that fall into the following categories: - // All positioned descendants with 'z-index: auto' or 'z-index: 0', in tree order. - // For those with 'z-index: auto', treat the element as if it created a new stacking context, - // but any positioned descendants and descendants which actually create a new stacking context should be - // considered part of the parent stacking context, not this new one. For those with 'z-index: 0', - // treat the stacking context generated atomically. - // - // All opacity descendants with opacity less than 1 - // - // All transform descendants with transform other than none - zeroOrAutoZIndexOrTransformedOrOpacity.forEach(this.renderStack, this); - // 7. Stacking contexts formed by positioned descendants with z-indices greater than or equal to 1 in z-index - // order (smallest first) then tree order. - positiveZIndex.sort(sortByZIndex).forEach(this.renderStack, this); - } - }, { - key: 'render', - value: function render(stack) { - var _this5 = this; - - if (this.options.backgroundColor) { - this.target.rectangle(this.options.x, this.options.y, this.options.width, this.options.height, this.options.backgroundColor); - } - this.renderStack(stack); - var target = this.target.getTarget(); - if (true) { - return target.then(function (output) { - _this5.options.logger.log('Render completed'); - return output; - }); - } - return target; - } - }]); - - return Renderer; - }(); - - exports.default = Renderer; - - - var splitDescendants = function splitDescendants(stack) { - var inlineLevel = []; - var nonInlineLevel = []; - - var length = stack.children.length; - for (var i = 0; i < length; i++) { - var child = stack.children[i]; - if (child.isInlineLevel()) { - inlineLevel.push(child); - } else { - nonInlineLevel.push(child); - } - } - return [inlineLevel, nonInlineLevel]; - }; - - var splitStackingContexts = function splitStackingContexts(stack) { - var negativeZIndex = []; - var zeroOrAutoZIndexOrTransformedOrOpacity = []; - var positiveZIndex = []; - var nonPositionedFloats = []; - var nonPositionedInlineLevel = []; - var length = stack.contexts.length; - for (var i = 0; i < length; i++) { - var child = stack.contexts[i]; - if (child.container.isPositioned() || child.container.style.opacity < 1 || child.container.isTransformed()) { - if (child.container.style.zIndex.order < 0) { - negativeZIndex.push(child); - } else if (child.container.style.zIndex.order > 0) { - positiveZIndex.push(child); - } else { - zeroOrAutoZIndexOrTransformedOrOpacity.push(child); - } - } else { - if (child.container.isFloating()) { - nonPositionedFloats.push(child); - } else { - nonPositionedInlineLevel.push(child); - } - } - } - return [negativeZIndex, zeroOrAutoZIndexOrTransformedOrOpacity, positiveZIndex, nonPositionedFloats, nonPositionedInlineLevel]; - }; - - var sortByZIndex = function sortByZIndex(a, b) { - if (a.container.style.zIndex.order > b.container.style.zIndex.order) { - return 1; - } else if (a.container.style.zIndex.order < b.container.style.zIndex.order) { - return -1; - } - - return a.container.index > b.container.index ? 1 : -1; - }; - - /***/ }), - /* 52 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.transformWebkitRadialGradientArgs = exports.parseGradient = exports.RadialGradient = exports.LinearGradient = exports.RADIAL_GRADIENT_SHAPE = exports.GRADIENT_TYPE = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _Angle = __webpack_require__(53); - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - var _Util = __webpack_require__(4); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var SIDE_OR_CORNER = /^(to )?(left|top|right|bottom)( (left|top|right|bottom))?$/i; - var PERCENTAGE_ANGLES = /^([+-]?\d*\.?\d+)% ([+-]?\d*\.?\d+)%$/i; - var ENDS_WITH_LENGTH = /(px)|%|( 0)$/i; - var FROM_TO_COLORSTOP = /^(from|to|color-stop)\((?:([\d.]+)(%)?,\s*)?(.+?)\)$/i; - var RADIAL_SHAPE_DEFINITION = /^\s*(circle|ellipse)?\s*((?:([\d.]+)(px|r?em|%)\s*(?:([\d.]+)(px|r?em|%))?)|closest-side|closest-corner|farthest-side|farthest-corner)?\s*(?:at\s*(?:(left|center|right)|([\d.]+)(px|r?em|%))\s+(?:(top|center|bottom)|([\d.]+)(px|r?em|%)))?(?:\s|$)/i; - - var GRADIENT_TYPE = exports.GRADIENT_TYPE = { - LINEAR_GRADIENT: 0, - RADIAL_GRADIENT: 1 - }; - - var RADIAL_GRADIENT_SHAPE = exports.RADIAL_GRADIENT_SHAPE = { - CIRCLE: 0, - ELLIPSE: 1 - }; - - var LENGTH_FOR_POSITION = { - left: new _Length2.default('0%'), - top: new _Length2.default('0%'), - center: new _Length2.default('50%'), - right: new _Length2.default('100%'), - bottom: new _Length2.default('100%') - }; - - var LinearGradient = exports.LinearGradient = function LinearGradient(colorStops, direction) { - _classCallCheck(this, LinearGradient); - - this.type = GRADIENT_TYPE.LINEAR_GRADIENT; - this.colorStops = colorStops; - this.direction = direction; - }; - - var RadialGradient = exports.RadialGradient = function RadialGradient(colorStops, shape, center, radius) { - _classCallCheck(this, RadialGradient); - - this.type = GRADIENT_TYPE.RADIAL_GRADIENT; - this.colorStops = colorStops; - this.shape = shape; - this.center = center; - this.radius = radius; - }; - - var parseGradient = exports.parseGradient = function parseGradient(container, _ref, bounds) { - var args = _ref.args, - method = _ref.method, - prefix = _ref.prefix; - - if (method === 'linear-gradient') { - return parseLinearGradient(args, bounds, !!prefix); - } else if (method === 'gradient' && args[0] === 'linear') { - // TODO handle correct angle - return parseLinearGradient(['to bottom'].concat(transformObsoleteColorStops(args.slice(3))), bounds, !!prefix); - } else if (method === 'radial-gradient') { - return parseRadialGradient(container, prefix === '-webkit-' ? transformWebkitRadialGradientArgs(args) : args, bounds); - } else if (method === 'gradient' && args[0] === 'radial') { - return parseRadialGradient(container, transformObsoleteColorStops(transformWebkitRadialGradientArgs(args.slice(1))), bounds); - } - }; - - var parseColorStops = function parseColorStops(args, firstColorStopIndex, lineLength) { - var colorStops = []; - - for (var i = firstColorStopIndex; i < args.length; i++) { - var value = args[i]; - var HAS_LENGTH = ENDS_WITH_LENGTH.test(value); - var lastSpaceIndex = value.lastIndexOf(' '); - var _color = new _Color2.default(HAS_LENGTH ? value.substring(0, lastSpaceIndex) : value); - var _stop = HAS_LENGTH ? new _Length2.default(value.substring(lastSpaceIndex + 1)) : i === firstColorStopIndex ? new _Length2.default('0%') : i === args.length - 1 ? new _Length2.default('100%') : null; - colorStops.push({ color: _color, stop: _stop }); - } - - var absoluteValuedColorStops = colorStops.map(function (_ref2) { - var color = _ref2.color, - stop = _ref2.stop; - - var absoluteStop = lineLength === 0 ? 0 : stop ? stop.getAbsoluteValue(lineLength) / lineLength : null; - - return { - color: color, - // $FlowFixMe - stop: absoluteStop - }; - }); - - var previousColorStop = absoluteValuedColorStops[0].stop; - for (var _i = 0; _i < absoluteValuedColorStops.length; _i++) { - if (previousColorStop !== null) { - var _stop2 = absoluteValuedColorStops[_i].stop; - if (_stop2 === null) { - var n = _i; - while (absoluteValuedColorStops[n].stop === null) { - n++; - } - var steps = n - _i + 1; - var nextColorStep = absoluteValuedColorStops[n].stop; - var stepSize = (nextColorStep - previousColorStop) / steps; - for (; _i < n; _i++) { - previousColorStop = absoluteValuedColorStops[_i].stop = previousColorStop + stepSize; - } - } else { - previousColorStop = _stop2; - } - } - } - - return absoluteValuedColorStops; - }; - - var parseLinearGradient = function parseLinearGradient(args, bounds, hasPrefix) { - var angle = (0, _Angle.parseAngle)(args[0]); - var HAS_SIDE_OR_CORNER = SIDE_OR_CORNER.test(args[0]); - var HAS_DIRECTION = HAS_SIDE_OR_CORNER || angle !== null || PERCENTAGE_ANGLES.test(args[0]); - var direction = HAS_DIRECTION ? angle !== null ? calculateGradientDirection( - // if there is a prefix, the 0° angle points due East (instead of North per W3C) - hasPrefix ? angle - Math.PI * 0.5 : angle, bounds) : HAS_SIDE_OR_CORNER ? parseSideOrCorner(args[0], bounds) : parsePercentageAngle(args[0], bounds) : calculateGradientDirection(Math.PI, bounds); - var firstColorStopIndex = HAS_DIRECTION ? 1 : 0; - - // TODO: Fix some inaccuracy with color stops with px values - var lineLength = Math.min((0, _Util.distance)(Math.abs(direction.x0) + Math.abs(direction.x1), Math.abs(direction.y0) + Math.abs(direction.y1)), bounds.width * 2, bounds.height * 2); - - return new LinearGradient(parseColorStops(args, firstColorStopIndex, lineLength), direction); - }; - - var parseRadialGradient = function parseRadialGradient(container, args, bounds) { - var m = args[0].match(RADIAL_SHAPE_DEFINITION); - var shape = m && (m[1] === 'circle' || // explicit shape specification - m[3] !== undefined && m[5] === undefined) // only one radius coordinate - ? RADIAL_GRADIENT_SHAPE.CIRCLE : RADIAL_GRADIENT_SHAPE.ELLIPSE; - var radius = {}; - var center = {}; - - if (m) { - // Radius - if (m[3] !== undefined) { - radius.x = (0, _Length.calculateLengthFromValueWithUnit)(container, m[3], m[4]).getAbsoluteValue(bounds.width); - } - - if (m[5] !== undefined) { - radius.y = (0, _Length.calculateLengthFromValueWithUnit)(container, m[5], m[6]).getAbsoluteValue(bounds.height); - } - - // Position - if (m[7]) { - center.x = LENGTH_FOR_POSITION[m[7].toLowerCase()]; - } else if (m[8] !== undefined) { - center.x = (0, _Length.calculateLengthFromValueWithUnit)(container, m[8], m[9]); - } - - if (m[10]) { - center.y = LENGTH_FOR_POSITION[m[10].toLowerCase()]; - } else if (m[11] !== undefined) { - center.y = (0, _Length.calculateLengthFromValueWithUnit)(container, m[11], m[12]); - } - } - - var gradientCenter = { - x: center.x === undefined ? bounds.width / 2 : center.x.getAbsoluteValue(bounds.width), - y: center.y === undefined ? bounds.height / 2 : center.y.getAbsoluteValue(bounds.height) - }; - var gradientRadius = calculateRadius(m && m[2] || 'farthest-corner', shape, gradientCenter, radius, bounds); - - return new RadialGradient(parseColorStops(args, m ? 1 : 0, Math.min(gradientRadius.x, gradientRadius.y)), shape, gradientCenter, gradientRadius); - }; - - var calculateGradientDirection = function calculateGradientDirection(radian, bounds) { - var width = bounds.width; - var height = bounds.height; - var HALF_WIDTH = width * 0.5; - var HALF_HEIGHT = height * 0.5; - var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian)); - var HALF_LINE_LENGTH = lineLength / 2; - - var x0 = HALF_WIDTH + Math.sin(radian) * HALF_LINE_LENGTH; - var y0 = HALF_HEIGHT - Math.cos(radian) * HALF_LINE_LENGTH; - var x1 = width - x0; - var y1 = height - y0; - - return { x0: x0, x1: x1, y0: y0, y1: y1 }; - }; - - var parseTopRight = function parseTopRight(bounds) { - return Math.acos(bounds.width / 2 / ((0, _Util.distance)(bounds.width, bounds.height) / 2)); - }; - - var parseSideOrCorner = function parseSideOrCorner(side, bounds) { - switch (side) { - case 'bottom': - case 'to top': - return calculateGradientDirection(0, bounds); - case 'left': - case 'to right': - return calculateGradientDirection(Math.PI / 2, bounds); - case 'right': - case 'to left': - return calculateGradientDirection(3 * Math.PI / 2, bounds); - case 'top right': - case 'right top': - case 'to bottom left': - case 'to left bottom': - return calculateGradientDirection(Math.PI + parseTopRight(bounds), bounds); - case 'top left': - case 'left top': - case 'to bottom right': - case 'to right bottom': - return calculateGradientDirection(Math.PI - parseTopRight(bounds), bounds); - case 'bottom left': - case 'left bottom': - case 'to top right': - case 'to right top': - return calculateGradientDirection(parseTopRight(bounds), bounds); - case 'bottom right': - case 'right bottom': - case 'to top left': - case 'to left top': - return calculateGradientDirection(2 * Math.PI - parseTopRight(bounds), bounds); - case 'top': - case 'to bottom': - default: - return calculateGradientDirection(Math.PI, bounds); - } - }; - - var parsePercentageAngle = function parsePercentageAngle(angle, bounds) { - var _angle$split$map = angle.split(' ').map(parseFloat), - _angle$split$map2 = _slicedToArray(_angle$split$map, 2), - left = _angle$split$map2[0], - top = _angle$split$map2[1]; - - var ratio = left / 100 * bounds.width / (top / 100 * bounds.height); - - return calculateGradientDirection(Math.atan(isNaN(ratio) ? 1 : ratio) + Math.PI / 2, bounds); - }; - - var findCorner = function findCorner(bounds, x, y, closest) { - var corners = [{ x: 0, y: 0 }, { x: 0, y: bounds.height }, { x: bounds.width, y: 0 }, { x: bounds.width, y: bounds.height }]; - - // $FlowFixMe - return corners.reduce(function (stat, corner) { - var d = (0, _Util.distance)(x - corner.x, y - corner.y); - if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) { - return { - optimumCorner: corner, - optimumDistance: d - }; - } - - return stat; - }, { - optimumDistance: closest ? Infinity : -Infinity, - optimumCorner: null - }).optimumCorner; - }; - - var calculateRadius = function calculateRadius(extent, shape, center, radius, bounds) { - var x = center.x; - var y = center.y; - var rx = 0; - var ry = 0; - - switch (extent) { - case 'closest-side': - // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center. - // If the shape is an ellipse, it exactly meets the closest side in each dimension. - if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) { - rx = ry = Math.min(Math.abs(x), Math.abs(x - bounds.width), Math.abs(y), Math.abs(y - bounds.height)); - } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) { - rx = Math.min(Math.abs(x), Math.abs(x - bounds.width)); - ry = Math.min(Math.abs(y), Math.abs(y - bounds.height)); - } - break; - - case 'closest-corner': - // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center. - // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified. - if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) { - rx = ry = Math.min((0, _Util.distance)(x, y), (0, _Util.distance)(x, y - bounds.height), (0, _Util.distance)(x - bounds.width, y), (0, _Util.distance)(x - bounds.width, y - bounds.height)); - } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) { - // Compute the ratio ry/rx (which is to be the same as for "closest-side") - var c = Math.min(Math.abs(y), Math.abs(y - bounds.height)) / Math.min(Math.abs(x), Math.abs(x - bounds.width)); - var corner = findCorner(bounds, x, y, true); - rx = (0, _Util.distance)(corner.x - x, (corner.y - y) / c); - ry = c * rx; - } - break; - - case 'farthest-side': - // Same as closest-side, except the ending shape is sized based on the farthest side(s) - if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) { - rx = ry = Math.max(Math.abs(x), Math.abs(x - bounds.width), Math.abs(y), Math.abs(y - bounds.height)); - } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) { - rx = Math.max(Math.abs(x), Math.abs(x - bounds.width)); - ry = Math.max(Math.abs(y), Math.abs(y - bounds.height)); - } - break; - - case 'farthest-corner': - // Same as closest-corner, except the ending shape is sized based on the farthest corner. - // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified. - if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) { - rx = ry = Math.max((0, _Util.distance)(x, y), (0, _Util.distance)(x, y - bounds.height), (0, _Util.distance)(x - bounds.width, y), (0, _Util.distance)(x - bounds.width, y - bounds.height)); - } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) { - // Compute the ratio ry/rx (which is to be the same as for "farthest-side") - var _c = Math.max(Math.abs(y), Math.abs(y - bounds.height)) / Math.max(Math.abs(x), Math.abs(x - bounds.width)); - var _corner = findCorner(bounds, x, y, false); - rx = (0, _Util.distance)(_corner.x - x, (_corner.y - y) / _c); - ry = _c * rx; - } - break; - - default: - // pixel or percentage values - rx = radius.x || 0; - ry = radius.y !== undefined ? radius.y : rx; - break; - } - - return { - x: rx, - y: ry - }; - }; - - var transformWebkitRadialGradientArgs = exports.transformWebkitRadialGradientArgs = function transformWebkitRadialGradientArgs(args) { - var shape = ''; - var radius = ''; - var extent = ''; - var position = ''; - var idx = 0; - - var POSITION = /^(left|center|right|\d+(?:px|r?em|%)?)(?:\s+(top|center|bottom|\d+(?:px|r?em|%)?))?$/i; - var SHAPE_AND_EXTENT = /^(circle|ellipse)?\s*(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)?$/i; - var RADIUS = /^\d+(px|r?em|%)?(?:\s+\d+(px|r?em|%)?)?$/i; - - var matchStartPosition = args[idx].match(POSITION); - if (matchStartPosition) { - idx++; - } - - var matchShapeExtent = args[idx].match(SHAPE_AND_EXTENT); - if (matchShapeExtent) { - shape = matchShapeExtent[1] || ''; - extent = matchShapeExtent[2] || ''; - if (extent === 'contain') { - extent = 'closest-side'; - } else if (extent === 'cover') { - extent = 'farthest-corner'; - } - idx++; - } - - var matchStartRadius = args[idx].match(RADIUS); - if (matchStartRadius) { - idx++; - } - - var matchEndPosition = args[idx].match(POSITION); - if (matchEndPosition) { - idx++; - } - - var matchEndRadius = args[idx].match(RADIUS); - if (matchEndRadius) { - idx++; - } - - var matchPosition = matchEndPosition || matchStartPosition; - if (matchPosition && matchPosition[1]) { - position = matchPosition[1] + (/^\d+$/.test(matchPosition[1]) ? 'px' : ''); - if (matchPosition[2]) { - position += ' ' + matchPosition[2] + (/^\d+$/.test(matchPosition[2]) ? 'px' : ''); - } - } - - var matchRadius = matchEndRadius || matchStartRadius; - if (matchRadius) { - radius = matchRadius[0]; - if (!matchRadius[1]) { - radius += 'px'; - } - } - - if (position && !shape && !radius && !extent) { - radius = position; - position = ''; - } - - if (position) { - position = 'at ' + position; - } - - return [[shape, extent, radius, position].filter(function (s) { - return !!s; - }).join(' ')].concat(args.slice(idx)); - }; - - var transformObsoleteColorStops = function transformObsoleteColorStops(args) { - return args.map(function (color) { - return color.match(FROM_TO_COLORSTOP); - }) - // $FlowFixMe - .map(function (v, index) { - if (!v) { - return args[index]; - } - - switch (v[1]) { - case 'from': - return v[4] + ' 0%'; - case 'to': - return v[4] + ' 100%'; - case 'color-stop': - if (v[3] === '%') { - return v[4] + ' ' + v[2]; - } - return v[4] + ' ' + parseFloat(v[2]) * 100 + '%'; - } - }); - }; - - /***/ }), - /* 53 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var ANGLE = /([+-]?\d*\.?\d+)(deg|grad|rad|turn)/i; - - var parseAngle = exports.parseAngle = function parseAngle(angle) { - var match = angle.match(ANGLE); - - if (match) { - var value = parseFloat(match[1]); - switch (match[2].toLowerCase()) { - case 'deg': - return Math.PI * value / 180; - case 'grad': - return Math.PI / 200 * value; - case 'rad': - return value; - case 'turn': - return Math.PI * 2 * value; - } - } - - return null; - }; - - /***/ }), - /* 54 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.cloneWindow = exports.DocumentCloner = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Bounds = __webpack_require__(2); - - var _Proxy = __webpack_require__(26); - - var _ResourceLoader = __webpack_require__(55); - - var _ResourceLoader2 = _interopRequireDefault(_ResourceLoader); - - var _Util = __webpack_require__(4); - - var _background = __webpack_require__(5); - - var _CanvasRenderer = __webpack_require__(15); - - var _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer); - - var _PseudoNodeContent = __webpack_require__(56); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var IGNORE_ATTRIBUTE = 'data-html2canvas-ignore'; - - var DocumentCloner = exports.DocumentCloner = function () { - function DocumentCloner(element, options, logger, copyInline, renderer) { - _classCallCheck(this, DocumentCloner); - - this.referenceElement = element; - this.scrolledElements = []; - this.copyStyles = copyInline; - this.inlineImages = copyInline; - this.logger = logger; - this.options = options; - this.renderer = renderer; - this.resourceLoader = new _ResourceLoader2.default(options, logger, window); - this.pseudoContentData = { - counters: {}, - quoteDepth: 0 - }; - // $FlowFixMe - this.documentElement = this.cloneNode(element.ownerDocument.documentElement); - } - - _createClass(DocumentCloner, [{ - key: 'inlineAllImages', - value: function inlineAllImages(node) { - var _this = this; - - if (this.inlineImages && node) { - var style = node.style; - Promise.all((0, _background.parseBackgroundImage)(style.backgroundImage).map(function (backgroundImage) { - if (backgroundImage.method === 'url') { - return _this.resourceLoader.inlineImage(backgroundImage.args[0]).then(function (img) { - return img && typeof img.src === 'string' ? 'url("' + img.src + '")' : 'none'; - }).catch(function (e) { - if (true) { - _this.logger.log('Unable to load image', e); - } - }); - } - return Promise.resolve('' + backgroundImage.prefix + backgroundImage.method + '(' + backgroundImage.args.join(',') + ')'); - })).then(function (backgroundImages) { - if (backgroundImages.length > 1) { - // TODO Multiple backgrounds somehow broken in Chrome - style.backgroundColor = ''; - } - style.backgroundImage = backgroundImages.join(','); - }); - - if (node instanceof HTMLImageElement) { - this.resourceLoader.inlineImage(node.src).then(function (img) { - if (img && node instanceof HTMLImageElement && node.parentNode) { - var parentNode = node.parentNode; - var clonedChild = (0, _Util.copyCSSStyles)(node.style, img.cloneNode(false)); - parentNode.replaceChild(clonedChild, node); - } - }).catch(function (e) { - if (true) { - _this.logger.log('Unable to load image', e); - } - }); - } - } - } - }, { - key: 'inlineFonts', - value: function inlineFonts(document) { - var _this2 = this; - - return Promise.all(Array.from(document.styleSheets).map(function (sheet) { - if (sheet.href) { - return fetch(sheet.href).then(function (res) { - return res.text(); - }).then(function (text) { - return createStyleSheetFontsFromText(text, sheet.href); - }).catch(function (e) { - if (true) { - _this2.logger.log('Unable to load stylesheet', e); - } - return []; - }); - } - return getSheetFonts(sheet, document); - })).then(function (fonts) { - return fonts.reduce(function (acc, font) { - return acc.concat(font); - }, []); - }).then(function (fonts) { - return Promise.all(fonts.map(function (font) { - return fetch(font.formats[0].src).then(function (response) { - return response.blob(); - }).then(function (blob) { - return new Promise(function (resolve, reject) { - var reader = new FileReader(); - reader.onerror = reject; - reader.onload = function () { - // $FlowFixMe - var result = reader.result; - resolve(result); - }; - reader.readAsDataURL(blob); - }); - }).then(function (dataUri) { - font.fontFace.setProperty('src', 'url("' + dataUri + '")'); - return '@font-face {' + font.fontFace.cssText + ' '; - }); - })); - }).then(function (fontCss) { - var style = document.createElement('style'); - style.textContent = fontCss.join('\n'); - _this2.documentElement.appendChild(style); - }); - } - }, { - key: 'createElementClone', - value: function createElementClone(node) { - var _this3 = this; - - if (this.copyStyles && node instanceof HTMLCanvasElement) { - var img = node.ownerDocument.createElement('img'); - try { - img.src = node.toDataURL(); - return img; - } catch (e) { - if (true) { - this.logger.log('Unable to clone canvas contents, canvas is tainted'); - } - } - } - - if (node instanceof HTMLIFrameElement) { - var tempIframe = node.cloneNode(false); - var iframeKey = generateIframeKey(); - tempIframe.setAttribute('data-html2canvas-internal-iframe-key', iframeKey); - - var _parseBounds = (0, _Bounds.parseBounds)(node, 0, 0), - width = _parseBounds.width, - height = _parseBounds.height; - - this.resourceLoader.cache[iframeKey] = getIframeDocumentElement(node, this.options).then(function (documentElement) { - return _this3.renderer(documentElement, { - async: _this3.options.async, - allowTaint: _this3.options.allowTaint, - backgroundColor: '#ffffff', - canvas: null, - imageTimeout: _this3.options.imageTimeout, - logging: _this3.options.logging, - proxy: _this3.options.proxy, - removeContainer: _this3.options.removeContainer, - scale: _this3.options.scale, - foreignObjectRendering: _this3.options.foreignObjectRendering, - useCORS: _this3.options.useCORS, - target: new _CanvasRenderer2.default(), - width: width, - height: height, - x: 0, - y: 0, - windowWidth: documentElement.ownerDocument.defaultView.innerWidth, - windowHeight: documentElement.ownerDocument.defaultView.innerHeight, - scrollX: documentElement.ownerDocument.defaultView.pageXOffset, - scrollY: documentElement.ownerDocument.defaultView.pageYOffset - }, _this3.logger.child(iframeKey)); - }).then(function (canvas) { - return new Promise(function (resolve, reject) { - var iframeCanvas = document.createElement('img'); - iframeCanvas.onload = function () { - return resolve(canvas); - }; - iframeCanvas.onerror = reject; - iframeCanvas.src = canvas.toDataURL(); - if (tempIframe.parentNode) { - tempIframe.parentNode.replaceChild((0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node), iframeCanvas), tempIframe); - } - }); - }); - return tempIframe; - } - - if (node instanceof HTMLStyleElement && node.sheet && node.sheet.cssRules) { - var css = [].slice.call(node.sheet.cssRules, 0).reduce(function (css, rule) { - try { - if (rule && rule.cssText) { - return css + rule.cssText; - } - return css; - } catch (err) { - _this3.logger.log('Unable to access cssText property', rule.name); - return css; - } - }, ''); - var style = node.cloneNode(false); - style.textContent = css; - return style; - } - - return node.cloneNode(false); - } - }, { - key: 'cloneNode', - value: function cloneNode(node) { - var clone = node.nodeType === Node.TEXT_NODE ? document.createTextNode(node.nodeValue) : this.createElementClone(node); - - var window = node.ownerDocument.defaultView; - var style = node instanceof window.HTMLElement ? window.getComputedStyle(node) : null; - var styleBefore = node instanceof window.HTMLElement ? window.getComputedStyle(node, ':before') : null; - var styleAfter = node instanceof window.HTMLElement ? window.getComputedStyle(node, ':after') : null; - - if (this.referenceElement === node && clone instanceof window.HTMLElement) { - this.clonedReferenceElement = clone; - } - - if (clone instanceof window.HTMLBodyElement) { - createPseudoHideStyles(clone); - } - - var counters = (0, _PseudoNodeContent.parseCounterReset)(style, this.pseudoContentData); - var contentBefore = (0, _PseudoNodeContent.resolvePseudoContent)(node, styleBefore, this.pseudoContentData); - - for (var child = node.firstChild; child; child = child.nextSibling) { - if (child.nodeType !== Node.ELEMENT_NODE || child.nodeName !== 'SCRIPT' && - // $FlowFixMe - !child.hasAttribute(IGNORE_ATTRIBUTE) && (typeof this.options.ignoreElements !== 'function' || - // $FlowFixMe - !this.options.ignoreElements(child))) { - if (!this.copyStyles || child.nodeName !== 'STYLE') { - clone.appendChild(this.cloneNode(child)); - } - } - } - - var contentAfter = (0, _PseudoNodeContent.resolvePseudoContent)(node, styleAfter, this.pseudoContentData); - (0, _PseudoNodeContent.popCounters)(counters, this.pseudoContentData); - - if (node instanceof window.HTMLElement && clone instanceof window.HTMLElement) { - if (styleBefore) { - this.inlineAllImages(inlinePseudoElement(node, clone, styleBefore, contentBefore, PSEUDO_BEFORE)); - } - if (styleAfter) { - this.inlineAllImages(inlinePseudoElement(node, clone, styleAfter, contentAfter, PSEUDO_AFTER)); - } - if (style && this.copyStyles && !(node instanceof HTMLIFrameElement)) { - (0, _Util.copyCSSStyles)(style, clone); - } - this.inlineAllImages(clone); - if (node.scrollTop !== 0 || node.scrollLeft !== 0) { - this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]); - } - switch (node.nodeName) { - case 'CANVAS': - if (!this.copyStyles) { - cloneCanvasContents(node, clone); - } - break; - case 'TEXTAREA': - case 'SELECT': - clone.value = node.value; - break; - } - } - return clone; - } - }]); - - return DocumentCloner; - }(); - - var getSheetFonts = function getSheetFonts(sheet, document) { - // $FlowFixMe - return (sheet.cssRules ? Array.from(sheet.cssRules) : []).filter(function (rule) { - return rule.type === CSSRule.FONT_FACE_RULE; - }).map(function (rule) { - var src = (0, _background.parseBackgroundImage)(rule.style.getPropertyValue('src')); - var formats = []; - for (var i = 0; i < src.length; i++) { - if (src[i].method === 'url' && src[i + 1] && src[i + 1].method === 'format') { - var a = document.createElement('a'); - a.href = src[i].args[0]; - if (document.body) { - document.body.appendChild(a); - } - - var font = { - src: a.href, - format: src[i + 1].args[0] - }; - formats.push(font); - } - } - - return { - // TODO select correct format for browser), - - formats: formats.filter(function (font) { - return (/^woff/i.test(font.format) - ); - }), - fontFace: rule.style - }; - }).filter(function (font) { - return font.formats.length; - }); - }; - - var createStyleSheetFontsFromText = function createStyleSheetFontsFromText(text, baseHref) { - var doc = document.implementation.createHTMLDocument(''); - var base = document.createElement('base'); - // $FlowFixMe - base.href = baseHref; - var style = document.createElement('style'); - - style.textContent = text; - if (doc.head) { - doc.head.appendChild(base); - } - if (doc.body) { - doc.body.appendChild(style); - } - - return style.sheet ? getSheetFonts(style.sheet, doc) : []; - }; - - var restoreOwnerScroll = function restoreOwnerScroll(ownerDocument, x, y) { - if (ownerDocument.defaultView && (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) { - ownerDocument.defaultView.scrollTo(x, y); - } - }; - - var cloneCanvasContents = function cloneCanvasContents(canvas, clonedCanvas) { - try { - if (clonedCanvas) { - clonedCanvas.width = canvas.width; - clonedCanvas.height = canvas.height; - var ctx = canvas.getContext('2d'); - var clonedCtx = clonedCanvas.getContext('2d'); - if (ctx) { - clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0); - } else { - clonedCtx.drawImage(canvas, 0, 0); - } - } - } catch (e) {} - }; - - var inlinePseudoElement = function inlinePseudoElement(node, clone, style, contentItems, pseudoElt) { - if (!style || !style.content || style.content === 'none' || style.content === '-moz-alt-content' || style.display === 'none') { - return; - } - - var anonymousReplacedElement = clone.ownerDocument.createElement('html2canvaspseudoelement'); - (0, _Util.copyCSSStyles)(style, anonymousReplacedElement); - - if (contentItems) { - var len = contentItems.length; - for (var i = 0; i < len; i++) { - var item = contentItems[i]; - switch (item.type) { - case _PseudoNodeContent.PSEUDO_CONTENT_ITEM_TYPE.IMAGE: - var img = clone.ownerDocument.createElement('img'); - img.src = (0, _background.parseBackgroundImage)('url(' + item.value + ')')[0].args[0]; - img.style.opacity = '1'; - anonymousReplacedElement.appendChild(img); - break; - case _PseudoNodeContent.PSEUDO_CONTENT_ITEM_TYPE.TEXT: - anonymousReplacedElement.appendChild(clone.ownerDocument.createTextNode(item.value)); - break; - } - } - } - - anonymousReplacedElement.className = PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + ' ' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER; - clone.className += pseudoElt === PSEUDO_BEFORE ? ' ' + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE : ' ' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER; - if (pseudoElt === PSEUDO_BEFORE) { - clone.insertBefore(anonymousReplacedElement, clone.firstChild); - } else { - clone.appendChild(anonymousReplacedElement); - } - - return anonymousReplacedElement; - }; - - var URL_REGEXP = /^url\((.+)\)$/i; - var PSEUDO_BEFORE = ':before'; - var PSEUDO_AFTER = ':after'; - var PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before'; - var PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after'; - - var PSEUDO_HIDE_ELEMENT_STYLE = '{\n content: "" !important;\n display: none !important;\n}'; - - var createPseudoHideStyles = function createPseudoHideStyles(body) { - createStyles(body, '.' + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + PSEUDO_BEFORE + PSEUDO_HIDE_ELEMENT_STYLE + '\n .' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER + PSEUDO_AFTER + PSEUDO_HIDE_ELEMENT_STYLE); - }; - - var createStyles = function createStyles(body, styles) { - var style = body.ownerDocument.createElement('style'); - style.innerHTML = styles; - body.appendChild(style); - }; - - var initNode = function initNode(_ref) { - var _ref2 = _slicedToArray(_ref, 3), - element = _ref2[0], - x = _ref2[1], - y = _ref2[2]; - - element.scrollLeft = x; - element.scrollTop = y; - }; - - var generateIframeKey = function generateIframeKey() { - return Math.ceil(Date.now() + Math.random() * 10000000).toString(16); - }; - - var DATA_URI_REGEXP = /^data:text\/(.+);(base64)?,(.*)$/i; - - var getIframeDocumentElement = function getIframeDocumentElement(node, options) { - try { - return Promise.resolve(node.contentWindow.document.documentElement); - } catch (e) { - return options.proxy ? (0, _Proxy.Proxy)(node.src, options).then(function (html) { - var match = html.match(DATA_URI_REGEXP); - if (!match) { - return Promise.reject(); - } - - return match[2] === 'base64' ? window.atob(decodeURIComponent(match[3])) : decodeURIComponent(match[3]); - }).then(function (html) { - return createIframeContainer(node.ownerDocument, (0, _Bounds.parseBounds)(node, 0, 0)).then(function (cloneIframeContainer) { - var cloneWindow = cloneIframeContainer.contentWindow; - var documentClone = cloneWindow.document; - - documentClone.open(); - documentClone.write(html); - var iframeLoad = iframeLoader(cloneIframeContainer).then(function () { - return documentClone.documentElement; - }); - - documentClone.close(); - return iframeLoad; - }); - }) : Promise.reject(); - } - }; - - var createIframeContainer = function createIframeContainer(ownerDocument, bounds) { - var cloneIframeContainer = ownerDocument.createElement('iframe'); - - cloneIframeContainer.className = 'html2canvas-container'; - cloneIframeContainer.style.visibility = 'hidden'; - cloneIframeContainer.style.position = 'fixed'; - cloneIframeContainer.style.left = '-10000px'; - cloneIframeContainer.style.top = '0px'; - cloneIframeContainer.style.border = '0'; - cloneIframeContainer.width = bounds.width.toString(); - cloneIframeContainer.height = bounds.height.toString(); - cloneIframeContainer.scrolling = 'no'; // ios won't scroll without it - cloneIframeContainer.setAttribute(IGNORE_ATTRIBUTE, 'true'); - if (!ownerDocument.body) { - return Promise.reject( true ? 'Body element not found in Document that is getting rendered' : ''); - } - - ownerDocument.body.appendChild(cloneIframeContainer); - - return Promise.resolve(cloneIframeContainer); - }; - - var iframeLoader = function iframeLoader(cloneIframeContainer) { - var cloneWindow = cloneIframeContainer.contentWindow; - var documentClone = cloneWindow.document; - - return new Promise(function (resolve, reject) { - cloneWindow.onload = cloneIframeContainer.onload = documentClone.onreadystatechange = function () { - var interval = setInterval(function () { - if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') { - clearInterval(interval); - resolve(cloneIframeContainer); - } - }, 50); - }; - }); - }; - - var cloneWindow = exports.cloneWindow = function cloneWindow(ownerDocument, bounds, referenceElement, options, logger, renderer) { - var cloner = new DocumentCloner(referenceElement, options, logger, false, renderer); - var scrollX = ownerDocument.defaultView.pageXOffset; - var scrollY = ownerDocument.defaultView.pageYOffset; - - return createIframeContainer(ownerDocument, bounds).then(function (cloneIframeContainer) { - var cloneWindow = cloneIframeContainer.contentWindow; - var documentClone = cloneWindow.document; - - /* Chrome doesn't detect relative background-images assigned in inline