mirror of
https://github.com/cytopia/devilbox.git
synced 2025-06-24 10:18:17 +00:00
Compare commits
1712 Commits
Author | SHA1 | Date | |
---|---|---|---|
986f04637f | |||
8621ce1b55 | |||
10b20c0745 | |||
1c2143095a | |||
22ed5edc4e | |||
9d23981173 | |||
6fa4d4a386 | |||
51a127dda3 | |||
76c6467806 | |||
617241ce42 | |||
2fa1641bc2 | |||
de8d40822c | |||
b773fcd1b7 | |||
7c461870f0 | |||
ecb674f859 | |||
8e39202fc9 | |||
8c81bcc1a1 | |||
8a1a720e8c | |||
fb173e0ed6 | |||
9f54138567 | |||
364f4aa3a6 | |||
c7c2b4f2cb | |||
0b561dfdd2 | |||
794e3d8961 | |||
a84e18be67 | |||
894706ab09 | |||
448054bece | |||
e18bfd3f4f | |||
d1894b3eb2 | |||
7f3b45b387 | |||
81c9bb0a93 | |||
cb07f319de | |||
cca1744145 | |||
9fc97586e6 | |||
2db5ffff6b | |||
0dc1b9cafb | |||
b05f4240f3 | |||
e18e923d87 | |||
c6e1192429 | |||
634b9af7e5 | |||
a1fa5724e8 | |||
a786eb64b0 | |||
01d2f4afed | |||
873abc6c4c | |||
1ba3cd399c | |||
299b765652 | |||
6819619d8a | |||
3ffb360c51 | |||
025b45c48c | |||
10571f7b51 | |||
ffba5d61b7 | |||
200f6ce0b1 | |||
8b0788b403 | |||
dfda00d78a | |||
98f05d7570 | |||
a560926315 | |||
e60aa4e465 | |||
d5858da3e0 | |||
c64c4553d7 | |||
55f0447ce1 | |||
0e3b963df2 | |||
0964c7bdd9 | |||
3b1c0b25a5 | |||
32c7beda22 | |||
794bf0c27c | |||
e51f34c1ae | |||
6b80453b92 | |||
6fa03e6961 | |||
e3b7c2d4db | |||
2b4bf59a40 | |||
ee5988507e | |||
d354d84165 | |||
f2c0372618 | |||
a35216fdfb | |||
2828e837d9 | |||
685e09f76b | |||
04c0e27ebf | |||
7645068258 | |||
b5566c1c52 | |||
826859a1cd | |||
71064a7296 | |||
f2088d63a7 | |||
8b70a01a16 | |||
a5f28e80c3 | |||
48e7133825 | |||
2e33d991b7 | |||
8227605036 | |||
565a5c7427 | |||
eb5ecc836c | |||
c165fd2ba0 | |||
d2d1ddfb63 | |||
f7c58ddbc4 | |||
8bde34caaf | |||
441adbb66d | |||
b5a6c0e6ad | |||
ca56dff442 | |||
7c941000c8 | |||
dbfd086227 | |||
895558209e | |||
b6512388d7 | |||
5cce2a8a89 | |||
b00b1e77b9 | |||
f2cca91dd1 | |||
b600f9866a | |||
aae28e7d6d | |||
fe59793304 | |||
e8a6fe51e7 | |||
c5da81b83b | |||
503667a8da | |||
315fb9e3c4 | |||
fc28e32b0c | |||
180eac149b | |||
dfb6eaec69 | |||
248cf5ba5f | |||
07df58f13a | |||
3bffa62456 | |||
59205dc888 | |||
63437650ee | |||
a11419e82e | |||
fb64b0bd31 | |||
12e613188e | |||
234bdd6419 | |||
6a04527456 | |||
0bb019b8a8 | |||
d3492e4acc | |||
4418b305de | |||
933a1c65e1 | |||
cabb7b07aa | |||
97751fad37 | |||
81d896fa93 | |||
270cb45726 | |||
26cbb63f00 | |||
daefd0f927 | |||
44d1f0162f | |||
59619ca9c1 | |||
a6c45353bd | |||
575782af55 | |||
56d2ab39b4 | |||
c29741d119 | |||
6e2f6ca181 | |||
7e85b8e609 | |||
02f6876a21 | |||
a5396c2213 | |||
eb9cb0254f | |||
f054b22957 | |||
aed9a96dfc | |||
7a13143b4f | |||
887202db65 | |||
4fb67be0bd | |||
14bba0a140 | |||
6c2b42cbc7 | |||
19619394e3 | |||
66fe7e355d | |||
ec1e5861ce | |||
fb48e5e85a | |||
49190e4c36 | |||
c3da7facb4 | |||
d375244920 | |||
1b5522b6fa | |||
68541d76ad | |||
96610c756b | |||
7799740525 | |||
8e8991896a | |||
cbdabb2f97 | |||
d45a336d65 | |||
49b919534a | |||
0159d2a60b | |||
ac07995595 | |||
4f0542b756 | |||
052be908aa | |||
a714821dea | |||
579ae15bcc | |||
f632cc247f | |||
fbef67daac | |||
a5e0a54c5f | |||
71c73f7fb3 | |||
52689f435a | |||
3678a6799c | |||
014d9103db | |||
6acac7d8de | |||
9ac4b7399f | |||
e3dfa7cc09 | |||
6c03253313 | |||
19a65b3da4 | |||
95a0109004 | |||
0c26a6c319 | |||
ad66ef3dc5 | |||
907d6797ca | |||
708253ebd9 | |||
fe3c90f117 | |||
8666ca68bc | |||
91da7d3f5b | |||
5804546be4 | |||
39aae0501c | |||
eadafcf6ba | |||
7f3d37e606 | |||
c87f18fe78 | |||
d4b0be9ac4 | |||
218ed79e14 | |||
6a98ee4109 | |||
d6337ccb51 | |||
4945ca2ccd | |||
ace31c89ed | |||
81d2f7d02b | |||
1bb408f16b | |||
c3f213b779 | |||
4e10d85de6 | |||
349fa0ec73 | |||
4b3cc3f1e8 | |||
be73b353eb | |||
a45748e1aa | |||
31103f0040 | |||
bdad47617c | |||
52a42623bb | |||
75f1d7f471 | |||
03eb46da99 | |||
dd85f5b1bb | |||
fca58c22c6 | |||
830549a905 | |||
015d66052e | |||
82a1d7c881 | |||
7d346463c7 | |||
ae780388dc | |||
422af8e916 | |||
3d3f716121 | |||
928d5a2475 | |||
9b37e3a307 | |||
682eaf82ee | |||
38b96b7a08 | |||
94bf3c9dcf | |||
9272bfec92 | |||
d57e72bc75 | |||
bbc6a661ed | |||
2ea5ff59e0 | |||
ba6fd1e554 | |||
fe67bdf6bb | |||
4a9c0b6d9f | |||
855d98d895 | |||
01b0ecdf20 | |||
fe9e6264d9 | |||
55bb37c53b | |||
a6894b7793 | |||
0daa62cc02 | |||
38942fa168 | |||
a0246b7a0e | |||
b17f4600f4 | |||
5f465abd61 | |||
61246b5151 | |||
ca90af0fb0 | |||
7bd6b34698 | |||
2677422250 | |||
200000cb5b | |||
8560267fdc | |||
8c13144d3e | |||
2f8fc59dd9 | |||
d9fb88058f | |||
4c15e191a0 | |||
249b132e58 | |||
6e34d3b263 | |||
68bd88d304 | |||
bfb4769e85 | |||
23a6aed10d | |||
0dfd63d7f9 | |||
3804a3b6f3 | |||
9cfc69e5bb | |||
56555e87a5 | |||
5e90a3a35d | |||
54e17f5ec5 | |||
b5d19264de | |||
f6bbdc72fd | |||
2f9ba2e30a | |||
fa0c8f5632 | |||
64330b5b12 | |||
872340e14b | |||
5eb2ee8ca0 | |||
aff86a6b15 | |||
fb51eece98 | |||
6c438bb434 | |||
9935780588 | |||
20cba7d773 | |||
353fa53d29 | |||
f28e1ee4a4 | |||
fb390ac429 | |||
867327a8c3 | |||
8ffd65a905 | |||
5a4574edb8 | |||
dc350b00b5 | |||
f4d492ea98 | |||
c40c43c4ea | |||
d0585bb174 | |||
0b9d18cdf4 | |||
ba42717f01 | |||
b4c3de9195 | |||
a0423ebd02 | |||
06c2a7ac51 | |||
543e373b91 | |||
3d0154f987 | |||
715c6b3c83 | |||
d8e728a6a4 | |||
1d41fb025c | |||
af98125279 | |||
ab761eedba | |||
0058e0bd61 | |||
2dd3ec9dd0 | |||
7f294735e7 | |||
a07b3442f1 | |||
db1be81471 | |||
d5e463db60 | |||
83c0c672d4 | |||
af68fb65f2 | |||
f6c273d6c4 | |||
46f5c48ba0 | |||
6c18e8f112 | |||
6807b83e6b | |||
01fb99ec1a | |||
56342426b3 | |||
87e710050f | |||
cdfb55ec2d | |||
7cad84f527 | |||
e65685b604 | |||
7e08261602 | |||
30d23f0f6f | |||
b5fca3f842 | |||
dd529d0a1a | |||
a6863c5ceb | |||
6dba0ce963 | |||
201925e0b2 | |||
ffee650e60 | |||
59738601b2 | |||
50ae11f95f | |||
09b8803f21 | |||
75aa5139e2 | |||
f9b4a9d9f4 | |||
0151167635 | |||
9c6711c948 | |||
22f5c945ef | |||
1b768425b2 | |||
a05f3eea47 | |||
e3c1e18ae3 | |||
a78bccfd33 | |||
2679acc569 | |||
6b18f7b71d | |||
df6ee3fb36 | |||
fda37efc64 | |||
e9281c9b40 | |||
dfd3e27882 | |||
8e7069f893 | |||
c96f740c39 | |||
fe54bbf714 | |||
9660c37937 | |||
0d6ecf23e3 | |||
3a2dacf748 | |||
467fc03640 | |||
7480eb4e08 | |||
f348fa7814 | |||
b8055a175b | |||
9b58e2daa8 | |||
30e2b08c72 | |||
1f0676de4a | |||
6735daaaeb | |||
657ba28afd | |||
14259518c6 | |||
d406eac805 | |||
dfb2a1097d | |||
8553a5645b | |||
6e59572a51 | |||
bbf297a356 | |||
8a290af71c | |||
f2929f3d08 | |||
4fb0d557a6 | |||
d0776566a2 | |||
254b76205c | |||
d727835228 | |||
760d1606c5 | |||
5d476b9c32 | |||
6465542af8 | |||
686ad73b63 | |||
70695d179c | |||
039ffacaf7 | |||
9367c9540a | |||
87fa92d931 | |||
d655bea64f | |||
4acfa94639 | |||
2d5361891e | |||
db58f3b1bb | |||
2dfb908fbf | |||
20931a7d97 | |||
8fa4ea59c7 | |||
da12bccc29 | |||
3e9bcec90b | |||
e5f93062ca | |||
f37e9b2a58 | |||
156e36be56 | |||
6aca07a5b9 | |||
530698aee2 | |||
9f647fa745 | |||
8f510c7f6c | |||
d94cf193e3 | |||
d471794f72 | |||
9ff5006d1a | |||
9179683f18 | |||
16a0f360bf | |||
bca2a37723 | |||
e2806d147a | |||
9cefd120ef | |||
97d8602f19 | |||
2c8c8f2fa5 | |||
b9cf538dcf | |||
f034dec17a | |||
9ce7111587 | |||
d5eca8a114 | |||
81f344ee04 | |||
4b23dd6d6d | |||
10952e80b2 | |||
ae4514e1ca | |||
0d1fe20cc4 | |||
f67182f111 | |||
4540afa507 | |||
1868719479 | |||
3556873f19 | |||
eafc56f5ab | |||
a10efca1c3 | |||
8c931cdf56 | |||
487b69331c | |||
6984d43ff9 | |||
a097b5b4d8 | |||
0b118486b5 | |||
c73d5a711f | |||
78244371ca | |||
a1fa4806e1 | |||
02e3f8cf6e | |||
f7741d88f9 | |||
bc16d8906e | |||
fa6a91350c | |||
d4e3b885da | |||
68f34be368 | |||
5679774a30 | |||
056bbfb057 | |||
fb77920460 | |||
a377209a72 | |||
c1fbb9c2c4 | |||
ca6f7f56ac | |||
163642aac7 | |||
37c82a334c | |||
844ca283bf | |||
63de90415c | |||
c67c66c8ef | |||
80b6582d91 | |||
d68adcbb01 | |||
112e24207b | |||
17232a5eb4 | |||
7d6c7a4aff | |||
a98c6146a4 | |||
175e4d8d02 | |||
c56243bb9d | |||
e294e6f6cd | |||
4691117100 | |||
d104e4e9a5 | |||
8aabde1b5a | |||
44bbf048ce | |||
84183c9688 | |||
c05a74fd5f | |||
0c5750b8bf | |||
886689ca64 | |||
bfdd3ffbfc | |||
3c12883ea1 | |||
51281ef5a0 | |||
bf140cf8cd | |||
ed8639c636 | |||
06830367c9 | |||
556b50d76c | |||
4d2839f6d5 | |||
87fe2ba593 | |||
cd82fa74a7 | |||
e48c8e96dc | |||
f29d552dfa | |||
304fc86329 | |||
d44905bfb5 | |||
1b9ef528d2 | |||
4f97eae8fe | |||
2e09f7f0f8 | |||
6fa7a84bd3 | |||
266c5b84a3 | |||
b75aa9f2ab | |||
99163bd525 | |||
dada924b41 | |||
75b6db7676 | |||
f90b53c79a | |||
7d1d3add5a | |||
17735e09ce | |||
ff143fe931 | |||
72c7a7db02 | |||
151246179d | |||
6e27f83b4d | |||
616fed6326 | |||
0b9d127979 | |||
53e10a5a38 | |||
e3ce8593be | |||
e3da67d96d | |||
4ae80c66aa | |||
ada47bbd5b | |||
207b7ac7ad | |||
25eac35991 | |||
8eef4b05ec | |||
d8a84bb889 | |||
4ac8eb17d2 | |||
e2930d2b4e | |||
d6818a1470 | |||
914f32bc14 | |||
9234730dd8 | |||
921188a5b3 | |||
bdf8eb7578 | |||
dc9a30ed5f | |||
e6d0a1597f | |||
cf91371b61 | |||
b07e2cb747 | |||
ca5dec2e57 | |||
ccea6e3814 | |||
ce4b340224 | |||
31940fc22a | |||
a7d3c53979 | |||
44b146b824 | |||
44b9611c94 | |||
593dfbe31a | |||
a409c214c7 | |||
4daebaa325 | |||
967f282739 | |||
182269fdf1 | |||
57a1f335f6 | |||
247530bcac | |||
8f47af8bfb | |||
49d6c68bb5 | |||
b318da24c6 | |||
3551c89311 | |||
b5ed81e28a | |||
57ff6da675 | |||
c8de832210 | |||
41493bc514 | |||
2f129611cc | |||
2744a39aec | |||
9cff9a1277 | |||
7301d581df | |||
c271734278 | |||
574a6cc183 | |||
5d9f396b14 | |||
7ea5aa8aed | |||
2a2167205a | |||
2b58cb5153 | |||
f4ddbfb15e | |||
de89a170e7 | |||
2aacfeaaed | |||
ace5d7c1fc | |||
04e7c70b26 | |||
0543f2da92 | |||
9b5e19cf41 | |||
3dec841e88 | |||
3370934bb3 | |||
0a5327ac77 | |||
11c46cd9c0 | |||
fdb6cffb3b | |||
19e5d03fe0 | |||
2294672403 | |||
23a9b2b889 | |||
15dcf8b350 | |||
23ac8cde1a | |||
c04750aa15 | |||
e6e5a1f8c6 | |||
816aa75dab | |||
fb8499f645 | |||
4be9018c2b | |||
147fffb20d | |||
65b81ab2f8 | |||
1eed5e2e4b | |||
204a8a0736 | |||
94cb41fb1f | |||
6bc99d02b2 | |||
e28f268098 | |||
aef23ac4fd | |||
1e8626bd87 | |||
e044f89ad0 | |||
7b853cdf79 | |||
8fda181691 | |||
e91a7001b4 | |||
e4068aac9f | |||
5768c8505e | |||
fb8c378727 | |||
6b7d6516e8 | |||
3dc8d865fe | |||
c0530520a1 | |||
82206aed02 | |||
6b663d2df5 | |||
1a18c1891c | |||
6d485dcc4f | |||
260c222209 | |||
6690610623 | |||
ac040416cf | |||
b479bcaec9 | |||
03afc32392 | |||
7a1dadf10c | |||
6da8f35cf7 | |||
d58b4f6035 | |||
f5e32c25a1 | |||
f45826edfd | |||
f94557062d | |||
f2aa49b8cd | |||
acf3293692 | |||
5064effe89 | |||
3cbbdb35b0 | |||
c2b8a53efc | |||
2b521c9e71 | |||
9e3da94edb | |||
1138c498c7 | |||
cfba16f887 | |||
ef2f39f794 | |||
f19a5d2ca2 | |||
c582163951 | |||
c6542ad032 | |||
bb1b72d9af | |||
ba3dd31729 | |||
0dc142e1e2 | |||
8dbf591624 | |||
ccdc3e07b8 | |||
3d8e08e398 | |||
ba58b846e2 | |||
e4657f36e0 | |||
558cd89e95 | |||
47f62d23b6 | |||
c57dff5a44 | |||
4e429a97c3 | |||
fbc1b7f22c | |||
6de4a56fa3 | |||
0c316eeef3 | |||
44f2e36071 | |||
38332ba801 | |||
c9f72e47c3 | |||
4e41e64308 | |||
e36e88127d | |||
73cc2d9b1e | |||
8840ce67e4 | |||
afb7d3a577 | |||
54d7b0d1a1 | |||
962ae92943 | |||
f5bba1732a | |||
ecf456db1f | |||
297a015b72 | |||
d20b76aea6 | |||
eb4c68109d | |||
50ab236ea9 | |||
e81b456ec3 | |||
c27ac1a8e9 | |||
8ab6b24925 | |||
dab5c1e2ea | |||
6ce9a94509 | |||
5421d45d82 | |||
1b5f40278d | |||
3d805b1191 | |||
83823e0ccf | |||
bc987a5663 | |||
a7133dd6ed | |||
e8fa029de6 | |||
5263cb6a8b | |||
719a127205 | |||
e9abde6194 | |||
6c851a5772 | |||
ec1d312c41 | |||
489695268f | |||
48fb8c5909 | |||
31586cb6e1 | |||
f638f98fa3 | |||
4e787aa8a4 | |||
7d371cc66d | |||
78c76f6b7e | |||
408687e9ed | |||
cd60aa7568 | |||
771b01aec0 | |||
62b506470c | |||
9375340426 | |||
7016f65ae3 | |||
7cb9502c1e | |||
200135164b | |||
b92d9900ac | |||
d7a0cdb662 | |||
cb6f109b4f | |||
47c830116a | |||
8496818dec | |||
7aaa6d3ea6 | |||
5343cabcdc | |||
cdb27c836f | |||
b76a568a8b | |||
c32b8462e2 | |||
16131d3c87 | |||
1b1004c87e | |||
d10eab8471 | |||
dfc0bdde21 | |||
0cb503db49 | |||
7f58dd9a79 | |||
cb74322d1a | |||
e15c019eea | |||
588c537199 | |||
fe5c3bb63d | |||
68f49c0be6 | |||
6fb39c0e69 | |||
325acdf89a | |||
5bb4ae5db6 | |||
447678413e | |||
ae0ced0a67 | |||
e4a5d09fd9 | |||
84830a86c5 | |||
047be5ac0a | |||
57aa1846b9 | |||
384976a780 | |||
cc6de2dfa1 | |||
598358e99e | |||
25e94d28cb | |||
1db72efa5e | |||
a8321eefe5 | |||
324e2539c1 | |||
decaa8ed66 | |||
ddf1bbb3b5 | |||
546ad07150 | |||
ff81e6b897 | |||
d4688be7e2 | |||
fe343ad2f9 | |||
54eb7be023 | |||
59a098303b | |||
d67b8c1ea7 | |||
d21f96f211 | |||
d00ebe7176 | |||
4ee37cb9a9 | |||
47ed08d61b | |||
a1fc1863fb | |||
f20e8205d8 | |||
5c492f3089 | |||
1ab9ff778a | |||
eef3582b93 | |||
cd20dc00b7 | |||
a47a497597 | |||
4324f13714 | |||
6caaea6b34 | |||
7a75f04952 | |||
233c906d57 | |||
67c3d8bd13 | |||
94466a0d1f | |||
728c17b5f5 | |||
7ac909566f | |||
4a43c155a7 | |||
56a5faaf44 | |||
872ae0d536 | |||
5c951bbfb3 | |||
8ebf735e9d | |||
30156f108e | |||
5686e415cc | |||
a4c05d34e9 | |||
e09d6a06b8 | |||
43ca5a8a1f | |||
3cc0448446 | |||
44279ea9c1 | |||
33600fe1ba | |||
20f3dfa86f | |||
4caf169c9d | |||
8fa2c56060 | |||
93010826ee | |||
f1d4771aba | |||
ce2b83f06d | |||
0460c92775 | |||
67db5ac40c | |||
88729db0cc | |||
d57446b6dc | |||
3400c02b45 | |||
765ffb3232 | |||
8c6c95e32d | |||
26c90d4bec | |||
0091e59adb | |||
74bd19b241 | |||
119b2e2a6c | |||
c643f81ce5 | |||
d74ff4f01d | |||
1c846d4e5b | |||
bd12669b88 | |||
eb53315861 | |||
9fb398a5ee | |||
d5caba5e11 | |||
2c0264a436 | |||
188b22d65d | |||
f647f16b7b | |||
89cb711f55 | |||
e91638552a | |||
e1867c01dc | |||
930e074e2f | |||
b6763ad40f | |||
40d9bd1b85 | |||
39d1e1eb5a | |||
5cc0b548c6 | |||
3a3aec4d66 | |||
83eb20d138 | |||
782a7c05be | |||
c93f97ce2e | |||
03ead39f2c | |||
f60af9b8f8 | |||
ccb70befc3 | |||
529646520d | |||
b23fef2fa4 | |||
0bf985103c | |||
cf5fb86e4b | |||
4c45a7e33d | |||
1dfa98446b | |||
ccd3f1dbc2 | |||
f2b0773fb5 | |||
a1b1d9ad93 | |||
3e4517ec42 | |||
1ffaf4ce92 | |||
15e72edb5f | |||
a96da64830 | |||
de44f23594 | |||
2e580b29f0 | |||
46141b7e50 | |||
5c95242111 | |||
93c16d4e03 | |||
4e44082cd8 | |||
79b197822a | |||
fad12d120d | |||
7fabead92d | |||
cb7ec86765 | |||
ddbe0f9bb6 | |||
b37afe3268 | |||
dbd69c8d59 | |||
d930c08a45 | |||
09c564c68d | |||
30ea9ff2b5 | |||
42602d2ce3 | |||
3359bd3f9a | |||
0115ee3b77 | |||
aa574e9205 | |||
8f38cbd736 | |||
3260e68c90 | |||
6e238cc095 | |||
3ebeebef10 | |||
8fd60fb9a9 | |||
f7bfc72cd2 | |||
97a62d3efe | |||
80b7682f89 | |||
d5d43d0c71 | |||
d1e5c6d360 | |||
3bbefdc845 | |||
16bbaf4b3a | |||
8d005f5a70 | |||
2e86bbafd0 | |||
6a4083a7a3 | |||
3b73b1c5e5 | |||
4c39ae9edf | |||
e8c38550c9 | |||
fb5bbcd1e1 | |||
35ff034786 | |||
09ac5f3f85 | |||
d8794950c0 | |||
112e3d2c33 | |||
c9d3dab042 | |||
586cd2a882 | |||
d9272d5c52 | |||
c1d8516d84 | |||
bfd0b22676 | |||
a9d56daaa0 | |||
e925c47b78 | |||
4588948d0c | |||
008cb7c023 | |||
1d075f4b3b | |||
2b9c98bbc7 | |||
689a8b9f12 | |||
590855fe75 | |||
178a81c24b | |||
a459597759 | |||
60b2d99c09 | |||
a652b0d8c5 | |||
ae9330be96 | |||
9efc68b62d | |||
a237ce85d0 | |||
eff72f41a9 | |||
60774c0532 | |||
788cea98a1 | |||
42630ab62e | |||
01cdfca7fb | |||
c143eac015 | |||
8e038d403c | |||
e916c5100d | |||
de9c9b6eb1 | |||
bb42602cb3 | |||
ed862b9666 | |||
d4e5aae7bf | |||
56672eec23 | |||
330d047495 | |||
ea9631790e | |||
28ed6b2a24 | |||
e7d4800ad7 | |||
032aefadb3 | |||
208cd03a11 | |||
212ac6764a | |||
93a7cfeb8c | |||
b45284bc0f | |||
f91ef8d9cc | |||
b7862cd9bf | |||
ef5b35378b | |||
d9af495862 | |||
ce3d9655a1 | |||
d3b15cd40a | |||
c2c02ff351 | |||
a49633f377 | |||
44132c9c52 | |||
8f14054606 | |||
0f57b9f623 | |||
cf328ef126 | |||
8dd678a118 | |||
564c6a97f7 | |||
71b31218b0 | |||
4b8d60feff | |||
a3dcc12cde | |||
7f0f312a37 | |||
2e9f5e48c4 | |||
528eb45738 | |||
708471a640 | |||
c3af49f401 | |||
9289fa17e7 | |||
0188970367 | |||
7769e34794 | |||
14cd1f0838 | |||
d0d63461e2 | |||
e70cfb1fcc | |||
d6a843bd71 | |||
a13d7a26c4 | |||
bf8c087622 | |||
1525e62429 | |||
49bdceaccf | |||
4812061c12 | |||
31b1423b7a | |||
751820a178 | |||
d2aa3c5f77 | |||
77d5bdc108 | |||
fe30f536e2 | |||
f561c8c951 | |||
5e5144c57f | |||
ad66bdc9d9 | |||
0e917deb7c | |||
753a53334f | |||
7bc8b6ea92 | |||
a8eaabda4f | |||
4de394ee88 | |||
35a5a38a9a | |||
dd4eff2efd | |||
c84235c620 | |||
3b0b12ac6c | |||
a81decf6df | |||
d0064394ad | |||
f10e51dd6d | |||
359eb5990d | |||
0b0462f8d6 | |||
7fc5bd4a70 | |||
60f8b2c2e0 | |||
e8553504c3 | |||
ba17ae3811 | |||
2f2ad5bbe0 | |||
c5b238b7f7 | |||
0a2ff37fa1 | |||
8913fd4536 | |||
db2bdbca4d | |||
77eb96f65e | |||
085b96cae7 | |||
5291c97db7 | |||
98552275d0 | |||
4cd1f2e284 | |||
1defa162a8 | |||
f25f57dc37 | |||
a4c1a1b72c | |||
32fe1ffb5f | |||
1906b6baad | |||
00d5d95221 | |||
9170486cbf | |||
0c7a9234bf | |||
994df7d6da | |||
c77fd90472 | |||
acac4f0459 | |||
b9a4ee211d | |||
cf3764cd1d | |||
eee6612b0b | |||
ad69497ce4 | |||
94f0b984dd | |||
ff9d6ec972 | |||
cceefb569c | |||
8b177c4b05 | |||
0ee032131b | |||
d2b26f5e0f | |||
f2581f0438 | |||
8cb76c0966 | |||
141b7bf72d | |||
ed01a55960 | |||
8e14009d3d | |||
ed52e7e3d8 | |||
bb201d86b1 | |||
58da41ab85 | |||
8df3ed5d8f | |||
b0f43a2077 | |||
32592b03dc | |||
d4deff1340 | |||
2254ec6c49 | |||
fe3306885c | |||
4d9ba6f971 | |||
ebdd729212 | |||
dead8eac3d | |||
7ec9a8df8f | |||
271230bb62 | |||
a351c7d2d8 | |||
c036270510 | |||
75836f6afc | |||
8c2362e719 | |||
cb992d08a7 | |||
0e25ca5584 | |||
54aa508b11 | |||
245b6e6135 | |||
8b2f39972f | |||
7b1af0a947 | |||
e91d5eac4f | |||
abc3cbc1a2 | |||
35546e7fa1 | |||
a1c6510131 | |||
eb632e27cc | |||
de61ba4a65 | |||
fad7571875 | |||
9a9cb55917 | |||
d17e9bf6fe | |||
99765bebf0 | |||
9a4538bb37 | |||
c093aff25c | |||
c0e220b1bd | |||
e28d56b053 | |||
7089917126 | |||
0e61de538e | |||
ca33060d25 | |||
75765c2063 | |||
f9db50f03a | |||
4ecee3f677 | |||
24851eb58d | |||
a0982e9bb6 | |||
10b99953f1 | |||
d50f9c5c24 | |||
306107d1c6 | |||
7d0e0a8fa6 | |||
f1a350c5b3 | |||
66708e2b76 | |||
9e0f65b147 | |||
42daba8ba6 | |||
3c7fea1e0f | |||
1589dc96fe | |||
1502a7e22b | |||
eb0f119f7a | |||
ff7fa9d9ab | |||
b0eeb9b836 | |||
c34416690c | |||
e49f508b04 | |||
0591e44775 | |||
407a636913 | |||
bc300ae594 | |||
c789261917 | |||
0d5eb38bc7 | |||
8b30fe9507 | |||
ecfbfe411d | |||
2f4241a865 | |||
ab33b268fd | |||
e0ff50089d | |||
cbd2e62539 | |||
fa238275ac | |||
fb376fe3fa | |||
896c2bc0c9 | |||
442a8b1696 | |||
d0f138a105 | |||
f155123aa4 | |||
120bf377d8 | |||
ee45e5e3a6 | |||
dcbff8c44a | |||
ddc23aafd8 | |||
f7ce65ab94 | |||
6ae32fe294 | |||
88ab56c617 | |||
56538c10d8 | |||
0514c38e54 | |||
ed36d8b709 | |||
2a312b4802 | |||
a419efe9c4 | |||
74f71a9f59 | |||
775180af8b | |||
ce56d52dd1 | |||
b48a7a393f | |||
e9094fe286 | |||
75caa9baa6 | |||
0145b26cda | |||
091bd57520 | |||
586fbd7a93 | |||
1f343ce404 | |||
dea471b766 | |||
1c4aa9f1b0 | |||
cfc80f6ab2 | |||
954a37211c | |||
bca4cf6a75 | |||
3655988315 | |||
b9c52925f9 | |||
04e9854470 | |||
04250f2fc3 | |||
1725de8c48 | |||
5d6a8914d6 | |||
b8a571065d | |||
bd7c5bd983 | |||
88132a0b59 | |||
e56fb56f7c | |||
cd8359332d | |||
cfd02321cc | |||
1228f5d97a | |||
af80d6a790 | |||
ca22a892b1 | |||
3c0062b273 | |||
acab8b346e | |||
0121371048 | |||
2662566677 | |||
900c7ff4ed | |||
109413cfa8 | |||
eafcc2dffc | |||
c2dae8ebc2 | |||
6f0ca30ad9 | |||
f5f20cfae9 | |||
c8fb0116df | |||
3b95dcfb48 | |||
3b7f9a313d | |||
343dc170bb | |||
b061f1c692 | |||
47b3491f3a | |||
51298f0662 | |||
0a2fe975b7 | |||
3ee0649275 | |||
2ee7b6c95e | |||
3b1321908e | |||
db25322daf | |||
1cc9eb8a9c | |||
bb5c78d025 | |||
0225d4aea8 | |||
39f7dc17b0 | |||
b3e4e6efdb | |||
c9c63743c5 | |||
b8b73fd6d9 | |||
76d136afac | |||
9ac4a768d4 | |||
3344f19b11 | |||
aa274a59d0 | |||
195ce98efc | |||
7cb99c62ef | |||
cbdc036422 | |||
a06e7d5ea1 | |||
8f71c56a51 | |||
5cf7a45638 | |||
3ffcaf133c | |||
65497cb9d8 | |||
b7b215b6f1 | |||
c4fdf564b2 | |||
cd6319a102 | |||
5835f9d2ad | |||
ad532b3d98 | |||
a53d1ee0d6 | |||
1d9879d966 | |||
5a518bac95 | |||
2fc71eb8e3 | |||
55f8ab5e22 | |||
dd92609cf8 | |||
9a561fe4ba | |||
1309037643 | |||
21e78ee0b9 | |||
93024c39f1 | |||
ea0ec54aad | |||
61d58dcf56 | |||
87edcfdcdc | |||
58952f884a | |||
6e7a622c88 | |||
8fa0e2a427 | |||
9c1fc63bb7 | |||
30a3246591 | |||
7ae2a75e59 | |||
f68621fd43 | |||
8b31862b02 | |||
a5c980fb99 | |||
c4f099d9f3 | |||
d2cffdfebe | |||
4915351421 | |||
f0f13bb360 | |||
eecc791540 | |||
9f868c7e04 | |||
5c4c856b84 | |||
04ddd07312 | |||
7fcd82be2a | |||
9e469cdc72 | |||
ea08824172 | |||
535a398bff | |||
02464bc6d5 | |||
5a63ceb105 | |||
44b4aa527a | |||
2f73e97f64 | |||
b03a9a1ead | |||
05af938cb8 | |||
42383489bd | |||
91ba18f3bd | |||
0765c02aa5 | |||
84c1729a81 | |||
fdce2ebd8e | |||
d6cabd2e09 | |||
c7b777dfb2 | |||
6453954565 | |||
3248c81c62 | |||
c8c6f914c2 | |||
139dc7cec7 | |||
5c57f8a1a7 | |||
e7206f2e30 | |||
babefe4160 | |||
8b50316787 | |||
494cb061c3 | |||
3aacd81d26 | |||
e5ec9c5e44 | |||
14d759d18b | |||
18a07a15f7 | |||
f0834dc9c5 | |||
ba233165ab | |||
79d4618345 | |||
8c121c5457 | |||
7bb469f3c7 | |||
96041807a0 | |||
068545a2a9 | |||
e59bd1098f | |||
88eb3ae68d | |||
b75e04dcab | |||
fbb475123f | |||
3cf7321d3b | |||
7615dfa443 | |||
2fbdd56a0d | |||
5eee20877a | |||
76a825b887 | |||
2b1dc0efc2 | |||
a23b23b774 | |||
8689bc993e | |||
9b3e3aa738 | |||
e713c72bfa | |||
b5c3b13dce | |||
0570e2cdf2 | |||
17fd7108f1 | |||
7b4b2370ff | |||
271313c025 | |||
e09ff53d58 | |||
d6a58ff1ac | |||
474b8b2121 | |||
04812a5131 | |||
86b4247b81 | |||
63fa5e6811 | |||
d7a2bcb266 | |||
f5cc9bcee6 | |||
618e485460 | |||
6424e6e426 | |||
cc1ce40858 | |||
474565a66d | |||
a6348344f1 | |||
4012bfd2cf | |||
3d4b3e059d | |||
2a4316079a | |||
b445e9f4e2 | |||
50904504cf | |||
4f8e5ee948 | |||
7f9771081a | |||
64b08f61bf | |||
794f037727 | |||
4502497371 | |||
7d184a5e55 | |||
08ebab728c | |||
d9bb7419cc | |||
099751a8b9 | |||
7d5e4feada | |||
33082a98ed | |||
71899930aa | |||
f6ac5fc776 | |||
a621d4b6f7 | |||
6f79f007de | |||
08bc17d186 | |||
a562c85dac | |||
ed2d12dbba | |||
2c69626a1d | |||
ea7b2c9499 | |||
5f61d9d8e6 | |||
83a3829206 | |||
5fec8a7e09 | |||
8bd7dd6157 | |||
68636deeaf | |||
b1f0e12111 | |||
c587e97eba | |||
9b41a2468c | |||
dc641b9298 | |||
75236067e5 | |||
d56a7db02a | |||
7de5103fcc | |||
ca002781c2 | |||
107f689595 | |||
5a29be3f92 | |||
2180e8a287 | |||
41d22a804d | |||
b5ced99621 | |||
fc791c497d | |||
76936c9afd | |||
0f28572ef1 | |||
a5f7e4885d | |||
10459db183 | |||
77950f77bc | |||
f0192cce73 | |||
e215dd610e | |||
e32fad5185 | |||
43235e69ba | |||
6fd9ea1b72 | |||
9110dd0f38 | |||
7aecaa22ba | |||
5c0f778666 | |||
e1e60c736e | |||
e73604dfb5 | |||
5a23138268 | |||
5c89cd2fe4 | |||
ab7e3b7279 | |||
dcad1b2387 | |||
abb7b8dd5d | |||
2465e29628 | |||
51e951ef3b | |||
7f1fc72e3e | |||
d9fe19a8d7 | |||
cc73cefd3f | |||
f3ce95b6b8 | |||
7b190170c5 | |||
c7071e527e | |||
34e946e50f | |||
2df763d147 | |||
e26bae0d83 | |||
6dcde6b1b7 | |||
8726acfb5a | |||
996874daa1 | |||
1e001b616a | |||
865860affe | |||
2c4fd49478 | |||
909d72dbbe | |||
382d7001e1 | |||
514fab16e3 | |||
d1bbd5d92b | |||
3f5555ee19 | |||
38460eaa1a | |||
033ed60148 | |||
e0e37bb64d | |||
1f8390c8a6 | |||
00c43bf8b7 | |||
708962647c | |||
654b6375fb | |||
f1ed392b94 | |||
2381b5b5fb | |||
4107481747 | |||
3c1cf64b15 | |||
5a0b275610 | |||
930bb1c7fc | |||
776ec5d517 | |||
959aa29f92 | |||
e254d01a65 | |||
aaaab931b7 | |||
e79eb87cbb | |||
b42e3eb964 | |||
23b6ac07be | |||
051d723d13 | |||
ab3df0c5dc | |||
aac3da3111 | |||
0f1de08356 | |||
c04fa23578 | |||
062aa18730 | |||
1fa6bc7008 | |||
5fce8da961 | |||
bb2288a461 | |||
f454a032c9 | |||
cc0c947d6b | |||
c87201db13 | |||
5bd184c609 | |||
6f00608fba | |||
352a8d3b40 | |||
2b5336c342 | |||
54bddc820a | |||
8ad5b4ef61 | |||
5d11a09866 | |||
3990d2de71 | |||
20383fee48 | |||
fb193aba20 | |||
f5b03f22b7 | |||
0cb54d34ef | |||
32add6d2a0 | |||
bf0bc75b90 | |||
d8e60644e8 | |||
4ad3596daa | |||
9752af1363 | |||
769b34c3e6 | |||
69bb14288d | |||
c58b1e3db3 | |||
1ad6de7e4c | |||
cac8a17bb6 | |||
4bbea8f134 | |||
19908307d6 | |||
63e1acc02a | |||
dd34e4780e | |||
0c4290b0c4 | |||
87b7219901 | |||
bbfd938001 | |||
e8975ec92c | |||
bb0a15f4e6 | |||
8f75590e8d | |||
4cabfeccec | |||
5c22c045a1 | |||
f5792f1bad | |||
4181805ff2 | |||
b6be233241 | |||
b2ebe2df0a | |||
77fb8d50d1 | |||
b7fd5a01e1 | |||
bcfa689fab | |||
e2c724ce23 | |||
d6bf969212 | |||
9545113e43 | |||
817a942bba | |||
def3636196 | |||
1b143eb222 | |||
2faf541c93 | |||
358d3e6ca5 | |||
dd750f88ad | |||
5a9fce85a2 | |||
df915f8ebb | |||
d9a0083edd | |||
742f7decee | |||
6a9d248c4a | |||
d4d3e1223d | |||
e560fe5712 | |||
0073374d91 | |||
1a3b9e03cf | |||
0b609be2fe | |||
812b0eface | |||
4990931c3c | |||
fd7a19c9b1 | |||
4ea1aa2370 | |||
ba498cad2a | |||
af5d5bbcba | |||
f190b64766 | |||
8fbc86f410 | |||
fc9038cd62 | |||
fbb169c37c | |||
bd150c9606 | |||
72598ad05f | |||
e0b5a8f22a | |||
294cb75e4d | |||
5b66c3ef0c | |||
025c998350 | |||
f965f7ea44 | |||
0430331123 | |||
66b58e5960 | |||
89524f5341 | |||
e6a3c531b5 | |||
d4c27860f3 | |||
474c198166 | |||
19ce82deb9 | |||
c25a3bfed9 | |||
f2033556e3 | |||
947136a383 | |||
5bd9d312b2 | |||
bab0c9707f | |||
880895e73a | |||
4d3281cf4b | |||
8bcaa75283 | |||
3bbf6a042d | |||
dec304a40b | |||
1c0f7adf13 | |||
57d17a5ca8 | |||
f435fac2a0 | |||
1fb4a4a53b | |||
221ebcc8ff | |||
11242dac1f | |||
6e14f36735 | |||
e2b44d2a55 | |||
476cb55d23 | |||
6f35ce264d | |||
7370a2f52b | |||
d70879ea9e | |||
a8c1513bb7 | |||
0cb044e39d | |||
22ec70cd72 | |||
b5256e2a2b | |||
6cde13127d | |||
23a5a5f38c | |||
b69274649a | |||
a33521b8bc | |||
76a5765552 | |||
024647af46 | |||
e7d8c9a538 | |||
f7e633eda7 | |||
2d24f80cb0 | |||
075c26e097 | |||
da04b3ac06 | |||
d09a588359 | |||
fac2025154 | |||
0f2beffdf4 | |||
442db787d7 | |||
0c5efeca3b | |||
e82f1b1266 | |||
107af77189 | |||
93f03adc58 | |||
c4b067a10f | |||
c18c1d66a9 | |||
5d556fc310 | |||
98b0fa8c64 | |||
de5c9d6398 | |||
3f6d3ee36b | |||
fdfc06d29d | |||
38cab08d72 | |||
3dfa4a8cd9 | |||
9c2c91f165 | |||
c266e2dcde | |||
17f6d34211 | |||
234804efe8 | |||
05cdb4c3c1 | |||
0c643f3632 | |||
7330852b6b | |||
89ce45be6c | |||
aff160a07f | |||
f587156df1 | |||
0a44a49647 | |||
7db119748b | |||
f419a65376 | |||
9c689a5e2d | |||
640dd23f73 | |||
24e2767f33 | |||
9d185a985b | |||
02a25ede19 | |||
44cf550778 | |||
d292ed6be3 | |||
d7289a3f18 | |||
6d7908099d | |||
8052780520 | |||
ae96dafdf5 | |||
ce70d76743 | |||
10aa233cb4 | |||
3d932398aa | |||
f1b6ffae73 | |||
b74cd69305 | |||
967ab54075 | |||
26785ac448 | |||
6c59070afb | |||
4f03b54463 | |||
b01777e22c | |||
1a6621475a | |||
2973fcacb0 | |||
f1b88a9c60 | |||
83ab3d8758 | |||
d6fd9d1cda | |||
21ce41e6f3 | |||
f8606aaa25 | |||
67d3f67d6c | |||
cc8b93606a | |||
73ab1b679d | |||
cf53e1fb43 | |||
c3955ea34e | |||
cce2ed885a | |||
43528a6327 | |||
d8209ef111 | |||
9794cbde3c | |||
ccef616189 | |||
baa2da8a3a | |||
f7893ead14 | |||
dfa8ff99dc | |||
d9a255ae6a | |||
07145d40ba | |||
0f0b7b90e5 | |||
4b0277a30d | |||
2d7e51027b | |||
0afeefd964 | |||
54e00598cd | |||
bb0abf4794 | |||
cc6474217b | |||
be55e9a6f4 | |||
90a65d8090 | |||
3f7fe50113 | |||
1c7c240874 | |||
e1fe843299 | |||
04c079c625 | |||
ff39de09ef | |||
a5cf4f9483 | |||
2f57691e58 | |||
e58dee3984 | |||
09b935cfdd | |||
bbf1e3d2c1 | |||
629dbb0e50 | |||
4c0ec7de3d | |||
20816fe831 | |||
b20efd0e1a | |||
3d7f3f2c90 | |||
beebb9ee3b | |||
dfa99dc174 | |||
9e7a3b878b | |||
fea9ed9d31 | |||
c2d664bcf5 | |||
baac823ce6 | |||
a6859394bf | |||
cbd98c1d28 | |||
045b0d4801 | |||
c55c440352 | |||
d82b4f0c0d | |||
1cb00edd36 | |||
2984ab5ed4 | |||
d094ea6388 | |||
a5a733c352 | |||
06dbf55a27 | |||
54102a8b4c | |||
77492635d7 | |||
8346db59a3 | |||
4b1bc40307 | |||
e39c66cb8b | |||
c644913694 | |||
2c8e56dd7a | |||
e344ff2243 | |||
e555a5a90b | |||
98e007a308 | |||
7858731dfe | |||
a9dc7c3c54 | |||
04c82c11c5 | |||
8fc5ff8be1 | |||
9b19cc0cf7 | |||
311505beec | |||
d8dd1c28d7 | |||
7382aacf2a | |||
6eea97f1be | |||
8295e1ac18 | |||
260eed9293 | |||
60b622c9f0 | |||
f400c5b280 | |||
edf788f6dd | |||
e657e9b7e8 | |||
81072dbfd7 | |||
cb512b4ac4 | |||
567ba57a13 | |||
2f96a1a349 | |||
5ea5fb9d79 | |||
bc62d4e46c | |||
b3aab7ddfc | |||
d396c921d7 | |||
294123505b | |||
43d60ff90b | |||
8a5ca7bdc7 | |||
7f96c2b0ab | |||
5719a9ec36 | |||
a1df846526 | |||
d27f988107 | |||
46c32c1e4c | |||
46202ca6dd | |||
a0b3f8bfa2 | |||
3f689ebc75 | |||
f1097a3c68 | |||
28041d72bb | |||
3c3ecc5e4c | |||
f176f5a134 | |||
c3a38d3d5f | |||
1502609913 | |||
376576e495 | |||
4edf7e24ff | |||
de3d89a631 | |||
4d2d0eb63e | |||
efe1e7b926 | |||
bfa7bd4635 | |||
acebbfbc16 | |||
ec860084c5 | |||
21da3a57ce | |||
5520cade70 | |||
95d0f34249 | |||
8c5274657b | |||
ee270d70c2 | |||
ea960268e2 | |||
133680c19c | |||
a161e536a7 | |||
442a098690 | |||
58cacbe23e | |||
f829a2ed9d | |||
2916e6620d | |||
575fa0bf9c | |||
075924fd6f | |||
d6920f77d3 | |||
31efa378a6 | |||
92dcc0cec6 | |||
5a3b90dadd | |||
4f451a146a | |||
efbb7bdfaf | |||
befc10bb4a | |||
a6bcf0093d | |||
34652dc563 | |||
bd05fae22f | |||
6edf4b8a39 | |||
f4603911e7 | |||
f49f1a9b22 | |||
e3ea211423 | |||
8834828a95 | |||
086fd5bc50 | |||
bcfb2f6352 | |||
cde45407a1 | |||
d1c7c27a54 | |||
b85dda99d9 | |||
1cce1c91c1 | |||
4ba01ebaea | |||
24d3b65ec1 | |||
28ec8e7285 | |||
98346d6f10 | |||
e0e9c695b5 | |||
4c2d5bb480 | |||
2a05d1a0a8 |
@ -1,3 +0,0 @@
|
||||
<?php
|
||||
// Fix DocumentRoot for VirtualDocumentRoot Hosts
|
||||
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']);
|
@ -1,30 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
// TODO: logpath could also be passed via CMD argument
|
||||
// so this script could be more general
|
||||
$path = '/var/log/apache-2.2';
|
||||
$fh_timeout = 30; // 30 sek.
|
||||
|
||||
$fd = fopen('php://stdin', 'r');
|
||||
|
||||
while (!feof($fd)) {
|
||||
|
||||
$row = fgets($fd);
|
||||
|
||||
list($vhost, $h, $l, $u, $t, $r, $s, $b, $referrer, $ua) = explode(';', $row, 10);
|
||||
|
||||
if (!isset(${$vhost})) {
|
||||
${$vhost} = fopen($path . '/' . $vhost . '_access.log', 'a+');
|
||||
}
|
||||
$lastwrite[$vhost] = time();
|
||||
fputs(${$vhost}, "$h $l $u $t $r $s $b $referrer $ua");
|
||||
|
||||
foreach ($lastwrite as $vhost => $time) {
|
||||
if ((time() - ($time + 30)) >= 0) {
|
||||
fclose(${$vhost});
|
||||
unset(${$vhost});
|
||||
unset($lastwrite[$vhost]);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
<?php
|
||||
// Fix DocumentRoot for VirtualDocumentRoot Hosts
|
||||
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']);
|
@ -1,30 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
// TODO: logpath could also be passed via CMD argument
|
||||
// so this script could be more general
|
||||
$path = '/var/log/apache-2.4';
|
||||
$fh_timeout = 30; // 30 sek.
|
||||
|
||||
$fd = fopen('php://stdin', 'r');
|
||||
|
||||
while (!feof($fd)) {
|
||||
|
||||
$row = fgets($fd);
|
||||
|
||||
list($vhost, $h, $l, $u, $t, $r, $s, $b, $referrer, $ua) = explode(';', $row, 10);
|
||||
|
||||
if (!isset(${$vhost})) {
|
||||
${$vhost} = fopen($path . '/' . $vhost . '_access.log', 'a+');
|
||||
}
|
||||
$lastwrite[$vhost] = time();
|
||||
fputs(${$vhost}, "$h $l $u $t $r $s $b $referrer $ua");
|
||||
|
||||
foreach ($lastwrite as $vhost => $time) {
|
||||
if ((time() - ($time + 30)) >= 0) {
|
||||
fclose(${$vhost});
|
||||
unset(${$vhost});
|
||||
unset($lastwrite[$vhost]);
|
||||
}
|
||||
}
|
||||
}
|
4
.devilbox/cfg/mysql.cnf
Normal file
4
.devilbox/cfg/mysql.cnf
Normal file
@ -0,0 +1,4 @@
|
||||
[mysqld]
|
||||
server_id = 1
|
||||
log_bin = "mysql-bin"
|
||||
sync_binlog = 0
|
@ -1,23 +0,0 @@
|
||||
CustomLog "/var/log/apache-2.2/access_log" combined
|
||||
ErrorLog "/var/log/apache-2.2/error_log"
|
||||
LogLevel warn
|
||||
|
||||
AddDefaultCharset UTF-8
|
||||
|
||||
# No DNS
|
||||
HostnameLookups Off
|
||||
#
|
||||
Timeout 60
|
||||
KeepAlive On
|
||||
KeepAliveTimeout 10
|
||||
MaxKeepAliveRequests 100
|
||||
#
|
||||
#
|
||||
EnableMMAP Off
|
||||
EnableSendfile Off
|
||||
#
|
||||
#
|
||||
#
|
||||
#
|
||||
XSendFile On
|
||||
XSendFilePath /shared/httpd
|
@ -1,6 +0,0 @@
|
||||
#### PHP-FPM config ####
|
||||
|
||||
AddType application/x-httpd-fastphp5 .php
|
||||
Action application/x-httpd-fastphp5 /php5-fcgi
|
||||
Alias /php5-fcgi /usr/local/bin/php-fcgi
|
||||
FastCgiExternalServer /usr/local/bin/php-fcgi -host 172.16.238.11:9000 -pass-header Authorization
|
@ -1,31 +0,0 @@
|
||||
##
|
||||
## Default Host for http://localhost
|
||||
##
|
||||
NameVirtualHost *:80
|
||||
|
||||
<VirtualHost _default_:80>
|
||||
ServerName localhost
|
||||
ServerAdmin root@localhost
|
||||
|
||||
ErrorLog /var/log/apache-2.2/localhost-error.log
|
||||
CustomLog /var/log/apache-2.2/localhost-access.log combined
|
||||
|
||||
DirectoryIndex index.php index.html
|
||||
|
||||
DocumentRoot "/var/www/default/htdocs"
|
||||
<Directory "/var/www/default/htdocs">
|
||||
DirectoryIndex index.php index.html
|
||||
|
||||
AllowOverride All
|
||||
Options All
|
||||
|
||||
RewriteEngine on
|
||||
RewriteBase /
|
||||
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
|
||||
|
||||
|
@ -1,43 +0,0 @@
|
||||
##
|
||||
## Default Mass Virtual Host
|
||||
##
|
||||
|
||||
<VirtualHost *:80>
|
||||
|
||||
# Get the server name from the Host: header
|
||||
UseCanonicalName Off
|
||||
|
||||
ServerName localhost
|
||||
ServerAlias *.loc
|
||||
ServerAdmin root@localhost
|
||||
|
||||
# splitlogs.php is a custom script, which will filter the domain
|
||||
# and create separate logfiles per domain.
|
||||
LogFormat "%V;%h;%l;%u;%t;\"%r\";%>s;%b;\"%{Referer}i\";\"%{User-agent}i\"" vcommon
|
||||
CustomLog "|/opt/bin/splitlogs.php" vcommon
|
||||
|
||||
ErrorLog /var/log/apache-2.2/other-error.log
|
||||
|
||||
DirectoryIndex index.php index.html
|
||||
|
||||
# When using VirtualDocumentRoot the PHP Env var DOCUMENT_ROOT
|
||||
# is not filled, so we need to do that manually with a custom script.
|
||||
VirtualDocumentRoot /shared/httpd/%-2+/htdocs/
|
||||
php_admin_value auto_prepend_file /opt/bin/fix-virtual-docroot.php
|
||||
|
||||
<Directory "/shared/httpd/*/htdocs/">
|
||||
DirectoryIndex index.php index.html
|
||||
|
||||
AllowOverride All
|
||||
Options All
|
||||
|
||||
RewriteEngine on
|
||||
RewriteBase /
|
||||
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
|
||||
|
||||
|
@ -1,23 +0,0 @@
|
||||
CustomLog "/var/log/apache-2.4/access_log" combined
|
||||
ErrorLog "/var/log/apache-2.4/error_log"
|
||||
LogLevel warn
|
||||
|
||||
AddDefaultCharset UTF-8
|
||||
|
||||
# No DNS
|
||||
HostnameLookups Off
|
||||
#
|
||||
Timeout 60
|
||||
KeepAlive On
|
||||
KeepAliveTimeout 10
|
||||
MaxKeepAliveRequests 100
|
||||
#
|
||||
#
|
||||
EnableMMAP Off
|
||||
EnableSendfile Off
|
||||
#
|
||||
#
|
||||
#
|
||||
#
|
||||
XSendFile On
|
||||
XSendFilePath /shared/httpd
|
@ -1,17 +0,0 @@
|
||||
#### PHP-FPM config ####
|
||||
|
||||
# enablereuse
|
||||
# Defining a worker will improve performance
|
||||
# And in this case, re-use the worker (dependent on support from the fcgi application)
|
||||
# If you have enough idle workers, this would only improve the performance marginally
|
||||
#
|
||||
# enablereuse requires Apache 2.4.11 or later
|
||||
#<Proxy "fcgi://172.16.238.11:9000/" enablereuse=on max=10></Proxy>
|
||||
<FilesMatch "\.php$">
|
||||
Require all granted
|
||||
# Pick one of the following approaches
|
||||
# Use the standard TCP socket
|
||||
SetHandler "proxy:fcgi://172.16.238.11:9000"
|
||||
# If your version of httpd is 2.4.9 or newer (or has the back-ported feature), you can use the unix domain socket
|
||||
#SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/:9000"
|
||||
</FilesMatch>
|
@ -1,32 +0,0 @@
|
||||
##
|
||||
## Default Host for http://localhost
|
||||
##
|
||||
|
||||
|
||||
<VirtualHost _default_:80>
|
||||
ServerName localhost
|
||||
ServerAdmin root@localhost
|
||||
|
||||
ErrorLog /var/log/apache-2.4/localhost-error.log
|
||||
CustomLog /var/log/apache-2.4/localhost-access.log combined
|
||||
|
||||
DirectoryIndex index.php index.html
|
||||
|
||||
DocumentRoot "/var/www/default/htdocs"
|
||||
<Directory "/var/www/default/htdocs">
|
||||
DirectoryIndex index.php index.html
|
||||
|
||||
AllowOverride All
|
||||
Options All
|
||||
|
||||
RewriteEngine on
|
||||
RewriteBase /
|
||||
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
Require all granted
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
|
||||
|
||||
|
@ -1,44 +0,0 @@
|
||||
##
|
||||
## Default Mass Virtual Host
|
||||
##
|
||||
|
||||
<VirtualHost *:80>
|
||||
|
||||
# Get the server name from the Host: header
|
||||
UseCanonicalName Off
|
||||
|
||||
ServerName localhost
|
||||
ServerAlias *.loc
|
||||
ServerAdmin root@localhost
|
||||
|
||||
# splitlogs.php is a custom script, which will filter the domain
|
||||
# and create separate logfiles per domain.
|
||||
LogFormat "%V;%h;%l;%u;%t;\"%r\";%>s;%b;\"%{Referer}i\";\"%{User-agent}i\"" vcommon
|
||||
CustomLog "|/opt/bin/splitlogs.php" vcommon
|
||||
|
||||
ErrorLog /var/log/apache-2.4/other-error.log
|
||||
|
||||
DirectoryIndex index.php index.html
|
||||
|
||||
# When using VirtualDocumentRoot the PHP Env var DOCUMENT_ROOT
|
||||
# is not filled, so we need to do that manually with a custom script.
|
||||
VirtualDocumentRoot /shared/httpd/%-2+/htdocs/
|
||||
php_admin_value auto_prepend_file /opt/bin/fix-virtual-docroot.php
|
||||
|
||||
<Directory "/shared/httpd/*/htdocs/">
|
||||
DirectoryIndex index.php index.html
|
||||
|
||||
AllowOverride All
|
||||
Options All
|
||||
|
||||
RewriteEngine on
|
||||
RewriteBase /
|
||||
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
Require all granted
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
access_log /var/log/nginx-mainline/access.log main;
|
||||
error_log /var/log/nginx-mainline/error.log warn;
|
||||
|
||||
charset utf-8;
|
||||
|
||||
send_timeout 60;
|
||||
keepalive_timeout 10;
|
||||
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
@ -1,56 +0,0 @@
|
||||
##
|
||||
## Default Host for http://localhost
|
||||
##
|
||||
|
||||
server {
|
||||
listen 80 default_server;
|
||||
server_name _;
|
||||
|
||||
# Root directive
|
||||
root /var/www/default/htdocs;
|
||||
index index.php;
|
||||
|
||||
access_log /var/log/nginx-mainline/localhost-access.log main;
|
||||
error_log /var/log/nginx-mainline/localhost-error.log warn;
|
||||
|
||||
|
||||
# Front-controller pattern as recommended by the nginx docs
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php;
|
||||
}
|
||||
|
||||
# PHP FPM
|
||||
location ~ \.php?$ {
|
||||
# PHP.INI:
|
||||
# ---------------------------
|
||||
# // Find this:
|
||||
# cgi.fix_pathinfo=1
|
||||
# // Replace with:
|
||||
# cgi.fix_pathinfo=0
|
||||
|
||||
try_files $uri = 404;
|
||||
include fastcgi_params;
|
||||
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_split_path_info ^(.+\.php)(.*)$;
|
||||
|
||||
#### FPM Server
|
||||
fastcgi_pass 172.16.238.11:9000;
|
||||
|
||||
fastcgi_index index.php;
|
||||
fastcgi_intercept_errors on;
|
||||
}
|
||||
|
||||
|
||||
|
||||
# deny access to .htaccess files, if Apache's document root
|
||||
# concurs with nginx's one
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
|
||||
# disallow access to git configs path
|
||||
location ~ /\.git {
|
||||
deny all;
|
||||
}
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
##
|
||||
## Default Mass Virtual Host
|
||||
##
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name ~^(?<domain>.+)\.loc$;
|
||||
|
||||
# Root directive
|
||||
root /shared/httpd/$domain/htdocs/;
|
||||
index index.php;
|
||||
|
||||
access_log /var/log/nginx-mainline/$domain-access.log main;
|
||||
error_log /var/log/nginx-mainline/other-error.log warn;
|
||||
|
||||
|
||||
# Front-controller pattern as recommended by the nginx docs
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php;
|
||||
}
|
||||
|
||||
# PHP FPM
|
||||
location ~ \.php?$ {
|
||||
# PHP.INI:
|
||||
# ---------------------------
|
||||
# // Find this:
|
||||
# cgi.fix_pathinfo=1
|
||||
# // Replace with:
|
||||
# cgi.fix_pathinfo=0
|
||||
|
||||
try_files $uri = 404;
|
||||
include fastcgi_params;
|
||||
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_split_path_info ^(.+\.php)(.*)$;
|
||||
|
||||
#### SOCKET
|
||||
fastcgi_pass 172.16.238.11:9000;
|
||||
|
||||
fastcgi_index index.php;
|
||||
fastcgi_intercept_errors on;
|
||||
}
|
||||
|
||||
|
||||
|
||||
# deny access to .htaccess files, if Apache's document root
|
||||
# concurs with nginx's one
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
|
||||
# disallow access to git configs path
|
||||
location ~ /\.git {
|
||||
deny all;
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
access_log /var/log/nginx-stable/access.log main;
|
||||
error_log /var/log/nginx-stable/error.log warn;
|
||||
|
||||
charset utf-8;
|
||||
|
||||
send_timeout 60;
|
||||
keepalive_timeout 10;
|
||||
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
@ -1,56 +0,0 @@
|
||||
##
|
||||
## Default Host for http://localhost
|
||||
##
|
||||
|
||||
server {
|
||||
listen 80 default_server;
|
||||
server_name _;
|
||||
|
||||
# Root directive
|
||||
root /var/www/default/htdocs;
|
||||
index index.php;
|
||||
|
||||
access_log /var/log/nginx-stable/localhost-access.log main;
|
||||
error_log /var/log/nginx-stable/localhost-error.log warn;
|
||||
|
||||
|
||||
# Front-controller pattern as recommended by the nginx docs
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php;
|
||||
}
|
||||
|
||||
# PHP FPM
|
||||
location ~ \.php?$ {
|
||||
# PHP.INI:
|
||||
# ---------------------------
|
||||
# // Find this:
|
||||
# cgi.fix_pathinfo=1
|
||||
# // Replace with:
|
||||
# cgi.fix_pathinfo=0
|
||||
|
||||
try_files $uri = 404;
|
||||
include fastcgi_params;
|
||||
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_split_path_info ^(.+\.php)(.*)$;
|
||||
|
||||
#### FPM Server
|
||||
fastcgi_pass 172.16.238.11:9000;
|
||||
|
||||
fastcgi_index index.php;
|
||||
fastcgi_intercept_errors on;
|
||||
}
|
||||
|
||||
|
||||
|
||||
# deny access to .htaccess files, if Apache's document root
|
||||
# concurs with nginx's one
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
|
||||
# disallow access to git configs path
|
||||
location ~ /\.git {
|
||||
deny all;
|
||||
}
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
##
|
||||
## Default Mass Virtual Host
|
||||
##
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name ~^(?<domain>.+)\.loc$;
|
||||
|
||||
# Root directive
|
||||
root /shared/httpd/$domain/htdocs/;
|
||||
index index.php;
|
||||
|
||||
access_log /var/log/nginx-stable/$domain-access.log main;
|
||||
error_log /var/log/nginx-stable/other-error.log warn;
|
||||
|
||||
|
||||
# Front-controller pattern as recommended by the nginx docs
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php;
|
||||
}
|
||||
|
||||
# PHP FPM
|
||||
location ~ \.php?$ {
|
||||
# PHP.INI:
|
||||
# ---------------------------
|
||||
# // Find this:
|
||||
# cgi.fix_pathinfo=1
|
||||
# // Replace with:
|
||||
# cgi.fix_pathinfo=0
|
||||
|
||||
try_files $uri = 404;
|
||||
include fastcgi_params;
|
||||
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_split_path_info ^(.+\.php)(.*)$;
|
||||
|
||||
#### SOCKET
|
||||
fastcgi_pass 172.16.238.11:9000;
|
||||
|
||||
fastcgi_index index.php;
|
||||
fastcgi_intercept_errors on;
|
||||
}
|
||||
|
||||
|
||||
|
||||
# deny access to .htaccess files, if Apache's document root
|
||||
# concurs with nginx's one
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
|
||||
# disallow access to git configs path
|
||||
location ~ /\.git {
|
||||
deny all;
|
||||
}
|
||||
}
|
1
.devilbox/www/api/devilbox-api/status.json
Normal file
1
.devilbox/www/api/devilbox-api/status.json
Normal file
@ -0,0 +1 @@
|
||||
{"success":"true"}
|
@ -1,43 +1,183 @@
|
||||
<?PHP
|
||||
// Measure time
|
||||
$TIME_START = microtime(true);
|
||||
$MY_DIR = dirname(__FILE__);
|
||||
|
||||
// Start session
|
||||
session_start();
|
||||
|
||||
// Turn on all PHP errors
|
||||
error_reporting(-1);
|
||||
|
||||
|
||||
// Translate Docker environmental variables to $ENV
|
||||
$ENV = array();
|
||||
exec('env', $output);
|
||||
foreach ($output as $var) {
|
||||
$tmp = explode('=', $var);
|
||||
$ENV[$tmp[0]] = $tmp[1];
|
||||
}
|
||||
// Shorten DNS timeouts for gethostbyname in case DNS server is down
|
||||
putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
|
||||
|
||||
|
||||
$DEVILBOX_VERSION = 'v3.0.0-beta-0.3';
|
||||
$DEVILBOX_DATE = '2023-01-02';
|
||||
$DEVILBOX_API_PAGE = 'devilbox-api/status.json';
|
||||
|
||||
//
|
||||
// Set Directories
|
||||
//
|
||||
$CONF_DIR = dirname(__FILE__);
|
||||
$LIB_DIR = $CONF_DIR . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR .'lib';
|
||||
$VEN_DIR = $CONF_DIR . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR .'vendor';
|
||||
$LOG_DIR = dirname(dirname($CONF_DIR)) . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR . 'devilbox';
|
||||
|
||||
|
||||
//
|
||||
// Load Base classes
|
||||
//
|
||||
require $LIB_DIR . DIRECTORY_SEPARATOR . 'container' . DIRECTORY_SEPARATOR .'BaseClass.php';
|
||||
require $LIB_DIR . DIRECTORY_SEPARATOR . 'container' . DIRECTORY_SEPARATOR .'BaseInterface.php';
|
||||
|
||||
|
||||
|
||||
// HTTPD Docker
|
||||
//
|
||||
// Set Docker addresses
|
||||
//
|
||||
$DNS_HOST_NAME = 'bind';
|
||||
$PHP_HOST_NAME = 'php';
|
||||
$HTTPD_HOST_NAME = 'httpd';
|
||||
$HTTPD_HOST_ADDR = gethostbyname($HTTPD_HOST_NAME);
|
||||
|
||||
// PHP Docker
|
||||
$PHP_HOST_NAME = 'php';
|
||||
$PHP_HOST_ADDR = gethostbyname($PHP_HOST_NAME);
|
||||
|
||||
// MySQL Docker
|
||||
$MYSQL_HOST_NAME = 'db';
|
||||
$MYSQL_HOST_ADDR = gethostbyname($MYSQL_HOST_NAME);
|
||||
$MYSQL_ROOT_PASS = $ENV['MYSQL_ROOT_PASSWORD'];
|
||||
|
||||
// MySQL Connection variables
|
||||
$MY_MYSQL_ERR = NULL;
|
||||
$MY_MYSQL_LINK = NULL;
|
||||
|
||||
// VirtualHost DNS check
|
||||
// Temporarily disable due to:
|
||||
// https://github.com/cytopia/devilbox/issues/8
|
||||
$ENABLE_VHOST_DNS_CHECK = FALSE;
|
||||
$MYSQL_HOST_NAME = 'mysql';
|
||||
$PGSQL_HOST_NAME = 'pgsql';
|
||||
$REDIS_HOST_NAME = 'redis';
|
||||
$MEMCD_HOST_NAME = 'memcd';
|
||||
$MONGO_HOST_NAME = 'mongo';
|
||||
|
||||
|
||||
require $MY_DIR . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR .'functions.php';
|
||||
//
|
||||
// Lazy Container Loader
|
||||
//
|
||||
function loadFile($class, $base_path) {
|
||||
static $_LOADED_FILE;
|
||||
|
||||
if (isset($CONNECT) && $CONNECT) {
|
||||
$MY_MYSQL_LINK = my_mysql_connect($MY_MYSQL_ERR);
|
||||
}
|
||||
if (isset($_LOADED_FILE[$class])) {
|
||||
return;
|
||||
}
|
||||
|
||||
require $base_path . DIRECTORY_SEPARATOR . $class . '.php';
|
||||
$_LOADED_FILE[$class] = true;
|
||||
return;
|
||||
}
|
||||
function loadClass($class) {
|
||||
|
||||
static $_LOADED_LIBS;
|
||||
|
||||
if (isset($_LOADED_LIBS[$class])) {
|
||||
return $_LOADED_LIBS[$class];
|
||||
} else {
|
||||
|
||||
$lib_dir = $GLOBALS['LIB_DIR'];
|
||||
$cnt_dir = $GLOBALS['LIB_DIR'] . DIRECTORY_SEPARATOR . 'container';
|
||||
|
||||
switch($class) {
|
||||
//
|
||||
// Lib Classes
|
||||
//
|
||||
case 'Logger':
|
||||
loadFile($class, $lib_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Logger::getInstance();
|
||||
break;
|
||||
|
||||
case 'Html':
|
||||
loadFile($class, $lib_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Html::getInstance();
|
||||
break;
|
||||
|
||||
case 'Helper':
|
||||
loadFile($class, $lib_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Helper::getInstance();
|
||||
break;
|
||||
|
||||
//
|
||||
// Docker Container Classes
|
||||
//
|
||||
case 'Php':
|
||||
loadFile($class, $cnt_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Php::getInstance($GLOBALS['PHP_HOST_NAME']);
|
||||
break;
|
||||
|
||||
case 'Dns':
|
||||
loadFile($class, $cnt_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Dns::getInstance($GLOBALS['DNS_HOST_NAME']);
|
||||
break;
|
||||
|
||||
case 'Httpd':
|
||||
loadFile($class, $cnt_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Httpd::getInstance($GLOBALS['HTTPD_HOST_NAME']);
|
||||
break;
|
||||
|
||||
case 'Mysql':
|
||||
loadFile($class, $cnt_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Mysql::getInstance($GLOBALS['MYSQL_HOST_NAME'], array(
|
||||
'user' => 'root',
|
||||
'pass' => loadClass('Helper')->getEnv('MYSQL_ROOT_PASSWORD')
|
||||
));
|
||||
break;
|
||||
|
||||
case 'Pgsql':
|
||||
loadFile($class, $cnt_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Pgsql::getInstance($GLOBALS['PGSQL_HOST_NAME'], array(
|
||||
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
|
||||
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),
|
||||
'db' => 'postgres'
|
||||
));
|
||||
break;
|
||||
|
||||
case 'Redis':
|
||||
// Check if redis is using a password
|
||||
$REDIS_ROOT_PASSWORD = '';
|
||||
|
||||
$_REDIS_ARGS = loadClass('Helper')->getEnv('REDIS_ARGS');
|
||||
|
||||
/*
|
||||
* This pattern will match optional quoted string, 'my password' or "my password"
|
||||
* or if there aren't any quotes, it will match up until the next space.
|
||||
*/
|
||||
$_REDIS_PASS = array();
|
||||
preg_match_all('/--requirepass\s+("|\')?(?(1)(.*)|([^\s]*))(?(1)\1|)/', $_REDIS_ARGS, $_REDIS_PASS, PREG_SET_ORDER);
|
||||
|
||||
if (! empty($_REDIS_PASS)) {
|
||||
/*
|
||||
* In case the option is specified multiple times, use the last effective one.
|
||||
*
|
||||
* preg_match_all returns a multi-dimensional array, the first level array is in order of which was matched first,
|
||||
* and the password string is either matched in group 2 or group 3 which is always the end of the sub-array.
|
||||
*/
|
||||
$_REDIS_PASS = end(end($_REDIS_PASS));
|
||||
|
||||
if (strlen($_REDIS_PASS) > 0) {
|
||||
$REDIS_ROOT_PASSWORD = $_REDIS_PASS;
|
||||
}
|
||||
}
|
||||
|
||||
loadFile($class, $cnt_dir);
|
||||
if ($REDIS_ROOT_PASSWORD == '') {
|
||||
$_LOADED_LIBS[$class] = \devilbox\Redis::getInstance($GLOBALS['REDIS_HOST_NAME']);
|
||||
} else {
|
||||
$_LOADED_LIBS[$class] = \devilbox\Redis::getInstance($GLOBALS['REDIS_HOST_NAME'], array(
|
||||
'pass' => $REDIS_ROOT_PASSWORD,
|
||||
));
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Memcd':
|
||||
loadFile($class, $cnt_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Memcd::getInstance($GLOBALS['MEMCD_HOST_NAME']);
|
||||
break;
|
||||
|
||||
case 'Mongo':
|
||||
loadFile($class, $cnt_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Mongo::getInstance($GLOBALS['MONGO_HOST_NAME']);
|
||||
break;
|
||||
|
||||
// Get optional docker classes
|
||||
default:
|
||||
// Unknown class
|
||||
exit('Class does not exist: '.$class);
|
||||
}
|
||||
return $_LOADED_LIBS[$class];
|
||||
}
|
||||
}
|
||||
|
180
.devilbox/www/htdocs/_ajax_callback.php
Normal file
180
.devilbox/www/htdocs/_ajax_callback.php
Normal file
@ -0,0 +1,180 @@
|
||||
<?php
|
||||
require '../config.php';
|
||||
|
||||
if (loadClass('Helper')->isLoggedIn()) {
|
||||
|
||||
//
|
||||
// ?database=
|
||||
//
|
||||
if (isset($_GET['database'])) {
|
||||
// &type=mysql
|
||||
if (isset($_GET['type']) && $_GET['type'] == 'mysql') {
|
||||
echo json_encode(array(
|
||||
'size' => (string)loadClass('Mysql')->getDBSize($_GET['database']),
|
||||
'table' => (string)loadClass('Mysql')->getTableCount($_GET['database'])
|
||||
));
|
||||
// &type=postgres
|
||||
} else if (isset($_GET['type']) && $_GET['type'] == 'postgres') {
|
||||
$schema = isset($_GET['schema']) ? $_GET['schema'] : '';
|
||||
echo json_encode(array(
|
||||
'size' => (string)loadClass('Pgsql')->getSchemaSize($_GET['database'], $schema),
|
||||
'table' => (string)loadClass('Pgsql')->getTableCount($_GET['database'], $schema)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// ?vhost=
|
||||
//
|
||||
else if (isset($_GET['vhost'])) {
|
||||
echo loadClass('Httpd')->checkVirtualHost($_GET['vhost']);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// ?software=
|
||||
//
|
||||
else if (isset($_GET['software'])) {
|
||||
$no = '<span class="text-danger">not installed</span>';
|
||||
$no_mod = '<span class="text-warning">PHP module not loaded</span>';
|
||||
$software = array();
|
||||
|
||||
if ($_GET['software'] == 'angular_cli') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getAngularCliVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'asgardcms_installer') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getAsgardCmsInstallerVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'codeception') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getCodeceptionVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'composer') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getComposerVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'deployer') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getDeployerVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'git') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getGitVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'grunt_cli') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getGruntCliVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'gulp') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getGulpVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'laravel_installer') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getLaravelInstallerVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'laravel_lumen') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getLaravelLumenVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'mds') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getMdsVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'mupdf_tools') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getMupdfToolsVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'node') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getNodeVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'npm') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getNpmVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'phalcon_devtools') {
|
||||
if (!extension_loaded('phalcon')) {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => $no_mod
|
||||
));
|
||||
} else {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getPhalconDevtoolsVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
}
|
||||
else if ($_GET['software'] == 'phpunit') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getPhpunitVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'stylelint') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getStylelintVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'symfony_cli') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getSymfonyCliVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'vue_cli') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getVueCliVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'webpack_cli') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getWebpackCliVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'wpcli') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getWpcliVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'wscat') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getWscatVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'yarn') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getYarnVersion()) !== false) ? $version : $no
|
||||
));
|
||||
} else {
|
||||
echo json_encode(array($_GET['software'] => 'unknown software'));
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// WRONG REQUEST
|
||||
//
|
||||
else {
|
||||
loadClass('Helper')->redirect('/');
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Not logged in
|
||||
//
|
||||
else {
|
||||
loadClass('Helper')->redirect('/');
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
<?php
|
||||
$CONNECT = TRUE;
|
||||
require '../config.php';
|
||||
|
||||
if (isset($_GET['size'])) {
|
||||
echo getDBSize($_GET['size']);
|
||||
} elseif (isset($_GET['table'])) {
|
||||
echo getTableCount($_GET['table']);
|
||||
} else {
|
||||
echo '0';
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
<?php
|
||||
require '../config.php';
|
||||
|
||||
if (isset($_GET['valid'])) {
|
||||
echo checkVirtualHost($_GET['valid']);
|
||||
} else {
|
||||
echo '';
|
||||
}
|
@ -1,11 +1,64 @@
|
||||
.meter {
|
||||
height: 20px; /* Can be anything */
|
||||
position: relative;
|
||||
background: #555;
|
||||
-moz-border-radius: 25px;
|
||||
-webkit-border-radius: 25px;
|
||||
border-radius: 25px;
|
||||
box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3);
|
||||
}
|
||||
.meter > span {
|
||||
display: block;
|
||||
height: 100%;
|
||||
border-top-right-radius: 20px;
|
||||
border-bottom-right-radius: 20px;
|
||||
border-top-left-radius: 20px;
|
||||
border-bottom-left-radius: 20px;
|
||||
background-color: rgb(43,194,83);
|
||||
background-image: linear-gradient(
|
||||
center bottom,
|
||||
rgb(43,194,83) 37%,
|
||||
rgb(84,240,84) 69%
|
||||
);
|
||||
box-shadow:
|
||||
inset 0 2px 9px rgba(255,255,255,0.3),
|
||||
inset 0 -2px 6px rgba(0,0,0,0.4);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
.dash-box {
|
||||
border: 1px solid #383737;
|
||||
background-color: #3d3d3d;
|
||||
color: #999999;
|
||||
height:100%;
|
||||
}
|
||||
.dash-box-head {
|
||||
background-color: #383737;
|
||||
color: #999999;
|
||||
width:100%;
|
||||
display: inline-block;
|
||||
padding:10px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.dash-box-body {
|
||||
padding:10px;
|
||||
}
|
||||
|
||||
|
||||
.row-margin {
|
||||
margin-bottom:20px;
|
||||
}
|
||||
.col-margin {
|
||||
margin-bottom:20px;
|
||||
}
|
||||
|
||||
|
||||
/* Bootstrap overwrites
|
||||
-------------------------------------------------- */
|
||||
html, body {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
td {
|
||||
word-break: break-word;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
|
||||
@ -18,7 +71,7 @@ html {
|
||||
}
|
||||
body {
|
||||
/* Margin bottom by footer height */
|
||||
margin-bottom: 80px;
|
||||
margin-bottom: 80px !important;
|
||||
}
|
||||
.footer {
|
||||
position: absolute;
|
||||
@ -30,57 +83,64 @@ body {
|
||||
}
|
||||
|
||||
|
||||
/* Generics
|
||||
-------------------------------------------------- */
|
||||
.font-small {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Circle Box
|
||||
-------------------------------------------------- */
|
||||
|
||||
.circles{
|
||||
margin:0px auto;
|
||||
margin:0px auto;
|
||||
}
|
||||
.circles > div {
|
||||
overflow:hidden;
|
||||
float:left;
|
||||
width:auto;
|
||||
height:auto;
|
||||
position: relative;
|
||||
border-radius:50%;
|
||||
-moz-border-radius:50%;
|
||||
-webkit-border-radius:50%;
|
||||
-khtml-border-radius: 50%;
|
||||
background:#eee;
|
||||
overflow:hidden;
|
||||
float:left;
|
||||
width:auto;
|
||||
height:auto;
|
||||
position: relative;
|
||||
border-radius:50%;
|
||||
-moz-border-radius:50%;
|
||||
-webkit-border-radius:50%;
|
||||
-khtml-border-radius: 50%;
|
||||
background:#eee;
|
||||
}
|
||||
|
||||
.circles > div > div {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
.circles > div > div > div {
|
||||
display: table;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: table;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.circles > div > div > div > div {
|
||||
display: table-cell;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
display: table-cell;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
@media (max-width: 320px)
|
||||
{
|
||||
.circles > div {padding: 50%;}
|
||||
.circles > div {padding: 50%;}
|
||||
}
|
||||
|
||||
@media (min-width: 321px) and (max-width: 800px)
|
||||
{
|
||||
.circles > div {padding: 50%;}
|
||||
.circles > div {padding: 50%;}
|
||||
}
|
||||
|
||||
@media (min-width: 801px)
|
||||
{
|
||||
.circles > div {padding: 40%;}
|
||||
.circles > div {padding: 48%;}
|
||||
}
|
||||
|
||||
|
||||
@ -90,25 +150,85 @@ body {
|
||||
a.navbar-brand {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
a.navbar-brand img {
|
||||
margin-right: 10px;
|
||||
}
|
||||
a.nav-link {
|
||||
background-color: transparent !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
img.d-inline-block {
|
||||
float: none;
|
||||
float: none;
|
||||
}
|
||||
nav.navbar {
|
||||
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
|
||||
font-size: 1rem;
|
||||
line-height: 1.5;
|
||||
color: #373a3c;
|
||||
background-color: #fff;
|
||||
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
|
||||
font-size: 1rem;
|
||||
line-height: 1.5;
|
||||
color: #373a3c;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* mailphp;
|
||||
/* mail.php;
|
||||
-------------------------------------------------- */
|
||||
tr.subject {
|
||||
cursor: pointer;
|
||||
}
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
td.break-word {
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
|
||||
/* adminer.php;
|
||||
-------------------------------------------------- */
|
||||
#menu {
|
||||
position: absolute;
|
||||
margin: 76px 0 0 !important;
|
||||
}
|
||||
#breadcrumb {
|
||||
top: 60px !important;
|
||||
}
|
||||
#lang {
|
||||
top: 53px !important;
|
||||
}
|
||||
.pages {
|
||||
z-index:1000;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* login.php;
|
||||
-------------------------------------------------- */
|
||||
/* Extra markup and styles for table-esque vertical and horizontal centering */
|
||||
.site-wrapper {
|
||||
display: table;
|
||||
width: 100%;
|
||||
height: 100%; /* For at least Firefox */
|
||||
min-height: 100%;
|
||||
-webkit-box-shadow: inset 0 0 5rem rgba(0,0,0,.5);
|
||||
box-shadow: inset 0 0 5rem rgba(0,0,0,.5);
|
||||
}
|
||||
.site-wrapper-inner {
|
||||
display: table-cell;
|
||||
vertical-align: top;
|
||||
}
|
||||
.cover-container {
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
}
|
||||
/* Affix and center */
|
||||
@media (min-width: 40em) {
|
||||
/* Start the vertical centering */
|
||||
.site-wrapper-inner {
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
@media (min-width: 62em) {
|
||||
.masthead,
|
||||
.mastfoot,
|
||||
.cover-container {
|
||||
width: 32rem;
|
||||
}
|
||||
}
|
||||
|
BIN
.devilbox/www/htdocs/assets/img/banner.png
Normal file
BIN
.devilbox/www/htdocs/assets/img/banner.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
Binary file not shown.
Before Width: | Height: | Size: 9.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 22 KiB |
BIN
.devilbox/www/htdocs/assets/img/logo.png
Normal file
BIN
.devilbox/www/htdocs/assets/img/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.1 KiB |
179
.devilbox/www/htdocs/cnc.php
Normal file
179
.devilbox/www/htdocs/cnc.php
Normal file
@ -0,0 +1,179 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
// TODO: This is currently a temporary hack to talk to supervisor on the HTTPD server
|
||||
function run_supervisor_command($command) {
|
||||
$supervisor_config_file = '/tmp/supervisorctl.conf';
|
||||
$port = getenv('SVCTL_LISTEN_PORT');
|
||||
$user = getenv('SVCTL_USER');
|
||||
$pass = getenv('SVCTL_PASS');
|
||||
|
||||
$content = "[supervisorctl]\n";
|
||||
$content .= "serverurl=http://httpd:" . $port . "\n";
|
||||
$content .= "username=" . $user . "\n";
|
||||
$content .= "password=" . $pass . "\n";
|
||||
|
||||
$fp = fopen($supervisor_config_file, 'w');
|
||||
fwrite($fp, $content);
|
||||
fclose($fp);
|
||||
|
||||
return loadClass('Helper')->exec('supervisorctl -c ' . $supervisor_config_file . ' ' . $command);
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
<?php if ( isset($_POST['watcherd']) && $_POST['watcherd'] == 'reload' ) {
|
||||
run_supervisor_command('restart watcherd');
|
||||
sleep(1);
|
||||
loadClass('Helper')->redirect('/cnc.php');
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(true); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
<h1>Command & Control</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php
|
||||
$status_w = run_supervisor_command('status watcherd');
|
||||
$status_h = run_supervisor_command('status httpd');
|
||||
|
||||
$words = preg_split("/\s+/", $status_w);
|
||||
$data_w = array(
|
||||
'name' => isset($words[0]) ? $words[0] : '',
|
||||
'state' => isset($words[1]) ? $words[1] : '',
|
||||
'pid' => isset($words[3]) ? preg_replace('/,$/', '', $words[3]) : '',
|
||||
'uptime' => isset($words[5]) ? $words[5] : '',
|
||||
);
|
||||
$words = preg_split("/\s+/", $status_h);
|
||||
$data_h = array(
|
||||
'name' => isset($words[0]) ? $words[0] : '',
|
||||
'state' => isset($words[1]) ? $words[1] : '',
|
||||
'pid' => isset($words[3]) ? preg_replace('/,$/', '', $words[3]) : '',
|
||||
'uptime' => isset($words[5]) ? $words[5] : '',
|
||||
);
|
||||
?>
|
||||
<h3>Daemon overview</h3><br/>
|
||||
<p>If you made any changes to vhost settings (vhost-gen templates or backend configuration) or to the webserver configuration itself, you can trigger a manual reload of <code>watcherd</code> here to apply them. No need to restart the Docker Compose stack.</p>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Daemon</th>
|
||||
<th>Status</th>
|
||||
<th>Pid</th>
|
||||
<th>Uptime</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><?php echo $data_w['name']; ?></td>
|
||||
<td><?php echo $data_w['state']; ?></td>
|
||||
<td><?php echo $data_w['pid']; ?></td>
|
||||
<td><?php echo $data_w['uptime']; ?></td>
|
||||
<td><form method="post"><button type="submit" name="watcherd" value="reload" class="btn btn-primary">Reload</button></form></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?php echo $data_h['name']; ?></td>
|
||||
<td><?php echo $data_h['state']; ?></td>
|
||||
<td><?php echo $data_h['pid']; ?></td>
|
||||
<td><?php echo $data_h['uptime']; ?></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<h3>watcherd stderr</h3>
|
||||
<br/>
|
||||
<?php
|
||||
$output = run_supervisor_command('tail -1000000 watcherd stderr');
|
||||
echo '<pre>';
|
||||
foreach(preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
|
||||
if ( strpos($line, "[ERR]") !== false ) {
|
||||
echo '<span style="color: #ff0000">' . $line . '</span>';
|
||||
} else if ( strpos($line, "[emerg]") !== false ) {
|
||||
echo '<span style="color: #ff0000">' . $line . '</span>';
|
||||
} else if ( strpos($line, "Syntax error") !== false ) {
|
||||
echo '<span style="color: #ff0000">' . $line . '</span>';
|
||||
} else if ( strpos($line, "[WARN]") !== false ) {
|
||||
echo '<span style="color: #ccaa00">' . $line . '</span>';
|
||||
} else {
|
||||
echo $line;
|
||||
}
|
||||
echo "\n";
|
||||
}
|
||||
echo '</pre>';
|
||||
?>
|
||||
<h3>watcherd stdout</h3>
|
||||
<br/>
|
||||
<?php
|
||||
$output = run_supervisor_command('tail -1000000 watcherd');
|
||||
echo '<pre>';
|
||||
foreach(preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
|
||||
$pos_info = strpos($line, "[INFO]");
|
||||
$pos_ok = strpos($line, "[OK]");
|
||||
if ( $pos_ok !== false ) {
|
||||
echo '<span style="color: #669a00"><strong>' . $line . '</strong></span>';
|
||||
} else if ( $pos_info !== false && $pos_info == 0 ) {
|
||||
echo '<span style="color: #0088cd">' . $line . '</span>';
|
||||
} else {
|
||||
echo $line;
|
||||
}
|
||||
echo "\n";
|
||||
}
|
||||
echo '</pre>';
|
||||
?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
<script>
|
||||
$(function() {
|
||||
$('.subject').click(function() {
|
||||
const id = ($(this).attr('id'));
|
||||
const row = $('#mail-'+id);
|
||||
row.toggle();
|
||||
|
||||
const bodyElement = row.find('.email-body')[0];
|
||||
if(bodyElement.shadowRoot !== null){
|
||||
// We've already fetched the message content.
|
||||
return;
|
||||
}
|
||||
|
||||
bodyElement.attachShadow({ mode: 'open' });
|
||||
bodyElement.shadowRoot.innerHTML = 'Loading...';
|
||||
|
||||
$.get('?get-body=' + id, function(response){
|
||||
response = JSON.parse(response);
|
||||
row.find('.raw-email-body').html(response.raw);
|
||||
|
||||
const body = response.body;
|
||||
if(body === null){
|
||||
row.find('.alert').show();
|
||||
}
|
||||
else{
|
||||
bodyElement.shadowRoot.innerHTML = body;
|
||||
}
|
||||
})
|
||||
})
|
||||
// Handler for .ready() called.
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
62
.devilbox/www/htdocs/config_httpd.php
Normal file
62
.devilbox/www/htdocs/config_httpd.php
Normal file
@ -0,0 +1,62 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Httpd custom configs</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
<p>Shows your currently custom configuration files applied to the Httpd container.</p>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<?php $vHosts = loadClass('Httpd')->getVirtualHosts(); ?>
|
||||
<?php $custom = false; ?>
|
||||
<?php foreach ($vHosts as $vHost): ?>
|
||||
<?php if (($vhostGen = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?>
|
||||
<?php $custom = true; ?>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($custom): ?>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Project</th>
|
||||
<th>Host</th>
|
||||
<th>Container</th>
|
||||
<th>Files</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($vHosts as $vHost): ?>
|
||||
<?php if (($vhostGen = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?>
|
||||
<tr>
|
||||
<th><?php echo $vHost['domain']; ?></th>
|
||||
<td><?php echo loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vHost['name'].'/'.loadClass('Helper')->getEnv('HTTPD_TEMPLATE_DIR');?></td>
|
||||
<td><?php echo dirname($vhostGen); ?></td>
|
||||
<td><code><?php echo basename($vhostGen); ?></code></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<p>No custom configurations applied.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
126
.devilbox/www/htdocs/config_php.php
Normal file
126
.devilbox/www/htdocs/config_php.php
Normal file
@ -0,0 +1,126 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>PHP custom configs</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
<p>Shows your currently custom configuration files applied to the PHP-FPM container.</p>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Section</th>
|
||||
<th>Host</th>
|
||||
<th>Container</th>
|
||||
<th>Files</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Supervisord</th>
|
||||
<td>supervisor/</td>
|
||||
<td>/etc/supervisor/custom.d/</td>
|
||||
<td>
|
||||
<?php
|
||||
$files = glob('/etc/supervisor/custom.d/*.conf');
|
||||
if ($files) {
|
||||
foreach ($files as $file) {
|
||||
echo '<code>'.basename($file). '</code><br/>';
|
||||
}
|
||||
} else {
|
||||
echo 'No custom files';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Autostart (global)</th>
|
||||
<td>autostart/</td>
|
||||
<td>/startup.2.d/</td>
|
||||
<td>
|
||||
<?php
|
||||
$files = glob('/startup.2.d/*.sh');
|
||||
if ($files) {
|
||||
foreach ($files as $file) {
|
||||
echo '<code>'.basename($file). '</code><br/>';
|
||||
}
|
||||
} else {
|
||||
echo 'No custom files';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Autostart (version)</th>
|
||||
<td>cfg/php-startup-<?php echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;?>/</td>
|
||||
<td>/startup.1.d/</td>
|
||||
<td>
|
||||
<?php
|
||||
$files = glob('/startup.1.d/*.sh');
|
||||
if ($files) {
|
||||
foreach ($files as $file) {
|
||||
echo '<code>'.basename($file). '</code><br/>';
|
||||
}
|
||||
} else {
|
||||
echo 'No custom files';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>PHP-FPM</th>
|
||||
<td>cfg/php-fpm-<?php echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;?>/</td>
|
||||
<td>/etc/php-fpm-custom.d/</td>
|
||||
<td>
|
||||
<?php
|
||||
$files = glob('/etc/php-fpm-custom.d/*.conf');
|
||||
if ($files) {
|
||||
foreach ($files as $file) {
|
||||
echo '<code>'.basename($file). '</code><br/>';
|
||||
}
|
||||
} else {
|
||||
echo 'No custom files';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>PHP</th>
|
||||
<td>cfg/php-ini-<?php echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;?>/</td>
|
||||
<td>/etc/php-custom.d/</td>
|
||||
<td>
|
||||
<?php
|
||||
$files = glob('/etc/php-custom.d/*.ini');
|
||||
if ($files) {
|
||||
foreach ($files as $file) {
|
||||
echo '<code>'.basename($file). '</code><br/>';
|
||||
}
|
||||
} else {
|
||||
echo 'No custom files';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
@ -1,12 +1,13 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php $FONT_AWESOME = TRUE; require '../include/head.php'; ?>
|
||||
<?php echo loadClass('Html')->getHead(true); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php require '../include/navigation.php'; ?>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
@ -18,7 +19,7 @@
|
||||
|
||||
<div class="col-md-6">
|
||||
<h2>Contributors</h2>
|
||||
<p>The following people have contributed to the <a href="https://github.com/cytopia/devilbox">Devilbox</a>.</p>
|
||||
<p>The following people have contributed to the <a href="https://github.com/cytopia/devilbox/graphs/contributors">Devilbox</a>.</p>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
@ -56,30 +57,50 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Adminer</td>
|
||||
<td>Apache License 2.0 or GPL 2</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/vrana/adminer">vrana/adminer</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bootstrap</td>
|
||||
<td>MIT</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/twbs/bootstrap">twbs/bootstrap</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/twbs/bootstrap">twbs/bootstrap</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Font Awesome (css)</td>
|
||||
<td>MIT</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Font Awesome (fonts)</td>
|
||||
<td>SIL OFL 1.1</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Opcache GUI</td>
|
||||
<td>MIT</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/amnuts/opcache-gui">amnuts/opcache-gui</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/amnuts/opcache-gui">amnuts/opcache-gui</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PHPMemcachedAdmin</td>
|
||||
<td>Apache 2.0</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/elijaa/phpmemcachedadmin">elijaa/phpmemcachedadmin</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>phpMyAdmin</td>
|
||||
<td>GPL 2.0</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/phpmyadmin/phpmyadmin">phpmyadmin/phpmyadmin</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/phpmyadmin/phpmyadmin">phpmyadmin/phpmyadmin</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>phpPgAdmin</td>
|
||||
<td>GPL 2.0</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/phppgadmin/phppgadmin">phppgadmin/phppgadmin</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PHPRedMin</td>
|
||||
<td>BSD 3-Clause License</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/sasanrose/phpredmin">sasanrose/phpredmin</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@ -87,11 +108,8 @@
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php require '../include/footer.php'; ?>
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,116 +0,0 @@
|
||||
<?php $CONNECT = TRUE; require '../config.php'; ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php require '../include/head.php'; ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php require '../include/navigation.php'; ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Databases</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Charset</th>
|
||||
<th>Collation</th>
|
||||
<th>Tables</th>
|
||||
<th>Size</th>
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (getDatabases() as $name => $keys): ?>
|
||||
<tr>
|
||||
<td><?php echo $name;?></td>
|
||||
<td><?php echo $keys['charset'];?></td>
|
||||
<td><?php echo $keys['collation'];?></td>
|
||||
<td><code><span class="table" id="table-<?php echo $name;?>"> </span></code></td>
|
||||
<td><code><span class="size" id="size-<?php echo $name;?>"> </span></code></td>
|
||||
</tr>
|
||||
<input type="hidden" name="database[]" class="database" value="<?php echo $name;?>" />
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php require '../include/footer.php'; ?>
|
||||
<script>
|
||||
// self executing function here
|
||||
(function() {
|
||||
// your page initialization code here
|
||||
// the DOM will be available here
|
||||
|
||||
function updateSizes(database) {
|
||||
var xhttp = new XMLHttpRequest();
|
||||
|
||||
xhttp.onreadystatechange = function() {
|
||||
var fill = '';
|
||||
var res = '';
|
||||
var len;
|
||||
var i;
|
||||
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
res = (this.responseText) == 0 ? '0sss MB' : this.responseText+' MB';
|
||||
len = res.length;
|
||||
if (len < 9) {
|
||||
for (i=len; i<9; i++) {
|
||||
fill = ' ' + fill;
|
||||
}
|
||||
|
||||
}
|
||||
res = res.replace('sss', ' ');
|
||||
res = fill + res;
|
||||
document.getElementById('size-' + database).innerHTML = res;
|
||||
}
|
||||
};
|
||||
xhttp.open('GET', '_ajax_db.php?size=' + database, true);
|
||||
xhttp.send();
|
||||
}
|
||||
|
||||
|
||||
function updateCount(database) {
|
||||
var xhttp = new XMLHttpRequest();
|
||||
|
||||
xhttp.onreadystatechange = function() {
|
||||
var fill = '';
|
||||
var i;
|
||||
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
if (this.responseText.length < 4) {
|
||||
for (i=this.responseText.length; i<4; i++) {
|
||||
fill = ' ' + fill;
|
||||
}
|
||||
}
|
||||
document.getElementById('table-' + database).innerHTML = fill + this.responseText;
|
||||
}
|
||||
};
|
||||
xhttp.open('GET', '_ajax_db.php?table=' + database, true);
|
||||
xhttp.send();
|
||||
}
|
||||
|
||||
var databases = document.getElementsByName('database[]');
|
||||
var database;
|
||||
|
||||
for (i = 0; i < databases.length; i++) {
|
||||
database = databases[i].value;
|
||||
updateSizes(database);
|
||||
updateCount(database);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
53
.devilbox/www/htdocs/db_memcd.php
Normal file
53
.devilbox/www/htdocs/db_memcd.php
Normal file
@ -0,0 +1,53 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Memcached Keys</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Memcd')->isAvailable()): ?>
|
||||
<p>Memcached container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Key</th>
|
||||
<th>Size</th>
|
||||
<th>TTL</th>
|
||||
<th>Value</th>
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Memcd')->getKeys() as $data): ?>
|
||||
<tr>
|
||||
<td><?php print_r($data['key']);?></td>
|
||||
<td><?php print_r($data['size']);?></td>
|
||||
<td><?php print_r($data['ttl']);?></td>
|
||||
<td><?php print_r($data['val']);?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
51
.devilbox/www/htdocs/db_mongo.php
Normal file
51
.devilbox/www/htdocs/db_mongo.php
Normal file
@ -0,0 +1,51 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>MongoDB Databases</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Mongo')->isAvailable()): ?>
|
||||
<p>MongoDB container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Size</th>
|
||||
<th>Empty</th>
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Mongo')->getDatabases() as $db): ?>
|
||||
<tr>
|
||||
<td><?php echo $db['name'];?></td>
|
||||
<td><?php echo round($db['size']/(1024*1024), 2);?> MB</td>
|
||||
<td><?php echo $db['empty'];?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
114
.devilbox/www/htdocs/db_mysql.php
Normal file
114
.devilbox/www/htdocs/db_mysql.php
Normal file
@ -0,0 +1,114 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
// Also required for JS calls (see bottom of this page)
|
||||
$len_table = 4;
|
||||
$len_size = 9;
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>MySQL Databases</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Mysql')->isAvailable()): ?>
|
||||
<p>MySQL container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Charset</th>
|
||||
<th>Collation</th>
|
||||
<th>Tables</th>
|
||||
<th>Size</th>
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Mysql')->getDatabases() as $name => $keys): ?>
|
||||
<tr>
|
||||
<td><?php echo $name;?></td>
|
||||
<td><?php echo $keys['charset'];?></td>
|
||||
<td><?php echo $keys['collation'];?></td>
|
||||
<td><code><span class="table" id="table-<?php echo $name;?>"><?php echo str_repeat(' ', $len_table);?></span></code></td>
|
||||
<td><code><span class="size" id="size-<?php echo $name;?>"><?php echo str_repeat(' ', $len_size);?></span></code></td>
|
||||
</tr>
|
||||
<input type="hidden" name="database[]" class="database" value="<?php echo $name;?>" />
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
<script>
|
||||
// self executing function here
|
||||
(function() {
|
||||
// your page initialization code here
|
||||
// the DOM will be available here
|
||||
|
||||
function updateData(database) {
|
||||
var xhttp = new XMLHttpRequest();
|
||||
|
||||
xhttp.onreadystatechange = function() {
|
||||
var res = null;
|
||||
var size = 0;
|
||||
var tables = 0;
|
||||
var i;
|
||||
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
res = JSON.parse(this.response);
|
||||
|
||||
// Normalize size output
|
||||
size = res.size == 0 ? '0sss MB' : res.size + ' MB';
|
||||
if (size.length < <?php echo $len_size;?>) {
|
||||
for (i = size.length; i < <?php echo $len_size;?>; ++i) {
|
||||
size = ' ' + size;
|
||||
}
|
||||
}
|
||||
size = size.replace('sss', ' ');
|
||||
|
||||
// Normalize tables output
|
||||
tables = res.table;
|
||||
if (tables.length < <?php echo $len_table;?>) {
|
||||
for (i = tables.length; i < <?php echo $len_table;?>; ++i) {
|
||||
tables = ' ' + tables;
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('size-' + database).innerHTML = size;
|
||||
document.getElementById('table-' + database).innerHTML = tables;
|
||||
}
|
||||
};
|
||||
xhttp.open('GET', '_ajax_callback.php?type=mysql&database=' + database, true);
|
||||
xhttp.send();
|
||||
}
|
||||
|
||||
var databases = document.getElementsByName('database[]');
|
||||
var database;
|
||||
|
||||
for (i = 0; i < databases.length; i++) {
|
||||
database = databases[i].value;
|
||||
updateData(database);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
126
.devilbox/www/htdocs/db_pgsql.php
Normal file
126
.devilbox/www/htdocs/db_pgsql.php
Normal file
@ -0,0 +1,126 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
// Also required for JS calls (see bottom of this page)
|
||||
$len_table = 4;
|
||||
$len_size = 9;
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>PostgreSQL Databases</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Pgsql')->isAvailable()): ?>
|
||||
<p>PgSQL container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Charset</th>
|
||||
<th>Collation</th>
|
||||
<th>Tables</th>
|
||||
<th>Size</th>
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Pgsql')->getDatabases() as $name => $database): ?>
|
||||
<tr class="table-info">
|
||||
<th>
|
||||
<?php echo $name;?>
|
||||
</th>
|
||||
<td><?php echo $database['charset'];?></td>
|
||||
<td><?php echo $database['collation'];?></td>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
<?php foreach ($database['schemas'] as $schema => $data): ?>
|
||||
<tr>
|
||||
<td><?php echo $schema;?></td>
|
||||
<td colspan="2"></td>
|
||||
<td><code><span class="table" id="table-<?php echo $name.'-'.$schema;?>"><?php echo str_repeat(' ', $len_table);?></span></code></td>
|
||||
<td><code><span class="size" id="size-<?php echo $name.'-'.$schema;?>"><?php echo str_repeat(' ', $len_size);?></span></code></td>
|
||||
</tr>
|
||||
<input type="hidden" name="schema[]" data-database="<?php echo $name;?>" class="schema" value="<?php echo $schema;?>" />
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
<script>
|
||||
// self executing function here
|
||||
(function() {
|
||||
// your page initialization code here
|
||||
// the DOM will be available here
|
||||
|
||||
function updateData(database, schema) {
|
||||
var xhttp = new XMLHttpRequest();
|
||||
|
||||
xhttp.onreadystatechange = function() {
|
||||
var res = null;
|
||||
var size = 0;
|
||||
var tables = 0;
|
||||
var i;
|
||||
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
res = JSON.parse(this.response);
|
||||
|
||||
// Normalize size output
|
||||
size = res.size == 0 ? '0sss MB' : res.size + ' MB';
|
||||
if (size.length < <?php echo $len_size;?>) {
|
||||
for (i = size.length; i < <?php echo $len_size;?>; ++i) {
|
||||
size = ' ' + size;
|
||||
}
|
||||
}
|
||||
size = size.replace('sss', ' ');
|
||||
|
||||
// Normalize tables output
|
||||
tables = res.table;
|
||||
if (tables.length < <?php echo $len_table;?>) {
|
||||
for (i = tables.length; i < <?php echo $len_table;?>; ++i) {
|
||||
tables = ' ' + tables;
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('size-' + database + '-' + schema).innerHTML = size;
|
||||
document.getElementById('table-' + database + '-' + schema).innerHTML = tables;
|
||||
}
|
||||
};
|
||||
xhttp.open('GET', '_ajax_callback.php?type=postgres&database=' + database + '&schema=' + schema, true);
|
||||
xhttp.send();
|
||||
}
|
||||
|
||||
var schemas = document.getElementsByName('schema[]');
|
||||
var schema;
|
||||
var database;
|
||||
|
||||
for (i = 0; i < schemas.length; i++) {
|
||||
schema = schemas[i].value;
|
||||
database = schemas[i].getAttribute('data-database');
|
||||
updateData(database, schema);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
101
.devilbox/www/htdocs/db_redis.php
Normal file
101
.devilbox/www/htdocs/db_redis.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
if (isset($_GET['redisdb'])) {
|
||||
|
||||
loadClass('Redis')->flushDB($_GET['redisdb']);
|
||||
loadClass('Helper')->redirect('/db_redis.php');
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Redis Keys</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<?php $databases = array_keys(loadClass('Redis')->getKeys()); ?>
|
||||
<?php if (count($databases)): ?>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<form class="form-inline">
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="redisdb">Redis DB</label>
|
||||
<select class="form-control" name="redisdb">
|
||||
<option value="" selected disabled>Select Redis DB</option>
|
||||
<?php foreach ($databases as $db): ?>
|
||||
<option value="<?php echo $db;?>"><?php echo $db;?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Flush database</button>
|
||||
</form>
|
||||
<br/>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Redis')->isAvailable()): ?>
|
||||
<p>Redis container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped ">
|
||||
<tbody>
|
||||
<?php $redisKeys = loadClass('Redis')->getKeys(); ?>
|
||||
<?php if (count($redisKeys)): ?>
|
||||
<?php foreach ($redisKeys as $db_name => $keys): ?>
|
||||
<tr class="thead-inverse ">
|
||||
<th colspan="5">
|
||||
Database: <?php echo $db_name; ?>
|
||||
Items: <?php echo count($keys); ?>
|
||||
</th>
|
||||
</th>
|
||||
<tr class="table-info">
|
||||
<tr>
|
||||
<th>DB</th>
|
||||
<th>Key</th>
|
||||
<th>Expires</th>
|
||||
<th>Type</th>
|
||||
<th>Value</th>
|
||||
</th>
|
||||
</tr>
|
||||
<?php foreach ($keys as $key): ?>
|
||||
<tr>
|
||||
<td><?php echo $db_name;?></td>
|
||||
<td class="break-word" style="width:30%;"><?php echo $key['name'];?></td>
|
||||
<td><?php echo $key['ttl'];?>s</td>
|
||||
<td><?php echo $key['type'];?></td>
|
||||
<td class="break-word">
|
||||
<code>
|
||||
<?php echo htmlentities($key['val']);?>
|
||||
</code>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php endforeach; ?>
|
||||
<?php else: ?>
|
||||
<p>No keys set.</p>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
68
.devilbox/www/htdocs/debug.php
Normal file
68
.devilbox/www/htdocs/debug.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Devilbox Debug</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php $errors = loadClass('Logger')->getAll(); ?>
|
||||
<?php if ($errors === false): ?>
|
||||
<p>Writing to logfile is not possible. Errors will be sent as mail instead. Check the mail section.</p>
|
||||
<?php elseif (count($errors) === 0): ?>
|
||||
<p>No errors detected.</div>
|
||||
<?php else: ?>
|
||||
<?php $total = count($errors); ?>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>date</th>
|
||||
<th>Errors (<?php echo $total;?>)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php for ($i=($total-1); $i>=0; --$i): ?>
|
||||
<tr>
|
||||
<th><?php echo ($i+1);?></th>
|
||||
<th><code><?php echo $errors[$i]['date'];?></code></th>
|
||||
<th><code><?php echo $errors[$i]['head'];?></code></th>
|
||||
<?php if (isset($errors[$i]['body'])): ?>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<?php
|
||||
$dump = implode('', $errors[$i]['body']);
|
||||
//$dump = str_replace("=></font> \n", '=></font>', $dump);
|
||||
|
||||
?>
|
||||
<code><?php echo $dump; ?></code>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
File diff suppressed because it is too large
Load Diff
28
.devilbox/www/htdocs/info_httpd.php
Normal file
28
.devilbox/www/htdocs/info_httpd.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Httpd info</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12">
|
||||
<iframe style="width:100%; height:100vh; position:relative;" src="/devilbox-httpd-status" frameborder="0" allowfullscreen></iframe>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
52
.devilbox/www/htdocs/info_memcd.php
Normal file
52
.devilbox/www/htdocs/info_memcd.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Memcached Info</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Memcd')->isAvailable()): ?>
|
||||
<p>Memcached container is not running.</p>
|
||||
<?php else: ?>
|
||||
<?php foreach (loadClass('Memcd')->getInfo() as $srv => $data): ?>
|
||||
<h2><?php echo $srv; ?></h2>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($data as $key => $val): ?>
|
||||
<tr>
|
||||
<td><?php echo $key;?></td>
|
||||
<td class="break-word"><code><?php echo $val;?></code></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
49
.devilbox/www/htdocs/info_mongo.php
Normal file
49
.devilbox/www/htdocs/info_mongo.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>MongoDB Info</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Mongo')->isAvailable()): ?>
|
||||
<p>MongoDB container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Mongo')->getInfo() as $key => $val): ?>
|
||||
<tr>
|
||||
<td><?php print_r($key);?></td>
|
||||
<td class="break-word"><pre><?php print_r($val);?></pre></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
56
.devilbox/www/htdocs/info_mysql.php
Normal file
56
.devilbox/www/htdocs/info_mysql.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>MySQL Info</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Mysql')->isAvailable()): ?>
|
||||
<p>MySQL container is not running.</p>
|
||||
<?php else: ?>
|
||||
<p>For reference see here:</p>
|
||||
<ul>
|
||||
<li><a target="_blank" href="https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html">https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html</a></li>
|
||||
<li><a target="_blank" href="https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html">https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html</a></li>
|
||||
<li><a target="_blank" href="https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html">https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html</a></li>
|
||||
</ul>
|
||||
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Mysql')->getConfig() as $key => $val): ?>
|
||||
<tr>
|
||||
<td><?php echo $key;?></td>
|
||||
<td class="break-word"><code><?php echo $val;?></code></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
49
.devilbox/www/htdocs/info_pgsql.php
Normal file
49
.devilbox/www/htdocs/info_pgsql.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>PostgreSQL Info</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Pgsql')->isAvailable()): ?>
|
||||
<p>PgSQL container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Pgsql')->getConfig() as $key => $val): ?>
|
||||
<tr>
|
||||
<td><?php echo $key;?></td>
|
||||
<td class="break-word"><code><?php echo $val;?></code></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
27
.devilbox/www/htdocs/info_php.php
Normal file
27
.devilbox/www/htdocs/info_php.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<style>
|
||||
/* prevent hhvm phpinfo() from shrinking the width */
|
||||
body {width: 100% !important;}
|
||||
</style>
|
||||
<?php phpinfo(); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
49
.devilbox/www/htdocs/info_redis.php
Normal file
49
.devilbox/www/htdocs/info_redis.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Redis Info</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php if (!loadClass('Redis')->isAvailable()): ?>
|
||||
<p>Redis container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Redis')->getInfo() as $key => $val): ?>
|
||||
<tr>
|
||||
<td><?php echo $key;?></td>
|
||||
<td class="break-word"><code><?php echo $val;?></code></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
32
.devilbox/www/htdocs/info_xdebug.php
Normal file
32
.devilbox/www/htdocs/info_xdebug.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<style>
|
||||
body {width: 100% !important;}
|
||||
</style>
|
||||
<?php if (($version = phpversion('xdebug')) === false): ?>
|
||||
<p><code>xdebug</code> module is not enabled.</p>
|
||||
<?php elseif (!function_exists('xdebug_info')): ?>
|
||||
<p>Xdebug info only available with <code>xdebug 3.x.x</code> or greater. Your version is <code>xdebug <?php echo $version;?></code></p>
|
||||
<?php else:?>
|
||||
<?php xdebug_info(); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
66
.devilbox/www/htdocs/login.php
Normal file
66
.devilbox/www/htdocs/login.php
Normal file
@ -0,0 +1,66 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php
|
||||
|
||||
// If login protection is disabled or user has already logged in
|
||||
if (loadClass('Helper')->isloggedIn()) {
|
||||
loadClass('Helper')->redirect('/');
|
||||
}
|
||||
|
||||
// Validate $_POST login
|
||||
|
||||
$login_error = '';
|
||||
|
||||
if (isset($_POST['username']) && isset($_POST['password'])) {
|
||||
|
||||
// Auth successful
|
||||
if (loadClass('Helper')->login($_POST['username'], $_POST['password'])) {
|
||||
loadClass('Helper')->redirect('/');
|
||||
}
|
||||
$login_error = 'Wrong username or password';
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" style="height: 100%;min-height: 100%;">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(true); ?>
|
||||
</head>
|
||||
|
||||
<body style="height: 100%; min-height: 100%; text-align: center; color: #fff; text-shadow: 0 .05rem .1rem rgba(0,0,0,.5); background: #1f1f1f; margin-bottom:0 !important;">
|
||||
|
||||
<div class="site-wrapper">
|
||||
<div class="site-wrapper-inner">
|
||||
<div class="cover-container">
|
||||
<div class="container">
|
||||
<div class="inner cover">
|
||||
|
||||
<img src="/assets/img/banner.png" style="width:60%; padding-bottom:20px;"/>
|
||||
<h1 class="cover-heading">Devilbox Login</h1>
|
||||
|
||||
<div class="text-danger"><?php echo $login_error; ?></div>
|
||||
<form method="POST">
|
||||
<div class="form-group row">
|
||||
<div class="col-sm-12">
|
||||
<input type="text" class="form-control" id="inputUsername" placeholder="Username" name="username" value="<?php echo isset($_POST['username']) ? $_POST['username'] : ''; ?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-sm-12">
|
||||
<input type="password" class="form-control" id="inputPassword" placeholder="Password" name="password">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-sm-12">
|
||||
<button type="submit" class="btn btn-primary">Sign in</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
11
.devilbox/www/htdocs/logout.php
Normal file
11
.devilbox/www/htdocs/logout.php
Normal file
@ -0,0 +1,11 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php
|
||||
|
||||
if (isset($_GET['id'])) {
|
||||
if ($_GET['id'] == session_id()) {
|
||||
loadClass('Helper')->logout();
|
||||
loadClass('Helper')->redirect('/login.php');
|
||||
}
|
||||
}
|
||||
|
||||
loadClass('Helper')->redirect('/');
|
@ -1,39 +1,131 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
require '../config.php';
|
||||
|
||||
if (isset($_GET['email']) && isset($_GET['subject']) && isset($_GET['message'])) {
|
||||
$mail = $_GET['email'];
|
||||
$subj = $_GET['subject'];
|
||||
$mess = $_GET['message'];
|
||||
mail($mail, $subj, $mess);
|
||||
//
|
||||
// $_POST submit for sending a test email
|
||||
//
|
||||
if (isset($_POST['email']) && isset($_POST['subject']) && isset($_POST['message'])) {
|
||||
$mail = $_POST['email'];
|
||||
$subj = $_POST['subject'];
|
||||
$mess = $_POST['message'];
|
||||
if (! mail($mail, $subj, $mess)) {
|
||||
loadClass('Logger')->error('Could not send mail to: '.$mail.' | subject: '.$subj);
|
||||
}
|
||||
header('Location: /mail.php');
|
||||
exit();
|
||||
}
|
||||
|
||||
//
|
||||
// Includes
|
||||
//
|
||||
require $VEN_DIR . DIRECTORY_SEPARATOR . 'Mail' . DIRECTORY_SEPARATOR .'Mbox.php';
|
||||
require $VEN_DIR . DIRECTORY_SEPARATOR . 'Mail' . DIRECTORY_SEPARATOR .'mimeDecode.php';
|
||||
require $LIB_DIR . DIRECTORY_SEPARATOR . 'Mail.php';
|
||||
require $LIB_DIR . DIRECTORY_SEPARATOR . 'Sort.php';
|
||||
|
||||
if (isset($_GET['get-body']) && is_numeric($_GET['get-body'])) {
|
||||
$messageNumber = $_GET['get-body'];
|
||||
$MyMbox = new \devilbox\Mail('/var/mail/devilbox');
|
||||
$message = $MyMbox->getMessage($messageNumber-1);
|
||||
$structure = $message['decoded'];
|
||||
|
||||
$body = null;
|
||||
if (isset($structure->body)) {
|
||||
$body = $structure->body;
|
||||
}
|
||||
elseif(isset($structure->parts[1]->body)) {
|
||||
$body = $structure->parts[1]->body;
|
||||
}
|
||||
elseif(isset($structure->parts[0]->body)) {
|
||||
$body = $structure->parts[0]->body;
|
||||
}
|
||||
|
||||
exit(json_encode(array(
|
||||
'raw' => htmlentities($message['raw']),
|
||||
'body' => $body,
|
||||
)));
|
||||
}
|
||||
|
||||
if (isset($_GET['delete']) && is_numeric($_GET['delete'])) {
|
||||
$message = $_GET['delete'];
|
||||
$MyMbox = new \devilbox\Mail('/var/mail/devilbox');
|
||||
$MyMbox->delete($message);
|
||||
header('Location: /mail.php');
|
||||
exit();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Setup Sort/Order
|
||||
//
|
||||
|
||||
require '../include/vendor/Mail/Mbox.php';
|
||||
require '../include/vendor/Mail/mimeDecode.php';
|
||||
// Sort/Order settings
|
||||
$defaultSort = array('sort' => 'date', 'order' => 'DESC');
|
||||
$allowedSorts = array('date', 'subject', 'x-original-to', 'from');
|
||||
$allowedOrders = array('ASC', 'DESC');
|
||||
$GET_sortKeys = array('sort' => 'sort', 'order' => 'order');
|
||||
|
||||
$params['include_bodies'] = true;
|
||||
$params['decode_bodies'] = true;
|
||||
$params['decode_headers'] = true;
|
||||
$params['crlf'] = "\r\n";
|
||||
// Get sort/order
|
||||
$MySort = new \devilbox\Sort($defaultSort, $allowedSorts, $allowedOrders, $GET_sortKeys);
|
||||
$sort = $MySort->getSort();
|
||||
$order = $MySort->getOrder();
|
||||
|
||||
$mbox = new Mail_Mbox('/var/mail/mailtrap');
|
||||
// Evaluate Sorters/Orderers
|
||||
$orderDate = '<a href="/mail.php?sort=date&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a>';
|
||||
$orderFrom = '<a href="/mail.php?sort=from&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a>';
|
||||
$orderTo = '<a href="/mail.php?sort=x-original-to&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a>';
|
||||
$orderSubj = '<a href="/mail.php?sort=subject&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a>';
|
||||
|
||||
if ($sort == 'date') {
|
||||
if ($order == 'ASC') {
|
||||
$orderDate = '<a href="/mail.php?sort=date&order=DESC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-numeric-asc" aria-hidden="true"></i>';
|
||||
} else {
|
||||
$orderDate = '<a href="/mail.php?sort=date&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-numeric-desc" aria-hidden="true"></i> ';
|
||||
}
|
||||
} else if ($sort == 'subject') {
|
||||
if ($order == 'ASC') {
|
||||
$orderSubj = '<a href="/mail.php?sort=subject&order=DESC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-asc" aria-hidden="true"></i>';
|
||||
} else {
|
||||
$orderSubj = '<a href="/mail.php?sort=subject&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-desc" aria-hidden="true"></i>';
|
||||
}
|
||||
} else if ($sort == 'x-original-to') {
|
||||
if ($order == 'ASC') {
|
||||
$orderTo = '<a href="/mail.php?sort=x-original-to&order=DESC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-asc" aria-hidden="true"></i>';
|
||||
} else {
|
||||
$orderTo = '<a href="/mail.php?sort=x-original-to&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-desc" aria-hidden="true"></i>';
|
||||
}
|
||||
} else if ($sort == 'from') {
|
||||
if ($order == 'ASC') {
|
||||
$orderFrom = '<a href="/mail.php?sort=from&order=DESC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-asc" aria-hidden="true"></i>';
|
||||
} else {
|
||||
$orderFrom = '<a href="/mail.php?sort=from&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-desc" aria-hidden="true"></i>';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Mbox Reader
|
||||
//
|
||||
$MyMbox = new \devilbox\Mail('/var/mail/devilbox');
|
||||
|
||||
// If default sort is on, use NULL, so we do not have to sort the mails after retrieval,
|
||||
// because they are being read in the default sort/order anyway
|
||||
$sortOrderArr = $MySort->isDefault($sort, $order) ? null : array($sort => $order);
|
||||
$messages = $MyMbox->get($sortOrderArr);
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php require '../include/head.php'; ?>
|
||||
<?php echo loadClass('Html')->getHead(true); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php require '../include/navigation.php'; ?>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Mail</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
@ -49,7 +141,7 @@ $mbox = new Mail_Mbox('/var/mail/mailtrap');
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<form class="form-inline">
|
||||
<form method="post" class="form-inline">
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="exampleInputEmail1">Email to</label>
|
||||
<input name="email" type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter to email">
|
||||
@ -62,7 +154,7 @@ $mbox = new Mail_Mbox('/var/mail/mailtrap');
|
||||
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="exampleInputEmail3">Message</label>
|
||||
<input name="message" type="text" class="form-control" id="exampleInputEmail3" placeholder="Message">
|
||||
<textarea name="message" rows="1" class="form-control" id="exampleInputEmail3" placeholder="Message"></textarea>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary">Send Email</button>
|
||||
@ -82,59 +174,90 @@ $mbox = new Mail_Mbox('/var/mail/mailtrap');
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<?php $mbox->open(); ?>
|
||||
<table class="table table-striped table-hover">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th style="word-break: normal;">Date</th>
|
||||
<th>To</th>
|
||||
<th>Subject</th>
|
||||
<th>Date <?php echo $orderDate;?></th>
|
||||
<th>From <?php echo $orderFrom;?></th>
|
||||
<th>To <?php echo $orderTo;?></th>
|
||||
<th>Subject <?php echo $orderSubj;?></th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php for ($n = ($mbox->size()-1); $n >= 0; $n--): ?>
|
||||
<?php foreach ($messages as $data): ?>
|
||||
<?php
|
||||
$message = $mbox->get($n);
|
||||
$decode = new Mail_mimeDecode($message, "\r\n");
|
||||
$structure = $decode->decode($params);
|
||||
$message = htmlentities($data['raw']);
|
||||
$structure = $data['decoded'];
|
||||
?>
|
||||
<tr id="<?php echo $n;?>" class="subject">
|
||||
<td><?php echo $n;?></td>
|
||||
<tr id="<?php echo $data['num'];?>" class="subject">
|
||||
<td><?php echo $data['num'];?></td>
|
||||
<td>
|
||||
<?php echo date('H:i', strtotime($structure->headers['date']));?><br/>
|
||||
<small><?php echo date('Y-m-d', strtotime($structure->headers['date']));?></small>
|
||||
</td>
|
||||
<td><?php echo $structure->headers['x-original-to'];?></td>
|
||||
<td><?php echo $structure->headers['subject'];?></td>
|
||||
<td><?php echo htmlentities($structure->headers['from']);?></td>
|
||||
<td><?php echo htmlentities($structure->headers['x-original-to']);?></td>
|
||||
<td><?php echo htmlentities($structure->headers['subject']);?></td>
|
||||
<td><a href="/mail.php?delete=<?php echo $data['num']-1;?>" title="Delete Email"><i class="fa fa-trash"></i></a></td>
|
||||
</tr>
|
||||
<tr></tr>
|
||||
<tr id="mail-<?php echo $n;?>" style="display:none">
|
||||
<tr id="mail-<?php echo $data['num'];?>" style="display:none">
|
||||
<td></td>
|
||||
<td colspan="3">
|
||||
<pre><?php echo $message;?></pre>
|
||||
<td colspan="5">
|
||||
<div class="email-body"></div>
|
||||
<div class="alert alert-warning" role="alert" style="display:none">
|
||||
No valid body found
|
||||
</div>
|
||||
<hr>
|
||||
<p><a class="btn btn-primary" data-toggle="collapse" href="#email-<?php echo $data['num'];?>" aria-expanded="false" aria-controls="email-<?php echo $data['num'];?>">Raw source</a></p>
|
||||
<div class="collapse" id="email-<?php echo $data['num'];?>"><pre class="raw-email-body"></pre></div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php $mbox->close(); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php require '../include/footer.php'; ?>
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
<script>
|
||||
$(function() {
|
||||
$('.subject').each(function() {
|
||||
$(this).click(function() {
|
||||
var id = ($(this).attr('id'));
|
||||
$('#mail-'+id).toggle();
|
||||
$('.subject').click(function() {
|
||||
const id = ($(this).attr('id'));
|
||||
const row = $('#mail-'+id);
|
||||
row.toggle();
|
||||
|
||||
const bodyElement = row.find('.email-body')[0];
|
||||
if(bodyElement.shadowRoot !== null){
|
||||
// We've already fetched the message content.
|
||||
return;
|
||||
}
|
||||
|
||||
bodyElement.attachShadow({ mode: 'open' });
|
||||
bodyElement.shadowRoot.innerHTML = 'Loading...';
|
||||
|
||||
$.get('?get-body=' + id, function(response){
|
||||
response = JSON.parse(response);
|
||||
row.find('.raw-email-body').html(response.raw);
|
||||
|
||||
const body = response.body;
|
||||
if(body === null){
|
||||
row.find('.alert').show();
|
||||
}
|
||||
else{
|
||||
bodyElement.shadowRoot.innerHTML = body;
|
||||
}
|
||||
})
|
||||
})
|
||||
// Handler for .ready() called.
|
||||
|
@ -1,51 +0,0 @@
|
||||
<?php $CONNECT = TRUE; require '../config.php'; ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php require '../include/head.php'; ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php require '../include/navigation.php'; ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>MySQL Info</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<p>For reference see here:</p>
|
||||
<ul>
|
||||
<li><a target="_blank" href="https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html">https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html</a></li>
|
||||
<li><a target="_blank" href="https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html">https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html</a></li>
|
||||
<li><a target="_blank" href="https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html">https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html</a></li>
|
||||
</ul>
|
||||
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th style="word-break: normal;">Variable</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (getMySQLConfig() as $key => $val): ?>
|
||||
<tr>
|
||||
<td style="word-break: normal;"><?php echo $key;?></td>
|
||||
<td><?php echo $val;?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php require '../include/footer.php'; ?>
|
||||
</body>
|
||||
</html>
|
@ -1,4 +1,5 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
|
||||
/**
|
||||
@ -12,6 +13,7 @@
|
||||
* @license MIT, http://acollington.mit-license.org/
|
||||
*/
|
||||
|
||||
error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE);
|
||||
|
||||
/*
|
||||
* User configuration
|
||||
@ -53,13 +55,13 @@ class OpCacheService
|
||||
'debounce_rate' => 250
|
||||
];
|
||||
|
||||
private function __construct($options = [])
|
||||
private function __construct($options = array())
|
||||
{
|
||||
$this->options = array_merge($this->defaults, $options);
|
||||
$this->data = $this->compileState();
|
||||
}
|
||||
|
||||
public static function init($options = [])
|
||||
public static function init($options = array())
|
||||
{
|
||||
$self = new self($options);
|
||||
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH'])
|
||||
@ -148,7 +150,7 @@ class OpCacheService
|
||||
$status = opcache_get_status();
|
||||
$config = opcache_get_configuration();
|
||||
|
||||
$files = [];
|
||||
$files = array();
|
||||
if (!empty($status['scripts']) && $this->getOption('allow_filelist')) {
|
||||
uasort($status['scripts'], function($a, $b) {
|
||||
return $a['hits'] < $b['hits'];
|
||||
@ -190,7 +192,7 @@ class OpCacheService
|
||||
]
|
||||
);
|
||||
|
||||
$directives = [];
|
||||
$directives = array();
|
||||
ksort($config['directives']);
|
||||
foreach ($config['directives'] as $k => $v) {
|
||||
$directives[] = ['k' => $k, 'v' => $v];
|
||||
@ -230,7 +232,7 @@ $opcache = OpCacheService::init($options);
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<?php require '../include/head.php'; ?>
|
||||
<?php echo loadClass('Html')->getHead(); /* devilbox edit */ ?>
|
||||
|
||||
|
||||
<meta charset="UTF-8"/>
|
||||
@ -238,7 +240,7 @@ $opcache = OpCacheService::init($options);
|
||||
<title>OPcache statistics on <?php echo $opcache->getData('version', 'host'); ?></title>
|
||||
<script src="/vendor/react/react.min.js"></script>
|
||||
<script src="/vendor/react/react-dom.min.js"></script>
|
||||
<script src="/vendor/jquery/jquery-2.2.3.min.js"></script>
|
||||
<script src="/vendor/jquery/jquery-3.2.1.min.js"></script>
|
||||
<style type="text/css">
|
||||
body { font-family:sans-serif; font-size:90%; padding: 0; margin: 0 }
|
||||
nav { padding-top: 20px; }
|
||||
@ -321,7 +323,7 @@ $opcache = OpCacheService::init($options);
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php require '../include/navigation.php'; ?>
|
||||
<?php echo loadClass('Html')->getNavbar(); /* devilbox edit */?>
|
||||
|
||||
|
||||
|
||||
@ -766,6 +768,6 @@ $opcache = OpCacheService::init($options);
|
||||
var filesObj = ReactDOM.render(React.createElement(Files, null), document.getElementById('filelist'));
|
||||
ReactDOM.render(React.createElement(Directives, null), document.getElementById('directives'));
|
||||
</script>
|
||||
<?php require '../include/footer.php'; ?>
|
||||
<?php echo loadClass('Html')->getFooter(); /* devilbox edit */?>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,22 +0,0 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php require '../include/head.php'; ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php require '../include/navigation.php'; ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<?php phpinfo(); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php require '../include/footer.php'; ?>
|
||||
</body>
|
||||
</html>
|
203
.devilbox/www/htdocs/support.php
Normal file
203
.devilbox/www/htdocs/support.php
Normal file
@ -0,0 +1,203 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(true); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>Support</h1>
|
||||
<br/>
|
||||
<p>I am currently the sole creator and maintainer of the Devilbox and all of its required projects.<br/>If you find this useful or if it makes your daily programming life easier, consider donating to keep this project alive.</p>
|
||||
<ul>
|
||||
<li><a target="_blank" href="https://github.com/sponsors/cytopia"><strong>GitHub sponsorship</strong></a></li>
|
||||
<li><a target="_blank" href="https://opencollective.com/devilbox"><strong>Open Collective</strong></a></li>
|
||||
<li><a target="_blank" href="https://www.patreon.com/devilbox"><strong>Patreon</strong></a></li>
|
||||
</ul>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6">
|
||||
<h2>Core projects</h2>
|
||||
<p>The following core projects were created and are maintained in order to make the Devilbox work.</p>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Repository</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/devilbox">devilbox</a></td>
|
||||
<td>The Devilbox</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.2">docker-php-fpm-5.2</a></td>
|
||||
<td>Legacy PHP 5.2 base images (<code>amd64</code> and <code>i386</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.3">docker-php-fpm-5.3</a></td>
|
||||
<td>Legacy PHP 5.3 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.4">docker-php-fpm-5.4</a></td>
|
||||
<td>Legacy PHP 5.4 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.5">docker-php-fpm-5.5</a></td>
|
||||
<td>Legacy PHP 5.5 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.0">docker-php-fpm-8.0</a></td>
|
||||
<td>PHP 8.0 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.1">docker-php-fpm-8.1</a></td>
|
||||
<td>PHP 8.1 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.2">docker-php-fpm-8.2</a></td>
|
||||
<td>PHP 8.2 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.3">docker-php-fpm-8.3</a></td>
|
||||
<td>PHP 8.3 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm">docker-php-fpm</a></td>
|
||||
<td>PHP-FPM Devilbox images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-community">docker-php-fpm-community</a></td>
|
||||
<td>PHP-FPM Community images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-mysql">docker-mysql</a></td>
|
||||
<td>MySQL, MariaDB and PerconaDB images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-apache-2.2">docker-apache-2.2</a></td>
|
||||
<td>Apache 2.2 images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-apache-2.4">docker-apache-2.4</a></td>
|
||||
<td>Apache 2.4 images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-nginx-stable">docker-nginx-stable</a></td>
|
||||
<td>Nginx stable images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-nginx-mainline">docker-nginx-mainline</a></td>
|
||||
<td>Nginx mainline images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-haproxy">docker-haproxy</a></td>
|
||||
<td>HA Proxy image</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-ngrok">docker-ngrok</a></td>
|
||||
<td>Ngrok image (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-varnish">docker-varnish</a></td>
|
||||
<td>Varnish image</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-python-flask">docker-python-flask</a></td>
|
||||
<td>Python Flask image</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-6">
|
||||
<h2>Supporting projects</h2>
|
||||
<p>The following supporting projects were created and are maintained in order to keep the Devilbox eco system running.</p>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Repository</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/cert-gen">cert-gen</a></td>
|
||||
<td>CA and cert generation tool</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/vhost-gen">vhost-gen</a></td>
|
||||
<td>HTTPD agnostic vhost creation tool</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/watcherd">watcherd</a></td>
|
||||
<td>OS agnostic filesystem change poller tool</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/makefiles">makefiles</a></td>
|
||||
<td>Unified build Makefiles</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/github-actions">github-actions</a></td>
|
||||
<td>Re-usable GitHub Action Workflows</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/shell-command-retry-action">shell-command-retry</a></td>
|
||||
<td>GitHub Action</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/docker-tag-action">docker-tag</a></td>
|
||||
<td>GitHub Action</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/git-ref-matrix-action">git-ref-matrix</a></td>
|
||||
<td>GitHub Action</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/upload-artifact-verify-action">upload-artifact-verify</a></td>
|
||||
<td>GitHub Action</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-python-sphinx">docker-python-sphinx</a></td>
|
||||
<td>Dockerized Sphinx documentation builder</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/xdebug">xdebug</a></td>
|
||||
<td>IP addr alias MacOS plist for Xdebug</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/docker-ansible">docker-ansible</a></td>
|
||||
<td>Ansible images for PHP-FPM Dockerfile creation</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/linkcheck">linkcheck</a></td>
|
||||
<td>Broken linkchecker for documentation</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/docker-linkcheck">docker-linkcheck</a></td>
|
||||
<td>Dockerized version of linkcheck</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-1.99s">docker-php-1.99s</a></td>
|
||||
<td>Just for the lulz</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
1934
.devilbox/www/htdocs/vendor/adminer-4.6.3-en.php
vendored
Normal file
1934
.devilbox/www/htdocs/vendor/adminer-4.6.3-en.php
vendored
Normal file
File diff suppressed because one or more lines are too long
1791
.devilbox/www/htdocs/vendor/adminer-4.8.1-en.php
vendored
Normal file
1791
.devilbox/www/htdocs/vendor/adminer-4.8.1-en.php
vendored
Normal file
File diff suppressed because one or more lines are too long
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-grid.css.map
vendored
Normal file
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-grid.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-grid.min.css
vendored
Normal file
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-grid.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-grid.min.css.map
vendored
Normal file
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-grid.min.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-reboot.css.map
vendored
Normal file
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-reboot.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-reboot.min.css
vendored
Normal file
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-reboot.min.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}html{-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{cursor:help}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse;background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{line-height:inherit}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}/*# sourceMappingURL=bootstrap-reboot.min.css.map */
|
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-reboot.min.css.map
vendored
Normal file
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap-reboot.min.css.map
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../scss/_normalize.scss","bootstrap-reboot.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"4EAYA,KACE,YAAA,WACA,YAAA,KACA,qBAAA,KACA,yBAAA,KAUF,KACE,OAAA,EAOF,QAAA,MAAA,OAAA,OAAA,IAAA,QAME,QAAA,MAQF,GACE,UAAA,IACA,OAAA,MAAA,EAWF,WAAA,OAAA,KAGE,QAAA,MAOF,OACE,OAAA,IAAA,KAQF,GACE,mBAAA,YAAA,WAAA,YACA,OAAA,EACA,SAAA,QAQF,IACE,YAAA,UAAA,UACA,UAAA,IAWF,EACE,iBAAA,YACA,6BAAA,QAQF,SAAA,QAEE,cAAA,EAQF,YACE,cAAA,KACA,gBAAA,UACA,gBAAA,UAAA,OAOF,EAAA,OAEE,YAAA,QAOF,EAAA,OAEE,YAAA,OAQF,KAAA,IAAA,KAGE,YAAA,UAAA,UACA,UAAA,IAOF,IACE,WAAA,OAOF,KACE,iBAAA,KACA,MAAA,KAOF,MACE,UAAA,IAQF,IAAA,IAEE,UAAA,IACA,YAAA,EACA,SAAA,SACA,eAAA,SAGF,IACE,OAAA,OAGF,IACE,IAAA,MAUF,MAAA,MAEE,QAAA,aAOF,sBACE,QAAA,KACA,OAAA,EAOF,IACE,aAAA,KAOF,eACE,SAAA,OAWF,OAAA,MAAA,SAAA,OAAA,SAKE,YAAA,WACA,UAAA,KACA,YAAA,KACA,OAAA,EAQF,OAAA,MAEE,SAAA,QAQF,OAAA,OAEE,eAAA,KASF,aAAA,cAAA,OAAA,mBAIE,mBAAA,OAOF,gCAAA,+BAAA,gCAAA,yBAIE,aAAA,KACA,QAAA,EAOF,6BAAA,4BAAA,6BAAA,sBAIE,QAAA,IAAA,OAAA,WAOF,SACE,OAAA,IAAA,MAAA,OACA,OAAA,EAAA,IACA,QAAA,MAAA,OAAA,MAUF,OACE,mBAAA,WAAA,WAAA,WACA,MAAA,QACA,QAAA,MACA,UAAA,KACA,QAAA,EACA,YAAA,OAQF,SACE,QAAA,aACA,eAAA,SAOF,SACE,SAAA,KCrKF,gBAAA,aD+KE,mBAAA,WAAA,WAAA,WACA,QAAA,EC1KF,yCAAA,yCDmLE,OAAA,KC9KF,cDuLE,mBAAA,UACA,eAAA,KCnLF,4CAAA,yCD4LE,mBAAA,KAQF,6BACE,mBAAA,OACA,KAAA,QAWF,QAAA,KAEE,QAAA,MAOF,QACE,QAAA,UAUF,OACE,QAAA,aAOF,SACE,QAAA,KCnNF,SD8NE,QAAA,KEtbF,KACE,mBAAA,WAAA,WAAA,WAGF,EAAA,QAAA,SAGE,mBAAA,QAAA,WAAA,QAoBA,cAAgB,MAAA,aAQlB,KAYE,mBAAA,UAGA,4BAAA,YAGF,KACE,YAAA,cAAA,UAAA,mBAAA,WAAA,OC2K4H,iBD3K5H,MAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IAEA,MAAA,QAEA,iBAAA,KD2LF,sBClLE,QAAA,YAYF,GAAI,GAAI,GAAI,GAAI,GAAI,GAClB,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KAIF,0BAAA,YAGE,OAAA,KAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QAGF,GAAA,GAAA,GAGE,WAAA,EACA,cAAA,KAGF,MAAA,MAAA,MAAA,MAIE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAQF,EACE,MAAA,QACA,gBAAA,KEhJE,QAAA,QFmJA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KEhKE,oCAAA,oCFmKA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EASJ,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAGE,OAAA,EAAA,EAAA,KAQF,IAGE,eAAA,ODsIF,cCzHE,OAAA,QAcF,cAAA,EAAA,KAAA,OAAA,MAAA,MAAA,OAAA,QAAA,SASE,iBAAA,aAAA,aAAA,aAQF,MAEE,gBAAA,SAEA,iBAAA,YAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBAGF,OAAA,MAAA,OAAA,SAME,YAAA,QAGF,8BAAA,2BAMI,OAAA,YAKJ,iBAAA,iBAAA,2BAAA,kBASE,mBAAA,QAGF,SAEE,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAGF,OAEE,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QAGF,mBAKE,mBAAA,KAIF,OACE,QAAA,aDsEF,SC9DE,QAAA"}
|
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap.css.map
vendored
Normal file
1
.devilbox/www/htdocs/vendor/bootstrap/bootstrap.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
.devilbox/www/htdocs/vendor/jquery/jquery-3.2.1.min.js
vendored
Normal file
4
.devilbox/www/htdocs/vendor/jquery/jquery-3.2.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
391
.devilbox/www/htdocs/vendor/ocp.php
vendored
Normal file
391
.devilbox/www/htdocs/vendor/ocp.php
vendored
Normal file
@ -0,0 +1,391 @@
|
||||
<?php
|
||||
/*
|
||||
OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
|
||||
Author: _ck_ (with contributions by GK, stasilok)
|
||||
Version: 0.1.7
|
||||
Free for any kind of use or modification, I am not responsible for anything, please share your improvements
|
||||
|
||||
* revision history
|
||||
0.1.7 2015-09-01 regex fix for PHP7 phpinfo
|
||||
0.1.6 2013-04-12 moved meta to footer so graphs can be higher and reduce clutter
|
||||
0.1.5 2013-04-12 added graphs to visualize cache state, please report any browser/style bugs
|
||||
0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
|
||||
0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
|
||||
0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
|
||||
0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
|
||||
0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
|
||||
0.0.6 2013-03-16 transition support as Zend renames product and functions for PHP 5.5 (stasilok)
|
||||
0.0.5 2013-03-10 added refresh button (GK)
|
||||
0.0.4 2013-02-18 added file grouping and sorting (click on headers) - code needs cleanup but gets the job done
|
||||
0.0.2 2013-02-14 first public release
|
||||
|
||||
* known problems/limitations:
|
||||
Unlike APC, the Zend OPcache API
|
||||
- cannot determine when a file was put into the cache
|
||||
- cannot change settings on the fly
|
||||
- cannot protect opcache functions by restricting execution to only specific scripts/paths
|
||||
|
||||
* todo:
|
||||
Extract variables for prefered ordering and better layout instead of just dumping into tables
|
||||
File list filter
|
||||
|
||||
*/
|
||||
|
||||
// ini_set('display_errors',1); error_reporting(-1);
|
||||
if ( count(get_included_files())>1 || php_sapi_name()=='cli' || empty($_SERVER['REMOTE_ADDR']) ) { die; } // weak block against indirect access
|
||||
|
||||
$time=time();
|
||||
define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));
|
||||
|
||||
if ( !empty($_GET['RESET']) ) {
|
||||
if ( function_exists(CACHEPREFIX.'reset') ) { call_user_func(CACHEPREFIX.'reset'); }
|
||||
header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( !empty($_GET['RECHECK']) ) {
|
||||
if ( function_exists(CACHEPREFIX.'invalidate') ) {
|
||||
$recheck=trim($_GET['RECHECK']); $files=call_user_func(CACHEPREFIX.'get_status');
|
||||
if (!empty($files['scripts'])) {
|
||||
foreach ($files['scripts'] as $file=>$value) {
|
||||
if ( $recheck==='1' || strpos($file,$recheck)===0 ) call_user_func(CACHEPREFIX.'invalidate',$file);
|
||||
}
|
||||
}
|
||||
header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
|
||||
} else { echo 'Sorry, this feature requires Zend Opcache newer than April 8th 2013'; }
|
||||
exit;
|
||||
}
|
||||
|
||||
?><!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>OCP - Opcache Control Panel</title>
|
||||
<meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />
|
||||
|
||||
<style type="text/css">
|
||||
body {background-color: #fff; color: #000;}
|
||||
body, td, th, h1, h2 {font-family: sans-serif;}
|
||||
pre {margin: 0px; font-family: monospace;}
|
||||
a:link,a:visited {color: #000099; text-decoration: none;}
|
||||
a:hover {text-decoration: underline;}
|
||||
table {border-collapse: collapse; width: 600px; }
|
||||
.center {text-align: center;}
|
||||
.center table { margin-left: auto; margin-right: auto; text-align: left;}
|
||||
.center th { text-align: center !important; }
|
||||
.middle {vertical-align:middle;}
|
||||
td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline; padding: 3px; }
|
||||
h1 {font-size: 150%;}
|
||||
h2 {font-size: 125%;}
|
||||
.p {text-align: left;}
|
||||
.e {background-color: #ccccff; font-weight: bold; color: #000; width:50%; white-space:nowrap;}
|
||||
.h {background-color: #9999cc; font-weight: bold; color: #000;}
|
||||
.v {background-color: #cccccc; color: #000;}
|
||||
.vr {background-color: #cccccc; text-align: right; color: #000; white-space: nowrap;}
|
||||
.b {font-weight:bold;}
|
||||
.white, .white a {color:#fff;}
|
||||
img {float: right; border: 0px;}
|
||||
hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000;}
|
||||
.meta, .small {font-size: 75%; }
|
||||
.meta {margin: 2em 0;}
|
||||
.meta a, th a {padding: 10px; white-space:nowrap; }
|
||||
.buttons {margin:0 0 1em;}
|
||||
.buttons a {margin:0 15px; background-color: #9999cc; color:#fff; text-decoration:none; padding:1px; border:1px solid #000; display:inline-block; width:5em; text-align:center;}
|
||||
#files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
|
||||
#files td.v a:hover {font-weight:bold; color:#ee0000;}
|
||||
.graph {display:inline-block; width:145px; margin:1em 0 1em 1px; border:0; vertical-align:top;}
|
||||
.graph table {width:100%; height:150px; border:0; padding:0; margin:5px 0 0 0; position:relative;}
|
||||
.graph td {vertical-align:middle; border:0; padding:0 0 0 5px;}
|
||||
.graph .bar {width:25px; text-align:right; padding:0 2px; color:#fff;}
|
||||
.graph .total {width:34px; text-align:center; padding:0 5px 0 0;}
|
||||
.graph .total div {border:1px dashed #888; border-right:0; height:99%; width:12px; position:absolute; bottom:0; left:17px; z-index:-1;}
|
||||
.graph .total span {background:#fff; font-weight:bold;}
|
||||
.graph .actual {text-align:right; font-weight:bold; padding:0 5px 0 0;}
|
||||
.graph .red {background:#ee0000;}
|
||||
.graph .green {background:#00cc00;}
|
||||
.graph .brown {background:#8B4513;}
|
||||
</style>
|
||||
<!--[if lt IE 9]><script type="text/javascript" defer="defer">
|
||||
window.onload=function(){var i,t=document.getElementsByTagName('table');for(i=0;i<t.length;i++){if(t[i].parentNode.className=='graph')t[i].style.height=150-(t[i].clientHeight-150)+'px';}}
|
||||
</script><![endif]-->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="center">
|
||||
|
||||
<h1><a href="?">Opcache Control Panel</a></h1>
|
||||
|
||||
<div class="buttons">
|
||||
<a href="?ALL=1">Details</a>
|
||||
<a href="?FILES=1&GROUP=2&SORT=3">Files</a>
|
||||
<a href="?RESET=1" onclick="return confirm('RESET cache ?')">Reset</a>
|
||||
<?php if ( function_exists(CACHEPREFIX.'invalidate') ) { ?>
|
||||
<a href="?RECHECK=1" onclick="return confirm('Recheck all files in the cache ?')">Recheck</a>
|
||||
<?php } ?>
|
||||
<a href="?" onclick="window.location.reload(true); return false">Refresh</a>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
if ( !function_exists(CACHEPREFIX.'get_status') ) { echo '<h2>Opcache not detected?</h2>'; die; }
|
||||
|
||||
if ( !empty($_GET['FILES']) ) { echo '<h2>files cached</h2>'; files_display(); echo '</div></body></html>'; exit; }
|
||||
|
||||
if ( !(isset($_REQUEST['GRAPHS']) && !$_REQUEST['GRAPHS']) && CACHEPREFIX=='opcache_') { graphs_display(); if ( !empty($_REQUEST['GRAPHS']) ) { exit; } }
|
||||
|
||||
ob_start(); phpinfo(8); $phpinfo = ob_get_contents(); ob_end_clean(); // some info is only available via phpinfo? sadly buffering capture has to be used
|
||||
if ( !preg_match( '/module\_Zend.(Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/is', $phpinfo, $opcache) ) { } // todo
|
||||
|
||||
if ( function_exists(CACHEPREFIX.'get_configuration') ) { echo '<h2>general</h2>'; $configuration=call_user_func(CACHEPREFIX.'get_configuration'); }
|
||||
|
||||
$host=function_exists('gethostname')?@gethostname():@php_uname('n'); if (empty($host)) { $host=empty($_SERVER['SERVER_NAME'])?$_SERVER['HOST_NAME']:$_SERVER['SERVER_NAME']; }
|
||||
$version=array('Host'=>$host);
|
||||
$version['PHP Version']='PHP '.(defined('PHP_VERSION')?PHP_VERSION:'???').' '.(defined('PHP_SAPI')?PHP_SAPI:'').' '.(defined('PHP_OS')?' '.PHP_OS:'');
|
||||
$version['Opcache Version']=empty($configuration['version']['version'])?'???':$configuration['version'][CACHEPREFIX.'product_name'].' '.$configuration['version']['version'];
|
||||
print_table($version);
|
||||
|
||||
if ( !empty($opcache[2]) ) { echo preg_replace('/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/','',$opcache[2]); }
|
||||
|
||||
if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'get_status') ) {
|
||||
$uptime=array();
|
||||
if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
|
||||
$uptime['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
|
||||
}
|
||||
if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) {
|
||||
$uptime['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
|
||||
}
|
||||
if (!empty($uptime)) {print_table($uptime);}
|
||||
|
||||
if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; }
|
||||
|
||||
echo '<h2 id="memory">memory</h2>';
|
||||
print_table($status['memory_usage']);
|
||||
unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
|
||||
echo '<h2 id="statistics">statistics</h2>';
|
||||
print_table($status[CACHEPREFIX.'statistics']);
|
||||
}
|
||||
|
||||
if ( empty($_GET['ALL']) ) { meta_display(); exit; }
|
||||
|
||||
if ( !empty($configuration['blacklist']) ) { echo '<h2 id="blacklist">blacklist</h2>'; print_table($configuration['blacklist']); }
|
||||
|
||||
if ( !empty($opcache[3]) ) { echo '<h2 id="runtime">runtime</h2>'; echo $opcache[3]; }
|
||||
|
||||
$name='zend opcache'; $functions=get_extension_funcs($name);
|
||||
if (!$functions) { $name='zend optimizer+'; $functions=get_extension_funcs($name); }
|
||||
if ($functions) { echo '<h2 id="functions">functions</h2>'; print_table($functions); } else { $name=''; }
|
||||
|
||||
$level=trim(CACHEPREFIX,'_').'.optimization_level';
|
||||
if (isset($configuration['directives'][$level])) {
|
||||
echo '<h2 id="optimization">optimization levels</h2>';
|
||||
$levelset=strrev(base_convert($configuration['directives'][$level], 10, 2));
|
||||
$levels=array(
|
||||
1=>'<a href="http://wikipedia.org/wiki/Common_subexpression_elimination">Constants subexpressions elimination</a> (CSE) true, false, null, etc.<br />Optimize series of ADD_STRING / ADD_CHAR<br />Convert CAST(IS_BOOL,x) into BOOL(x)<br />Convert <a href="http://www.php.net/manual/internals2.opcodes.init-fcall-by-name.php">INIT_FCALL_BY_NAME</a> + <a href="http://www.php.net/manual/internals2.opcodes.do-fcall-by-name.php">DO_FCALL_BY_NAME</a> into <a href="http://www.php.net/manual/internals2.opcodes.do-fcall.php">DO_FCALL</a>',
|
||||
2=>'Convert constant operands to expected types<br />Convert conditional <a href="http://php.net/manual/internals2.opcodes.jmp.php">JMP</a> with constant operands<br />Optimize static <a href="http://php.net/manual/internals2.opcodes.brk.php">BRK</a> and <a href="<a href="http://php.net/manual/internals2.opcodes.cont.php">CONT</a>',
|
||||
3=>'Convert $a = $a + expr into $a += expr<br />Convert $a++ into ++$a<br />Optimize series of <a href="http://php.net/manual/internals2.opcodes.jmp.php">JMP</a>',
|
||||
4=>'PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)',
|
||||
5=>'Block Optimization - most expensive pass<br />Performs many different optimization patterns based on <a href="http://wikipedia.org/wiki/Control_flow_graph">control flow graph</a> (CFG)',
|
||||
9=>'Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)',
|
||||
10=>'Remove NOPs'
|
||||
);
|
||||
echo '<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>';
|
||||
foreach ($levels as $pass=>$description) {
|
||||
$disabled=substr($levelset,$pass-1,1)!=='1' || $pass==4 ? ' white':'';
|
||||
echo '<tr><td class="v center middle'.$disabled.'">'.$pass.'</td><td class="v'.$disabled.'">'.$description.'</td></tr>';
|
||||
}
|
||||
echo '</table>';
|
||||
}
|
||||
|
||||
if ( isset($_GET['DUMP']) ) {
|
||||
if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all($name,true)); }
|
||||
foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
|
||||
exit;
|
||||
}
|
||||
|
||||
meta_display();
|
||||
|
||||
echo '</div></body></html>';
|
||||
|
||||
exit;
|
||||
|
||||
function time_since($time,$original,$extended=0,$text='ago') {
|
||||
$time = $time - $original;
|
||||
$day = $extended? floor($time/86400) : round($time/86400,0);
|
||||
$amount=0; $unit='';
|
||||
if ( $time < 86400) {
|
||||
if ( $time < 60) { $amount=$time; $unit='second'; }
|
||||
elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; }
|
||||
else { $amount=floor($time/3600); $unit='hour'; }
|
||||
}
|
||||
elseif ( $day < 14) { $amount=$day; $unit='day'; }
|
||||
elseif ( $day < 56) { $amount=floor($day/7); $unit='week'; }
|
||||
elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
|
||||
else { $amount=intval(2*($day/365))/2; $unit='year'; }
|
||||
|
||||
if ( $amount!=1) {$unit.='s';}
|
||||
if ($extended && $time>60) { $text=' and '.time_since($time,$time<86400?($time<3600?$amount*60:$amount*3600):$day*86400,0,'').$text; }
|
||||
|
||||
return $amount.' '.$unit.' '.$text;
|
||||
}
|
||||
|
||||
function print_table($array,$headers=false) {
|
||||
if ( empty($array) || !is_array($array) ) {return;}
|
||||
echo '<table border="0" cellpadding="3" width="600">';
|
||||
if (!empty($headers)) {
|
||||
if (!is_array($headers)) {$headers=array_keys(reset($array));}
|
||||
echo '<tr class="h">';
|
||||
foreach ($headers as $value) { echo '<th>',$value,'</th>'; }
|
||||
echo '</tr>';
|
||||
}
|
||||
foreach ($array as $key=>$value) {
|
||||
echo '<tr>';
|
||||
if ( !is_numeric($key) ) {
|
||||
$key=ucwords(str_replace('_',' ',$key));
|
||||
echo '<td class="e">',$key,'</td>';
|
||||
if ( is_numeric($value) ) {
|
||||
if ( $value>1048576) { $value=round($value/1048576,1).'M'; }
|
||||
elseif ( is_float($value) ) { $value=round($value,1); }
|
||||
}
|
||||
}
|
||||
if ( is_array($value) ) {
|
||||
foreach ($value as $column) {
|
||||
echo '<td class="v">',$column,'</td>';
|
||||
}
|
||||
echo '</tr>';
|
||||
}
|
||||
else { echo '<td class="v">',$value,'</td></tr>'; }
|
||||
}
|
||||
echo '</table>';
|
||||
}
|
||||
|
||||
function files_display() {
|
||||
$status=call_user_func(CACHEPREFIX.'get_status');
|
||||
if ( empty($status['scripts']) ) {return;}
|
||||
if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;}
|
||||
$time=time(); $sort=0;
|
||||
$nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
|
||||
$nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
|
||||
$group=empty($_GET['GROUP'])?0:intval($_GET['GROUP']); if ( $group<0 || $group>9) { $group=1;}
|
||||
$groupset=array_fill(0,9,''); $groupset[$group]=' class="b" ';
|
||||
|
||||
echo '<div class="meta">
|
||||
<a ',$groupset[0],'href="',$nogroup,'">ungroup</a> |
|
||||
<a ',$groupset[1],'href="',$nogroup,'&GROUP=1">1</a> |
|
||||
<a ',$groupset[2],'href="',$nogroup,'&GROUP=2">2</a> |
|
||||
<a ',$groupset[3],'href="',$nogroup,'&GROUP=3">3</a> |
|
||||
<a ',$groupset[4],'href="',$nogroup,'&GROUP=4">4</a> |
|
||||
<a ',$groupset[5],'href="',$nogroup,'&GROUP=5">5</a>
|
||||
</div>';
|
||||
|
||||
if ( !$group ) { $files =& $status['scripts']; }
|
||||
else {
|
||||
$files=array();
|
||||
foreach ($status['scripts'] as $data) {
|
||||
if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) {
|
||||
if ( empty($files[$path[0]])) { $files[$path[0]]=array('full_path'=>'','files'=>0,'hits'=>0,'memory_consumption'=>0,'last_used_timestamp'=>'','timestamp'=>''); }
|
||||
$files[$path[0]]['full_path']=$path[0];
|
||||
$files[$path[0]]['files']++;
|
||||
$files[$path[0]]['memory_consumption']+=$data['memory_consumption'];
|
||||
$files[$path[0]]['hits']+=$data['hits'];
|
||||
if ( $data['last_used_timestamp']>$files[$path[0]]['last_used_timestamp']) {$files[$path[0]]['last_used_timestamp']=$data['last_used_timestamp'];}
|
||||
if ( $data['timestamp']>$files[$path[0]]['timestamp']) {$files[$path[0]]['timestamp']=$data['timestamp'];}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !empty($_GET['SORT']) ) {
|
||||
$keys=array(
|
||||
'full_path'=>SORT_STRING,
|
||||
'files'=>SORT_NUMERIC,
|
||||
'memory_consumption'=>SORT_NUMERIC,
|
||||
'hits'=>SORT_NUMERIC,
|
||||
'last_used_timestamp'=>SORT_NUMERIC,
|
||||
'timestamp'=>SORT_NUMERIC
|
||||
);
|
||||
$titles=array('','path',$group?'files':'','size','hits','last used','created');
|
||||
$offsets=array_keys($keys);
|
||||
$key=intval($_GET['SORT']);
|
||||
$direction=$key>0?1:-1;
|
||||
$key=abs($key)-1;
|
||||
$key=isset($offsets[$key])&&!($key==1&&empty($group))?$offsets[$key]:reset($offsets);
|
||||
$sort=array_search($key,$offsets)+1;
|
||||
$sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
|
||||
if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
|
||||
$arrow=array_fill(0,7,''); $arrow[$sort]=$direction>0?' ▼':' ▲';
|
||||
$direction=$direction>0?SORT_DESC:SORT_ASC;
|
||||
$column=array(); foreach ($files as $data) { $column[]=$data[$key]; }
|
||||
array_multisort($column, $keys[$key], $direction, $files);
|
||||
}
|
||||
|
||||
echo '<table border="0" cellpadding="3" width="960" id="files">
|
||||
<tr class="h">';
|
||||
foreach ($titles as $column=>$title) {
|
||||
if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>';
|
||||
}
|
||||
echo ' </tr>';
|
||||
foreach ($files as $data) {
|
||||
echo '<tr>
|
||||
<td class="v" nowrap><a title="recheck" href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>',
|
||||
($group?'<td class="vr">'.number_format($data['files']).'</td>':''),
|
||||
'<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>',
|
||||
'<td class="vr">',number_format($data['hits']),'</td>',
|
||||
'<td class="vr">',time_since($time,$data['last_used_timestamp']),'</td>',
|
||||
'<td class="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td>
|
||||
</tr>';
|
||||
}
|
||||
echo '</table>';
|
||||
}
|
||||
|
||||
function graphs_display() {
|
||||
$graphs=array();
|
||||
$colors=array('green','brown','red');
|
||||
$primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
|
||||
$configuration=call_user_func(CACHEPREFIX.'get_configuration');
|
||||
$status=call_user_func(CACHEPREFIX.'get_status');
|
||||
|
||||
$graphs['memory']['total']=$configuration['directives']['opcache.memory_consumption'];
|
||||
$graphs['memory']['free']=$status['memory_usage']['free_memory'];
|
||||
$graphs['memory']['used']=$status['memory_usage']['used_memory'];
|
||||
$graphs['memory']['wasted']=$status['memory_usage']['wasted_memory'];
|
||||
|
||||
$graphs['keys']['total']=$status[CACHEPREFIX.'statistics']['max_cached_keys'];
|
||||
foreach ($primes as $prime) { if ($prime>=$graphs['keys']['total']) { $graphs['keys']['total']=$prime; break;} }
|
||||
$graphs['keys']['free']=$graphs['keys']['total']-$status[CACHEPREFIX.'statistics']['num_cached_keys'];
|
||||
$graphs['keys']['scripts']=$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
|
||||
$graphs['keys']['wasted']=$status[CACHEPREFIX.'statistics']['num_cached_keys']-$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
|
||||
|
||||
$graphs['hits']['total']=0;
|
||||
$graphs['hits']['hits']=$status[CACHEPREFIX.'statistics']['hits'];
|
||||
$graphs['hits']['misses']=$status[CACHEPREFIX.'statistics']['misses'];
|
||||
$graphs['hits']['blacklist']=$status[CACHEPREFIX.'statistics']['blacklist_misses'];
|
||||
$graphs['hits']['total']=array_sum($graphs['hits']);
|
||||
|
||||
$graphs['restarts']['total']=0;
|
||||
$graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts'];
|
||||
$graphs['restarts']['keys']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
|
||||
$graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts'];
|
||||
$graphs['restarts']['total']=array_sum($graphs['restarts']);
|
||||
|
||||
foreach ( $graphs as $caption=>$graph) {
|
||||
echo '<div class="graph"><div class="h">',$caption,'</div><table border="0" cellpadding="0" cellspacing="0">';
|
||||
foreach ($graph as $label=>$value) {
|
||||
if ($label=='total') { $key=0; $total=$value; $totaldisplay='<td rowspan="3" class="total"><span>'.($total>999999?round($total/1024/1024).'M':($total>9999?round($total/1024).'K':$total)).'</span><div></div></td>'; continue;}
|
||||
$percent=$total?floor($value*100/$total):''; $percent=!$percent||$percent>99?'':$percent.'%';
|
||||
echo '<tr>',$totaldisplay,'<td class="actual">', ($value>999999?round($value/1024/1024).'M':($value>9999?round($value/1024).'K':$value)),'</td><td class="bar ',$colors[$key],'" height="',$percent,'">',$percent,'</td><td>',$label,'</td></tr>';
|
||||
$key++; $totaldisplay='';
|
||||
}
|
||||
echo '</table></div>',"\n";
|
||||
}
|
||||
}
|
||||
|
||||
function meta_display() {
|
||||
?>
|
||||
<div class="meta">
|
||||
<a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
|
||||
<a href="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functions guide</a> |
|
||||
<a href="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a> |
|
||||
<a href="http://pecl.php.net/package/ZendOpcache">pecl</a> |
|
||||
<a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> |
|
||||
<a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
|
||||
</div>
|
||||
<?php
|
||||
}
|
26
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Config/Memcache.php
vendored
Normal file
26
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Config/Memcache.php
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
|
||||
return array (
|
||||
'stats_api' => 'Server',
|
||||
'slabs_api' => 'Server',
|
||||
'items_api' => 'Server',
|
||||
'get_api' => 'Server',
|
||||
'set_api' => 'Server',
|
||||
'delete_api' => 'Server',
|
||||
'flush_all_api' => 'Server',
|
||||
'connection_timeout' => 1,
|
||||
'max_item_dump'=> 100,
|
||||
'refresh_rate' => 2,
|
||||
'memory_alert' => 80,
|
||||
'hit_rate_alert' => 90,
|
||||
'eviction_alert' => 0,
|
||||
'file_path' => '/tmp',
|
||||
'servers' => array (
|
||||
'Devilbox Memcached' => array (
|
||||
'memcd' => array (
|
||||
'hostname' => 'memcd',
|
||||
'port' => '11211',
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
30
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Bootstrap.php
vendored
Normal file
30
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Bootstrap.php
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
# Headers
|
||||
header('Content-type: text/html;');
|
||||
header('Cache-Control: no-cache, must-revalidate');
|
||||
|
||||
# Constants declaration
|
||||
define('CURRENT_VERSION', '1.3.0');
|
||||
|
||||
# PHP < 5.3 Compatibility
|
||||
if (defined('ENT_IGNORE') === false) {
|
||||
define('ENT_IGNORE', 0);
|
||||
}
|
||||
|
||||
# XSS / User input check
|
||||
foreach ($_REQUEST as $index => $data) {
|
||||
$_REQUEST[$index] = htmlentities($data);
|
||||
}
|
||||
|
||||
# Autoloader
|
||||
function autoloader($class)
|
||||
{
|
||||
require_once str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
|
||||
}
|
||||
spl_autoload_register('autoloader');
|
||||
|
||||
# Loading ini file
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Date timezone
|
||||
date_default_timezone_set('Europe/Paris');
|
110
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Factory.php
vendored
Normal file
110
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Factory.php
vendored
Normal file
@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Factory for communication with Memcache Server
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 30/03/2010
|
||||
*/
|
||||
class Library_Command_Factory
|
||||
{
|
||||
private static $_object = array();
|
||||
|
||||
# No explicit call of constructor
|
||||
private function __construct()
|
||||
{}
|
||||
|
||||
# No explicit call of clone()
|
||||
private function __clone()
|
||||
{}
|
||||
|
||||
/**
|
||||
* Accessor to command class instance by command type
|
||||
*
|
||||
* @param String $command Type of command
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function instance($command)
|
||||
{
|
||||
# Importing configuration
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Instance does not exists
|
||||
if (! isset(self::$_object[$_ini->get($command)]) || ($_ini->get($command) != 'Server')) {
|
||||
# Switching by API
|
||||
switch ($_ini->get($command)) {
|
||||
case 'Memcache' :
|
||||
# PECL Memcache API
|
||||
require_once 'Memcache.php';
|
||||
self::$_object['Memcache'] = new Library_Command_Memcache();
|
||||
break;
|
||||
|
||||
case 'Memcached' :
|
||||
# PECL Memcached API
|
||||
require_once 'Memcached.php';
|
||||
self::$_object['Memcached'] = new Library_Command_Memcached();
|
||||
break;
|
||||
|
||||
case 'Server' :
|
||||
default :
|
||||
# Server API (eg communicating directly with the memcache server)
|
||||
require_once 'Server.php';
|
||||
self::$_object['Server'] = new Library_Command_Server();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return self::$_object[$_ini->get($command)];
|
||||
}
|
||||
|
||||
/**
|
||||
* Accessor to command class instance by type
|
||||
*
|
||||
* @param String $command Type of command
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function api($api)
|
||||
{
|
||||
# Instance does not exists
|
||||
if (! isset(self::$_object[$api]) || ($api != 'Server')) {
|
||||
# Switching by API
|
||||
switch ($api) {
|
||||
case 'Memcache' :
|
||||
# PECL Memcache API
|
||||
require_once 'Memcache.php';
|
||||
self::$_object['Memcache'] = new Library_Command_Memcache();
|
||||
break;
|
||||
|
||||
case 'Memcached' :
|
||||
# PECL Memcached API
|
||||
require_once 'Memcached.php';
|
||||
self::$_object['Memcached'] = new Library_Command_Memcached();
|
||||
break;
|
||||
|
||||
case 'Server' :
|
||||
default :
|
||||
# Server API (eg communicating directly with the memcache server)
|
||||
require_once 'Server.php';
|
||||
self::$_object['Server'] = new Library_Command_Server();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return self::$_object[$api];
|
||||
}
|
||||
}
|
178
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Interface.php
vendored
Normal file
178
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Interface.php
vendored
Normal file
@ -0,0 +1,178 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Interface of communication to MemCache Server
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
interface Library_Command_Interface
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __construct();
|
||||
|
||||
/**
|
||||
* Send stats command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
function stats($server, $port);
|
||||
|
||||
/**
|
||||
* Send stats settings command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function settings($server, $port);
|
||||
|
||||
/**
|
||||
* Retrieve slabs stats
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
function slabs($server, $port);
|
||||
|
||||
/**
|
||||
* Retrieve items from a slabs
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $slab Slab ID
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
function items($server, $port, $slab);
|
||||
|
||||
/**
|
||||
* Send get command to server to retrieve an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to retrieve
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function get($server, $port, $key);
|
||||
|
||||
/**
|
||||
* Set an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to store
|
||||
* @param Mixed $data Data to store
|
||||
* @param Integer $duration Duration
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function set($server, $port, $key, $data, $duration);
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to delete
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function delete($server, $port, $key);
|
||||
|
||||
/**
|
||||
* Increment the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to increment
|
||||
* @param Integer $value Value to increment
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function increment($server, $port, $key, $value);
|
||||
|
||||
/**
|
||||
* Decrement the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to decrement
|
||||
* @param Integer $value Value to decrement
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function decrement($server, $port, $key, $value);
|
||||
|
||||
/**
|
||||
* Flush all items on a server after delay
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $delay Delay before flushing server
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function flush_all($server, $port, $delay);
|
||||
|
||||
/**
|
||||
* Search for item
|
||||
* Return all the items matching parameters if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to search
|
||||
* @param Boolean $level Level of detail
|
||||
* @param Boolean $more More action
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function search($server, $port, $search, $level = false, $more = false);
|
||||
|
||||
/**
|
||||
* Execute a telnet command on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $command Command to execute
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function telnet($server, $port, $command);
|
||||
}
|
309
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Memcache.php
vendored
Normal file
309
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Memcache.php
vendored
Normal file
@ -0,0 +1,309 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Sending command to memcache server via PECL memcache API http://pecl.php.net/package/memcache
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
class Library_Command_Memcache implements Library_Command_Interface
|
||||
{
|
||||
private static $_ini;
|
||||
private static $_memcache;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Array $ini Array from ini_parse
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
# Importing configuration
|
||||
self::$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Initializing
|
||||
self::$_memcache = new Memcache();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function stats($server, $port)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command
|
||||
if (($return = self::$_memcache->getExtendedStats())) {
|
||||
# Delete server key based
|
||||
$stats = $return[$server . ':' . $port];
|
||||
return $stats;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats settings command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function settings($server, $port)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats items command to server to retrieve slabs stats
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function slabs($server, $port)
|
||||
{
|
||||
# Initializing
|
||||
$slabs = array();
|
||||
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : slabs
|
||||
if (($slabs = self::$_memcache->getStats('slabs'))) {
|
||||
# Finding uptime
|
||||
$stats = $this->stats($server, $port);
|
||||
$slabs['uptime'] = $stats['uptime'];
|
||||
unset($stats);
|
||||
|
||||
# Executing command : items
|
||||
if (($result = self::$_memcache->getStats('items'))) {
|
||||
# Indexing by slabs
|
||||
foreach ($result['items'] as $id => $items) {
|
||||
foreach ($items as $key => $value) {
|
||||
$slabs[$id]['items:' . $key] = $value;
|
||||
}
|
||||
}
|
||||
return $slabs;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats cachedump command to server to retrieve slabs items
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Interger $slab Slab ID
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function items($server, $port, $slab)
|
||||
{
|
||||
# Initializing
|
||||
$items = false;
|
||||
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : slabs stats
|
||||
if (($items = self::$_memcache->getStats('cachedump', $slab, self::$_ini->get('max_item_dump')))) {
|
||||
return $items;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send get command to server to retrieve an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to retrieve
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function get($server, $port, $key)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : get
|
||||
if ($item = self::$_memcache->get($key)) {
|
||||
return print_r($item, true);
|
||||
}
|
||||
return 'NOT_FOUND';
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to store
|
||||
* @param Mixed $data Data to store
|
||||
* @param Integer $duration Duration
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function set($server, $port, $key, $data, $duration)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : set
|
||||
if (self::$_memcache->set($key, $data, 0, $duration)) {
|
||||
return 'STORED';
|
||||
}
|
||||
return 'ERROR';
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to delete
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function delete($server, $port, $key)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : delete
|
||||
if (self::$_memcache->delete($key)) {
|
||||
return 'DELETED';
|
||||
}
|
||||
return 'NOT_FOUND';
|
||||
}
|
||||
|
||||
/**
|
||||
* Increment the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to increment
|
||||
* @param Integer $value Value to increment
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function increment($server, $port, $key, $value)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : increment
|
||||
if ($result = self::$_memcache->increment($key, $value)) {
|
||||
return $result;
|
||||
}
|
||||
return 'NOT_FOUND';
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrement the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to decrement
|
||||
* @param Integer $value Value to decrement
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function decrement($server, $port, $key, $value)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : decrement
|
||||
if ($result = self::$_memcache->decrement($key, $value)) {
|
||||
return $result;
|
||||
}
|
||||
return 'NOT_FOUND';
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush all items on a server
|
||||
* Warning, delay won't work with Memcache API
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $delay Delay before flushing server
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function flush_all($server, $port, $delay)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : flush_all
|
||||
self::$_memcache->flush();
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for item
|
||||
* Return all the items matching parameters if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to search
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function search($server, $port, $search, $level = false, $more = false)
|
||||
{
|
||||
throw new Exception('PECL Memcache does not support search function, use Server instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a telnet command on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $command Command to execute
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function telnet($server, $port, $command)
|
||||
{
|
||||
throw new Exception('PECL Memcache does not support telnet, use Server instead');
|
||||
}
|
||||
}
|
287
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Memcached.php
vendored
Normal file
287
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Memcached.php
vendored
Normal file
@ -0,0 +1,287 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Sending command to memcache server via PECL memcache API http://pecl.php.net/package/memcache
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
class Library_Command_Memcached implements Library_Command_Interface
|
||||
{
|
||||
private static $_ini;
|
||||
private static $_memcache;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Array $ini Array from ini_parse
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
# Importing configuration
|
||||
self::$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Initializing
|
||||
self::$_memcache = new Memcached();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function stats($server, $port)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command
|
||||
if (($return = self::$_memcache->getStats())) {
|
||||
# Delete server key based
|
||||
$stats = $return[$server . ':' . $port];
|
||||
|
||||
# Adding value that miss
|
||||
$stats['delete_hits'] = '';
|
||||
$stats['delete_misses'] = '';
|
||||
$stats['incr_hits'] = '';
|
||||
$stats['incr_misses'] = '';
|
||||
$stats['decr_hits'] = '';
|
||||
$stats['decr_misses'] = '';
|
||||
$stats['cas_hits'] = '';
|
||||
$stats['cas_misses'] = '';
|
||||
$stats['cas_badval'] = '';
|
||||
|
||||
return $stats;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats settings command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function settings($server, $port)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats items command to server to retrieve slabs stats
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function slabs($server, $port)
|
||||
{
|
||||
throw new Exception('PECL Memcache does not support slabs stats, use Server or Memcache instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats cachedump command to server to retrieve slabs items
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Interger $slab Slab ID
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function items($server, $port, $slab)
|
||||
{
|
||||
throw new Exception('PECL Memcache does not support slabs items stats, use Server or Memcache instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Send get command to server to retrieve an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to retrieve
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function get($server, $port, $key)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : get
|
||||
if ($item = self::$_memcache->get($key)) {
|
||||
return print_r($item, true);
|
||||
}
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to store
|
||||
* @param Mixed $data Data to store
|
||||
* @param Integer $duration Duration
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function set($server, $port, $key, $data, $duration)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Checking duration
|
||||
if ($duration == '') {
|
||||
$duration = 0;
|
||||
}
|
||||
|
||||
# Executing command : set
|
||||
self::$_memcache->set($key, $data, $duration);
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to delete
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function delete($server, $port, $key)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : delete
|
||||
self::$_memcache->delete($key);
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Increment the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to increment
|
||||
* @param Integer $value Value to increment
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function increment($server, $port, $key, $value)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : increment
|
||||
if ($result = self::$_memcache->increment($key, $value)) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrement the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to decrement
|
||||
* @param Integer $value Value to decrement
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function decrement($server, $port, $key, $value)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : decrement
|
||||
if ($result = self::$_memcache->decrement($key, $value)) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush all items on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $delay Delay before flushing server
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function flush_all($server, $port, $delay)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : delete
|
||||
self::$_memcache->flush($delay);
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for item
|
||||
* Return all the items matching parameters if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to search
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
function search($server, $port, $search, $level = false, $more = false)
|
||||
{
|
||||
throw new Exception('PECL Memcached does not support search function, use Server instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a telnet command on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $command Command to execute
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function telnet($server, $port, $command)
|
||||
{
|
||||
throw new Exception('PECL Memcached does not support telnet, use Server instead');
|
||||
}
|
||||
}
|
486
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Server.php
vendored
Normal file
486
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Server.php
vendored
Normal file
@ -0,0 +1,486 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Sending command to memcache server
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
class Library_Command_Server implements Library_Command_Interface
|
||||
{
|
||||
private static $_ini;
|
||||
private static $_log;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Array $ini Array from ini_parse
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
# Importing configuration
|
||||
self::$_ini = Library_Configuration_Loader::singleton();
|
||||
}
|
||||
|
||||
/**
|
||||
* Executing a Command on a MemCache Server
|
||||
* With the help of http://github.com/memcached/memcached/blob/master/doc/protocol.txt
|
||||
* Return the response, or false otherwise
|
||||
*
|
||||
* @param String $command Command
|
||||
* @param String $server Server Hostname
|
||||
* @param Integer $port Server Port
|
||||
*
|
||||
* @return String|Boolean
|
||||
*/
|
||||
public function exec($command, $server, $port)
|
||||
{
|
||||
# Variables
|
||||
$buffer = '';
|
||||
$handle = null;
|
||||
|
||||
# Socket Opening
|
||||
if (! ($handle = @fsockopen($server, $port, $errno, $errstr, self::$_ini->get('connection_timeout')))) {
|
||||
# Adding error to log
|
||||
self::$_log = utf8_encode($errstr);
|
||||
Library_Data_Error::add(utf8_encode($errstr));
|
||||
return false;
|
||||
}
|
||||
|
||||
# Sending Command ...
|
||||
fwrite($handle, $command . "\r\n");
|
||||
|
||||
# Getting first line
|
||||
$buffer = fgets($handle);
|
||||
|
||||
# Checking if result is valid
|
||||
if ($this->end($buffer, $command)) {
|
||||
# Closing socket
|
||||
fclose($handle);
|
||||
|
||||
# Adding error to log
|
||||
self::$_log = $buffer;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
# Reading Results
|
||||
while ((! feof($handle))) {
|
||||
# Getting line
|
||||
$line = fgets($handle);
|
||||
|
||||
$buffer .= $line;
|
||||
|
||||
# Checking for end of MemCache command
|
||||
if ($this->end($line, $command)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
# Closing socket
|
||||
fclose($handle);
|
||||
|
||||
return $buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if response is at the end from memcached server
|
||||
* Return true if response end, true otherwise
|
||||
*
|
||||
* @param String $buffer Buffer received from memcached server
|
||||
* @param String $command Command issued to memcached server
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
private function end($buffer, $command)
|
||||
{
|
||||
# incr or decr also return integer
|
||||
if ((preg_match('/^(incr|decr)/', $command))) {
|
||||
if (preg_match('/^(END|ERROR|SERVER_ERROR|CLIENT_ERROR|NOT_FOUND|[0-9]*)/', $buffer)) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
# Checking command response end
|
||||
if (preg_match('/^(END|DELETED|OK|ERROR|SERVER_ERROR|CLIENT_ERROR|NOT_FOUND|STORED|RESET|TOUCHED)/', $buffer)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse result to make an array
|
||||
*
|
||||
* @param String $string String to parse
|
||||
* @param Boolean $string (optionnal) Parsing stats ?
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public function parse($string, $stats = true)
|
||||
{
|
||||
# Variable
|
||||
$return = array();
|
||||
|
||||
# Exploding by \r\n
|
||||
$lines = preg_split('/\r\n/', $string);
|
||||
|
||||
# Stats
|
||||
if ($stats) {
|
||||
# Browsing each line
|
||||
foreach ($lines as $line) {
|
||||
$data = preg_split('/ /', $line);
|
||||
if (isset($data[2])) {
|
||||
$return[$data[1]] = $data[2];
|
||||
}
|
||||
}
|
||||
} # Items
|
||||
else {
|
||||
# Browsing each line
|
||||
foreach ($lines as $line) {
|
||||
$data = preg_split('/ /', $line);
|
||||
if (isset($data[1])) {
|
||||
$return[$data[1]] = array(substr($data[2], 1), $data[4]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function stats($server, $port)
|
||||
{
|
||||
# Executing command
|
||||
if (($return = $this->exec('stats', $server, $port))) {
|
||||
return $this->parse($return);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats settings command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function settings($server, $port)
|
||||
{
|
||||
# Executing command
|
||||
if (($return = $this->exec('stats settings', $server, $port))) {
|
||||
return $this->parse($return);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats items command to server to retrieve slabs stats
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function slabs($server, $port)
|
||||
{
|
||||
# Initializing
|
||||
$slabs = array();
|
||||
|
||||
# Finding uptime
|
||||
$stats = $this->stats($server, $port);
|
||||
$slabs['uptime'] = $stats['uptime'];
|
||||
unset($stats);
|
||||
|
||||
# Executing command : slabs stats
|
||||
if (($result = $this->exec('stats slabs', $server, $port))) {
|
||||
# Parsing result
|
||||
$result = $this->parse($result);
|
||||
$slabs['active_slabs'] = $result['active_slabs'];
|
||||
$slabs['total_malloced'] = $result['total_malloced'];
|
||||
unset($result['active_slabs']);
|
||||
unset($result['total_malloced']);
|
||||
|
||||
# Indexing by slabs
|
||||
foreach ($result as $key => $value) {
|
||||
$key = preg_split('/:/', $key);
|
||||
$slabs[$key[0]][$key[1]] = $value;
|
||||
}
|
||||
|
||||
# Executing command : items stats
|
||||
if (($result = $this->exec('stats items', $server, $port))) {
|
||||
# Parsing result
|
||||
$result = $this->parse($result);
|
||||
|
||||
# Indexing by slabs
|
||||
foreach ($result as $key => $value) {
|
||||
$key = preg_split('/:/', $key);
|
||||
$slabs[$key[1]]['items:' . $key[2]] = $value;
|
||||
}
|
||||
|
||||
return $slabs;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats cachedump command to server to retrieve slabs items
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Interger $slab Slab ID
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function items($server, $port, $slab)
|
||||
{
|
||||
# Initializing
|
||||
$items = false;
|
||||
|
||||
# Executing command : stats cachedump
|
||||
if (($result = $this->exec('stats cachedump ' . $slab . ' ' . self::$_ini->get('max_item_dump'), $server, $port))) {
|
||||
# Parsing result
|
||||
$items = $this->parse($result, false);
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send get command to server to retrieve an item
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to retrieve
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function get($server, $port, $key)
|
||||
{
|
||||
# Executing command : get
|
||||
if (($string = $this->exec('get ' . $key, $server, $port))) {
|
||||
$string = preg_replace('/^VALUE ' . preg_quote($key, '/') . '[0-9 ]*\r\n/', '', $string);
|
||||
if (ord($string[0]) == 0x78 && in_array(ord($string[1]), array(0x01, 0x5e, 0x9c, 0xda))) {
|
||||
return gzuncompress($string);
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to store
|
||||
* @param Mixed $data Data to store
|
||||
* @param Integer $duration Duration
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function set($server, $port, $key, $data, $duration)
|
||||
{
|
||||
# Formatting data
|
||||
$data = preg_replace('/\r/', '', $data);
|
||||
|
||||
# Executing command : set
|
||||
if (($result = $this->exec('set ' . $key . ' 0 ' . $duration . ' ' . strlen($data) . "\r\n" . $data, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* Return true if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to delete
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function delete($server, $port, $key)
|
||||
{
|
||||
# Executing command : delete
|
||||
if (($result = $this->exec('delete ' . $key, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Increment the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to increment
|
||||
* @param Integer $value Value to increment
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function increment($server, $port, $key, $value)
|
||||
{
|
||||
# Executing command : increment
|
||||
if (($result = $this->exec('incr ' . $key . ' ' . $value, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrement the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to decrement
|
||||
* @param Integer $value Value to decrement
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function decrement($server, $port, $key, $value)
|
||||
{
|
||||
# Executing command : decrement
|
||||
if (($result = $this->exec('decr ' . $key . ' ' . $value, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush all items on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $delay Delay before flushing server
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function flush_all($server, $port, $delay)
|
||||
{
|
||||
# Executing command : flush_all
|
||||
if (($result = $this->exec('flush_all ' . $delay, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for item
|
||||
* Return all the items matching parameters if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to search
|
||||
* @param String $level Level of Detail
|
||||
* @param String $more More action
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function search($server, $port, $search, $level = false, $more = false)
|
||||
{
|
||||
$slabs = array();
|
||||
$items = false;
|
||||
|
||||
# Executing command : stats
|
||||
if (($level == 'full') && ($result = $this->exec('stats', $server, $port))) {
|
||||
# Parsing result
|
||||
$result = $this->parse($result);
|
||||
$infinite = (isset($result['time'], $result['uptime'])) ? ($result['time'] - $result['uptime']) : 0;
|
||||
}
|
||||
|
||||
# Executing command : slabs stats
|
||||
if (($result = $this->exec('stats slabs', $server, $port))) {
|
||||
# Parsing result
|
||||
$result = $this->parse($result);
|
||||
unset($result['active_slabs']);
|
||||
unset($result['total_malloced']);
|
||||
# Indexing by slabs
|
||||
foreach ($result as $key => $value) {
|
||||
$key = preg_split('/:/', $key);
|
||||
$slabs[$key[0]] = true;
|
||||
}
|
||||
}
|
||||
|
||||
# Exploring each slabs
|
||||
foreach ($slabs as $slab => $unused) {
|
||||
# Executing command : stats cachedump
|
||||
if (($result = $this->exec('stats cachedump ' . $slab . ' 0', $server, $port))) {
|
||||
# Parsing result
|
||||
preg_match_all('/^ITEM ((?:.*)' . preg_quote($search, '/') . '(?:.*)) \[([0-9]*) b; ([0-9]*) s\]\r\n/imU', $result, $matchs, PREG_SET_ORDER);
|
||||
foreach ($matchs as $item) {
|
||||
# Search & Delete
|
||||
if ($more == 'delete') {
|
||||
$items[] = $item[1] . ' : ' . $this->delete($server, $port, $item[1]);
|
||||
# Basic search
|
||||
} else {
|
||||
# Detail level
|
||||
if ($level == 'full') {
|
||||
$items[] = $item[1] . ' : [' . trim(Library_Data_Analysis::byteResize($item[2])) . 'b, expire in ' . (($item[3] == $infinite) ? '∞' : Library_Data_Analysis::uptime($item[3] - time(), true)) . ']';
|
||||
} else {
|
||||
$items[] = $item[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
unset($slabs[$slab]);
|
||||
}
|
||||
|
||||
if (is_array($items)) {
|
||||
sort($items);
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a telnet command on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $command Command to execute
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function telnet($server, $port, $command)
|
||||
{
|
||||
# Executing command
|
||||
if (($result = $this->exec($command, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
}
|
186
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Configuration/Loader.php
vendored
Normal file
186
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Configuration/Loader.php
vendored
Normal file
@ -0,0 +1,186 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Configuration class for editing, saving, ...
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 19/05/2010
|
||||
*/
|
||||
class Library_Configuration_Loader
|
||||
{
|
||||
# Singleton
|
||||
protected static $_instance = null;
|
||||
|
||||
# Configuration file
|
||||
protected static $_iniPath = './Config/Memcache.php';
|
||||
|
||||
# Configuration needed keys and default values
|
||||
protected static $_iniKeys = array('stats_api' => 'Server',
|
||||
'slabs_api' => 'Server',
|
||||
'items_api' => 'Server',
|
||||
'get_api' => 'Server',
|
||||
'set_api' => 'Server',
|
||||
'delete_api' => 'Server',
|
||||
'flush_all_api' => 'Server',
|
||||
'connection_timeout' => 1,
|
||||
'max_item_dump' => 100,
|
||||
'refresh_rate' => 2,
|
||||
'memory_alert' => 80,
|
||||
'hit_rate_alert' => 90,
|
||||
'eviction_alert' => 0,
|
||||
'file_path' => 'Temp/',
|
||||
'servers' => array('Default' => array('127.0.0.1:11211' => array('hostname' => '127.0.0.1', 'port' => 11211))));
|
||||
|
||||
# Storage
|
||||
protected static $_ini = array();
|
||||
|
||||
/**
|
||||
* Constructor, load configuration file and parse server list
|
||||
*
|
||||
* @return Void
|
||||
*/
|
||||
protected function __construct()
|
||||
{
|
||||
# Checking ini File
|
||||
if (file_exists(self::$_iniPath)) {
|
||||
# Opening ini file
|
||||
self::$_ini = require self::$_iniPath;
|
||||
} else {
|
||||
# Fallback
|
||||
self::$_ini = self::$_iniKeys;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Library_Configuration_Loader singleton
|
||||
*
|
||||
* @return Library_Configuration_Loader
|
||||
*/
|
||||
public static function singleton()
|
||||
{
|
||||
if (! isset(self::$_instance)) {
|
||||
self::$_instance = new self();
|
||||
}
|
||||
return self::$_instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Config key to retrieve
|
||||
* Return the value, or false if does not exists
|
||||
*
|
||||
* @param String $key Key to get
|
||||
*
|
||||
* @return Mixed
|
||||
*/
|
||||
public function get($key)
|
||||
{
|
||||
if (isset(self::$_ini[$key])) {
|
||||
return self::$_ini[$key];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Servers to retrieve from cluster
|
||||
* Return the value, or false if does not exists
|
||||
*
|
||||
* @param String $cluster Cluster to retreive
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public function cluster($cluster)
|
||||
{
|
||||
if (isset(self::$_ini['servers'][$cluster])) {
|
||||
return self::$_ini['servers'][$cluster];
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check and return server data
|
||||
* Return the value, or false if does not exists
|
||||
*
|
||||
* @param String $server Server to retreive
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public function server($server)
|
||||
{
|
||||
foreach (self::$_ini['servers'] as $cluster => $servers) {
|
||||
if (isset(self::$_ini['servers'][$cluster][$server])) {
|
||||
return self::$_ini['servers'][$cluster][$server];
|
||||
}
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Config key to set
|
||||
*
|
||||
* @param String $key Key to set
|
||||
* @param Mixed $value Value to set
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public function set($key, $value)
|
||||
{
|
||||
self::$_ini[$key] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return actual ini file path
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function path()
|
||||
{
|
||||
return self::$_iniPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if every ini keys are set
|
||||
* Return true if ini is correct, false otherwise
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public function check()
|
||||
{
|
||||
# Checking configuration keys
|
||||
foreach (array_keys(self::$_iniKeys) as $iniKey) {
|
||||
# Ini file key not set
|
||||
if (isset(self::$_ini[$iniKey]) === false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write ini file
|
||||
* Return true if written, false otherwise
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public function write()
|
||||
{
|
||||
if ($this->check()) {
|
||||
return is_numeric(file_put_contents(self::$_iniPath, '<?php' . PHP_EOL . 'return ' . var_export(self::$_ini, true) . ';'));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
327
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Analysis.php
vendored
Normal file
327
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Analysis.php
vendored
Normal file
@ -0,0 +1,327 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Analysis of memcached command response
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
class Library_Data_Analysis
|
||||
{
|
||||
private static $_non_additive = array(
|
||||
'libevent',
|
||||
'pid',
|
||||
'pointer_size',
|
||||
'time',
|
||||
'uptime',
|
||||
'version',
|
||||
);
|
||||
|
||||
/**
|
||||
* Merge two arrays of stats from Command_XX::stats()
|
||||
*
|
||||
* @param Array $array Statistic from Command_XX::stats()
|
||||
* @param Array $stats Statistic from Command_XX::stats()
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function merge($array, $stats)
|
||||
{
|
||||
# Checking input
|
||||
if (! is_array($array)) {
|
||||
return $stats;
|
||||
} elseif (! is_array($stats)) {
|
||||
return $array;
|
||||
}
|
||||
|
||||
# Merging Stats
|
||||
foreach ($stats as $key => $value) {
|
||||
if (! isset($array[$key]) || in_array($key, self::$_non_additive)) {
|
||||
$array[$key] = $value;
|
||||
} else {
|
||||
$array[$key] += $value;
|
||||
}
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Diff two arrays of stats from Command_XX::stats()
|
||||
*
|
||||
* @param Array $array Statistic from Command_XX::stats()
|
||||
* @param Array $stats Statistic from Command_XX::stats()
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function diff($array, $stats)
|
||||
{
|
||||
# Checking input
|
||||
if (! is_array($array)) {
|
||||
return $stats;
|
||||
} elseif (! is_array($stats)) {
|
||||
return $array;
|
||||
}
|
||||
|
||||
# Diff for each key
|
||||
foreach ($stats as $key => $value) {
|
||||
if (isset($array[$key]) && ! in_array($key, self::$_non_additive)) {
|
||||
$stats[$key] = $value - $array[$key];
|
||||
}
|
||||
}
|
||||
|
||||
return $stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Analyse and return memcache stats command
|
||||
*
|
||||
* @param Array $stats Statistic from Command_XX::stats()
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function stats($stats)
|
||||
{
|
||||
if (! is_array($stats) || (count($stats) == 0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
# Command set()
|
||||
$stats['set_rate'] = ($stats['cmd_set'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_set'] / $stats['uptime'], 1);
|
||||
|
||||
# Command get()
|
||||
$stats['get_hits_percent'] = ($stats['cmd_get'] == 0) ? ' - ' : sprintf('%.1f', $stats['get_hits'] / $stats['cmd_get'] * 100, 1);
|
||||
$stats['get_misses_percent'] = ($stats['cmd_get'] == 0) ? ' - ' : sprintf('%.1f', $stats['get_misses'] / $stats['cmd_get'] * 100, 1);
|
||||
$stats['get_rate'] = ($stats['cmd_get'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_get'] / $stats['uptime'], 1);
|
||||
|
||||
# Command delete(), version > 1.2.X
|
||||
if (isset($stats['delete_hits'], $stats['delete_misses'])) {
|
||||
$stats['cmd_delete'] = $stats['delete_hits'] + $stats['delete_misses'];
|
||||
$stats['delete_hits_percent'] = ($stats['cmd_delete'] == 0) ? ' - ' : sprintf('%.1f', $stats['delete_hits'] / $stats['cmd_delete'] * 100, 1);
|
||||
$stats['delete_misses_percent'] = ($stats['cmd_delete'] == 0) ? ' - ' : sprintf('%.1f', $stats['delete_misses'] / $stats['cmd_delete'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_delete'] = 0;
|
||||
$stats['delete_hits_percent'] = ' - ';
|
||||
$stats['delete_misses_percent'] = ' - ';
|
||||
}
|
||||
$stats['delete_rate'] = ($stats['cmd_delete'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_delete'] / $stats['uptime'], 1);
|
||||
|
||||
# Command cas(), version > 1.2.X
|
||||
if (isset($stats['cas_hits'], $stats['cas_misses'], $stats['cas_badval'])) {
|
||||
$stats['cmd_cas'] = $stats['cas_hits'] + $stats['cas_misses'] + $stats['cas_badval'];
|
||||
$stats['cas_hits_percent'] = ($stats['cmd_cas'] == 0) ? ' - ' : sprintf('%.1f', $stats['cas_hits'] / $stats['cmd_cas'] * 100, 1);
|
||||
$stats['cas_misses_percent'] = ($stats['cmd_cas'] == 0) ? ' - ' : sprintf('%.1f', $stats['cas_misses'] / $stats['cmd_cas'] * 100, 1);
|
||||
$stats['cas_badval_percent'] = ($stats['cmd_cas'] == 0) ? ' - ' : sprintf('%.1f', $stats['cas_badval'] / $stats['cmd_cas'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_cas'] = 0;
|
||||
$stats['cas_hits_percent'] = ' - ';
|
||||
$stats['cas_misses_percent'] = ' - ';
|
||||
$stats['cas_badval_percent'] = ' - ';
|
||||
}
|
||||
$stats['cas_rate'] = ($stats['cmd_cas'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_cas'] / $stats['uptime'], 1);
|
||||
|
||||
# Command increment(), version > 1.2.X
|
||||
if (isset($stats['incr_hits'], $stats['incr_misses'])) {
|
||||
$stats['cmd_incr'] = $stats['incr_hits'] + $stats['incr_misses'];
|
||||
$stats['incr_hits_percent'] = ($stats['cmd_incr'] == 0) ? ' - ' : sprintf('%.1f', $stats['incr_hits'] / $stats['cmd_incr'] * 100, 1);
|
||||
$stats['incr_misses_percent'] = ($stats['cmd_incr'] == 0) ? ' - ' : sprintf('%.1f', $stats['incr_misses'] / $stats['cmd_incr'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_incr'] = 0;
|
||||
$stats['incr_hits_percent'] = ' - ';
|
||||
$stats['incr_misses_percent'] = ' - ';
|
||||
}
|
||||
$stats['incr_rate'] = ($stats['cmd_incr'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_incr'] / $stats['uptime'], 1);
|
||||
|
||||
# Command decrement(), version > 1.2.X
|
||||
if (isset($stats['decr_hits'], $stats['decr_misses'])) {
|
||||
$stats['cmd_decr'] = $stats['decr_hits'] + $stats['decr_misses'];
|
||||
$stats['decr_hits_percent'] = ($stats['cmd_decr'] == 0) ? ' - ' : sprintf('%.1f', $stats['decr_hits'] / $stats['cmd_decr'] * 100, 1);
|
||||
$stats['decr_misses_percent'] = ($stats['cmd_decr'] == 0) ? ' - ' : sprintf('%.1f', $stats['decr_misses'] / $stats['cmd_decr'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_decr'] = 0;
|
||||
$stats['decr_hits_percent'] = ' - ';
|
||||
$stats['decr_misses_percent'] = ' - ';
|
||||
}
|
||||
$stats['decr_rate'] = ($stats['cmd_decr'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_decr'] / $stats['uptime'], 1);
|
||||
|
||||
# Command decrement(), version > 1.4.7
|
||||
if (isset($stats['touch_hits'], $stats['touch_misses'])) {
|
||||
$stats['cmd_touch'] = $stats['touch_hits'] + $stats['touch_misses'];
|
||||
$stats['touch_hits_percent'] = ($stats['cmd_touch'] == 0) ? ' - ' : sprintf('%.1f', $stats['touch_hits'] / $stats['cmd_touch'] * 100, 1);
|
||||
$stats['touch_misses_percent'] = ($stats['cmd_touch'] == 0) ? ' - ' : sprintf('%.1f', $stats['touch_misses'] / $stats['cmd_touch'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_touch'] = 0;
|
||||
$stats['touch_hits_percent'] = ' - ';
|
||||
$stats['touch_misses_percent'] = ' - ';
|
||||
}
|
||||
$stats['touch_rate'] = ($stats['cmd_touch'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_touch'] / $stats['uptime'], 1);
|
||||
|
||||
# Total hit & miss
|
||||
#$stats['cmd_total'] = $stats['cmd_get'] + $stats['cmd_set'] + $stats['cmd_delete'] + $stats['cmd_cas'] + $stats['cmd_incr'] + $stats['cmd_decr'];
|
||||
#$stats['hit_percent'] = ($stats['cmd_get'] == 0) ? '0.0' : sprintf('%.1f', ($stats['get_hits']) / ($stats['get_hits'] + $stats['get_misses']) * 100, 1);
|
||||
#$stats['miss_percent'] = ($stats['cmd_get'] == 0) ? '0.0' : sprintf('%.1f', ($stats['get_misses']) / ($stats['get_hits'] + $stats['get_misses']) * 100, 1);
|
||||
|
||||
|
||||
# Command flush_all
|
||||
if (isset($stats['cmd_flush'])) {
|
||||
$stats['flush_rate'] = ($stats['cmd_flush'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_flush'] / $stats['uptime'], 1);
|
||||
} else {
|
||||
$stats['flush_rate'] = '0.0';
|
||||
}
|
||||
|
||||
# Cache size
|
||||
$stats['bytes_percent'] = ($stats['limit_maxbytes'] == 0) ? '0.0' : sprintf('%.1f', $stats['bytes'] / $stats['limit_maxbytes'] * 100, 1);
|
||||
|
||||
# Request rate
|
||||
$stats['request_rate'] = sprintf('%.1f', ($stats['cmd_get'] + $stats['cmd_set'] + $stats['cmd_delete'] + $stats['cmd_cas'] + $stats['cmd_incr'] + $stats['cmd_decr']) / $stats['uptime'], 1);
|
||||
$stats['hit_rate'] = sprintf('%.1f', ($stats['get_hits']) / $stats['uptime'], 1);
|
||||
$stats['miss_rate'] = sprintf('%.1f', ($stats['get_misses']) / $stats['uptime'], 1);
|
||||
|
||||
# Eviction & reclaimed rate
|
||||
$stats['eviction_rate'] = ($stats['evictions'] == 0) ? '0.0' : sprintf('%.1f', $stats['evictions'] / $stats['uptime'], 1);
|
||||
$stats['reclaimed_rate'] = (! isset($stats['reclaimed']) || ($stats['reclaimed'] == 0)) ? '0.0' : sprintf('%.1f', $stats['reclaimed'] / $stats['uptime'], 1);
|
||||
|
||||
return $stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Analyse and return memcache slabs command
|
||||
*
|
||||
* @param Array $slabs Statistic from Command_XX::slabs()
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function slabs($slabs)
|
||||
{
|
||||
# Initializing Used Slabs
|
||||
$slabs['used_slabs'] = 0;
|
||||
$slabs['total_wasted'] = 0;
|
||||
|
||||
# Request Rate par Slabs
|
||||
foreach ($slabs as $id => $slab) {
|
||||
# Check if it's a Slab
|
||||
if (is_numeric($id)) {
|
||||
# Check if Slab is used
|
||||
if ($slab['used_chunks'] > 0) {
|
||||
$slabs['used_slabs'] ++;
|
||||
}
|
||||
$slabs[$id]['request_rate'] = sprintf('%.1f', ($slab['get_hits'] + $slab['cmd_set'] + $slab['delete_hits'] + $slab['cas_hits'] + $slab['cas_badval'] + $slab['incr_hits'] + $slab['decr_hits']) / $slabs['uptime'], 1);
|
||||
$slabs[$id]['mem_wasted'] = (($slab['total_chunks'] * $slab['chunk_size']) < $slab['mem_requested']) ? (($slab['total_chunks'] - $slab['used_chunks']) * $slab['chunk_size']) : (($slab['total_chunks'] * $slab['chunk_size']) - $slab['mem_requested']);
|
||||
$slabs['total_wasted'] += $slabs[$id]['mem_wasted'];
|
||||
}
|
||||
}
|
||||
|
||||
# Cheking server total malloced > 0
|
||||
if (! isset($slabs['total_malloced'])) {
|
||||
$slabs['total_malloced'] = 0;
|
||||
}
|
||||
|
||||
return $slabs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate Uptime
|
||||
*
|
||||
* @param Integer $uptime Uptime timestamp
|
||||
* @param Boolean $compact Compact Mode
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function uptime($uptime, $compact = false)
|
||||
{
|
||||
if ($uptime > 0) {
|
||||
$days = floor($uptime / 60 / 60 / 24);
|
||||
$hours = $uptime / 60 / 60 % 24;
|
||||
$mins = $uptime / 60 % 60;
|
||||
if (($days + $hours + $mins) == 0) {
|
||||
return ' less than 1 min';
|
||||
}
|
||||
if ($compact == false) {
|
||||
return $days . ' day' . (($days > 1) ? 's' : '') . ' ' . $hours . ' hr' . (($hours > 1) ? 's' : '') . ' ' . $mins . ' min' . (($mins > 1) ? 's' : '');
|
||||
} else {
|
||||
return $days . 'd ' . $hours . 'h ' . $mins . 'm';
|
||||
}
|
||||
}
|
||||
return ' - ';
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize a byte value
|
||||
*
|
||||
* @param Integer $value Value to resize
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function byteResize($value)
|
||||
{
|
||||
# Unit list
|
||||
$units = array('', 'K', 'M', 'G', 'T');
|
||||
|
||||
# Resizing
|
||||
foreach ($units as $unit) {
|
||||
if ($value < 1024) {
|
||||
break;
|
||||
}
|
||||
$value /= 1024;
|
||||
}
|
||||
return sprintf('%.1f %s', $value, $unit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize a value
|
||||
*
|
||||
* @param Integer $value Value to resize
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function valueResize($value)
|
||||
{
|
||||
# Unit list
|
||||
$units = array('', 'K', 'M', 'G', 'T');
|
||||
|
||||
# Resizing
|
||||
foreach ($units as $unit) {
|
||||
if ($value < 1000) {
|
||||
break;
|
||||
}
|
||||
$value /= 1000;
|
||||
}
|
||||
return sprintf('%.1f%s', $value, $unit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize a hit value
|
||||
*
|
||||
* @param Integer $value Hit value to resize
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function hitResize($value)
|
||||
{
|
||||
# Unit list
|
||||
$units = array('', 'K', 'M', 'G', 'T');
|
||||
|
||||
# Resizing
|
||||
foreach ($units as $unit) {
|
||||
if ($value < 10000000) {
|
||||
break;
|
||||
}
|
||||
$value /= 1000;
|
||||
}
|
||||
return sprintf('%.0f%s', $value, $unit);
|
||||
}
|
||||
}
|
60
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Error.php
vendored
Normal file
60
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Error.php
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Error container
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 11/10/2010
|
||||
*/
|
||||
class Library_Data_Error
|
||||
{
|
||||
private static $_errors = array();
|
||||
|
||||
/**
|
||||
* Add an error to the container
|
||||
* Return true if successful, false otherwise
|
||||
*
|
||||
* @param String $error Error message
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public static function add($error)
|
||||
{
|
||||
return array_push(self::$_errors, $error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return last Error message
|
||||
*
|
||||
* @return Mixed
|
||||
*/
|
||||
public static function last()
|
||||
{
|
||||
return (isset(self::$_errors[count(self::$_errors) - 1])) ? self::$_errors[count(self::$_errors) - 1] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return errors count
|
||||
*
|
||||
* @return Integer
|
||||
*/
|
||||
public static function count()
|
||||
{
|
||||
return count(self::$_errors);
|
||||
}
|
||||
}
|
72
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Version.php
vendored
Normal file
72
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Version.php
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2011 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Version container
|
||||
*
|
||||
* @author cyrille.mahieux@free.fr
|
||||
* @since 24/08/2011
|
||||
*/
|
||||
class Library_Data_Version
|
||||
{
|
||||
# Version file
|
||||
protected static $_file = 'latest';
|
||||
|
||||
# Google Code latest version data file
|
||||
protected static $_latest = 'https://blog.elijaa.org/public/latest';
|
||||
|
||||
# Time between HTTP check
|
||||
protected static $_time = 1296000; # 15 days
|
||||
|
||||
|
||||
/**
|
||||
* Check for the latest version, from local cache or via http
|
||||
* Return true if a newer version is available, false otherwise
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public static function check()
|
||||
{
|
||||
# Loading ini file
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Version definition file path
|
||||
$path = rtrim($_ini->get('file_path'), '/') . DIRECTORY_SEPARATOR . self::$_file;
|
||||
|
||||
# Checking if path is writable
|
||||
if (is_writable($_ini->get('file_path'))) {
|
||||
# Checking if file was modified for less than 15 days ago
|
||||
if ((is_array($stats = @stat($path))) && (isset($stats['mtime'])) && ($stats['mtime'] > (time() - self::$_time))) {
|
||||
# Opening file and checking for latest version
|
||||
return (version_compare(CURRENT_VERSION, file_get_contents($path)) == - 1);
|
||||
} else {
|
||||
# Getting last version from Google Code
|
||||
if ($latest = @file_get_contents(self::$_latest)) {
|
||||
# Saving latest version in file
|
||||
file_put_contents($path, $latest);
|
||||
|
||||
# Checking for latest version
|
||||
return (version_compare(CURRENT_VERSION, $latest) == - 1);
|
||||
} else {
|
||||
# To avoid error spam
|
||||
file_put_contents($path, 'Net unreachable');
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
143
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/HTML/Components.php
vendored
Normal file
143
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/HTML/Components.php
vendored
Normal file
@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Manipulation of HTML
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 05/04/2010
|
||||
*/
|
||||
class Library_HTML_Components
|
||||
{
|
||||
|
||||
/**
|
||||
* Dump server list in an HTML select
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function serverSelect($name, $selected = '', $class = '', $events = '')
|
||||
{
|
||||
# Loading ini file
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Select Name
|
||||
$serverList = '<select id="' . $name . '" ';
|
||||
|
||||
# CSS Class
|
||||
$serverList .= ($class != '') ? 'class="' . $class . '"' : '';
|
||||
|
||||
# Javascript Events
|
||||
$serverList .= ' ' . $events . '>';
|
||||
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Cluster
|
||||
$serverList .= '<option value="' . $cluster . '" ';
|
||||
$serverList .= ($selected == $cluster) ? 'selected="selected"' : '';
|
||||
$serverList .= '>' . $cluster . ' cluster</option>';
|
||||
|
||||
# Cluster server
|
||||
foreach ($servers as $name => $servers) {
|
||||
$serverList .= '<option value="' . $name . '" ';
|
||||
$serverList .= ($selected == $name) ? 'selected="selected"' : '';
|
||||
$serverList .= '> - ' . ((strlen($name) > 38) ? substr($name, 0, 38) . ' [...]' : $name) . '</option>';
|
||||
}
|
||||
}
|
||||
return $serverList . '</select>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump cluster list in an HTML select
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function clusterSelect($name, $selected = '', $class = '', $events = '')
|
||||
{
|
||||
# Loading ini file
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Select Name
|
||||
$clusterList = '<select id="' . $name . '" ';
|
||||
|
||||
# CSS Class
|
||||
$clusterList .= ($class != '') ? 'class="' . $class . '"' : '';
|
||||
|
||||
# Javascript Events
|
||||
$clusterList .= ' ' . $events . '>';
|
||||
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Option value and selected case
|
||||
$clusterList .= '<option value="' . $cluster . '" ';
|
||||
$clusterList .= ($selected == $cluster) ? 'selected="selected"' : '';
|
||||
$clusterList .= '>' . $cluster . ' cluster</option>';
|
||||
}
|
||||
return $clusterList . '</select>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump server response in proper formatting
|
||||
*
|
||||
* @param String $hostname Hostname
|
||||
* @param String $port Port
|
||||
* @param Mixed $data Data (reponse)
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function serverResponse($hostname, $port, $data)
|
||||
{
|
||||
$header = '<span class="red">Server ' . $hostname . ':' . $port . "</span>\r\n";
|
||||
$return = '';
|
||||
if (is_array($data)) {
|
||||
foreach ($data as $string) {
|
||||
$return .= $string . "\r\n";
|
||||
}
|
||||
return $header . htmlentities($return, ENT_NOQUOTES | 0, 'UTF-8') . "\r\n";
|
||||
}
|
||||
return $header . $return . $data . "\r\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump api list un HTML select with select name
|
||||
*
|
||||
* @param String $iniAPI API Name from ini file
|
||||
* @param String $id Select ID
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function apiList($iniAPI = '', $id)
|
||||
{
|
||||
return '<select id="' . $id . '" name="' . $id . '">
|
||||
<option value="Server" ' . self::selected('Server', $iniAPI) . '>Server API</option>
|
||||
<option value="Memcache" ' . self::selected('Memcache', $iniAPI) . '>Memcache API</option>
|
||||
<option value="Memcached" ' . self::selected('Memcached', $iniAPI) . '>Memcached API</option>
|
||||
</select>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to see if an option is selected
|
||||
*
|
||||
* @param String $actual Actual value
|
||||
* @param String $selected Selected value
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
private static function selected($actual, $selected)
|
||||
{
|
||||
if ($actual == $selected) {
|
||||
return 'selected="selected"';
|
||||
}
|
||||
}
|
||||
}
|
391
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Scripts/Highcharts/highcharts.js
vendored
Normal file
391
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Scripts/Highcharts/highcharts.js
vendored
Normal file
@ -0,0 +1,391 @@
|
||||
/*
|
||||
Highcharts JS v5.0.9 (2017-03-08)
|
||||
|
||||
(c) 2009-2016 Torstein Honsi
|
||||
|
||||
License: www.highcharts.com/license
|
||||
*/
|
||||
(function(I,a){"object"===typeof module&&module.exports?module.exports=I.document?a(I):a:I.Highcharts=a(I)})("undefined"!==typeof window?window:this,function(I){I=function(){var a=window,B=a.document,z=a.navigator&&a.navigator.userAgent||"",C=B&&B.createElementNS&&!!B.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,E=/(edge|msie|trident)/i.test(z)&&!window.opera,u=!C,h=/Firefox/.test(z),n=h&&4>parseInt(z.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highcharts",
|
||||
version:"5.0.9",deg2rad:2*Math.PI/360,doc:B,hasBidiBug:n,hasTouch:B&&void 0!==B.documentElement.ontouchstart,isMS:E,isWebKit:/AppleWebKit/.test(z),isFirefox:h,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(z),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:C,vml:u,win:a,charts:[],marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}}}();(function(a){var B=[],z=a.charts,C=a.doc,E=a.win;a.error=function(u,h){u=a.isNumber(u)?"Highcharts error #"+
|
||||
u+": www.highcharts.com/errors/"+u:u;if(h)throw Error(u);E.console&&console.log(u)};a.Fx=function(a,h,n){this.options=h;this.elem=a;this.prop=n};a.Fx.prototype={dSetter:function(){var a=this.paths[0],h=this.paths[1],n=[],t=this.now,l=a.length,k;if(1===t)n=this.toD;else if(l===h.length&&1>t)for(;l--;)k=parseFloat(a[l]),n[l]=isNaN(k)?a[l]:t*parseFloat(h[l]-k)+k;else n=h;this.elem.attr("d",n,null,!0)},update:function(){var a=this.elem,h=this.prop,n=this.now,t=this.options.step;if(this[h+"Setter"])this[h+
|
||||
"Setter"]();else a.attr?a.element&&a.attr(h,n,null,!0):a.style[h]=n+this.unit;t&&t.call(a,n,this)},run:function(a,h,n){var u=this,l=function(a){return l.stopped?!1:u.step(a)},k;this.startTime=+new Date;this.start=a;this.end=h;this.unit=n;this.now=this.start;this.pos=0;l.elem=this.elem;l.prop=this.prop;l()&&1===B.push(l)&&(l.timerId=setInterval(function(){for(k=0;k<B.length;k++)B[k]()||B.splice(k--,1);B.length||clearInterval(l.timerId)},13))},step:function(a){var h=+new Date,u,t=this.options;u=this.elem;
|
||||
var l=t.complete,k=t.duration,e=t.curAnim,c;if(u.attr&&!u.element)u=!1;else if(a||h>=k+this.startTime){this.now=this.end;this.pos=1;this.update();a=e[this.prop]=!0;for(c in e)!0!==e[c]&&(a=!1);a&&l&&l.call(u);u=!1}else this.pos=t.easing((h-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),u=!0;return u},initPath:function(u,h,n){function t(a){var b,f;for(r=a.length;r--;)b="M"===a[r]||"L"===a[r],f=/[a-zA-Z]/.test(a[r+3]),b&&f&&a.splice(r+1,0,a[r+1],a[r+2],a[r+1],a[r+
|
||||
2])}function l(a,f){for(;a.length<m;){a[0]=f[m-a.length];var d=a.slice(0,b);[].splice.apply(a,[0,0].concat(d));A&&(d=a.slice(a.length-b),[].splice.apply(a,[a.length,0].concat(d)),r--)}a[0]="M"}function k(a,f){for(var c=(m-a.length)/b;0<c&&c--;)d=a.slice().splice(a.length/v-b,b*v),d[0]=f[m-b-c*b],H&&(d[b-6]=d[b-2],d[b-5]=d[b-1]),[].splice.apply(a,[a.length/v,0].concat(d)),A&&c--}h=h||"";var e,c=u.startX,p=u.endX,H=-1<h.indexOf("C"),b=H?7:3,m,d,r;h=h.split(" ");n=n.slice();var A=u.isArea,v=A?2:1,f;
|
||||
H&&(t(h),t(n));if(c&&p){for(r=0;r<c.length;r++)if(c[r]===p[0]){e=r;break}else if(c[0]===p[p.length-c.length+r]){e=r;f=!0;break}void 0===e&&(h=[])}h.length&&a.isNumber(e)&&(m=n.length+e*v*b,f?(l(h,n),k(n,h)):(l(n,h),k(h,n)));return[h,n]}};a.extend=function(a,h){var u;a||(a={});for(u in h)a[u]=h[u];return a};a.merge=function(){var u,h=arguments,n,t={},l=function(k,e){var c,p;"object"!==typeof k&&(k={});for(p in e)e.hasOwnProperty(p)&&(c=e[p],a.isObject(c,!0)&&"renderTo"!==p&&"number"!==typeof c.nodeType?
|
||||
k[p]=l(k[p]||{},c):k[p]=e[p]);return k};!0===h[0]&&(t=h[1],h=Array.prototype.slice.call(h,2));n=h.length;for(u=0;u<n;u++)t=l(t,h[u]);return t};a.pInt=function(a,h){return parseInt(a,h||10)};a.isString=function(a){return"string"===typeof a};a.isArray=function(a){a=Object.prototype.toString.call(a);return"[object Array]"===a||"[object Array Iterator]"===a};a.isObject=function(u,h){return u&&"object"===typeof u&&(!h||!a.isArray(u))};a.isNumber=function(a){return"number"===typeof a&&!isNaN(a)};a.erase=
|
||||
function(a,h){for(var u=a.length;u--;)if(a[u]===h){a.splice(u,1);break}};a.defined=function(a){return void 0!==a&&null!==a};a.attr=function(u,h,n){var t,l;if(a.isString(h))a.defined(n)?u.setAttribute(h,n):u&&u.getAttribute&&(l=u.getAttribute(h));else if(a.defined(h)&&a.isObject(h))for(t in h)u.setAttribute(t,h[t]);return l};a.splat=function(u){return a.isArray(u)?u:[u]};a.syncTimeout=function(a,h,n){if(h)return setTimeout(a,h,n);a.call(0,n)};a.pick=function(){var a=arguments,h,n,t=a.length;for(h=
|
||||
0;h<t;h++)if(n=a[h],void 0!==n&&null!==n)return n};a.css=function(u,h){a.isMS&&!a.svg&&h&&void 0!==h.opacity&&(h.filter="alpha(opacity\x3d"+100*h.opacity+")");a.extend(u.style,h)};a.createElement=function(u,h,n,t,l){u=C.createElement(u);var k=a.css;h&&a.extend(u,h);l&&k(u,{padding:0,border:"none",margin:0});n&&k(u,n);t&&t.appendChild(u);return u};a.extendClass=function(u,h){var n=function(){};n.prototype=new u;a.extend(n.prototype,h);return n};a.pad=function(a,h,n){return Array((h||2)+1-String(a).length).join(n||
|
||||
0)+a};a.relativeLength=function(a,h){return/%$/.test(a)?h*parseFloat(a)/100:parseFloat(a)};a.wrap=function(a,h,n){var t=a[h];a[h]=function(){var a=Array.prototype.slice.call(arguments),k=arguments,e=this;e.proceed=function(){t.apply(e,arguments.length?arguments:k)};a.unshift(t);a=n.apply(this,a);e.proceed=null;return a}};a.getTZOffset=function(u){var h=a.Date;return 6E4*(h.hcGetTimezoneOffset&&h.hcGetTimezoneOffset(u)||h.hcTimezoneOffset||0)};a.dateFormat=function(u,h,n){if(!a.defined(h)||isNaN(h))return a.defaultOptions.lang.invalidDate||
|
||||
"";u=a.pick(u,"%Y-%m-%d %H:%M:%S");var t=a.Date,l=new t(h-a.getTZOffset(h)),k,e=l[t.hcGetHours](),c=l[t.hcGetDay](),p=l[t.hcGetDate](),H=l[t.hcGetMonth](),b=l[t.hcGetFullYear](),m=a.defaultOptions.lang,d=m.weekdays,r=m.shortWeekdays,A=a.pad,t=a.extend({a:r?r[c]:d[c].substr(0,3),A:d[c],d:A(p),e:A(p,2," "),w:c,b:m.shortMonths[H],B:m.months[H],m:A(H+1),y:b.toString().substr(2,2),Y:b,H:A(e),k:e,I:A(e%12||12),l:e%12||12,M:A(l[t.hcGetMinutes]()),p:12>e?"AM":"PM",P:12>e?"am":"pm",S:A(l.getSeconds()),L:A(Math.round(h%
|
||||
1E3),3)},a.dateFormats);for(k in t)for(;-1!==u.indexOf("%"+k);)u=u.replace("%"+k,"function"===typeof t[k]?t[k](h):t[k]);return n?u.substr(0,1).toUpperCase()+u.substr(1):u};a.formatSingle=function(u,h){var n=/\.([0-9])/,t=a.defaultOptions.lang;/f$/.test(u)?(n=(n=u.match(n))?n[1]:-1,null!==h&&(h=a.numberFormat(h,n,t.decimalPoint,-1<u.indexOf(",")?t.thousandsSep:""))):h=a.dateFormat(u,h);return h};a.format=function(u,h){for(var n="{",t=!1,l,k,e,c,p=[],H;u;){n=u.indexOf(n);if(-1===n)break;l=u.slice(0,
|
||||
n);if(t){l=l.split(":");k=l.shift().split(".");c=k.length;H=h;for(e=0;e<c;e++)H=H[k[e]];l.length&&(H=a.formatSingle(l.join(":"),H));p.push(H)}else p.push(l);u=u.slice(n+1);n=(t=!t)?"}":"{"}p.push(u);return p.join("")};a.getMagnitude=function(a){return Math.pow(10,Math.floor(Math.log(a)/Math.LN10))};a.normalizeTickInterval=function(u,h,n,t,l){var k,e=u;n=a.pick(n,1);k=u/n;h||(h=l?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===t&&(1===n?h=a.grep(h,function(a){return 0===a%1}):.1>=n&&(h=[1/n])));
|
||||
for(t=0;t<h.length&&!(e=h[t],l&&e*n>=u||!l&&k<=(h[t]+(h[t+1]||h[t]))/2);t++);return e=a.correctFloat(e*n,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=function(a,h){var n=a.length,t,l;for(l=0;l<n;l++)a[l].safeI=l;a.sort(function(a,e){t=h(a,e);return 0===t?a.safeI-e.safeI:t});for(l=0;l<n;l++)delete a[l].safeI};a.arrayMin=function(a){for(var h=a.length,n=a[0];h--;)a[h]<n&&(n=a[h]);return n};a.arrayMax=function(a){for(var h=a.length,n=a[0];h--;)a[h]>n&&(n=a[h]);return n};a.destroyObjectProperties=
|
||||
function(a,h){for(var n in a)a[n]&&a[n]!==h&&a[n].destroy&&a[n].destroy(),delete a[n]};a.discardElement=function(u){var h=a.garbageBin;h||(h=a.createElement("div"));u&&h.appendChild(u);h.innerHTML=""};a.correctFloat=function(a,h){return parseFloat(a.toPrecision(h||14))};a.setAnimation=function(u,h){h.renderer.globalAnimation=a.pick(u,h.options.chart.animation,!0)};a.animObject=function(u){return a.isObject(u)?a.merge(u):{duration:u?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,
|
||||
day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(u,h,n,t){u=+u||0;h=+h;var l=a.defaultOptions.lang,k=(u.toString().split(".")[1]||"").length,e,c;-1===h?h=Math.min(k,20):a.isNumber(h)||(h=2);c=(Math.abs(u)+Math.pow(10,-Math.max(h,k)-1)).toFixed(h);k=String(a.pInt(c));e=3<k.length?k.length%3:0;n=a.pick(n,l.decimalPoint);t=a.pick(t,l.thousandsSep);u=(0>u?"-":"")+(e?k.substr(0,e)+t:"");u+=k.substr(e).replace(/(\d{3})(?=\d)/g,"$1"+t);h&&(u+=n+c.slice(-h));return u};Math.easeInOutSine=
|
||||
function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(u,h){return"width"===h?Math.min(u.offsetWidth,u.scrollWidth)-a.getStyle(u,"padding-left")-a.getStyle(u,"padding-right"):"height"===h?Math.min(u.offsetHeight,u.scrollHeight)-a.getStyle(u,"padding-top")-a.getStyle(u,"padding-bottom"):(u=E.getComputedStyle(u,void 0))&&a.pInt(u.getPropertyValue(h))};a.inArray=function(a,h){return h.indexOf?h.indexOf(a):[].indexOf.call(h,a)};a.grep=function(a,h){return[].filter.call(a,h)};a.find=function(a,
|
||||
h){return[].find.call(a,h)};a.map=function(a,h){for(var n=[],t=0,l=a.length;t<l;t++)n[t]=h.call(a[t],a[t],t,a);return n};a.offset=function(a){var h=C.documentElement;a=a.getBoundingClientRect();return{top:a.top+(E.pageYOffset||h.scrollTop)-(h.clientTop||0),left:a.left+(E.pageXOffset||h.scrollLeft)-(h.clientLeft||0)}};a.stop=function(a,h){for(var n=B.length;n--;)B[n].elem!==a||h&&h!==B[n].prop||(B[n].stopped=!0)};a.each=function(a,h,n){return Array.prototype.forEach.call(a,h,n)};a.addEvent=function(u,
|
||||
h,n){function t(a){a.target=a.srcElement||E;n.call(u,a)}var l=u.hcEvents=u.hcEvents||{};u.addEventListener?u.addEventListener(h,n,!1):u.attachEvent&&(u.hcEventsIE||(u.hcEventsIE={}),u.hcEventsIE[n.toString()]=t,u.attachEvent("on"+h,t));l[h]||(l[h]=[]);l[h].push(n);return function(){a.removeEvent(u,h,n)}};a.removeEvent=function(u,h,n){function t(a,c){u.removeEventListener?u.removeEventListener(a,c,!1):u.attachEvent&&(c=u.hcEventsIE[c.toString()],u.detachEvent("on"+a,c))}function l(){var a,c;if(u.nodeName)for(c in h?
|
||||
(a={},a[h]=!0):a=e,a)if(e[c])for(a=e[c].length;a--;)t(c,e[c][a])}var k,e=u.hcEvents,c;e&&(h?(k=e[h]||[],n?(c=a.inArray(n,k),-1<c&&(k.splice(c,1),e[h]=k),t(h,n)):(l(),e[h]=[])):(l(),u.hcEvents={}))};a.fireEvent=function(u,h,n,t){var l;l=u.hcEvents;var k,e;n=n||{};if(C.createEvent&&(u.dispatchEvent||u.fireEvent))l=C.createEvent("Events"),l.initEvent(h,!0,!0),a.extend(l,n),u.dispatchEvent?u.dispatchEvent(l):u.fireEvent(h,l);else if(l)for(l=l[h]||[],k=l.length,n.target||a.extend(n,{preventDefault:function(){n.defaultPrevented=
|
||||
!0},target:u,type:h}),h=0;h<k;h++)(e=l[h])&&!1===e.call(u,n)&&n.preventDefault();t&&!n.defaultPrevented&&t(n)};a.animate=function(u,h,n){var t,l="",k,e,c;a.isObject(n)||(t=arguments,n={duration:t[2],easing:t[3],complete:t[4]});a.isNumber(n.duration)||(n.duration=400);n.easing="function"===typeof n.easing?n.easing:Math[n.easing]||Math.easeInOutSine;n.curAnim=a.merge(h);for(c in h)a.stop(u,c),e=new a.Fx(u,n,c),k=null,"d"===c?(e.paths=e.initPath(u,u.d,h.d),e.toD=h.d,t=0,k=1):u.attr?t=u.attr(c):(t=parseFloat(a.getStyle(u,
|
||||
c))||0,"opacity"!==c&&(l="px")),k||(k=h[c]),k&&k.match&&k.match("px")&&(k=k.replace(/px/g,"")),e.run(t,k,l)};a.seriesType=function(u,h,n,t,l){var k=a.getOptions(),e=a.seriesTypes;k.plotOptions[u]=a.merge(k.plotOptions[h],n);e[u]=a.extendClass(e[h]||function(){},t);e[u].prototype.type=u;l&&(e[u].prototype.pointClass=a.extendClass(a.Point,l));return e[u]};a.uniqueKey=function(){var a=Math.random().toString(36).substring(2,9),h=0;return function(){return"highcharts-"+a+"-"+h++}}();E.jQuery&&(E.jQuery.fn.highcharts=
|
||||
function(){var u=[].slice.call(arguments);if(this[0])return u[0]?(new (a[a.isString(u[0])?u.shift():"Chart"])(this[0],u[0],u[1]),this):z[a.attr(this[0],"data-highcharts-chart")]});C&&!C.defaultView&&(a.getStyle=function(u,h){var n={width:"clientWidth",height:"clientHeight"}[h];if(u.style[h])return a.pInt(u.style[h]);"opacity"===h&&(h="filter");if(n)return u.style.zoom=1,Math.max(u[n]-2*a.getStyle(u,"padding"),0);u=u.currentStyle[h.replace(/\-(\w)/g,function(a,l){return l.toUpperCase()})];"filter"===
|
||||
h&&(u=u.replace(/alpha\(opacity=([0-9]+)\)/,function(a,l){return l/100}));return""===u?1:a.pInt(u)});Array.prototype.forEach||(a.each=function(a,h,n){for(var t=0,l=a.length;t<l;t++)if(!1===h.call(n,a[t],t,a))return t});Array.prototype.indexOf||(a.inArray=function(a,h){var n,t=0;if(h)for(n=h.length;t<n;t++)if(h[t]===a)return t;return-1});Array.prototype.filter||(a.grep=function(a,h){for(var n=[],t=0,l=a.length;t<l;t++)h(a[t],t)&&n.push(a[t]);return n});Array.prototype.find||(a.find=function(a,h){var n,
|
||||
t=a.length;for(n=0;n<t;n++)if(h(a[n],n))return a[n]})})(I);(function(a){var B=a.each,z=a.isNumber,C=a.map,E=a.merge,u=a.pInt;a.Color=function(h){if(!(this instanceof a.Color))return new a.Color(h);this.init(h)};a.Color.prototype={parsers:[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[u(a[1]),u(a[2]),u(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[u(a[1]),
|
||||
u(a[2]),u(a[3]),1]}}],names:{white:"#ffffff",black:"#000000"},init:function(h){var n,t,l,k;if((this.input=h=this.names[h]||h)&&h.stops)this.stops=C(h.stops,function(e){return new a.Color(e[1])});else if(h&&"#"===h[0]&&(n=h.length,h=parseInt(h.substr(1),16),7===n?t=[(h&16711680)>>16,(h&65280)>>8,h&255,1]:4===n&&(t=[(h&3840)>>4|(h&3840)>>8,(h&240)>>4|h&240,(h&15)<<4|h&15,1])),!t)for(l=this.parsers.length;l--&&!t;)k=this.parsers[l],(n=k.regex.exec(h))&&(t=k.parse(n));this.rgba=t||[]},get:function(a){var h=
|
||||
this.input,t=this.rgba,l;this.stops?(l=E(h),l.stops=[].concat(l.stops),B(this.stops,function(k,e){l.stops[e]=[l.stops[e][0],k.get(a)]})):l=t&&z(t[0])?"rgb"===a||!a&&1===t[3]?"rgb("+t[0]+","+t[1]+","+t[2]+")":"a"===a?t[3]:"rgba("+t.join(",")+")":h;return l},brighten:function(a){var h,t=this.rgba;if(this.stops)B(this.stops,function(l){l.brighten(a)});else if(z(a)&&0!==a)for(h=0;3>h;h++)t[h]+=u(255*a),0>t[h]&&(t[h]=0),255<t[h]&&(t[h]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this}};
|
||||
a.color=function(h){return new a.Color(h)}})(I);(function(a){var B,z,C=a.addEvent,E=a.animate,u=a.attr,h=a.charts,n=a.color,t=a.css,l=a.createElement,k=a.defined,e=a.deg2rad,c=a.destroyObjectProperties,p=a.doc,H=a.each,b=a.extend,m=a.erase,d=a.grep,r=a.hasTouch,A=a.inArray,v=a.isArray,f=a.isFirefox,y=a.isMS,G=a.isObject,F=a.isString,q=a.isWebKit,x=a.merge,J=a.noop,K=a.pick,L=a.pInt,g=a.removeEvent,D=a.stop,S=a.svg,M=a.SVG_NS,R=a.symbolSizes,N=a.win;B=a.SVGElement=function(){return this};B.prototype=
|
||||
{opacity:1,SVG_NS:M,textProps:"direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline".split(" "),init:function(a,g){this.element="span"===g?l(g):p.createElementNS(this.SVG_NS,g);this.renderer=a},animate:function(w,g,b){g=a.animObject(K(g,this.renderer.globalAnimation,!0));0!==g.duration?(b&&(g.complete=b),E(this,w,g)):(this.attr(w,null,b),g.step&&g.step.call(this));return this},colorGradient:function(w,g,b){var f=this.renderer,
|
||||
d,c,q,D,O,y,r,G,e,m,p,l=[],Q;w.linearGradient?c="linearGradient":w.radialGradient&&(c="radialGradient");if(c){q=w[c];O=f.gradients;r=w.stops;m=b.radialReference;v(q)&&(w[c]=q={x1:q[0],y1:q[1],x2:q[2],y2:q[3],gradientUnits:"userSpaceOnUse"});"radialGradient"===c&&m&&!k(q.gradientUnits)&&(D=q,q=x(q,f.getRadialAttr(m,D),{gradientUnits:"userSpaceOnUse"}));for(p in q)"id"!==p&&l.push(p,q[p]);for(p in r)l.push(r[p]);l=l.join(",");O[l]?m=O[l].attr("id"):(q.id=m=a.uniqueKey(),O[l]=y=f.createElement(c).attr(q).add(f.defs),
|
||||
y.radAttr=D,y.stops=[],H(r,function(w){0===w[1].indexOf("rgba")?(d=a.color(w[1]),G=d.get("rgb"),e=d.get("a")):(G=w[1],e=1);w=f.createElement("stop").attr({offset:w[0],"stop-color":G,"stop-opacity":e}).add(y);y.stops.push(w)}));Q="url("+f.url+"#"+m+")";b.setAttribute(g,Q);b.gradient=l;w.toString=function(){return Q}}},applyTextOutline:function(a){var w=this.element,g,b,f,d;-1!==a.indexOf("contrast")&&(a=a.replace(/contrast/g,this.renderer.getContrast(w.style.fill)));this.fakeTS=!0;this.ySetter=this.xSetter;
|
||||
g=[].slice.call(w.getElementsByTagName("tspan"));a=a.split(" ");b=a[a.length-1];(f=a[0])&&"none"!==f&&(f=f.replace(/(^[\d\.]+)(.*?)$/g,function(a,w,g){return 2*w+g}),H(g,function(a){"highcharts-text-outline"===a.getAttribute("class")&&m(g,w.removeChild(a))}),d=w.firstChild,H(g,function(a,g){0===g&&(a.setAttribute("x",w.getAttribute("x")),g=w.getAttribute("y"),a.setAttribute("y",g||0),null===g&&w.setAttribute("y",0));a=a.cloneNode(1);u(a,{"class":"highcharts-text-outline",fill:b,stroke:b,"stroke-width":f,
|
||||
"stroke-linejoin":"round"});w.insertBefore(a,d)}))},attr:function(a,g,b,f){var w,d=this.element,q,c=this,y;"string"===typeof a&&void 0!==g&&(w=a,a={},a[w]=g);if("string"===typeof a)c=(this[a+"Getter"]||this._defaultGetter).call(this,a,d);else{for(w in a)g=a[w],y=!1,f||D(this,w),this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(w)&&(q||(this.symbolAttr(a),q=!0),y=!0),!this.rotation||"x"!==w&&"y"!==w||(this.doTransform=!0),y||(y=this[w+"Setter"]||this._defaultSetter,y.call(this,
|
||||
g,w,d),this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(w)&&this.updateShadows(w,g,y));this.doTransform&&(this.updateTransform(),this.doTransform=!1)}b&&b();return c},updateShadows:function(a,g,b){for(var w=this.shadows,f=w.length;f--;)b.call(w[f],"height"===a?Math.max(g-(w[f].cutHeight||0),0):"d"===a?this.d:g,a,w[f])},addClass:function(a,g){var w=this.attr("class")||"";-1===w.indexOf(a)&&(g||(a=(w+(w?" ":"")+a).replace(" "," ")),this.attr("class",a));return this},hasClass:function(a){return-1!==
|
||||
u(this.element,"class").indexOf(a)},removeClass:function(a){u(this.element,"class",(u(this.element,"class")||"").replace(a,""));return this},symbolAttr:function(a){var w=this;H("x y r start end width height innerR anchorX anchorY".split(" "),function(g){w[g]=K(a[g],w[g])});w.attr({d:w.renderer.symbols[w.symbolName](w.x,w.y,w.width,w.height,w)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":"none")},crisp:function(a,g){var w,f={},b;g=g||a.strokeWidth||0;b=Math.round(g)%
|
||||
2/2;a.x=Math.floor(a.x||this.x||0)+b;a.y=Math.floor(a.y||this.y||0)+b;a.width=Math.floor((a.width||this.width||0)-2*b);a.height=Math.floor((a.height||this.height||0)-2*b);k(a.strokeWidth)&&(a.strokeWidth=g);for(w in a)this[w]!==a[w]&&(this[w]=f[w]=a[w]);return f},css:function(a){var w=this.styles,g={},f=this.element,d,q="",c=!w,D=["textOverflow","width"];a&&a.color&&(a.fill=a.color);if(w)for(d in a)a[d]!==w[d]&&(g[d]=a[d],c=!0);if(c){w&&(a=b(w,g));w=this.textWidth=a&&a.width&&"auto"!==a.width&&"text"===
|
||||
f.nodeName.toLowerCase()&&L(a.width);this.styles=a;w&&!S&&this.renderer.forExport&&delete a.width;if(y&&!S)t(this.element,a);else{w=function(a,w){return"-"+w.toLowerCase()};for(d in a)-1===A(d,D)&&(q+=d.replace(/([A-Z])/g,w)+":"+a[d]+";");q&&u(f,"style",q)}this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline))}return this},strokeWidth:function(){return this["stroke-width"]||0},on:function(a,g){var w=this,f=w.element;r&&"click"===
|
||||
a?(f.ontouchstart=function(a){w.touchEventFired=Date.now();a.preventDefault();g.call(f,a)},f.onclick=function(a){(-1===N.navigator.userAgent.indexOf("Android")||1100<Date.now()-(w.touchEventFired||0))&&g.call(f,a)}):f["on"+a]=g;return this},setRadialReference:function(a){var w=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;w&&w.radAttr&&w.animate(this.renderer.getRadialAttr(a,w.radAttr));return this},translate:function(a,g){return this.attr({translateX:a,translateY:g})},
|
||||
invert:function(a){this.inverted=a;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,g=this.translateY||0,f=this.scaleX,b=this.scaleY,d=this.inverted,q=this.rotation,c=this.element;d&&(a+=this.width,g+=this.height);a=["translate("+a+","+g+")"];d?a.push("rotate(90) scale(-1,1)"):q&&a.push("rotate("+q+" "+(c.getAttribute("x")||0)+" "+(c.getAttribute("y")||0)+")");(k(f)||k(b))&&a.push("scale("+K(f,1)+" "+K(b,1)+")");a.length&&c.setAttribute("transform",a.join(" "))},
|
||||
toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,g,f){var w,b,d,q,c={};b=this.renderer;d=b.alignedObjects;var D,y;if(a){if(this.alignOptions=a,this.alignByTranslate=g,!f||F(f))this.alignTo=w=f||"renderer",m(d,this),d.push(this),f=null}else a=this.alignOptions,g=this.alignByTranslate,w=this.alignTo;f=K(f,b[w],b);w=a.align;b=a.verticalAlign;d=(f.x||0)+(a.x||0);q=(f.y||0)+(a.y||0);"right"===w?D=1:"center"===w&&(D=2);D&&(d+=(f.width-(a.width||0))/D);c[g?
|
||||
"translateX":"x"]=Math.round(d);"bottom"===b?y=1:"middle"===b&&(y=2);y&&(q+=(f.height-(a.height||0))/y);c[g?"translateY":"y"]=Math.round(q);this[this.placed?"animate":"attr"](c);this.placed=!0;this.alignAttr=c;return this},getBBox:function(a,g){var w,f=this.renderer,d,q=this.element,c=this.styles,D,y=this.textStr,x,r=f.cache,G=f.cacheKeys,m;g=K(g,this.rotation);d=g*e;D=c&&c.fontSize;void 0!==y&&(m=y.toString(),-1===m.indexOf("\x3c")&&(m=m.replace(/[0-9]/g,"0")),m+=["",g||0,D,c&&c.width,c&&c.textOverflow].join());
|
||||
m&&!a&&(w=r[m]);if(!w){if(q.namespaceURI===this.SVG_NS||f.forExport){try{(x=this.fakeTS&&function(a){H(q.querySelectorAll(".highcharts-text-outline"),function(w){w.style.display=a})})&&x("none"),w=q.getBBox?b({},q.getBBox()):{width:q.offsetWidth,height:q.offsetHeight},x&&x("")}catch(X){}if(!w||0>w.width)w={width:0,height:0}}else w=this.htmlGetBBox();f.isSVG&&(a=w.width,f=w.height,c&&"11px"===c.fontSize&&17===Math.round(f)&&(w.height=f=14),g&&(w.width=Math.abs(f*Math.sin(d))+Math.abs(a*Math.cos(d)),
|
||||
w.height=Math.abs(f*Math.cos(d))+Math.abs(a*Math.sin(d))));if(m&&0<w.height){for(;250<G.length;)delete r[G.shift()];r[m]||G.push(m);r[m]=w}}return w},show:function(a){return this.attr({visibility:a?"inherit":"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var w=this;w.animate({opacity:0},{duration:a||150,complete:function(){w.attr({y:-9999})}})},add:function(a){var w=this.renderer,g=this.element,f;a&&(this.parentGroup=a);this.parentInverted=a&&a.inverted;
|
||||
void 0!==this.textStr&&w.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)f=this.zIndexSetter();f||(a?a.element:w.box).appendChild(g);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var w=a.parentNode;w&&w.removeChild(a)},destroy:function(){var a=this.element||{},g=this.renderer.isSVG&&"SPAN"===a.nodeName&&this.parentGroup,f,b;a.onclick=a.onmouseout=a.onmouseover=a.onmousemove=a.point=null;D(this);this.clipPath&&(this.clipPath=this.clipPath.destroy());if(this.stops){for(b=
|
||||
0;b<this.stops.length;b++)this.stops[b]=this.stops[b].destroy();this.stops=null}this.safeRemoveChild(a);for(this.destroyShadows();g&&g.div&&0===g.div.childNodes.length;)a=g.parentGroup,this.safeRemoveChild(g.div),delete g.div,g=a;this.alignTo&&m(this.renderer.alignedObjects,this);for(f in this)delete this[f];return null},shadow:function(a,g,f){var w=[],b,d,c=this.element,q,D,y,x;if(!a)this.destroyShadows();else if(!this.shadows){D=K(a.width,3);y=(a.opacity||.15)/D;x=this.parentInverted?"(-1,-1)":
|
||||
"("+K(a.offsetX,1)+", "+K(a.offsetY,1)+")";for(b=1;b<=D;b++)d=c.cloneNode(0),q=2*D+1-2*b,u(d,{isShadow:"true",stroke:a.color||"#000000","stroke-opacity":y*b,"stroke-width":q,transform:"translate"+x,fill:"none"}),f&&(u(d,"height",Math.max(u(d,"height")-q,0)),d.cutHeight=q),g?g.element.appendChild(d):c.parentNode.insertBefore(d,c),w.push(d);this.shadows=w}return this},destroyShadows:function(){H(this.shadows||[],function(a){this.safeRemoveChild(a)},this);this.shadows=void 0},xGetter:function(a){"circle"===
|
||||
this.element.nodeName&&("x"===a?a="cx":"y"===a&&(a="cy"));return this._defaultGetter(a)},_defaultGetter:function(a){a=K(this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,g,f){a&&a.join&&(a=a.join(" "));/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");f.setAttribute(g,a);this[g]=a},dashstyleSetter:function(a){var w,g=this["stroke-width"];"inherit"===g&&(g=1);if(a=a&&a.toLowerCase()){a=a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot",
|
||||
"3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(w=a.length;w--;)a[w]=L(a[w])*g;a=a.join(",").replace(/NaN/g,"none");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.element.setAttribute("text-anchor",{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a,g,f){this[g]=a;f.setAttribute(g,a)},titleSetter:function(a){var w=this.element.getElementsByTagName("title")[0];
|
||||
w||(w=p.createElementNS(this.SVG_NS,"title"),this.element.appendChild(w));w.firstChild&&w.removeChild(w.firstChild);w.appendChild(p.createTextNode(String(K(a),"").replace(/<[^>]*>/g,"")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,g,f){"string"===typeof a?f.setAttribute(g,a):a&&this.colorGradient(a,g,f)},visibilitySetter:function(a,g,f){"inherit"===a?f.removeAttribute(g):f.setAttribute(g,a)},zIndexSetter:function(a,
|
||||
g){var w=this.renderer,f=this.parentGroup,b=(f||w).element||w.box,d,c=this.element,q;d=this.added;var D;k(a)&&(c.zIndex=a,a=+a,this[g]===a&&(d=!1),this[g]=a);if(d){(a=this.zIndex)&&f&&(f.handleZ=!0);g=b.childNodes;for(D=0;D<g.length&&!q;D++)f=g[D],d=f.zIndex,f!==c&&(L(d)>a||!k(a)&&k(d)||0>a&&!k(d)&&b!==w.box)&&(b.insertBefore(c,f),q=!0);q||b.appendChild(c)}return q},_defaultSetter:function(a,g,f){f.setAttribute(g,a)}};B.prototype.yGetter=B.prototype.xGetter;B.prototype.translateXSetter=B.prototype.translateYSetter=
|
||||
B.prototype.rotationSetter=B.prototype.verticalAlignSetter=B.prototype.scaleXSetter=B.prototype.scaleYSetter=function(a,g){this[g]=a;this.doTransform=!0};B.prototype["stroke-widthSetter"]=B.prototype.strokeSetter=function(a,g,f){this[g]=a;this.stroke&&this["stroke-width"]?(B.prototype.fillSetter.call(this,this.stroke,"stroke",f),f.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0):"stroke-width"===g&&0===a&&this.hasStroke&&(f.removeAttribute("stroke"),this.hasStroke=!1)};z=a.SVGRenderer=
|
||||
function(){this.init.apply(this,arguments)};z.prototype={Element:B,SVG_NS:M,init:function(a,g,b,d,c,D){var w;d=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(d));w=d.element;a.appendChild(w);-1===a.innerHTML.indexOf("xmlns")&&u(w,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=w;this.boxWrapper=d;this.alignedObjects=[];this.url=(f||q)&&p.getElementsByTagName("base").length?N.location.href.replace(/#.*?$/,"").replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,
|
||||
"%20"):"";this.createElement("desc").add().element.appendChild(p.createTextNode("Created with Highcharts 5.0.9"));this.defs=this.createElement("defs").add();this.allowHTML=D;this.forExport=c;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(g,b,!1);var y;f&&a.getBoundingClientRect&&(g=function(){t(a,{left:0,top:0});y=a.getBoundingClientRect();t(a,{left:Math.ceil(y.left)-y.left+"px",top:Math.ceil(y.top)-y.top+"px"})},g(),this.unSubPixelFix=C(N,"resize",g))},getStyle:function(a){return this.style=
|
||||
b({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();c(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var g=new this.Element;
|
||||
g.init(this,a);return g},draw:J,getRadialAttr:function(a,g){return{cx:a[0]-a[2]/2+g.cx*a[2],cy:a[1]-a[2]/2+g.cy*a[2],r:g.r*a[2]}},buildText:function(a){var g=a.element,f=this,w=f.forExport,b=K(a.textStr,"").toString(),c=-1!==b.indexOf("\x3c"),q=g.childNodes,D,y,x,r,G=u(g,"x"),m=a.styles,e=a.textWidth,l=m&&m.lineHeight,v=m&&m.textOutline,k=m&&"ellipsis"===m.textOverflow,h=m&&"nowrap"===m.whiteSpace,F=m&&m.fontSize,A,J=q.length,m=e&&!a.added&&this.box,n=function(a){var w;w=/(px|em)$/.test(a&&a.style.fontSize)?
|
||||
a.style.fontSize:F||f.style.fontSize||12;return l?L(l):f.fontMetrics(w,a.getAttribute("style")?a:g).h};A=[b,k,h,l,v,F,e].join();if(A!==a.textCache){for(a.textCache=A;J--;)g.removeChild(q[J]);c||v||k||e||-1!==b.indexOf(" ")?(D=/<.*class="([^"]+)".*>/,y=/<.*style="([^"]+)".*>/,x=/<.*href="(http[^"]+)".*>/,m&&m.appendChild(g),b=c?b.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(/<a/g,"\x3cspan").replace(/<\/(b|strong|i|em|a)>/g,
|
||||
"\x3c/span\x3e").split(/<br.*?>/g):[b],b=d(b,function(a){return""!==a}),H(b,function(b,d){var c,q=0;b=b.replace(/^\s+|\s+$/g,"").replace(/<span/g,"|||\x3cspan").replace(/<\/span>/g,"\x3c/span\x3e|||");c=b.split("|||");H(c,function(b){if(""!==b||1===c.length){var m={},v=p.createElementNS(f.SVG_NS,"tspan"),l,F;D.test(b)&&(l=b.match(D)[1],u(v,"class",l));y.test(b)&&(F=b.match(y)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),u(v,"style",F));x.test(b)&&!w&&(u(v,"onclick",'location.href\x3d"'+b.match(x)[1]+
|
||||
'"'),t(v,{cursor:"pointer"}));b=(b.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"\x3c").replace(/>/g,"\x3e");if(" "!==b){v.appendChild(p.createTextNode(b));q?m.dx=0:d&&null!==G&&(m.x=G);u(v,m);g.appendChild(v);!q&&d&&(!S&&w&&t(v,{display:"block"}),u(v,"dy",n(v)));if(e){m=b.replace(/([^\^])-/g,"$1- ").split(" ");l=1<c.length||d||1<m.length&&!h;for(var A,H,O=[],J=n(v),K=a.rotation,L=b,P=L.length;(l||k)&&(m.length||O.length);)a.rotation=0,A=a.getBBox(!0),H=A.width,!S&&f.forExport&&(H=f.measureSpanWidth(v.firstChild.data,
|
||||
a.styles)),A=H>e,void 0===r&&(r=A),k&&r?(P/=2,""===L||!A&&.5>P?m=[]:(L=b.substring(0,L.length+(A?-1:1)*Math.ceil(P)),m=[L+(3<e?"\u2026":"")],v.removeChild(v.firstChild))):A&&1!==m.length?(v.removeChild(v.firstChild),O.unshift(m.pop())):(m=O,O=[],m.length&&!h&&(v=p.createElementNS(M,"tspan"),u(v,{dy:J,x:G}),F&&u(v,"style",F),g.appendChild(v)),H>e&&(e=H)),m.length&&v.appendChild(p.createTextNode(m.join(" ").replace(/- /g,"-")));a.rotation=K}q++}}})}),r&&a.attr("title",a.textStr),m&&m.removeChild(g),
|
||||
v&&a.applyTextOutline&&a.applyTextOutline(v)):g.appendChild(p.createTextNode(b.replace(/</g,"\x3c").replace(/>/g,"\x3e")))}},getContrast:function(a){a=n(a).rgba;return 510<a[0]+a[1]+a[2]?"#000000":"#FFFFFF"},button:function(a,g,f,d,c,q,D,m,r){var w=this.label(a,g,f,r,null,null,null,null,"button"),G=0;w.attr(x({padding:8,r:2},c));var e,v,p,l;c=x({fill:"#f7f7f7",stroke:"#cccccc","stroke-width":1,style:{color:"#333333",cursor:"pointer",fontWeight:"normal"}},c);e=c.style;delete c.style;q=x(c,{fill:"#e6e6e6"},
|
||||
q);v=q.style;delete q.style;D=x(c,{fill:"#e6ebf5",style:{color:"#000000",fontWeight:"bold"}},D);p=D.style;delete D.style;m=x(c,{style:{color:"#cccccc"}},m);l=m.style;delete m.style;C(w.element,y?"mouseover":"mouseenter",function(){3!==G&&w.setState(1)});C(w.element,y?"mouseout":"mouseleave",function(){3!==G&&w.setState(G)});w.setState=function(a){1!==a&&(w.state=G=a);w.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+["normal","hover","pressed","disabled"][a||
|
||||
0]);w.attr([c,q,D,m][a||0]).css([e,v,p,l][a||0])};w.attr(c).css(b({cursor:"default"},e));return w.on("click",function(a){3!==G&&d.call(w,a)})},crispLine:function(a,g){a[1]===a[4]&&(a[1]=a[4]=Math.round(a[1])-g%2/2);a[2]===a[5]&&(a[2]=a[5]=Math.round(a[2])+g%2/2);return a},path:function(a){var g={fill:"none"};v(a)?g.d=a:G(a)&&b(g,a);return this.createElement("path").attr(g)},circle:function(a,g,f){a=G(a)?a:{x:a,y:g,r:f};g=this.createElement("circle");g.xSetter=g.ySetter=function(a,g,f){f.setAttribute("c"+
|
||||
g,a)};return g.attr(a)},arc:function(a,g,f,b,d,c){G(a)?(b=a,g=b.y,f=b.r,a=b.x):b={innerR:b,start:d,end:c};a=this.symbol("arc",a,g,f,f,b);a.r=f;return a},rect:function(a,g,f,b,d,c){d=G(a)?a.r:d;var w=this.createElement("rect");a=G(a)?a:void 0===a?{}:{x:a,y:g,width:Math.max(f,0),height:Math.max(b,0)};void 0!==c&&(a.strokeWidth=c,a=w.crisp(a));a.fill="none";d&&(a.r=d);w.rSetter=function(a,g,f){u(f,{rx:a,ry:a})};return w.attr(a)},setSize:function(a,g,f){var b=this.alignedObjects,d=b.length;this.width=
|
||||
a;this.height=g;for(this.boxWrapper.animate({width:a,height:g},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:K(f,!0)?void 0:0});d--;)b[d].align()},g:function(a){var g=this.createElement("g");return a?g.attr({"class":"highcharts-"+a}):g},image:function(a,g,f,d,c){var w={preserveAspectRatio:"none"};1<arguments.length&&b(w,{x:g,y:f,width:d,height:c});w=this.createElement("image").attr(w);w.element.setAttributeNS?w.element.setAttributeNS("http://www.w3.org/1999/xlink",
|
||||
"href",a):w.element.setAttribute("hc-svg-href",a);return w},symbol:function(a,g,f,d,c,q){var w=this,D,y=this.symbols[a],m=k(g)&&y&&this.symbols[a](Math.round(g),Math.round(f),d,c,q),x=/^url\((.*?)\)$/,G,r;y?(D=this.path(m),D.attr("fill","none"),b(D,{symbolName:a,x:g,y:f,width:d,height:c}),q&&b(D,q)):x.test(a)&&(G=a.match(x)[1],D=this.image(G),D.imgwidth=K(R[G]&&R[G].width,q&&q.width),D.imgheight=K(R[G]&&R[G].height,q&&q.height),r=function(){D.attr({width:D.width,height:D.height})},H(["width","height"],
|
||||
function(a){D[a+"Setter"]=function(a,g){var f={},b=this["img"+g],d="width"===g?"translateX":"translateY";this[g]=a;k(b)&&(this.element&&this.element.setAttribute(g,b),this.alignByTranslate||(f[d]=((this[g]||0)-b)/2,this.attr(f)))}}),k(g)&&D.attr({x:g,y:f}),D.isImg=!0,k(D.imgwidth)&&k(D.imgheight)?r():(D.attr({width:0,height:0}),l("img",{onload:function(){var a=h[w.chartIndex];0===this.width&&(t(this,{position:"absolute",top:"-999em"}),p.body.appendChild(this));R[G]={width:this.width,height:this.height};
|
||||
D.imgwidth=this.width;D.imgheight=this.height;D.element&&r();this.parentNode&&this.parentNode.removeChild(this);w.imgCount--;if(!w.imgCount&&a&&a.onload)a.onload()},src:G}),this.imgCount++));return D},symbols:{circle:function(a,g,f,b){return this.arc(a+f/2,g+b/2,f/2,b/2,{start:0,end:2*Math.PI,open:!1})},square:function(a,g,f,b){return["M",a,g,"L",a+f,g,a+f,g+b,a,g+b,"Z"]},triangle:function(a,g,f,b){return["M",a+f/2,g,"L",a+f,g+b,a,g+b,"Z"]},"triangle-down":function(a,g,f,b){return["M",a,g,"L",a+f,
|
||||
g,a+f/2,g+b,"Z"]},diamond:function(a,g,f,b){return["M",a+f/2,g,"L",a+f,g+b/2,a+f/2,g+b,a,g+b/2,"Z"]},arc:function(a,g,f,b,d){var c=d.start,w=d.r||f,q=d.r||b||f,D=d.end-.001;f=d.innerR;b=d.open;var y=Math.cos(c),m=Math.sin(c),x=Math.cos(D),D=Math.sin(D);d=d.end-c<Math.PI?0:1;w=["M",a+w*y,g+q*m,"A",w,q,0,d,1,a+w*x,g+q*D];k(f)&&w.push(b?"M":"L",a+f*x,g+f*D,"A",f,f,0,d,0,a+f*y,g+f*m);w.push(b?"":"Z");return w},callout:function(a,g,f,b,d){var c=Math.min(d&&d.r||0,f,b),q=c+6,D=d&&d.anchorX;d=d&&d.anchorY;
|
||||
var w;w=["M",a+c,g,"L",a+f-c,g,"C",a+f,g,a+f,g,a+f,g+c,"L",a+f,g+b-c,"C",a+f,g+b,a+f,g+b,a+f-c,g+b,"L",a+c,g+b,"C",a,g+b,a,g+b,a,g+b-c,"L",a,g+c,"C",a,g,a,g,a+c,g];D&&D>f?d>g+q&&d<g+b-q?w.splice(13,3,"L",a+f,d-6,a+f+6,d,a+f,d+6,a+f,g+b-c):w.splice(13,3,"L",a+f,b/2,D,d,a+f,b/2,a+f,g+b-c):D&&0>D?d>g+q&&d<g+b-q?w.splice(33,3,"L",a,d+6,a-6,d,a,d-6,a,g+c):w.splice(33,3,"L",a,b/2,D,d,a,b/2,a,g+c):d&&d>b&&D>a+q&&D<a+f-q?w.splice(23,3,"L",D+6,g+b,D,g+b+6,D-6,g+b,a+c,g+b):d&&0>d&&D>a+q&&D<a+f-q&&w.splice(3,
|
||||
3,"L",D-6,g,D,g-6,D+6,g,f-c,g);return w}},clipRect:function(g,f,b,d){var c=a.uniqueKey(),q=this.createElement("clipPath").attr({id:c}).add(this.defs);g=this.rect(g,f,b,d,0).add(q);g.id=c;g.clipPath=q;g.count=0;return g},text:function(a,g,f,b){var d=!S&&this.forExport,c={};if(b&&(this.allowHTML||!this.forExport))return this.html(a,g,f);c.x=Math.round(g||0);f&&(c.y=Math.round(f));if(a||0===a)c.text=a;a=this.createElement("text").attr(c);d&&a.css({position:"absolute"});b||(a.xSetter=function(a,g,f){var b=
|
||||
f.getElementsByTagName("tspan"),d,c=f.getAttribute(g),q;for(q=0;q<b.length;q++)d=b[q],d.getAttribute(g)===c&&d.setAttribute(g,a);f.setAttribute(g,a)});return a},fontMetrics:function(a,g){a=a||g&&g.style&&g.style.fontSize||this.style&&this.style.fontSize;a=/px/.test(a)?L(a):/em/.test(a)?parseFloat(a)*(g?this.fontMetrics(null,g.parentNode).f:16):12;g=24>a?a+3:Math.round(1.2*a);return{h:g,b:Math.round(.8*g),f:a}},rotCorr:function(a,g,f){var b=a;g&&f&&(b=Math.max(b*Math.cos(g*e),4));return{x:-a/3*Math.sin(g*
|
||||
e),y:b}},label:function(f,d,c,q,D,y,m,G,r){var w=this,e=w.g("button"!==r&&"label"),v=e.text=w.text("",0,0,m).attr({zIndex:1}),p,l,F=0,A=3,h=0,J,t,S,n,M,K={},L,u,O=/^url\((.*?)\)$/.test(q),R=O,P,Q,N,U;r&&e.addClass("highcharts-"+r);R=O;P=function(){return(L||0)%2/2};Q=function(){var a=v.element.style,g={};l=(void 0===J||void 0===t||M)&&k(v.textStr)&&v.getBBox();e.width=(J||l.width||0)+2*A+h;e.height=(t||l.height||0)+2*A;u=A+w.fontMetrics(a&&a.fontSize,v).b;R&&(p||(e.box=p=w.symbols[q]||O?w.symbol(q):
|
||||
w.rect(),p.addClass(("button"===r?"":"highcharts-label-box")+(r?" highcharts-"+r+"-box":"")),p.add(e),a=P(),g.x=a,g.y=(G?-u:0)+a),g.width=Math.round(e.width),g.height=Math.round(e.height),p.attr(b(g,K)),K={})};N=function(){var a=h+A,g;g=G?0:u;k(J)&&l&&("center"===M||"right"===M)&&(a+={center:.5,right:1}[M]*(J-l.width));if(a!==v.x||g!==v.y)v.attr("x",a),void 0!==g&&v.attr("y",g);v.x=a;v.y=g};U=function(a,g){p?p.attr(a,g):K[a]=g};e.onAdd=function(){v.add(e);e.attr({text:f||0===f?f:"",x:d,y:c});p&&k(D)&&
|
||||
e.attr({anchorX:D,anchorY:y})};e.widthSetter=function(g){J=a.isNumber(g)?g:null};e.heightSetter=function(a){t=a};e["text-alignSetter"]=function(a){M=a};e.paddingSetter=function(a){k(a)&&a!==A&&(A=e.padding=a,N())};e.paddingLeftSetter=function(a){k(a)&&a!==h&&(h=a,N())};e.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==F&&(F=a,l&&e.attr({x:S}))};e.textSetter=function(a){void 0!==a&&v.textSetter(a);Q();N()};e["stroke-widthSetter"]=function(a,g){a&&(R=!0);L=this["stroke-width"]=a;U(g,a)};
|
||||
e.strokeSetter=e.fillSetter=e.rSetter=function(a,g){"fill"===g&&a&&(R=!0);U(g,a)};e.anchorXSetter=function(a,g){D=a;U(g,Math.round(a)-P()-S)};e.anchorYSetter=function(a,g){y=a;U(g,a-n)};e.xSetter=function(a){e.x=a;F&&(a-=F*((J||l.width)+2*A));S=Math.round(a);e.attr("translateX",S)};e.ySetter=function(a){n=e.y=Math.round(a);e.attr("translateY",n)};var W=e.css;return b(e,{css:function(a){if(a){var g={};a=x(a);H(e.textProps,function(f){void 0!==a[f]&&(g[f]=a[f],delete a[f])});v.css(g)}return W.call(e,
|
||||
a)},getBBox:function(){return{width:l.width+2*A,height:l.height+2*A,x:l.x-A,y:l.y-A}},shadow:function(a){a&&(Q(),p&&p.shadow(a));return e},destroy:function(){g(e.element,"mouseenter");g(e.element,"mouseleave");v&&(v=v.destroy());p&&(p=p.destroy());B.prototype.destroy.call(e);e=w=Q=N=U=null}})}};a.Renderer=z})(I);(function(a){var B=a.attr,z=a.createElement,C=a.css,E=a.defined,u=a.each,h=a.extend,n=a.isFirefox,t=a.isMS,l=a.isWebKit,k=a.pInt,e=a.SVGRenderer,c=a.win,p=a.wrap;h(a.SVGElement.prototype,
|
||||
{htmlCss:function(a){var b=this.element;if(b=a&&"SPAN"===b.tagName&&a.width)delete a.width,this.textWidth=b,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=h(this.styles,a);C(this.element,a);return this},htmlGetBBox:function(){var a=this.element;"text"===a.nodeName&&(a.style.position="absolute");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,
|
||||
b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,p=this.y||0,v=this.textAlign||"left",f={left:0,center:.5,right:1}[v],y=this.styles;C(b,{marginLeft:c,marginTop:d});this.shadows&&u(this.shadows,function(a){C(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&u(b.childNodes,function(f){a.invertChild(f,b)});if("SPAN"===b.tagName){var G=this.rotation,F=k(this.textWidth),q=y&&y.whiteSpace,x=[G,v,b.innerHTML,this.textWidth,this.textAlign].join();x!==this.cTT&&(y=a.fontMetrics(b.style.fontSize).b,
|
||||
E(G)&&this.setSpanRotation(G,f,y),C(b,{width:"",whiteSpace:q||"nowrap"}),b.offsetWidth>F&&/[ \-]/.test(b.textContent||b.innerText)&&C(b,{width:F+"px",display:"block",whiteSpace:q||"normal"}),this.getSpanCorrection(b.offsetWidth,y,f,G,v));C(b,{left:e+(this.xCorr||0)+"px",top:p+(this.yCorr||0)+"px"});l&&(y=b.offsetHeight);this.cTT=x}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,e){var d={},m=t?"-ms-transform":l?"-webkit-transform":n?"MozTransform":c.opera?"-o-transform":"";d[m]=d.transform=
|
||||
"rotate("+a+"deg)";d[m+(n?"Origin":"-origin")]=d.transformOrigin=100*b+"% "+e+"px";C(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});h(e.prototype,{html:function(a,b,c){var d=this.createElement("span"),e=d.element,m=d.renderer,v=m.isSVG,f=function(a,f){u(["opacity","visibility"],function(b){p(a,b+"Setter",function(a,b,d,c){a.call(this,b,d,c);f[d]=b})})};d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=this.textStr=a;d.htmlUpdateTransform()};
|
||||
v&&f(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,f){"align"===f&&(f="textAlign");d[f]=a;d.htmlUpdateTransform()};d.attr({text:a,x:Math.round(b),y:Math.round(c)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});e.style.whiteSpace="nowrap";d.css=d.htmlCss;v&&(d.add=function(a){var b,c=m.box.parentNode,q=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)q.push(a),a=a.parentGroup;u(q.reverse(),function(a){var y,e=B(a.element,
|
||||
"class");e&&(e={className:e});b=a.div=a.div||z("div",e,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},b||c);y=b.style;h(a,{on:function(){d.on.apply({element:q[0].div},arguments);return a},translateXSetter:function(f,g){y.left=f+"px";a[g]=f;a.doTransform=!0},translateYSetter:function(f,g){y.top=f+"px";a[g]=f;a.doTransform=!0}});f(a,y)})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&
|
||||
d.htmlUpdateTransform();return d});return d}})})(I);(function(a){var B,z,C=a.createElement,E=a.css,u=a.defined,h=a.deg2rad,n=a.discardElement,t=a.doc,l=a.each,k=a.erase,e=a.extend;B=a.extendClass;var c=a.isArray,p=a.isNumber,H=a.isObject,b=a.merge;z=a.noop;var m=a.pick,d=a.pInt,r=a.SVGElement,A=a.SVGRenderer,v=a.win;a.svg||(z={docMode8:t&&8===t.documentMode,init:function(a,b){var f=["\x3c",b,' filled\x3d"f" stroked\x3d"f"'],d=["position: ","absolute",";"],c="div"===b;("shape"===b||c)&&d.push("left:0;top:0;width:1px;height:1px;");
|
||||
d.push("visibility: ",c?"hidden":"visible");f.push(' style\x3d"',d.join(""),'"/\x3e');b&&(f=c||"span"===b||"img"===b?f.join(""):a.prepVML(f),this.element=C(f));this.renderer=a},add:function(a){var f=this.renderer,b=this.element,d=f.box,c=a&&a.inverted,d=a?a.element||a:d;a&&(this.parentGroup=a);c&&f.invertChild(b,d);d.appendChild(b);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr("class",this.className);return this},
|
||||
updateTransform:r.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=Math.cos(a*h),d=Math.sin(a*h);E(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11\x3d",b,", M12\x3d",-d,", M21\x3d",d,", M22\x3d",b,", sizingMethod\x3d'auto expand')"].join(""):"none"})},getSpanCorrection:function(a,b,d,c,q){var f=c?Math.cos(c*h):1,e=c?Math.sin(c*h):0,y=m(this.elemHeight,this.element.offsetHeight),r;this.xCorr=0>f&&-a;this.yCorr=0>e&&-y;r=0>f*e;this.xCorr+=e*b*(r?1-
|
||||
d:d);this.yCorr-=f*b*(c?r?d:1-d:1);q&&"left"!==q&&(this.xCorr-=a*d*(0>f?-1:1),c&&(this.yCorr-=y*d*(0>e?-1:1)),E(this.element,{textAlign:q}))},pathToVML:function(a){for(var f=a.length,b=[];f--;)p(a[f])?b[f]=Math.round(10*a[f])-5:"Z"===a[f]?b[f]="x":(b[f]=a[f],!a.isArc||"wa"!==a[f]&&"at"!==a[f]||(b[f+5]===b[f+7]&&(b[f+7]+=a[f+7]>a[f+5]?1:-1),b[f+6]===b[f+8]&&(b[f+8]+=a[f+8]>a[f+6]?1:-1)));return b.join(" ")||"x"},clip:function(a){var f=this,b;a?(b=a.members,k(b,f),b.push(f),f.destroyClip=function(){k(b,
|
||||
f)},a=a.getCSS(f)):(f.destroyClip&&f.destroyClip(),a={clip:f.docMode8?"inherit":"rect(auto)"});return f.css(a)},css:r.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&n(a)},destroy:function(){this.destroyClip&&this.destroyClip();return r.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=v.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var f;a=a.split(/[ ,]/);f=a.length;if(9===f||11===f)a[f-4]=a[f-2]=d(a[f-2])-10*b;return a.join(" ")},
|
||||
shadow:function(a,b,c){var f=[],q,e=this.element,y=this.renderer,r,v=e.style,g,D=e.path,p,l,G,k;D&&"string"!==typeof D.value&&(D="x");l=D;if(a){G=m(a.width,3);k=(a.opacity||.15)/G;for(q=1;3>=q;q++)p=2*G+1-2*q,c&&(l=this.cutOffPath(D.value,p+.5)),g=['\x3cshape isShadow\x3d"true" strokeweight\x3d"',p,'" filled\x3d"false" path\x3d"',l,'" coordsize\x3d"10 10" style\x3d"',e.style.cssText,'" /\x3e'],r=C(y.prepVML(g),null,{left:d(v.left)+m(a.offsetX,1),top:d(v.top)+m(a.offsetY,1)}),c&&(r.cutOff=p+1),g=['\x3cstroke color\x3d"',
|
||||
a.color||"#000000",'" opacity\x3d"',k*q,'"/\x3e'],C(y.prepVML(g),null,null,r),b?b.element.appendChild(r):e.parentNode.insertBefore(r,e),f.push(r);this.shadows=f}return this},updateShadows:z,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,d){(d.getElementsByTagName("stroke")[0]||C(this.renderer.prepVML(["\x3cstroke/\x3e"]),null,null,d))[b]=a||"solid";this[b]=a},dSetter:function(a,
|
||||
b,d){var f=this.shadows;a=a||[];this.d=a.join&&a.join(" ");d.path=a=this.pathToVML(a);if(f)for(d=f.length;d--;)f[d].path=f[d].cutOff?this.cutOffPath(a,f[d].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,d){var f=d.nodeName;"SPAN"===f?d.style.color=a:"IMG"!==f&&(d.filled="none"!==a,this.setAttr("fillcolor",this.renderer.color(a,d,b,this)))},"fill-opacitySetter":function(a,b,d){C(this.renderer.prepVML(["\x3c",b.split("-")[0],' opacity\x3d"',a,'"/\x3e']),null,null,d)},opacitySetter:z,rotationSetter:function(a,
|
||||
b,d){d=d.style;this[b]=d[b]=a;d.left=-Math.round(Math.sin(a*h)+1)+"px";d.top=Math.round(Math.cos(a*h))+"px"},strokeSetter:function(a,b,d){this.setAttr("strokecolor",this.renderer.color(a,d,b,this))},"stroke-widthSetter":function(a,b,d){d.stroked=!!a;this[b]=a;p(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,d){"inherit"===a&&(a="visible");this.shadows&&l(this.shadows,function(f){f.style[b]=a});"DIV"===d.nodeName&&(a="hidden"===
|
||||
a?"-999em":0,this.docMode8||(d.style[b]=a?"visible":"hidden"),b="top");d.style[b]=a},xSetter:function(a,b,d){this[b]=a;"x"===b?b="left":"y"===b&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):d.style[b]=a},zIndexSetter:function(a,b,d){d.style[b]=a}},z["stroke-opacitySetter"]=z["fill-opacitySetter"],a.VMLElement=z=B(r,z),z.prototype.ySetter=z.prototype.widthSetter=z.prototype.heightSetter=z.prototype.xSetter,z={Element:z,isIE8:-1<v.navigator.userAgent.indexOf("MSIE 8.0"),init:function(a,
|
||||
b,d){var f,c;this.alignedObjects=[];f=this.createElement("div").css({position:"relative"});c=f.element;a.appendChild(f.element);this.isVML=!0;this.box=c;this.boxWrapper=f;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(b,d,!1);if(!t.namespaces.hcv){t.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{t.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(x){t.styleSheets[0].cssText+=
|
||||
"hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,d,c){var f=this.createElement(),m=H(a);return e(f,{members:[],count:0,left:(m?a.x:a)+1,top:(m?a.y:b)+1,width:(m?a.width:d)-1,height:(m?a.height:c)-1,getCSS:function(a){var b=a.element,d=b.nodeName,g=a.inverted,f=this.top-("shape"===d?b.offsetTop:0),c=this.left,b=c+this.width,q=f+this.height,f={clip:"rect("+Math.round(g?
|
||||
c:f)+"px,"+Math.round(g?q:b)+"px,"+Math.round(g?b:q)+"px,"+Math.round(g?f:c)+"px)"};!g&&a.docMode8&&"DIV"===d&&e(f,{width:b+"px",height:q+"px"});return f},updateClipping:function(){l(f.members,function(a){a.element&&a.css(f.getCSS(a))})}})},color:function(b,d,c,e){var f=this,m,r=/^rgba/,v,p,g="none";b&&b.linearGradient?p="gradient":b&&b.radialGradient&&(p="pattern");if(p){var D,y,k=b.linearGradient||b.radialGradient,A,h,w,G,t,F="";b=b.stops;var n,H=[],u=function(){v=['\x3cfill colors\x3d"'+H.join(",")+
|
||||
'" opacity\x3d"',w,'" o:opacity2\x3d"',h,'" type\x3d"',p,'" ',F,'focus\x3d"100%" method\x3d"any" /\x3e'];C(f.prepVML(v),null,null,d)};A=b[0];n=b[b.length-1];0<A[0]&&b.unshift([0,A[1]]);1>n[0]&&b.push([1,n[1]]);l(b,function(g,b){r.test(g[1])?(m=a.color(g[1]),D=m.get("rgb"),y=m.get("a")):(D=g[1],y=1);H.push(100*g[0]+"% "+D);b?(w=y,G=D):(h=y,t=D)});if("fill"===c)if("gradient"===p)c=k.x1||k[0]||0,b=k.y1||k[1]||0,A=k.x2||k[2]||0,k=k.y2||k[3]||0,F='angle\x3d"'+(90-180*Math.atan((k-b)/(A-c))/Math.PI)+'"',
|
||||
u();else{var g=k.r,z=2*g,B=2*g,E=k.cx,V=k.cy,I=d.radialReference,T,g=function(){I&&(T=e.getBBox(),E+=(I[0]-T.x)/T.width-.5,V+=(I[1]-T.y)/T.height-.5,z*=I[2]/T.width,B*=I[2]/T.height);F='src\x3d"'+a.getOptions().global.VMLRadialGradientURL+'" size\x3d"'+z+","+B+'" origin\x3d"0.5,0.5" position\x3d"'+E+","+V+'" color2\x3d"'+t+'" ';u()};e.added?g():e.onAdd=g;g=G}else g=D}else r.test(b)&&"IMG"!==d.tagName?(m=a.color(b),e[c+"-opacitySetter"](m.get("a"),c,d),g=m.get("rgb")):(g=d.getElementsByTagName(c),
|
||||
g.length&&(g[0].opacity=1,g[0].type="solid"),g=b);return g},prepVML:function(a){var b=this.isIE8;a=a.join("");b?(a=a.replace("/\x3e",' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'),a=-1===a.indexOf('style\x3d"')?a.replace("/\x3e",' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e'):a.replace('style\x3d"','style\x3d"display:inline-block;behavior:url(#default#VML);')):a=a.replace("\x3c","\x3chcv:");return a},text:A.prototype.html,path:function(a){var b={coordsize:"10 10"};c(a)?b.d=
|
||||
a:H(a)&&e(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,d){var f=this.symbol("circle");H(a)&&(d=a.r,b=a.y,a=a.x);f.isCircle=!0;f.r=d;return f.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement("div").attr(b)},image:function(a,b,d,c,q){var f=this.createElement("img").attr({src:a});1<arguments.length&&f.attr({x:b,y:d,width:c,height:q});return f},createElement:function(a){return"rect"===a?this.symbol(a):A.prototype.createElement.call(this,
|
||||
a)},invertChild:function(a,b){var f=this;b=b.style;var c="IMG"===a.tagName&&a.style;E(a,{flip:"x",left:d(b.width)-(c?d(c.top):1),top:d(b.height)-(c?d(c.left):1),rotation:-90});l(a.childNodes,function(b){f.invertChild(b,a)})},symbols:{arc:function(a,b,d,c,q){var f=q.start,e=q.end,m=q.r||d||c;d=q.innerR;c=Math.cos(f);var r=Math.sin(f),g=Math.cos(e),D=Math.sin(e);if(0===e-f)return["x"];f=["wa",a-m,b-m,a+m,b+m,a+m*c,b+m*r,a+m*g,b+m*D];q.open&&!d&&f.push("e","M",a,b);f.push("at",a-d,b-d,a+d,b+d,a+d*g,
|
||||
b+d*D,a+d*c,b+d*r,"x","e");f.isArc=!0;return f},circle:function(a,b,d,c,q){q&&u(q.r)&&(d=c=2*q.r);q&&q.isCircle&&(a-=d/2,b-=c/2);return["wa",a,b,a+d,b+c,a+d,b+c/2,a+d,b+c/2,"e"]},rect:function(a,b,d,c,q){return A.prototype.symbols[u(q)&&q.r?"callout":"square"].call(0,a,b,d,c,q)}}},a.VMLRenderer=B=function(){this.init.apply(this,arguments)},B.prototype=b(A.prototype,z),a.Renderer=B);A.prototype.measureSpanWidth=function(a,b){var d=t.createElement("span");a=t.createTextNode(a);d.appendChild(a);E(d,
|
||||
b);this.box.appendChild(d);b=d.offsetWidth;n(d);return b}})(I);(function(a){function B(){var l=a.defaultOptions.global,k=t.moment;if(l.timezone){if(k)return function(a){return-k.tz(a,l.timezone).utcOffset()};a.error(25)}return l.useUTC&&l.getTimezoneOffset}function z(){var l=a.defaultOptions.global,k,e=l.useUTC,c=e?"getUTC":"get",p=e?"setUTC":"set";a.Date=k=l.Date||t.Date;k.hcTimezoneOffset=e&&l.timezoneOffset;k.hcGetTimezoneOffset=B();k.hcMakeTime=function(a,b,c,d,r,p){var m;e?(m=k.UTC.apply(0,arguments),
|
||||
m+=u(m)):m=(new k(a,b,n(c,1),n(d,0),n(r,0),n(p,0))).getTime();return m};E("Minutes Hours Day Date Month FullYear".split(" "),function(a){k["hcGet"+a]=c+a});E("Milliseconds Seconds Minutes Hours Date Month FullYear".split(" "),function(a){k["hcSet"+a]=p+a})}var C=a.color,E=a.each,u=a.getTZOffset,h=a.merge,n=a.pick,t=a.win;a.defaultOptions={colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),symbols:["circle","diamond","square","triangle","triangle-down"],
|
||||
lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{useUTC:!0,VMLRadialGradientURL:"http://code.highcharts.com/5.0.9/gfx/vml-radial-gradient.png"},
|
||||
chart:{borderRadius:0,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}},width:null,height:null,borderColor:"#335cad",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"},title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},plotOptions:{},labels:{style:{position:"absolute",color:"#333333"}},legend:{enabled:!0,align:"center",layout:"horizontal",
|
||||
labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{activeColor:"#003399",inactiveColor:"#cccccc"},itemStyle:{color:"#333333",fontSize:"12px",fontWeight:"bold"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#cccccc"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",
|
||||
top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",padding:8,snap:a.isTouchDevice?25:10,backgroundColor:C("#f7f7f7").setOpacity(.85).get(),borderWidth:1,headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',
|
||||
pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',shadow:!0,style:{color:"#333333",cursor:"default",fontSize:"12px",pointerEvents:"none",whiteSpace:"nowrap"}},credits:{enabled:!0,href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"9px"},text:"Highcharts.com"}};a.setOptions=function(l){a.defaultOptions=h(!0,a.defaultOptions,l);z();
|
||||
return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};a.defaultPlotOptions=a.defaultOptions.plotOptions;z()})(I);(function(a){var B=a.arrayMax,z=a.arrayMin,C=a.defined,E=a.destroyObjectProperties,u=a.each,h=a.erase,n=a.merge,t=a.pick;a.PlotLineOrBand=function(a,k){this.axis=a;k&&(this.options=k,this.id=k.id)};a.PlotLineOrBand.prototype={render:function(){var a=this,k=a.axis,e=k.horiz,c=a.options,p=c.label,h=a.label,b=c.to,m=c.from,d=c.value,r=C(m)&&C(b),A=C(d),v=a.svgElem,f=!v,
|
||||
y=[],G,F=c.color,q=t(c.zIndex,0),x=c.events,y={"class":"highcharts-plot-"+(r?"band ":"line ")+(c.className||"")},J={},u=k.chart.renderer,L=r?"bands":"lines",g=k.log2lin;k.isLog&&(m=g(m),b=g(b),d=g(d));A?(y={stroke:F,"stroke-width":c.width},c.dashStyle&&(y.dashstyle=c.dashStyle)):r&&(F&&(y.fill=F),c.borderWidth&&(y.stroke=c.borderColor,y["stroke-width"]=c.borderWidth));J.zIndex=q;L+="-"+q;(F=k[L])||(k[L]=F=u.g("plot-"+L).attr(J).add());f&&(a.svgElem=v=u.path().attr(y).add(F));if(A)y=k.getPlotLinePath(d,
|
||||
v.strokeWidth());else if(r)y=k.getPlotBandPath(m,b,c);else return;if(f&&y&&y.length){if(v.attr({d:y}),x)for(G in c=function(b){v.on(b,function(g){x[b].apply(a,[g])})},x)c(G)}else v&&(y?(v.show(),v.animate({d:y})):(v.hide(),h&&(a.label=h=h.destroy())));p&&C(p.text)&&y&&y.length&&0<k.width&&0<k.height&&!y.flat?(p=n({align:e&&r&&"center",x:e?!r&&4:10,verticalAlign:!e&&r&&"middle",y:e?r?16:10:r?6:-4,rotation:e&&!r&&90},p),this.renderLabel(p,y,r,q)):h&&h.hide();return a},renderLabel:function(a,k,e,c){var p=
|
||||
this.label,l=this.axis.chart.renderer;p||(p={align:a.textAlign||a.align,rotation:a.rotation,"class":"highcharts-plot-"+(e?"band":"line")+"-label "+(a.className||"")},p.zIndex=c,this.label=p=l.text(a.text,0,0,a.useHTML).attr(p).add(),p.css(a.style));c=[k[1],k[4],e?k[6]:k[1]];k=[k[2],k[5],e?k[7]:k[2]];e=z(c);l=z(k);p.align(a,!1,{x:e,y:l,width:B(c)-e,height:B(k)-l});p.show()},destroy:function(){h(this.axis.plotLinesAndBands,this);delete this.axis;E(this)}};a.AxisPlotLineOrBandExtension={getPlotBandPath:function(a,
|
||||
k){k=this.getPlotLinePath(k,null,null,!0);(a=this.getPlotLinePath(a,null,null,!0))&&k?(a.flat=a.toString()===k.toString(),a.push(k[4],k[5],k[1],k[2],"z")):a=null;return a},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(l,k){var e=(new a.PlotLineOrBand(this,l)).render(),c=this.userOptions;e&&(k&&(c[k]=c[k]||[],c[k].push(l)),this.plotLinesAndBands.push(e));return e},removePlotBandOrLine:function(a){for(var k=
|
||||
this.plotLinesAndBands,e=this.options,c=this.userOptions,p=k.length;p--;)k[p].id===a&&k[p].destroy();u([e.plotLines||[],c.plotLines||[],e.plotBands||[],c.plotBands||[]],function(c){for(p=c.length;p--;)c[p].id===a&&h(c,c[p])})}}})(I);(function(a){var B=a.correctFloat,z=a.defined,C=a.destroyObjectProperties,E=a.isNumber,u=a.merge,h=a.pick,n=a.deg2rad;a.Tick=function(a,l,k,e){this.axis=a;this.pos=l;this.type=k||"";this.isNew=!0;k||e||this.addLabel()};a.Tick.prototype={addLabel:function(){var a=this.axis,
|
||||
l=a.options,k=a.chart,e=a.categories,c=a.names,p=this.pos,n=l.labels,b=a.tickPositions,m=p===b[0],d=p===b[b.length-1],c=e?h(e[p],c[p],p):p,e=this.label,b=b.info,r;a.isDatetimeAxis&&b&&(r=l.dateTimeLabelFormats[b.higherRanks[p]||b.unitName]);this.isFirst=m;this.isLast=d;l=a.labelFormatter.call({axis:a,chart:k,isFirst:m,isLast:d,dateTimeLabelFormat:r,value:a.isLog?B(a.lin2log(c)):c});z(e)?e&&e.attr({text:l}):(this.labelLength=(this.label=e=z(l)&&n.enabled?k.renderer.text(l,0,0,n.useHTML).css(u(n.style)).add(a.labelGroup):
|
||||
null)&&e.getBBox().width,this.rotation=0)},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0},handleOverflow:function(a){var l=this.axis,k=a.x,e=l.chart.chartWidth,c=l.chart.spacing,p=h(l.labelLeft,Math.min(l.pos,c[3])),c=h(l.labelRight,Math.max(l.pos+l.len,e-c[1])),t=this.label,b=this.rotation,m={left:0,center:.5,right:1}[l.labelAlign],d=t.getBBox().width,r=l.getSlotWidth(),A=r,v=1,f,y={};if(b)0>b&&k-m*d<p?f=Math.round(k/Math.cos(b*n)-p):0<b&&k+m*
|
||||
d>c&&(f=Math.round((e-k)/Math.cos(b*n)));else if(e=k+(1-m)*d,k-m*d<p?A=a.x+A*(1-m)-p:e>c&&(A=c-a.x+A*m,v=-1),A=Math.min(r,A),A<r&&"center"===l.labelAlign&&(a.x+=v*(r-A-m*(r-Math.min(d,A)))),d>A||l.autoRotation&&(t.styles||{}).width)f=A;f&&(y.width=f,(l.options.labels.style||{}).textOverflow||(y.textOverflow="ellipsis"),t.css(y))},getPosition:function(a,l,k,e){var c=this.axis,p=c.chart,h=e&&p.oldChartHeight||p.chartHeight;return{x:a?c.translate(l+k,null,null,e)+c.transB:c.left+c.offset+(c.opposite?
|
||||
(e&&p.oldChartWidth||p.chartWidth)-c.right-c.left:0),y:a?h-c.bottom+c.offset-(c.opposite?c.height:0):h-c.translate(l+k,null,null,e)-c.transB}},getLabelPosition:function(a,h,k,e,c,p,H,b){var m=this.axis,d=m.transA,r=m.reversed,l=m.staggerLines,v=m.tickRotCorr||{x:0,y:0},f=c.y;z(f)||(f=0===m.side?k.rotation?-8:-k.getBBox().height:2===m.side?v.y+8:Math.cos(k.rotation*n)*(v.y-k.getBBox(!1,0).height/2));a=a+c.x+v.x-(p&&e?p*d*(r?-1:1):0);h=h+f-(p&&!e?p*d*(r?1:-1):0);l&&(k=H/(b||1)%l,m.opposite&&(k=l-k-
|
||||
1),h+=m.labelOffset/l*k);return{x:a,y:Math.round(h)}},getMarkPath:function(a,h,k,e,c,p){return p.crispLine(["M",a,h,"L",a+(c?0:-k),h+(c?k:0)],e)},renderGridLine:function(a,h,k){var e=this.axis,c=e.options,p=this.gridLine,l={},b=this.pos,m=this.type,d=e.tickmarkOffset,r=e.chart.renderer,A=m?m+"Grid":"grid",v=c[A+"LineWidth"],f=c[A+"LineColor"],c=c[A+"LineDashStyle"];p||(l.stroke=f,l["stroke-width"]=v,c&&(l.dashstyle=c),m||(l.zIndex=1),a&&(l.opacity=0),this.gridLine=p=r.path().attr(l).addClass("highcharts-"+
|
||||
(m?m+"-":"")+"grid-line").add(e.gridGroup));if(!a&&p&&(a=e.getPlotLinePath(b+d,p.strokeWidth()*k,a,!0)))p[this.isNew?"attr":"animate"]({d:a,opacity:h})},renderMark:function(a,l,k){var e=this.axis,c=e.options,p=e.chart.renderer,n=this.type,b=n?n+"Tick":"tick",m=e.tickSize(b),d=this.mark,r=!d,A=a.x;a=a.y;var v=h(c[b+"Width"],!n&&e.isXAxis?1:0),c=c[b+"Color"];m&&(e.opposite&&(m[0]=-m[0]),r&&(this.mark=d=p.path().addClass("highcharts-"+(n?n+"-":"")+"tick").add(e.axisGroup),d.attr({stroke:c,"stroke-width":v})),
|
||||
d[r?"attr":"animate"]({d:this.getMarkPath(A,a,m[0],d.strokeWidth()*k,e.horiz,p),opacity:l}))},renderLabel:function(a,l,k,e){var c=this.axis,p=c.horiz,n=c.options,b=this.label,m=n.labels,d=m.step,r=c.tickmarkOffset,A=!0,v=a.x;a=a.y;b&&E(v)&&(b.xy=a=this.getLabelPosition(v,a,b,p,m,r,e,d),this.isFirst&&!this.isLast&&!h(n.showFirstLabel,1)||this.isLast&&!this.isFirst&&!h(n.showLastLabel,1)?A=!1:!p||c.isRadial||m.step||m.rotation||l||0===k||this.handleOverflow(a),d&&e%d&&(A=!1),A&&E(a.y)?(a.opacity=k,
|
||||
b[this.isNew?"attr":"animate"](a)):b.attr("y",-9999),this.isNew=!1)},render:function(a,l,k){var e=this.axis,c=e.horiz,p=this.getPosition(c,this.pos,e.tickmarkOffset,l),n=p.x,b=p.y,e=c&&n===e.pos+e.len||!c&&b===e.pos?-1:1;k=h(k,1);this.isActive=!0;this.renderGridLine(l,k,e);this.renderMark(p,k,e);this.renderLabel(p,l,k,a)},destroy:function(){C(this,this.axis)}}})(I);(function(a){var B=a.addEvent,z=a.animObject,C=a.arrayMax,E=a.arrayMin,u=a.AxisPlotLineOrBandExtension,h=a.color,n=a.correctFloat,t=a.defaultOptions,
|
||||
l=a.defined,k=a.deg2rad,e=a.destroyObjectProperties,c=a.each,p=a.extend,H=a.fireEvent,b=a.format,m=a.getMagnitude,d=a.grep,r=a.inArray,A=a.isArray,v=a.isNumber,f=a.isString,y=a.merge,G=a.normalizeTickInterval,F=a.pick,q=a.PlotLineOrBand,x=a.removeEvent,J=a.splat,K=a.syncTimeout,L=a.Tick;a.Axis=function(){this.init.apply(this,arguments)};a.Axis.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",
|
||||
year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb",lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},
|
||||
defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],
|
||||
x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,b){var g=b.isX;this.chart=a;this.horiz=a.inverted?!g:g;this.isXAxis=g;this.coll=this.coll||(g?"xAxis":"yAxis");this.opposite=b.opposite;this.side=b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,c=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=
|
||||
!1!==d.visible;this.zoomEnabled=!1!==d.zoomEnabled;this.hasNames="category"===c||!0===d.categories;this.categories=d.categories||this.hasNames;this.names=this.names||[];this.isLog="logarithmic"===c;this.isDatetimeAxis="datetime"===c;this.positiveValuesOnly=this.isLog&&!this.allowNegativeLog;this.isLinked=l(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;
|
||||
this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=F(d.crosshair,J(a.options.tooltip.crosshairs)[g?0:1],!1);var f;b=this.options.events;-1===r(this,a.axes)&&(g?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&g&&void 0===this.reversed&&(this.reversed=!0);this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in b)B(this,f,b[f]);this.lin2log=d.linearToLogConverter||
|
||||
this.lin2log;this.isLog&&(this.val2lin=this.log2lin,this.lin2val=this.lin2log)},setOptions:function(a){this.options=y(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],y(t[this.coll],a))},defaultLabelFormatter:function(){var g=this.axis,d=this.value,c=g.categories,f=this.dateTimeLabelFormat,q=t.lang,e=q.numericSymbols,q=q.numericSymbolMagnitude||1E3,w=e&&e.length,
|
||||
m,r=g.options.labels.format,g=g.isLog?Math.abs(d):g.tickInterval;if(r)m=b(r,this);else if(c)m=d;else if(f)m=a.dateFormat(f,d);else if(w&&1E3<=g)for(;w--&&void 0===m;)c=Math.pow(q,w+1),g>=c&&0===10*d%c&&null!==e[w]&&0!==d&&(m=a.numberFormat(d/c,-1)+e[w]);void 0===m&&(m=1E4<=Math.abs(d)?a.numberFormat(d,-1):a.numberFormat(d,-1,void 0,""));return m},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();
|
||||
c(a.series,function(g){if(g.visible||!b.options.chart.ignoreHiddenSeries){var c=g.options,f=c.threshold,q;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=f&&(f=null);if(a.isXAxis)c=g.xData,c.length&&(g=E(c),v(g)||g instanceof Date||(c=d(c,function(a){return v(a)}),g=E(c)),a.dataMin=Math.min(F(a.dataMin,c[0]),g),a.dataMax=Math.max(F(a.dataMax,c[0]),C(c)));else if(g.getExtremes(),q=g.dataMax,g=g.dataMin,l(g)&&l(q)&&(a.dataMin=Math.min(F(a.dataMin,g),g),a.dataMax=Math.max(F(a.dataMax,q),q)),l(f)&&(a.threshold=
|
||||
f),!c.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})},translate:function(a,b,d,c,f,q){var g=this.linkedParent||this,D=1,e=0,m=c?g.oldTransA:g.transA;c=c?g.oldMin:g.min;var r=g.minPixelPadding;f=(g.isOrdinal||g.isBroken||g.isLog&&f)&&g.lin2val;m||(m=g.transA);d&&(D*=-1,e=g.len);g.reversed&&(D*=-1,e-=D*(g.sector||g.len));b?(a=(a*D+e-r)/m+c,f&&(a=g.lin2val(a))):(f&&(a=g.val2lin(a)),a=D*(a-c)*m+e+D*r+(v(q)?m*q:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,
|
||||
!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,c,f){var g=this.chart,q=this.left,D=this.top,e,m,r=d&&g.oldChartHeight||g.chartHeight,p=d&&g.oldChartWidth||g.chartWidth,x;e=this.transB;var k=function(a,b,g){if(a<b||a>g)c?a=Math.min(Math.max(b,a),g):x=!0;return a};f=F(f,this.translate(a,null,null,d));a=d=Math.round(f+e);e=m=Math.round(r-f-e);v(f)?this.horiz?(e=D,m=r-this.bottom,a=d=k(a,q,q+this.width)):(a=q,d=
|
||||
p-this.right,e=m=k(e,D,D+this.height)):x=!0;return x&&!c?null:g.renderer.crispLine(["M",a,e,"L",d,m],b||1)},getLinearTickPositions:function(a,b,d){var g,c=n(Math.floor(b/a)*a);d=n(Math.ceil(d/a)*a);var f=[];if(this.single)return[b];for(b=c;b<=d;){f.push(b);b=n(b+a);if(b===g)break;g=b}return f},getMinorTickPositions:function(){var a=this,b=a.options,d=a.tickPositions,f=a.minorTickInterval,q=[],e=a.pointRangePadding||0,m=a.min-e,e=a.max+e,r=e-m;if(r&&r/f<a.len/3)if(a.isLog)c(this.paddedTicks,function(b,
|
||||
g,d){g&&q.push.apply(q,a.getLogTickPositions(f,d[g-1],d[g],!0))});else if(a.isDatetimeAxis&&"auto"===b.minorTickInterval)q=q.concat(a.getTimeTicks(a.normalizeTimeTickInterval(f),m,e,b.startOfWeek));else for(b=m+(d[0]-m)%f;b<=e&&b!==q[0];b+=f)q.push(b);0!==q.length&&a.trimTicks(q);return q},adjustForMinRange:function(){var a=this.options,b=this.min,d=this.max,f,q=this.dataMax-this.dataMin>=this.minRange,e,m,r,p,v,x;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(l(a.min)||l(a.max)?this.minRange=
|
||||
null:(c(this.series,function(a){p=a.xData;for(m=v=a.xIncrement?1:p.length-1;0<m;m--)if(r=p[m]-p[m-1],void 0===e||r<e)e=r}),this.minRange=Math.min(5*e,this.dataMax-this.dataMin)));d-b<this.minRange&&(x=this.minRange,f=(x-d+b)/2,f=[b-f,F(a.min,b-f)],q&&(f[2]=this.isLog?this.log2lin(this.dataMin):this.dataMin),b=C(f),d=[b+x,F(a.max,b+x)],q&&(d[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),d=E(d),d-b<x&&(f[0]=d-x,f[1]=F(a.min,d-x),b=C(f)));this.min=b;this.max=d},getClosest:function(){var a;this.categories?
|
||||
a=1:c(this.series,function(b){var g=b.closestPointRange,d=b.visible||!b.chart.options.chart.ignoreHiddenSeries;!b.noSharedTooltip&&l(g)&&d&&(a=l(a)?Math.min(a,g):g)});return a},nameToX:function(a){var b=A(this.categories),g=b?this.categories:this.names,d=a.options.x,c;a.series.requireSorting=!1;l(d)||(d=!1===this.options.uniqueNames?a.series.autoIncrement():r(a.name,g));-1===d?b||(c=g.length):c=d;this.names[c]=a.name;return c},updateNames:function(){var a=this;0<this.names.length&&(this.names.length=
|
||||
0,this.minRange=void 0,c(this.series||[],function(b){b.xIncrement=null;if(!b.points||b.isDirtyData)b.processData(),b.generatePoints();c(b.points,function(g,d){var c;g.options&&(c=a.nameToX(g),c!==g.x&&(g.x=c,b.xData[d]=c))})}))},setAxisTranslation:function(a){var b=this,g=b.max-b.min,d=b.axisPointRange||0,q,e=0,m=0,r=b.linkedParent,p=!!b.categories,v=b.transA,x=b.isXAxis;if(x||p||d)q=b.getClosest(),r?(e=r.minPointOffset,m=r.pointRangePadding):c(b.series,function(a){var g=p?1:x?F(a.options.pointRange,
|
||||
q,0):b.axisPointRange||0;a=a.options.pointPlacement;d=Math.max(d,g);b.single||(e=Math.max(e,f(a)?0:g/2),m=Math.max(m,"on"===a?0:g))}),r=b.ordinalSlope&&q?b.ordinalSlope/q:1,b.minPointOffset=e*=r,b.pointRangePadding=m*=r,b.pointRange=Math.min(d,g),x&&(b.closestPointRange=q);a&&(b.oldTransA=v);b.translationSlope=b.transA=v=b.options.staticScale||b.len/(g+m||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=v*e},minFromRange:function(){return this.max-this.range},setTickInterval:function(b){var g=
|
||||
this,d=g.chart,f=g.options,q=g.isLog,e=g.log2lin,r=g.isDatetimeAxis,p=g.isXAxis,x=g.isLinked,k=f.maxPadding,h=f.minPadding,y=f.tickInterval,A=f.tickPixelInterval,J=g.categories,t=g.threshold,u=g.softThreshold,L,K,z,B;r||J||x||this.getTickAmount();z=F(g.userMin,f.min);B=F(g.userMax,f.max);x?(g.linkedParent=d[g.coll][f.linkedTo],d=g.linkedParent.getExtremes(),g.min=F(d.min,d.dataMin),g.max=F(d.max,d.dataMax),f.type!==g.linkedParent.options.type&&a.error(11,1)):(!u&&l(t)&&(g.dataMin>=t?(L=t,h=0):g.dataMax<=
|
||||
t&&(K=t,k=0)),g.min=F(z,L,g.dataMin),g.max=F(B,K,g.dataMax));q&&(g.positiveValuesOnly&&!b&&0>=Math.min(g.min,F(g.dataMin,g.min))&&a.error(10,1),g.min=n(e(g.min),15),g.max=n(e(g.max),15));g.range&&l(g.max)&&(g.userMin=g.min=z=Math.max(g.min,g.minFromRange()),g.userMax=B=g.max,g.range=null);H(g,"foundExtremes");g.beforePadding&&g.beforePadding();g.adjustForMinRange();!(J||g.axisPointRange||g.usePercentage||x)&&l(g.min)&&l(g.max)&&(e=g.max-g.min)&&(!l(z)&&h&&(g.min-=e*h),!l(B)&&k&&(g.max+=e*k));v(f.floor)?
|
||||
g.min=Math.max(g.min,f.floor):v(f.softMin)&&(g.min=Math.min(g.min,f.softMin));v(f.ceiling)?g.max=Math.min(g.max,f.ceiling):v(f.softMax)&&(g.max=Math.max(g.max,f.softMax));u&&l(g.dataMin)&&(t=t||0,!l(z)&&g.min<t&&g.dataMin>=t?g.min=t:!l(B)&&g.max>t&&g.dataMax<=t&&(g.max=t));g.tickInterval=g.min===g.max||void 0===g.min||void 0===g.max?1:x&&!y&&A===g.linkedParent.options.tickPixelInterval?y=g.linkedParent.tickInterval:F(y,this.tickAmount?(g.max-g.min)/Math.max(this.tickAmount-1,1):void 0,J?1:(g.max-
|
||||
g.min)*A/Math.max(g.len,A));p&&!b&&c(g.series,function(a){a.processData(g.min!==g.oldMin||g.max!==g.oldMax)});g.setAxisTranslation(!0);g.beforeSetTickPositions&&g.beforeSetTickPositions();g.postProcessTickInterval&&(g.tickInterval=g.postProcessTickInterval(g.tickInterval));g.pointRange&&!y&&(g.tickInterval=Math.max(g.pointRange,g.tickInterval));b=F(f.minTickInterval,g.isDatetimeAxis&&g.closestPointRange);!y&&g.tickInterval<b&&(g.tickInterval=b);r||q||y||(g.tickInterval=G(g.tickInterval,null,m(g.tickInterval),
|
||||
F(f.allowDecimals,!(.5<g.tickInterval&&5>g.tickInterval&&1E3<g.max&&9999>g.max)),!!this.tickAmount));this.tickAmount||(g.tickInterval=g.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,d=a.tickPositions,c=a.tickPositioner,f=a.startOnTick,q=a.endOnTick;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.single=
|
||||
this.min===this.max&&l(this.min)&&!this.tickAmount&&!1!==a.allowDecimals;this.tickPositions=b=d&&d.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,c&&(c=c.apply(this,
|
||||
[this.min,this.max])))&&(this.tickPositions=b=c);this.paddedTicks=b.slice(0);this.trimTicks(b,f,q);this.isLinked||(this.single&&(this.min-=.5,this.max+=.5),d||c||this.adjustTickAmount())},trimTicks:function(a,b,d){var g=a[0],c=a[a.length-1],f=this.minPointOffset||0;if(!this.isLinked){if(b)this.min=g;else for(;this.min-f>a[0];)a.shift();if(d)this.max=c;else for(;this.max+f<a[a.length-1];)a.pop();0===a.length&&l(g)&&a.push((c+g)/2)}},alignToOthers:function(){var a={},b,d=this.options;!1===this.chart.options.chart.alignTicks||
|
||||
!1===d.alignTicks||this.isLog||c(this.chart[this.coll],function(g){var d=g.options,d=[g.horiz?d.left:d.top,d.width,d.height,d.pane].join();g.series.length&&(a[d]?b=!0:a[d]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,d=a.tickPixelInterval;!l(a.tickInterval)&&this.len<d&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=Math.ceil(this.len/d)+1);4>b&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=
|
||||
this.tickInterval,b=this.tickPositions,d=this.tickAmount,c=this.finalTickAmt,f=b&&b.length;if(f<d){for(;b.length<d;)b.push(n(b[b.length-1]+a));this.transA*=(f-1)/(d-1);this.max=b[b.length-1]}else f>d&&(this.tickInterval*=2,this.setTickPositions());if(l(c)){for(a=d=b.length;a--;)(3===c&&1===a%2||2>=c&&0<a&&a<d-1)&&b.splice(a,1);this.finalTickAmt=void 0}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;
|
||||
c(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()?(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax)):this.cleanStacks&&this.cleanStacks()},setExtremes:function(a,
|
||||
b,d,f,q){var g=this,e=g.chart;d=F(d,!0);c(g.series,function(a){delete a.kdTree});q=p(q,{min:a,max:b});H(g,"setExtremes",q,function(){g.userMin=a;g.userMax=b;g.eventArgs=q;d&&e.redraw(f)})},zoom:function(a,b){var g=this.dataMin,d=this.dataMax,c=this.options,f=Math.min(g,F(c.min,g)),c=Math.max(d,F(c.max,d));if(a!==this.min||b!==this.max)this.allowZoomOutside||(l(g)&&(a<f&&(a=f),a>c&&(a=c)),l(d)&&(b<f&&(b=f),b>c&&(b=c))),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});
|
||||
return!0},setAxisSize:function(){var a=this.chart,b=this.options,d=b.offsets||[0,0,0,0],c=this.horiz,f=F(b.width,a.plotWidth-d[3]+d[1]),q=F(b.height,a.plotHeight-d[0]+d[2]),e=F(b.top,a.plotTop+d[0]),b=F(b.left,a.plotLeft+d[3]),d=/%$/;d.test(q)&&(q=Math.round(parseFloat(q)/100*a.plotHeight));d.test(e)&&(e=Math.round(parseFloat(e)/100*a.plotHeight+a.plotTop));this.left=b;this.top=e;this.width=f;this.height=q;this.bottom=a.chartHeight-q-e;this.right=a.chartWidth-f-b;this.len=Math.max(c?f:q,0);this.pos=
|
||||
c?b:e},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?n(b(this.min)):this.min,max:a?n(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,g=this.lin2log,d=b?g(this.min):this.min,b=b?g(this.max):this.max;null===a?a=d:d>a?a=d:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(F(a,0)-90*this.side+720)%360;return 15<a&&165>a?"right":195<a&&345>a?"left":"center"},
|
||||
tickSize:function(a){var b=this.options,g=b[a+"Length"],d=F(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&g)return"inside"===b[a+"Position"]&&(g=-g),[g,d]},labelMetrics:function(){return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,this.ticks[0]&&this.ticks[0].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,d=this.tickInterval,f=d,q=this.len/(((this.categories?1:0)+this.max-this.min)/d),e,m=a.rotation,r=this.labelMetrics(),p,x=
|
||||
Number.MAX_VALUE,v,h=function(a){a/=q||1;a=1<a?Math.ceil(a):1;return a*d};b?(v=!a.staggerLines&&!a.step&&(l(m)?[m]:q<F(a.autoRotationLimit,80)&&a.autoRotation))&&c(v,function(a){var b;if(a===m||a&&-90<=a&&90>=a)p=h(Math.abs(r.h/Math.sin(k*a))),b=p+Math.abs(a/360),b<x&&(x=b,e=a,f=p)}):a.step||(f=h(r.h));this.autoRotation=v;this.labelRotation=F(e,m);return f},getSlotWidth:function(){var a=this.chart,b=this.horiz,d=this.options.labels,c=Math.max(this.tickPositions.length-(this.categories?0:1),1),f=a.margin[3];
|
||||
return b&&2>(d.step||0)&&!d.rotation&&(this.staggerLines||1)*this.len/c||!b&&(f&&f-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,d=this.tickPositions,q=this.ticks,e=this.options.labels,m=this.horiz,r=this.getSlotWidth(),p=Math.max(1,Math.round(r-2*(e.padding||5))),x={},v=this.labelMetrics(),k=e.style&&e.style.textOverflow,h,l=0,A,n;f(e.rotation)||(x.rotation=e.rotation||0);c(d,function(a){(a=q[a])&&a.labelLength>l&&(l=a.labelLength)});this.maxLabelLength=
|
||||
l;if(this.autoRotation)l>p&&l>v.h?x.rotation=this.labelRotation:this.labelRotation=0;else if(r&&(h={width:p+"px"},!k))for(h.textOverflow="clip",A=d.length;!m&&A--;)if(n=d[A],p=q[n].label)p.styles&&"ellipsis"===p.styles.textOverflow?p.css({textOverflow:"clip"}):q[n].labelLength>r&&p.css({width:r+"px"}),p.getBBox().height>this.len/d.length-(v.h-v.f)&&(p.specCss={textOverflow:"ellipsis"});x.rotation&&(h={width:(l>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+"px"},k||(h.textOverflow="ellipsis"));
|
||||
if(this.labelAlign=e.align||this.autoLabelAlign(this.labelRotation))x.align=this.labelAlign;c(d,function(a){var b=(a=q[a])&&a.label;b&&(b.attr(x),h&&b.css(y(h,b.specCss)),delete b.specCss,a.rotation=x.rotation)});this.tickRotCorr=b.rotCorr(v.b,this.labelRotation||0,0!==this.side)},hasData:function(){return this.hasVisibleSeries||l(this.min)&&l(this.max)&&!!this.tickPositions},addTitle:function(a){var b=this.chart.renderer,d=this.horiz,g=this.opposite,c=this.options.title,f;this.axisTitle||((f=c.textAlign)||
|
||||
(f=(d?{low:"left",middle:"center",high:"right"}:{low:g?"right":"left",middle:"center",high:g?"left":"right"})[c.align]),this.axisTitle=b.text(c.text,0,0,c.useHTML).attr({zIndex:7,rotation:c.rotation||0,align:f}).addClass("highcharts-axis-title").css(c.style).add(this.axisGroup),this.axisTitle.isNew=!0);this.axisTitle[a?"show":"hide"](!0)},generateTick:function(a){var b=this.ticks;b[a]?b[a].addLabel():b[a]=new L(this,a)},getOffset:function(){var a=this,b=a.chart,d=b.renderer,f=a.options,q=a.tickPositions,
|
||||
e=a.ticks,m=a.horiz,r=a.side,p=b.inverted?[1,0,3,2][r]:r,x,v,h=0,k,y=0,A=f.title,n=f.labels,G=0,J=b.axisOffset,b=b.clipOffset,t=[-1,1,1,-1][r],u,H=f.className,L=a.axisParent,K=this.tickSize("tick");x=a.hasData();a.showAxis=v=x||F(f.showEmpty,!0);a.staggerLines=a.horiz&&n.staggerLines;a.axisGroup||(a.gridGroup=d.g("grid").attr({zIndex:f.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(H||"")).add(L),a.axisGroup=d.g("axis").attr({zIndex:f.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+
|
||||
" "+(H||"")).add(L),a.labelGroup=d.g("axis-labels").attr({zIndex:n.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(H||"")).add(L));if(x||a.isLinked)c(q,function(b,d){a.generateTick(b,d)}),a.renderUnsquish(),!1===n.reserveSpace||0!==r&&2!==r&&{1:"left",3:"right"}[r]!==a.labelAlign&&"center"!==a.labelAlign||c(q,function(a){G=Math.max(e[a].getLabelSize(),G)}),a.staggerLines&&(G*=a.staggerLines,a.labelOffset=G*(a.opposite?-1:1));else for(u in e)e[u].destroy(),delete e[u];A&&A.text&&
|
||||
!1!==A.enabled&&(a.addTitle(v),v&&(h=a.axisTitle.getBBox()[m?"height":"width"],k=A.offset,y=l(k)?0:F(A.margin,m?5:10)));a.renderLine();a.offset=t*F(f.offset,J[r]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};d=0===r?-a.labelMetrics().h:2===r?a.tickRotCorr.y:0;y=Math.abs(G)+y;G&&(y=y-d+t*(m?F(n.y,a.tickRotCorr.y+8*t):n.x));a.axisTitleMargin=F(k,y);J[r]=Math.max(J[r],a.axisTitleMargin+h+t*a.offset,y,x&&q.length&&K?K[0]+t*a.offset:0);f=f.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[p]=Math.max(b[p],
|
||||
f)},getLinePath:function(a){var b=this.chart,d=this.opposite,g=this.offset,f=this.horiz,c=this.left+(d?this.width:0)+g,g=b.chartHeight-this.bottom-(d?this.height:0)+g;d&&(a*=-1);return b.renderer.crispLine(["M",f?this.left:c,f?g:this.top,"L",f?b.chartWidth-this.right:c,f?g:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,
|
||||
zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,d=this.top,f=this.len,c=this.options.title,q=a?b:d,e=this.opposite,m=this.offset,r=c.x||0,p=c.y||0,x=this.chart.renderer.fontMetrics(c.style&&c.style.fontSize,this.axisTitle).f,f={low:q+(a?0:f),middle:q+f/2,high:q+(a?f:0)}[c.align],b=(a?d+this.height:b)+(a?1:-1)*(e?-1:1)*this.axisTitleMargin+(2===this.side?x:0);return{x:a?f+r:b+(e?this.width:0)+m+r,y:a?b+p-(e?this.height:0)+m:f+p}},renderMinorTick:function(a){var b=this.chart.hasRendered&&
|
||||
v(this.oldMin),d=this.minorTicks;d[a]||(d[a]=new L(this,a,"minor"));b&&d[a].isNew&&d[a].render(null,!0);d[a].render(null,!1,1)},renderTick:function(a,b){var d=this.isLinked,g=this.ticks,f=this.chart.hasRendered&&v(this.oldMin);if(!d||a>=this.min&&a<=this.max)g[a]||(g[a]=new L(this,a)),f&&g[a].isNew&&g[a].render(b,!0,.1),g[a].render(b)},render:function(){var a=this,b=a.chart,d=a.options,f=a.isLog,e=a.lin2log,m=a.isLinked,r=a.tickPositions,p=a.axisTitle,x=a.ticks,v=a.minorTicks,h=a.alternateBands,k=
|
||||
d.stackLabels,y=d.alternateGridColor,l=a.tickmarkOffset,A=a.axisLine,n=a.showAxis,G=z(b.renderer.globalAnimation),J,t;a.labelEdge.length=0;a.overlap=!1;c([x,v,h],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||m)a.minorTickInterval&&!a.categories&&c(a.getMinorTickPositions(),function(b){a.renderMinorTick(b)}),r.length&&(c(r,function(b,d){a.renderTick(b,d)}),l&&(0===a.min||a.single)&&(x[-1]||(x[-1]=new L(a,-1,null,!0)),x[-1].render(-1))),y&&c(r,function(d,g){t=void 0!==r[g+1]?r[g+1]+
|
||||
l:a.max-l;0===g%2&&d<a.max&&t<=a.max+(b.polar?-l:l)&&(h[d]||(h[d]=new q(a)),J=d+l,h[d].options={from:f?e(J):J,to:f?e(t):t,color:y},h[d].render(),h[d].isActive=!0)}),a._addedPlotLB||(c((d.plotLines||[]).concat(d.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0);c([x,v,h],function(a){var d,g,f=[],c=G.duration;for(d in a)a[d].isActive||(a[d].render(d,!1,0),a[d].isActive=!1,f.push(d));K(function(){for(g=f.length;g--;)a[f[g]]&&!a[f[g]].isActive&&(a[f[g]].destroy(),delete a[f[g]])},
|
||||
a!==h&&b.hasRendered&&c?c:0)});A&&(A[A.isPlaced?"animate":"attr"]({d:this.getLinePath(A.strokeWidth())}),A.isPlaced=!0,A[n?"show":"hide"](!0));p&&n&&(p[p.isNew?"attr":"animate"](a.getTitlePosition()),p.isNew=!1);k&&k.enabled&&a.renderStackTotals();a.isDirty=!1},redraw:function(){this.visible&&(this.render(),c(this.plotLinesAndBands,function(a){a.render()}));c(this.series,function(a){a.isDirty=!0})},keepProps:"extKey hcEvents names series userMax userMin".split(" "),destroy:function(a){var b=this,
|
||||
d=b.stacks,g,f=b.plotLinesAndBands,q;a||x(b);for(g in d)e(d[g]),d[g]=null;c([b.ticks,b.minorTicks,b.alternateBands],function(a){e(a)});if(f)for(a=f.length;a--;)f[a].destroy();c("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "),function(a){b[a]&&(b[a]=b[a].destroy())});for(q in b)b.hasOwnProperty(q)&&-1===r(q,b.keepProps)&&delete b[q]},drawCrosshair:function(a,b){var d,f=this.crosshair,g=F(f.snap,!0),c,q=this.cross;a||(a=this.cross&&this.cross.e);this.crosshair&&
|
||||
!1!==(l(b)||!g)?(g?l(b)&&(c=this.isXAxis?b.plotX:this.len-b.plotY):c=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos),l(c)&&(d=this.getPlotLinePath(b&&(this.isXAxis?b.x:F(b.stackY,b.y)),null,null,null,c)||null),l(d)?(b=this.categories&&!this.isRadial,q||(this.cross=q=this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+(b?"category ":"thin ")+f.className).attr({zIndex:F(f.zIndex,2)}).add(),q.attr({stroke:f.color||(b?h("#ccd6eb").setOpacity(.25).get():"#cccccc"),
|
||||
"stroke-width":F(f.width,1)}),f.dashStyle&&q.attr({dashstyle:f.dashStyle})),q.show().attr({d:d}),b&&!f.width&&q.attr({"stroke-width":this.transA}),this.cross.e=a):this.hideCrosshair()):this.hideCrosshair()},hideCrosshair:function(){this.cross&&this.cross.hide()}};p(a.Axis.prototype,u)})(I);(function(a){var B=a.Axis,z=a.Date,C=a.dateFormat,E=a.defaultOptions,u=a.defined,h=a.each,n=a.extend,t=a.getMagnitude,l=a.getTZOffset,k=a.normalizeTickInterval,e=a.pick,c=a.timeUnits;B.prototype.getTimeTicks=function(a,
|
||||
k,b,m){var d=[],r={},p=E.global.useUTC,v,f=new z(k-Math.abs(l(k))),y=z.hcMakeTime,G=a.unitRange,t=a.count,q;if(u(k)){f[z.hcSetMilliseconds](G>=c.second?0:t*Math.floor(f.getMilliseconds()/t));if(G>=c.second)f[z.hcSetSeconds](G>=c.minute?0:t*Math.floor(f.getSeconds()/t));if(G>=c.minute)f[z.hcSetMinutes](G>=c.hour?0:t*Math.floor(f[z.hcGetMinutes]()/t));if(G>=c.hour)f[z.hcSetHours](G>=c.day?0:t*Math.floor(f[z.hcGetHours]()/t));if(G>=c.day)f[z.hcSetDate](G>=c.month?1:t*Math.floor(f[z.hcGetDate]()/t));
|
||||
G>=c.month&&(f[z.hcSetMonth](G>=c.year?0:t*Math.floor(f[z.hcGetMonth]()/t)),v=f[z.hcGetFullYear]());if(G>=c.year)f[z.hcSetFullYear](v-v%t);if(G===c.week)f[z.hcSetDate](f[z.hcGetDate]()-f[z.hcGetDay]()+e(m,1));v=f[z.hcGetFullYear]();m=f[z.hcGetMonth]();var x=f[z.hcGetDate](),J=f[z.hcGetHours]();if(z.hcTimezoneOffset||z.hcGetTimezoneOffset)q=(!p||!!z.hcGetTimezoneOffset)&&(b-k>4*c.month||l(k)!==l(b)),f=f.getTime(),f=new z(f+l(f));p=f.getTime();for(k=1;p<b;)d.push(p),p=G===c.year?y(v+k*t,0):G===c.month?
|
||||
y(v,m+k*t):!q||G!==c.day&&G!==c.week?q&&G===c.hour?y(v,m,x,J+k*t):p+G*t:y(v,m,x+k*t*(G===c.day?1:7)),k++;d.push(p);G<=c.hour&&1E4>d.length&&h(d,function(a){0===a%18E5&&"000000000"===C("%H%M%S%L",a)&&(r[a]="day")})}d.info=n(a,{higherRanks:r,totalRange:G*t});return d};B.prototype.normalizeTimeTickInterval=function(a,e){var b=e||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,
|
||||
3,4,6]],["year",null]];e=b[b.length-1];var m=c[e[0]],d=e[1],r;for(r=0;r<b.length&&!(e=b[r],m=c[e[0]],d=e[1],b[r+1]&&a<=(m*d[d.length-1]+c[b[r+1][0]])/2);r++);m===c.year&&a<5*m&&(d=[1,2,5]);a=k(a/m,d,"year"===e[0]?Math.max(t(a/m),1):1);return{unitRange:m,count:a,unitName:e[0]}}})(I);(function(a){var B=a.Axis,z=a.getMagnitude,C=a.map,E=a.normalizeTickInterval,u=a.pick;B.prototype.getLogTickPositions=function(a,n,t,l){var k=this.options,e=this.len,c=this.lin2log,p=this.log2lin,h=[];l||(this._minorAutoInterval=
|
||||
null);if(.5<=a)a=Math.round(a),h=this.getLinearTickPositions(a,n,t);else if(.08<=a)for(var e=Math.floor(n),b,m,d,r,A,k=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];e<t+1&&!A;e++)for(m=k.length,b=0;b<m&&!A;b++)d=p(c(e)*k[b]),d>n&&(!l||r<=t)&&void 0!==r&&h.push(r),r>t&&(A=!0),r=d;else n=c(n),t=c(t),a=k[l?"minorTickInterval":"tickInterval"],a=u("auto"===a?null:a,this._minorAutoInterval,k.tickPixelInterval/(l?5:1)*(t-n)/((l?e/this.tickPositions.length:e)||1)),a=E(a,null,z(a)),h=C(this.getLinearTickPositions(a,
|
||||
n,t),p),l||(this._minorAutoInterval=a/5);l||(this.tickInterval=a);return h};B.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};B.prototype.lin2log=function(a){return Math.pow(10,a)}})(I);(function(a){var B=a.dateFormat,z=a.each,C=a.extend,E=a.format,u=a.isNumber,h=a.map,n=a.merge,t=a.pick,l=a.splat,k=a.syncTimeout,e=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,e){this.chart=a;this.options=e;this.crosshairs=[];this.now={x:0,y:0};
|
||||
this.isHidden=!0;this.split=e.split&&!a.inverted;this.shared=e.shared||this.split},cleanSplit:function(a){z(this.chart.series,function(c){var e=c&&c.tt;e&&(!e.isActive||a?c.tt=e.destroy():e.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,e=this.options;this.label||(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,e.shape||"callout",null,null,e.useHTML,null,"tooltip").attr({padding:e.padding,r:e.borderRadius}),this.label.attr({fill:e.backgroundColor,"stroke-width":e.borderWidth}).css(e.style).shadow(e.shadow)),
|
||||
this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();this.init(this.chart,n(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,e,k,b){var c=this,d=c.now,r=!1!==c.options.animation&&!c.isHidden&&(1<Math.abs(a-d.x)||1<Math.abs(e-d.y)),p=c.followPointer||1<c.len;C(d,{x:r?(2*
|
||||
d.x+a)/3:a,y:r?(d.y+e)/2:e,anchorX:p?void 0:r?(2*d.anchorX+k)/3:k,anchorY:p?void 0:r?(d.anchorY+b)/2:b});c.getLabel().attr(d);r&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){c&&c.move(a,e,k,b)},32))},hide:function(a){var c=this;clearTimeout(this.hideTimer);a=t(a,this.options.hideDelay,500);this.isHidden||(this.hideTimer=k(function(){c.getLabel()[a?"fadeOut":"hide"]();c.isHidden=!0},a))},getAnchor:function(a,e){var c,b=this.chart,m=b.inverted,d=b.plotTop,r=b.plotLeft,
|
||||
p=0,v=0,f,k;a=l(a);c=a[0].tooltipPos;this.followPointer&&e&&(void 0===e.chartX&&(e=b.pointer.normalize(e)),c=[e.chartX-b.plotLeft,e.chartY-d]);c||(z(a,function(a){f=a.series.yAxis;k=a.series.xAxis;p+=a.plotX+(!m&&k?k.left-r:0);v+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!m&&f?f.top-d:0)}),p/=a.length,v/=a.length,c=[m?b.plotWidth-v:p,this.shared&&!m&&1<a.length&&e?e.chartY-d:m?b.plotHeight-p:v]);return h(c,Math.round)},getPosition:function(a,e,k){var b=this.chart,c=this.distance,d={},r=k.h||0,
|
||||
p,v=["y",b.chartHeight,e,k.plotY+b.plotTop,b.plotTop,b.plotTop+b.plotHeight],f=["x",b.chartWidth,a,k.plotX+b.plotLeft,b.plotLeft,b.plotLeft+b.plotWidth],h=!this.followPointer&&t(k.ttBelow,!b.inverted===!!k.negative),l=function(a,b,f,g,q,e){var m=f<g-c,x=g+c+f<b,v=g-c-f;g+=c;if(h&&x)d[a]=g;else if(!h&&m)d[a]=v;else if(m)d[a]=Math.min(e-f,0>v-r?v:v-r);else if(x)d[a]=Math.max(q,g+r+f>b?g:g+r);else return!1},n=function(a,b,f,g){var q;g<c||g>b-c?q=!1:d[a]=g<f/2?1:g>b-f/2?b-f-2:g-f/2;return q},q=function(a){var b=
|
||||
v;v=f;f=b;p=a},x=function(){!1!==l.apply(0,v)?!1!==n.apply(0,f)||p||(q(!0),x()):p?d.x=d.y=0:(q(!0),x())};(b.inverted||1<this.len)&&q();x();return d},defaultFormatter:function(a){var c=this.points||l(this),e;e=[a.tooltipFooterHeaderFormatter(c[0])];e=e.concat(a.bodyFormatter(c));e.push(a.tooltipFooterHeaderFormatter(c[0],!0));return e},refresh:function(a,e){var c,b=this.options,m,d=a,r,p={},v=[];c=b.formatter||this.defaultFormatter;var p=this.shared,f;clearTimeout(this.hideTimer);this.followPointer=
|
||||
l(d)[0].series.tooltipOptions.followPointer;r=this.getAnchor(d,e);e=r[0];m=r[1];!p||d.series&&d.series.noSharedTooltip?p=d.getLabelConfig():(z(d,function(a){a.setState("hover");v.push(a.getLabelConfig())}),p={x:d[0].category,y:d[0].y},p.points=v,d=d[0]);this.len=v.length;p=c.call(p,this);f=d.series;this.distance=t(f.tooltipOptions.distance,16);!1===p?this.hide():(c=this.getLabel(),this.isHidden&&c.attr({opacity:1}).show(),this.split?this.renderSplit(p,a):(c.attr({text:p&&p.join?p.join(""):p}),c.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-"+
|
||||
t(d.colorIndex,f.colorIndex)),c.attr({stroke:b.borderColor||d.color||f.color||"#666666"}),this.updatePosition({plotX:e,plotY:m,negative:d.negative,ttBelow:d.ttBelow,h:r[2]||0})),this.isHidden=!1)},renderSplit:function(c,e){var p=this,b=[],m=this.chart,d=m.renderer,r=!0,k=this.options,v,f=this.getLabel();z(c.slice(0,e.length+1),function(a,c){c=e[c-1]||{isHeader:!0,plotX:e[0].plotX};var h=c.series||p,q=h.tt,x=c.series||{},l="highcharts-color-"+t(c.colorIndex,x.colorIndex,"none");q||(h.tt=q=d.label(null,
|
||||
null,null,"callout").addClass("highcharts-tooltip-box "+l).attr({padding:k.padding,r:k.borderRadius,fill:k.backgroundColor,stroke:c.color||x.color||"#333333","stroke-width":k.borderWidth}).add(f));q.isActive=!0;q.attr({text:a});q.css(k.style);a=q.getBBox();x=a.width+q.strokeWidth();c.isHeader?(v=a.height,x=Math.max(0,Math.min(c.plotX+m.plotLeft-x/2,m.chartWidth-x))):x=c.plotX+m.plotLeft-t(k.distance,16)-x;0>x&&(r=!1);a=(c.series&&c.series.yAxis&&c.series.yAxis.pos)+(c.plotY||0);a-=m.plotTop;b.push({target:c.isHeader?
|
||||
m.plotHeight+v:a,rank:c.isHeader?1:0,size:h.tt.getBBox().height+1,point:c,x:x,tt:q})});this.cleanSplit();a.distribute(b,m.plotHeight+v);z(b,function(a){var b=a.point,d=b.series;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:r||b.isHeader?a.x:b.plotX+m.plotLeft+t(k.distance,16),y:a.pos+m.plotTop,anchorX:b.isHeader?b.plotX+m.plotLeft:b.plotX+d.xAxis.pos,anchorY:b.isHeader?a.pos+m.plotTop-15:b.plotY+d.yAxis.pos})})},updatePosition:function(a){var c=this.chart,e=this.getLabel(),e=(this.options.positioner||
|
||||
this.getPosition).call(this,e.width,e.height,a);this.move(Math.round(e.x),Math.round(e.y||0),a.plotX+c.plotLeft,a.plotY+c.plotTop)},getDateFormat:function(a,p,k,b){var c=B("%m-%d %H:%M:%S.%L",p),d,r,h={millisecond:15,second:12,minute:9,hour:6,day:3},v="millisecond";for(r in e){if(a===e.week&&+B("%w",p)===k&&"00:00:00.000"===c.substr(6)){r="week";break}if(e[r]>a){r=v;break}if(h[r]&&c.substr(h[r])!=="01-01 00:00:00.000".substr(h[r]))break;"week"!==r&&(v=r)}r&&(d=b[r]);return d},getXDateFormat:function(a,
|
||||
e,k){e=e.dateTimeLabelFormats;var b=k&&k.closestPointRange;return(b?this.getDateFormat(b,a.x,k.options.startOfWeek,e):e.day)||e.year},tooltipFooterHeaderFormatter:function(a,e){var c=e?"footer":"header";e=a.series;var b=e.tooltipOptions,m=b.xDateFormat,d=e.xAxis,r=d&&"datetime"===d.options.type&&u(a.key),c=b[c+"Format"];r&&!m&&(m=this.getXDateFormat(a,b,d));r&&m&&(c=c.replace("{point.key}","{point.key:"+m+"}"));return E(c,{point:a,series:e})},bodyFormatter:function(a){return h(a,function(a){var c=
|
||||
a.series.tooltipOptions;return(c.pointFormatter||a.point.tooltipFormatter).call(a.point,c.pointFormat)})}}})(I);(function(a){var B=a.addEvent,z=a.attr,C=a.charts,E=a.color,u=a.css,h=a.defined,n=a.doc,t=a.each,l=a.extend,k=a.fireEvent,e=a.offset,c=a.pick,p=a.removeEvent,H=a.splat,b=a.Tooltip,m=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,e){this.options=e;this.chart=a;this.runChartClick=e.chart.events&&!!e.chart.events.click;this.pinchDown=[];this.lastValidTouch=
|
||||
{};b&&e.tooltip.enabled&&(a.tooltip=new b(a,e.tooltip),this.followTouchMove=c(e.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart,e=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(e=c(d.pinchType,e));this.zoomX=a=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=a&&!b||e&&b;this.zoomVert=e&&!b||a&&b;this.hasZoom=a||e},normalize:function(a,b){var d,c;a=a||m.event;a.target||(a.target=a.srcElement);c=a.touches?a.touches.length?a.touches.item(0):
|
||||
a.changedTouches[0]:a;b||(this.chartPosition=b=e(this.chart.container));void 0===c.pageX?(d=Math.max(a.x,a.clientX-b.left),b=a.y):(d=c.pageX-b.left,b=c.pageY-b.top);return l(a,{chartX:Math.round(d),chartY:Math.round(b)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};t(this.chart.axes,function(d){b[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return b},getKDPoints:function(a,b,e){var d=[],f,m,r;t(a,function(a){f=a.noSharedTooltip&&b;m=!b&&a.directTouch;
|
||||
a.visible&&!f&&!m&&c(a.options.enableMouseTracking,!0)&&(r=a.searchPoint(e,!f&&1===a.kdDimensions))&&r.series&&d.push(r)});d.sort(function(a,d){var f=a.distX-d.distX,c=a.dist-d.dist,e=(d.series.group&&d.series.group.zIndex)-(a.series.group&&a.series.group.zIndex);return 0!==f&&b?f:0!==c?c:0!==e?e:a.series.index>d.series.index?-1:1});if(b)for(a=d.length;a--;)(d[a].x!==d[0].x||d[a].series.noSharedTooltip)&&d.splice(a,1);return d},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=
|
||||
a.parentNode;return b},getHoverData:function(a,b,e,m,f,k){var d=a;a=b;var r;if(m)f?(r=[],t(e,function(a){var b=a.noSharedTooltip&&f,e=!f&&a.directTouch;a.visible&&!b&&!e&&c(a.options.enableMouseTracking,!0)&&(a=a.searchKDTree({clientX:d.clientX,plotY:d.plotY},!b&&1===a.kdDimensions))&&a.series&&r.push(a)}),0===r.length&&(r=[d])):r=[d];else{if(a&&!a.options.stickyTracking)r=this.getKDPoints([a],f,k);else{if(!f)if(a)a.options.stickyTracking||(e=[a]);else for(m=0;m<e.length;m++)if(e[m].directTouch||
|
||||
!e[m].options.stickyTracking)e=[];r=this.getKDPoints(e,f,k)}a=(d=r[0])&&d.series}r.sort(function(a,b){return a.series.index-b.series.index});return{hoverPoint:d,hoverSeries:a,hoverPoints:r}},runPointActions:function(b,c){var d=this.chart,e=d.tooltip,f=e?e.shared:!1,m=c||d.hoverPoint,r=m&&m.series||d.hoverSeries;c=this.getHoverData(m,r,d.series,!!c||r&&r.directTouch,f,b);var k,q,m=c.hoverPoint;k=(r=c.hoverSeries)&&r.tooltipOptions.followPointer;q=(f=f&&m&&!m.series.noSharedTooltip)?c.hoverPoints:[m];
|
||||
if(m&&(m!==d.hoverPoint||e&&e.isHidden)){t(d.hoverPoints||[],function(b){-1===a.inArray(b,q)&&b.setState()});t(q||[],function(a){a.setState("hover")});if(d.hoverSeries!==r)r.onMouseOver();r&&!r.directTouch&&(d.hoverPoint&&d.hoverPoint.firePointEvent("mouseOut"),m.firePointEvent("mouseOver"));d.hoverPoints=q;d.hoverPoint=m;e&&e.refresh(f?q:m,b)}else k&&e&&!e.isHidden&&(m=e.getAnchor([{}],b),e.updatePosition({plotX:m[0],plotY:m[1]}));this.unDocMouseMove||(this.unDocMouseMove=B(n,"mousemove",function(b){var d=
|
||||
C[a.hoverChartIndex];if(d)d.pointer.onDocumentMouseMove(b)}));t(q,function(a){t(d.axes,function(d){(!a||a.series&&a.series[d.coll]===d)&&d.drawCrosshair(b,a)})})},reset:function(a,b){var d=this.chart,c=d.hoverSeries,f=d.hoverPoint,e=d.hoverPoints,m=d.tooltip,r=m&&m.shared?e:f;a&&r&&t(H(r),function(b){b.series.isCartesian&&void 0===b.plotX&&(a=!1)});if(a)m&&r&&(m.refresh(r),f&&(f.setState(f.state,!0),t(d.axes,function(a){a.crosshair&&a.drawCrosshair(null,f)})));else{if(f)f.onMouseOut();e&&t(e,function(a){a.setState()});
|
||||
if(c)c.onMouseOut();m&&m.hide(b);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());t(d.axes,function(a){a.hideCrosshair()});this.hoverX=d.hoverPoints=d.hoverPoint=null}},scaleGroups:function(a,b){var d=this.chart,c;t(d.series,function(f){c=a||f.getPlotBox();f.xAxis&&f.xAxis.zoomEnabled&&f.group&&(f.group.attr(c),f.markerGroup&&(f.markerGroup.attr(c),f.markerGroup.clip(b?d.clipRect:null)),f.dataLabelsGroup&&f.dataLabelsGroup.attr(c))});d.clipRect.attr(b||d.clipBox)},dragStart:function(a){var b=
|
||||
this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,d=b.options.chart,c=a.chartX,f=a.chartY,e=this.zoomHor,m=this.zoomVert,k=b.plotLeft,q=b.plotTop,x=b.plotWidth,p=b.plotHeight,h,l=this.selectionMarker,g=this.mouseDownX,n=this.mouseDownY,t=d.panKey&&a[d.panKey+"Key"];l&&l.touch||(c<k?c=k:c>k+x&&(c=k+x),f<q?f=q:f>q+p&&(f=q+p),this.hasDragged=Math.sqrt(Math.pow(g-c,2)+Math.pow(n-f,2)),10<this.hasDragged&&
|
||||
(h=b.isInsidePlot(g-k,n-q),b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&h&&!t&&!l&&(this.selectionMarker=l=b.renderer.rect(k,q,e?1:x,m?1:p,0).attr({fill:d.selectionMarkerFill||E("#335cad").setOpacity(.25).get(),"class":"highcharts-selection-marker",zIndex:7}).add()),l&&e&&(c-=g,l.attr({width:Math.abs(c),x:(0<c?0:c)+g})),l&&m&&(c=f-n,l.attr({height:Math.abs(c),y:(0<c?0:c)+n})),h&&!l&&d.panning&&b.pan(a,d.panning)))},drop:function(a){var b=this,d=this.chart,c=this.hasPinched;if(this.selectionMarker){var f=
|
||||
{originalEvent:a,xAxis:[],yAxis:[]},e=this.selectionMarker,m=e.attr?e.attr("x"):e.x,p=e.attr?e.attr("y"):e.y,q=e.attr?e.attr("width"):e.width,x=e.attr?e.attr("height"):e.height,n;if(this.hasDragged||c)t(d.axes,function(d){if(d.zoomEnabled&&h(d.min)&&(c||b[{xAxis:"zoomX",yAxis:"zoomY"}[d.coll]])){var e=d.horiz,g="touchend"===a.type?d.minPixelPadding:0,r=d.toValue((e?m:p)+g),e=d.toValue((e?m+q:p+x)-g);f[d.coll].push({axis:d,min:Math.min(r,e),max:Math.max(r,e)});n=!0}}),n&&k(d,"selection",f,function(a){d.zoom(l(a,
|
||||
c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}d&&(u(d.container,{cursor:d._cursor}),d.cancelClick=10<this.hasDragged,d.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(a){a=this.normalize(a);this.zoomOption(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(b){C[a.hoverChartIndex]&&C[a.hoverChartIndex].pointer.drop(b)},onDocumentMouseMove:function(a){var b=this.chart,
|
||||
d=this.chartPosition;a=this.normalize(a,d);!d||this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)||this.reset()},onContainerMouseLeave:function(b){var d=C[a.hoverChartIndex];d&&(b.relatedTarget||b.toElement)&&(d.pointer.reset(),d.pointer.chartPosition=null)},onContainerMouseMove:function(b){var d=this.chart;h(a.hoverChartIndex)&&C[a.hoverChartIndex]&&C[a.hoverChartIndex].mouseIsDown||(a.hoverChartIndex=d.index);b=this.normalize(b);b.returnValue=!1;
|
||||
"mousedown"===d.mouseIsDown&&this.drag(b);!this.inClass(b.target,"highcharts-tracker")&&!d.isInsidePlot(b.chartX-d.plotLeft,b.chartY-d.plotTop)||d.openMenu||this.runPointActions(b)},inClass:function(a,b){for(var d;a;){if(d=z(a,"class")){if(-1!==d.indexOf(b))return!0;if(-1!==d.indexOf("highcharts-container"))return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;a=a.relatedTarget||a.toElement;if(!(!b||!a||b.options.stickyTracking||this.inClass(a,"highcharts-tooltip")||
|
||||
this.inClass(a,"highcharts-series-"+b.index)&&this.inClass(a,"highcharts-tracker")))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,d=b.hoverPoint,c=b.plotLeft,f=b.plotTop;a=this.normalize(a);b.cancelClick||(d&&this.inClass(a.target,"highcharts-tracker")?(k(d.series,"click",l(a,{point:d})),b.hoverPoint&&d.firePointEvent("click",a)):(l(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-c,a.chartY-f)&&k(b,"click",a)))},setDOMEvents:function(){var b=this,c=b.chart.container;c.onmousedown=
|
||||
function(a){b.onContainerMouseDown(a)};c.onmousemove=function(a){b.onContainerMouseMove(a)};c.onclick=function(a){b.onContainerClick(a)};B(c,"mouseleave",b.onContainerMouseLeave);1===a.chartCount&&B(n,"mouseup",b.onDocumentMouseUp);a.hasTouch&&(c.ontouchstart=function(a){b.onContainerTouchStart(a)},c.ontouchmove=function(a){b.onContainerTouchMove(a)},1===a.chartCount&&B(n,"touchend",b.onDocumentTouchEnd))},destroy:function(){var b;p(this.chart.container,"mouseleave",this.onContainerMouseLeave);a.chartCount||
|
||||
(p(n,"mouseup",this.onDocumentMouseUp),p(n,"touchend",this.onDocumentTouchEnd));clearInterval(this.tooltipTimeout);for(b in this)this[b]=null}}})(I);(function(a){var B=a.charts,z=a.each,C=a.extend,E=a.map,u=a.noop,h=a.pick;C(a.Pointer.prototype,{pinchTranslate:function(a,h,l,k,e,c){this.zoomHor&&this.pinchTranslateDirection(!0,a,h,l,k,e,c);this.zoomVert&&this.pinchTranslateDirection(!1,a,h,l,k,e,c)},pinchTranslateDirection:function(a,h,l,k,e,c,p,u){var b=this.chart,m=a?"x":"y",d=a?"X":"Y",r="chart"+
|
||||
d,n=a?"width":"height",v=b["plot"+(a?"Left":"Top")],f,y,t=u||1,F=b.inverted,q=b.bounds[a?"h":"v"],x=1===h.length,J=h[0][r],K=l[0][r],L=!x&&h[1][r],g=!x&&l[1][r],D;l=function(){!x&&20<Math.abs(J-L)&&(t=u||Math.abs(K-g)/Math.abs(J-L));y=(v-K)/t+J;f=b["plot"+(a?"Width":"Height")]/t};l();h=y;h<q.min?(h=q.min,D=!0):h+f>q.max&&(h=q.max-f,D=!0);D?(K-=.8*(K-p[m][0]),x||(g-=.8*(g-p[m][1])),l()):p[m]=[K,g];F||(c[m]=y-v,c[n]=f);c=F?1/t:t;e[n]=f;e[m]=h;k[F?a?"scaleY":"scaleX":"scale"+d]=t;k["translate"+d]=c*
|
||||
v+(K-c*J)},pinch:function(a){var n=this,l=n.chart,k=n.pinchDown,e=a.touches,c=e.length,p=n.lastValidTouch,H=n.hasZoom,b=n.selectionMarker,m={},d=1===c&&(n.inClass(a.target,"highcharts-tracker")&&l.runTrackerClick||n.runChartClick),r={};1<c&&(n.initiated=!0);H&&n.initiated&&!d&&a.preventDefault();E(e,function(a){return n.normalize(a)});"touchstart"===a.type?(z(e,function(a,b){k[b]={chartX:a.chartX,chartY:a.chartY}}),p.x=[k[0].chartX,k[1]&&k[1].chartX],p.y=[k[0].chartY,k[1]&&k[1].chartY],z(l.axes,function(a){if(a.zoomEnabled){var b=
|
||||
l.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,c=a.toPixels(h(a.options.min,a.dataMin)),e=a.toPixels(h(a.options.max,a.dataMax)),m=Math.max(c,e);b.min=Math.min(a.pos,Math.min(c,e)-d);b.max=Math.max(a.pos+a.len,m+d)}}),n.res=!0):n.followTouchMove&&1===c?this.runPointActions(n.normalize(a)):k.length&&(b||(n.selectionMarker=b=C({destroy:u,touch:!0},l.plotBox)),n.pinchTranslate(k,e,m,b,r,p),n.hasPinched=H,n.scaleGroups(m,r),n.res&&(n.res=!1,this.reset(!1,0)))},touch:function(n,t){var l=this.chart,k,e;
|
||||
if(l.index!==a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget:!0});a.hoverChartIndex=l.index;1===n.touches.length?(n=this.normalize(n),(e=l.isInsidePlot(n.chartX-l.plotLeft,n.chartY-l.plotTop))&&!l.openMenu?(t&&this.runPointActions(n),"touchmove"===n.type&&(t=this.pinchDown,k=t[0]?4<=Math.sqrt(Math.pow(t[0].chartX-n.chartX,2)+Math.pow(t[0].chartY-n.chartY,2)):!1),h(k,!0)&&this.pinch(n)):t&&this.reset()):2===n.touches.length&&this.pinch(n)},onContainerTouchStart:function(a){this.zoomOption(a);
|
||||
this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(h){B[a.hoverChartIndex]&&B[a.hoverChartIndex].pointer.drop(h)}})})(I);(function(a){var B=a.addEvent,z=a.charts,C=a.css,E=a.doc,u=a.extend,h=a.noop,n=a.Pointer,t=a.removeEvent,l=a.win,k=a.wrap;if(l.PointerEvent||l.MSPointerEvent){var e={},c=!!l.PointerEvent,p=function(){var a,c=[];c.item=function(a){return this[a]};for(a in e)e.hasOwnProperty(a)&&c.push({pageX:e[a].pageX,pageY:e[a].pageY,target:e[a].target});
|
||||
return c},H=function(b,c,d,e){"touch"!==b.pointerType&&b.pointerType!==b.MSPOINTER_TYPE_TOUCH||!z[a.hoverChartIndex]||(e(b),e=z[a.hoverChartIndex].pointer,e[c]({type:d,target:b.currentTarget,preventDefault:h,touches:p()}))};u(n.prototype,{onContainerPointerDown:function(a){H(a,"onContainerTouchStart","touchstart",function(a){e[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){H(a,"onContainerTouchMove","touchmove",function(a){e[a.pointerId]={pageX:a.pageX,
|
||||
pageY:a.pageY};e[a.pointerId].target||(e[a.pointerId].target=a.currentTarget)})},onDocumentPointerUp:function(a){H(a,"onDocumentTouchEnd","touchend",function(a){delete e[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,c?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,c?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(E,c?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});k(n.prototype,"init",function(a,c,d){a.call(this,c,d);this.hasZoom&&
|
||||
C(c.container,{"-ms-touch-action":"none","touch-action":"none"})});k(n.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(B)});k(n.prototype,"destroy",function(a){this.batchMSEvents(t);a.call(this)})}})(I);(function(a){var B,z=a.addEvent,C=a.css,E=a.discardElement,u=a.defined,h=a.each,n=a.isFirefox,t=a.marginNames,l=a.merge,k=a.pick,e=a.setAnimation,c=a.stableSort,p=a.win,H=a.wrap;B=a.Legend=function(a,c){this.init(a,c)};B.prototype={init:function(a,
|
||||
c){this.chart=a;this.setOptions(c);c.enabled&&(this.render(),z(this.chart,"endResize",function(){this.legend.positionCheckboxes()}))},setOptions:function(a){var b=k(a.padding,8);this.options=a;this.itemStyle=a.itemStyle;this.itemHiddenStyle=l(this.itemStyle,a.itemHiddenStyle);this.itemMarginTop=a.itemMarginTop||0;this.initialItemX=this.padding=b;this.initialItemY=b-5;this.itemHeight=this.maxItemWidth=0;this.symbolWidth=k(a.symbolWidth,16);this.pages=[]},update:function(a,c){var b=this.chart;this.setOptions(l(!0,
|
||||
this.options,a));this.destroy();b.isDirtyLegend=b.isDirtyBox=!0;k(c,!0)&&b.redraw()},colorizeItem:function(a,c){a.legendGroup[c?"removeClass":"addClass"]("highcharts-legend-item-hidden");var b=this.options,e=a.legendItem,m=a.legendLine,k=a.legendSymbol,f=this.itemHiddenStyle.color,b=c?b.itemStyle.color:f,p=c?a.color||f:f,h=a.options&&a.options.marker,l={fill:p},q;e&&e.css({fill:b,color:b});m&&m.attr({stroke:p});if(k){if(h&&k.isMarker&&(l=a.pointAttribs(),!c))for(q in l)l[q]=f;k.attr(l)}},positionItem:function(a){var b=
|
||||
this.options,d=b.symbolPadding,b=!b.rtl,c=a._legendItemPos,e=c[0],c=c[1],k=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(b?e:this.legendWidth-e-2*d-4,c);k&&(k.x=e,k.y=c)},destroyItem:function(a){var b=a.checkbox;h(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&E(a.checkbox)},destroy:function(){function a(a){this[a]&&(this[a]=this[a].destroy())}h(this.getAllItems(),function(b){h(["legendItem","legendGroup"],a,b)});h("clipRect up down pager nav box title group".split(" "),
|
||||
a,this);this.display=null},positionCheckboxes:function(a){var b=this.group&&this.group.alignAttr,d,c=this.clipHeight||this.legendHeight,e=this.titleHeight;b&&(d=b.translateY,h(this.allItems,function(m){var f=m.checkbox,k;f&&(k=d+e+f.y+(a||0)+3,C(f,{left:b.translateX+m.checkboxOffset+f.x-20+"px",top:k+"px",display:k>d-6&&k<d+c-6?"":"none"}))}))},renderTitle:function(){var a=this.padding,c=this.options.title,d=0;c.text&&(this.title||(this.title=this.chart.renderer.label(c.text,a-3,a-4,null,null,null,
|
||||
null,null,"legend-title").attr({zIndex:1}).css(c.style).add(this.group)),a=this.title.getBBox(),d=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:d}));this.titleHeight=d},setText:function(b){var c=this.options;b.legendItem.attr({text:c.labelFormat?a.format(c.labelFormat,b):c.labelFormatter.call(b)})},renderItem:function(a){var b=this.chart,d=b.renderer,c=this.options,e="horizontal"===c.layout,p=this.symbolWidth,f=c.symbolPadding,h=this.itemStyle,n=this.itemHiddenStyle,t=this.padding,
|
||||
q=e?k(c.itemDistance,20):0,x=!c.rtl,J=c.width,u=c.itemMarginBottom||0,L=this.itemMarginTop,g=this.initialItemX,D=a.legendItem,H=!a.series,z=!H&&a.series.drawLegendSymbol?a.series:a,B=z.options,B=this.createCheckboxForItem&&B&&B.showCheckbox,C=c.useHTML;D||(a.legendGroup=d.g("legend-item").addClass("highcharts-"+z.type+"-series highcharts-color-"+a.colorIndex+(a.options.className?" "+a.options.className:"")+(H?" highcharts-series-"+a.index:"")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=D=
|
||||
d.text("",x?p+f:-f,this.baseline||0,C).css(l(a.visible?h:n)).attr({align:x?"left":"right",zIndex:2}).add(a.legendGroup),this.baseline||(h=h.fontSize,this.fontMetrics=d.fontMetrics(h,D),this.baseline=this.fontMetrics.f+3+L,D.attr("y",this.baseline)),this.symbolHeight=c.symbolHeight||this.fontMetrics.f,z.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,D,C),B&&this.createCheckboxForItem(a));this.colorizeItem(a,a.visible);this.setText(a);d=D.getBBox();p=a.checkboxOffset=c.itemWidth||
|
||||
a.legendItemWidth||p+f+d.width+q+(B?20:0);this.itemHeight=f=Math.round(a.legendItemHeight||d.height);e&&this.itemX-g+p>(J||b.chartWidth-2*t-g-c.x)&&(this.itemX=g,this.itemY+=L+this.lastLineHeight+u,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,p);this.lastItemY=L+this.itemY+u;this.lastLineHeight=Math.max(f,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=p:(this.itemY+=L+f+u,this.lastLineHeight=f);this.offsetWidth=J||Math.max((e?this.itemX-g-q:p)+t,
|
||||
this.offsetWidth)},getAllItems:function(){var a=[];h(this.chart.series,function(b){var d=b&&b.options;b&&k(d.showInLegend,u(d.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||("point"===d.legendType?b.data:b)))});return a},adjustMargins:function(a,c){var b=this.chart,e=this.options,m=e.align.charAt(0)+e.verticalAlign.charAt(0)+e.layout.charAt(0);e.floating||h([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(d,f){d.test(m)&&!u(a[f])&&(b[t[f]]=Math.max(b[t[f]],b.legend[(f+1)%
|
||||
2?"legendHeight":"legendWidth"]+[1,-1,-1,1][f]*e[f%2?"x":"y"]+k(e.margin,12)+c[f]))})},render:function(){var a=this,e=a.chart,d=e.renderer,k=a.group,p,n,f,y,t=a.box,u=a.options,q=a.padding;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;k||(a.group=k=d.g("legend").attr({zIndex:7}).add(),a.contentGroup=d.g().attr({zIndex:1}).add(k),a.scrollGroup=d.g().add(a.contentGroup));a.renderTitle();p=a.getAllItems();c(p,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&
|
||||
b.options.legendIndex||0)});u.reversed&&p.reverse();a.allItems=p;a.display=n=!!p.length;a.lastLineHeight=0;h(p,function(b){a.renderItem(b)});f=(u.width||a.offsetWidth)+q;y=a.lastItemY+a.lastLineHeight+a.titleHeight;y=a.handleOverflow(y);y+=q;t||(a.box=t=d.rect().addClass("highcharts-legend-box").attr({r:u.borderRadius}).add(k),t.isNew=!0);t.attr({stroke:u.borderColor,"stroke-width":u.borderWidth||0,fill:u.backgroundColor||"none"}).shadow(u.shadow);0<f&&0<y&&(t[t.isNew?"attr":"animate"](t.crisp({x:0,
|
||||
y:0,width:f,height:y},t.strokeWidth())),t.isNew=!1);t[n?"show":"hide"]();a.legendWidth=f;a.legendHeight=y;h(p,function(b){a.positionItem(b)});n&&k.align(l(u,{width:f,height:y}),!0,"spacingBox");e.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,d=this.chart,c=d.renderer,e=this.options,p=e.y,d=d.spacingBox.height+("top"===e.verticalAlign?-p:p)-this.padding,p=e.maxHeight,f,l=this.clipRect,n=e.navigation,t=k(n.animation,!0),q=n.arrowSize||12,x=this.nav,u=this.pages,K=this.padding,
|
||||
L,g=this.allItems,D=function(a){a?l.attr({height:a}):l&&(b.clipRect=l.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=a?"rect("+K+"px,9999px,"+(K+a)+"px,0)":"auto")};"horizontal"!==e.layout||"middle"===e.verticalAlign||e.floating||(d/=2);p&&(d=Math.min(d,p));u.length=0;a>d&&!1!==n.enabled?(this.clipHeight=f=Math.max(d-20-this.titleHeight-K,0),this.currentPage=k(this.currentPage,1),this.fullHeight=a,h(g,function(a,b){var d=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);
|
||||
var c=u.length;if(!c||d-u[c-1]>f&&(L||d)!==u[c-1])u.push(L||d),c++;b===g.length-1&&d+a-u[c-1]>f&&u.push(d);d!==L&&(L=d)}),l||(l=b.clipRect=c.clipRect(0,K,9999,0),b.contentGroup.clip(l)),D(f),x||(this.nav=x=c.g().attr({zIndex:1}).add(this.group),this.up=c.symbol("triangle",0,0,q,q).on("click",function(){b.scroll(-1,t)}).add(x),this.pager=c.text("",15,10).addClass("highcharts-legend-navigation").css(n.style).add(x),this.down=c.symbol("triangle-down",0,0,q,q).on("click",function(){b.scroll(1,t)}).add(x)),
|
||||
b.scroll(0),a=d):x&&(D(),this.nav=x.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,c){var b=this.pages,m=b.length;a=this.currentPage+a;var k=this.clipHeight,p=this.options.navigation,f=this.pager,h=this.padding;a>m&&(a=m);0<a&&(void 0!==c&&e(c,this.chart),this.nav.attr({translateX:h,translateY:k+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({"class":1===a?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),f.attr({text:a+
|
||||
"/"+m}),this.down.attr({x:18+this.pager.getBBox().width,"class":a===m?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),this.up.attr({fill:1===a?p.inactiveColor:p.activeColor}).css({cursor:1===a?"default":"pointer"}),this.down.attr({fill:a===m?p.inactiveColor:p.activeColor}).css({cursor:a===m?"default":"pointer"}),c=-b[a-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=a,this.positionCheckboxes(c))}};a.LegendSymbolMixin={drawRectangle:function(a,c){var b=
|
||||
a.symbolHeight,e=a.options.squareSymbol;c.legendSymbol=this.chart.renderer.rect(e?(a.symbolWidth-b)/2:0,a.baseline-b+1,e?b:a.symbolWidth,b,k(a.options.symbolRadius,b/2)).addClass("highcharts-point").attr({zIndex:3}).add(c.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,e=a.symbolWidth,p=a.symbolHeight,h=p/2,f=this.chart.renderer,n=this.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var t;t={"stroke-width":b.lineWidth||0};b.dashStyle&&(t.dashstyle=b.dashStyle);this.legendLine=
|
||||
f.path(["M",0,a,"L",e,a]).addClass("highcharts-graph").attr(t).add(n);c&&!1!==c.enabled&&(b=Math.min(k(c.radius,h),h),0===this.symbol.indexOf("url")&&(c=l(c,{width:p,height:p}),b=0),this.legendSymbol=c=f.symbol(this.symbol,e/2-b,a-b,2*b,2*b,c).addClass("highcharts-point").add(n),c.isMarker=!0)}};(/Trident\/7\.0/.test(p.navigator.userAgent)||n)&&H(B.prototype,"positionItem",function(a,c){var b=this,e=function(){c._legendItemPos&&a.call(b,c)};e();setTimeout(e)})})(I);(function(a){var B=a.addEvent,z=
|
||||
a.animate,C=a.animObject,E=a.attr,u=a.doc,h=a.Axis,n=a.createElement,t=a.defaultOptions,l=a.discardElement,k=a.charts,e=a.css,c=a.defined,p=a.each,H=a.extend,b=a.find,m=a.fireEvent,d=a.getStyle,r=a.grep,A=a.isNumber,v=a.isObject,f=a.isString,y=a.Legend,G=a.marginNames,F=a.merge,q=a.Pointer,x=a.pick,J=a.pInt,K=a.removeEvent,L=a.seriesTypes,g=a.splat,D=a.svg,S=a.syncTimeout,M=a.win,R=a.Renderer,N=a.Chart=function(){this.getArgs.apply(this,arguments)};a.chart=function(a,b,c){return new N(a,b,c)};N.prototype=
|
||||
{callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(f(a[0])||a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(b,c){var d,f=b.series;b.series=null;d=F(t,b);d.series=b.series=f;this.userOptions=b;b=d.chart;f=b.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.callback=c;this.isResizing=0;this.options=d;this.axes=[];this.series=[];this.hasCartesianSeries=b.showAxes;var g;this.index=k.length;k.push(this);a.chartCount++;if(f)for(g in f)B(this,g,
|
||||
f[g]);this.xAxis=[];this.yAxis=[];this.pointCount=this.colorCounter=this.symbolCounter=0;this.firstRender()},initSeries:function(b){var c=this.options.chart;(c=L[b.type||c.type||c.defaultSeriesType])||a.error(17,!0);c=new c;c.init(this,b);return c},orderSeries:function(a){var b=this.series;for(a=a||0;a<b.length;a++)b[a]&&(b[a].index=a,b[a].name=b[a].name||"Series "+(b[a].index+1))},isInsidePlot:function(a,b,c){var d=c?b:a;a=c?a:b;return 0<=d&&d<=this.plotWidth&&0<=a&&a<=this.plotHeight},redraw:function(b){var c=
|
||||
this.axes,d=this.series,f=this.pointer,g=this.legend,e=this.isDirtyLegend,q,k,h=this.hasCartesianSeries,x=this.isDirtyBox,l,w=this.renderer,r=w.isHidden(),n=[];this.setResponsive&&this.setResponsive(!1);a.setAnimation(b,this);r&&this.cloneRenderTo();this.layOutTitles();for(b=d.length;b--;)if(l=d[b],l.options.stacking&&(q=!0,l.isDirty)){k=!0;break}if(k)for(b=d.length;b--;)l=d[b],l.options.stacking&&(l.isDirty=!0);p(d,function(a){a.isDirty&&"point"===a.options.legendType&&(a.updateTotals&&a.updateTotals(),
|
||||
e=!0);a.isDirtyData&&m(a,"updatedData")});e&&g.options.enabled&&(g.render(),this.isDirtyLegend=!1);q&&this.getStacks();h&&p(c,function(a){a.updateNames();a.setScale()});this.getMargins();h&&(p(c,function(a){a.isDirty&&(x=!0)}),p(c,function(a){var b=a.min+","+a.max;a.extKey!==b&&(a.extKey=b,n.push(function(){m(a,"afterSetExtremes",H(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(x||q)&&a.redraw()}));x&&this.drawChartBox();m(this,"predraw");p(d,function(a){(x||a.isDirty)&&a.visible&&a.redraw();
|
||||
a.isDirtyData=!1});f&&f.reset(!0);w.draw();m(this,"redraw");m(this,"render");r&&this.cloneRenderTo(!0);p(n,function(a){a.call()})},get:function(a){function c(b){return b.id===a||b.options&&b.options.id===a}var d,f=this.series,g;d=b(this.axes,c)||b(this.series,c);for(g=0;!d&&g<f.length;g++)d=b(f[g].points||[],c);return d},getAxes:function(){var a=this,b=this.options,c=b.xAxis=g(b.xAxis||{}),b=b.yAxis=g(b.yAxis||{});p(c,function(a,b){a.index=b;a.isX=!0});p(b,function(a,b){a.index=b});c=c.concat(b);
|
||||
p(c,function(b){new h(a,b)})},getSelectedPoints:function(){var a=[];p(this.series,function(b){a=a.concat(r(b.points||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return r(this.series,function(a){return a.selected})},setTitle:function(a,b,c){var d=this,f=d.options,g;g=f.title=F({style:{color:"#333333",fontSize:f.isStock?"16px":"18px"}},f.title,a);f=f.subtitle=F({style:{color:"#666666"}},f.subtitle,b);p([["title",a,g],["subtitle",b,f]],function(a,b){var c=a[0],f=d[c],
|
||||
g=a[1];a=a[2];f&&g&&(d[c]=f=f.destroy());a&&a.text&&!f&&(d[c]=d.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+c,zIndex:a.zIndex||4}).add(),d[c].update=function(a){d.setTitle(!b&&a,b&&a)},d[c].css(a.style))});d.layOutTitles(c)},layOutTitles:function(a){var b=0,c,d=this.renderer,f=this.spacingBox;p(["title","subtitle"],function(a){var c=this[a],g=this.options[a],e;c&&(e=g.style.fontSize,e=d.fontMetrics(e,c).b,c.css({width:(g.width||f.width+g.widthAdjust)+"px"}).align(H({y:b+
|
||||
e+("title"===a?-3:2)},g),!1,"spacingBox"),g.floating||g.verticalAlign||(b=Math.ceil(b+c.getBBox().height)))},this);c=this.titleOffset!==b;this.titleOffset=b;!this.isDirtyBox&&c&&(this.isDirtyBox=c,this.hasRendered&&x(a,!0)&&this.isDirtyBox&&this.redraw())},getChartSize:function(){var b=this.options.chart,f=b.width,b=b.height,g=this.renderToClone||this.renderTo;c(f)||(this.containerWidth=d(g,"width"));c(b)||(this.containerHeight=d(g,"height"));this.chartWidth=Math.max(0,f||this.containerWidth||600);
|
||||
this.chartHeight=Math.max(0,a.relativeLength(b,this.chartWidth)||this.containerHeight||400)},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;if(a){if(b){for(;b.childNodes.length;)this.renderTo.appendChild(b.firstChild);l(b);delete this.renderToClone}}else c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),e(b,{position:"absolute",top:"-9999px",display:"block"}),b.style.setProperty&&b.style.setProperty("display","block",
|
||||
"important"),u.body.appendChild(b),c&&b.appendChild(c)},setClassName:function(a){this.container.className="highcharts-container "+(a||"")},getContainer:function(){var b,c=this.options,d=c.chart,g,e;b=this.renderTo;var q=a.uniqueKey(),m;b||(this.renderTo=b=d.renderTo);f(b)&&(this.renderTo=b=u.getElementById(b));b||a.error(13,!0);g=J(E(b,"data-highcharts-chart"));A(g)&&k[g]&&k[g].hasRendered&&k[g].destroy();E(b,"data-highcharts-chart",this.index);b.innerHTML="";d.skipClone||b.offsetWidth||this.cloneRenderTo();
|
||||
this.getChartSize();g=this.chartWidth;e=this.chartHeight;m=H({position:"relative",overflow:"hidden",width:g+"px",height:e+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},d.style);this.container=b=n("div",{id:q},m,this.renderToClone||b);this._cursor=b.style.cursor;this.renderer=new (a[d.renderer]||R)(b,g,e,null,d.forExport,c.exporting&&c.exporting.allowHTML);this.setClassName(d.className);this.renderer.setStyle(d.style);this.renderer.chartIndex=this.index},
|
||||
getMargins:function(a){var b=this.spacing,d=this.margin,f=this.titleOffset;this.resetMargins();f&&!c(d[0])&&(this.plotTop=Math.max(this.plotTop,f+this.options.title.margin+b[0]));this.legend.display&&this.legend.adjustMargins(d,b);this.extraMargin&&(this[this.extraMargin.type]=(this[this.extraMargin.type]||0)+this.extraMargin.value);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],d=a.margin;a.hasCartesianSeries&&
|
||||
p(a.axes,function(a){a.visible&&a.getOffset()});p(G,function(f,g){c(d[g])||(a[f]+=b[g])});a.setChartSize()},reflow:function(a){var b=this,f=b.options.chart,g=b.renderTo,e=c(f.width),q=f.width||d(g,"width"),f=f.height||d(g,"height"),g=a?a.target:M;if(!e&&!b.isPrinting&&q&&f&&(g===M||g===u)){if(q!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),b.reflowTimeout=S(function(){b.container&&b.setSize(void 0,void 0,!1)},a?100:0);b.containerWidth=q;b.containerHeight=f}},initReflow:function(){var a=
|
||||
this,b;b=B(M,"resize",function(b){a.reflow(b)});B(a,"destroy",b)},setSize:function(b,c,d){var f=this,g=f.renderer;f.isResizing+=1;a.setAnimation(d,f);f.oldChartHeight=f.chartHeight;f.oldChartWidth=f.chartWidth;void 0!==b&&(f.options.chart.width=b);void 0!==c&&(f.options.chart.height=c);f.getChartSize();b=g.globalAnimation;(b?z:e)(f.container,{width:f.chartWidth+"px",height:f.chartHeight+"px"},b);f.setChartSize(!0);g.setSize(f.chartWidth,f.chartHeight,d);p(f.axes,function(a){a.isDirty=!0;a.setScale()});
|
||||
f.isDirtyLegend=!0;f.isDirtyBox=!0;f.layOutTitles();f.getMargins();f.redraw(d);f.oldChartHeight=null;m(f,"resize");S(function(){f&&m(f,"endResize",null,function(){--f.isResizing})},C(b).duration)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,f=this.chartHeight,g=this.options.chart,e=this.spacing,q=this.clipOffset,k,m,h,x;this.plotLeft=k=Math.round(this.plotLeft);this.plotTop=m=Math.round(this.plotTop);this.plotWidth=h=Math.max(0,Math.round(d-k-this.marginRight));
|
||||
this.plotHeight=x=Math.max(0,Math.round(f-m-this.marginBottom));this.plotSizeX=b?x:h;this.plotSizeY=b?h:x;this.plotBorderWidth=g.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:e[3],y:e[0],width:d-e[3]-e[1],height:f-e[0]-e[2]};this.plotBox=c.plotBox={x:k,y:m,width:h,height:x};d=2*Math.floor(this.plotBorderWidth/2);b=Math.ceil(Math.max(d,q[3])/2);c=Math.ceil(Math.max(d,q[0])/2);this.clipBox={x:b,y:c,width:Math.floor(this.plotSizeX-Math.max(d,q[1])/2-b),height:Math.max(0,Math.floor(this.plotSizeY-
|
||||
Math.max(d,q[2])/2-c))};a||p(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this,b=a.options.chart;p(["margin","spacing"],function(c){var d=b[c],f=v(d)?d:[d,d,d,d];p(["Top","Right","Bottom","Left"],function(d,g){a[c][g]=x(b[c+d],f[g])})});p(G,function(b,c){a[b]=x(a.margin[c],a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,f=this.chartBackground,
|
||||
g=this.plotBackground,e=this.plotBorder,q,k=this.plotBGImage,m=a.backgroundColor,p=a.plotBackgroundColor,h=a.plotBackgroundImage,x,l=this.plotLeft,r=this.plotTop,n=this.plotWidth,v=this.plotHeight,t=this.plotBox,y=this.clipRect,u=this.clipBox,J="animate";f||(this.chartBackground=f=b.rect().addClass("highcharts-background").add(),J="attr");q=a.borderWidth||0;x=q+(a.shadow?8:0);m={fill:m||"none"};if(q||f["stroke-width"])m.stroke=a.borderColor,m["stroke-width"]=q;f.attr(m).shadow(a.shadow);f[J]({x:x/
|
||||
2,y:x/2,width:c-x-q%2,height:d-x-q%2,r:a.borderRadius});J="animate";g||(J="attr",this.plotBackground=g=b.rect().addClass("highcharts-plot-background").add());g[J](t);g.attr({fill:p||"none"}).shadow(a.plotShadow);h&&(k?k.animate(t):this.plotBGImage=b.image(h,l,r,n,v).add());y?y.animate({width:u.width,height:u.height}):this.clipRect=b.clipRect(u);J="animate";e||(J="attr",this.plotBorder=e=b.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());e.attr({stroke:a.plotBorderColor,"stroke-width":a.plotBorderWidth||
|
||||
0,fill:"none"});e[J](e.crisp({x:l,y:r,width:n,height:v},-e.strokeWidth()));this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,f,g;p(["inverted","angular","polar"],function(e){c=L[b.type||b.defaultSeriesType];g=b[e]||c&&c.prototype[e];for(f=d&&d.length;!g&&f--;)(c=L[d[f].type])&&c.prototype[e]&&(g=!0);a[e]=g})},linkSeries:function(){var a=this,b=a.series;p(b,function(a){a.linkedSeries.length=0});p(b,function(b){var c=b.options.linkedTo;f(c)&&(c=":previous"===
|
||||
c?a.series[b.index-1]:a.get(c))&&c.linkedParent!==b&&(c.linkedSeries.push(b),b.linkedParent=c,b.visible=x(b.options.visible,c.options.visible,b.visible))})},renderSeries:function(){p(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&p(b.items,function(c){var d=H(b.style,c.style),f=J(d.left)+a.plotLeft,g=J(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(c.html,f,g).attr({zIndex:2}).css(d).add()})},render:function(){var a=
|
||||
this.axes,b=this.renderer,c=this.options,d,f,g;this.setTitle();this.legend=new y(this,c.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();c=this.plotWidth;d=this.plotHeight-=21;p(a,function(a){a.setScale()});this.getAxisMargins();f=1.1<c/this.plotWidth;g=1.05<d/this.plotHeight;if(f||g)p(a,function(a){(a.horiz&&f||!a.horiz&&g)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&p(a,function(a){a.visible&&a.render()});this.seriesGroup||
|
||||
(this.seriesGroup=b.g("series-group").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0},addCredits:function(a){var b=this;a=F(!0,this.options.credits,a);a.enabled&&!this.credits&&(this.credits=this.renderer.text(a.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){a.href&&(M.location.href=a.href)}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position),
|
||||
this.credits.update=function(a){b.credits=b.credits.destroy();b.addCredits(a)})},destroy:function(){var b=this,c=b.axes,d=b.series,f=b.container,g,e=f&&f.parentNode;m(b,"destroy");k[b.index]=void 0;a.chartCount--;b.renderTo.removeAttribute("data-highcharts-chart");K(b);for(g=c.length;g--;)c[g]=c[g].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(g=d.length;g--;)d[g]=d[g].destroy();p("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "),
|
||||
function(a){var c=b[a];c&&c.destroy&&(b[a]=c.destroy())});f&&(f.innerHTML="",K(f),e&&l(f));for(g in b)delete b[g]},isReadyToRender:function(){var a=this;return D||M!=M.top||"complete"===u.readyState?!0:(u.attachEvent("onreadystatechange",function(){u.detachEvent("onreadystatechange",a.firstRender);"complete"===u.readyState&&a.firstRender()}),!1)},firstRender:function(){var a=this,b=a.options;if(a.isReadyToRender()){a.getContainer();m(a,"init");a.resetMargins();a.setChartSize();a.propFromSeries();
|
||||
a.getAxes();p(b.series||[],function(b){a.initSeries(b)});a.linkSeries();m(a,"beforeRender");q&&(a.pointer=new q(a,b));a.render();if(!a.renderer.imgCount&&a.onload)a.onload();a.cloneRenderTo(!0)}},onload:function(){p([this.callback].concat(this.callbacks),function(a){a&&void 0!==this.index&&a.apply(this,[this])},this);m(this,"load");m(this,"render");c(this.index)&&!1!==this.options.chart.reflow&&this.initReflow();this.onload=null}}})(I);(function(a){var B,z=a.each,C=a.extend,E=a.erase,u=a.fireEvent,
|
||||
h=a.format,n=a.isArray,t=a.isNumber,l=a.pick,k=a.removeEvent;B=a.Point=function(){};B.prototype={init:function(a,c,k){this.series=a;this.color=a.color;this.applyOptions(c,k);a.options.colorByPoint?(c=a.options.colors||a.chart.options.colors,this.color=this.color||c[a.colorCounter],c=c.length,k=a.colorCounter,a.colorCounter++,a.colorCounter===c&&(a.colorCounter=0)):k=a.colorIndex;this.colorIndex=l(this.colorIndex,k);a.chart.pointCount++;return this},applyOptions:function(a,c){var e=this.series,k=e.options.pointValKey||
|
||||
e.pointValKey;a=B.prototype.optionsToObject.call(this,a);C(this,a);this.options=this.options?C(this.options,a):a;a.group&&delete this.group;k&&(this.y=this[k]);this.isNull=l(this.isValid&&!this.isValid(),null===this.x||!t(this.y,!0));this.selected&&(this.state="select");"name"in this&&void 0===c&&e.xAxis&&e.xAxis.hasNames&&(this.x=e.xAxis.nameToX(this));void 0===this.x&&e&&(this.x=void 0===c?e.autoIncrement(this):c);return this},optionsToObject:function(a){var c={},e=this.series,k=e.options.keys,
|
||||
b=k||e.pointArrayMap||["y"],m=b.length,d=0,h=0;if(t(a)||null===a)c[b[0]]=a;else if(n(a))for(!k&&a.length>m&&(e=typeof a[0],"string"===e?c.name=a[0]:"number"===e&&(c.x=a[0]),d++);h<m;)k&&void 0===a[d]||(c[b[h]]=a[d]),d++,h++;else"object"===typeof a&&(c=a,a.dataLabels&&(e._hasPointLabels=!0),a.marker&&(e._hasPointMarkers=!0));return c},getClassName:function(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":
|
||||
"")+(void 0!==this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",""):"")},getZone:function(){var a=this.series,c=a.zones,a=a.zoneAxis||"y",k=0,h;for(h=c[k];this[a]>=h.value;)h=c[++k];h&&h.color&&!this.options.color&&(this.color=h.color);return h},destroy:function(){var a=this.series.chart,c=a.hoverPoints,h;a.pointCount--;c&&(this.setState(),E(c,this),c.length||
|
||||
(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)k(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(h in this)this[h]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],c,k=6;k--;)c=a[k],this[c]&&(this[c]=this[c].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,
|
||||
point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var c=this.series,e=c.tooltipOptions,k=l(e.valueDecimals,""),b=e.valuePrefix||"",m=e.valueSuffix||"";z(c.pointArrayMap||["y"],function(c){c="{point."+c;if(b||m)a=a.replace(c+"}",b+c+"}"+m);a=a.replace(c+"}",c+":,."+k+"f}")});return h(a,{point:this,series:this.series})},firePointEvent:function(a,c,k){var e=this,b=this.series.options;(b.point.events[a]||e.options&&e.options.events&&e.options.events[a])&&
|
||||
this.importEvents();"click"===a&&b.allowPointSelect&&(k=function(a){e.select&&e.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});u(this,a,c,k)},visible:!0}})(I);(function(a){var B=a.addEvent,z=a.animObject,C=a.arrayMax,E=a.arrayMin,u=a.correctFloat,h=a.Date,n=a.defaultOptions,t=a.defaultPlotOptions,l=a.defined,k=a.each,e=a.erase,c=a.extend,p=a.fireEvent,H=a.grep,b=a.isArray,m=a.isNumber,d=a.isString,r=a.merge,A=a.pick,v=a.removeEvent,f=a.splat,y=a.SVGElement,G=a.syncTimeout,F=a.win;a.Series=a.seriesType("line",
|
||||
null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{lineWidth:0,lineColor:"#ffffff",radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",
|
||||
x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var d=this,f,e,g=a.series,q;d.chart=a;d.options=b=d.setOptions(b);d.linkedSeries=[];d.bindAxes();c(d,{name:b.name,
|
||||
state:"",visible:!1!==b.visible,selected:!0===b.selected});e=b.events;for(f in e)B(d,f,e[f]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();k(d.parallelArrays,function(a){d[a+"Data"]=[]});d.setData(b.data,!1);d.isCartesian&&(a.hasCartesianSeries=!0);g.length&&(q=g[g.length-1]);d._i=A(q&&q._i,-1)+1;a.orderSeries(this.insert(g))},insert:function(a){var b=this.options.index,c;if(m(b)){for(c=a.length;c--;)if(b>=A(a[c].options.index,
|
||||
a[c]._i)){a.splice(c+1,0,this);break}-1===c&&a.unshift(this);c+=1}else a.push(this);return A(c,a.length-1)},bindAxes:function(){var b=this,c=b.options,d=b.chart,f;k(b.axisTypes||[],function(e){k(d[e],function(a){f=a.options;if(c[e]===f.index||void 0!==c[e]&&c[e]===f.id||void 0===c[e]&&0===f.index)b.insert(a.series),b[e]=a,a.isDirty=!0});b[e]||b.optionalAxis===e||a.error(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments,f=m(b)?function(d){var f="y"===d&&c.toYData?c.toYData(a):
|
||||
a[d];c[d+"Data"][b]=f}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))};k(c.parallelArrays,f)},autoIncrement:function(){var a=this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,b=A(b,a.pointStart,0);this.pointInterval=c=A(this.pointInterval,a.pointInterval,1);d&&(a=new h(b),"day"===d?a=+a[h.hcSetDate](a[h.hcGetDate]()+c):"month"===d?a=+a[h.hcSetMonth](a[h.hcGetMonth]()+c):"year"===d&&(a=+a[h.hcSetFullYear](a[h.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},
|
||||
setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},f=c[this.type];this.userOptions=a;c=r(f,c.series,a);this.tooltipOptions=r(n.tooltip,n.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);null===f.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||
|
||||
0,className:"highcharts-negative",color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&l(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor});return c},getCyclic:function(a,b,c){var d,f=this.chart,g=this.userOptions,e=a+"Index",q=a+"Counter",k=c?c.length:A(f.options.chart[a+"Count"],f[a+"Count"]);b||(d=A(g[e],g["_"+e]),l(d)||(f.series.length||(f[q]=0),g["_"+e]=d=f[q]%k,f[q]+=1),c&&(b=c[d]));void 0!==d&&(this[e]=d);this[a]=b},getColor:function(){this.options.colorByPoint?
|
||||
this.options.color=null:this.getCyclic("color",this.options.color||t[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol,this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(c,f,e,h){var q=this,g=q.points,p=g&&g.length||0,l,x=q.options,r=q.chart,n=null,v=q.xAxis,t=x.turboThreshold,y=this.xData,u=this.yData,G=(l=q.pointArrayMap)&&l.length;c=c||[];l=c.length;f=A(f,!0);if(!1!==h&&l&&p===l&&!q.cropped&&
|
||||
!q.hasGroupedData&&q.visible)k(c,function(a,b){g[b].update&&a!==x.data[b]&&g[b].update(a,!1,null,!1)});else{q.xIncrement=null;q.colorCounter=0;k(this.parallelArrays,function(a){q[a+"Data"].length=0});if(t&&l>t){for(e=0;null===n&&e<l;)n=c[e],e++;if(m(n))for(e=0;e<l;e++)y[e]=this.autoIncrement(),u[e]=c[e];else if(b(n))if(G)for(e=0;e<l;e++)n=c[e],y[e]=n[0],u[e]=n.slice(1,G+1);else for(e=0;e<l;e++)n=c[e],y[e]=n[0],u[e]=n[1];else a.error(12)}else for(e=0;e<l;e++)void 0!==c[e]&&(n={series:q},q.pointClass.prototype.applyOptions.apply(n,
|
||||
[c[e]]),q.updateParallelArrays(n,e));d(u[0])&&a.error(14,!0);q.data=[];q.options.data=q.userOptions.data=c;for(e=p;e--;)g[e]&&g[e].destroy&&g[e].destroy();v&&(v.minRange=v.userMinRange);q.isDirty=r.isDirtyBox=!0;q.isDirtyData=!!g;e=!1}"point"===x.legendType&&(this.processData(),this.generatePoints());f&&r.redraw(e)},processData:function(b){var c=this.xData,d=this.yData,f=c.length,e;e=0;var g,q,k=this.xAxis,m,h=this.options;m=h.cropThreshold;var l=this.getExtremesFromAll||h.getExtremesFromAll,p=this.isCartesian,
|
||||
h=k&&k.val2lin,n=k&&k.isLog,r,v;if(p&&!this.isDirty&&!k.isDirty&&!this.yAxis.isDirty&&!b)return!1;k&&(b=k.getExtremes(),r=b.min,v=b.max);if(p&&this.sorted&&!l&&(!m||f>m||this.forceCrop))if(c[f-1]<r||c[0]>v)c=[],d=[];else if(c[0]<r||c[f-1]>v)e=this.cropData(this.xData,this.yData,r,v),c=e.xData,d=e.yData,e=e.start,g=!0;for(m=c.length||1;--m;)f=n?h(c[m])-h(c[m-1]):c[m]-c[m-1],0<f&&(void 0===q||f<q)?q=f:0>f&&this.requireSorting&&a.error(15);this.cropped=g;this.cropStart=e;this.processedXData=c;this.processedYData=
|
||||
d;this.closestPointRange=q},cropData:function(a,b,c,d){var f=a.length,g=0,e=f,q=A(this.cropShoulder,1),k;for(k=0;k<f;k++)if(a[k]>=c){g=Math.max(0,k-q);break}for(c=k;c<f;c++)if(a[c]>d){e=c+q;break}return{xData:a.slice(g,e),yData:b.slice(g,e),start:g,end:e}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,g=this.pointClass,k=d.length,m=this.cropStart||0,h,l=this.hasGroupedData,p,n=[],r;b||l||(b=[],b.length=a.length,b=this.data=b);for(r=0;r<
|
||||
k;r++)h=m+r,l?(p=(new g).init(this,[d[r]].concat(f(e[r]))),p.dataGroup=this.groupMap[r]):(p=b[h])||void 0===a[h]||(b[h]=p=(new g).init(this,a[h],d[r])),p.index=h,n[r]=p;if(b&&(k!==(c=b.length)||l))for(r=0;r<c;r++)r!==m||l||(r+=k),b[r]&&(b[r].destroyElements(),b[r].plotX=void 0);this.data=b;this.points=n},getExtremes:function(a){var c=this.yAxis,d=this.processedXData,f,e=[],g=0;f=this.xAxis.getExtremes();var q=f.min,k=f.max,h,l,p,r;a=a||this.stackedYData||this.processedYData||[];f=a.length;for(r=0;r<
|
||||
f;r++)if(l=d[r],p=a[r],h=(m(p,!0)||b(p))&&(!c.positiveValuesOnly||p.length||0<p),l=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(d[r+1]||l)>=q&&(d[r-1]||l)<=k,h&&l)if(h=p.length)for(;h--;)null!==p[h]&&(e[g++]=p[h]);else e[g++]=p;this.dataMin=E(e);this.dataMax=C(e)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,f=this.yAxis,e=this.points,k=e.length,h=!!this.modifyValue,p=a.pointPlacement,
|
||||
r="between"===p||m(p),n=a.threshold,v=a.startFromThreshold?n:0,t,y,G,F,H=Number.MAX_VALUE;"between"===p&&(p=.5);m(p)&&(p*=A(a.pointRange||c.pointRange));for(a=0;a<k;a++){var z=e[a],B=z.x,C=z.y;y=z.low;var E=b&&f.stacks[(this.negStacks&&C<(v?0:n)?"-":"")+this.stackKey],I;f.positiveValuesOnly&&null!==C&&0>=C&&(z.isNull=!0);z.plotX=t=u(Math.min(Math.max(-1E5,c.translate(B,0,0,0,1,p,"flags"===this.type)),1E5));b&&this.visible&&!z.isNull&&E&&E[B]&&(F=this.getStackIndicator(F,B,this.index),I=E[B],C=I.points[F.key],
|
||||
y=C[0],C=C[1],y===v&&F.key===E[B].base&&(y=A(n,f.min)),f.positiveValuesOnly&&0>=y&&(y=null),z.total=z.stackTotal=I.total,z.percentage=I.total&&z.y/I.total*100,z.stackY=C,I.setOffset(this.pointXOffset||0,this.barW||0));z.yBottom=l(y)?f.translate(y,0,1,0,1):null;h&&(C=this.modifyValue(C,z));z.plotY=y="number"===typeof C&&Infinity!==C?Math.min(Math.max(-1E5,f.translate(C,0,1,0,1)),1E5):void 0;z.isInside=void 0!==y&&0<=y&&y<=f.len&&0<=t&&t<=c.len;z.clientX=r?u(c.translate(B,0,0,0,1,p)):t;z.negative=z.y<
|
||||
(n||0);z.category=d&&void 0!==d[z.x]?d[z.x]:z.x;z.isNull||(void 0!==G&&(H=Math.min(H,Math.abs(t-G))),G=t);z.zone=this.zones.length&&z.getZone()}this.closestPointRangePx=H},getValidPoints:function(a,b){var c=this.chart;return H(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,f=b.inverted,e=this.clipBox,q=e||b.clipBox,k=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,q.height,
|
||||
c.xAxis,c.yAxis].join(),m=b[k],h=b[k+"m"];m||(a&&(q.width=0,b[k+"m"]=h=d.clipRect(-99,f?-b.plotLeft:-b.plotTop,99,f?b.chartWidth:b.chartHeight)),b[k]=m=d.clipRect(q),m.count={length:0});a&&!m.count[this.index]&&(m.count[this.index]=!0,m.count.length+=1);!1!==c.clip&&(this.group.clip(a||e?m:b.clipRect),this.markerGroup.clip(h),this.sharedClipKey=k);a||(m.count[this.index]&&(delete m.count[this.index],--m.count.length),0===m.count.length&&k&&b[k]&&(e||(b[k]=b[k].destroy()),b[k+"m"]&&(this.markerGroup.clip(),
|
||||
b[k+"m"]=b[k+"m"].destroy())))},animate:function(a){var b=this.chart,c=z(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+99},c),this.animate=null)},afterAnimate:function(){this.setClip();p(this,"afterAnimate")},drawPoints:function(){var a=this.points,b=this.chart,c,d,f,e,k=this.options.marker,h,p,l,r,n=this.markerGroup,v=A(k.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>=2*k.radius);
|
||||
if(!1!==k.enabled||this._hasPointMarkers)for(d=0;d<a.length;d++)f=a[d],c=f.plotY,e=f.graphic,h=f.marker||{},p=!!f.marker,l=v&&void 0===h.enabled||h.enabled,r=f.isInside,l&&m(c)&&null!==f.y?(c=A(h.symbol,this.symbol),f.hasImage=0===c.indexOf("url"),l=this.markerAttribs(f,f.selected&&"select"),e?e[r?"show":"hide"](!0).animate(l):r&&(0<l.width||f.hasImage)&&(f.graphic=e=b.renderer.symbol(c,l.x,l.y,l.width,l.height,p?h:k).add(n)),e&&e.attr(this.pointAttribs(f,f.selected&&"select")),e&&e.addClass(f.getClassName(),
|
||||
!0)):e&&(f.graphic=e.destroy())},markerAttribs:function(a,b){var c=this.options.marker,d=a.marker||{},f=A(d.radius,c.radius);b&&(c=c.states[b],b=d.states&&d.states[b],f=A(b&&b.radius,c&&c.radius,f+(c&&c.radiusPlus||0)));a.hasImage&&(f=0);a={x:Math.floor(a.plotX)-f,y:a.plotY-f};f&&(a.width=a.height=2*f);return a},pointAttribs:function(a,b){var c=this.options.marker,d=a&&a.options,f=d&&d.marker||{},e=this.color,q=d&&d.color,k=a&&a.color,d=A(f.lineWidth,c.lineWidth);a=a&&a.zone&&a.zone.color;e=q||a||
|
||||
k||e;a=f.fillColor||c.fillColor||e;e=f.lineColor||c.lineColor||e;b&&(c=c.states[b],b=f.states&&f.states[b]||{},d=A(b.lineWidth,c.lineWidth,d+A(b.lineWidthPlus,c.lineWidthPlus,0)),a=b.fillColor||c.fillColor||a,e=b.lineColor||c.lineColor||e);return{stroke:e,"stroke-width":d,fill:a}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(F.navigator.userAgent),d,f=a.data||[],g,m,h;p(a,"destroy");v(a);k(a.axisTypes||[],function(b){(h=a[b])&&h.series&&(e(h.series,a),h.isDirty=h.forceRedraw=
|
||||
!0)});a.legendItem&&a.chart.legend.destroyItem(a);for(d=f.length;d--;)(g=f[d])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);for(m in a)a[m]instanceof y&&!a[m].survive&&(d=c&&"group"===m?"hide":"destroy",a[m][d]());b.hoverSeries===a&&(b.hoverSeries=null);e(b.series,a);b.orderSeries();for(m in a)delete a[m]},getGraphPath:function(a,b,c){var d=this,f=d.options,e=f.step,q,m=[],h=[],p;a=a||d.points;(q=a.reversed)&&a.reverse();(e={right:1,center:2}[e]||e&&3)&&q&&(e=4-e);!f.connectNulls||
|
||||
b||c||(a=this.getValidPoints(a));k(a,function(g,k){var q=g.plotX,r=g.plotY,n=a[k-1];(g.leftCliff||n&&n.rightCliff)&&!c&&(p=!0);g.isNull&&!l(b)&&0<k?p=!f.connectNulls:g.isNull&&!b?p=!0:(0===k||p?k=["M",g.plotX,g.plotY]:d.getPointSpline?k=d.getPointSpline(a,g,k):e?(k=1===e?["L",n.plotX,r]:2===e?["L",(n.plotX+q)/2,n.plotY,"L",(n.plotX+q)/2,r]:["L",q,n.plotY],k.push("L",q,r)):k=["L",q,r],h.push(g.x),e&&h.push(g.x),m.push.apply(m,k),p=!1)});m.xMap=h;return d.graphPath=m},drawGraph:function(){var a=this,
|
||||
b=this.options,c=(this.gappedPath||this.getGraphPath).call(this),d=[["graph","highcharts-graph",b.lineColor||this.color,b.dashStyle]];k(this.zones,function(c,f){d.push(["zone-graph-"+f,"highcharts-graph highcharts-zone-graph-"+f+" "+(c.className||""),c.color||a.color,c.dashStyle||b.dashStyle])});k(d,function(d,f){var e=d[0],g=a[e];g?(g.endX=c.xMap,g.animate({d:c})):c.length&&(a[e]=a.chart.renderer.path(c).addClass(d[1]).attr({zIndex:1}).add(a.group),g={stroke:d[2],"stroke-width":b.lineWidth,fill:a.fillGraph&&
|
||||
a.color||"none"},d[3]?g.dashstyle=d[3]:"square"!==b.linecap&&(g["stroke-linecap"]=g["stroke-linejoin"]="round"),g=a[e].attr(g).shadow(2>f&&b.shadow));g&&(g.startX=c.xMap,g.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,f,e,m=this.clips||[],h,p=this.graph,l=this.area,r=Math.max(b.chartWidth,b.chartHeight),n=this[(this.zoneAxis||"y")+"Axis"],v,t,y=b.inverted,u,G,F,H,z=!1;d.length&&(p||l)&&n&&void 0!==n.min&&(t=n.reversed,u=n.horiz,p&&p.hide(),l&&l.hide(),
|
||||
v=n.getExtremes(),k(d,function(d,g){f=t?u?b.plotWidth:0:u?0:n.toPixels(v.min);f=Math.min(Math.max(A(e,f),0),r);e=Math.min(Math.max(Math.round(n.toPixels(A(d.value,v.max),!0)),0),r);z&&(f=e=n.toPixels(v.max));G=Math.abs(f-e);F=Math.min(f,e);H=Math.max(f,e);n.isXAxis?(h={x:y?H:F,y:0,width:G,height:r},u||(h.x=b.plotHeight-h.x)):(h={x:0,y:y?H:F,width:r,height:G},u&&(h.y=b.plotWidth-h.y));y&&c.isVML&&(h=n.isXAxis?{x:0,y:t?F:H,height:h.width,width:b.chartWidth}:{x:h.y-b.plotLeft-b.spacingBox.x,y:0,width:h.height,
|
||||
height:b.chartHeight});m[g]?m[g].animate(h):(m[g]=c.clipRect(h),p&&a["zone-graph-"+g].clip(m[g]),l&&a["zone-area-"+g].clip(m[g]));z=d.value>v.max}),this.clips=m)},invertGroups:function(a){function b(){k(["group","markerGroup"],function(b){c[b]&&(d.renderer.isVML&&c[b].attr({width:c.yAxis.len,height:c.xAxis.len}),c[b].width=c.yAxis.len,c[b].height=c.xAxis.len,c[b].invert(a))})}var c=this,d=c.chart,f;c.xAxis&&(f=B(d,"resize",b),B(c,"destroy",f),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,f){var e=
|
||||
this[a],k=!e;k&&(this[a]=e=this.chart.renderer.g(b).attr({zIndex:d||.1}).add(f),e.addClass("highcharts-series-"+this.index+" highcharts-"+this.type+"-series highcharts-color-"+this.colorIndex+" "+(this.options.className||"")));e.attr({visibility:c})[k?"attr":"animate"](this.getPlotBox());return e},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=
|
||||
this,b=a.chart,c,d=a.options,f=!!a.animate&&b.renderer.isSVG&&z(d.animation).duration,e=a.visible?"inherit":"hidden",k=d.zIndex,m=a.hasRendered,h=b.seriesGroup,p=b.inverted;c=a.plotGroup("group","series",e,k,h);a.markerGroup=a.plotGroup("markerGroup","markers",e,k,h);f&&a.animate(!0);c.inverted=a.isCartesian?p:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(p);
|
||||
!1===d.clip||a.sharedClipKey||m||c.clip(b.clipRect);f&&a.animate();m||(a.animationTimeout=G(function(){a.afterAnimate()},f));a.isDirty=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,c=this.group,d=this.xAxis,f=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:A(d&&d.left,a.plotLeft),translateY:A(f&&f.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX",
|
||||
"plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,f=this.chart.inverted;return this.searchKDTree({clientX:f?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:f?d.len-a.chartX+d.pos:a.chartY-d.pos},b)},buildKDTree:function(){function a(c,d,f){var e,g;if(g=c&&c.length)return e=b.kdAxisArray[d%f],c.sort(function(a,b){return a[e]-b[e]}),g=Math.floor(g/2),{point:c[g],left:a(c.slice(0,g),d+1,f),right:a(c.slice(g+1),d+1,f)}}this.buildingKdTree=!0;var b=this,c=b.kdDimensions;delete b.kdTree;G(function(){b.kdTree=
|
||||
a(b.getValidPoints(null,!b.directTouch),c,c);b.buildingKdTree=!1},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,g,m){var h=b.point,p=d.kdAxisArray[g%m],q,r,n=h;r=l(a[f])&&l(h[f])?Math.pow(a[f]-h[f],2):null;q=l(a[e])&&l(h[e])?Math.pow(a[e]-h[e],2):null;q=(r||0)+(q||0);h.dist=l(q)?Math.sqrt(q):Number.MAX_VALUE;h.distX=l(r)?Math.sqrt(r):Number.MAX_VALUE;p=a[p]-h[p];q=0>p?"left":"right";r=0>p?"right":"left";b[q]&&(q=c(a,b[q],g+1,m),n=q[k]<n[k]?q:h);b[r]&&Math.sqrt(p*p)<n[k]&&(a=c(a,
|
||||
b[r],g+1,m),n=a[k]<n[k]?a:n);return n}var d=this,f=this.kdAxisArray[0],e=this.kdAxisArray[1],k=b?"distX":"dist";this.kdTree||this.buildingKdTree||this.buildKDTree();if(this.kdTree)return c(a,this.kdTree,this.kdDimensions,this.kdDimensions)}})})(I);(function(a){function B(a,e,c,h,n){var b=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=e;this.x=h;this.total=null;this.points={};this.stack=n;this.rightCliff=this.leftCliff=0;this.alignOptions={align:e.align||(b?c?"left":"right":"center"),
|
||||
verticalAlign:e.verticalAlign||(b?"middle":c?"bottom":"top"),y:l(e.y,b?4:c?14:-6),x:l(e.x,b?c?-6:6:0)};this.textAlign=e.textAlign||(b?c?"right":"left":"center")}var z=a.Axis,C=a.Chart,E=a.correctFloat,u=a.defined,h=a.destroyObjectProperties,n=a.each,t=a.format,l=a.pick;a=a.Series;B.prototype={destroy:function(){h(this,this.axis)},render:function(a){var e=this.options,c=e.format,c=c?t(c,this):e.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,
|
||||
null,null,e.useHTML).css(e.style).attr({align:this.textAlign,rotation:e.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,e){var c=this.axis,k=c.chart,h=k.inverted,b=c.reversed,b=this.isNegative&&!b||!this.isNegative&&b,m=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=Math.abs(m-c);a=k.xAxis[0].translate(this.x)+a;var d=k.plotHeight,h={x:h?b?m:m-c:a,y:h?d-a-e:b?d-m-c:d-m,width:h?c:e,height:h?e:c};if(e=this.label)e.align(this.alignOptions,null,h),h=e.alignAttr,e[!1===
|
||||
this.options.crop||k.isInsidePlot(h.x,h.y)?"show":"hide"](!0)}};C.prototype.getStacks=function(){var a=this;n(a.yAxis,function(a){a.stacks&&a.hasVisibleSeries&&(a.oldStacks=a.stacks)});n(a.series,function(e){!e.options.stacking||!0!==e.visible&&!1!==a.options.chart.ignoreHiddenSeries||(e.stackKey=e.type+l(e.options.stack,""))})};z.prototype.buildStacks=function(){var a=this.series,e,c=l(this.options.reversedStacks,!0),h=a.length,n;if(!this.isXAxis){this.usePercentage=!1;for(n=h;n--;)a[c?n:h-n-1].setStackedPoints();
|
||||
for(n=h;n--;)e=a[c?n:h-n-1],e.setStackCliffs&&e.setStackCliffs();if(this.usePercentage)for(n=0;n<h;n++)a[n].setPercentStacks()}};z.prototype.renderStackTotals=function(){var a=this.chart,e=a.renderer,c=this.stacks,h,l,b=this.stackTotalGroup;b||(this.stackTotalGroup=b=e.g("stack-labels").attr({visibility:"visible",zIndex:6}).add());b.translate(a.plotLeft,a.plotTop);for(h in c)for(l in a=c[h],a)a[l].render(b)};z.prototype.resetStacks=function(){var a=this.stacks,e,c;if(!this.isXAxis)for(e in a)for(c in a[e])a[e][c].touched<
|
||||
this.stacksTouched?(a[e][c].destroy(),delete a[e][c]):(a[e][c].total=null,a[e][c].cum=null)};z.prototype.cleanStacks=function(){var a,e,c;if(!this.isXAxis)for(e in this.oldStacks&&(a=this.stacks=this.oldStacks),a)for(c in a[e])a[e][c].cum=a[e][c].total};a.prototype.setStackedPoints=function(){if(this.options.stacking&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var a=this.processedXData,e=this.processedYData,c=[],h=e.length,n=this.options,b=n.threshold,m=n.startFromThreshold?
|
||||
b:0,d=n.stack,n=n.stacking,r=this.stackKey,t="-"+r,v=this.negStacks,f=this.yAxis,y=f.stacks,G=f.oldStacks,F,q,x,z,K,C,g;f.stacksTouched+=1;for(K=0;K<h;K++)C=a[K],g=e[K],F=this.getStackIndicator(F,C,this.index),z=F.key,x=(q=v&&g<(m?0:b))?t:r,y[x]||(y[x]={}),y[x][C]||(G[x]&&G[x][C]?(y[x][C]=G[x][C],y[x][C].total=null):y[x][C]=new B(f,f.options.stackLabels,q,C,d)),x=y[x][C],null!==g&&(x.points[z]=x.points[this.index]=[l(x.cum,m)],u(x.cum)||(x.base=z),x.touched=f.stacksTouched,0<F.index&&!1===this.singleStacks&&
|
||||
(x.points[z][0]=x.points[this.index+","+C+",0"][0])),"percent"===n?(q=q?r:t,v&&y[q]&&y[q][C]?(q=y[q][C],x.total=q.total=Math.max(q.total,x.total)+Math.abs(g)||0):x.total=E(x.total+(Math.abs(g)||0))):x.total=E(x.total+(g||0)),x.cum=l(x.cum,m)+(g||0),null!==g&&(x.points[z].push(x.cum),c[K]=x.cum);"percent"===n&&(f.usePercentage=!0);this.stackedYData=c;f.oldStacks={}}};a.prototype.setPercentStacks=function(){var a=this,e=a.stackKey,c=a.yAxis.stacks,h=a.processedXData,l;n([e,"-"+e],function(b){for(var e=
|
||||
h.length,d,k;e--;)if(d=h[e],l=a.getStackIndicator(l,d,a.index,b),d=(k=c[b]&&c[b][d])&&k.points[l.key])k=k.total?100/k.total:0,d[0]=E(d[0]*k),d[1]=E(d[1]*k),a.stackedYData[e]=d[1]})};a.prototype.getStackIndicator=function(a,e,c,h){!u(a)||a.x!==e||h&&a.key!==h?a={x:e,index:0,key:h}:a.index++;a.key=[c,e,a.index].join();return a}})(I);(function(a){var B=a.addEvent,z=a.animate,C=a.Axis,E=a.createElement,u=a.css,h=a.defined,n=a.each,t=a.erase,l=a.extend,k=a.fireEvent,e=a.inArray,c=a.isNumber,p=a.isObject,
|
||||
H=a.merge,b=a.pick,m=a.Point,d=a.Series,r=a.seriesTypes,A=a.setAnimation,v=a.splat;l(a.Chart.prototype,{addSeries:function(a,c,d){var f,e=this;a&&(c=b(c,!0),k(e,"addSeries",{options:a},function(){f=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();c&&e.redraw(d)}));return f},addAxis:function(a,c,d,e){var f=c?"xAxis":"yAxis",h=this.options;a=H(a,{index:this[f].length,isX:c});new C(this,a);h[f]=v(h[f]||{});h[f].push(a);b(d,!0)&&this.redraw(e)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,
|
||||
f=c.loading,e=function(){d&&u(d,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};d||(b.loadingDiv=d=E("div",{className:"highcharts-loading highcharts-loading-hidden"},null,b.container),b.loadingSpan=E("span",{className:"highcharts-loading-inner"},null,d),B(b,"redraw",e));d.className="highcharts-loading";b.loadingSpan.innerHTML=a||c.lang.loading;u(d,l(f.style,{zIndex:10}));u(b.loadingSpan,f.labelStyle);b.loadingShown||(u(d,{opacity:0,display:""}),z(d,{opacity:f.style.opacity||
|
||||
.5},{duration:f.showDuration||0}));b.loadingShown=!0;e()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&(b.className="highcharts-loading highcharts-loading-hidden",z(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){u(b,{display:"none"})}}));this.loadingShown=!1},propsRequireDirtyBox:"backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
|
||||
propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions".split(" "),update:function(a,d){var f,k={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle"},m=a.chart,l,p;if(m){H(!0,this.options.chart,m);"className"in m&&this.setClassName(m.className);if("inverted"in m||"polar"in m)this.propFromSeries(),l=!0;for(f in m)m.hasOwnProperty(f)&&(-1!==e("chart."+f,this.propsRequireUpdateSeries)&&(p=!0),-1!==e(f,this.propsRequireDirtyBox)&&(this.isDirtyBox=
|
||||
!0));"style"in m&&this.renderer.setStyle(m.style)}for(f in a){if(this[f]&&"function"===typeof this[f].update)this[f].update(a[f],!1);else if("function"===typeof this[k[f]])this[k[f]](a[f]);"chart"!==f&&-1!==e(f,this.propsRequireUpdateSeries)&&(p=!0)}a.colors&&(this.options.colors=a.colors);a.plotOptions&&H(!0,this.options.plotOptions,a.plotOptions);n(["xAxis","yAxis","series"],function(b){a[b]&&n(v(a[b]),function(a,c){(c=h(a.id)&&this.get(a.id)||this[b][c])&&c.coll===b&&c.update(a,!1)},this)},this);
|
||||
l&&n(this.axes,function(a){a.update({},!1)});p&&n(this.series,function(a){a.update({},!1)});a.loading&&H(!0,this.options.loading,a.loading);f=m&&m.width;m=m&&m.height;c(f)&&f!==this.chartWidth||c(m)&&m!==this.chartHeight?this.setSize(f,m):b(d,!0)&&this.redraw()},setSubtitle:function(a){this.setTitle(void 0,a)}});l(m.prototype,{update:function(a,c,d,e){function f(){h.applyOptions(a);null===h.y&&k&&(h.graphic=k.destroy());p(a,!0)&&(k&&k.element&&a&&a.marker&&a.marker.symbol&&(h.graphic=k.destroy()),
|
||||
a&&a.dataLabels&&h.dataLabel&&(h.dataLabel=h.dataLabel.destroy()));l=h.index;m.updateParallelArrays(h,l);n.data[l]=p(n.data[l],!0)||p(a,!0)?h.options:a;m.isDirty=m.isDirtyData=!0;!m.fixedBox&&m.hasCartesianSeries&&(g.isDirtyBox=!0);"point"===n.legendType&&(g.isDirtyLegend=!0);c&&g.redraw(d)}var h=this,m=h.series,k=h.graphic,l,g=m.chart,n=m.options;c=b(c,!0);!1===e?f():h.firePointEvent("update",{options:a},f)},remove:function(a,b){this.series.removePoint(e(this,this.series.data),a,b)}});l(d.prototype,
|
||||
{addPoint:function(a,c,d,e){var f=this.options,h=this.data,m=this.chart,k=this.xAxis,k=k&&k.hasNames&&k.names,l=f.data,g,p,n=this.xData,r,v;c=b(c,!0);g={series:this};this.pointClass.prototype.applyOptions.apply(g,[a]);v=g.x;r=n.length;if(this.requireSorting&&v<n[r-1])for(p=!0;r&&n[r-1]>v;)r--;this.updateParallelArrays(g,"splice",r,0,0);this.updateParallelArrays(g,r);k&&g.name&&(k[v]=g.name);l.splice(r,0,a);p&&(this.data.splice(r,0,null),this.processData());"point"===f.legendType&&this.generatePoints();
|
||||
d&&(h[0]&&h[0].remove?h[0].remove(!1):(h.shift(),this.updateParallelArrays(g,"shift"),l.shift()));this.isDirtyData=this.isDirty=!0;c&&m.redraw(e)},removePoint:function(a,c,d){var f=this,e=f.data,h=e[a],m=f.points,k=f.chart,l=function(){m&&m.length===e.length&&m.splice(a,1);e.splice(a,1);f.options.data.splice(a,1);f.updateParallelArrays(h||{series:f},"splice",a,1);h&&h.destroy();f.isDirty=!0;f.isDirtyData=!0;c&&k.redraw()};A(d,k);c=b(c,!0);h?h.firePointEvent("remove",null,l):l()},remove:function(a,
|
||||
c,d){function f(){e.destroy();h.isDirtyLegend=h.isDirtyBox=!0;h.linkSeries();b(a,!0)&&h.redraw(c)}var e=this,h=e.chart;!1!==d?k(e,"remove",null,f):f()},update:function(a,c){var d=this,f=this.chart,e=this.userOptions,h=this.oldType||this.type,m=a.type||e.type||f.options.chart.type,k=r[h].prototype,p=["group","markerGroup","dataLabelsGroup"],g;if(m&&m!==h||void 0!==a.zIndex)p.length=0;n(p,function(a){p[a]=d[a];delete d[a]});a=H(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},
|
||||
a);this.remove(!1,null,!1);for(g in k)this[g]=void 0;l(this,r[m||h].prototype);n(p,function(a){d[a]=p[a]});this.init(f,a);this.oldType=h;f.linkSeries();b(c,!0)&&f.redraw(!1)}});l(C.prototype,{update:function(a,c){var d=this.chart;a=d.options[this.coll][this.options.index]=H(this.userOptions,a);this.destroy(!0);this.init(d,l(a,{events:void 0}));d.isDirtyBox=!0;b(c,!0)&&d.redraw()},remove:function(a){for(var c=this.chart,d=this.coll,f=this.series,e=f.length;e--;)f[e]&&f[e].remove(!1);t(c.axes,this);
|
||||
t(c[d],this);c.options[d].splice(this.options.index,1);n(c[d],function(a,b){a.options.index=b});this.destroy();c.isDirtyBox=!0;b(a,!0)&&c.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}})})(I);(function(a){var B=a.color,z=a.each,C=a.map,E=a.pick,u=a.Series,h=a.seriesType;h("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var a=[],h=[],l=this.xAxis,k=this.yAxis,e=k.stacks[this.stackKey],c={},
|
||||
p=this.points,u=this.index,b=k.series,m=b.length,d,r=E(k.options.reversedStacks,!0)?1:-1,A,v;if(this.options.stacking){for(A=0;A<p.length;A++)c[p[A].x]=p[A];for(v in e)null!==e[v].total&&h.push(v);h.sort(function(a,b){return a-b});d=C(b,function(){return this.visible});z(h,function(b,p){var f=0,n,q;if(c[b]&&!c[b].isNull)a.push(c[b]),z([-1,1],function(a){var f=1===a?"rightNull":"leftNull",k=0,l=e[h[p+a]];if(l)for(A=u;0<=A&&A<m;)n=l.points[A],n||(A===u?c[b][f]=!0:d[A]&&(q=e[b].points[A])&&(k-=q[1]-
|
||||
q[0])),A+=r;c[b][1===a?"rightCliff":"leftCliff"]=k});else{for(A=u;0<=A&&A<m;){if(n=e[b].points[A]){f=n[1];break}A+=r}f=k.translate(f,0,1,0,1);a.push({isNull:!0,plotX:l.translate(b,0,0,0,1),x:b,plotY:f,yBottom:f})}})}return a},getGraphPath:function(a){var h=u.prototype.getGraphPath,l=this.options,k=l.stacking,e=this.yAxis,c,p,n=[],b=[],m=this.index,d,r=e.stacks[this.stackKey],A=l.threshold,v=e.getThreshold(l.threshold),f,l=l.connectNulls||"percent"===k,y=function(c,f,h){var l=a[c];c=k&&r[l.x].points[m];
|
||||
var p=l[h+"Null"]||0;h=l[h+"Cliff"]||0;var q,t,l=!0;h||p?(q=(p?c[0]:c[1])+h,t=c[0]+h,l=!!p):!k&&a[f]&&a[f].isNull&&(q=t=A);void 0!==q&&(b.push({plotX:d,plotY:null===q?v:e.getThreshold(q),isNull:l,isCliff:!0}),n.push({plotX:d,plotY:null===t?v:e.getThreshold(t),doCurve:!1}))};a=a||this.points;k&&(a=this.getStackPoints());for(c=0;c<a.length;c++)if(p=a[c].isNull,d=E(a[c].rectPlotX,a[c].plotX),f=E(a[c].yBottom,v),!p||l)l||y(c,c-1,"left"),p&&!k&&l||(b.push(a[c]),n.push({x:c,plotX:d,plotY:f})),l||y(c,c+
|
||||
1,"right");c=h.call(this,b,!0,!0);n.reversed=!0;p=h.call(this,n,!0,!0);p.length&&(p[0]="L");p=c.concat(p);h=h.call(this,b,!1,l);p.xMap=c.xMap;this.areaPath=p;return h},drawGraph:function(){this.areaPath=[];u.prototype.drawGraph.apply(this);var a=this,h=this.areaPath,l=this.options,k=[["area","highcharts-area",this.color,l.fillColor]];z(this.zones,function(e,c){k.push(["zone-area-"+c,"highcharts-area highcharts-zone-area-"+c+" "+e.className,e.color||a.color,e.fillColor||l.fillColor])});z(k,function(e){var c=
|
||||
e[0],k=a[c];k?(k.endX=h.xMap,k.animate({d:h})):(k=a[c]=a.chart.renderer.path(h).addClass(e[1]).attr({fill:E(e[3],B(e[2]).setOpacity(E(l.fillOpacity,.75)).get()),zIndex:0}).add(a.group),k.isArea=!0);k.startX=h.xMap;k.shiftUnit=l.step?2:1})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(I);(function(a){var B=a.pick;a=a.seriesType;a("spline","line",{},{getPointSpline:function(a,C,E){var u=C.plotX,h=C.plotY,n=a[E-1];E=a[E+1];var t,l,k,e;if(n&&!n.isNull&&!1!==n.doCurve&&!C.isCliff&&E&&!E.isNull&&
|
||||
!1!==E.doCurve&&!C.isCliff){a=n.plotY;k=E.plotX;E=E.plotY;var c=0;t=(1.5*u+n.plotX)/2.5;l=(1.5*h+a)/2.5;k=(1.5*u+k)/2.5;e=(1.5*h+E)/2.5;k!==t&&(c=(e-l)*(k-u)/(k-t)+h-e);l+=c;e+=c;l>a&&l>h?(l=Math.max(a,h),e=2*h-l):l<a&&l<h&&(l=Math.min(a,h),e=2*h-l);e>E&&e>h?(e=Math.max(E,h),l=2*h-e):e<E&&e<h&&(e=Math.min(E,h),l=2*h-e);C.rightContX=k;C.rightContY=e}C=["C",B(n.rightContX,n.plotX),B(n.rightContY,n.plotY),B(t,u),B(l,h),u,h];n.rightContX=n.rightContY=null;return C}})})(I);(function(a){var B=a.seriesTypes.area.prototype,
|
||||
z=a.seriesType;z("areaspline","spline",a.defaultPlotOptions.area,{getStackPoints:B.getStackPoints,getGraphPath:B.getGraphPath,setStackCliffs:B.setStackCliffs,drawGraph:B.drawGraph,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(I);(function(a){var B=a.animObject,z=a.color,C=a.each,E=a.extend,u=a.isNumber,h=a.merge,n=a.pick,t=a.Series,l=a.seriesType,k=a.svg;l("column","line",{borderRadius:0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,
|
||||
brightness:.1,shadow:!1},select:{color:"#cccccc",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:"#ffffff"},{cropShoulder:0,directTouch:!0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){t.prototype.init.apply(this,arguments);var a=this,c=a.chart;c.hasRendered&&C(c.series,function(c){c.type===a.type&&(c.isDirty=!0)})},getColumnMetrics:function(){var a=
|
||||
this,c=a.options,h=a.xAxis,k=a.yAxis,b=h.reversed,m,d={},l=0;!1===c.grouping?l=1:C(a.chart.series,function(b){var c=b.options,f=b.yAxis,e;b.type===a.type&&b.visible&&k.len===f.len&&k.pos===f.pos&&(c.stacking?(m=b.stackKey,void 0===d[m]&&(d[m]=l++),e=d[m]):!1!==c.grouping&&(e=l++),b.columnIndex=e)});var t=Math.min(Math.abs(h.transA)*(h.ordinalSlope||c.pointRange||h.closestPointRange||h.tickInterval||1),h.len),v=t*c.groupPadding,f=(t-2*v)/(l||1),c=Math.min(c.maxPointWidth||h.len,n(c.pointWidth,f*(1-
|
||||
2*c.pointPadding)));a.columnMetrics={width:c,offset:(f-c)/2+(v+((a.columnIndex||0)+(b?1:0))*f-t/2)*(b?-1:1)};return a.columnMetrics},crispCol:function(a,c,h,k){var b=this.chart,e=this.borderWidth,d=-(e%2?.5:0),e=e%2?.5:1;b.inverted&&b.renderer.isVML&&(e+=1);h=Math.round(a+h)+d;a=Math.round(a)+d;k=Math.round(c+k)+e;d=.5>=Math.abs(c)&&.5<k;c=Math.round(c)+e;k-=c;d&&k&&(--c,k+=1);return{x:a,y:c,width:h-a,height:k}},translate:function(){var a=this,c=a.chart,h=a.options,k=a.dense=2>a.closestPointRange*
|
||||
a.xAxis.transA,k=a.borderWidth=n(h.borderWidth,k?0:1),b=a.yAxis,m=a.translatedThreshold=b.getThreshold(h.threshold),d=n(h.minPointLength,5),l=a.getColumnMetrics(),u=l.width,v=a.barW=Math.max(u,1+2*k),f=a.pointXOffset=l.offset;c.inverted&&(m-=.5);h.pointPadding&&(v=Math.ceil(v));t.prototype.translate.apply(a);C(a.points,function(e){var h=n(e.yBottom,m),k=999+Math.abs(h),k=Math.min(Math.max(-k,e.plotY),b.len+k),l=e.plotX+f,p=v,r=Math.min(k,h),t,y=Math.max(k,h)-r;Math.abs(y)<d&&d&&(y=d,t=!b.reversed&&
|
||||
!e.negative||b.reversed&&e.negative,r=Math.abs(r-m)>d?h-d:m-(t?d:0));e.barX=l;e.pointWidth=u;e.tooltipPos=c.inverted?[b.len+b.pos-c.plotLeft-k,a.xAxis.len-l-p/2,y]:[l+p/2,k+b.pos-c.plotTop,y];e.shapeType="rect";e.shapeArgs=a.crispCol.apply(a,e.isNull?[e.plotX,b.len/2,0,0]:[l,r,p,y])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,c){var e=this.options,k,b=this.pointAttrToOptions||
|
||||
{};k=b.stroke||"borderColor";var m=b["stroke-width"]||"borderWidth",d=a&&a.color||this.color,l=a[k]||e[k]||this.color||d,n=a[m]||e[m]||this[m]||0,b=e.dashStyle;a&&this.zones.length&&(d=(d=a.getZone())&&d.color||a.options.color||this.color);c&&(a=h(e.states[c],a.options.states&&a.options.states[c]||{}),c=a.brightness,d=a.color||void 0!==c&&z(d).brighten(a.brightness).get()||d,l=a[k]||l,n=a[m]||n,b=a.dashStyle||b);k={fill:d,stroke:l,"stroke-width":n};e.borderRadius&&(k.r=e.borderRadius);b&&(k.dashstyle=
|
||||
b);return k},drawPoints:function(){var a=this,c=this.chart,k=a.options,l=c.renderer,b=k.animationLimit||250,m;C(a.points,function(d){var e=d.graphic;if(u(d.plotY)&&null!==d.y){m=d.shapeArgs;if(e)e[c.pointCount<b?"animate":"attr"](h(m));else d.graphic=e=l[d.shapeType](m).add(d.group||a.group);e.attr(a.pointAttribs(d,d.selected&&"select")).shadow(k.shadow,null,k.stacking&&!k.borderRadius);e.addClass(d.getClassName(),!0)}else e&&(d.graphic=e.destroy())})},animate:function(a){var c=this,e=this.yAxis,
|
||||
h=c.options,b=this.chart.inverted,m={};k&&(a?(m.scaleY=.001,a=Math.min(e.pos+e.len,Math.max(e.pos,e.toPixels(h.threshold))),b?m.translateX=a-e.len:m.translateY=a,c.group.attr(m)):(m[b?"translateX":"translateY"]=e.pos,c.group.animate(m,E(B(c.options.animation),{step:function(a,b){c.group.attr({scaleY:Math.max(.001,b.pos)})}})),c.animate=null))},remove:function(){var a=this,c=a.chart;c.hasRendered&&C(c.series,function(c){c.type===a.type&&(c.isDirty=!0)});t.prototype.remove.apply(a,arguments)}})})(I);
|
||||
(function(a){a=a.seriesType;a("bar","column",null,{inverted:!0})})(I);(function(a){var B=a.Series;a=a.seriesType;a("scatter","line",{lineWidth:0,marker:{enabled:!0},tooltip:{headerFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',pointFormat:"x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"}},{sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group",
|
||||
"markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,kdDimensions:2,drawGraph:function(){this.options.lineWidth&&B.prototype.drawGraph.call(this)}})})(I);(function(a){var B=a.pick,z=a.relativeLength;a.CenteredSeriesMixin={getCenter:function(){var a=this.options,E=this.chart,u=2*(a.slicedOffset||0),h=E.plotWidth-2*u,E=E.plotHeight-2*u,n=a.center,n=[B(n[0],"50%"),B(n[1],"50%"),a.size||"100%",a.innerSize||0],t=Math.min(h,E),l,k;for(l=0;4>l;++l)k=n[l],a=2>l||2===l&&/%$/.test(k),n[l]=z(k,[h,E,t,n[2]][l])+
|
||||
(a?u:0);n[3]>n[2]&&(n[3]=n[2]);return n}}})(I);(function(a){var B=a.addEvent,z=a.defined,C=a.each,E=a.extend,u=a.inArray,h=a.noop,n=a.pick,t=a.Point,l=a.Series,k=a.seriesType,e=a.setAnimation;k("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return null===this.y?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",
|
||||
borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var c=this,e=c.points,b=c.startAngleRad;a||(C(e,function(a){var d=a.graphic,e=a.shapeArgs;d&&(d.attr({r:a.startR||c.center[3]/2,start:b,end:b}),d.animate({r:e.r,start:e.start,end:e.end},c.options.animation))}),c.animate=null)},updateTotals:function(){var a,
|
||||
e=0,h=this.points,b=h.length,k,d=this.options.ignoreHiddenPoint;for(a=0;a<b;a++)k=h[a],0>k.y&&(k.y=null),e+=d&&!k.visible?0:k.y;this.total=e;for(a=0;a<b;a++)k=h[a],k.percentage=0<e&&(k.visible||!d)?k.y/e*100:0,k.total=e},generatePoints:function(){l.prototype.generatePoints.call(this);this.updateTotals()},translate:function(a){this.generatePoints();var c=0,e=this.options,b=e.slicedOffset,h=b+(e.borderWidth||0),d,k,l,v=e.startAngle||0,f=this.startAngleRad=Math.PI/180*(v-90),v=(this.endAngleRad=Math.PI/
|
||||
180*(n(e.endAngle,v+360)-90))-f,t=this.points,u=e.dataLabels.distance,e=e.ignoreHiddenPoint,F,q=t.length,x;a||(this.center=a=this.getCenter());this.getX=function(b,c){l=Math.asin(Math.min((b-a[1])/(a[2]/2+u),1));return a[0]+(c?-1:1)*Math.cos(l)*(a[2]/2+u)};for(F=0;F<q;F++){x=t[F];d=f+c*v;if(!e||x.visible)c+=x.percentage/100;k=f+c*v;x.shapeType="arc";x.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*d)/1E3,end:Math.round(1E3*k)/1E3};l=(k+d)/2;l>1.5*Math.PI?l-=2*Math.PI:l<-Math.PI/
|
||||
2&&(l+=2*Math.PI);x.slicedTranslation={translateX:Math.round(Math.cos(l)*b),translateY:Math.round(Math.sin(l)*b)};d=Math.cos(l)*a[2]/2;k=Math.sin(l)*a[2]/2;x.tooltipPos=[a[0]+.7*d,a[1]+.7*k];x.half=l<-Math.PI/2||l>Math.PI/2?1:0;x.angle=l;h=Math.min(h,u/5);x.labelPos=[a[0]+d+Math.cos(l)*u,a[1]+k+Math.sin(l)*u,a[0]+d+Math.cos(l)*h,a[1]+k+Math.sin(l)*h,a[0]+d,a[1]+k,0>u?"center":x.half?"right":"left",l]}},drawGraph:null,drawPoints:function(){var a=this,e=a.chart.renderer,h,b,k,d,l=a.options.shadow;l&&
|
||||
!a.shadowGroup&&(a.shadowGroup=e.g("shadow").add(a.group));C(a.points,function(c){if(null!==c.y){b=c.graphic;d=c.shapeArgs;h=c.getTranslate();var m=c.shadowGroup;l&&!m&&(m=c.shadowGroup=e.g("shadow").add(a.shadowGroup));m&&m.attr(h);k=a.pointAttribs(c,c.selected&&"select");b?b.setRadialReference(a.center).attr(k).animate(E(d,h)):(c.graphic=b=e[c.shapeType](d).setRadialReference(a.center).attr(h).add(a.group),c.visible||b.attr({visibility:"hidden"}),b.attr(k).attr({"stroke-linejoin":"round"}).shadow(l,
|
||||
m));b.addClass(c.getClassName())}})},searchPoint:h,sortByAngle:function(a,e){a.sort(function(a,b){return void 0!==a.angle&&(b.angle-a.angle)*e})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:h},{init:function(){t.prototype.init.apply(this,arguments);var a=this,e;a.name=n(a.name,"Slice");e=function(c){a.slice("select"===c.type)};B(a,"select",e);B(a,"unselect",e);return a},setVisible:function(a,e){var c=this,b=c.series,h=b.chart,d=b.options.ignoreHiddenPoint;
|
||||
e=n(e,d);a!==c.visible&&(c.visible=c.options.visible=a=void 0===a?!c.visible:a,b.options.data[u(c,b.data)]=c.options,C(["graphic","dataLabel","connector","shadowGroup"],function(b){if(c[b])c[b][a?"show":"hide"](!0)}),c.legendItem&&h.legend.colorizeItem(c,a),a||"hover"!==c.state||c.setState(""),d&&(b.isDirty=!0),e&&h.redraw())},slice:function(a,h,k){var b=this.series;e(k,b.chart);n(h,!0);this.sliced=this.options.sliced=z(a)?a:!this.sliced;b.options.data[u(this,b.data)]=this.options;this.graphic.animate(this.getTranslate());
|
||||
this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var c=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.x,c.y,c.r+a,c.r+a,{innerR:this.shapeArgs.r,start:c.start,end:c.end})}})})(I);(function(a){var B=a.addEvent,z=a.arrayMax,C=a.defined,E=a.each,u=a.extend,h=a.format,n=a.map,t=a.merge,l=a.noop,k=a.pick,e=a.relativeLength,c=a.Series,
|
||||
p=a.seriesTypes,H=a.stableSort;a.distribute=function(a,c){function b(a,b){return a.target-b.target}var e,h=!0,k=a,f=[],l;l=0;for(e=a.length;e--;)l+=a[e].size;if(l>c){H(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(l=e=0;l<=c;)l+=a[e].size,e++;f=a.splice(e-1,a.length)}H(a,b);for(a=n(a,function(a){return{size:a.size,targets:[a.target]}});h;){for(e=a.length;e--;)h=a[e],l=(Math.min.apply(0,h.targets)+Math.max.apply(0,h.targets))/2,h.pos=Math.min(Math.max(0,l-h.size/2),c-h.size);e=a.length;for(h=
|
||||
!1;e--;)0<e&&a[e-1].pos+a[e-1].size>a[e].pos&&(a[e-1].size+=a[e].size,a[e-1].targets=a[e-1].targets.concat(a[e].targets),a[e-1].pos+a[e-1].size>c&&(a[e-1].pos=c-a[e-1].size),a.splice(e,1),h=!0)}e=0;E(a,function(a){var b=0;E(a.targets,function(){k[e].pos=a.pos+b;b+=k[e].size;e++})});k.push.apply(k,f);H(k,b)};c.prototype.drawDataLabels=function(){var a=this,c=a.options,d=c.dataLabels,e=a.points,l,n,f=a.hasRendered||0,p,u,F=k(d.defer,!0),q=a.chart.renderer;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&
|
||||
a.dlProcessOptions(d),u=a.plotGroup("dataLabelsGroup","data-labels",F&&!f?"hidden":"visible",d.zIndex||6),F&&(u.attr({opacity:+f}),f||B(a,"afterAnimate",function(){a.visible&&u.show(!0);u[c.animation?"animate":"attr"]({opacity:1},{duration:200})})),n=d,E(e,function(b){var f,e=b.dataLabel,m,g,r,v=b.connector,y=!e,x;l=b.dlOptions||b.options&&b.options.dataLabels;if(f=k(l&&l.enabled,n.enabled)&&null!==b.y)for(g in d=t(n,l),m=b.getLabelConfig(),p=d.format?h(d.format,m):d.formatter.call(m,d),x=d.style,
|
||||
r=d.rotation,x.color=k(d.color,x.color,a.color,"#000000"),"contrast"===x.color&&(x.color=d.inside||0>d.distance||c.stacking?q.getContrast(b.color||a.color):"#000000"),c.cursor&&(x.cursor=c.cursor),m={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:r,padding:d.padding,zIndex:1},m)void 0===m[g]&&delete m[g];!e||f&&C(p)?f&&C(p)&&(e?m.text=p:(e=b.dataLabel=q[r?"text":"label"](p,0,-9999,d.shape,null,null,d.useHTML,null,"data-label"),e.addClass("highcharts-data-label-color-"+
|
||||
b.colorIndex+" "+(d.className||"")+(d.useHTML?"highcharts-tracker":""))),e.attr(m),e.css(x).shadow(d.shadow),e.added||e.add(u),a.alignDataLabel(b,e,d,null,y)):(b.dataLabel=e.destroy(),v&&(b.connector=v.destroy()))})};c.prototype.alignDataLabel=function(a,c,d,e,h){var b=this.chart,f=b.inverted,l=k(a.plotX,-9999),m=k(a.plotY,-9999),n=c.getBBox(),q,p=d.rotation,r=d.align,t=this.visible&&(a.series.forceDL||b.isInsidePlot(l,Math.round(m),f)||e&&b.isInsidePlot(l,f?e.x+1:e.y+e.height-1,f)),A="justify"===
|
||||
k(d.overflow,"justify");t&&(q=d.style.fontSize,q=b.renderer.fontMetrics(q,c).b,e=u({x:f?b.plotWidth-m:l,y:Math.round(f?b.plotHeight-l:m),width:0,height:0},e),u(d,{width:n.width,height:n.height}),p?(A=!1,f=b.renderer.rotCorr(q,p),f={x:e.x+d.x+e.width/2+f.x,y:e.y+d.y+{top:0,middle:.5,bottom:1}[d.verticalAlign]*e.height},c[h?"attr":"animate"](f).attr({align:r}),l=(p+720)%360,l=180<l&&360>l,"left"===r?f.y-=l?n.height:0:"center"===r?(f.x-=n.width/2,f.y-=n.height/2):"right"===r&&(f.x-=n.width,f.y-=l?0:
|
||||
n.height)):(c.align(d,null,e),f=c.alignAttr),A?this.justifyDataLabel(c,d,f,n,e,h):k(d.crop,!0)&&(t=b.isInsidePlot(f.x,f.y)&&b.isInsidePlot(f.x+n.width,f.y+n.height)),d.shape&&!p&&c.attr({anchorX:a.plotX,anchorY:a.plotY}));t||(c.attr({y:-9999}),c.placed=!1)};c.prototype.justifyDataLabel=function(a,c,d,e,h,k){var b=this.chart,l=c.align,m=c.verticalAlign,n,q,p=a.box?0:a.padding||0;n=d.x+p;0>n&&("right"===l?c.align="left":c.x=-n,q=!0);n=d.x+e.width-p;n>b.plotWidth&&("left"===l?c.align="right":c.x=b.plotWidth-
|
||||
n,q=!0);n=d.y+p;0>n&&("bottom"===m?c.verticalAlign="top":c.y=-n,q=!0);n=d.y+e.height-p;n>b.plotHeight&&("top"===m?c.verticalAlign="bottom":c.y=b.plotHeight-n,q=!0);q&&(a.placed=!k,a.align(c,null,h))};p.pie&&(p.pie.prototype.drawDataLabels=function(){var b=this,e=b.data,d,h=b.chart,l=b.options.dataLabels,p=k(l.connectorPadding,10),f=k(l.connectorWidth,1),t=h.plotWidth,u=h.plotHeight,F,q=l.distance,x=b.center,B=x[2]/2,C=x[1],H=0<q,g,D,I,M,R=[[],[]],N,w,O,Q,P=[0,0,0,0];b.visible&&(l.enabled||b._hasPointLabels)&&
|
||||
(E(e,function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),c.prototype.drawDataLabels.apply(b),E(e,function(a){a.dataLabel&&a.visible&&(R[a.half].push(a),a.dataLabel._pos=null)}),E(R,function(c,f){var e,k,m=c.length,r,v,y;if(m)for(b.sortByAngle(c,f-.5),0<q&&(e=Math.max(0,C-B-q),k=Math.min(C+B+q,h.plotHeight),r=n(c,function(a){if(a.dataLabel)return y=a.dataLabel.getBBox().height||21,{target:a.labelPos[1]-
|
||||
e+y/2,size:y,rank:a.y}}),a.distribute(r,k+y-e)),Q=0;Q<m;Q++)d=c[Q],I=d.labelPos,g=d.dataLabel,O=!1===d.visible?"hidden":"inherit",v=I[1],r?void 0===r[Q].pos?O="hidden":(M=r[Q].size,w=e+r[Q].pos):w=v,N=l.justify?x[0]+(f?-1:1)*(B+q):b.getX(w<e+2||w>k-2?v:w,f),g._attr={visibility:O,align:I[6]},g._pos={x:N+l.x+({left:p,right:-p}[I[6]]||0),y:w+l.y-10},I.x=N,I.y=w,null===b.options.size&&(D=g.getBBox().width,v=null,N-D<p?(v=Math.round(D-N+p),P[3]=Math.max(v,P[3])):N+D>t-p&&(v=Math.round(N+D-t+p),P[1]=Math.max(v,
|
||||
P[1])),0>w-M/2?P[0]=Math.max(Math.round(-w+M/2),P[0]):w+M/2>u&&(P[2]=Math.max(Math.round(w+M/2-u),P[2])),g.sideOverflow=v)}),0===z(P)||this.verifyDataLabelOverflow(P))&&(this.placeDataLabels(),H&&f&&E(this.points,function(a){var c;F=a.connector;if((g=a.dataLabel)&&g._pos&&a.visible){O=g._attr.visibility;if(c=!F)a.connector=F=h.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+a.colorIndex).add(b.dataLabelsGroup),F.attr({"stroke-width":f,stroke:l.connectorColor||a.color||
|
||||
"#666666"});F[c?"attr":"animate"]({d:b.connectorPath(a.labelPos)});F.attr("visibility",O)}else F&&(a.connector=F.destroy())}))},p.pie.prototype.connectorPath=function(a){var b=a.x,c=a.y;return k(this.options.dataLabels.softConnector,!0)?["M",b+("left"===a[6]?5:-5),c,"C",b,c,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",b+("left"===a[6]?5:-5),c,"L",a[2],a[3],"L",a[4],a[5]]},p.pie.prototype.placeDataLabels=function(){E(this.points,function(a){var b=a.dataLabel;b&&a.visible&&((a=b._pos)?(b.sideOverflow&&
|
||||
(b._attr.width=b.getBBox().width-b.sideOverflow,b.css({width:b._attr.width+"px",textOverflow:"ellipsis"}),b.shortened=!0),b.attr(b._attr),b[b.moved?"animate":"attr"](a),b.moved=!0):b&&b.attr({y:-9999}))},this)},p.pie.prototype.alignDataLabel=l,p.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,h=c.center,k=c.minSize||80,l,f;null!==h[0]?l=Math.max(b[2]-Math.max(a[1],a[3]),k):(l=Math.max(b[2]-a[1]-a[3],k),b[0]+=(a[3]-a[1])/2);null!==h[1]?l=Math.max(Math.min(l,b[2]-
|
||||
Math.max(a[0],a[2])),k):(l=Math.max(Math.min(l,b[2]-a[0]-a[2]),k),b[1]+=(a[0]-a[2])/2);l<b[2]?(b[2]=l,b[3]=Math.min(e(c.innerSize||0,l),l),this.translate(b),this.drawDataLabels&&this.drawDataLabels()):f=!0;return f});p.column&&(p.column.prototype.alignDataLabel=function(a,e,d,h,l){var b=this.chart.inverted,f=a.series,m=a.dlBox||a.shapeArgs,n=k(a.below,a.plotY>k(this.translatedThreshold,f.yAxis.len)),p=k(d.inside,!!this.options.stacking);m&&(h=t(m),0>h.y&&(h.height+=h.y,h.y=0),m=h.y+h.height-f.yAxis.len,
|
||||
0<m&&(h.height-=m),b&&(h={x:f.yAxis.len-h.y-h.height,y:f.xAxis.len-h.x-h.width,width:h.height,height:h.width}),p||(b?(h.x+=n?0:h.width,h.width=0):(h.y+=n?h.height:0,h.height=0)));d.align=k(d.align,!b||p?"center":n?"right":"left");d.verticalAlign=k(d.verticalAlign,b||p?"middle":n?"top":"bottom");c.prototype.alignDataLabel.call(this,a,e,d,h,l)})})(I);(function(a){var B=a.Chart,z=a.each,C=a.pick,E=a.addEvent;B.prototype.callbacks.push(function(a){function h(){var h=[];z(a.series||[],function(a){var l=
|
||||
a.options.dataLabels,k=a.dataLabelCollections||["dataLabel"];(l.enabled||a._hasPointLabels)&&!l.allowOverlap&&a.visible&&z(k,function(e){z(a.points,function(a){a[e]&&(a[e].labelrank=C(a.labelrank,a.shapeArgs&&a.shapeArgs.height),h.push(a[e]))})})});a.hideOverlappingLabels(h)}h();E(a,"redraw",h)});B.prototype.hideOverlappingLabels=function(a){var h=a.length,n,t,l,k,e,c,p,u,b,m=function(a,b,c,e,f,h,k,l){return!(f>a+c||f+k<a||h>b+e||h+l<b)};for(t=0;t<h;t++)if(n=a[t])n.oldOpacity=n.opacity,n.newOpacity=
|
||||
1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(t=0;t<h;t++)for(l=a[t],n=t+1;n<h;++n)if(k=a[n],l&&k&&l.placed&&k.placed&&0!==l.newOpacity&&0!==k.newOpacity&&(e=l.alignAttr,c=k.alignAttr,p=l.parentGroup,u=k.parentGroup,b=2*(l.box?0:l.padding),e=m(e.x+p.translateX,e.y+p.translateY,l.width-b,l.height-b,c.x+u.translateX,c.y+u.translateY,k.width-b,k.height-b)))(l.labelrank<k.labelrank?l:k).newOpacity=0;z(a,function(a){var b,c;a&&(c=a.newOpacity,a.oldOpacity!==c&&a.placed&&(c?a.show(!0):
|
||||
b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?"animate":"attr"](a.alignAttr,null,b)),a.isOld=!0)})}})(I);(function(a){var B=a.addEvent,z=a.Chart,C=a.createElement,E=a.css,u=a.defaultOptions,h=a.defaultPlotOptions,n=a.each,t=a.extend,l=a.fireEvent,k=a.hasTouch,e=a.inArray,c=a.isObject,p=a.Legend,H=a.merge,b=a.pick,m=a.Point,d=a.Series,r=a.seriesTypes,A=a.svg;a=a.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart.pointer,c=function(a){var c=b.getPointFromEvent(a);if(void 0!==c)c.onMouseOver(a)};
|
||||
n(a.points,function(a){a.graphic&&(a.graphic.element.point=a);a.dataLabel&&(a.dataLabel.div?a.dataLabel.div.point=a:a.dataLabel.element.point=a)});a._hasTracking||(n(a.trackerGroups,function(d){if(a[d]){a[d].addClass("highcharts-tracker").on("mouseover",c).on("mouseout",function(a){b.onTrackerMouseOut(a)});if(k)a[d].on("touchstart",c);a.options.cursor&&a[d].css(E).css({cursor:a.options.cursor})}}),a._hasTracking=!0)},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?
|
||||
a.areaPath:a.graphPath),e=d.length,h=a.chart,l=h.pointer,m=h.renderer,p=h.options.tooltip.snap,t=a.tracker,g,r=function(){if(h.hoverSeries!==a)a.onMouseOver()},u="rgba(192,192,192,"+(A?.0001:.002)+")";if(e&&!c)for(g=e+1;g--;)"M"===d[g]&&d.splice(g+1,0,d[g+1]-p,d[g+2],"L"),(g&&"M"===d[g]||g===e)&&d.splice(g,0,"L",d[g-2]+p,d[g-1]);t?t.attr({d:d}):a.graph&&(a.tracker=m.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:u,fill:c?u:"none","stroke-width":a.graph.strokeWidth()+
|
||||
(c?0:2*p),zIndex:2}).add(a.group),n([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",r).on("mouseout",function(a){l.onTrackerMouseOut(a)});b.cursor&&a.css({cursor:b.cursor});if(k)a.on("touchstart",r)}))}};r.column&&(r.column.prototype.drawTracker=a.drawTrackerPoint);r.pie&&(r.pie.prototype.drawTracker=a.drawTrackerPoint);r.scatter&&(r.scatter.prototype.drawTracker=a.drawTrackerPoint);t(p.prototype,{setItemEvents:function(a,b,c){var d=this,e=d.chart.renderer.boxWrapper,
|
||||
f="highcharts-legend-"+(a.series?"point":"series")+"-active";(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");e.addClass(f);b.css(d.options.itemHoverStyle)}).on("mouseout",function(){b.css(a.visible?d.itemStyle:d.itemHiddenStyle);e.removeClass(f);a.setState()}).on("click",function(b){var c=function(){a.setVisible&&a.setVisible()};b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):l(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=C("input",
|
||||
{type:"checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);B(a.checkbox,"click",function(b){l(a.series||a,"checkboxClick",{checked:b.target.checked,item:a},function(){a.select()})})}});u.legend.itemStyle.cursor="pointer";t(z.prototype,{showResetZoom:function(){var a=this,b=u.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,h="chart"===c.relativeTo?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},
|
||||
d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(c.position,!1,h)},zoomOut:function(){var a=this;l(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var d,e=this.pointer,h=!1,k;!a||a.resetSelection?n(this.axes,function(a){d=a.zoom()}):n(a.xAxis.concat(a.yAxis),function(a){var b=a.axis;e[b.isXAxis?"zoomX":"zoomY"]&&(d=b.zoom(a.min,a.max),b.displayBtn&&(h=!0))});k=this.resetZoomButton;h&&!k?this.showResetZoom():
|
||||
!h&&c(k)&&(this.resetZoomButton=k.destroy());d&&this.redraw(b(this.options.chart.animation,a&&a.animation,100>this.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&n(d,function(a){a.setState()});n("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",h=c[d],k=(b.pointRange||0)/2,g=b.getExtremes(),l=b.toValue(h-f,!0)+k,k=b.toValue(h+b.len-f,!0)-k,m=k<l,h=m?k:l,l=m?l:k,m=b.toValue(b.toPixels(g.min)-b.minPixelPadding),
|
||||
k=b.toValue(b.toPixels(g.max)+b.minPixelPadding),m=Math.min(g.dataMin,m)-h,g=l-Math.max(g.dataMax,k);b.series.length&&0>m&&0>g&&(b.setExtremes(h,l,!1,!1,{trigger:"pan"}),e=!0);c[d]=f});e&&c.redraw(!1);E(c.container,{cursor:"move"})}});t(m.prototype,{select:function(a,c){var d=this,f=d.series,h=f.chart;a=b(a,!d.selected);d.firePointEvent(a?"select":"unselect",{accumulate:c},function(){d.selected=d.options.selected=a;f.options.data[e(d,f.data)]=d.options;d.setState(a&&"select");c||n(h.getSelectedPoints(),
|
||||
function(a){a.selected&&a!==d&&(a.selected=a.options.selected=!1,f.options.data[e(a,f.data)]=a.options,a.setState(""),a.firePointEvent("unselect"))})})},onMouseOver:function(a){var b=this.series.chart.pointer;this.firePointEvent("mouseOver");b.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent("mouseOut");n(a.hoverPoints||[],function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=H(this.series.options.point,
|
||||
this.options).events,b;this.events=a;for(b in a)B(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a,c){var d=Math.floor(this.plotX),e=this.plotY,f=this.series,k=f.options.states[a]||{},l=h[f.type].marker&&f.options.marker,m=l&&!1===l.enabled,n=l&&l.states&&l.states[a]||{},p=!1===n.enabled,g=f.stateMarkerGraphic,r=this.marker||{},u=f.chart,v=f.halo,z,A=l&&f.markerAttribs;a=a||"";if(!(a===this.state&&!c||this.selected&&"select"!==a||!1===k.enabled||a&&(p||m&&!1===n.enabled)||a&&r.states&&
|
||||
r.states[a]&&!1===r.states[a].enabled)){A&&(z=f.markerAttribs(this,a));if(this.graphic)this.state&&this.graphic.removeClass("highcharts-point-"+this.state),a&&this.graphic.addClass("highcharts-point-"+a),this.graphic.attr(f.pointAttribs(this,a)),z&&this.graphic.animate(z,b(u.options.chart.animation,n.animation,l.animation)),g&&g.hide();else{if(a&&n){l=r.symbol||f.symbol;g&&g.currentSymbol!==l&&(g=g.destroy());if(g)g[c?"animate":"attr"]({x:z.x,y:z.y});else l&&(f.stateMarkerGraphic=g=u.renderer.symbol(l,
|
||||
z.x,z.y,z.width,z.height).add(f.markerGroup),g.currentSymbol=l);g&&g.attr(f.pointAttribs(this,a))}g&&(g[a&&u.isInsidePlot(d,e,u.inverted)?"show":"hide"](),g.element.point=this)}(d=k.halo)&&d.size?(v||(f.halo=v=u.renderer.path().add(A?f.markerGroup:f.group)),v[c?"animate":"attr"]({d:this.haloPath(d.size)}),v.attr({"class":"highcharts-halo highcharts-color-"+b(this.colorIndex,f.colorIndex)}),v.point=this,v.attr(t({fill:this.color||f.color,"fill-opacity":d.opacity,zIndex:-1},d.attributes))):v&&v.point&&
|
||||
v.point.haloPath&&v.animate({d:v.point.haloPath(0)});this.state=a}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-a,this.plotY-a,2*a,2*a)}});t(d.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&l(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();
|
||||
this&&a.events.mouseOut&&l(this,"mouseOut");!c||a.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();this.setState()},setState:function(a){var c=this,d=c.options,e=c.graph,h=d.states,k=d.lineWidth,d=0;a=a||"";if(c.state!==a&&(n([c.group,c.markerGroup,c.dataLabelsGroup],function(b){b&&(c.state&&b.removeClass("highcharts-series-"+c.state),a&&b.addClass("highcharts-series-"+a))}),c.state=a,!h[a]||!1!==h[a].enabled)&&(a&&(k=h[a].lineWidth||k+(h[a].lineWidthPlus||0)),e&&!e.dashstyle))for(k={"stroke-width":k},
|
||||
e.animate(k,b(c.chart.options.chart.animation,h[a]&&h[a].animation));c["zone-graph-"+d];)c["zone-graph-"+d].attr(k),d+=1},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,h=d.options.chart.ignoreHiddenSeries,k=c.visible;f=(c.visible=a=c.options.visible=c.userOptions.visible=void 0===a?!k:a)?"show":"hide";n(["group","dataLabelsGroup","markerGroup","tracker","tt"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,
|
||||
a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});n(c.linkedSeries,function(b){b.setVisible(a,!1)});h&&(d.isDirtyBox=!0);!1!==b&&d.redraw();l(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=void 0===a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);l(this,a?"select":"unselect")},drawTracker:a.drawTrackerGraph})})(I);(function(a){var B=a.Chart,z=a.each,C=a.inArray,E=
|
||||
a.isArray,u=a.isObject,h=a.pick,n=a.splat;B.prototype.setResponsive=function(h){var l=this.options.responsive,k=[],e=this.currentResponsive;l&&l.rules&&z(l.rules,function(c){void 0===c._id&&(c._id=a.uniqueKey());this.matchResponsiveRule(c,k,h)},this);var c=a.merge.apply(0,a.map(k,function(c){return a.find(l.rules,function(a){return a._id===c}).chartOptions})),k=k.toString()||void 0;k!==(e&&e.ruleIds)&&(e&&this.update(e.undoOptions,h),k?(this.currentResponsive={ruleIds:k,mergedOptions:c,undoOptions:this.currentOptions(c)},
|
||||
this.update(c,h)):this.currentResponsive=void 0)};B.prototype.matchResponsiveRule=function(a,l){var k=a.condition;(k.callback||function(){return this.chartWidth<=h(k.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=h(k.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=h(k.minWidth,0)&&this.chartHeight>=h(k.minHeight,0)}).call(this)&&l.push(a._id)};B.prototype.currentOptions=function(a){function h(a,c,k,l){var b,e;for(b in a)if(!l&&-1<C(b,["series","xAxis","yAxis"]))for(a[b]=n(a[b]),k[b]=[],e=0;e<a[b].length;e++)c[b][e]&&
|
||||
(k[b][e]={},h(a[b][e],c[b][e],k[b][e],l+1));else u(a[b])?(k[b]=E(a[b])?[]:{},h(a[b],c[b]||{},k[b],l+1)):k[b]=c[b]||null}var k={};h(a,this.options,k,0);return k}})(I);return I});
|
@ -0,0 +1,17 @@
|
||||
/*
|
||||
Highcharts JS v3.0.5 (2013-08-23)
|
||||
|
||||
Standalone Highcharts Framework
|
||||
|
||||
License: MIT License
|
||||
*/
|
||||
var HighchartsAdapter=function(){function n(c){function a(a,b,d){a.removeEventListener(b,d,!1)}function d(a,b,d){d=a.HCProxiedMethods[d.toString()];a.detachEvent("on"+b,d)}function b(b,c){var g=b.HCEvents,i,h,l,f;if(b.removeEventListener)i=a;else if(b.attachEvent)i=d;else return;c?(h={},h[c]=!0):h=g;for(f in h)if(g[f])for(l=g[f].length;l--;)i(b,f,g[f][l])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(b,a){var d=this,c=this.HCEvents,h;if(d.addEventListener)d.addEventListener(b,
|
||||
a,!1);else if(d.attachEvent){h=function(b){a.call(d,b)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[a.toString()]=h;d.attachEvent("on"+b,h)}c[b]===q&&(c[b]=[]);c[b].push(a)},unbind:function(c,k){var g,i;c?(g=this.HCEvents[c]||[],k?(i=HighchartsAdapter.inArray(k,g),i>-1&&(g.splice(i,1),this.HCEvents[c]=g),this.removeEventListener?a(this,c,k):this.attachEvent&&d(this,c,k)):(b(this,c),this.HCEvents[c]=[])):(b(this),this.HCEvents={})},trigger:function(b,a){var d=this.HCEvents[b]||
|
||||
[],c=d.length,h,f;for(h=function(){a.defaultPrevented=!0};c--;){f=d[c];if(a.stopped)break;a.preventDefault=h;a.target=this;f.call(this,a)===!1&&a.preventDefault()}}});return c}var q,f=document,o=[],j=[],p,m;Math.easeInOutSine=function(c,a,d,b){return-d/2*(Math.cos(Math.PI*c/b)-1)+a};return{init:function(c){if(!f.defaultView)this._getStyle=function(a,d){var b;return a.style[d]?a.style[d]:(d==="opacity"&&(d="filter"),b=a.currentStyle[d.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()})],d==="filter"&&
|
||||
(b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(b,a){return a/100})),b===""?1:b)},this.adapterRun=function(a,d){var b={width:"clientWidth",height:"clientHeight"}[d];if(b)return a.style.zoom=1,a[b]-2*parseInt(HighchartsAdapter._getStyle(a,"padding"),10)};if(!Array.prototype.forEach)this.each=function(a,d){for(var b=0,c=a.length;b<c;b++)if(d.call(a[b],a[b],b,a)===!1)return b};if(!Array.prototype.indexOf)this.inArray=function(a,d){var b,c=0;if(d)for(b=d.length;c<b;c++)if(d[c]===a)return c;return-1};
|
||||
if(!Array.prototype.filter)this.grep=function(a,d){for(var b=[],c=0,f=a.length;c<f;c++)d(a[c],c)&&b.push(a[c]);return b};m=function(a,c,b){this.options=c;this.elem=a;this.prop=b};m.prototype={update:function(){var a;a=this.paths;var d=this.elem,b=d.element;a&&b?d.attr("d",c.step(a[0],a[1],this.now,this.toD)):d.attr?b&&d.attr(this.prop,this.now):(a={},a[d]=this.now+this.unit,Highcharts.css(d,a));this.options.step&&this.options.step.call(this.elem,this.now,this)},custom:function(a,c,b){var e=this,f=
|
||||
function(a){return e.step(a)},g;this.startTime=+new Date;this.start=a;this.end=c;this.unit=b;this.now=this.start;this.pos=this.state=0;f.elem=this.elem;f()&&j.push(f)===1&&(p=setInterval(function(){for(g=0;g<j.length;g++)j[g]()||j.splice(g--,1);j.length||clearInterval(p)},13))},step:function(a){var c=+new Date,b;b=this.options;var e;if(this.elem.stopAnimation)b=!1;else if(a||c>=b.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();a=this.options.curAnim[this.prop]=!0;for(e in b.curAnim)b.curAnim[e]!==
|
||||
!0&&(a=!1);a&&b.complete&&b.complete.call(this.elem);b=!1}else e=c-this.startTime,this.state=e/b.duration,this.pos=b.easing(e,0,1,b.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b}};this.animate=function(a,d,b){var e,f="",g,i,h;a.stopAnimation=!1;if(typeof b!=="object"||b===null)e=arguments,b={duration:e[2],easing:e[3],complete:e[4]};if(typeof b.duration!=="number")b.duration=400;b.easing=Math[b.easing]||Math.easeInOutSine;b.curAnim=Highcharts.extend({},d);
|
||||
for(h in d)i=new m(a,b,h),g=null,h==="d"?(i.paths=c.init(a,a.d,d.d),i.toD=d.d,e=0,g=1):a.attr?e=a.attr(h):(e=parseFloat(this._getStyle(a,h))||0,h!=="opacity"&&(f="px")),g||(g=parseFloat(d[h])),i.custom(e,g,f)}},_getStyle:function(c,a){return window.getComputedStyle(c).getPropertyValue(a)},getScript:function(c,a){var d=f.getElementsByTagName("head")[0],b=f.createElement("script");b.type="text/javascript";b.src=c;b.onload=a;d.appendChild(b)},inArray:function(c,a){return a.indexOf?a.indexOf(c):o.indexOf.call(a,
|
||||
c)},adapterRun:function(c,a){return parseInt(HighchartsAdapter._getStyle(c,a),10)},grep:function(c,a){return o.filter.call(c,a)},map:function(c,a){for(var d=[],b=0,e=c.length;b<e;b++)d[b]=a.call(c[b],c[b],b,c);return d},offset:function(c){for(var a=0,d=0;c;)a+=c.offsetLeft,d+=c.offsetTop,c=c.offsetParent;return{left:a,top:d}},addEvent:function(c,a,d){n(c).bind(a,d)},removeEvent:function(c,a,d){n(c).unbind(a,d)},fireEvent:function(c,a,d,b){var e;f.createEvent&&(c.dispatchEvent||c.fireEvent)?(e=f.createEvent("Events"),
|
||||
e.initEvent(a,!0,!0),e.target=c,Highcharts.extend(e,d),c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(a,e)):c.HCExtended===!0&&(d=d||{},c.trigger(a,d));d&&d.defaultPrevented&&(b=null);b&&b(d)},washMouseEvent:function(c){return c},stop:function(c){c.stopAnimation=!0},each:function(c,a){return Array.prototype.forEach.call(c,a)}}}();
|
299
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Scripts/script.js
vendored
Normal file
299
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Scripts/script.js
vendored
Normal file
@ -0,0 +1,299 @@
|
||||
Highcharts.setOptions({
|
||||
chart: {
|
||||
style: {
|
||||
fontFamily: 'Verdana'
|
||||
}
|
||||
},
|
||||
global: {
|
||||
useUTC: false
|
||||
}
|
||||
});
|
||||
|
||||
function changeServer(obj) {
|
||||
if (obj.options[obj.selectedIndex].value != '') {
|
||||
window.location = 'index.php?server='
|
||||
+ obj.options[obj.selectedIndex].value;
|
||||
} else {
|
||||
window.location = 'index.php';
|
||||
}
|
||||
}
|
||||
function changeCluster(obj) {
|
||||
if (obj.options[obj.selectedIndex].value != '') {
|
||||
window.location = 'stats.php?cluster='
|
||||
+ obj.options[obj.selectedIndex].value;
|
||||
} else {
|
||||
window.location = 'stats.php';
|
||||
}
|
||||
}
|
||||
function show(target)
|
||||
{
|
||||
var objects = document.getElementsByClassName(target);
|
||||
for(i = 0 ; i < objects.length ; i++){
|
||||
objects[i].style.display = '';
|
||||
}
|
||||
}
|
||||
function hide(target)
|
||||
{
|
||||
var objects = document.getElementsByClassName(target);
|
||||
for(i = 0 ; i < objects.length ; i++){
|
||||
objects[i].style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function changeCommand(obj) {
|
||||
document.getElementById('request_key').value = '';
|
||||
document.getElementById('request_duration').value = '';
|
||||
document.getElementById('request_data').value = '';
|
||||
document.getElementById('request_delay').value = '';
|
||||
document.getElementById('request_value').value = '';
|
||||
var command = obj.options[obj.selectedIndex].value;
|
||||
var div_key = document.getElementById('div_key');
|
||||
var div_duration = document.getElementById('div_duration');
|
||||
var div_data = document.getElementById('div_data');
|
||||
var div_delay = document.getElementById('div_delay');
|
||||
var div_value = document.getElementById('div_value');
|
||||
if (command == 'get' || command == 'delete') {
|
||||
div_key.style.display = '';
|
||||
div_duration.style.display = 'none';
|
||||
div_data.style.display = 'none';
|
||||
div_delay.style.display = 'none';
|
||||
div_value.style.display = 'none';
|
||||
} else if (command == 'set') {
|
||||
div_key.style.display = '';
|
||||
div_duration.style.display = '';
|
||||
div_data.style.display = '';
|
||||
div_delay.style.display = 'none';
|
||||
div_value.style.display = 'none';
|
||||
} else if (command == 'flush_all') {
|
||||
div_key.style.display = 'none';
|
||||
div_duration.style.display = 'none';
|
||||
div_data.style.display = 'none';
|
||||
div_delay.style.display = '';
|
||||
div_value.style.display = 'none';
|
||||
} else if (command == 'increment' || command == 'decrement') {
|
||||
div_key.style.display = '';
|
||||
div_duration.style.display = 'none';
|
||||
div_data.style.display = 'none';
|
||||
div_delay.style.display = 'none';
|
||||
div_value.style.display = '';
|
||||
} else {
|
||||
div_key.style.display = 'none';
|
||||
div_duration.style.display = 'none';
|
||||
div_data.style.display = 'none';
|
||||
div_delay.style.display = 'none';
|
||||
div_value.style.display = 'none';
|
||||
}
|
||||
}
|
||||
function executeHideShow(target, input, force) {
|
||||
var object = document.getElementById(target);
|
||||
var input = document.getElementById(input);
|
||||
if ((object.style.display == "block") && (force != true)) {
|
||||
input.value = "Show Console";
|
||||
object.style.visibility = "hidden";
|
||||
object.style.display = "none";
|
||||
} else {
|
||||
object.style.visibility = "visible";
|
||||
object.style.display = "block";
|
||||
input.value = "Hide Console";
|
||||
}
|
||||
}
|
||||
function executeClear(target) {
|
||||
var object = document.getElementById(target);
|
||||
object.innerHTML = '';
|
||||
}
|
||||
function executeCommand(target, params) {
|
||||
if (params != null) {
|
||||
var request_url = 'commands.php?' + params;
|
||||
execute(request_url, target, true);
|
||||
return;
|
||||
}
|
||||
if (document.getElementById('request_command').value != '') {
|
||||
var request_url = 'commands.php?request_command='
|
||||
+ document.getElementById('request_command').value
|
||||
+ '&request_key='
|
||||
+ document.getElementById('request_key').value
|
||||
+ '&request_duration='
|
||||
+ document.getElementById('request_duration').value
|
||||
+ '&request_data='
|
||||
+ document.getElementById('request_data').value
|
||||
+ '&request_delay='
|
||||
+ document.getElementById('request_delay').value
|
||||
+ '&request_value='
|
||||
+ document.getElementById('request_value').value
|
||||
+ '&request_server='
|
||||
+ document.getElementById('request_server').value
|
||||
+ '&request_api='
|
||||
+ document.getElementById('request_api').value;
|
||||
execute(request_url, target, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
function searchKey(target) {
|
||||
if (document.getElementById('search_key').value != '') {
|
||||
var request_url = 'commands.php?request_command=search'
|
||||
+ '&request_key=' + document.getElementById('search_key').value
|
||||
+ '&request_level=' + document.getElementById('search_level').value
|
||||
+ '&request_more=' + document.getElementById('search_more').value
|
||||
+ '&request_server='
|
||||
+ document.getElementById('search_server').value;
|
||||
execute(request_url, target, true);
|
||||
}
|
||||
}
|
||||
function executeTelnet(target) {
|
||||
if (document.getElementById('request_telnet').value != '') {
|
||||
var request_url = 'commands.php?request_command=telnet'
|
||||
+ '&request_telnet='
|
||||
+ document.getElementById('request_telnet').value
|
||||
+ '&request_server='
|
||||
+ document.getElementById('request_telnet_server').value;
|
||||
execute(request_url, target, true);
|
||||
}
|
||||
}
|
||||
function execute(url, target, append) {
|
||||
if (window.XMLHttpRequest) {
|
||||
req = new XMLHttpRequest();
|
||||
req.onreadystatechange = function() {
|
||||
onExecute(target, append);
|
||||
};
|
||||
req.open('GET', url, true);
|
||||
req.send(null);
|
||||
} else if (window.ActiveXObject) {
|
||||
req = new ActiveXObject('Microsoft.XMLHTTP');
|
||||
if (req) {
|
||||
req.onreadystatechange = function() {
|
||||
onExecute(target, append);
|
||||
};
|
||||
req.open('GET', url, true);
|
||||
req.send();
|
||||
}
|
||||
}
|
||||
}
|
||||
function onExecute(target, append) {
|
||||
if (req.readyState == 1) {
|
||||
document.getElementById('loading').style.visibility = "visible";
|
||||
} else if (req.readyState == 4) {
|
||||
document.getElementById('loading').style.visibility = "hidden";
|
||||
if (req.status == 200 || req.status == 304) {
|
||||
if (append == true) {
|
||||
var object = document.getElementById(target);
|
||||
object.innerHTML += req.responseText;
|
||||
object.scrollTop = object.scrollHeight;
|
||||
} else {
|
||||
var object = document.getElementById(target);
|
||||
object.innerHTML = req.responseText;
|
||||
object.scrollTop = object.scrollHeight;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
document.getElementById('loading').style.visibility = "hidden";
|
||||
}
|
||||
}
|
||||
var server_id = 1;
|
||||
var cluster_id = 1;
|
||||
function addCluster() {
|
||||
var clusterDiv = document.createElement('div');
|
||||
cluster_id++;
|
||||
clusterDiv.innerHTML = '<hr/><strong>Cluster <input type="text" style="width:200px;" name="cluster[' + cluster_id + ']" value=""/></strong>'
|
||||
+ '<div style="margin-left:30px;margin-top:3px;">'
|
||||
+ '<div style="width:150px;float:left;">Name (Optionnal)</div>'
|
||||
+ '<div style="width:150px;float:left;margin-left:7px;">IP/Hostname</div>'
|
||||
+ '<div style="width:50px;float:left;margin-left:7px;">Port</div></div>'
|
||||
+ '<div style="margin-left:40px;margin-top:6px;" id="cluster_' + cluster_id + '_commands">'
|
||||
+ '<a class="list button" href="javascript:addServer(' + cluster_id + ')">'
|
||||
+ 'Add New Server to Cluster</a> <a class="list" style="padding:1px 2px;-moz-border-radius:3px;-webkit-border-radius:3px;" '
|
||||
+ 'href="#" onclick="deleteServerOrCluster(\'cluster_' + cluster_id + '\')">Delete Cluster</a></div><br/>';
|
||||
clusterDiv.setAttribute('id', 'cluster_' + cluster_id);
|
||||
document.getElementById('server_form').appendChild(clusterDiv);
|
||||
addServer(cluster_id);
|
||||
}
|
||||
function addServer(current_cluster_id) {
|
||||
var serverDiv = document.createElement('div');
|
||||
server_id++;
|
||||
serverDiv.innerHTML = '<div style="margin-left:30px;margin-top:3px;">'
|
||||
+ '<input type="text" style="width:150px;" name="server[' + current_cluster_id + '][' + server_id + '][name]"'
|
||||
+ ' value="" id="name_' + server_id + '" onchange="nameOnChange(' + server_id + ') onKeyUp="hostOrPortOnChange(' + server_id + ')""/> '
|
||||
+ '<input type="text" style="width:150px;" name="server[' + current_cluster_id + '][' + server_id + '][hostname]"'
|
||||
+ ' value="hostname" id="host_' + server_id + '" onfocus="hostOnFocus(this)" onblur="hostOnBlur(this)" onchange="hostOrPortOnChange(' + server_id + ')"'
|
||||
+ ' onchange="hostOrPortOnChange(' + server_id + ')" onKeyUp="hostOrPortOnChange(' + server_id + ')" /> '
|
||||
+ '<input type="text" style="width:50px;" name="server[' + current_cluster_id + '][' + server_id + '][port]"'
|
||||
+ ' value="port" id="port_' + server_id + '" onfocus="portOnFocus(this)" onblur="portOnBlur(this) onchange="hostOrPortOnChange(' + server_id + ')"/> '
|
||||
+ '<a class="list button" style="padding:1px 2px;" href="#" onclick="deleteServerOrCluster(\'server_' + server_id + '\')">Delete</a>' + '</div>';
|
||||
serverDiv.setAttribute('id', 'server_' + server_id);
|
||||
document.getElementById('cluster_' + current_cluster_id).insertBefore(serverDiv, document.getElementById('cluster_' + current_cluster_id + '_commands'));
|
||||
}
|
||||
function deleteServerOrCluster(divID) {
|
||||
var div = document.getElementById(divID);
|
||||
div.parentNode.removeChild(div);
|
||||
}
|
||||
function nameOnChange(target) {
|
||||
portObject = document.getElementById('port_' + target);
|
||||
portObject.setAttribute("onchange", "return false;");
|
||||
hostObject = document.getElementById('host_' + target);
|
||||
hostObject.setAttribute("onchange", "return false;");
|
||||
}
|
||||
function hostOnFocus(object) {
|
||||
if (object.value == 'hostname') {
|
||||
object.value = '';
|
||||
}
|
||||
}
|
||||
function hostOnBlur(object) {
|
||||
if (object.value == '') {
|
||||
object.value = 'hostname';
|
||||
}
|
||||
}
|
||||
function hostOnChange(target) {
|
||||
document.getElementById(target);
|
||||
if (object.value == '') {
|
||||
object.value = 'port';
|
||||
}
|
||||
}
|
||||
function portOnFocus(object) {
|
||||
if (object.value == 'port') {
|
||||
object.value = '';
|
||||
}
|
||||
}
|
||||
function portOnBlur(object) {
|
||||
if (object.value == '') {
|
||||
object.value = 'port';
|
||||
}
|
||||
}
|
||||
function hostOrPortOnChange(target) {
|
||||
|
||||
nameObject = document.getElementById('name_' + target);
|
||||
hostObject = document.getElementById('host_' + target);
|
||||
portObject = document.getElementById('port_' + target);
|
||||
if ((nameObject.value == '') || ((nameObject.value != hostObject.value + ':' + portObject.value))) {
|
||||
nameObject.value = hostObject.value + ':' + portObject.value;
|
||||
}
|
||||
}
|
||||
function ajax(url, target) {
|
||||
if (window.XMLHttpRequest) {
|
||||
req = new XMLHttpRequest();
|
||||
req.onreadystatechange = function() {
|
||||
ajaxDone(target);
|
||||
};
|
||||
req.open("GET", url, true);
|
||||
req.send(null);
|
||||
} else if (window.ActiveXObject) {
|
||||
req = new ActiveXObject('Microsoft.XMLHTTP');
|
||||
if (req) {
|
||||
req.onreadystatechange = function() {
|
||||
ajaxDone(target);
|
||||
};
|
||||
req.open("GET", url, true);
|
||||
req.send();
|
||||
}
|
||||
}
|
||||
setTimeout("ajax(page, 'stats')", timeout);
|
||||
}
|
||||
function ajaxDone(target) {
|
||||
if (req.readyState == 4) {
|
||||
if (req.status == 200 || req.status == 304) {
|
||||
results = req.responseText;
|
||||
document.getElementById(target).innerHTML = results;
|
||||
} else {
|
||||
document.getElementById(target).innerHTML = "Loading stats error : "
|
||||
+ req.statusText;
|
||||
}
|
||||
}
|
||||
}
|
238
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Styles/Style.css
vendored
Normal file
238
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Styles/Style.css
vendored
Normal file
@ -0,0 +1,238 @@
|
||||
body {
|
||||
background-color: #FEFEFE;
|
||||
font-family: Verdana,Tahoma,"Segoe UI", Arial;
|
||||
font-size: 0.8em;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #EEE;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #A00
|
||||
}
|
||||
|
||||
input,select,textarea {
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #AAA;
|
||||
width: 298px;
|
||||
font-family: Tahoma;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
textarea {
|
||||
width: 494px;
|
||||
resize: none;
|
||||
}
|
||||
|
||||
select {
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
input:focus,textarea:focus {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #EEE;
|
||||
}
|
||||
|
||||
input:hover {
|
||||
color: #A00;
|
||||
}
|
||||
input[type=submit] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
} /** hr */
|
||||
hr {
|
||||
height: 0;
|
||||
border: none;
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-style: solid;
|
||||
border-bottom-color: #EEE;
|
||||
}
|
||||
|
||||
.menu {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #a0312a;
|
||||
color: #eee;
|
||||
width: 198px;
|
||||
}
|
||||
|
||||
.item {
|
||||
font-family: "Bitstream Vera Sans Mono",
|
||||
"Lucida Sans Typewriter",
|
||||
"DejaVu Sans Mono",
|
||||
Consolas,
|
||||
"Andale Mono",
|
||||
"Lucida Console",
|
||||
"Liberation Mono",
|
||||
"Nimbus Mono L",
|
||||
Monaco,
|
||||
"Courier New",
|
||||
Courier,
|
||||
monospace;
|
||||
cursor: hand;
|
||||
}
|
||||
|
||||
.loading {
|
||||
text-decoration: blink;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.full-size {
|
||||
width: 980px;
|
||||
}
|
||||
|
||||
.size-0 {
|
||||
width: 494px;
|
||||
}
|
||||
|
||||
.size-1 {
|
||||
width: 696px;
|
||||
}
|
||||
|
||||
.size-2 {
|
||||
width: 398px;
|
||||
}
|
||||
|
||||
.size-4 {
|
||||
width: 290px;
|
||||
}
|
||||
|
||||
.size-5 {
|
||||
width: 226px;
|
||||
}
|
||||
|
||||
.padding {
|
||||
padding: 3px 7px 3px 7px;
|
||||
}
|
||||
|
||||
.corner {
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.header {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #9c3c36;
|
||||
background: #B5463F;
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
clear: both
|
||||
}
|
||||
|
||||
.sub-header {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #514845;
|
||||
background: #635855;
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
clear: both;
|
||||
margin-top: 10px
|
||||
}
|
||||
|
||||
.container {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #d0d0d0;
|
||||
background: #ebebeb;
|
||||
font-weight: none;
|
||||
color: #000;
|
||||
margin-top: 1px;
|
||||
clear: both
|
||||
}
|
||||
|
||||
.list {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #9c3c36;
|
||||
background: #B5463F;
|
||||
font-weight: bold;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button {
|
||||
padding: 1px 20px;
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.live {
|
||||
font-family: "Bitstream Vera Sans Mono",
|
||||
"Lucida Sans Typewriter",
|
||||
"DejaVu Sans Mono",
|
||||
Consolas,
|
||||
"Andale Mono",
|
||||
"Lucida Console",
|
||||
"Liberation Mono",
|
||||
"Nimbus Mono L",
|
||||
Monaco,
|
||||
"Courier New",
|
||||
Courier,
|
||||
monospace;
|
||||
font-size: 12px;
|
||||
overflow: visible;
|
||||
white-space: pre-wrap
|
||||
}
|
||||
|
||||
.line {
|
||||
min-height: 18px;
|
||||
padding-top: 3px;
|
||||
padding-bottom: 2px;
|
||||
clear: both
|
||||
}
|
||||
|
||||
.left {
|
||||
float: left;
|
||||
min-width: 126px;
|
||||
font-weight: bold
|
||||
}
|
||||
.right {
|
||||
float: right
|
||||
}
|
||||
.setting {
|
||||
min-width: 180px
|
||||
}
|
||||
|
||||
.slabs {
|
||||
min-width: 104px
|
||||
}
|
||||
.help {
|
||||
cursor:help;
|
||||
}
|
||||
|
||||
.container hr {
|
||||
height: 0;
|
||||
border: none;
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-style: solid;
|
||||
border-bottom-color: #fff;
|
||||
}
|
||||
|
||||
.grey {
|
||||
color: #EEE
|
||||
}
|
||||
|
||||
.green {
|
||||
color: #40aaba
|
||||
}
|
||||
|
||||
.red {
|
||||
background: #b5463f;
|
||||
color: #fff;
|
||||
font-weight: bold
|
||||
}
|
197
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Commands/Commands.phtml
vendored
Normal file
197
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Commands/Commands.phtml
vendored
Normal file
@ -0,0 +1,197 @@
|
||||
<div style="float:left;">
|
||||
<div class="sub-header corner full-size padding">Console</div>
|
||||
<div class="container corner full-size padding" id="console" style="visibility:visible;display:block;">
|
||||
<pre id="container" style="font-size:11px;overflow:auto;min-height:180px;max-height:500px;" class="full-size live"></pre>
|
||||
</div>
|
||||
<div class="container corner full-size padding" style="text-align:right;">
|
||||
<span style="float:left;">
|
||||
<input class="header loading" type="submit" id="loading" value="Waiting for server response ..."/>
|
||||
</span>
|
||||
<input class="header" type="submit" onclick="javascript:executeClear('container')" value="Clear Console"/>
|
||||
<input class="header" id="hide" type="submit" onclick="javascript:executeHideShow('console', 'hide');javascript:this.blur();" value="Hide Console">
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner full-size padding">Execute predefined <span class="green">Command</span></div>
|
||||
<div class="container corner full-size padding">
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td class="size-0 padding" style="padding-right:14px;">
|
||||
<form action="commands.php" onsubmit="return false">
|
||||
<div class="line" style="text-align:center;">
|
||||
Execute command on one or all memcached servers<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Command</span>
|
||||
<span class="right">
|
||||
<select id="request_command" onchange="javascript:changeCommand(this);">
|
||||
<option value="">Choose a Command</option>
|
||||
<option value="get">get</option>
|
||||
<option value="set">set</option>
|
||||
<option value="delete">delete</option>
|
||||
<option value="increment">increment</option>
|
||||
<option value="decrement">decrement</option>
|
||||
<option value="flush_all">flush all</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_key" class="line" style="display:none;">
|
||||
<span class="left">Key</span>
|
||||
<span class="right">
|
||||
<input id="request_key"/>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_duration" class="line" style="display:none;">
|
||||
<span class="left">Duration</span>
|
||||
<span class="right">
|
||||
<input id="request_duration"/>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_value" class="line" style="display:none;">
|
||||
<span class="left">Value</span>
|
||||
<span class="right">
|
||||
<input id="request_value"/>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_data" class="line" style="display:none;">
|
||||
<span class="left">Data</span>
|
||||
<span class="right">
|
||||
<textarea id="request_data" rows="2" cols="2"></textarea>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_delay" class="line" style="display:none;">
|
||||
<span class="left">Delay</span>
|
||||
<span class="right">
|
||||
<input id="request_delay"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Server</span>
|
||||
<span class="right">
|
||||
<?php echo Library_HTML_Components::serverSelect('request_server'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">API</span>
|
||||
<span class="right">
|
||||
<?php echo Library_HTML_Components::apiList($_ini->get('get_api'), 'request_api'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="header" type="submit"
|
||||
onclick="javascript:executeCommand('container');javascript:this.blur();" value="Execute Command"/>
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
<td class="padding" style="border-left:1px solid #ffffff;padding-left:14px;">
|
||||
Available commands :
|
||||
<ul>
|
||||
<li>get : retreive a key value</li>
|
||||
<li>set : set a key/value pair</li>
|
||||
<li>delete : delete a specific key</li>
|
||||
<li>increment : increment a numeric key value</li>
|
||||
<li>decrement : decrement a numeric key value</li>
|
||||
<li>flush all : flush a Memcached server</li>
|
||||
</ul>
|
||||
<br/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner full-size padding">Execute Telnet <span class="green">Commands</span></div>
|
||||
<div class="container corner full-size padding">
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td class="size-0 padding" style="padding-right:14px;">
|
||||
<div class="line" style="text-align:center;">
|
||||
Execute telnet command on one or all memcached servers<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<textarea id="request_telnet" rows="2" cols="2"></textarea>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Server</span>
|
||||
<span class="right">
|
||||
<?php echo Library_HTML_Components::serverSelect('request_telnet_server'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="header" type="submit"
|
||||
onclick="javascript:executeTelnet('container');javascript:this.blur();" value="Execute Telnet Command"/>
|
||||
</div>
|
||||
</td>
|
||||
<td class="padding" style="border-left:1px solid #ffffff;padding-left:14px;">
|
||||
You can use this thing to execute any telnet command to any memcached server
|
||||
<br/>
|
||||
It will connect to the server, execute the command and return it in the console
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
For more informations about memcached commands, see memcached protocol
|
||||
<a href="http://github.com/memcached/memcached/blob/master/doc/protocol.txt" target="_blank"><span class="green">here</span></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner full-size padding">Search <span class="green">Key</span></div>
|
||||
<div class="container corner full-size padding">
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td class="size-0 padding" style="padding-right:14px;">
|
||||
<div class="line" style="text-align:center;">
|
||||
Search for a key on one or all memcached servers<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Key</span>
|
||||
<span class="right">
|
||||
<input id="search_key" name="search_key"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Server</span>
|
||||
<span class="right">
|
||||
<?php echo Library_HTML_Components::serverSelect('search_server'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Detail Level</span>
|
||||
<span class="right">
|
||||
<select id="search_level">
|
||||
<option value="full">Show Keys, Expiration & Size</option>
|
||||
<option value="keys">Show Keys</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Action</span>
|
||||
<span class="right">
|
||||
<select id="search_more">
|
||||
<option value="show">Search & Show Keys</option>
|
||||
<option value="delete">Search & Delete Keys</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="header" type="submit"
|
||||
onclick="javascript:searchKey('container');javascript:this.blur();" value="Search Key"/>
|
||||
</div>
|
||||
</td>
|
||||
<td class="padding" style="border-left:1px solid #ffffff;padding-left:14px;">
|
||||
<span class="red">Warning !</span><br/>This thing is only for debuging issue, do not use it in a production environment as it can lock
|
||||
or impact your memcached servers performances.
|
||||
<br/>Also keep in mind that it does not list all keys. It lists keys up to a certain buffer size (1 or 2MB), and it list key that are expired.
|
||||
<br/>
|
||||
<br/>You can also use a PCRE regular expression
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
151
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Configure/Configure.phtml
vendored
Normal file
151
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Configure/Configure.phtml
vendored
Normal file
@ -0,0 +1,151 @@
|
||||
<div style="float:left;">
|
||||
<div class="size-0" style="float:left;">
|
||||
|
||||
<div class="sub-header corner padding">Live Stats <span class="green">Configuration</span></div>
|
||||
<div class="container corner padding" style="padding-right:14px;">
|
||||
<form method="post" action="configure.php?request_write=live_stats">
|
||||
<div class="line">
|
||||
Alert & refresh rate for Live Stats<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Refresh Rate in sec</span>
|
||||
<span class="right"><input type="text" name="refresh_rate" value="<?php echo $_ini->get('refresh_rate'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Memory Alert</span>
|
||||
<span class="right"><input type="text" name="memory_alert" value="<?php echo $_ini->get('memory_alert'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Hit Rate Alert</span>
|
||||
<span class="right"><input type="text" name="hit_rate_alert" value="<?php echo $_ini->get('hit_rate_alert'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Eviction Alert</span>
|
||||
<span class="right"><input type="text" name="eviction_alert" value="<?php echo $_ini->get('eviction_alert'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Temp Path</span>
|
||||
<span class="right"><input type="text" name="file_path" value="<?php echo $_ini->get('file_path'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="list" type="submit" value="Save Live Configuration"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Miscellaneous <span class="green">Configuration</span></div>
|
||||
<div class="container corner padding" style="padding-right:14px;">
|
||||
<form method="post" action="configure.php?request_write=miscellaneous">
|
||||
<div class="line">
|
||||
Server connection timeout & miscellaneous<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Timeout in sec</span>
|
||||
<span class="right"><input type="text" name="connection_timeout" value="<?php echo $_ini->get('connection_timeout'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Max Items</span>
|
||||
<span class="right"><input type="text" name="max_item_dump" value="<?php echo $_ini->get('max_item_dump'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="list" type="submit" value="Save API Configuration"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="size-0" style="float:left;padding-left:9px;">
|
||||
<div class="sub-header corner padding">Server <span class="green">List</span></div>
|
||||
<div class="container corner padding" style="padding-right:14px;">
|
||||
<form method="post" action="configure.php?request_write=servers">
|
||||
<div class="line">
|
||||
Servers list used by phpMemcacheAdmin<br/><br/>
|
||||
The server name will be filled by default with hostname:port
|
||||
</div>
|
||||
<div id="server_form">
|
||||
<?php
|
||||
# Initializing variables
|
||||
$server_id = 0;
|
||||
$cluster_id = 0;
|
||||
|
||||
# Looking into each cluster
|
||||
foreach($_ini->get('servers') as $cluster => $servers)
|
||||
{
|
||||
$cluster_id++; ?>
|
||||
<div id="cluster_<?php echo $cluster_id; ?>">
|
||||
<hr/>
|
||||
<strong>Cluster <input type="text" style="width:200px;" name="cluster[<?php echo $cluster_id; ?>]" value="<?php echo $cluster; ?>"/></strong>
|
||||
<div style="margin-left:30px;margin-top:3px;">
|
||||
<div style="width:150px;float:left;">Name (Optionnal)</div>
|
||||
<div style="width:150px;float:left;margin-left:7px;">IP/Hostname</div>
|
||||
<div style="width:50px;float:left;margin-left:7px;">Port</div>
|
||||
</div>
|
||||
<?php # Adding input for each server
|
||||
foreach($servers as $name => $server)
|
||||
{
|
||||
$server_id++; ?>
|
||||
<div id="server_<?php echo $server_id; ?>">
|
||||
<div style="margin-left:30px;margin-top:3px;">
|
||||
<input type="text" style="width:150px;" name="server[<?php echo $cluster_id; ?>][<?php echo $server_id; ?>][name]"
|
||||
value="<?php echo $name; ?>"
|
||||
id="name_<?php echo $server_id; ?>"
|
||||
onchange="nameOnChange(<?php echo $server_id; ?>)"/>
|
||||
<input type="text" style="width:150px;" name="server[<?php echo $cluster_id; ?>][<?php echo $server_id; ?>][hostname]"
|
||||
value="<?php echo $server['hostname']; ?>"
|
||||
id="host_<?php echo $server_id; ?>"
|
||||
<?php # Custom name
|
||||
if ($name == $server['hostname'] . ':' . $server['port']) { ?>
|
||||
onchange="hostOrPortOnChange(<?php echo $server_id; ?>)"
|
||||
onKeyUp="hostOrPortOnChange(<?php echo $server_id; ?>)"
|
||||
<?php
|
||||
} ?>
|
||||
onfocus="hostOnFocus(this)"
|
||||
onblur="hostOnBlur(this)"/>
|
||||
<input type="text" style="width:50px;" name="server[<?php echo $cluster_id; ?>][<?php echo $server_id; ?>][port]"
|
||||
value="<?php echo $server['port']; ?>"
|
||||
id="port_<?php echo $server_id; ?>"
|
||||
<?php # Custom name
|
||||
if ($name == $server['hostname'] . ':' . $server['port']) { ?>
|
||||
onchange="hostOrPortOnChange(<?php echo $server_id; ?>)"
|
||||
onKeyUp="hostOrPortOnChange(<?php echo $server_id; ?>)"
|
||||
<?php
|
||||
} ?>
|
||||
onfocus="portOnFocus(this)"
|
||||
onblur="portOnBlur(this)"/>
|
||||
<a class="list button" style="padding:1px 2px;" href="#" onclick="deleteServerOrCluster('server_<?php echo $server_id; ?>')">Delete</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<div id="cluster_<?php echo $cluster_id; ?>_commands" style="margin-left:40px;margin-top:6px;">
|
||||
<a class="list button" href="javascript:addServer(<?php echo $cluster_id; ?>)">Add New Server to Cluster</a>
|
||||
<a class="list" style="padding:1px 2px;-moz-border-radius:3px;-webkit-border-radius:3px;" href="#"
|
||||
onclick="deleteServerOrCluster('cluster_<?php echo $cluster_id; ?>')">Delete Cluster</a>
|
||||
</div>
|
||||
<br/>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<hr/>
|
||||
<a class="list button" href="javascript:addCluster()">Add New Cluster</a>
|
||||
<input class="list" type="submit" value="Save Servers Configuration"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
server_id = <?php echo $server_id; ?>;
|
||||
cluster_id = <?php echo $cluster_id; ?>;
|
||||
</script>
|
||||
|
||||
<div class="container corner padding" style="margin-top:10px;">
|
||||
<div class="line">
|
||||
For more information about configuring phpMemcachedAdmin, see installation guide
|
||||
<a href="https://blog.elijaa.org/phpmemcachedadmin-installation-guide/" target="_blank"><span class="green">here</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
18
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Footer.phtml
vendored
Normal file
18
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Footer.phtml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
# Check for newer version
|
||||
if(Library_Data_Version::check())
|
||||
{ ?>
|
||||
<div class="header corner full-size padding" style="float:left; text-align:center; margin-top:10px;">
|
||||
A newer version of phpMemcachedAdmin may be available, visit <a href="https://blog.elijaa.org/phpmemcachedadmin-download/" target="_blank">PHPMemcachedAdmin Blog</a> to know more.
|
||||
<?php
|
||||
} else { ?>
|
||||
<div class="sub-header corner full-size padding" style="float:left; text-align:center; margin-top:10px;">
|
||||
<a href="https://github.com/elijaa/phpmemcachedadmin" target="_blank">PHPMemcachedAdmin on GitHub</a> -
|
||||
<a href="https://blog.elijaa.org" target="_blank">PHPMemcachedAdmin Blog</a> -
|
||||
<a href="http://memcached.org" target="_blank">Memcached.org</a>
|
||||
<?php
|
||||
} ?>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
62
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Header.phtml
vendored
Normal file
62
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Header.phtml
vendored
Normal file
@ -0,0 +1,62 @@
|
||||
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<title>PHPMemcachedAdmin <?php echo CURRENT_VERSION; ?></title>
|
||||
<link rel="stylesheet" type="text/css" href="Public/Styles/Style.css"/>
|
||||
<script type="text/javascript" src="Public/Scripts/Highcharts/highcharts.js"></script>
|
||||
<script type="text/javascript" src="Public/Scripts/script.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div style="margin:0pt auto; width:1000px; clear:both;">
|
||||
<div style="font-weight:bold;font-size:1.2em;">PHPMemcachedAdmin <sup><?php echo CURRENT_VERSION; ?></sup>
|
||||
</div>
|
||||
<div class="header corner full-size padding" style="text-align:center;margin-top:5px;">
|
||||
<?php
|
||||
# Live Stats view
|
||||
if(basename($_SERVER['PHP_SELF']) == 'stats.php')
|
||||
{ ?>
|
||||
Live Stats |
|
||||
<?php
|
||||
} else { ?>
|
||||
<a href="stats.php">See Live Stats </a> |
|
||||
<?php
|
||||
}
|
||||
# Stats view
|
||||
if(basename($_SERVER['PHP_SELF']) == 'index.php')
|
||||
{ ?>
|
||||
Actually seeing
|
||||
<?php
|
||||
} else { ?>
|
||||
<a href="index.php">See Stats for </a>
|
||||
<?php
|
||||
}
|
||||
# Server HTML select
|
||||
echo Library_HTML_Components::serverSelect('server_select', (isset($_REQUEST['server'])) ? $_REQUEST['server'] : '', 'list', 'onchange="changeServer(this)"'); ?>
|
||||
|
|
||||
<?php
|
||||
# Commands view
|
||||
if(basename($_SERVER['PHP_SELF']) == 'commands.php')
|
||||
{ ?>
|
||||
Executing Commands on Servers
|
||||
<?php
|
||||
} else { ?>
|
||||
<a href="commands.php">Execute Commands on Servers</a>
|
||||
<?php
|
||||
}?>
|
||||
</div>
|
||||
<?php
|
||||
if (is_writable($_ini->get('file_path')) === false) {
|
||||
?>
|
||||
<div class="header corner full-size padding" style="margin-top:10px;">
|
||||
Warning : Temporary directory '<em><?php echo $_ini->get('file_path') ?></em>' is not writable, please fix this error and try again.
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
<!--[if IE]>
|
||||
<div class="header corner full-size padding" style="text-align:center;margin-top:10px;">
|
||||
Support browsers that contribute to open source, try <a href="http://www.firefox.com" target="_blank">Firefox</a> or <a href="http://www.google.com/chrome" target="_blank">Google Chrome</a>.
|
||||
</div>
|
||||
<![endif]-->
|
70
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/LiveStats/Frame.phtml
vendored
Normal file
70
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/LiveStats/Frame.phtml
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
<script type="text/javascript">
|
||||
var timeout = <?php echo $refresh_rate * 1000; ?>;
|
||||
var page = 'stats.php?request_command=live_stats&cluster=<?php echo $cluster; ?>';
|
||||
setTimeout("ajax(page,'stats')", <?php echo (5 + $refresh_rate - $_ini->get('refresh_rate')) * 1000; ?>);
|
||||
</script>
|
||||
|
||||
<div style="float:left;">
|
||||
<div class="sub-header corner full-size padding">Live <span class="green">Stats</span></div>
|
||||
<?php
|
||||
# Refresh rate increased
|
||||
if($refresh_rate > $_ini->get('refresh_rate'))
|
||||
{ ?>
|
||||
<div class="container corner" style="padding:9px;">
|
||||
Connections errors were discovered, to prevent any problem, refresh rate was increased by
|
||||
<?php echo sprintf('%.1f', $refresh_rate - $_ini->get('refresh_rate')); ?> seconds.
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
<div class="full-size padding">
|
||||
<br/>
|
||||
<span class="live">Actually looking at <?php echo Library_HTML_Components::clusterSelect('cluster_select', (isset($_REQUEST['cluster'])) ? $_REQUEST['cluster'] : '', 'live', 'onchange="changeCluster(this);"'); ?> stats</span>
|
||||
|
||||
<pre id="stats" class="live">
|
||||
|
||||
Loading live stats, please wait ~<?php echo sprintf('%.0f', 5 + $refresh_rate - $_ini->get('refresh_rate')); ?> seconds ...
|
||||
</pre>
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<div class="line">
|
||||
<span class="left setting">SIZE</span>
|
||||
Total cache size on this server
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">%MEM</span>
|
||||
Percentage of total cache size used on this server
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">%HIT</span>
|
||||
Global hit percent on this server : get_hits / (get_hits + get_misses)
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">TIME</span>
|
||||
Time taken to connect to the server and proceed the request, high value can indicate a latency or server problem
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">REQ/s</span>
|
||||
Total request per second (get, set, delete, incr, ...) issued to this server
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">CONN</span>
|
||||
Current connections, monitor that this number doesn't come too close to the server max connection setting
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">GET/s, SET/s, DEL/s</span>
|
||||
Get, set or delete commands per second issued to this server
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">EVI/s</span>
|
||||
Number of times an item which had an explicit expire time set had to be evicted before it expired
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">READ/s</span>
|
||||
Total number of bytes read by this server from network
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">WRITE/s</span>
|
||||
Total number of bytes sent by this server to network
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
87
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/LiveStats/Stats.phtml
vendored
Normal file
87
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/LiveStats/Stats.phtml
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
<?php
|
||||
# CRLF/EOL
|
||||
define('EOL', "\r\n");
|
||||
|
||||
# Header
|
||||
echo 'Last update : ' . date('r', time()) . ' (refresh rate : ' . $_ini->get('refresh_rate') . ' sec)' . EOL . EOL;
|
||||
|
||||
# Table header
|
||||
echo '<strong>' . sprintf('%-36s', 'NAME') . sprintf('%10s', 'SIZE') . sprintf('%7s', '%MEM') . sprintf('%8s', 'TIME') .
|
||||
sprintf('%6s', 'CONN') . sprintf('%7s', '%HIT') . sprintf('%8s', 'REQ/s') . sprintf('%8s', 'GET/s') . sprintf('%8s', 'SET/s') .
|
||||
sprintf('%8s', 'DEL/s') . sprintf('%8s', 'EVI/s') . sprintf('%11s', 'READ/s') . sprintf('%10s', 'WRITE/s') . '</strong>' . EOL . '<hr>';
|
||||
|
||||
# Showing stats for every server
|
||||
foreach($stats as $server => $data)
|
||||
{
|
||||
# Server name
|
||||
echo sprintf('%-36.36s', $server);
|
||||
|
||||
# Checking for stats validity
|
||||
if((isset($data['time'], $data['bytes_percent'], $data['get_hits_percent'], $data['query_time'], $data['request_rate'], $data['curr_connections'],
|
||||
$data['get_rate'], $data['set_rate'], $data['delete_rate'], $data['eviction_rate'], $data['bytes_read'], $data['bytes_written'])) && ($data['time'] > 0))
|
||||
{
|
||||
# Total Memory
|
||||
echo sprintf('%10s', Library_Data_Analysis::byteResize($data['limit_maxbytes']) . 'b');
|
||||
|
||||
# Memory Occupation / Alert State
|
||||
if($data['bytes_percent'] > $_ini->get('memory_alert'))
|
||||
{
|
||||
echo str_pad('', 7 - strlen($data['bytes_percent']), ' ') . '<span class="red">' . sprintf('%.1f', $data['bytes_percent']) . '</span>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo sprintf('%7.1f', $data['bytes_percent']);
|
||||
}
|
||||
|
||||
# Query Time
|
||||
echo sprintf('%5.0f', Library_Data_Analysis::valueResize($data['query_time'])) . ' ms';
|
||||
|
||||
# Current connection
|
||||
echo sprintf('%6s', $data['curr_connections']);
|
||||
|
||||
# Hit percent (get)
|
||||
if($data['get_hits_percent'] < $_ini->get('hit_rate_alert'))
|
||||
{
|
||||
echo str_pad('', 7 - strlen($data['get_hits_percent']), ' ') . '<span class="red">' . sprintf('%.1f', $data['get_hits_percent']) . '</span>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo sprintf('%7.1f', $data['get_hits_percent']);
|
||||
}
|
||||
|
||||
# Request rate
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['request_rate']));
|
||||
|
||||
# Get rate
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['get_rate']));
|
||||
|
||||
# Set rate
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['set_rate']));
|
||||
|
||||
# Delete rate
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['delete_rate']));
|
||||
|
||||
# Eviction rate
|
||||
if($data['eviction_rate'] > $_ini->get('eviction_alert'))
|
||||
{
|
||||
echo str_pad('', 8 - strlen(Library_Data_Analysis::valueResize($data['eviction_rate'])), ' ') . '<span class="red">' . Library_Data_Analysis::valueResize($data['eviction_rate']) . '</span>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['eviction_rate']));
|
||||
}
|
||||
|
||||
# Bytes read
|
||||
echo sprintf('%11s', Library_Data_Analysis::byteResize($data['bytes_read'] / $data['time']) . 'b');
|
||||
|
||||
# Bytes written
|
||||
echo sprintf('%10s', Library_Data_Analysis::byteResize($data['bytes_written'] / $data['time']) . 'b');
|
||||
}
|
||||
else
|
||||
{
|
||||
echo str_pad('', 20, ' ') . '<span class="alert">An error has occured when retreiving or calculating stats</span>';
|
||||
}
|
||||
|
||||
# End of Line
|
||||
echo EOL . '<hr>';
|
||||
}
|
58
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Error.phtml
vendored
Normal file
58
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Error.phtml
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
# Server seems down
|
||||
if((isset($stats)) && (($stats === false) || ($stats == array())))
|
||||
{ ?>
|
||||
<div class="header corner full-size padding" style="margin-top:10px;text-align:center;">
|
||||
<?php
|
||||
# Asking server of cluster stats
|
||||
if(isset($_REQUEST['server']))
|
||||
{
|
||||
echo ($_ini->cluster($_REQUEST['server'])) ? 'All servers from Cluster ' . $_REQUEST['server'] : 'Server ' . $_REQUEST['server'], ' did not respond !';
|
||||
}
|
||||
# All servers stats
|
||||
else
|
||||
{
|
||||
echo 'Servers did not respond !';
|
||||
} ?>
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<span class="left">Error message</span>
|
||||
<br/>
|
||||
<?php echo Library_Data_Error::last(); ?>
|
||||
<br/>
|
||||
<br/>
|
||||
Please check above error message, your <a href="configure.php" class="green">configuration</a> or your server status and retry
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# No slabs used
|
||||
elseif((isset($slabs)) && ($slabs === false))
|
||||
{
|
||||
?>
|
||||
<div class="header corner full-size padding" style="margin-top:10px;text-align:center;">
|
||||
No slabs used in this server !
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<span class="left">Error message</span>
|
||||
<br/>
|
||||
Maybe this server is not used, check your <a href="configure.php" class="green">configuration</a> or your server status and retry
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# No Items in slab
|
||||
elseif((isset($items)) && ($items === false))
|
||||
{
|
||||
?>
|
||||
<div class="header corner full-size padding" style="margin-top:10px;text-align:center;">
|
||||
No item in this slab !
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<span class="left">Error message</span>
|
||||
<br/>
|
||||
This slab is allocated, but is empty
|
||||
<br/>
|
||||
<br/>
|
||||
Go back to <a href="?server=<?php echo $_REQUEST['server']; ?>&show=slabs" class="green">Server Slabs</a>
|
||||
</div>
|
||||
<?php
|
||||
}
|
56
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Items.phtml
vendored
Normal file
56
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Items.phtml
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
<div class="sub-header corner full-size padding">Console</div>
|
||||
<div class="container corner full-size padding" id="console" style="visibility:visible;display:block;">
|
||||
<pre id="container" style="font-size:11px;overflow:auto;min-height:80px;max-height:196px;" class="full-size">
|
||||
|
||||
|
||||
Click on an item's key below to see it's content here
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
<div class="container corner full-size padding" style="text-align:right;">
|
||||
<span style="float:left;">
|
||||
<input style="witdh:200px;" class="header loading" type="submit" id="loading" value="Waiting for server response ..."/>
|
||||
</span>
|
||||
<input class="header" type="submit" onclick="javascript:executeClear('container')" value="Clear Console"/>
|
||||
<input class="header" id="hide" type="submit" onclick="javascript:executeHideShow('console', 'hide');javascript:this.blur();" value="Hide Console"/>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner full-size padding">
|
||||
Items in Slab <?php echo $_REQUEST['slab']; ?>, only showing first <?php echo $_ini->get('max_item_dump'); ?> items
|
||||
<span style="float:right;">
|
||||
<a href="?server=<?php echo $_REQUEST['server']; ?>&show=slabs">Back to Server Slabs</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<?php
|
||||
$notFirst = false;
|
||||
|
||||
# Items
|
||||
foreach($items as $key => $data)
|
||||
{
|
||||
# Checking if first item
|
||||
if($notFirst) { echo '<hr/>'; }
|
||||
?>
|
||||
<a class="green item" style=""
|
||||
onclick="javascript:executeHideShow('console', 'hide', true);javascript:executeCommand('container', 'request_key=<?php echo urlencode($key); ?>&request_api=<?php echo $_ini->get('get_api'); ?>&request_command=get&request_server=<?php echo $_REQUEST['server']; ?>');"><?php echo ((strlen($key) > 70) ? substr($key, 0, 70) . '[..]' : $key); ?></a>
|
||||
|
||||
<span class="right" style="clear:right;">
|
||||
<strong>Size</strong> : <?php echo Library_Data_Analysis::byteResize($data[0]); ?>Bytes,
|
||||
<strong>Expiration</strong> :
|
||||
<?php
|
||||
# Infinite expiration
|
||||
if($data[1] == $infinite)
|
||||
{
|
||||
echo '∞';
|
||||
}
|
||||
# Timestamp expiration
|
||||
else
|
||||
{
|
||||
echo Library_Data_Analysis::uptime($data[1] - time());
|
||||
} ?>
|
||||
</span>
|
||||
<?php
|
||||
# First item done
|
||||
$notFirst = true;
|
||||
} ?>
|
||||
</div>
|
126
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Slabs.phtml
vendored
Normal file
126
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Slabs.phtml
vendored
Normal file
@ -0,0 +1,126 @@
|
||||
<div class="size-4" style="float:left;">
|
||||
<div class="sub-header corner padding">Slabs <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Slabs Used</span>
|
||||
<?php echo $slabs['active_slabs']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Memory Used</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slabs['total_malloced']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Wasted</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slabs['total_wasted']); ?>Bytes
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="size-2" style="float:left;padding-left:9px;margin-top:10px;">
|
||||
<div class="header corner padding size-3cols" style="text-align:center;">
|
||||
<a href="?server=<?php echo $_REQUEST['server']; ?>">See this Server Stats</a>
|
||||
</div>
|
||||
<br/>
|
||||
</div>
|
||||
|
||||
<div class="size-1" style="float:left;padding-left:9px;">
|
||||
<div class="container corner" style="padding:9px;">
|
||||
For more informations about memcached slabs stats, see memcached protocol
|
||||
<a href="http://github.com/memcached/memcached/blob/master/doc/protocol.txt#L470" target="_blank"><span class="green">here</span></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="full-size" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<?php
|
||||
$actualSlab = 0;
|
||||
|
||||
# Slabs parsing
|
||||
foreach($slabs as $id => $slab)
|
||||
{
|
||||
# If Slab is Used
|
||||
if(is_numeric($id))
|
||||
{
|
||||
# Making a new line
|
||||
if($actualSlab >= 4)
|
||||
{
|
||||
?>
|
||||
</tr>
|
||||
<tr>
|
||||
<?php
|
||||
$actualSlab = 0;
|
||||
}
|
||||
?>
|
||||
<td <?php if($actualSlab > 0) { echo 'style="padding-left:9px;"'; } ?> valign="top">
|
||||
<div class="sub-header corner padding size-5">Slab <?php echo $id; ?> <span class="green">Stats</span>
|
||||
<span style="float:right;"><a href="?server=<?php echo $_REQUEST['server']; ?>&show=items&slab=<?php echo $id; ?>">See Slab Items</a></span>
|
||||
</div>
|
||||
<div class="container corner padding size-5">
|
||||
<div class="line">
|
||||
<span class="left slabs">Chunk Size</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slab['chunk_size']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Used Chunk</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($slab['used_chunks']); ?>
|
||||
<span class="right">[<?php echo Library_Data_Analysis::valueResize($slab['used_chunks'] / $slab['total_chunks'] * 100); ?> %]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Total Chunk</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($slab['total_chunks']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Total Page</span>
|
||||
<?php echo $slab['total_pages']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Wasted</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slab['mem_wasted']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Hits</span>
|
||||
<?php echo ($slab['request_rate'] > 999) ? Library_Data_Analysis::hitResize($slab['request_rate']) : $slab['request_rate']; ?> Request/sec
|
||||
</div>
|
||||
<?php
|
||||
if($slab['used_chunks'] > 0)
|
||||
{ ?>
|
||||
<div class="line">
|
||||
<span class="left slabs">Evicted</span>
|
||||
<?php echo (isset($slab['items:evicted'])) ? $slab['items:evicted'] : 'N/A'; ?>
|
||||
</div>
|
||||
<!--
|
||||
<div class="line">
|
||||
<span class="left slabs">Evicted Last</span>
|
||||
<?php echo Library_Data_Analysis::uptime($slab['items:evicted_time']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Out of Memory</span>
|
||||
<?php echo $slab['items:outofmemory']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Tail Repairs</span>
|
||||
<?php echo $slab['items:tailrepairs']; ?>
|
||||
</div>
|
||||
-->
|
||||
<?php }
|
||||
else
|
||||
{?>
|
||||
<div class="line">
|
||||
<span class="left slabs">Slab is allocated but empty</span>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</div>
|
||||
</td>
|
||||
<?php
|
||||
$actualSlab++;
|
||||
}
|
||||
?>
|
||||
<?php
|
||||
}
|
||||
for(true; $actualSlab < 4 ; $actualSlab++)
|
||||
{
|
||||
echo '<td style="width:100%;"></td>';
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
</table>
|
551
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Stats.phtml
vendored
Normal file
551
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Stats.phtml
vendored
Normal file
@ -0,0 +1,551 @@
|
||||
<div class="size-4" style="float:left;">
|
||||
<div class="sub-header corner padding">Get <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['get_hits']); ?>
|
||||
<span class="right">[<?php echo $stats['get_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['get_misses']); ?>
|
||||
<span class="right">[<?php echo $stats['get_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo $stats['get_rate']; ?> Request/sec
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Set <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Total</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['cmd_set']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo $stats['set_rate']; ?> Request/sec
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Delete <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['delete_hits'])) ? Library_Data_Analysis::hitResize($stats['delete_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['delete_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['delete_misses'])) ? Library_Data_Analysis::hitResize($stats['delete_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['delete_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['delete_hits'])) ? $stats['delete_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Cas <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['cas_hits'])) ? Library_Data_Analysis::hitResize($stats['cas_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['cas_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['cas_misses'])) ? Library_Data_Analysis::hitResize($stats['cas_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['cas_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Bad Value</span>
|
||||
<?php echo (isset($stats['cas_badval'])) ? Library_Data_Analysis::hitResize($stats['cas_badval']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['cas_badval_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['cas_hits'])) ? $stats['cas_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Increment <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['incr_hits'])) ? Library_Data_Analysis::hitResize($stats['incr_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['incr_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['incr_misses'])) ? Library_Data_Analysis::hitResize($stats['incr_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['incr_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['incr_hits'])) ? $stats['incr_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Decrement <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['decr_hits'])) ? Library_Data_Analysis::hitResize($stats['decr_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['decr_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['decr_misses'])) ? Library_Data_Analysis::hitResize($stats['decr_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['decr_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['decr_hits'])) ? $stats['decr_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Touch <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['touch_hits'])) ? Library_Data_Analysis::hitResize($stats['touch_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['touch_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['touch_misses'])) ? Library_Data_Analysis::hitResize($stats['touch_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['touch_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['touch_hits'])) ? $stats['touch_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Flush <span class="green">Stats</span></div>
|
||||
<div class="container corner padding" style="height:48px;">
|
||||
<div class="line">
|
||||
<span class="left">Total</span>
|
||||
<?php echo (isset($stats['cmd_flush'])) ? Library_Data_Analysis::hitResize($stats['cmd_flush']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['cmd_flush'])) ? $stats['flush_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="size-2" style="float:left;padding-left:9px;">
|
||||
<?php
|
||||
# Viewing a single server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="header corner padding size-3cols" style="text-align:center;margin-top:10px;">
|
||||
<a href="?server=<?php echo $_REQUEST['server']; ?>&show=slabs">See this Server Slabs Stats</a>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
<div class="sub-header corner padding"><?php echo (isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])) ? 'Server' : 'Cluster'; ?> <span class="green">Stats</span></div>
|
||||
<div class="container corner padding size-3cols">
|
||||
<?php
|
||||
# Viewing a single server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="line">
|
||||
<span class="left setting">Uptime</span>
|
||||
<?php echo Library_Data_Analysis::uptime($stats['uptime']); ?>
|
||||
</div>
|
||||
<div class="line" style="margin-bottom:4px;">
|
||||
<span class="left setting">Memcached</span>
|
||||
Version <?php echo $stats['version']; ?>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
<div class="line">
|
||||
<span class="left setting">Curr Connections</span>
|
||||
<?php echo $stats['curr_connections']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Total Connections</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['total_connections']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Max Connections Errors</span>
|
||||
<?php echo (isset($stats['listen_disabled_num'])) ? Library_Data_Analysis::hitResize($stats['listen_disabled_num']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line" style="margin-top:4px;">
|
||||
<span class="left setting">Current Items</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['curr_items']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Total Items</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['total_items']); ?>
|
||||
</div>
|
||||
<?php
|
||||
# Viewing a single server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="line">
|
||||
<span class="left setting">Oldest Item</span>
|
||||
<?php echo (isset($settings['oldest'])) ? Library_Data_Analysis::uptime($settings['oldest']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Eviction & Reclaimed <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left setting">Items Eviction</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['evictions']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Rate</span>
|
||||
<?php echo $stats['eviction_rate']; ?> Eviction/sec
|
||||
</div>
|
||||
<div class="line" style="margin-top:4px;">
|
||||
<span class="left setting">Reclaimed</span>
|
||||
<?php echo (isset($stats['reclaimed'])) ? Library_Data_Analysis::hitResize($stats['reclaimed']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Rate</span>
|
||||
<?php echo (isset($stats['reclaimed'])) ? $stats['reclaimed_rate'] . ' Reclaimed/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
|
||||
<div class="line" style="margin-top:4px;">
|
||||
<span class="left setting help" title="Internal name : expired_unfetched
Items pulled from LRU that were never touched by get/incr/append/etc before expiring">Expired unfetched</span>
|
||||
<?php echo (isset($stats['expired_unfetched'])) ? Library_Data_Analysis::hitResize($stats['expired_unfetched']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : evicted_unfetched
Items evicted from LRU that were never touched by get/incr/append/etc">Evicted unfetched</span>
|
||||
<?php echo (isset($stats['evicted_unfetched'])) ? Library_Data_Analysis::hitResize($stats['evicted_unfetched']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
# Viewing a server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="sub-header corner padding">Server <span class="green">Configuration</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : accepting_conns
Whether the server is accepting connection or not">Accepting Connections</span>
|
||||
<?php
|
||||
# Northscale/Membase server specific
|
||||
if(isset($stats['accepting_conns']))
|
||||
{
|
||||
if($stats['accepting_conns']) { echo 'Yes'; } else { echo 'No'; }
|
||||
}
|
||||
else
|
||||
{
|
||||
echo 'N/A on ' . $stats['version'];
|
||||
}?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : maxbytes
Maximum number of bytes allowed in this cache">Max Bytes</span>
|
||||
<?php echo (isset($settings['maxbytes'])) ? Library_Data_Analysis::byteResize($settings['maxbytes']) . 'Bytes' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : maxconns
Maximum number of clients allowed">Max Connection</span>
|
||||
<?php echo (isset($settings['maxconns'])) ? $settings['maxconns'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : tcpport & udpport
TCP & UDP listen port">TCP/UDP Port</span>
|
||||
<?php echo (isset($settings['tcpport'], $settings['udpport'])) ? 'TCP : ' . $settings['tcpport'] . ', UDP : ' . $settings['udpport'] : 'N/A on ' . $stats['version'] ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : inter
Listen interface">Listen Interface</span>
|
||||
<?php echo (isset($settings['inter'])) ? $settings['inter'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : evictions
When Off, LRU evictions are disabled">Evictions</span>
|
||||
<?php echo (isset($settings['evictions'])) ? ucfirst($settings['evictions']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : domain_socket
Path to the domain socket (if any)">Path to Domain Socket</span>
|
||||
<?php echo (isset($settings['domain_socket'])) ? $settings['domain_socket'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : umask
Umask for the creation of the domain socket">Domain Socket Umask</span>
|
||||
<?php echo (isset($settings['umask'])) ? $settings['umask'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : chunk_size
Minimum space allocated for key + value + flags">Chunk Size</span>
|
||||
<?php echo (isset($settings['chunk_size'])) ? $settings['chunk_size'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : growth_factor
Chunk size growth factor">Chunk Growth Factor</span>
|
||||
<?php echo (isset($settings['growth_factor'])) ? $settings['growth_factor'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : num_threads
Number of threads (including dispatch)">Max Threads</span>
|
||||
<?php echo (isset($settings['num_threads'])) ? $settings['num_threads'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : detail_enabled
If yes, stats detail is enabled">Detail Enabled</span>
|
||||
<?php echo (isset($settings['detail_enabled'])) ? ucfirst($settings['detail_enabled']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : reqs_per_event
Max num IO ops processed within an event">Max IO Ops/Event</span>
|
||||
<?php echo (isset($settings['reqs_per_event'])) ? $settings['reqs_per_event'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : cas_enabled
When no, CAS is not enabled for this server">CAS Enabled</span>
|
||||
<?php echo (isset($settings['cas_enabled'])) ? ucfirst($settings['cas_enabled']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : tcp_backlog
TCP listen backlog">TCP Listen Backlog</span>
|
||||
<?php echo (isset($settings['tcp_backlog'])) ? $settings['tcp_backlog'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : auth_enabled_sasl
SASL auth requested and enabled">SASL Auth</span>
|
||||
<?php echo (isset($settings['auth_enabled_sasl'])) ? ucfirst($settings['auth_enabled_sasl']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# Viewing a cluster
|
||||
elseif((isset($_REQUEST['server'])) && ($cluster = $_ini->cluster($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="sub-header corner padding">Cluster <?php echo $_REQUEST['server']; ?> <span class="green">Servers List</span></div>
|
||||
<div class="container corner padding">
|
||||
<?php
|
||||
# Displaying first 8 servers
|
||||
$displayed = 0;
|
||||
foreach($cluster as $name => $server)
|
||||
{ ?>
|
||||
<div class="line server" style="<?php if($displayed > 8) { echo 'display:none;'; } else { $displayed++; } ?>">
|
||||
<span class="left setting"><?php echo (strlen($name) > 27) ? substr($name, 0, 27) . ' [...]' : $name; ?></span>
|
||||
<span class="right" style="font-weight:bold;"><a href="index.php?server=<?php echo $name; ?>" class="green">See Server Stats</a></span>
|
||||
<div class="line" style="margin-left:5px;">
|
||||
<?php echo ($status[$name] != '') ? 'Version ' . $status[$name] . ', Uptime : ' . Library_Data_Analysis::uptime($uptime[$name]) : 'Server did not respond'; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# Displaying remaining X server line
|
||||
$remaining = (count($cluster) - $displayed);
|
||||
if(($displayed > 8) && ($remaining >= 0))
|
||||
{ ?>
|
||||
<div class="line more">
|
||||
<span class="left" style="font-weight:bold;">
|
||||
<?php echo $remaining; ?> Server<?php echo ($remaining > 1) ? 's are' : ' is'; ?> not displayed</span>
|
||||
<span class="right" style="font-weight:bold;"><a href="#" onclick="javascript:show('server');javascript:hide('more');" class="green">See all <?php echo count($cluster); ?> Servers</a></span>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
</div>
|
||||
<?php
|
||||
# Fixing issue 163, some results from stats slabs mem_requested are buggy @FIXME
|
||||
if($slabs['total_malloced'] > $stats['limit_maxbytes'])
|
||||
{
|
||||
$slabs['total_wasted'] = $stats['limit_maxbytes'] - ($slabs['total_malloced'] - $slabs['total_wasted']);
|
||||
$slabs['total_malloced'] = $stats['limit_maxbytes'];
|
||||
}
|
||||
|
||||
# Making cache size stats
|
||||
$wasted_percent = sprintf('%.1f', $slabs['total_wasted'] / $stats['limit_maxbytes'] * 100);
|
||||
$used_percent = sprintf('%.1f', ($slabs['total_malloced'] - $slabs['total_wasted']) / $stats['limit_maxbytes'] * 100);
|
||||
$free_percent = sprintf('%.1f', ($stats['limit_maxbytes'] - $slabs['total_malloced']) / $stats['limit_maxbytes'] * 100);
|
||||
?>
|
||||
<div class="size-4" style="float:left; padding-left:9px;clear:right;">
|
||||
<div class="sub-header corner padding">Cache Size <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Used</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slabs['total_malloced']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Total</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($stats['limit_maxbytes']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Wasted</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slabs['total_wasted']); ?>Bytes
|
||||
</div>
|
||||
<!--
|
||||
<div class="line">
|
||||
<span class="left">Percent</span>
|
||||
<?php echo sprintf('%.1f', $stats['bytes'] / $stats['limit_maxbytes'] * 100, 1); ?>%
|
||||
</div>-->
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Cache Size <span class="green">Graphic</span></div>
|
||||
<div class="container corner padding">
|
||||
<div id="cacheUsageContainer"></div>
|
||||
<script>
|
||||
new Highcharts.Chart({
|
||||
chart: {
|
||||
backgroundColor: '#EBEBEB',
|
||||
plotBorderWidth: null,
|
||||
plotShadow: false,
|
||||
width: 274,
|
||||
height: 234,
|
||||
marginLeft: 0,
|
||||
marginRight: 0,
|
||||
marginTop: 0,
|
||||
marginBottom: 0,
|
||||
renderTo: 'cacheUsageContainer'
|
||||
},
|
||||
title: {
|
||||
text: '<b><?php echo Library_Data_Analysis::byteResize($stats['limit_maxbytes']); ?>Bytes</b>',
|
||||
y: 110,
|
||||
style: {
|
||||
fontSize: '12px'
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
plotOptions: {
|
||||
pie: {
|
||||
borderWidth: 0,
|
||||
allowPointSelect: false,
|
||||
dataLabels: {
|
||||
enabled: true,
|
||||
color: '#000000',
|
||||
distance: 15,
|
||||
connectorWidth: 1.5,
|
||||
format: '<b>{point.name}</b><br/>{point.percentage:.1f} %'
|
||||
},
|
||||
center: ['50%', '50%']
|
||||
}
|
||||
},
|
||||
credits: {
|
||||
enabled: false
|
||||
},
|
||||
series: [{
|
||||
type: 'pie',
|
||||
name: 'Cache Size',
|
||||
size: '70%',
|
||||
innerSize: '55%',
|
||||
data: [{name: 'Wasted',
|
||||
y: <?php echo $wasted_percent; ?>,
|
||||
color: '#B5463F'},
|
||||
{name: 'Used',
|
||||
y: <?php echo $used_percent; ?>,
|
||||
color: '#2A707B'},
|
||||
{name: 'Free',
|
||||
y: <?php echo $free_percent; ?>,
|
||||
color: '#FFFFFF'}]
|
||||
}]
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
<?php
|
||||
# Viewing a single server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="sub-header corner padding">Hash Table <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left help" title="Internal name : hash_power_level
Current size multiplier for hash table">Power Level</span>
|
||||
<?php echo (isset($stats['hash_power_level'])) ? Library_Data_Analysis::byteResize($stats['hash_power_level']) . 'Bytes' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Size</span>
|
||||
<?php echo (isset($stats['hash_bytes'])) ? Library_Data_Analysis::byteResize($stats['hash_bytes']) . 'Bytes' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left help" title="Internal name : hash_is_expanding
Indicates if the hash table is being grown to a new size">Expanding</span>
|
||||
<?php if(isset($stats['hash_is_expanding'])) { if($stats['hash_is_expanding']) { echo 'Yes'; } else { echo 'No'; } } else { echo 'N/A on ' . $stats['version']; } ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# Viewing a cluster
|
||||
elseif((isset($_REQUEST['server'])) && ($cluster = $_ini->cluster($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="sub-header corner padding">Hash Table <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Size</span>
|
||||
<?php echo (isset($stats['hash_bytes'])) ? Library_Data_Analysis::byteResize($stats['hash_bytes']) . 'Bytes' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
<div class="sub-header corner padding">Slab <span class="green">Reassign & Automove</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left help" title="Internal name : slabs_moved
Indicates how many pages have been successfully moved">Slabs Moved</span>
|
||||
<?php echo (isset($stats['slabs_moved'])) ? Library_Data_Analysis::hitResize($stats['slabs_moved']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left help" title="Internal name : slab_reassign_running
Indicates if the slab thread is attempting to move a page.
It may need to wait for some memory to free up, so it could take several seconds.">Reassigning</span>
|
||||
<?php if(isset($stats['slab_reassign_running'])) { if($stats['slab_reassign_running']) { echo 'Yes'; } else { echo 'No'; } } else { echo 'N/A on ' . $stats['version']; } ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Hit & Miss Rate <span class="green">Graphic</span></div>
|
||||
<div class="container corner padding">
|
||||
<div id="hitsContainer"></div>
|
||||
<script>
|
||||
new Highcharts.Chart({
|
||||
chart: {
|
||||
backgroundColor: '#EBEBEB',
|
||||
width: 274,
|
||||
height: 147,
|
||||
marginLeft: 0,
|
||||
marginRight: 0,
|
||||
marginTop: 0,
|
||||
marginBottom: 20,
|
||||
renderTo: 'hitsContainer'
|
||||
},
|
||||
title: {
|
||||
text: null
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
plotOptions: {
|
||||
column: {
|
||||
dataLabels: {
|
||||
enabled: true,
|
||||
format: '<b>{y} %</b>'
|
||||
}
|
||||
}
|
||||
},
|
||||
credits: {
|
||||
enabled: false
|
||||
},
|
||||
legend: {
|
||||
enabled: false
|
||||
},
|
||||
xAxis: {
|
||||
categories: ['Hits', 'Misses']
|
||||
},
|
||||
yAxis: {
|
||||
gridLineWidth: 0
|
||||
},
|
||||
series: [{
|
||||
type: 'column',
|
||||
name: 'Cache Size',
|
||||
data: [{name: 'Hits',
|
||||
y: <?php echo $stats['get_hits_percent']; ?>,
|
||||
color: '#2A707B'},
|
||||
{name: 'Misses',
|
||||
y: <?php echo $stats['get_misses_percent']; ?>,
|
||||
color: '#B5463F'}]
|
||||
}]
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Network <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Bytes Read</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($stats['bytes_read']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Bytes Written</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($stats['bytes_written']); ?>Bytes
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
255
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/commands.php
vendored
Normal file
255
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/commands.php
vendored
Normal file
@ -0,0 +1,255 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Executing commands
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 06/04/2010
|
||||
*/
|
||||
# Require
|
||||
require_once 'Library/Bootstrap.php';
|
||||
|
||||
# Initializing requests & response
|
||||
$request = (isset($_REQUEST['request_command'])) ? $_REQUEST['request_command'] : null;
|
||||
|
||||
# Starting
|
||||
ob_start();
|
||||
|
||||
# Display by request rype
|
||||
switch ($request) {
|
||||
# Memcache::get command
|
||||
case 'get' :
|
||||
# Ask for get on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->get($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
}
|
||||
} # Ask for get on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->get($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
} # Ask for get on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->get($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::set command
|
||||
case 'set' :
|
||||
# Ask for set on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->set($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_data'], $_REQUEST['request_duration']));
|
||||
}
|
||||
} # Ask for set on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server set command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->set($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_data'], $_REQUEST['request_duration']));
|
||||
} # Ask for set on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server set command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->set($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_data'], $_REQUEST['request_duration']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::delete command
|
||||
case 'delete' :
|
||||
# Ask for delete on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->delete($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
}
|
||||
} # Ask for delete on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server delete command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->delete($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
} # Ask for delete on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server delete command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->delete($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::increment command
|
||||
case 'increment' :
|
||||
# Checking value
|
||||
if (! isset($_REQUEST['request_value']) || ! is_numeric($_REQUEST['request_value'])) {
|
||||
$_REQUEST['request_value'] = 1;
|
||||
}
|
||||
|
||||
# Ask for increment on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server increment command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->increment($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
}
|
||||
} # Ask for increment on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server increment command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->increment($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
} # Ask for increment on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server increment command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->increment($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::decrement command
|
||||
case 'decrement' :
|
||||
# Checking value
|
||||
if (! isset($_REQUEST['request_value']) || ! is_numeric($_REQUEST['request_value'])) {
|
||||
$_REQUEST['request_value'] = 1;
|
||||
}
|
||||
|
||||
# Ask for decrement on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server decrement command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->decrement($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
}
|
||||
} # Ask for decrement on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server decrement command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->decrement($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
} # Ask for decrement on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server decrement command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->decrement($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::flush_all command
|
||||
case 'flush_all' :
|
||||
# Checking delay
|
||||
if (! isset($_REQUEST['request_delay']) || ! is_numeric($_REQUEST['request_delay'])) {
|
||||
$_REQUEST['request_delay'] = 0;
|
||||
}
|
||||
|
||||
# Ask for flush_all on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->flush_all($server['hostname'], $server['port'], $_REQUEST['request_delay']));
|
||||
}
|
||||
} # Ask for flush_all on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server flush_all command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->flush_all($server['hostname'], $server['port'], $_REQUEST['request_delay']));
|
||||
} # Ask for flush_all on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server flush_all command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->flush_all($server['hostname'], $server['port'], $_REQUEST['request_delay']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::search command
|
||||
case 'search' :
|
||||
# Ask for search on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->search($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_level'], $_REQUEST['request_more']));
|
||||
}
|
||||
} # Ask for search on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server search command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->search($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_level'], $_REQUEST['request_more']));
|
||||
} # Ask for search on all servers
|
||||
else {
|
||||
# Looking into each cluster
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server search command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->search($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_level'], $_REQUEST['request_more']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::telnet command
|
||||
case 'telnet' :
|
||||
# Ask for a telnet command on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server telnet command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->telnet($server['hostname'], $server['port'], $_REQUEST['request_telnet']));
|
||||
}
|
||||
} # Ask for a telnet command on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server telnet command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->telnet($server['hostname'], $server['port'], $_REQUEST['request_telnet']));
|
||||
} # Ask for a telnet command on all servers
|
||||
else {
|
||||
# Looking into each cluster
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server telnet command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->telnet($server['hostname'], $server['port'], $_REQUEST['request_telnet']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
# Default : No command
|
||||
default :
|
||||
# Showing header
|
||||
include 'View/Header.phtml';
|
||||
|
||||
# Showing formulary
|
||||
include 'View/Commands/Commands.phtml';
|
||||
|
||||
# Showing footer
|
||||
include 'View/Footer.phtml';
|
||||
break;
|
||||
}
|
||||
|
||||
ob_end_flush();
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user