aboutsummaryrefslogtreecommitdiff
path: root/misc/minetest-icon.ico
blob: 82af67bf918ad7683dfc7b63da97757d8b37d23c (plain)
ofshex dumpascii
0000 00 00 01 00 01 00 30 30 00 00 01 00 20 00 a8 25 00 00 16 00 00 00 28 00 00 00 30 00 00 00 60 00 ......00.......%......(...0...`.
0020 00 00 01 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 39 59 28 0f 3f ...........................9Y(.?
0160 5c 95 0d 3c 57 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \..<W&..........................
0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
01a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
01c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
01e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 40 50 10 11 3f 5e 95 12 3f 5e f5 33 6c ...................@P..?^..?^.3l
0220 91 f9 11 3e 5d f5 10 3d 5a 8d 15 40 55 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...>]..=Z..@U...................
0240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
02a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
02c0 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0f 3b 59 56 11 40 5d eb 2b 62 85 f7 63 aa d8 ff 6e b9 ...............;YV.@].+b..c...n.
02e0 e9 ff 62 a9 d7 ff 27 5d 7e f6 10 3f 5d e8 0d 3c 56 4d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..b...']~..?]..<VM..............
0300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0380 00 00 00 00 00 00 0f 3b 58 34 13 42 61 d3 1d 50 70 f5 58 9c c8 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 .......;X4.Ba..Pp.X...n...n...n.
03a0 e9 ff 6e b9 e9 ff 6e b9 e9 ff 53 95 c0 ff 18 48 69 f4 12 41 60 c1 0e 37 5a 25 00 00 00 00 00 00 ..n...n...S....Hi..A`..7Z%......
03c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
03e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2c 35 ..............................,5
0440 38 57 34 36 33 f2 15 44 61 f5 47 86 af fe 6d b8 e8 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 8W463..Da.G...m...n...n...n...n.
0460 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6b b6 e6 ff 41 7d a4 fd 12 40 5d f6 13 42 60 88 17 46 ..n...n...n...k...A}...@]..B`..F
0480 5d 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]...............................
04a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
04c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
04e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 30 38 20 33 35 32 e5 38 36 ......................008.352.86
0500 2f ff 36 34 2e ff 69 b3 e1 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 /.64..i...n...n...n...n...n...n.
0520 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 65 ad dc ff 2d 65 88 f7 11 40 ..n...n...n...n...n...e...-e...@
0540 5e ec 0c 3b 59 56 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ^..;YV..........................
0560 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
05a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 31 36 36 bd 37 35 30 ff 41 40 3c ff 4c 4f ..................166.750.A@<.LO
05c0 4c ff 36 34 2e ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 69 a4 c8 ff 5c 6c L.64..n...n...n...n...n...i...\l
05e0 71 ff 69 a4 ca ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 58 9c q.i...n...n...n...n...n...n...X.
0600 c8 ff 1c 4e 6e f4 12 40 60 cf 0a 39 58 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...Nn..@`..9X1..................
0620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0640 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0660 00 00 00 00 00 00 00 00 00 00 2d 35 39 82 36 36 30 fe 3b 3b 35 ff 4e 50 4d ff 43 44 40 ff 38 36 ..........-59.660.;;5.NPM.CD@.86
0680 2f ff 47 5b 65 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6c b0 db ff 5d 6b 71 ff 52 3b 25 ff 7e 5e /.G[e.n...n...n...l...]kq.R;%.~^
06a0 40 ff 51 3a 25 ff 5d 6f 77 ff 6c b2 de ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 @.Q:%.]ow.l...n...n...n...n...n.
06c0 e9 ff 6d b8 e7 ff 45 81 a9 fd 12 40 5e f6 11 41 5d 99 1c 39 4c 1b 00 00 00 00 00 00 00 00 00 00 ..m...E....@^..A]..9L...........
06e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0700 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0720 00 00 2b 37 37 41 35 36 33 f5 39 37 31 ff 49 4b 48 ff 53 57 55 ff 53 57 55 ff 36 34 2e ff 61 97 ..+77A563.971.IKH.SWU.SWU.64..a.
0740 bb ff 6e b9 e9 ff 6e b9 e9 ff 6e b8 e8 ff 63 8b a3 ff 54 40 2d ff 74 57 3a ff c0 92 68 ff cf 9f ..n...n...n...c...T@-.tW:...h...
0760 72 ff be 91 67 ff 6f 52 38 ff 53 42 2f ff 64 90 aa ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 r...g.oR8.SB/.d...n...n...n...n.
0780 e9 ff 6e b9 e9 ff 6e b9 e9 ff 66 af de ff 32 6a 8e f7 33 36 33 fd 27 37 41 95 00 00 80 02 00 00 ..n...n...f...2j..363.'7A.......
07a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
07c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 31 3d 15 31 34 ..........................$1=.14
07e0 35 dc 37 35 2f ff 43 44 40 ff 52 56 54 ff 53 57 55 ff 53 57 55 ff 51 55 53 ff 36 34 2e ff 69 ad 5.75/.CD@.RVT.SWU.SWU.QUS.64..i.
0800 d8 ff 6e b9 e9 ff 67 9e c1 ff 57 47 38 ff 6a 4e 35 ff b8 8b 62 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..n...g...WG8.jN5...b...r...r...
0820 72 ff cf 9f 72 ff cf 9f 72 ff b2 86 5f ff 62 48 30 ff 59 4f 43 ff 67 9e c1 ff 6e b9 e9 ff 6e b9 r...r...r..._.bH0.YOC.g...n...n.
0840 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 40 41 3d fe 33 3a 3a f6 21 37 ..n...n...n...n...64..@A=.3::.!7
0860 43 5c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C\..............................
0880 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 2e 34 36 ab 37 35 30 ff 3f 3f .......................46.750.??
08a0 3a ff 50 52 51 ff 53 57 55 ff 53 57 55 ff 52 56 54 ff 48 4a 46 ff 38 36 31 ff 3d 43 44 ff 6d b5 :.PRQ.SWU.SWU.RVT.HJF.861.=CD.m.
08c0 e3 ff 6e b9 e9 ff 5e 7c 8b ff 7b 5b 3d ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..n...^|..{[=...r...r...r...r...
08e0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff ce 9e 71 ff 9a 73 50 ff 54 3c 27 ff 5c 68 6b ff 6c af r...r...r...r...q..sP.T<'.\hk.l.
0900 da ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 83 88 86 ff 5f 62 5e ff 39 39 ..n...n...n...n...64......_b^.99
0920 35 ff 2c 3b 42 db 20 39 46 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5.,;B..9F(......................
0940 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 3c 57 26 13 43 60 bf 36 34 2e ff 37 35 30 ff 3e 3e ...............<W&.C`.64..750.>>
0960 3a ff 50 53 50 ff 53 57 55 ff 4c 50 4c ff 3b 3a 34 ff 38 35 30 ff 58 88 a4 ff 6e b9 e9 ff 6e b9 :.PSP.SWU.LPL.;:4.850.X...n...n.
0980 e9 ff 6e b9 e9 ff 5b 72 7c ff 84 63 44 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..n...[r|..cD...r...r...r...r...
09a0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff c6 97 6c ff 81 60 42 ff 52 3c r...r...r...r...r...r...l..`B.R<
09c0 26 ff 60 80 90 ff 6e b8 e6 ff 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 85 8a 88 ff 85 8a 88 ff 7e 83 &.`...n...n...n...64..........~.
09e0 81 ff 52 55 53 ff 37 38 33 fe 29 39 41 aa 1c 39 55 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..RUS.783.)9A..9U...............
0a00 00 00 00 00 00 00 00 55 55 03 13 43 61 a3 13 42 60 f6 47 86 ae fe 36 34 2e ff 36 34 2e ff 36 34 .......UU..Ca..B`.G...64..64..64
0a20 2e ff 37 35 2f ff 3c 3c 37 ff 37 35 2f ff 36 34 2e ff 36 34 2e ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 ..75/.<<7.75/.64..64..n...n...n.
0a40 e9 ff 59 58 53 ff 59 42 2a ff af 84 5c ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..YXS.YB*...\...r...r...r...r...
0a60 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff b7 8c r...r...r...r...r...r...r...r...
0a80 62 ff 68 4e 34 ff 56 49 39 ff 66 99 b7 ff 6e b9 e9 ff 36 34 2e ff 69 6d 6a ff 84 89 87 ff 85 8a b.hN4.VI9.f...n...64..imj.......
0aa0 88 ff 85 8a 88 ff 7a 7e 7b ff 49 4c 49 fe 35 38 36 fd 26 35 3e 87 00 00 00 00 00 00 00 00 00 00 ......z~{.ILI.586.&5>...........
0ac0 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fc 68 b1 df ff 6e b9 e9 ff 36 34 2e ff 36 34 2e ff 36 34 .......9U..<Y.h...n...64..64..64
0ae0 2e ff 36 34 2e ff 36 34 2e ff 35 33 34 ff 36 34 31 ff 36 34 2e ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 ..64..64..534.641.64..n...n...n.
0b00 e9 ff 4b 31 19 ff cc 9c 70 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..K1....p...r...r...r...r...r...
0b20 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0b40 72 ff cf 9f 72 ff a2 7a 54 ff 57 3f 28 ff 5c 60 5c ff 60 99 bb ff 42 4d 4f ff 48 49 46 ff 85 8a r...r..zT.W?(.\`\.`...BMO.HIF...
0b60 88 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 70 73 6f ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..............pso.64............
0b80 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 36 34 2e ff 36 34 .......9U..<Y.n...n...64..64..64
0ba0 2e ff 36 34 2e ff 36 34 2e ff 34 32 4a ff 36 34 3a ff 36 34 2e ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 ..64..64..42J.64:.64..n...n...n.
0bc0 e9 ff 4b 31 19 ff bb 8e 64 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..K1....d...r...r...r...r...r...
0be0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0c00 72 ff cf 9f 72 ff cf 9f 72 ff c9 9a 6e ff 4b 31 19 ff 6e b9 e9 ff 6d b8 e7 ff 36 34 2e ff 85 8a r...r...r...n.K1..n...m...64....
0c20 88 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..................64............
0c40 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 36 34 2e ff 36 34 .......9U..<Y.n...n...64..64..64
0c60 2e ff 36 34 2e ff 36 34 2e ff 36 34 2e ff 38 39 36 ff 40 4c 50 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 ..64..64..64..896.@LP.n...n...n.
0c80 e9 ff 61 7c 89 ff 53 3c 26 ff 82 60 41 ff c6 97 6c ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..a|..S<&..`A...l...r...r...r...
0ca0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0cc0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff 4b 31 19 ff 6c b3 e0 ff 6e b9 e9 ff 36 34 2e ff 74 78 r...r...r...r.K1..l...n...64..tx
0ce0 75 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 u.................64............
0d00 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 38 39 36 ff 36 34 .......9U..<Y.n...n...64..896.64
0d20 2e ff 36 34 2e ff 38 38 34 ff 3a 3e 3c ff 5a 8a a6 ff 6e b8 e8 ff 6e b9 e9 ff 6e b9 e9 ff 5e ab ..64..884.:><.Z...n...n...n...^.
0d40 cd ff 3a 89 8a ff 5d a1 bf ff 5e 6a 6d ff 53 3c 25 ff 95 6f 4c ff cc 9d 70 ff cf 9f 72 ff cf 9f ..:...]...^jm.S<%..oL...p...r...
0d60 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0d80 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff 76 5a 3e ff 53 3f 2b ff 61 87 9c ff 59 87 a2 ff 3d 40 r...r...r...r.vZ>.S?+.a...Y...=@
0da0 3e ff 52 55 52 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 >.RUR.............64............
0dc0 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 3f 4a 4e ff 60 98 bb ff 36 34 .......9U..<Y.n...n...?JN.`...64
0de0 2e ff 38 39 35 ff 52 74 88 ff 6c b4 e2 ff 6e b9 e9 ff 6e b9 e9 ff 69 b3 de ff 35 85 82 ff 0e 64 ..895.Rt..l...n...n...i...5....d
0e00 3d ff 12 8c 51 ff 0e 64 3d ff 33 84 7f ff 63 9e bd ff 5a 58 50 ff 5b 43 2b ff a7 7d 57 ff cf 9f =...Q..d=.3...c...ZXP.[C+..}W...
0e20 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0e40 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff b3 87 5f ff 4b 31 19 ff 6e b9 e9 ff 6b b3 r...r...r...r...r..._.K1..n...k.
0e60 e1 ff 36 34 2e ff 7d 81 7f ff 85 8a 88 ff 85 8a 88 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..64..}...........64............
0e80 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 6d b8 e7 ff 6e b9 e9 ff 49 61 .......9U..<Y.n...n...m...n...Ia
0ea0 6e ff 68 ab d4 ff 6e b9 e9 ff 6e b9 e9 ff 6e b8 e8 ff 4c 99 ac ff 13 68 45 ff 11 82 4c ff 14 c4 n.h...n...n...n...L....hE...L...
0ec0 6b ff 16 d2 73 ff 15 c7 6d ff 12 85 4f ff 10 65 40 ff 48 97 a4 ff 64 93 af ff 56 48 37 ff 69 4f k...s...m...O..e@.H...d...VH7.iO
0ee0 35 ff b7 8b 62 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 5...b...r...r...r...r...r...r...
0f00 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff b3 87 5f ff 4b 31 19 ff 6e b8 e8 ff 6e b9 r...r...r...r...r..._.K1..n...n.
0f20 e9 ff 52 73 85 ff 3c 3c 37 ff 5f 61 5d ff 83 88 85 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..Rs..<<7._a].....64............
0f40 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 .......9U..<Y.n...n...n...n...n.
0f60 e9 ff 6e b9 e9 ff 6e b9 e9 ff 5a a7 c5 ff 1c 72 57 ff 10 72 45 ff 13 b6 64 ff 16 d2 73 ff 16 d2 ..n...n...Z....rW..rE...d...s...
0f80 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 14 bb 66 ff 12 78 49 ff 18 6d 4f ff 53 9f b7 ff 62 81 s...s...s...s...f..xI..mO.S...b.
0fa0 92 ff 53 3c 27 ff 7d 5d 3e ff c3 95 6a ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..S<'.}]>...j...r...r...r...r...
0fc0 72 ff cf 9f 72 ff cf 9f 72 ff c1 93 69 ff 77 58 3b ff 4d 3a 22 ff 29 5b 59 ff 1a 71 83 ff 58 a6 r...r...r...i.wX;.M:".)[Y..q..X.
0fe0 ce ff 6e b9 e9 ff 67 a8 d1 ff 4a 5c 64 ff 40 41 3d ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..n...g...J\d.@A=.64............
1000 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 .......9U..<Y.n...n...n...n...n.
1020 e9 ff 66 b1 db ff 31 84 7d ff 0e 66 3f ff 12 a2 5a ff 16 d1 72 ff 16 d2 73 ff 16 d2 73 ff 16 d2 ..f...1.}..f?...Z...r...s...s...
1040 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 12 aa 5e ff 10 6b 42 ff 27 7c s...s...s...s...s...s...^..kB.'|
1060 6a ff 5d a0 bd ff 5d 66 68 ff 55 3c 26 ff 9a 73 4f ff cc 9d 70 ff cf 9f 72 ff cf 9f 72 ff cf 9f j.]...]fh.U<&..sO...p...r...r...
1080 72 ff cc 9d 70 ff 94 6f 4c ff 4f 37 20 ff 41 61 58 ff 4c d9 e9 ff 4e e8 fb ff 31 b1 c0 ff 0b 64 r...p..oL.O7..AaX.L...N...1....d
10a0 70 ff 2b 80 97 ff 64 b0 dd ff 6e b9 e9 ff 5f 96 b8 ff 30 38 36 ff 00 00 00 00 00 00 00 00 00 00 p.+...d...n..._...086...........
10c0 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6c b7 e5 ff 41 90 .......9U..<Y.n...n...n...l...A.
10e0 98 ff 0e 63 3c ff 11 8e 51 ff 15 cb 70 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 ...c<...Q...p...s...s...s...s...
1100 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 15 ce 71 ff 11 99 s...s...s...s...s...s...s...q...
1120 56 ff 0e 65 3d ff 36 88 85 ff 63 9c ba ff 59 54 4a ff 5d 45 2d ff ac 82 5b ff cf 9f 72 ff a7 7e V..e=.6...c...YTJ.]E-...[...r..~
1140 58 ff 56 3e 25 ff 47 49 39 ff 47 bc c7 ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 4b e1 X.V>%.GI9.G...O...O...O...O...K.
1160 f3 ff 26 9a a8 ff 0a 61 6d ff 3c 8d aa ff 6b b7 e6 ff 03 57 61 ff 00 00 00 00 00 00 00 00 00 00 ..&....am.<...k....Wa...........
1180 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 53 a0 b8 ff 16 6c 4b ff 10 7a .......9U..<Y.n...n...S....lK..z
11a0 48 ff 13 bf 69 ff 16 d2 73 ff 16 d2 73 ff 16 d1 73 ff 0f a7 7d ff 11 b9 79 ff 16 d2 73 ff 16 d2 H...i...s...s...s...}...y...s...
11c0 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 s...s...s...s...s...s...s...s...
11e0 73 ff 15 c8 6d ff 11 8a 50 ff 10 65 40 ff 45 94 9f ff 64 97 b3 ff 57 4b 3c ff 52 3a 22 ff 4a 41 s...m...P..e@.E...d...WK<.R:".JA
1200 2e ff 41 a5 ac ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 3e c9 cd ff 35 bb b7 ff 4f e8 fb ff 4f e9 ..A...O...O...O...>...5...O...O.
1220 fc ff 4f e9 fc ff 44 d4 e6 ff 1b 82 90 ff 10 68 76 ff 02 58 62 ff 00 00 00 00 00 00 00 00 00 00 ..O...D........hv..Xb...........
1240 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 5f ab cd ff 22 78 61 ff 0f 6c 41 ff 13 af 61 ff 16 d2 .......9U..<Y._..."xa..lA...a...
1260 73 ff 16 d2 73 ff 16 d2 73 ff 13 c0 77 ff 06 6e 8d ff 06 64 96 ff 04 60 92 ff 09 82 88 ff 15 ce s...s...s...w..n...d...`........
1280 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 s...s...s...s...s...s...s...s...
12a0 73 ff 16 d2 73 ff 16 d2 73 ff 14 be 68 ff 11 7a 4a ff 16 6c 4c ff 53 9f b7 ff 13 4f 52 ff 4e e6 s...s...s...h..zJ..lL.S....OR.N.
12c0 f9 ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 1c 8d 71 ff 07 69 3a ff 07 6f 3e ff 12 7c 58 ff 4f e9 ..O...O...O.....q..i:..o>..|X.O.
12e0 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 3b c2 d3 ff 02 58 62 ff 00 00 00 00 00 00 00 00 00 00 ..O...O...O...;....Xb...........
1300 00 00 00 00 00 00 00 33 4d 0a 0b 53 44 fe 0d 65 3c ff 11 a3 5a ff 16 d1 72 ff 16 d2 73 ff 16 d2 .......3M..SD..e<...Z...r...s...
1320 73 ff 16 d2 73 ff 16 d2 73 ff 0f a5 7e ff 07 67 9c ff 11 7d c1 ff 10 7b bf ff 03 5e 90 ff 14 c7 s...s...s...~..g...}...{...^....
1340 76 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 v...s...s...s...s...s...s...s...
1360 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 13 b5 63 ff 0d 69 3e ff 08 5f 40 ff 4f e9 s...s...s...s...s...c..i>.._@.O.
1380 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 97 4d ff 06 9a 4d ff 04 60 31 ff 4f e9 ..O...O...O....`1...M...M..`1.O.
13a0 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 3b c2 d3 ff 03 59 64 ff 00 00 00 00 00 00 00 00 00 00 ..O...O...O...;....Yd...........
13c0 00 00 00 00 00 00 00 55 55 03 0d 5a 42 da 0a 61 37 ff 12 a1 59 ff 16 d1 73 ff 16 d2 73 ff 16 d2 .......UU..ZB..a7...Y...s...s...
13e0 73 ff 16 d2 73 ff 16 d2 73 ff 0f a5 7e ff 08 6a 9e ff 11 7d c1 ff 11 7d c1 ff 04 5f 91 ff 14 c7 s...s...s...~..j...}...}..._....
1400 76 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 v...s...s...s...s...s...s...s...
1420 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 15 c7 6d ff 0f 86 4c ff 0a 61 39 ff 25 95 8f ff 4f e9 s...s...s...s...m...L..a9.%...O.
1440 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 4f e9 ..O...O...O....`1...N...N..`1.O.
1460 fc ff 4f e9 fc ff 44 d4 e6 ff 18 80 8d fe 07 5e 69 fd 08 4c 5d 83 00 00 00 00 00 00 00 00 00 00 ..O...D........^i..L]...........
1480 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 4c 42 68 0a 5c 3b f8 0d 6f 40 fe 14 ba 66 ff 16 d2 ...............LBh.\;..o@...f...
14a0 73 ff 16 d2 73 ff 16 d2 73 ff 0f a5 7e ff 08 6a 9d ff 0c 72 8d ff 0e 77 a3 ff 04 5f 91 ff 14 c7 s...s...s...~..j...r...w..._....
14c0 76 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 v...s...s...s...s...s...s...s...
14e0 73 ff 16 d2 73 ff 16 d0 72 ff 12 a1 5a ff 0a 62 38 ff 12 73 5c ff 43 d2 df ff 4f e9 fc ff 4f e9 s...s...r...Z..b8..s\.C...O...O.
1500 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 4c e4 ..O...O...O....`1...N...N..`1.L.
1520 f6 ff 2b a3 b2 ff 06 5d 69 ff 08 53 62 cb 0b 4e 64 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..+....]i..Sb..Nd...............
1540 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 40 04 0b 4f 41 a4 0a 5e 38 fe 0f 86 ...................@@..OA..^8...
1560 4d ff 15 c6 6c ff 16 d2 73 ff 0d 96 6e ff 05 65 44 ff 05 6b 3c ff 05 65 38 ff 04 62 52 ff 12 bd M...l...s...n..eD..k<..e8..bR...
1580 70 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 p...s...s...s...s...s...s...s...
15a0 73 ff 12 b3 63 ff 0b 6a 3d ff 0c 63 44 ff 39 bd c6 ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 s...c..j=..cD.9...O...O...O...O.
15c0 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 08 60 ..O...O...O....`1...N...N..`1..`
15e0 6b fe 08 56 66 e7 0a 43 5b 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 k..Vf..C[5......................
1600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 43 4e 17 0b 52 ...........................CN..R
1620 42 ca 08 5e 35 ff 09 77 40 ff 05 66 35 ff 05 81 41 ff 06 99 4e ff 06 96 4c ff 04 76 3e ff 05 69 B..^5..w@..f5...A...N...L..v>..i
1640 36 ff 0f a7 5b ff 16 d1 72 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 10 9a 6...[...r...s...s...s...s...s...
1660 55 ff 0a 5c 33 ff 3c 84 93 ff 1f 54 75 ff 1a 59 75 ff 40 c2 d7 ff 4f e9 fc ff 4f e9 fc ff 4f e9 U..\3.<....Tu..Yu.@...O...O...O.
1680 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 05 49 ..O...O...O....`1...N...N..`1..I
16a0 5d 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]e..............................
16c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 40 04 05 61 ............................@..a
16e0 33 69 04 62 32 f4 05 76 3c ff 06 96 4c ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 90 3i.b2..v<...L...N...N...N...N...
1700 49 ff 05 72 3a ff 06 72 3b ff 11 b5 62 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 15 c7 I..r:..r;...b...s...s...s...s...
1720 6d ff 0f 82 4b ff 0a 5d 38 ff 31 78 81 ff 49 8b b2 ff 15 47 64 ff 24 75 8f ff 48 d6 ea ff 4f e9 m...K..]8.1x..I....Gd.$u..H...O.
1740 fc ff 4f e9 fc ff 4f e9 fc ff 49 df f0 ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 00 00 ..O...O...I....`1...N...N..`1...
1760 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1780 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 62 2f 51 03 63 33 e8 05 71 .......................b/Q.c3..q
17a0 39 f6 06 92 4b ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 9...K...N...N...N...N...N...N...
17c0 4e ff 06 9a 4e ff 05 8a 46 ff 05 6c 37 ff 09 7f 42 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...F..l7...B...s...s...s...
17e0 73 ff 16 d2 73 ff 13 b5 63 ff 0c 6d 3e ff 0f 60 43 ff 47 8d a9 ff 34 6f 93 ff 12 44 61 ff 33 9b s...s...c..m>..`C.G...4o...Da.3.
1800 b3 ff 4b e2 f6 ff 2d a7 b8 ff 06 5d 68 ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 00 00 ..K...-....]h..`1...N...N..`1...
1820 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1840 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 05 8b 47 ff 06 9a .......................`1...G...
1860 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1880 4e ff 06 9a 4e ff 06 9a 4e ff 06 99 4d ff 04 60 31 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...N...M..`1...s...s...s...
18a0 73 ff 16 d2 73 ff 16 d2 73 ff 16 d1 73 ff 11 9e 57 ff 0a 60 37 ff 18 65 57 ff 52 96 bc ff 2b 62 s...s...s...s...W..`7..eW.R...+b
18c0 84 ff 10 44 5f ff 09 57 67 ed 08 48 5b 43 04 60 31 ff 05 95 4c ff 06 9a 4d ff 04 60 31 ff 00 00 ...D_..Wg..H[C.`1...L...M..`1...
18e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1900 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1920 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1940 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...N...N..`1...s...s...s...
1960 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 cb 6f ff 0f 8c 4e ff 0a 5e 36 ff 26 6e s...s...s...s...s...o...N..^6.&n
1980 70 ff 0d 3b 56 ff 00 00 00 00 00 00 00 00 04 61 32 90 04 62 33 f6 04 69 36 f2 04 63 33 cf 00 00 p..;V..........a2..b3..i6..c3...
19a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
19c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
19e0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1a00 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...N...N..`1...s...s...s...
1a20 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 14 c3 6b ff 0b 69 s...s...s...s...s...s...s...k..i
1a40 3a fe 0a 59 39 fe 00 00 00 00 00 00 00 00 00 00 00 00 04 5e 31 39 03 61 32 57 00 00 00 01 00 00 :..Y9..............^19.a2W......
1a60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1a80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1aa0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1ac0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 14 bd 68 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...N...N..`1...h...s...s...
1ae0 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 14 bb 67 ff 0c 73 40 f3 09 62 s...s...s...s...s...s...g..s@..b
1b00 35 da 0a 57 39 4c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5..W9L..........................
1b20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1b40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1b60 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1b80 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 09 5d 35 ff 11 93 54 ff 15 cc 70 ff 16 d2 N...N...N...N..`1..]5...T...p...
1ba0 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 ca 6e ff 0f 91 4f f6 09 60 35 f2 08 5b 33 79 00 55 s...s...s...s...n...O..`5..[3y.U
1bc0 2b 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +...............................
1be0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1c00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1c20 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1c40 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 0d 51 43 26 0c 59 3f dc 0a 61 37 ff 11 a5 N...N...N...N..`1..QC&.Y?..a7...
1c60 5b ff 16 d1 72 ff 16 d1 72 ff 11 a6 5a fc 09 62 35 f5 09 5f 35 a7 0c 5d 2e 16 00 00 00 00 00 00 [...r...r...Z..b5.._5..]........
1c80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1ca0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1cc0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1ce0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1d00 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 00 00 00 00 00 00 00 00 0a 4d 43 4c 0b 5e N...N...N...N..`1..........MCL.^
1d20 38 da 0a 68 3a f3 0a 67 39 f3 09 61 35 bd 07 5e 2f 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8..h:..g9..a5..^/&..............
1d40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1d60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1d80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 05 8b 47 ff 06 9a .......................`1...G...
1da0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1dc0 4e ff 06 9a 4e ff 06 9a 4e ff 06 99 4d ff 04 60 31 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 N...N...N...M..`1...............
1de0 00 00 0a 5a 34 4a 07 5c 34 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...Z4J.\4E......................
1e00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1e20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1e40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 62 2f 51 03 63 33 e8 05 71 .......................b/Q.c3..q
1e60 39 f5 06 92 4b ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 9...K...N...N...N...N...N...N...
1e80 4e ff 06 9a 4e ff 05 8a 46 ff 04 67 34 f4 04 64 32 c1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 N...N...F..g4..d2...............
1ea0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1ec0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1ee0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1f00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 27 0d 04 62 ...........................b'..b
1f20 32 8f 04 63 33 f5 05 81 40 fa 06 98 4d ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 05 94 2..c3...@...M...N...N...N...N...
1f40 4a ff 05 74 3a f5 04 62 33 ed 03 61 30 5f 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 J..t:..b3..a0_..................
1f60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1f80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1fa0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1fc0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1fe0 00 00 08 5d 2e 21 04 62 32 bd 04 66 34 f5 05 88 45 ff 06 9a 4e ff 06 98 4d ff 05 7e 40 fa 04 63 ...].!.b2..f4...E...N...M..~@..c
2000 33 f5 04 61 33 86 00 55 39 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3..a3..U9.......................
2020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
20a0 00 00 00 00 00 00 00 00 00 00 05 61 33 37 04 64 33 d4 04 69 36 f2 04 63 33 f4 03 62 31 a6 00 60 ...........a37.d3..i6..c3..b1..`
20c0 35 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5...............................
20e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 03 5f 30 5b 05 60 30 35 00 00 00 00 00 00 ..................._0[.`05......
2180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
21a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
21c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
21e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
22a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
22c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
22e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
23a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
23c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
23e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ................................
2440 ff ff ff ff 00 00 ff ff ff 7f ff ff 00 00 ff ff fc 1f ff ff 00 00 ff ff f8 0f ff ff 00 00 ff ff ................................
2460 e0 03 ff ff 00 00 ff ff 80 00 ff ff 00 00 ff fe 00 00 7f ff 00 00 ff f8 00 00 1f ff 00 00 ff e0 ................................
2480 00 00 07 ff 00 00 ff c0 00 00 01 ff 00 00 ff 00 00 00 00 ff 00 00 fc 00 00 00 00 3f 00 00 f8 00 ...........................?....
24a0 00 00 00 0f 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 ................................
24c0 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 ................................
24e0 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 ................................
2500 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 f8 00 00 00 00 0f 00 00 fc 00 ................................
2520 00 00 00 3f 00 00 ff 00 00 00 00 ff 00 00 ff 80 00 00 00 ff 00 00 fe 00 00 00 00 ff 00 00 fc 00 ...?............................
2540 00 00 10 ff 00 00 fc 00 00 00 30 ff 00 00 fc 00 00 00 3f ff 00 00 fc 00 00 00 7f ff 00 00 fc 00 ..........0.......?.............
2560 00 01 ff ff 00 00 fc 00 04 03 ff ff 00 00 fc 00 07 0f ff ff 00 00 fc 00 07 ff ff ff 00 00 fe 00 ................................
2580 07 ff ff ff 00 00 ff 00 1f ff ff ff 00 00 ff c0 3f ff ff ff 00 00 ff f0 ff ff ff ff 00 00 ff ff ................?...............
25a0 ff ff ff ff 00 00 ff ff ff ff ff ff 00 00 ff ff ff ff ff ff 00 00 ff ff ff ff ff ff 00 00 ..............................
kwd">getIndexPos(v3s16 pos); /** * get gridnode at a specific index position * @param ipos index position * @return gridnode for index */ PathGridnode &getIndexElement(v3s16 ipos); /** * Get gridnode at a specific index position * @return gridnode for index */ PathGridnode &getIdxElem(s16 x, s16 y, s16 z); /** * invert a 3d position * @param pos 3d position * @return pos *-1 */ v3s16 invert(v3s16 pos); /** * check if a index is within current search area * @param index position to validate * @return true/false */ bool isValidIndex(v3s16 index); /** * translate position to float position * @param pos integer position * @return float position */ v3f tov3f(v3s16 pos); /* algorithm functions */ /** * calculate 2d manahttan distance to target on the xz plane * @param pos position to calc distance * @return integer distance */ int getXZManhattanDist(v3s16 pos); /** * get best direction based uppon heuristics * @param directions list of unchecked directions * @param g_pos mapnode to start from * @return direction to check */ v3s16 getDirHeuristic(std::vector<v3s16> &directions, PathGridnode &g_pos); /** * build internal data representation of search area * @return true/false if costmap creation was successfull */ bool buildCostmap(); /** * calculate cost of movement * @param pos real world position to start movement * @param dir direction to move to * @return cost information */ PathCost calcCost(v3s16 pos, v3s16 dir); /** * recursive update whole search areas total cost information * @param ipos position to check next * @param srcdir positionc checked last time * @param total_cost cost of moving to ipos * @param level current recursion depth * @return true/false path to destination has been found */ bool updateAllCosts(v3s16 ipos, v3s16 srcdir, int total_cost, int level); /** * recursive try to find a patrh to destionation * @param ipos position to check next * @param srcdir positionc checked last time * @param total_cost cost of moving to ipos * @param level current recursion depth * @return true/false path to destination has been found */ bool updateCostHeuristic(v3s16 ipos, v3s16 srcdir, int current_cost, int level); /** * recursive build a vector containing all nodes from source to destination * @param path vector to add nodes to * @param pos pos to check next * @param level recursion depth */ void buildPath(std::vector<v3s16> &path, v3s16 pos, int level); /* variables */ int m_max_index_x; /**< max index of search area in x direction */ int m_max_index_y; /**< max index of search area in y direction */ int m_max_index_z; /**< max index of search area in z direction */ int m_searchdistance; /**< max distance to search in each direction */ int m_maxdrop; /**< maximum number of blocks a path may drop */ int m_maxjump; /**< maximum number of blocks a path may jump */ int m_min_target_distance; /**< current smalest path to target */ bool m_prefetch; /**< prefetch cost data */ v3s16 m_start; /**< source position */ v3s16 m_destination; /**< destination position */ core::aabbox3d<s16> m_limits; /**< position limits in real map coordinates */ /** contains all map data already collected and analyzed. Access it via the getIndexElement/getIdxElem methods. */ friend class GridNodeContainer; GridNodeContainer *m_nodes_container; ServerEnvironment *m_env; /**< minetest environment pointer */ #ifdef PATHFINDER_DEBUG /** * print collected cost information */ void printCost(); /** * print collected cost information in a specific direction * @param dir direction to print */ void printCost(PathDirections dir); /** * print type of node as evaluated */ void printType(); /** * print pathlenght for all nodes in search area */ void printPathLen(); /** * print a path * @param path path to show */ void printPath(std::vector<v3s16> path); /** * print y direction for all movements */ void printYdir(); /** * print y direction for moving in a specific direction * @param dir direction to show data */ void printYdir(PathDirections dir); /** * helper function to translate a direction to speaking text * @param dir direction to translate * @return textual name of direction */ std::string dirToName(PathDirections dir); #endif }; /******************************************************************************/ /* implementation */ /******************************************************************************/ std::vector<v3s16> get_path(ServerEnvironment* env, v3s16 source, v3s16 destination, unsigned int searchdistance, unsigned int max_jump, unsigned int max_drop, PathAlgorithm algo) { Pathfinder searchclass; return searchclass.getPath(env, source, destination, searchdistance, max_jump, max_drop, algo); } /******************************************************************************/ PathCost::PathCost() : valid(false), value(0), direction(0), updated(false) { //intentionaly empty } /******************************************************************************/ PathCost::PathCost(const PathCost &b) { valid = b.valid; direction = b.direction; value = b.value; updated = b.updated; } /******************************************************************************/ PathCost &PathCost::operator= (const PathCost &b) { valid = b.valid; direction = b.direction; value = b.value; updated = b.updated; return *this; } /******************************************************************************/ PathGridnode::PathGridnode() : valid(false), target(false), source(false), totalcost(-1), sourcedir(v3s16(0, 0, 0)), pos(v3s16(0, 0, 0)), is_element(false), type('u') { //intentionaly empty } /******************************************************************************/ PathGridnode::PathGridnode(const PathGridnode &b) : valid(b.valid), target(b.target), source(b.source), totalcost(b.totalcost), sourcedir(b.sourcedir), pos(b.pos), is_element(b.is_element), type(b.type) { directions[DIR_XP] = b.directions[DIR_XP]; directions[DIR_XM] = b.directions[DIR_XM]; directions[DIR_ZP] = b.directions[DIR_ZP]; directions[DIR_ZM] = b.directions[DIR_ZM]; } /******************************************************************************/ PathGridnode &PathGridnode::operator= (const PathGridnode &b) { valid = b.valid; target = b.target; source = b.source; is_element = b.is_element; totalcost = b.totalcost; sourcedir = b.sourcedir; pos = b.pos; type = b.type; directions[DIR_XP] = b.directions[DIR_XP]; directions[DIR_XM] = b.directions[DIR_XM]; directions[DIR_ZP] = b.directions[DIR_ZP]; directions[DIR_ZM] = b.directions[DIR_ZM]; return *this; } /******************************************************************************/ PathCost PathGridnode::getCost(v3s16 dir) { if (dir.X > 0) { return directions[DIR_XP]; } if (dir.X < 0) { return directions[DIR_XM]; } if (dir.Z > 0) { return directions[DIR_ZP]; } if (dir.Z < 0) { return directions[DIR_ZM]; } PathCost retval; return retval; } /******************************************************************************/ void PathGridnode::setCost(v3s16 dir, PathCost cost) { if (dir.X > 0) { directions[DIR_XP] = cost; } if (dir.X < 0) { directions[DIR_XM] = cost; } if (dir.Z > 0) { directions[DIR_ZP] = cost; } if (dir.Z < 0) { directions[DIR_ZM] = cost; } } void GridNodeContainer::initNode(v3s16 ipos, PathGridnode *p_node) { INodeDefManager *ndef = m_pathf->m_env->getGameDef()->ndef(); PathGridnode &elem = *p_node; v3s16 realpos = m_pathf->getRealPos(ipos); MapNode current = m_pathf->m_env->getMap().getNodeNoEx(realpos); MapNode below = m_pathf->m_env->getMap().getNodeNoEx(realpos + v3s16(0, -1, 0)); if ((current.param0 == CONTENT_IGNORE) || (below.param0 == CONTENT_IGNORE)) { DEBUG_OUT("Pathfinder: " << PP(realpos) << " current or below is invalid element" << std::endl); if (current.param0 == CONTENT_IGNORE) { elem.type = 'i'; DEBUG_OUT(PP(ipos) << ": " << 'i' << std::endl); } return; } //don't add anything if it isn't an air node if (ndef->get(current).walkable || !ndef->get(below).walkable) { DEBUG_OUT("Pathfinder: " << PP(realpos) << " not on surface" << std::endl); if (ndef->get(current).walkable) { elem.type = 's'; DEBUG_OUT(PP(ipos) << ": " << 's' << std::endl); } else { elem.type = '-'; DEBUG_OUT(PP(ipos) << ": " << '-' << std::endl); } return; } elem.valid = true; elem.pos = realpos; elem.type = 'g'; DEBUG_OUT(PP(ipos) << ": " << 'a' << std::endl); if (m_pathf->m_prefetch) { elem.directions[DIR_XP] = m_pathf->calcCost(realpos, v3s16( 1, 0, 0)); elem.directions[DIR_XM] = m_pathf->calcCost(realpos, v3s16(-1, 0, 0)); elem.directions[DIR_ZP] = m_pathf->calcCost(realpos, v3s16( 0, 0, 1)); elem.directions[DIR_ZM] = m_pathf->calcCost(realpos, v3s16( 0, 0,-1)); } } ArrayGridNodeContainer::ArrayGridNodeContainer(Pathfinder *pathf, v3s16 dimensions) : m_x_stride(dimensions.Y * dimensions.Z), m_y_stride(dimensions.Z) { m_pathf = pathf; m_nodes_array.resize(dimensions.X * dimensions.Y * dimensions.Z); INFO_TARGET << "Pathfinder ArrayGridNodeContainer constructor." << std::endl; for (int x = 0; x < dimensions.X; x++) { for (int y = 0; y < dimensions.Y; y++) { for (int z= 0; z < dimensions.Z; z++) { v3s16 ipos(x, y, z); initNode(ipos, &access(ipos)); } } } } PathGridnode &ArrayGridNodeContainer::access(v3s16 p) { return m_nodes_array[p.X * m_x_stride + p.Y * m_y_stride + p.Z]; } MapGridNodeContainer::MapGridNodeContainer(Pathfinder *pathf) { m_pathf = pathf; } PathGridnode &MapGridNodeContainer::access(v3s16 p) { std::map<v3s16, PathGridnode>::iterator it = m_nodes.find(p); if (it != m_nodes.end()) { return it->second; } PathGridnode &n = m_nodes[p]; initNode(p, &n); return n; } /******************************************************************************/ std::vector<v3s16> Pathfinder::getPath(ServerEnvironment *env, v3s16 source, v3s16 destination, unsigned int searchdistance, unsigned int max_jump, unsigned int max_drop, PathAlgorithm algo) { #ifdef PATHFINDER_CALC_TIME timespec ts; clock_gettime(CLOCK_REALTIME, &ts); #endif std::vector<v3s16> retval; //check parameters if (env == 0) { ERROR_TARGET << "missing environment pointer" << std::endl; return retval; } m_searchdistance = searchdistance; m_env = env; m_maxjump = max_jump; m_maxdrop = max_drop; m_start = source; m_destination = destination; m_min_target_distance = -1; m_prefetch = true; if (algo == PA_PLAIN_NP) { m_prefetch = false; } int min_x = MYMIN(source.X, destination.X); int max_x = MYMAX(source.X, destination.X); int min_y = MYMIN(source.Y, destination.Y); int max_y = MYMAX(source.Y, destination.Y); int min_z = MYMIN(source.Z, destination.Z); int max_z = MYMAX(source.Z, destination.Z); m_limits.MinEdge.X = min_x - searchdistance; m_limits.MinEdge.Y = min_y - searchdistance; m_limits.MinEdge.Z = min_z - searchdistance; m_limits.MaxEdge.X = max_x + searchdistance; m_limits.MaxEdge.Y = max_y + searchdistance; m_limits.MaxEdge.Z = max_z + searchdistance; v3s16 diff = m_limits.MaxEdge - m_limits.MinEdge; m_max_index_x = diff.X; m_max_index_y = diff.Y; m_max_index_z = diff.Z; delete m_nodes_container; if (diff.getLength() > 5) { m_nodes_container = new MapGridNodeContainer(this); } else { m_nodes_container = new ArrayGridNodeContainer(this, diff); } #ifdef PATHFINDER_DEBUG printType(); printCost(); printYdir(); #endif //validate and mark start and end pos v3s16 StartIndex = getIndexPos(source); v3s16 EndIndex = getIndexPos(destination); PathGridnode &startpos = getIndexElement(StartIndex); PathGridnode &endpos = getIndexElement(EndIndex); if (!startpos.valid) { VERBOSE_TARGET << "invalid startpos" << "Index: " << PP(StartIndex) << "Realpos: " << PP(getRealPos(StartIndex)) << std::endl; return retval; } if (!endpos.valid) { VERBOSE_TARGET << "invalid stoppos" << "Index: " << PP(EndIndex) << "Realpos: " << PP(getRealPos(EndIndex)) << std::endl; return retval; } endpos.target = true; startpos.source = true; startpos.totalcost = 0; bool update_cost_retval = false; switch (algo) { case PA_DIJKSTRA: update_cost_retval = updateAllCosts(StartIndex, v3s16(0, 0, 0), 0, 0); break; case PA_PLAIN_NP: case PA_PLAIN: update_cost_retval = updateCostHeuristic(StartIndex, v3s16(0, 0, 0), 0, 0); break; default: ERROR_TARGET << "missing PathAlgorithm"<< std::endl; break; } if (update_cost_retval) { #ifdef PATHFINDER_DEBUG std::cout << "Path to target found!" << std::endl; printPathLen(); #endif //find path std::vector<v3s16> path; buildPath(path, EndIndex, 0); #ifdef PATHFINDER_DEBUG std::cout << "Full index path:" << std::endl; printPath(path); #endif //finalize path std::vector<v3s16> full_path; for (std::vector<v3s16>::iterator i = path.begin(); i != path.end(); ++i) { full_path.push_back(getIndexElement(*i).pos); } #ifdef PATHFINDER_DEBUG std::cout << "full path:" << std::endl; printPath(full_path); #endif #ifdef PATHFINDER_CALC_TIME timespec ts2; clock_gettime(CLOCK_REALTIME, &ts2); int ms = (ts2.tv_nsec - ts.tv_nsec)/(1000*1000); int us = ((ts2.tv_nsec - ts.tv_nsec) - (ms*1000*1000))/1000; int ns = ((ts2.tv_nsec - ts.tv_nsec) - ( (ms*1000*1000) + (us*1000))); std::cout << "Calculating path took: " << (ts2.tv_sec - ts.tv_sec) << "s " << ms << "ms " << us << "us " << ns << "ns " << std::endl; #endif return full_path; } else { #ifdef PATHFINDER_DEBUG printPathLen(); #endif ERROR_TARGET << "failed to update cost map"<< std::endl; } //return return retval; } /******************************************************************************/ Pathfinder::Pathfinder() : m_max_index_x(0), m_max_index_y(0), m_max_index_z(0), m_searchdistance(0), m_maxdrop(0), m_maxjump(0), m_min_target_distance(0), m_prefetch(true), m_start(0, 0, 0), m_destination(0, 0, 0), m_nodes_container(NULL), m_env(0) { //intentionaly empty } Pathfinder::~Pathfinder() { delete m_nodes_container; } /******************************************************************************/ v3s16 Pathfinder::getRealPos(v3s16 ipos) { return m_limits.MinEdge + ipos; } /******************************************************************************/ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) { INodeDefManager *ndef = m_env->getGameDef()->ndef(); PathCost retval; retval.updated = true; v3s16 pos2 = pos + dir; //check limits if (!m_limits.isPointInside(pos2)) { DEBUG_OUT("Pathfinder: " << PP(pos2) << " no cost -> out of limits" << std::endl); return retval; } MapNode node_at_pos2 = m_env->getMap().getNodeNoEx(pos2); //did we get information about node? if (node_at_pos2.param0 == CONTENT_IGNORE ) { VERBOSE_TARGET << "Pathfinder: (1) area at pos: " << PP(pos2) << " not loaded"; return retval; } if (!ndef->get(node_at_pos2).walkable) { MapNode node_below_pos2 = m_env->getMap().getNodeNoEx(pos2 + v3s16(0, -1, 0)); //did we get information about node? if (node_below_pos2.param0 == CONTENT_IGNORE ) { VERBOSE_TARGET << "Pathfinder: (2) area at pos: " << PP((pos2 + v3s16(0, -1, 0))) << " not loaded"; return retval; } if (ndef->get(node_below_pos2).walkable) { retval.valid = true; retval.value = 1; retval.direction = 0; DEBUG_OUT("Pathfinder: "<< PP(pos) << " cost same height found" << std::endl); } else { v3s16 testpos = pos2 - v3s16(0, -1, 0); MapNode node_at_pos = m_env->getMap().getNodeNoEx(testpos); while ((node_at_pos.param0 != CONTENT_IGNORE) && (!ndef->get(node_at_pos).walkable) && (testpos.Y > m_limits.MinEdge.Y)) { testpos += v3s16(0, -1, 0); node_at_pos = m_env->getMap().getNodeNoEx(testpos); } //did we find surface? if ((testpos.Y >= m_limits.MinEdge.Y) && (node_at_pos.param0 != CONTENT_IGNORE) && (ndef->get(node_at_pos).walkable)) { if ((pos2.Y - testpos.Y - 1) <= m_maxdrop) { retval.valid = true; retval.value = 2; //difference of y-pos +1 (target node is ABOVE solid node) retval.direction = ((testpos.Y - pos2.Y) +1); DEBUG_OUT("Pathfinder cost below height found" << std::endl); } else { INFO_TARGET << "Pathfinder:" " distance to surface below to big: " << (testpos.Y - pos2.Y) << " max: " << m_maxdrop << std::endl; } } else { DEBUG_OUT("Pathfinder: no surface below found" << std::endl); } } } else { v3s16 testpos = pos2; MapNode node_at_pos = m_env->getMap().getNodeNoEx(testpos); while ((node_at_pos.param0 != CONTENT_IGNORE) && (ndef->get(node_at_pos).walkable) && (testpos.Y < m_limits.MaxEdge.Y)) { testpos += v3s16(0, 1, 0); node_at_pos = m_env->getMap().getNodeNoEx(testpos); } //did we find surface? if ((testpos.Y <= m_limits.MaxEdge.Y) && (!ndef->get(node_at_pos).walkable)) { if (testpos.Y - pos2.Y <= m_maxjump) { retval.valid = true; retval.value = 2; retval.direction = (testpos.Y - pos2.Y); DEBUG_OUT("Pathfinder cost above found" << std::endl); } else { DEBUG_OUT("Pathfinder: distance to surface above to big: " << (testpos.Y - pos2.Y) << " max: " << m_maxjump << std::endl); } } else { DEBUG_OUT("Pathfinder: no surface above found" << std::endl); } } return retval; } /******************************************************************************/ v3s16 Pathfinder::getIndexPos(v3s16 pos) { return pos - m_limits.MinEdge; } /******************************************************************************/ PathGridnode &Pathfinder::getIndexElement(v3s16 ipos) { return m_nodes_container->access(ipos); } /******************************************************************************/ inline PathGridnode &Pathfinder::getIdxElem(s16 x, s16 y, s16 z) { return m_nodes_container->access(v3s16(x,y,z)); } /******************************************************************************/ bool Pathfinder::isValidIndex(v3s16 index) { if ( (index.X < m_max_index_x) && (index.Y < m_max_index_y) && (index.Z < m_max_index_z) && (index.X >= 0) && (index.Y >= 0) && (index.Z >= 0)) return true; return false; } /******************************************************************************/ v3s16 Pathfinder::invert(v3s16 pos) { v3s16 retval = pos; retval.X *=-1; retval.Y *=-1; retval.Z *=-1; return retval; } /******************************************************************************/ bool Pathfinder::updateAllCosts(v3s16 ipos, v3s16 srcdir, int current_cost, int level) { PathGridnode &g_pos = getIndexElement(ipos); g_pos.totalcost = current_cost; g_pos.sourcedir = srcdir; level ++; //check if target has been found if (g_pos.target) { m_min_target_distance = current_cost; DEBUG_OUT(LVL " Pathfinder: target found!" << std::endl); return true; } bool retval = false; std::vector<v3s16> directions; directions.push_back(v3s16( 1,0, 0)); directions.push_back(v3s16(-1,0, 0)); directions.push_back(v3s16( 0,0, 1)); directions.push_back(v3s16( 0,0,-1)); for (unsigned int i=0; i < directions.size(); i++) { if (directions[i] != srcdir) { PathCost cost = g_pos.getCost(directions[i]); if (cost.valid) { directions[i].Y = cost.direction; v3s16 ipos2 = ipos + directions[i]; if (!isValidIndex(ipos2)) { DEBUG_OUT(LVL " Pathfinder: " << PP(ipos2) << " out of range, max=" << PP(m_limits.MaxEdge) << std::endl); continue; } PathGridnode &g_pos2 = getIndexElement(ipos2); if (!g_pos2.valid) { VERBOSE_TARGET << LVL "Pathfinder: no data for new position: " << PP(ipos2) << std::endl; continue; } assert(cost.value > 0); int new_cost = current_cost + cost.value; // check if there already is a smaller path if ((m_min_target_distance > 0) && (m_min_target_distance < new_cost)) { return false; } if ((g_pos2.totalcost < 0) || (g_pos2.totalcost > new_cost)) { DEBUG_OUT(LVL "Pathfinder: updating path at: "<< PP(ipos2) << " from: " << g_pos2.totalcost << " to "<< new_cost << std::endl); if (updateAllCosts(ipos2, invert(directions[i]), new_cost, level)) { retval = true; } } else { DEBUG_OUT(LVL "Pathfinder:" " already found shorter path to: " << PP(ipos2) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " not moving to invalid direction: " << PP(directions[i]) << std::endl); } } } return retval; } /******************************************************************************/ int Pathfinder::getXZManhattanDist(v3s16 pos) { int min_x = MYMIN(pos.X, m_destination.X); int max_x = MYMAX(pos.X, m_destination.X); int min_z = MYMIN(pos.Z, m_destination.Z); int max_z = MYMAX(pos.Z, m_destination.Z); return (max_x - min_x) + (max_z - min_z); } /******************************************************************************/ v3s16 Pathfinder::getDirHeuristic(std::vector<v3s16> &directions, PathGridnode &g_pos) { int minscore = -1; v3s16 retdir = v3s16(0, 0, 0); v3s16 srcpos = g_pos.pos; DEBUG_OUT("Pathfinder: remaining dirs at beginning:" << directions.size() << std::endl); for (std::vector<v3s16>::iterator iter = directions.begin(); iter != directions.end(); ++iter) { v3s16 pos1 = v3s16(srcpos.X + iter->X, 0, srcpos.Z+iter->Z); int cur_manhattan = getXZManhattanDist(pos1); PathCost cost = g_pos.getCost(*iter); if (!cost.updated) { cost = calcCost(g_pos.pos, *iter); g_pos.setCost(*iter, cost); } if (cost.valid) { int score = cost.value + cur_manhattan; if ((minscore < 0)|| (score < minscore)) { minscore = score; retdir = *iter; } } } if (retdir != v3s16(0, 0, 0)) { for (std::vector<v3s16>::iterator iter = directions.begin(); iter != directions.end(); ++iter) { if(*iter == retdir) { DEBUG_OUT("Pathfinder: removing return direction" << std::endl); directions.erase(iter); break; } } } else { DEBUG_OUT("Pathfinder: didn't find any valid direction clearing" << std::endl); directions.clear(); } DEBUG_OUT("Pathfinder: remaining dirs at end:" << directions.size() << std::endl); return retdir; } /******************************************************************************/ bool Pathfinder::updateCostHeuristic( v3s16 ipos, v3s16 srcdir, int current_cost, int level) { PathGridnode &g_pos = getIndexElement(ipos); g_pos.totalcost = current_cost; g_pos.sourcedir = srcdir; level ++; //check if target has been found if (g_pos.target) { m_min_target_distance = current_cost; DEBUG_OUT(LVL " Pathfinder: target found!" << std::endl); return true; } bool retval = false; std::vector<v3s16> directions; directions.push_back(v3s16( 1, 0, 0)); directions.push_back(v3s16(-1, 0, 0)); directions.push_back(v3s16( 0, 0, 1)); directions.push_back(v3s16( 0, 0, -1)); v3s16 direction = getDirHeuristic(directions, g_pos); while (direction != v3s16(0, 0, 0) && (!retval)) { if (direction != srcdir) { PathCost cost = g_pos.getCost(direction); if (cost.valid) { direction.Y = cost.direction; v3s16 ipos2 = ipos + direction; if (!isValidIndex(ipos2)) { DEBUG_OUT(LVL " Pathfinder: " << PP(ipos2) << " out of range, max=" << PP(m_limits.MaxEdge) << std::endl); direction = getDirHeuristic(directions, g_pos); continue; } PathGridnode &g_pos2 = getIndexElement(ipos2); if (!g_pos2.valid) { VERBOSE_TARGET << LVL "Pathfinder: no data for new position: " << PP(ipos2) << std::endl; direction = getDirHeuristic(directions, g_pos); continue; } assert(cost.value > 0); int new_cost = current_cost + cost.value; // check if there already is a smaller path if ((m_min_target_distance > 0) && (m_min_target_distance < new_cost)) { DEBUG_OUT(LVL "Pathfinder:" " already longer than best already found path " << PP(ipos2) << std::endl); return false; } if ((g_pos2.totalcost < 0) || (g_pos2.totalcost > new_cost)) { DEBUG_OUT(LVL "Pathfinder: updating path at: "<< PP(ipos2) << " from: " << g_pos2.totalcost << " to "<< new_cost << " srcdir=" << PP(invert(direction))<< std::endl); if (updateCostHeuristic(ipos2, invert(direction), new_cost, level)) { retval = true; } } else { DEBUG_OUT(LVL "Pathfinder:" " already found shorter path to: " << PP(ipos2) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " not moving to invalid direction: " << PP(direction) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " skipping srcdir: " << PP(direction) << std::endl); } direction = getDirHeuristic(directions, g_pos); } return retval; } /******************************************************************************/ void Pathfinder::buildPath(std::vector<v3s16> &path, v3s16 pos, int level) { level ++; if (level > 700) { ERROR_TARGET << LVL "Pathfinder: path is too long aborting" << std::endl; return; } PathGridnode &g_pos = getIndexElement(pos); if (!g_pos.valid) { ERROR_TARGET << LVL "Pathfinder: invalid next pos detected aborting" << std::endl; return; } g_pos.is_element = true; //check if source reached if (g_pos.source) { path.push_back(pos); return; } buildPath(path, pos + g_pos.sourcedir, level); path.push_back(pos); } /******************************************************************************/ v3f Pathfinder::tov3f(v3s16 pos) { return v3f(BS * pos.X, BS * pos.Y, BS * pos.Z); } #ifdef PATHFINDER_DEBUG /******************************************************************************/ void Pathfinder::printCost() { printCost(DIR_XP); printCost(DIR_XM); printCost(DIR_ZP); printCost(DIR_ZM); } /******************************************************************************/ void Pathfinder::printYdir() { printYdir(DIR_XP); printYdir(DIR_XM); printYdir(DIR_ZP); printYdir(DIR_ZM); } /******************************************************************************/ void Pathfinder::printCost(PathDirections dir) { std::cout << "Cost in direction: " << dirToName(dir) << std::endl; std::cout << std::setfill('-') << std::setw(80) << "-" << std::endl; std::cout << std::setfill(' '); for (int y = 0; y < m_max_index_y; y++) { std::cout << "Level: " << y << std::endl; std::cout << std::setw(4) << " " << " "; for (int x = 0; x < m_max_index_x; x++) { std::cout << std::setw(4) << x; } std::cout << std::endl; for (int z = 0; z < m_max_index_z; z++) { std::cout << std::setw(4) << z <<": "; for (int x = 0; x < m_max_index_x; x++) { if (getIdxElem(x, y, z).directions[dir].valid) std::cout << std::setw(4) << getIdxElem(x, y, z).directions[dir].value; else std::cout << std::setw(4) << "-"; } std::cout << std::endl; } std::cout << std::endl; } } /******************************************************************************/ void Pathfinder::printYdir(PathDirections dir) { std::cout << "Height difference in direction: " << dirToName(dir) << std::endl; std::cout << std::setfill('-') << std::setw(80) << "-" << std::endl; std::cout << std::setfill(' '); for (int y = 0; y < m_max_index_y; y++) { std::cout << "Level: " << y << std::endl; std::cout << std::setw(4) << " " << " "; for (int x = 0; x < m_max_index_x; x++) { std::cout << std::setw(4) << x; } std::cout << std::endl; for (int z = 0; z < m_max_index_z; z++) { std::cout << std::setw(4) << z <<": "; for (int x = 0; x < m_max_index_x; x++) { if (getIdxElem(x, y, z).directions[dir].valid) std::cout << std::setw(4) << getIdxElem(x, y, z).directions[dir].direction; else std::cout << std::setw(4) << "-"; } std::cout << std::endl; } std::cout << std::endl; } } /******************************************************************************/ void Pathfinder::printType() { std::cout << "Type of node:" << std::endl; std::cout << std::setfill('-') << std::setw(80) << "-" << std::endl; std::cout << std::setfill(' '); for (int y = 0; y < m_max_index_y; y++) { std::cout << "Level: " << y << std::endl; std::cout << std::setw(3) << " " << " "; for (int x = 0; x < m_max_index_x; x++) { std::cout << std::setw(3) << x; } std::cout << std::endl; for (int z = 0; z < m_max_index_z; z++) { std::cout << std::setw(3) << z <<": "; for (int x = 0; x < m_max_index_x; x++) { char toshow = getIdxElem(x, y, z).type; std::cout << std::setw(3) << toshow; } std::cout << std::endl; } std::cout << std::endl; } std::cout << std::endl; } /******************************************************************************/ void Pathfinder::printPathLen() { std::cout << "Pathlen:" << std::endl; std::cout << std::setfill('-') << std::setw(80) << "-" << std::endl; std::cout << std::setfill(' '); for (int y = 0; y < m_max_index_y; y++) { std::cout << "Level: " << y << std::endl; std::cout << std::setw(3) << " " << " "; for (int x = 0; x < m_max_index_x; x++) { std::cout << std::setw(3) << x; } std::cout << std::endl; for (int z = 0; z < m_max_index_z; z++) { std::cout << std::setw(3) << z <<": "; for (int x = 0; x < m_max_index_x; x++) { std::cout << std::setw(3) << getIdxElem(x, y, z).totalcost; } std::cout << std::endl; } std::cout << std::endl; } std::cout << std::endl; } /******************************************************************************/ std::string Pathfinder::dirToName(PathDirections dir) { switch (dir) { case DIR_XP: return "XP"; break; case DIR_XM: return "XM"; break; case DIR_ZP: return "ZP"; break; case DIR_ZM: return "ZM"; break; default: return "UKN"; } } /******************************************************************************/ void Pathfinder::printPath(std::vector<v3s16> path) { unsigned int current = 0; for (std::vector<v3s16>::iterator i = path.begin(); i != path.end(); ++i) { std::cout << std::setw(3) << current << ":" << PP((*i)) << std::endl; current++; } } #endif